@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,219 +0,0 @@
1
- import React from 'react';
2
- import { Card } from '../../ui/card';
3
- import { Skeleton } from '../../ui/skeleton';
4
- import { Tooltip } from '../Tooltip';
5
- import { TrendingUp, TrendingDown, Minus, ArrowRight } from 'lucide-react';
6
- import { cn } from '../../utils/utils';
7
- import type { ILoadable } from '../../types';
8
-
9
- export interface StatCardProps extends ILoadable {
10
- title: string;
11
- value: string | number;
12
- subtitle?: string;
13
- trend?: {
14
- value: number;
15
- label?: string;
16
- };
17
- category?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
18
- icon?: React.ReactNode;
19
- onClick?: () => void;
20
- className?: string;
21
- /** Tooltip content for the value (useful for showing full numbers when abbreviated) */
22
- valueTooltip?: string;
23
- /** Tooltip content for the icon */
24
- iconTooltip?: string;
25
- }
26
-
27
- export const StatCard = ({
28
- title,
29
- value,
30
- subtitle,
31
- trend,
32
- category,
33
- icon,
34
- onClick,
35
- className,
36
- valueTooltip,
37
- iconTooltip,
38
- isLoading = false
39
- }: StatCardProps) => {
40
- const getTrendIcon = () => {
41
- if (!trend) return null;
42
-
43
- if (trend.value > 0) {
44
- return <TrendingUp className="w-4 h-4" />;
45
- } else if (trend.value < 0) {
46
- return <TrendingDown className="w-4 h-4" />;
47
- }
48
- return <Minus className="w-4 h-4" />;
49
- };
50
-
51
- const getTrendColor = () => {
52
- if (!trend) return '';
53
-
54
- if (trend.value > 0) return 'text-status-success';
55
- if (trend.value < 0) return 'text-status-error';
56
- return 'text-status-neutral';
57
- };
58
-
59
- // Loading state skeleton that matches StatCard dimensions
60
- if (isLoading) {
61
- return (
62
- <Card
63
- className={cn(
64
- "card-container relative overflow-hidden",
65
- className
66
- )}
67
- category={category}
68
- data-component-name="StatCard"
69
- >
70
- <div className="space-y-3 relative">
71
- {/* Hidden content that defines exact dimensions */}
72
- <div className="flex items-center justify-between">
73
- <div className="text-data-label font-medium" style={{ visibility: 'hidden' }}>
74
- {title}
75
- </div>
76
- {icon && (
77
- <div className={cn(
78
- "p-2 rounded-md flex items-center justify-center transition-colors",
79
- category ? `bg-muted/50 text-category-${category}` : "bg-muted/50 text-muted-foreground"
80
- )} style={{ visibility: 'hidden' }}>
81
- {icon}
82
- </div>
83
- )}
84
- </div>
85
-
86
- <div className="space-y-1">
87
- <div className={cn(
88
- "text-3xl font-bold transition-all group-hover:scale-105",
89
- category ? `text-category-${category}` : "text-foreground"
90
- )} style={{ visibility: 'hidden' }}>
91
- {value}
92
- </div>
93
- {subtitle && (
94
- <div className="text-data-meta" style={{ visibility: 'hidden' }}>
95
- {subtitle}
96
- </div>
97
- )}
98
- </div>
99
-
100
- <div className="flex items-center justify-between">
101
- {trend && (
102
- <div className={cn("flex items-center gap-1.5 text-sm", "text-muted-foreground")} style={{ visibility: 'hidden' }}>
103
- {/* Render actual trend content hidden */}
104
- <span>{trend.value > 0 && '+'}{trend.value}%</span>
105
- {trend.label && <span>{trend.label}</span>}
106
- </div>
107
- )}
108
- {onClick && (
109
- <div style={{ visibility: 'hidden' }}>→</div>
110
- )}
111
- </div>
112
-
113
- {/* Skeleton overlay positioned absolutely */}
114
- <div className="absolute inset-0 space-y-3">
115
- <div className="flex items-center justify-between">
116
- <Skeleton className="h-5 w-24" />
117
- {icon && (
118
- <div className="p-2 rounded flex items-center justify-center bg-muted/50">
119
- <Skeleton className="h-5 w-5" />
120
- </div>
121
- )}
122
- </div>
123
- <div className="space-y-1">
124
- <Skeleton className="h-9 w-20" />
125
- {subtitle && <Skeleton className="h-4 w-32" />}
126
- </div>
127
- <div className="flex items-center justify-between">
128
- {trend && <Skeleton className="h-4 w-16" />}
129
- {onClick && <Skeleton className="h-4 w-4 ml-auto" />}
130
- </div>
131
- </div>
132
- </div>
133
- </Card>
134
- );
135
- }
136
-
137
- return (
138
- <Card
139
- className={cn(
140
- "card-container relative overflow-hidden transition-all animate-slide-up",
141
- onClick && "cursor-pointer hover:shadow-md hover:scale-105 active:scale-95",
142
- category && `hover:shadow-category-${category}`,
143
- "group",
144
- className
145
- )}
146
- category={category} // Pass category directly to Card component
147
- data-component-name="StatCard"
148
- onClick={onClick}
149
- role={onClick ? 'button' : undefined}
150
- tabIndex={onClick ? 0 : undefined}
151
- onKeyDown={onClick ? (e) => {
152
- if (e.key === 'Enter' || e.key === ' ') {
153
- e.preventDefault();
154
- onClick();
155
- }
156
- } : undefined}
157
- >
158
- <div className="space-y-3">
159
- {/* Header */}
160
- <div className="flex items-center justify-between">
161
- <div className="text-sm font-semibold text-foreground" data-component-name="StatCard">{title}</div>
162
- {icon && (
163
- <Tooltip
164
- content={iconTooltip}
165
- disabled={!iconTooltip}
166
- position="left"
167
- size="sm"
168
- >
169
- <div className={cn(
170
- "p-2 rounded-md flex items-center justify-center transition-colors",
171
- category ? `bg-muted/50 text-category-${category}` : "bg-muted/50 text-muted-foreground"
172
- )} data-component-name="StatCardIcon">
173
- {icon}
174
- </div>
175
- </Tooltip>
176
- )}
177
- </div>
178
-
179
- {/* Value */}
180
- <div className="space-y-1">
181
- <Tooltip
182
- content={valueTooltip}
183
- disabled={!valueTooltip}
184
- position="top"
185
- size="sm"
186
- >
187
- <div className={cn(
188
- "text-3xl font-bold transition-all group-hover:scale-105",
189
- category ? `text-category-${category}` : "text-foreground"
190
- )}>
191
- {value}
192
- </div>
193
- </Tooltip>
194
- {subtitle && (
195
- <div className="text-data-meta">{subtitle}</div>
196
- )}
197
- </div>
198
-
199
- {/* Trend or Action */}
200
- <div className="flex items-center justify-between">
201
- {trend && (
202
- <div className={cn("flex items-center gap-1.5 text-sm", getTrendColor())}>
203
- {getTrendIcon()}
204
- <span className="font-medium">
205
- {trend.value > 0 && '+'}{trend.value}%
206
- </span>
207
- {trend.label && (
208
- <span className="text-data-meta">{trend.label}</span>
209
- )}
210
- </div>
211
- )}
212
- {onClick && (
213
- <ArrowRight className="w-4 h-4 text-muted-foreground ml-auto transition-transform group-hover:translate-x-1" data-component-name="StatCardArrow" />
214
- )}
215
- </div>
216
- </div>
217
- </Card>
218
- );
219
- };
@@ -1 +0,0 @@
1
- export * from './StatCard';