@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,95 +0,0 @@
1
- import React from 'react';
2
- import { cn } from '../../utils/utils';
3
- import { Tooltip } from '../Tooltip';
4
- import { getAnimationClasses, animationPresets } from '../../utils/animations';
5
-
6
- export interface IconBadgeProps {
7
- children?: React.ReactNode;
8
- icon?: React.ReactNode;
9
- variant?: 'category' | 'status';
10
- category?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
11
- status?: 'success' | 'warning' | 'error' | 'info' | 'neutral';
12
- size?: 'sm' | 'md' | 'lg';
13
- interactive?: boolean;
14
- onClick?: () => void;
15
- className?: string;
16
- /** Tooltip content to show on hover */
17
- tooltip?: string;
18
- }
19
-
20
- export const IconBadge = ({
21
- children,
22
- icon,
23
- variant = 'category',
24
- category = 1,
25
- status = 'neutral',
26
- size = 'md',
27
- interactive = false,
28
- onClick,
29
- className,
30
- tooltip
31
- }: IconBadgeProps) => {
32
-
33
- const sizeClasses: Record<'sm' | 'md' | 'lg', string> = {
34
- sm: 'w-8 h-8 text-xs rounded-lg',
35
- md: 'w-10 h-10 text-sm rounded-xl',
36
- lg: 'w-12 h-12 text-base rounded-xl',
37
- };
38
-
39
- const baseClasses = cn(
40
- 'inline-flex items-center justify-center font-bold shadow-md',
41
- sizeClasses[size],
42
- interactive && [
43
- 'cursor-pointer',
44
- getAnimationClasses({
45
- ...animationPresets.dataBadge,
46
- size: size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'
47
- })
48
- ],
49
- className
50
- );
51
-
52
- // Generate gradient classes based on variant
53
- const gradientClasses = variant === 'category'
54
- ? `bg-gradient-to-br from-category-${category} to-category-${Math.min(category + 1, 8)}`
55
- : variant === 'status'
56
- ? `bg-gradient-to-br from-status-${status} to-status-${status}`
57
- : 'bg-gradient-to-br from-category-1 to-category-2';
58
-
59
- const badge = (
60
- <div
61
- className={cn(baseClasses, gradientClasses, 'animate-fade-in')}
62
- onClick={onClick}
63
- role={interactive ? 'button' : undefined}
64
- tabIndex={interactive ? 0 : undefined}
65
- onKeyDown={interactive ? (e) => {
66
- if (e.key === 'Enter' || e.key === ' ') {
67
- e.preventDefault();
68
- onClick?.();
69
- }
70
- } : undefined}
71
- data-component-name="IconBadge"
72
- >
73
- {icon && (
74
- <span className="text-primary-foreground drop-shadow">
75
- {icon}
76
- </span>
77
- )}
78
- {children && !icon && (
79
- <span className="text-primary-foreground font-bold">
80
- {children}
81
- </span>
82
- )}
83
- </div>
84
- );
85
-
86
- if (tooltip) {
87
- return (
88
- <Tooltip content={tooltip} position="top" size="sm">
89
- {badge}
90
- </Tooltip>
91
- );
92
- }
93
-
94
- return badge;
95
- };
@@ -1,2 +0,0 @@
1
- export { IconBadge } from './IconBadge';
2
- export type { IconBadgeProps } from './IconBadge';
@@ -1,223 +0,0 @@
1
- import React, { useEffect, useRef } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { Button } from '../../ui/button';
4
- import { X } from 'lucide-react';
5
- import { cn } from '../../utils/utils';
6
-
7
- export interface ModalProps {
8
- isOpen: boolean;
9
- onClose: () => void;
10
- title?: string;
11
- children: React.ReactNode;
12
- size?: 'sm' | 'md' | 'lg' | 'xl';
13
- variant?: 'default' | 'destructive' | 'success';
14
- closeOnBackdrop?: boolean;
15
- closeOnEscape?: boolean;
16
- showCloseButton?: boolean;
17
- footer?: React.ReactNode;
18
- className?: string;
19
- overlayClassName?: string;
20
- contentClassName?: string;
21
- }
22
-
23
- const sizeClasses = {
24
- sm: 'max-w-sm',
25
- md: 'max-w-md',
26
- lg: 'max-w-lg',
27
- xl: 'max-w-xl'
28
- };
29
-
30
- const variantClasses = {
31
- default: 'border-border',
32
- destructive: 'border-l-4 border-l-status-error',
33
- success: 'border-l-4 border-l-status-success'
34
- };
35
-
36
- export const Modal = ({
37
- isOpen,
38
- onClose,
39
- title,
40
- children,
41
- size = 'md',
42
- variant = 'default',
43
- closeOnBackdrop = true,
44
- closeOnEscape = true,
45
- showCloseButton = true,
46
- footer,
47
- className,
48
- overlayClassName,
49
- contentClassName
50
- }: ModalProps) => {
51
- const modalRef = useRef<HTMLDivElement>(null);
52
- const previousActiveElement = useRef<HTMLElement | null>(null);
53
-
54
- // Handle escape key
55
- useEffect(() => {
56
- if (!isOpen || !closeOnEscape) return;
57
-
58
- const handleEscape = (e: KeyboardEvent) => {
59
- if (e.key === 'Escape') {
60
- onClose();
61
- }
62
- };
63
-
64
- document.addEventListener('keydown', handleEscape);
65
- return () => document.removeEventListener('keydown', handleEscape);
66
- }, [isOpen, closeOnEscape, onClose]);
67
-
68
- // Handle focus management
69
- useEffect(() => {
70
- if (!isOpen) return;
71
-
72
- // Store the currently focused element
73
- previousActiveElement.current = document.activeElement as HTMLElement;
74
-
75
- // Focus the modal
76
- if (modalRef.current) {
77
- modalRef.current.focus();
78
- }
79
-
80
- // Restore focus when modal closes
81
- return () => {
82
- if (previousActiveElement.current) {
83
- previousActiveElement.current.focus();
84
- }
85
- };
86
- }, [isOpen]);
87
-
88
- // Prevent body scroll when modal is open
89
- useEffect(() => {
90
- if (isOpen) {
91
- document.body.style.overflow = 'hidden';
92
- } else {
93
- document.body.style.overflow = '';
94
- }
95
-
96
- return () => {
97
- document.body.style.overflow = '';
98
- };
99
- }, [isOpen]);
100
-
101
- // Handle backdrop click
102
- const handleBackdropClick = (e: React.MouseEvent) => {
103
- if (closeOnBackdrop && e.target === e.currentTarget) {
104
- onClose();
105
- }
106
- };
107
-
108
- // Trap focus within modal
109
- const handleKeyDown = (e: React.KeyboardEvent) => {
110
- if (e.key === 'Tab') {
111
- const focusableElements = modalRef.current?.querySelectorAll(
112
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
113
- );
114
-
115
- if (!focusableElements?.length) return;
116
-
117
- const firstElement = focusableElements[0] as HTMLElement;
118
- const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;
119
-
120
- if (e.shiftKey) {
121
- if (document.activeElement === firstElement) {
122
- e.preventDefault();
123
- lastElement.focus();
124
- }
125
- } else {
126
- if (document.activeElement === lastElement) {
127
- e.preventDefault();
128
- firstElement.focus();
129
- }
130
- }
131
- }
132
- };
133
-
134
- if (!isOpen) return null;
135
-
136
- return createPortal(
137
- <div
138
- className={cn(
139
- "fixed inset-0 z-50 flex items-center justify-center p-4",
140
- "bg-black/50 backdrop-blur-sm",
141
- "animate-in fade-in-0 duration-200",
142
- overlayClassName
143
- )}
144
- onClick={handleBackdropClick}
145
- data-component-name="ModalOverlay"
146
- >
147
- <div
148
- ref={modalRef}
149
- role="dialog"
150
- aria-modal="true"
151
- aria-labelledby={title ? "modal-title" : undefined}
152
- tabIndex={-1}
153
- onKeyDown={handleKeyDown}
154
- className={cn(
155
- "relative w-full max-h-[90vh] overflow-hidden",
156
- "bg-card border rounded-lg shadow-lg",
157
- "animate-in zoom-in-95 duration-200",
158
- sizeClasses[size],
159
- variantClasses[variant],
160
- className
161
- )}
162
- data-component-name="Modal"
163
- data-variant={variant}
164
- data-size={size}
165
- >
166
- {/* Header */}
167
- {(title || showCloseButton) && (
168
- <div className="flex items-center justify-between p-6 border-b border-border">
169
- {title && (
170
- <h2
171
- id="modal-title"
172
- className={cn(
173
- "text-lg font-semibold text-foreground",
174
- variant === 'destructive' && "text-status-error",
175
- variant === 'success' && "text-status-success"
176
- )}
177
- data-component-name="ModalTitle"
178
- >
179
- {title}
180
- </h2>
181
- )}
182
- {showCloseButton && (
183
- <Button
184
- variant="ghost"
185
- size="icon"
186
- onClick={onClose}
187
- className="h-8 w-8 rounded hover:bg-muted/80"
188
- aria-label="Close modal"
189
- data-component-name="ModalCloseButton"
190
- >
191
- <X className="h-4 w-4" />
192
- </Button>
193
- )}
194
- </div>
195
- )}
196
-
197
- {/* Content */}
198
- <div
199
- className={cn(
200
- "p-6 overflow-y-auto",
201
- (!title && !showCloseButton) && "pt-6",
202
- !footer && "pb-6",
203
- contentClassName
204
- )}
205
- data-component-name="ModalContent"
206
- >
207
- {children}
208
- </div>
209
-
210
- {/* Footer */}
211
- {footer && (
212
- <div
213
- className="flex items-center justify-end gap-3 p-6 pt-0 border-t border-border"
214
- data-component-name="ModalFooter"
215
- >
216
- {footer}
217
- </div>
218
- )}
219
- </div>
220
- </div>,
221
- document.body
222
- );
223
- };
@@ -1,2 +0,0 @@
1
- export { Modal } from './Modal';
2
- export type { ModalProps } from './Modal';