@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,353 @@
1
+ import React from 'react';
2
+
3
+ export interface AdvancedComponentProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ children?: React.ReactNode;
5
+ }
6
+
7
+ export const FormBuilder: React.FC<
8
+ AdvancedComponentProps & {
9
+ fields: Array<{
10
+ id: string;
11
+ type: 'text' | 'email' | 'password' | 'number' | 'date' | 'select' | 'checkbox' | 'radio';
12
+ label: string;
13
+ required?: boolean;
14
+ options?: Array<{ label: string; value: string }>;
15
+ }>;
16
+ onSubmit?: (data: Record<string, any>) => void;
17
+ }
18
+ > = ({
19
+ fields,
20
+ onSubmit,
21
+ className = '',
22
+ ...props
23
+ }) => {
24
+ const [formData, setFormData] = React.useState<Record<string, any>>({});
25
+
26
+ const handleChange = (id: string, value: any) => {
27
+ setFormData((prev) => ({ ...prev, [id]: value }));
28
+ };
29
+
30
+ return (
31
+ <form
32
+ onSubmit={(e) => {
33
+ e.preventDefault();
34
+ onSubmit?.(formData);
35
+ }}
36
+ className={`space-y-4 ${className}`}
37
+ {...props}
38
+ >
39
+ {fields.map((field) => (
40
+ <div key={field.id}>
41
+ <label className="block text-sm font-medium mb-1">
42
+ {field.label}
43
+ {field.required && <span className="text-red-600">*</span>}
44
+ </label>
45
+ {field.type === 'select' && (
46
+ <select
47
+ value={formData[field.id] || ''}
48
+ onChange={(e) => handleChange(field.id, e.target.value)}
49
+ className="w-full px-3 py-2 border border-gray-300 rounded-lg"
50
+ >
51
+ <option value="">Select...</option>
52
+ {field.options?.map((opt) => (
53
+ <option key={opt.value} value={opt.value}>
54
+ {opt.label}
55
+ </option>
56
+ ))}
57
+ </select>
58
+ )}
59
+ {field.type === 'checkbox' && (
60
+ <input
61
+ type="checkbox"
62
+ checked={formData[field.id] || false}
63
+ onChange={(e) => handleChange(field.id, e.target.checked)}
64
+ className="w-4 h-4"
65
+ />
66
+ )}
67
+ {field.type !== 'select' && field.type !== 'checkbox' && (
68
+ <input
69
+ type={field.type}
70
+ value={formData[field.id] || ''}
71
+ onChange={(e) => handleChange(field.id, e.target.value)}
72
+ className="w-full px-3 py-2 border border-gray-300 rounded-lg"
73
+ />
74
+ )}
75
+ </div>
76
+ ))}
77
+ <button
78
+ type="submit"
79
+ className="w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700"
80
+ >
81
+ Submit
82
+ </button>
83
+ </form>
84
+ );
85
+ };
86
+
87
+ export const TableBuilder: React.FC<
88
+ AdvancedComponentProps & {
89
+ data: Array<Record<string, any>>;
90
+ columns: Array<{ key: string; label: string }>;
91
+ editable?: boolean;
92
+ }
93
+ > = ({
94
+ data,
95
+ columns,
96
+ editable = false,
97
+ className = '',
98
+ ...props
99
+ }) => {
100
+ const [editingRow, setEditingRow] = React.useState<number | null>(null);
101
+ const [editValues, setEditValues] = React.useState<Record<string, any>>({});
102
+
103
+ return (
104
+ <div className={`overflow-x-auto ${className}`} {...props}>
105
+ <table className="w-full border border-gray-300">
106
+ <thead className="bg-gray-100">
107
+ <tr>
108
+ {columns.map((col) => (
109
+ <th key={col.key} className="px-4 py-2 text-left font-semibold border-b">
110
+ {col.label}
111
+ </th>
112
+ ))}
113
+ {editable && <th className="px-4 py-2 text-left font-semibold border-b">Actions</th>}
114
+ </tr>
115
+ </thead>
116
+ <tbody>
117
+ {data.map((row, idx) => (
118
+ <tr key={idx} className="hover:bg-gray-50 border-b">
119
+ {columns.map((col) => (
120
+ <td key={col.key} className="px-4 py-2">
121
+ {editingRow === idx ? (
122
+ <input
123
+ type="text"
124
+ value={editValues[col.key] || ''}
125
+ onChange={(e) =>
126
+ setEditValues((prev) => ({
127
+ ...prev,
128
+ [col.key]: e.target.value,
129
+ }))
130
+ }
131
+ className="w-full px-2 py-1 border border-gray-300 rounded"
132
+ />
133
+ ) : (
134
+ row[col.key]
135
+ )}
136
+ </td>
137
+ ))}
138
+ {editable && (
139
+ <td className="px-4 py-2 flex gap-2">
140
+ {editingRow === idx ? (
141
+ <>
142
+ <button className="px-2 py-1 bg-green-600 text-white rounded">Save</button>
143
+ <button
144
+ onClick={() => setEditingRow(null)}
145
+ className="px-2 py-1 bg-gray-600 text-white rounded"
146
+ >
147
+ Cancel
148
+ </button>
149
+ </>
150
+ ) : (
151
+ <>
152
+ <button
153
+ onClick={() => {
154
+ setEditingRow(idx);
155
+ setEditValues(row);
156
+ }}
157
+ className="px-2 py-1 bg-blue-600 text-white rounded"
158
+ >
159
+ Edit
160
+ </button>
161
+ <button className="px-2 py-1 bg-red-600 text-white rounded">Delete</button>
162
+ </>
163
+ )}
164
+ </td>
165
+ )}
166
+ </tr>
167
+ ))}
168
+ </tbody>
169
+ </table>
170
+ </div>
171
+ );
172
+ };
173
+
174
+ export const Dashboard: React.FC<
175
+ AdvancedComponentProps & {
176
+ title?: string;
177
+ widgets: Array<{ id: string; title: string; content: React.ReactNode }>;
178
+ columns?: number;
179
+ }
180
+ > = ({
181
+ title,
182
+ widgets,
183
+ columns = 3,
184
+ className = '',
185
+ ...props
186
+ }) => {
187
+ return (
188
+ <div className={className} {...props}>
189
+ {title && <h1 className="text-3xl font-bold mb-8">{title}</h1>}
190
+ <div className={`grid grid-cols-1 md:grid-cols-${columns} gap-6`}>
191
+ {widgets.map((widget) => (
192
+ <div key={widget.id} className="bg-white rounded-lg shadow-md p-6 border border-gray-200">
193
+ <h2 className="text-lg font-semibold mb-4">{widget.title}</h2>
194
+ {widget.content}
195
+ </div>
196
+ ))}
197
+ </div>
198
+ </div>
199
+ );
200
+ };
201
+
202
+ export const Wizard: React.FC<
203
+ AdvancedComponentProps & {
204
+ steps: Array<{ title: string; content: React.ReactNode }>;
205
+ onComplete?: () => void;
206
+ }
207
+ > = ({
208
+ steps,
209
+ onComplete,
210
+ className = '',
211
+ ...props
212
+ }) => {
213
+ const [currentStep, setCurrentStep] = React.useState(0);
214
+
215
+ return (
216
+ <div className={`max-w-2xl mx-auto ${className}`} {...props}>
217
+ <div className="mb-8">
218
+ <div className="flex justify-between mb-4">
219
+ {steps.map((step, idx) => (
220
+ <button
221
+ key={idx}
222
+ onClick={() => setCurrentStep(idx)}
223
+ className={`flex-1 text-center py-2 border-b-4 ${
224
+ idx === currentStep ? 'border-blue-600 text-blue-600' : 'border-gray-300 text-gray-600'
225
+ }`}
226
+ >
227
+ {step.title}
228
+ </button>
229
+ ))}
230
+ </div>
231
+ <div className="bg-white p-6 border border-gray-200 rounded-lg">{steps[currentStep].content}</div>
232
+ </div>
233
+ <div className="flex gap-4 justify-between">
234
+ <button
235
+ onClick={() => setCurrentStep(Math.max(0, currentStep - 1))}
236
+ disabled={currentStep === 0}
237
+ className="px-4 py-2 bg-gray-600 text-white rounded-lg disabled:opacity-50"
238
+ >
239
+ Previous
240
+ </button>
241
+ {currentStep === steps.length - 1 ? (
242
+ <button
243
+ onClick={onComplete}
244
+ className="px-4 py-2 bg-green-600 text-white rounded-lg"
245
+ >
246
+ Complete
247
+ </button>
248
+ ) : (
249
+ <button
250
+ onClick={() => setCurrentStep(Math.min(steps.length - 1, currentStep + 1))}
251
+ className="px-4 py-2 bg-blue-600 text-white rounded-lg"
252
+ >
253
+ Next
254
+ </button>
255
+ )}
256
+ </div>
257
+ </div>
258
+ );
259
+ };
260
+
261
+ export const KanbanBoard: React.FC<
262
+ AdvancedComponentProps & {
263
+ columns: Array<{
264
+ id: string;
265
+ title: string;
266
+ cards: Array<{ id: string; title: string; description?: string }>;
267
+ }>;
268
+ }
269
+ > = ({
270
+ columns,
271
+ className = '',
272
+ ...props
273
+ }) => {
274
+ return (
275
+ <div className={`grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4 overflow-x-auto ${className}`} {...props}>
276
+ {columns.map((col) => (
277
+ <div key={col.id} className="bg-gray-100 rounded-lg p-4 min-w-sm">
278
+ <h3 className="font-semibold mb-4">{col.title}</h3>
279
+ <div className="space-y-2">
280
+ {col.cards.map((card) => (
281
+ <div key={card.id} className="bg-white p-4 rounded-lg shadow-sm border-l-4 border-blue-600">
282
+ <p className="font-medium">{card.title}</p>
283
+ {card.description && <p className="text-sm text-gray-600 mt-1">{card.description}</p>}
284
+ </div>
285
+ ))}
286
+ </div>
287
+ </div>
288
+ ))}
289
+ </div>
290
+ );
291
+ };
292
+
293
+ export const Timeline: React.FC<
294
+ AdvancedComponentProps & {
295
+ items: Array<{
296
+ id: string;
297
+ title: string;
298
+ description?: string;
299
+ timestamp?: string;
300
+ icon?: React.ReactNode;
301
+ }>;
302
+ }
303
+ > = ({
304
+ items,
305
+ className = '',
306
+ ...props
307
+ }) => {
308
+ return (
309
+ <div className={`space-y-6 ${className}`} {...props}>
310
+ {items.map((item, idx) => (
311
+ <div key={item.id} className="flex gap-4">
312
+ <div className="flex flex-col items-center">
313
+ <div className="w-10 h-10 bg-blue-600 text-white rounded-full flex items-center justify-center">
314
+ {item.icon || '●'}
315
+ </div>
316
+ {idx < items.length - 1 && <div className="w-0.5 h-20 bg-gray-300 mt-2"></div>}
317
+ </div>
318
+ <div className="pb-6">
319
+ <h4 className="font-semibold">{item.title}</h4>
320
+ {item.description && <p className="text-gray-600 text-sm mt-1">{item.description}</p>}
321
+ {item.timestamp && <p className="text-gray-500 text-xs mt-2">{item.timestamp}</p>}
322
+ </div>
323
+ </div>
324
+ ))}
325
+ </div>
326
+ );
327
+ };
328
+
329
+ export const OrgChart: React.FC<
330
+ AdvancedComponentProps & {
331
+ root: { name: string; children?: any[] };
332
+ }
333
+ > = ({
334
+ root,
335
+ className = '',
336
+ ...props
337
+ }) => {
338
+ return (
339
+ <div className={`flex flex-col items-center gap-4 ${className}`} {...props}>
340
+ <div className="px-4 py-2 bg-blue-600 text-white rounded-lg font-semibold">{root.name}</div>
341
+ {root.children && root.children.length > 0 && (
342
+ <>
343
+ <div className="w-0.5 h-6 bg-gray-300"></div>
344
+ <div className="flex gap-8">
345
+ {root.children.map((child, idx) => (
346
+ <OrgChart key={idx} root={child} />
347
+ ))}
348
+ </div>
349
+ </>
350
+ )}
351
+ </div>
352
+ );
353
+ };
@@ -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';