@lp-labs/ui-components 0.0.0-stage → 1.0.0

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 (244) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +256 -2
  4. package/dist/cjs/components/Accordion.d.ts +78 -0
  5. package/dist/cjs/components/Accordion.js +78 -0
  6. package/dist/cjs/components/AdvancedComponents.d.ts +353 -0
  7. package/dist/cjs/components/AdvancedComponents.js +353 -0
  8. package/dist/cjs/components/Alert.d.ts +102 -0
  9. package/dist/cjs/components/Alert.js +102 -0
  10. package/dist/cjs/components/Avatar.d.ts +89 -0
  11. package/dist/cjs/components/Avatar.js +89 -0
  12. package/dist/cjs/components/Badge.d.ts +57 -0
  13. package/dist/cjs/components/Badge.js +57 -0
  14. package/dist/cjs/components/Breadcrumb.d.ts +50 -0
  15. package/dist/cjs/components/Breadcrumb.js +50 -0
  16. package/dist/cjs/components/Button.d.ts +77 -0
  17. package/dist/cjs/components/Button.js +77 -0
  18. package/dist/cjs/components/ButtonVariants.d.ts +261 -0
  19. package/dist/cjs/components/ButtonVariants.js +261 -0
  20. package/dist/cjs/components/Card.d.ts +56 -0
  21. package/dist/cjs/components/Card.js +56 -0
  22. package/dist/cjs/components/CardVariants.d.ts +267 -0
  23. package/dist/cjs/components/CardVariants.js +267 -0
  24. package/dist/cjs/components/Checkbox.d.ts +50 -0
  25. package/dist/cjs/components/Checkbox.js +50 -0
  26. package/dist/cjs/components/Chip.d.ts +104 -0
  27. package/dist/cjs/components/Chip.js +104 -0
  28. package/dist/cjs/components/DataDisplayComponents.d.ts +275 -0
  29. package/dist/cjs/components/DataDisplayComponents.js +275 -0
  30. package/dist/cjs/components/Divider.d.ts +77 -0
  31. package/dist/cjs/components/Divider.js +77 -0
  32. package/dist/cjs/components/Drawer.d.ts +142 -0
  33. package/dist/cjs/components/Drawer.js +142 -0
  34. package/dist/cjs/components/Dropdown.d.ts +139 -0
  35. package/dist/cjs/components/Dropdown.js +139 -0
  36. package/dist/cjs/components/Form.d.ts +41 -0
  37. package/dist/cjs/components/Form.js +41 -0
  38. package/dist/cjs/components/FormGroup.d.ts +58 -0
  39. package/dist/cjs/components/FormGroup.js +58 -0
  40. package/dist/cjs/components/FormInputVariants.d.ts +298 -0
  41. package/dist/cjs/components/FormInputVariants.js +298 -0
  42. package/dist/cjs/components/Image.d.ts +106 -0
  43. package/dist/cjs/components/Image.js +106 -0
  44. package/dist/cjs/components/Input.d.ts +65 -0
  45. package/dist/cjs/components/Input.js +65 -0
  46. package/dist/cjs/components/LayoutComponents.d.ts +258 -0
  47. package/dist/cjs/components/LayoutComponents.js +258 -0
  48. package/dist/cjs/components/Link.d.ts +71 -0
  49. package/dist/cjs/components/Link.js +71 -0
  50. package/dist/cjs/components/LoadingFeedbackComponents.d.ts +230 -0
  51. package/dist/cjs/components/LoadingFeedbackComponents.js +230 -0
  52. package/dist/cjs/components/Menu.d.ts +167 -0
  53. package/dist/cjs/components/Menu.js +167 -0
  54. package/dist/cjs/components/Modal.d.ts +145 -0
  55. package/dist/cjs/components/Modal.js +145 -0
  56. package/dist/cjs/components/ModalTypes.d.ts +288 -0
  57. package/dist/cjs/components/ModalTypes.js +288 -0
  58. package/dist/cjs/components/Navbar.d.ts +181 -0
  59. package/dist/cjs/components/Navbar.js +181 -0
  60. package/dist/cjs/components/NavigationComponents.d.ts +276 -0
  61. package/dist/cjs/components/NavigationComponents.js +276 -0
  62. package/dist/cjs/components/Pagination.d.ts +94 -0
  63. package/dist/cjs/components/Pagination.js +94 -0
  64. package/dist/cjs/components/Popover.d.ts +108 -0
  65. package/dist/cjs/components/Popover.js +108 -0
  66. package/dist/cjs/components/Progress.d.ts +68 -0
  67. package/dist/cjs/components/Progress.js +68 -0
  68. package/dist/cjs/components/Radio.d.ts +93 -0
  69. package/dist/cjs/components/Radio.js +93 -0
  70. package/dist/cjs/components/Rating.d.ts +82 -0
  71. package/dist/cjs/components/Rating.js +82 -0
  72. package/dist/cjs/components/Select.d.ts +74 -0
  73. package/dist/cjs/components/Select.js +74 -0
  74. package/dist/cjs/components/Sidebar.d.ts +174 -0
  75. package/dist/cjs/components/Sidebar.js +174 -0
  76. package/dist/cjs/components/Skeleton.d.ts +57 -0
  77. package/dist/cjs/components/Skeleton.js +57 -0
  78. package/dist/cjs/components/Slider.d.ts +64 -0
  79. package/dist/cjs/components/Slider.js +64 -0
  80. package/dist/cjs/components/Spinner.d.ts +70 -0
  81. package/dist/cjs/components/Spinner.js +70 -0
  82. package/dist/cjs/components/Stack.d.ts +75 -0
  83. package/dist/cjs/components/Stack.js +75 -0
  84. package/dist/cjs/components/Stepper.d.ts +150 -0
  85. package/dist/cjs/components/Stepper.js +150 -0
  86. package/dist/cjs/components/Table.d.ts +173 -0
  87. package/dist/cjs/components/Table.js +173 -0
  88. package/dist/cjs/components/Tabs.d.ts +104 -0
  89. package/dist/cjs/components/Tabs.js +104 -0
  90. package/dist/cjs/components/Tag.d.ts +74 -0
  91. package/dist/cjs/components/Tag.js +74 -0
  92. package/dist/cjs/components/Textarea.d.ts +75 -0
  93. package/dist/cjs/components/Textarea.js +75 -0
  94. package/dist/cjs/components/Timeline.d.ts +124 -0
  95. package/dist/cjs/components/Timeline.js +124 -0
  96. package/dist/cjs/components/Toast.d.ts +155 -0
  97. package/dist/cjs/components/Toast.js +155 -0
  98. package/dist/cjs/components/Toggle.d.ts +75 -0
  99. package/dist/cjs/components/Toggle.js +75 -0
  100. package/dist/cjs/components/Tooltip.d.ts +80 -0
  101. package/dist/cjs/components/Tooltip.js +80 -0
  102. package/dist/cjs/components/TypographyComponents.d.ts +265 -0
  103. package/dist/cjs/components/TypographyComponents.js +265 -0
  104. package/dist/cjs/components/UtilityComponents.d.ts +345 -0
  105. package/dist/cjs/components/UtilityComponents.js +345 -0
  106. package/dist/cjs/components/Video.d.ts +82 -0
  107. package/dist/cjs/components/Video.js +82 -0
  108. package/dist/cjs/components/index.d.ts +311 -0
  109. package/dist/cjs/components/index.js +311 -0
  110. package/dist/cjs/index.d.ts +5 -0
  111. package/dist/cjs/index.js +5 -0
  112. package/dist/cjs/styles/main.css +493 -0
  113. package/dist/cjs/theme/ThemeProvider.d.ts +185 -0
  114. package/dist/cjs/theme/ThemeProvider.js +185 -0
  115. package/dist/cjs/theme/index.d.ts +2 -0
  116. package/dist/cjs/theme/index.js +2 -0
  117. package/dist/cjs/utilities/classNames.d.ts +200 -0
  118. package/dist/cjs/utilities/classNames.js +200 -0
  119. package/dist/cjs/utilities/index.d.ts +3 -0
  120. package/dist/cjs/utilities/index.js +3 -0
  121. package/dist/cjs/utilities/styles.d.ts +94 -0
  122. package/dist/cjs/utilities/styles.js +94 -0
  123. package/dist/esm/components/Accordion.d.ts +78 -0
  124. package/dist/esm/components/Accordion.js +78 -0
  125. package/dist/esm/components/AdvancedComponents.d.ts +353 -0
  126. package/dist/esm/components/AdvancedComponents.js +353 -0
  127. package/dist/esm/components/Alert.d.ts +102 -0
  128. package/dist/esm/components/Alert.js +102 -0
  129. package/dist/esm/components/Avatar.d.ts +89 -0
  130. package/dist/esm/components/Avatar.js +89 -0
  131. package/dist/esm/components/Badge.d.ts +57 -0
  132. package/dist/esm/components/Badge.js +57 -0
  133. package/dist/esm/components/Breadcrumb.d.ts +50 -0
  134. package/dist/esm/components/Breadcrumb.js +50 -0
  135. package/dist/esm/components/Button.d.ts +77 -0
  136. package/dist/esm/components/Button.js +77 -0
  137. package/dist/esm/components/ButtonVariants.d.ts +261 -0
  138. package/dist/esm/components/ButtonVariants.js +261 -0
  139. package/dist/esm/components/Card.d.ts +56 -0
  140. package/dist/esm/components/Card.js +56 -0
  141. package/dist/esm/components/CardVariants.d.ts +267 -0
  142. package/dist/esm/components/CardVariants.js +267 -0
  143. package/dist/esm/components/Checkbox.d.ts +50 -0
  144. package/dist/esm/components/Checkbox.js +50 -0
  145. package/dist/esm/components/Chip.d.ts +104 -0
  146. package/dist/esm/components/Chip.js +104 -0
  147. package/dist/esm/components/DataDisplayComponents.d.ts +275 -0
  148. package/dist/esm/components/DataDisplayComponents.js +275 -0
  149. package/dist/esm/components/Divider.d.ts +77 -0
  150. package/dist/esm/components/Divider.js +77 -0
  151. package/dist/esm/components/Drawer.d.ts +142 -0
  152. package/dist/esm/components/Drawer.js +142 -0
  153. package/dist/esm/components/Dropdown.d.ts +139 -0
  154. package/dist/esm/components/Dropdown.js +139 -0
  155. package/dist/esm/components/Form.d.ts +41 -0
  156. package/dist/esm/components/Form.js +41 -0
  157. package/dist/esm/components/FormGroup.d.ts +58 -0
  158. package/dist/esm/components/FormGroup.js +58 -0
  159. package/dist/esm/components/FormInputVariants.d.ts +298 -0
  160. package/dist/esm/components/FormInputVariants.js +298 -0
  161. package/dist/esm/components/Image.d.ts +106 -0
  162. package/dist/esm/components/Image.js +106 -0
  163. package/dist/esm/components/Input.d.ts +65 -0
  164. package/dist/esm/components/Input.js +65 -0
  165. package/dist/esm/components/LayoutComponents.d.ts +258 -0
  166. package/dist/esm/components/LayoutComponents.js +258 -0
  167. package/dist/esm/components/Link.d.ts +71 -0
  168. package/dist/esm/components/Link.js +71 -0
  169. package/dist/esm/components/LoadingFeedbackComponents.d.ts +230 -0
  170. package/dist/esm/components/LoadingFeedbackComponents.js +230 -0
  171. package/dist/esm/components/Menu.d.ts +167 -0
  172. package/dist/esm/components/Menu.js +167 -0
  173. package/dist/esm/components/Modal.d.ts +145 -0
  174. package/dist/esm/components/Modal.js +145 -0
  175. package/dist/esm/components/ModalTypes.d.ts +288 -0
  176. package/dist/esm/components/ModalTypes.js +288 -0
  177. package/dist/esm/components/Navbar.d.ts +181 -0
  178. package/dist/esm/components/Navbar.js +181 -0
  179. package/dist/esm/components/NavigationComponents.d.ts +276 -0
  180. package/dist/esm/components/NavigationComponents.js +276 -0
  181. package/dist/esm/components/Pagination.d.ts +94 -0
  182. package/dist/esm/components/Pagination.js +94 -0
  183. package/dist/esm/components/Popover.d.ts +108 -0
  184. package/dist/esm/components/Popover.js +108 -0
  185. package/dist/esm/components/Progress.d.ts +68 -0
  186. package/dist/esm/components/Progress.js +68 -0
  187. package/dist/esm/components/Radio.d.ts +93 -0
  188. package/dist/esm/components/Radio.js +93 -0
  189. package/dist/esm/components/Rating.d.ts +82 -0
  190. package/dist/esm/components/Rating.js +82 -0
  191. package/dist/esm/components/Select.d.ts +74 -0
  192. package/dist/esm/components/Select.js +74 -0
  193. package/dist/esm/components/Sidebar.d.ts +174 -0
  194. package/dist/esm/components/Sidebar.js +174 -0
  195. package/dist/esm/components/Skeleton.d.ts +57 -0
  196. package/dist/esm/components/Skeleton.js +57 -0
  197. package/dist/esm/components/Slider.d.ts +64 -0
  198. package/dist/esm/components/Slider.js +64 -0
  199. package/dist/esm/components/Spinner.d.ts +70 -0
  200. package/dist/esm/components/Spinner.js +70 -0
  201. package/dist/esm/components/Stack.d.ts +75 -0
  202. package/dist/esm/components/Stack.js +75 -0
  203. package/dist/esm/components/Stepper.d.ts +150 -0
  204. package/dist/esm/components/Stepper.js +150 -0
  205. package/dist/esm/components/Table.d.ts +173 -0
  206. package/dist/esm/components/Table.js +173 -0
  207. package/dist/esm/components/Tabs.d.ts +104 -0
  208. package/dist/esm/components/Tabs.js +104 -0
  209. package/dist/esm/components/Tag.d.ts +74 -0
  210. package/dist/esm/components/Tag.js +74 -0
  211. package/dist/esm/components/Textarea.d.ts +75 -0
  212. package/dist/esm/components/Textarea.js +75 -0
  213. package/dist/esm/components/Timeline.d.ts +124 -0
  214. package/dist/esm/components/Timeline.js +124 -0
  215. package/dist/esm/components/Toast.d.ts +155 -0
  216. package/dist/esm/components/Toast.js +155 -0
  217. package/dist/esm/components/Toggle.d.ts +75 -0
  218. package/dist/esm/components/Toggle.js +75 -0
  219. package/dist/esm/components/Tooltip.d.ts +80 -0
  220. package/dist/esm/components/Tooltip.js +80 -0
  221. package/dist/esm/components/TypographyComponents.d.ts +265 -0
  222. package/dist/esm/components/TypographyComponents.js +265 -0
  223. package/dist/esm/components/UtilityComponents.d.ts +345 -0
  224. package/dist/esm/components/UtilityComponents.js +345 -0
  225. package/dist/esm/components/Video.d.ts +82 -0
  226. package/dist/esm/components/Video.js +82 -0
  227. package/dist/esm/components/index.d.ts +311 -0
  228. package/dist/esm/components/index.js +311 -0
  229. package/dist/esm/index.d.ts +5 -0
  230. package/dist/esm/index.js +5 -0
  231. package/dist/esm/styles/main.css +493 -0
  232. package/dist/esm/theme/ThemeProvider.d.ts +185 -0
  233. package/dist/esm/theme/ThemeProvider.js +185 -0
  234. package/dist/esm/theme/index.d.ts +2 -0
  235. package/dist/esm/theme/index.js +2 -0
  236. package/dist/esm/utilities/classNames.d.ts +200 -0
  237. package/dist/esm/utilities/classNames.js +200 -0
  238. package/dist/esm/utilities/index.d.ts +3 -0
  239. package/dist/esm/utilities/index.js +3 -0
  240. package/dist/esm/utilities/styles.d.ts +94 -0
  241. package/dist/esm/utilities/styles.js +94 -0
  242. package/dist/styles/main.css +493 -0
  243. package/package.json +124 -6
  244. package/src/styles/main.css +493 -0
@@ -0,0 +1,102 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ variant?: 'success' | 'warning' | 'danger' | 'info';
6
+ title?: string;
7
+ onClose?: () => void;
8
+ closeable?: boolean;
9
+ }
10
+
11
+ const variantStyles = {
12
+ success: {
13
+ container: 'bg-green-50 border-green-200 text-green-800',
14
+ icon: 'text-green-600',
15
+ },
16
+ warning: {
17
+ container: 'bg-yellow-50 border-yellow-200 text-yellow-800',
18
+ icon: 'text-yellow-600',
19
+ },
20
+ danger: {
21
+ container: 'bg-red-50 border-red-200 text-red-800',
22
+ icon: 'text-red-600',
23
+ },
24
+ info: {
25
+ container: 'bg-blue-50 border-blue-200 text-blue-800',
26
+ icon: 'text-blue-600',
27
+ },
28
+ };
29
+
30
+ const icons = {
31
+ success: (
32
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
33
+ <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
34
+ </svg>
35
+ ),
36
+ warning: (
37
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
38
+ <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
39
+ </svg>
40
+ ),
41
+ danger: (
42
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
43
+ <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
44
+ </svg>
45
+ ),
46
+ info: (
47
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
48
+ <path fillRule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clipRule="evenodd" />
49
+ </svg>
50
+ ),
51
+ };
52
+
53
+ export const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
54
+ (
55
+ {
56
+ variant = 'info',
57
+ title,
58
+ onClose,
59
+ closeable = false,
60
+ className,
61
+ children,
62
+ ...props
63
+ },
64
+ ref,
65
+ ) => {
66
+ const styles = variantStyles[variant];
67
+
68
+ return (
69
+ <div
70
+ ref={ref}
71
+ className={cn(
72
+ 'border rounded-lg p-4 flex gap-3',
73
+ styles.container,
74
+ className,
75
+ )}
76
+ role="alert"
77
+ {...props}
78
+ >
79
+ <div className={cn('flex-shrink-0 mt-0.5', styles.icon)}>
80
+ {icons[variant]}
81
+ </div>
82
+ <div className="flex-1">
83
+ {title && <h3 className="font-semibold mb-1">{title}</h3>}
84
+ <div>{children}</div>
85
+ </div>
86
+ {closeable && (
87
+ <button
88
+ onClick={onClose}
89
+ className="ml-auto text-current opacity-70 hover:opacity-100 transition-opacity flex-shrink-0"
90
+ aria-label="Close alert"
91
+ >
92
+ <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
93
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
94
+ </svg>
95
+ </button>
96
+ )}
97
+ </div>
98
+ );
99
+ },
100
+ );
101
+
102
+ Alert.displayName = 'Alert';
@@ -0,0 +1,102 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ variant?: 'success' | 'warning' | 'danger' | 'info';
6
+ title?: string;
7
+ onClose?: () => void;
8
+ closeable?: boolean;
9
+ }
10
+
11
+ const variantStyles = {
12
+ success: {
13
+ container: 'bg-green-50 border-green-200 text-green-800',
14
+ icon: 'text-green-600',
15
+ },
16
+ warning: {
17
+ container: 'bg-yellow-50 border-yellow-200 text-yellow-800',
18
+ icon: 'text-yellow-600',
19
+ },
20
+ danger: {
21
+ container: 'bg-red-50 border-red-200 text-red-800',
22
+ icon: 'text-red-600',
23
+ },
24
+ info: {
25
+ container: 'bg-blue-50 border-blue-200 text-blue-800',
26
+ icon: 'text-blue-600',
27
+ },
28
+ };
29
+
30
+ const icons = {
31
+ success: (
32
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
33
+ <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
34
+ </svg>
35
+ ),
36
+ warning: (
37
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
38
+ <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
39
+ </svg>
40
+ ),
41
+ danger: (
42
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
43
+ <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
44
+ </svg>
45
+ ),
46
+ info: (
47
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
48
+ <path fillRule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clipRule="evenodd" />
49
+ </svg>
50
+ ),
51
+ };
52
+
53
+ export const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
54
+ (
55
+ {
56
+ variant = 'info',
57
+ title,
58
+ onClose,
59
+ closeable = false,
60
+ className,
61
+ children,
62
+ ...props
63
+ },
64
+ ref,
65
+ ) => {
66
+ const styles = variantStyles[variant];
67
+
68
+ return (
69
+ <div
70
+ ref={ref}
71
+ className={cn(
72
+ 'border rounded-lg p-4 flex gap-3',
73
+ styles.container,
74
+ className,
75
+ )}
76
+ role="alert"
77
+ {...props}
78
+ >
79
+ <div className={cn('flex-shrink-0 mt-0.5', styles.icon)}>
80
+ {icons[variant]}
81
+ </div>
82
+ <div className="flex-1">
83
+ {title && <h3 className="font-semibold mb-1">{title}</h3>}
84
+ <div>{children}</div>
85
+ </div>
86
+ {closeable && (
87
+ <button
88
+ onClick={onClose}
89
+ className="ml-auto text-current opacity-70 hover:opacity-100 transition-opacity flex-shrink-0"
90
+ aria-label="Close alert"
91
+ >
92
+ <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
93
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
94
+ </svg>
95
+ </button>
96
+ )}
97
+ </div>
98
+ );
99
+ },
100
+ );
101
+
102
+ Alert.displayName = 'Alert';
@@ -0,0 +1,89 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface AvatarProps extends React.ImgHTMLAttributes<HTMLImageElement> {
5
+ size?: 'sm' | 'md' | 'lg' | 'xl';
6
+ variant?: 'circle' | 'square' | 'rounded';
7
+ initials?: string;
8
+ status?: 'online' | 'offline' | 'away' | 'busy';
9
+ }
10
+
11
+ const sizeStyles = {
12
+ sm: 'w-8 h-8',
13
+ md: 'w-10 h-10',
14
+ lg: 'w-12 h-12',
15
+ xl: 'w-16 h-16',
16
+ };
17
+
18
+ const variantStyles = {
19
+ circle: 'rounded-full',
20
+ square: 'rounded-none',
21
+ rounded: 'rounded-md',
22
+ };
23
+
24
+ const statusColors = {
25
+ online: 'bg-green-500',
26
+ offline: 'bg-gray-400',
27
+ away: 'bg-yellow-500',
28
+ busy: 'bg-red-500',
29
+ };
30
+
31
+ export const Avatar = React.forwardRef<HTMLImageElement, AvatarProps>(
32
+ (
33
+ {
34
+ size = 'md',
35
+ variant = 'circle',
36
+ initials,
37
+ status,
38
+ className,
39
+ src,
40
+ alt = 'Avatar',
41
+ ...props
42
+ },
43
+ ref,
44
+ ) => {
45
+ return (
46
+ <div className="relative inline-block">
47
+ {src ? (
48
+ <img
49
+ ref={ref}
50
+ src={src}
51
+ alt={alt}
52
+ className={cn(
53
+ 'bg-gray-200 object-cover',
54
+ sizeStyles[size],
55
+ variantStyles[variant],
56
+ className,
57
+ )}
58
+ {...props}
59
+ />
60
+ ) : (
61
+ <div
62
+ className={cn(
63
+ 'bg-blue-600 text-white font-semibold flex items-center justify-center',
64
+ sizeStyles[size],
65
+ variantStyles[variant],
66
+ className,
67
+ )}
68
+ >
69
+ {initials || alt.charAt(0).toUpperCase()}
70
+ </div>
71
+ )}
72
+ {status && (
73
+ <div
74
+ className={cn(
75
+ 'absolute bottom-0 right-0 rounded-full border-2 border-white',
76
+ statusColors[status],
77
+ size === 'sm' && 'w-2 h-2',
78
+ size === 'md' && 'w-3 h-3',
79
+ size === 'lg' && 'w-3 h-3',
80
+ size === 'xl' && 'w-4 h-4',
81
+ )}
82
+ />
83
+ )}
84
+ </div>
85
+ );
86
+ },
87
+ );
88
+
89
+ Avatar.displayName = 'Avatar';
@@ -0,0 +1,89 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface AvatarProps extends React.ImgHTMLAttributes<HTMLImageElement> {
5
+ size?: 'sm' | 'md' | 'lg' | 'xl';
6
+ variant?: 'circle' | 'square' | 'rounded';
7
+ initials?: string;
8
+ status?: 'online' | 'offline' | 'away' | 'busy';
9
+ }
10
+
11
+ const sizeStyles = {
12
+ sm: 'w-8 h-8',
13
+ md: 'w-10 h-10',
14
+ lg: 'w-12 h-12',
15
+ xl: 'w-16 h-16',
16
+ };
17
+
18
+ const variantStyles = {
19
+ circle: 'rounded-full',
20
+ square: 'rounded-none',
21
+ rounded: 'rounded-md',
22
+ };
23
+
24
+ const statusColors = {
25
+ online: 'bg-green-500',
26
+ offline: 'bg-gray-400',
27
+ away: 'bg-yellow-500',
28
+ busy: 'bg-red-500',
29
+ };
30
+
31
+ export const Avatar = React.forwardRef<HTMLImageElement, AvatarProps>(
32
+ (
33
+ {
34
+ size = 'md',
35
+ variant = 'circle',
36
+ initials,
37
+ status,
38
+ className,
39
+ src,
40
+ alt = 'Avatar',
41
+ ...props
42
+ },
43
+ ref,
44
+ ) => {
45
+ return (
46
+ <div className="relative inline-block">
47
+ {src ? (
48
+ <img
49
+ ref={ref}
50
+ src={src}
51
+ alt={alt}
52
+ className={cn(
53
+ 'bg-gray-200 object-cover',
54
+ sizeStyles[size],
55
+ variantStyles[variant],
56
+ className,
57
+ )}
58
+ {...props}
59
+ />
60
+ ) : (
61
+ <div
62
+ className={cn(
63
+ 'bg-blue-600 text-white font-semibold flex items-center justify-center',
64
+ sizeStyles[size],
65
+ variantStyles[variant],
66
+ className,
67
+ )}
68
+ >
69
+ {initials || alt.charAt(0).toUpperCase()}
70
+ </div>
71
+ )}
72
+ {status && (
73
+ <div
74
+ className={cn(
75
+ 'absolute bottom-0 right-0 rounded-full border-2 border-white',
76
+ statusColors[status],
77
+ size === 'sm' && 'w-2 h-2',
78
+ size === 'md' && 'w-3 h-3',
79
+ size === 'lg' && 'w-3 h-3',
80
+ size === 'xl' && 'w-4 h-4',
81
+ )}
82
+ />
83
+ )}
84
+ </div>
85
+ );
86
+ },
87
+ );
88
+
89
+ Avatar.displayName = 'Avatar';
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';
6
+ size?: 'sm' | 'md' | 'lg';
7
+ dot?: boolean;
8
+ }
9
+
10
+ const variantStyles = {
11
+ primary: 'bg-blue-100 text-blue-800',
12
+ secondary: 'bg-gray-100 text-gray-800',
13
+ success: 'bg-green-100 text-green-800',
14
+ warning: 'bg-yellow-100 text-yellow-800',
15
+ danger: 'bg-red-100 text-red-800',
16
+ info: 'bg-cyan-100 text-cyan-800',
17
+ };
18
+
19
+ const sizeStyles = {
20
+ sm: 'px-2 py-0.5 text-xs',
21
+ md: 'px-3 py-1 text-sm',
22
+ lg: 'px-4 py-1.5 text-base',
23
+ };
24
+
25
+ export const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(
26
+ (
27
+ {
28
+ variant = 'primary',
29
+ size = 'md',
30
+ dot = false,
31
+ className,
32
+ children,
33
+ ...props
34
+ },
35
+ ref,
36
+ ) => {
37
+ return (
38
+ <span
39
+ ref={ref}
40
+ className={cn(
41
+ 'inline-flex items-center gap-1.5 rounded-full font-medium',
42
+ variantStyles[variant],
43
+ sizeStyles[size],
44
+ className,
45
+ )}
46
+ {...props}
47
+ >
48
+ {dot && (
49
+ <span className="w-1.5 h-1.5 rounded-full bg-current" />
50
+ )}
51
+ {children}
52
+ </span>
53
+ );
54
+ },
55
+ );
56
+
57
+ Badge.displayName = 'Badge';
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';
6
+ size?: 'sm' | 'md' | 'lg';
7
+ dot?: boolean;
8
+ }
9
+
10
+ const variantStyles = {
11
+ primary: 'bg-blue-100 text-blue-800',
12
+ secondary: 'bg-gray-100 text-gray-800',
13
+ success: 'bg-green-100 text-green-800',
14
+ warning: 'bg-yellow-100 text-yellow-800',
15
+ danger: 'bg-red-100 text-red-800',
16
+ info: 'bg-cyan-100 text-cyan-800',
17
+ };
18
+
19
+ const sizeStyles = {
20
+ sm: 'px-2 py-0.5 text-xs',
21
+ md: 'px-3 py-1 text-sm',
22
+ lg: 'px-4 py-1.5 text-base',
23
+ };
24
+
25
+ export const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(
26
+ (
27
+ {
28
+ variant = 'primary',
29
+ size = 'md',
30
+ dot = false,
31
+ className,
32
+ children,
33
+ ...props
34
+ },
35
+ ref,
36
+ ) => {
37
+ return (
38
+ <span
39
+ ref={ref}
40
+ className={cn(
41
+ 'inline-flex items-center gap-1.5 rounded-full font-medium',
42
+ variantStyles[variant],
43
+ sizeStyles[size],
44
+ className,
45
+ )}
46
+ {...props}
47
+ >
48
+ {dot && (
49
+ <span className="w-1.5 h-1.5 rounded-full bg-current" />
50
+ )}
51
+ {children}
52
+ </span>
53
+ );
54
+ },
55
+ );
56
+
57
+ Badge.displayName = 'Badge';
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface BreadcrumbProps extends React.HTMLAttributes<HTMLNavElement> {
5
+ items: Array<{ label: string; href?: string }>;
6
+ separator?: string;
7
+ }
8
+
9
+ export const Breadcrumb = React.forwardRef<HTMLNavElement, BreadcrumbProps>(
10
+ (
11
+ {
12
+ items,
13
+ separator = '/',
14
+ className,
15
+ ...props
16
+ },
17
+ ref,
18
+ ) => {
19
+ return (
20
+ <nav
21
+ ref={ref}
22
+ className={cn('', className)}
23
+ aria-label="Breadcrumb"
24
+ {...props}
25
+ >
26
+ <ol className="flex items-center gap-2">
27
+ {items.map((item, index) => (
28
+ <li key={index} className="flex items-center gap-2">
29
+ {item.href ? (
30
+ <a
31
+ href={item.href}
32
+ className="text-blue-600 hover:text-blue-700 hover:underline"
33
+ >
34
+ {item.label}
35
+ </a>
36
+ ) : (
37
+ <span className="text-gray-700">{item.label}</span>
38
+ )}
39
+ {index < items.length - 1 && (
40
+ <span className="text-gray-400">{separator}</span>
41
+ )}
42
+ </li>
43
+ ))}
44
+ </ol>
45
+ </nav>
46
+ );
47
+ },
48
+ );
49
+
50
+ Breadcrumb.displayName = 'Breadcrumb';
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface BreadcrumbProps extends React.HTMLAttributes<HTMLNavElement> {
5
+ items: Array<{ label: string; href?: string }>;
6
+ separator?: string;
7
+ }
8
+
9
+ export const Breadcrumb = React.forwardRef<HTMLNavElement, BreadcrumbProps>(
10
+ (
11
+ {
12
+ items,
13
+ separator = '/',
14
+ className,
15
+ ...props
16
+ },
17
+ ref,
18
+ ) => {
19
+ return (
20
+ <nav
21
+ ref={ref}
22
+ className={cn('', className)}
23
+ aria-label="Breadcrumb"
24
+ {...props}
25
+ >
26
+ <ol className="flex items-center gap-2">
27
+ {items.map((item, index) => (
28
+ <li key={index} className="flex items-center gap-2">
29
+ {item.href ? (
30
+ <a
31
+ href={item.href}
32
+ className="text-blue-600 hover:text-blue-700 hover:underline"
33
+ >
34
+ {item.label}
35
+ </a>
36
+ ) : (
37
+ <span className="text-gray-700">{item.label}</span>
38
+ )}
39
+ {index < items.length - 1 && (
40
+ <span className="text-gray-400">{separator}</span>
41
+ )}
42
+ </li>
43
+ ))}
44
+ </ol>
45
+ </nav>
46
+ );
47
+ },
48
+ );
49
+
50
+ Breadcrumb.displayName = 'Breadcrumb';
@@ -0,0 +1,77 @@
1
+ import React from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
5
+ variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
6
+ size?: 'sm' | 'md' | 'lg';
7
+ fullWidth?: boolean;
8
+ loading?: boolean;
9
+ icon?: React.ReactNode;
10
+ }
11
+
12
+ const variantStyles = {
13
+ primary: 'bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800',
14
+ secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 active:bg-gray-400',
15
+ danger: 'bg-red-600 text-white hover:bg-red-700 active:bg-red-800',
16
+ ghost: 'bg-transparent text-gray-700 hover:bg-gray-100 active:bg-gray-200 border border-gray-300',
17
+ };
18
+
19
+ const sizeStyles = {
20
+ sm: 'px-3 py-1.5 text-sm rounded-md',
21
+ md: 'px-4 py-2 text-base rounded-md',
22
+ lg: 'px-6 py-3 text-lg rounded-lg',
23
+ };
24
+
25
+ export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
26
+ (
27
+ {
28
+ variant = 'primary',
29
+ size = 'md',
30
+ fullWidth = false,
31
+ loading = false,
32
+ icon,
33
+ disabled,
34
+ className,
35
+ children,
36
+ ...props
37
+ },
38
+ ref,
39
+ ) => {
40
+ return (
41
+ <button
42
+ ref={ref}
43
+ className={cn(
44
+ 'inline-flex items-center justify-center font-medium transition-colors duration-200',
45
+ 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500',
46
+ 'disabled:opacity-50 disabled:cursor-not-allowed',
47
+ variantStyles[variant],
48
+ sizeStyles[size],
49
+ fullWidth && 'w-full',
50
+ className,
51
+ )}
52
+ disabled={disabled || loading}
53
+ {...props}
54
+ >
55
+ {loading && (
56
+ <svg
57
+ className="animate-spin -ml-1 mr-3 h-5 w-5"
58
+ xmlns="http://www.w3.org/2000/svg"
59
+ fill="none"
60
+ viewBox="0 0 24 24"
61
+ >
62
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
63
+ <path
64
+ className="opacity-75"
65
+ fill="currentColor"
66
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
67
+ />
68
+ </svg>
69
+ )}
70
+ {icon && !loading && <span className="mr-2">{icon}</span>}
71
+ {children}
72
+ </button>
73
+ );
74
+ },
75
+ );
76
+
77
+ Button.displayName = 'Button';