@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.
Files changed (153) hide show
  1. package/README.md +6 -6
  2. package/package.json +3 -5
  3. package/src/App.css +0 -42
  4. package/src/App.tsx +0 -54
  5. package/src/__tests__/README.md +0 -221
  6. package/src/__tests__/atoms/hooks/simple-hooks.test.ts +0 -44
  7. package/src/__tests__/atoms/ui/button.test.tsx +0 -68
  8. package/src/__tests__/atoms/utils/simple.test.ts +0 -18
  9. package/src/__tests__/atoms/utils/utils.test.ts +0 -77
  10. package/src/__tests__/features/auth/simple-auth.test.tsx +0 -40
  11. package/src/__tests__/molecules/layout/simple-layout.test.tsx +0 -81
  12. package/src/__tests__/organisms/showcase/simple-showcase.test.tsx +0 -167
  13. package/src/__tests__/setup.ts +0 -51
  14. package/src/__tests__/utils.tsx +0 -123
  15. package/src/atoms/composed/Accordion/Accordion.tsx +0 -271
  16. package/src/atoms/composed/Accordion/index.ts +0 -1
  17. package/src/atoms/composed/Alert/Alert.tsx +0 -132
  18. package/src/atoms/composed/Alert/index.ts +0 -1
  19. package/src/atoms/composed/Breadcrumb/Breadcrumb.tsx +0 -83
  20. package/src/atoms/composed/Breadcrumb/index.ts +0 -1
  21. package/src/atoms/composed/Chart/Chart.tsx +0 -425
  22. package/src/atoms/composed/Chart/index.ts +0 -2
  23. package/src/atoms/composed/ColorSwatch/ColorSwatch.tsx +0 -72
  24. package/src/atoms/composed/ColorSwatch/index.ts +0 -1
  25. package/src/atoms/composed/DarkModeToggle.tsx +0 -66
  26. package/src/atoms/composed/DataBadge/DataBadge.tsx +0 -81
  27. package/src/atoms/composed/DataBadge/index.ts +0 -1
  28. package/src/atoms/composed/DataTable/DataTable.tsx +0 -394
  29. package/src/atoms/composed/DataTable/TableCellWithTooltip.tsx +0 -41
  30. package/src/atoms/composed/DataTable/index.ts +0 -2
  31. package/src/atoms/composed/DateTimePicker/DateTimePicker.tsx +0 -611
  32. package/src/atoms/composed/DateTimePicker/index.ts +0 -2
  33. package/src/atoms/composed/DetailedCard/DetailedCard.tsx +0 -181
  34. package/src/atoms/composed/DetailedCard/index.ts +0 -2
  35. package/src/atoms/composed/EmptyState/EmptyState.tsx +0 -90
  36. package/src/atoms/composed/EmptyState/index.ts +0 -1
  37. package/src/atoms/composed/FileUpload/FileUpload.tsx +0 -477
  38. package/src/atoms/composed/FileUpload/index.ts +0 -2
  39. package/src/atoms/composed/FormField/FormField.tsx +0 -92
  40. package/src/atoms/composed/FormField/index.ts +0 -1
  41. package/src/atoms/composed/GlobalSearch/GlobalSearch.tsx +0 -37
  42. package/src/atoms/composed/GlobalSearch/index.ts +0 -1
  43. package/src/atoms/composed/IconBadge/IconBadge.tsx +0 -95
  44. package/src/atoms/composed/IconBadge/index.ts +0 -2
  45. package/src/atoms/composed/Modal/Modal.tsx +0 -223
  46. package/src/atoms/composed/Modal/index.ts +0 -2
  47. package/src/atoms/composed/PaletteSwitcher.tsx +0 -386
  48. package/src/atoms/composed/ProgressBar/ProgressBar.tsx +0 -116
  49. package/src/atoms/composed/ProgressBar/index.ts +0 -1
  50. package/src/atoms/composed/StatCard/StatCard.tsx +0 -219
  51. package/src/atoms/composed/StatCard/index.ts +0 -1
  52. package/src/atoms/composed/StyleGuide.tsx +0 -717
  53. package/src/atoms/composed/Toast/Toast.tsx +0 -219
  54. package/src/atoms/composed/Toast/index.ts +0 -1
  55. package/src/atoms/composed/Tooltip/Tooltip.tsx +0 -213
  56. package/src/atoms/composed/Tooltip/index.ts +0 -1
  57. package/src/atoms/composed/UserAvatar/UserAvatar.tsx +0 -139
  58. package/src/atoms/composed/UserAvatar/index.ts +0 -1
  59. package/src/atoms/composed/UserMenu/UserMenu.tsx +0 -16
  60. package/src/atoms/composed/UserMenu/index.ts +0 -1
  61. package/src/atoms/composed/index.ts +0 -29
  62. package/src/atoms/hooks/useApi.ts +0 -80
  63. package/src/atoms/hooks/useHealth.ts +0 -17
  64. package/src/atoms/index.ts +0 -13
  65. package/src/atoms/services/api/client.ts +0 -134
  66. package/src/atoms/services/auth-service.ts +0 -248
  67. package/src/atoms/services/health.ts +0 -15
  68. package/src/atoms/services/index.ts +0 -3
  69. package/src/atoms/shared/config/constants.ts +0 -17
  70. package/src/atoms/shared/config/dashboard-sizes.ts +0 -111
  71. package/src/atoms/shared/config/environment.ts +0 -10
  72. package/src/atoms/shared/index.ts +0 -4
  73. package/src/atoms/shared/styles/color-palettes.css +0 -566
  74. package/src/atoms/types/auth.ts +0 -62
  75. package/src/atoms/types/generated.ts +0 -1469
  76. package/src/atoms/types/index.ts +0 -4
  77. package/src/atoms/types/loading.ts +0 -28
  78. package/src/atoms/ui/Badge.tsx +0 -30
  79. package/src/atoms/ui/ErrorBoundary.tsx +0 -59
  80. package/src/atoms/ui/Select.tsx +0 -53
  81. package/src/atoms/ui/Switch.tsx +0 -42
  82. package/src/atoms/ui/Tabs.tsx +0 -118
  83. package/src/atoms/ui/avatar.tsx +0 -48
  84. package/src/atoms/ui/button.tsx +0 -70
  85. package/src/atoms/ui/card.tsx +0 -76
  86. package/src/atoms/ui/dropdown-menu.tsx +0 -199
  87. package/src/atoms/ui/index.ts +0 -39
  88. package/src/atoms/ui/input.tsx +0 -23
  89. package/src/atoms/ui/label.tsx +0 -23
  90. package/src/atoms/ui/skeleton.tsx +0 -13
  91. package/src/atoms/ui/spinner.tsx +0 -49
  92. package/src/atoms/ui/table.tsx +0 -116
  93. package/src/atoms/utils/animations.ts +0 -135
  94. package/src/atoms/utils/tooltip-helpers.ts +0 -140
  95. package/src/atoms/utils/utils.ts +0 -9
  96. package/src/features/auth/components/LoginForm.tsx +0 -168
  97. package/src/features/auth/components/LogoutButton.tsx +0 -19
  98. package/src/features/auth/components/ProtectedRoute.tsx +0 -60
  99. package/src/features/auth/components/index.ts +0 -4
  100. package/src/features/auth/hooks/index.ts +0 -2
  101. package/src/features/auth/hooks/useAuth.tsx +0 -205
  102. package/src/features/auth/hooks/usePermissions.ts +0 -35
  103. package/src/features/auth/index.ts +0 -2
  104. package/src/features/index.ts +0 -2
  105. package/src/index.css +0 -704
  106. package/src/index.ts +0 -13
  107. package/src/main.tsx +0 -48
  108. package/src/molecules/.gitkeep +0 -0
  109. package/src/molecules/forms/FormGroup.tsx +0 -75
  110. package/src/molecules/forms/SearchInput.tsx +0 -259
  111. package/src/molecules/forms/index.ts +0 -4
  112. package/src/molecules/index.ts +0 -4
  113. package/src/molecules/layout/AppHeader/AppHeader.tsx +0 -42
  114. package/src/molecules/layout/AppHeader/index.ts +0 -1
  115. package/src/molecules/layout/AppLayout.tsx +0 -29
  116. package/src/molecules/layout/PageTemplate.tsx +0 -87
  117. package/src/molecules/layout/SectionHeader/SectionHeader.tsx +0 -87
  118. package/src/molecules/layout/SectionHeader/index.ts +0 -1
  119. package/src/molecules/layout/ShowcaseSection.tsx +0 -57
  120. package/src/molecules/layout/Sidebar.tsx +0 -144
  121. package/src/molecules/layout/SidebarButton/SidebarButton.tsx +0 -99
  122. package/src/molecules/layout/SidebarButton/index.ts +0 -1
  123. package/src/molecules/layout/SidebarContext.tsx +0 -31
  124. package/src/molecules/layout/index.ts +0 -7
  125. package/src/molecules/navigation/NavMenu.tsx +0 -188
  126. package/src/molecules/navigation/Pagination.tsx +0 -172
  127. package/src/molecules/navigation/index.ts +0 -4
  128. package/src/organisms/index.ts +0 -5
  129. package/src/organisms/showcase/ComponentShowcasePage.tsx +0 -2496
  130. package/src/organisms/showcase/index.ts +0 -1
  131. package/src/pages/AdminShowcase/AdminCRUDShowcase.tsx +0 -242
  132. package/src/pages/AdminShowcase/AdminDashboardShowcase.tsx +0 -171
  133. package/src/pages/AdminShowcase/AdminDetailShowcase.tsx +0 -385
  134. package/src/pages/AdminShowcase/index.tsx +0 -3
  135. package/src/pages/ComponentShowcase/BadgesShowcase.tsx +0 -188
  136. package/src/pages/ComponentShowcase/CardsShowcase.tsx +0 -392
  137. package/src/pages/ComponentShowcase/PalettesShowcase.tsx +0 -207
  138. package/src/pages/ComponentShowcase/StatesShowcase.tsx +0 -485
  139. package/src/pages/ComponentShowcase/TablesShowcase.tsx +0 -134
  140. package/src/pages/ComponentShowcase/TypographyShowcase.tsx +0 -255
  141. package/src/pages/ComponentShowcase/index.tsx +0 -188
  142. package/src/pages/index.ts +0 -2
  143. package/src/templates/AuthTemplate.tsx +0 -216
  144. package/src/templates/ComponentShowcaseTemplate.tsx +0 -173
  145. package/src/templates/DashboardTemplate.tsx +0 -232
  146. package/src/templates/DataTemplate.tsx +0 -319
  147. package/src/templates/admin/AdminCRUDTemplate.tsx +0 -630
  148. package/src/templates/admin/AdminDashboardTemplate.tsx +0 -351
  149. package/src/templates/admin/AdminDetailTemplate.tsx +0 -563
  150. package/src/templates/admin/index.ts +0 -29
  151. package/src/templates/factory.tsx +0 -169
  152. package/src/templates/index.ts +0 -37
  153. package/src/vite-env.d.ts +0 -1
@@ -1,351 +0,0 @@
1
- import React from 'react';
2
- import { cn } from '../../atoms/utils/utils';
3
- import { StatCard } from '../../atoms/composed/StatCard';
4
- import { Chart } from '../../atoms/composed/Chart';
5
- import { Card } from '../../atoms/ui/card';
6
- import { DashboardGrid } from '../DashboardTemplate';
7
- import { DataBadge } from '../../atoms/composed/DataBadge';
8
- import { IconBadge } from '../../atoms/composed/IconBadge';
9
- import { Button } from '../../atoms/ui/button';
10
- import { getContainerHeightClass } from '../../atoms/shared/config/dashboard-sizes';
11
- import { Activity, AlertTriangle, TrendingUp, Users, Settings, RefreshCw } from 'lucide-react';
12
-
13
- export interface MetricCard {
14
- /** Metric title */
15
- title: string;
16
- /** Main value to display */
17
- value: string | number;
18
- /** Change percentage */
19
- change?: number;
20
- /** Change period description */
21
- changePeriod?: string;
22
- /** Metric category for styling */
23
- category?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
24
- /** Custom icon */
25
- icon?: React.ReactNode;
26
- /** Click handler */
27
- onClick?: () => void;
28
- }
29
-
30
- export interface ChartConfig {
31
- /** Chart title */
32
- title: string;
33
- /** Chart type */
34
- type: 'line' | 'bar' | 'pie' | 'area';
35
- /** Chart data */
36
- data: Array<{ label: string; value: number; category?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 }>;
37
- /** Chart configuration */
38
- config?: Record<string, unknown>;
39
- /** Chart category for styling */
40
- category?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
41
- }
42
-
43
- export interface ActivityItem {
44
- /** Activity ID */
45
- id: string;
46
- /** Activity type */
47
- type: 'user' | 'system' | 'security' | 'content' | 'error';
48
- /** Activity message */
49
- message: string;
50
- /** Activity timestamp */
51
- timestamp: Date;
52
- /** User who performed the activity */
53
- user?: string;
54
- /** Additional metadata */
55
- metadata?: Record<string, unknown>;
56
- }
57
-
58
- export interface AlertItem {
59
- /** Alert ID */
60
- id: string;
61
- /** Alert severity */
62
- severity: 'low' | 'medium' | 'high' | 'critical';
63
- /** Alert title */
64
- title: string;
65
- /** Alert description */
66
- description: string;
67
- /** Alert timestamp */
68
- timestamp: Date;
69
- /** Whether alert is resolved */
70
- resolved?: boolean;
71
- /** Action to resolve alert */
72
- onResolve?: () => void;
73
- }
74
-
75
- export interface AdminDashboardTemplateProps {
76
- /** Dashboard title */
77
- title?: string;
78
- /** Dashboard description */
79
- description?: string;
80
- /** Key metrics to display */
81
- metrics: MetricCard[];
82
- /** Charts configuration */
83
- charts?: ChartConfig[];
84
- /** Recent activities */
85
- activities?: ActivityItem[];
86
- /** System alerts */
87
- alerts?: AlertItem[];
88
- /** Additional actions in header */
89
- actions?: React.ReactNode;
90
- /** Additional CSS classes */
91
- className?: string;
92
- /** Whether data is loading */
93
- isLoading?: boolean;
94
- /** Refresh handler */
95
- onRefresh?: () => void;
96
- /** Last updated timestamp */
97
- lastUpdated?: Date;
98
- }
99
-
100
- export const AdminDashboardTemplate: React.FC<AdminDashboardTemplateProps> = ({
101
- title = "Admin Dashboard",
102
- description = "System overview and key metrics",
103
- metrics,
104
- charts = [],
105
- activities = [],
106
- alerts = [],
107
- actions,
108
- className,
109
- isLoading = false,
110
- onRefresh,
111
- lastUpdated
112
- }) => {
113
- const unreadAlerts = alerts.filter(alert => !alert.resolved);
114
- const criticalAlerts = unreadAlerts.filter(alert => alert.severity === 'critical');
115
-
116
- const getActivityIcon = (type: ActivityItem['type']) => {
117
- switch (type) {
118
- case 'user': return <Users className="w-4 h-4" />;
119
- case 'system': return <Settings className="w-4 h-4" />;
120
- case 'security': return <AlertTriangle className="w-4 h-4" />;
121
- case 'content': return <Activity className="w-4 h-4" />;
122
- case 'error': return <AlertTriangle className="w-4 h-4" />;
123
- default: return <Activity className="w-4 h-4" />;
124
- }
125
- };
126
-
127
- const getActivityColor = (type: ActivityItem['type']) => {
128
- switch (type) {
129
- case 'user': return 'text-category-1';
130
- case 'system': return 'text-category-2';
131
- case 'security': return 'text-category-3';
132
- case 'content': return 'text-category-5';
133
- case 'error': return 'text-category-8';
134
- default: return 'text-muted-foreground';
135
- }
136
- };
137
-
138
- const getAlertSeverityCategory = (severity: AlertItem['severity']): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 => {
139
- switch (severity) {
140
- case 'low': return 6;
141
- case 'medium': return 7;
142
- case 'high': return 3;
143
- case 'critical': return 8;
144
- default: return 2;
145
- }
146
- };
147
-
148
- return (
149
- <div className={cn('flex flex-col min-h-0 flex-1', className)}>
150
- {/* Header Section */}
151
- <div className="bg-gradient-to-br from-muted/50 via-muted/30 to-background border-b border-border/50">
152
- <div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-12">
153
- <div className="flex items-start justify-between">
154
- <div className="flex items-center space-x-4">
155
- <IconBadge
156
- variant="category"
157
- category={1}
158
- size="lg"
159
- icon={<Activity className="w-5 h-5" />}
160
- tooltip="Dashboard Activity Overview"
161
- />
162
- <div>
163
- <h1 className="text-4xl font-bold text-foreground">{title}</h1>
164
- <p className="text-lg text-muted-foreground mt-2">{description}</p>
165
- </div>
166
- </div>
167
-
168
- <div className="ml-6 flex-shrink-0">
169
- {/* Action buttons */}
170
- <div className="flex items-center gap-2 mb-2">
171
- {onRefresh && (
172
- <Button
173
- variant="outline"
174
- onClick={onRefresh}
175
- disabled={isLoading}
176
- tooltip={isLoading ? "Refreshing..." : "Refresh data"}
177
- >
178
- <RefreshCw className={cn("w-4 h-4 mr-2", isLoading && "animate-spin")} />
179
- Refresh
180
- </Button>
181
- )}
182
- {actions}
183
- </div>
184
-
185
- {/* Status indicators positioned under buttons */}
186
- <div className="flex items-center gap-4 justify-end">
187
- {criticalAlerts.length > 0 && (
188
- <DataBadge
189
- variant="status"
190
- status="error"
191
- size="sm"
192
- >
193
- <AlertTriangle className="w-3 h-3 mr-1" />
194
- {criticalAlerts.length} Critical Alert{criticalAlerts.length !== 1 ? 's' : ''}
195
- </DataBadge>
196
- )}
197
-
198
- {lastUpdated && (
199
- <span className="text-sm text-muted-foreground">
200
- Last updated: {lastUpdated.toLocaleTimeString()}
201
- </span>
202
- )}
203
- </div>
204
- </div>
205
- </div>
206
- </div>
207
- </div>
208
-
209
- {/* Main Content */}
210
- <div className="flex-1 min-h-0 overflow-auto">
211
- <div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-8 space-y-8">
212
-
213
- {/* Key Metrics Grid */}
214
- <DashboardGrid columns={4} gap="md">
215
- {metrics.map((metric, index) => (
216
- <StatCard
217
- key={index}
218
- title={metric.title}
219
- value={metric.value}
220
- trend={metric.change ? { value: metric.change, label: metric.changePeriod } : undefined}
221
- category={metric.category || 1}
222
- icon={metric.icon || <TrendingUp className="w-5 h-5" />}
223
- onClick={metric.onClick}
224
- className="cursor-pointer transition-shadow"
225
- />
226
- ))}
227
- </DashboardGrid>
228
-
229
- {/* Charts and Activities Row */}
230
- <div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
231
-
232
- {/* Charts Section */}
233
- <div className="lg:col-span-2 space-y-6">
234
- {charts.map((chart, index) => (
235
- <Card key={index} className="p-6 overflow-hidden">
236
- <div className="mb-4">
237
- <h3 className="text-lg font-semibold text-foreground">
238
- {chart.title}
239
- </h3>
240
- </div>
241
- <div className={getContainerHeightClass('container-small-chart')}>
242
- <Chart
243
- title={chart.title}
244
- type={chart.type}
245
- data={chart.data}
246
- category={chart.category}
247
- height="small"
248
- variant="minimal"
249
- noWrapper={true}
250
- />
251
- </div>
252
- </Card>
253
- ))}
254
- </div>
255
-
256
- {/* Right Sidebar */}
257
- <div className="space-y-6">
258
-
259
- {/* System Alerts */}
260
- {unreadAlerts.length > 0 && (
261
- <Card className="p-4">
262
- <div className="mb-4">
263
- <h3 className="text-lg font-semibold text-foreground flex items-center">
264
- <AlertTriangle className="w-5 h-5 mr-2 text-category-8" />
265
- System Alerts
266
- </h3>
267
- </div>
268
- <div className="space-y-3">
269
- {unreadAlerts.slice(0, 5).map((alert) => (
270
- <div
271
- key={alert.id}
272
- className="flex items-start space-x-3 p-3 rounded-md border border-border"
273
- >
274
- <DataBadge
275
- variant="category"
276
- category={getAlertSeverityCategory(alert.severity)}
277
- size="sm"
278
- className="mt-0.5"
279
- >
280
- {alert.severity}
281
- </DataBadge>
282
- <div className="flex-1 min-w-0">
283
- <p className="text-sm font-medium text-foreground">
284
- {alert.title}
285
- </p>
286
- <p className="text-xs text-muted-foreground mt-1">
287
- {alert.description}
288
- </p>
289
- <p className="text-xs text-muted-foreground mt-1">
290
- {alert.timestamp.toLocaleString()}
291
- </p>
292
- {alert.onResolve && (
293
- <Button
294
- size="sm"
295
- variant="outline"
296
- className="mt-2"
297
- onClick={alert.onResolve}
298
- >
299
- Resolve
300
- </Button>
301
- )}
302
- </div>
303
- </div>
304
- ))}
305
- </div>
306
- </Card>
307
- )}
308
-
309
- {/* Recent Activity */}
310
- <Card className="p-4">
311
- <div className="mb-4">
312
- <h3 className="text-lg font-semibold text-foreground flex items-center">
313
- <Activity className="w-5 h-5 mr-2 text-category-2" />
314
- Recent Activity
315
- </h3>
316
- </div>
317
- <div className="space-y-3">
318
- {activities.slice(0, 8).map((activity) => (
319
- <div key={activity.id} className="flex items-start space-x-3">
320
- <div className={cn(
321
- "mt-1 flex-shrink-0",
322
- getActivityColor(activity.type)
323
- )}>
324
- {getActivityIcon(activity.type)}
325
- </div>
326
- <div className="flex-1 min-w-0">
327
- <p className="text-sm text-foreground">
328
- {activity.message}
329
- </p>
330
- <div className="flex items-center gap-2 mt-1">
331
- {activity.user && (
332
- <span className="text-xs text-muted-foreground">
333
- by {activity.user}
334
- </span>
335
- )}
336
- <span className="text-xs text-muted-foreground">
337
- {activity.timestamp.toLocaleString()}
338
- </span>
339
- </div>
340
- </div>
341
- </div>
342
- ))}
343
- </div>
344
- </Card>
345
- </div>
346
- </div>
347
- </div>
348
- </div>
349
- </div>
350
- );
351
- };