@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,80 @@
1
+ import React, { useState } from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ content: React.ReactNode;
6
+ position?: 'top' | 'bottom' | 'left' | 'right';
7
+ delay?: number;
8
+ }
9
+
10
+ const positionStyles = {
11
+ top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',
12
+ bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',
13
+ left: 'right-full top-1/2 -translate-y-1/2 mr-2',
14
+ right: 'left-full top-1/2 -translate-y-1/2 ml-2',
15
+ };
16
+
17
+ const arrowStyles = {
18
+ top: 'top-full left-1/2 -translate-x-1/2 border-t-gray-800',
19
+ bottom: 'bottom-full left-1/2 -translate-x-1/2 border-b-gray-800',
20
+ left: 'left-full top-1/2 -translate-y-1/2 border-l-gray-800',
21
+ right: 'right-full top-1/2 -translate-y-1/2 border-r-gray-800',
22
+ };
23
+
24
+ export const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(
25
+ (
26
+ {
27
+ content,
28
+ position = 'top',
29
+ delay = 200,
30
+ className,
31
+ children,
32
+ ...props
33
+ },
34
+ ref,
35
+ ) => {
36
+ const [isVisible, setIsVisible] = useState(false);
37
+ const timeoutRef = React.useRef<NodeJS.Timeout>();
38
+
39
+ const handleMouseEnter = () => {
40
+ timeoutRef.current = setTimeout(() => {
41
+ setIsVisible(true);
42
+ }, delay);
43
+ };
44
+
45
+ const handleMouseLeave = () => {
46
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
47
+ setIsVisible(false);
48
+ };
49
+
50
+ return (
51
+ <div
52
+ ref={ref}
53
+ className={cn('relative inline-block', className)}
54
+ onMouseEnter={handleMouseEnter}
55
+ onMouseLeave={handleMouseLeave}
56
+ {...props}
57
+ >
58
+ {children}
59
+ {isVisible && (
60
+ <div
61
+ className={cn(
62
+ 'absolute z-50 px-2 py-1 text-sm text-white bg-gray-800 rounded whitespace-nowrap',
63
+ positionStyles[position],
64
+ )}
65
+ >
66
+ {content}
67
+ <div
68
+ className={cn(
69
+ 'absolute w-0 h-0 border-4 border-transparent',
70
+ arrowStyles[position],
71
+ )}
72
+ />
73
+ </div>
74
+ )}
75
+ </div>
76
+ );
77
+ },
78
+ );
79
+
80
+ Tooltip.displayName = 'Tooltip';
@@ -0,0 +1,80 @@
1
+ import React, { useState } from 'react';
2
+ import { cn } from '../utilities/classNames';
3
+
4
+ export interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ content: React.ReactNode;
6
+ position?: 'top' | 'bottom' | 'left' | 'right';
7
+ delay?: number;
8
+ }
9
+
10
+ const positionStyles = {
11
+ top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',
12
+ bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',
13
+ left: 'right-full top-1/2 -translate-y-1/2 mr-2',
14
+ right: 'left-full top-1/2 -translate-y-1/2 ml-2',
15
+ };
16
+
17
+ const arrowStyles = {
18
+ top: 'top-full left-1/2 -translate-x-1/2 border-t-gray-800',
19
+ bottom: 'bottom-full left-1/2 -translate-x-1/2 border-b-gray-800',
20
+ left: 'left-full top-1/2 -translate-y-1/2 border-l-gray-800',
21
+ right: 'right-full top-1/2 -translate-y-1/2 border-r-gray-800',
22
+ };
23
+
24
+ export const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(
25
+ (
26
+ {
27
+ content,
28
+ position = 'top',
29
+ delay = 200,
30
+ className,
31
+ children,
32
+ ...props
33
+ },
34
+ ref,
35
+ ) => {
36
+ const [isVisible, setIsVisible] = useState(false);
37
+ const timeoutRef = React.useRef<NodeJS.Timeout>();
38
+
39
+ const handleMouseEnter = () => {
40
+ timeoutRef.current = setTimeout(() => {
41
+ setIsVisible(true);
42
+ }, delay);
43
+ };
44
+
45
+ const handleMouseLeave = () => {
46
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
47
+ setIsVisible(false);
48
+ };
49
+
50
+ return (
51
+ <div
52
+ ref={ref}
53
+ className={cn('relative inline-block', className)}
54
+ onMouseEnter={handleMouseEnter}
55
+ onMouseLeave={handleMouseLeave}
56
+ {...props}
57
+ >
58
+ {children}
59
+ {isVisible && (
60
+ <div
61
+ className={cn(
62
+ 'absolute z-50 px-2 py-1 text-sm text-white bg-gray-800 rounded whitespace-nowrap',
63
+ positionStyles[position],
64
+ )}
65
+ >
66
+ {content}
67
+ <div
68
+ className={cn(
69
+ 'absolute w-0 h-0 border-4 border-transparent',
70
+ arrowStyles[position],
71
+ )}
72
+ />
73
+ </div>
74
+ )}
75
+ </div>
76
+ );
77
+ },
78
+ );
79
+
80
+ Tooltip.displayName = 'Tooltip';
@@ -0,0 +1,265 @@
1
+ import React from 'react';
2
+
3
+ export interface TypographyProps extends React.HTMLAttributes<HTMLElement> {
4
+ children?: React.ReactNode;
5
+ variant?: 'normal' | 'bold' | 'light' | 'italic' | 'truncated' | 'clamped';
6
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
7
+ color?: 'default' | 'muted' | 'primary' | 'success' | 'warning' | 'error';
8
+ align?: 'left' | 'center' | 'right' | 'justify';
9
+ }
10
+
11
+ const sizeClass = {
12
+ xs: 'text-xs',
13
+ sm: 'text-sm',
14
+ md: 'text-base',
15
+ lg: 'text-lg',
16
+ xl: 'text-xl',
17
+ '2xl': 'text-2xl',
18
+ '3xl': 'text-3xl',
19
+ };
20
+
21
+ const variantClass = {
22
+ normal: 'font-normal',
23
+ bold: 'font-bold',
24
+ light: 'font-light',
25
+ italic: 'italic',
26
+ truncated: 'truncate',
27
+ clamped: 'line-clamp-3',
28
+ };
29
+
30
+ const colorClass = {
31
+ default: 'text-gray-900',
32
+ muted: 'text-gray-500',
33
+ primary: 'text-blue-600',
34
+ success: 'text-green-600',
35
+ warning: 'text-yellow-600',
36
+ error: 'text-red-600',
37
+ };
38
+
39
+ const alignClass = {
40
+ left: 'text-left',
41
+ center: 'text-center',
42
+ right: 'text-right',
43
+ justify: 'text-justify',
44
+ };
45
+
46
+ export const Heading: React.FC<
47
+ TypographyProps & {
48
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
49
+ }
50
+ > = ({
51
+ level = 1,
52
+ size,
53
+ variant = 'bold',
54
+ color = 'default',
55
+ align = 'left',
56
+ className = '',
57
+ children,
58
+ ...props
59
+ }) => {
60
+ const defaultSize = {
61
+ 1: '3xl',
62
+ 2: '2xl',
63
+ 3: 'xl',
64
+ 4: 'lg',
65
+ 5: 'md',
66
+ 6: 'sm',
67
+ }[level] as any;
68
+
69
+ const Tag = `h${level}` as any;
70
+
71
+ return (
72
+ <Tag
73
+ className={`${sizeClass[size || defaultSize]} ${variantClass[variant]} ${colorClass[color]} ${alignClass[align]} leading-tight ${className}`}
74
+ {...props}
75
+ >
76
+ {children}
77
+ </Tag>
78
+ );
79
+ };
80
+
81
+ export const Paragraph: React.FC<TypographyProps> = ({
82
+ size = 'md',
83
+ variant = 'normal',
84
+ color = 'default',
85
+ align = 'left',
86
+ className = '',
87
+ children,
88
+ ...props
89
+ }) => {
90
+ return (
91
+ <p
92
+ className={`${sizeClass[size]} ${variantClass[variant]} ${colorClass[color]} ${alignClass[align]} leading-relaxed ${className}`}
93
+ {...props}
94
+ >
95
+ {children}
96
+ </p>
97
+ );
98
+ };
99
+
100
+ export const Quote: React.FC<TypographyProps> = ({
101
+ size = 'lg',
102
+ variant = 'italic',
103
+ color = 'muted',
104
+ className = '',
105
+ children,
106
+ ...props
107
+ }) => {
108
+ return (
109
+ <blockquote
110
+ className={`${sizeClass[size]} ${variantClass[variant]} ${colorClass[color]} border-l-4 border-blue-600 pl-4 py-2 ${className}`}
111
+ {...props}
112
+ >
113
+ {children}
114
+ </blockquote>
115
+ );
116
+ };
117
+
118
+ export const Code: React.FC<
119
+ TypographyProps & {
120
+ inline?: boolean;
121
+ }
122
+ > = ({
123
+ size = 'sm',
124
+ color = 'error',
125
+ inline = true,
126
+ className = '',
127
+ children,
128
+ ...props
129
+ }) => {
130
+ if (inline) {
131
+ return (
132
+ <code
133
+ className={`${sizeClass[size]} ${colorClass[color]} bg-gray-100 px-1.5 py-0.5 rounded font-mono ${className}`}
134
+ {...props}
135
+ >
136
+ {children}
137
+ </code>
138
+ );
139
+ }
140
+
141
+ return (
142
+ <pre
143
+ className={`${sizeClass[size]} ${colorClass[color]} bg-gray-900 text-gray-100 p-4 rounded-lg overflow-auto font-mono ${className}`}
144
+ {...props}
145
+ >
146
+ <code>{children}</code>
147
+ </pre>
148
+ );
149
+ };
150
+
151
+ export const Label: React.FC<
152
+ TypographyProps & {
153
+ required?: boolean;
154
+ }
155
+ > = ({
156
+ size = 'sm',
157
+ variant = 'bold',
158
+ required = false,
159
+ className = '',
160
+ children,
161
+ ...props
162
+ }) => {
163
+ return (
164
+ <label className={`${sizeClass[size]} ${variantClass[variant]} text-gray-700 block ${className}`} {...props}>
165
+ {children}
166
+ {required && <span className="text-red-600 ml-1">*</span>}
167
+ </label>
168
+ );
169
+ };
170
+
171
+ export const Caption: React.FC<TypographyProps> = ({
172
+ size = 'xs',
173
+ color = 'muted',
174
+ className = '',
175
+ children,
176
+ ...props
177
+ }) => {
178
+ return (
179
+ <small className={`${sizeClass[size]} ${colorClass[color]} block ${className}`} {...props}>
180
+ {children}
181
+ </small>
182
+ );
183
+ };
184
+
185
+ export const Badge: React.FC<
186
+ TypographyProps & {
187
+ variant?: 'solid' | 'outline' | 'soft';
188
+ colorScheme?: 'blue' | 'green' | 'red' | 'yellow' | 'purple' | 'gray';
189
+ }
190
+ > = ({
191
+ size = 'sm',
192
+ variant = 'solid',
193
+ colorScheme = 'blue',
194
+ className = '',
195
+ children,
196
+ ...props
197
+ }) => {
198
+ const variantStyles = {
199
+ solid: {
200
+ blue: 'bg-blue-600 text-white',
201
+ green: 'bg-green-600 text-white',
202
+ red: 'bg-red-600 text-white',
203
+ yellow: 'bg-yellow-600 text-white',
204
+ purple: 'bg-purple-600 text-white',
205
+ gray: 'bg-gray-600 text-white',
206
+ },
207
+ outline: {
208
+ blue: 'border border-blue-600 text-blue-600',
209
+ green: 'border border-green-600 text-green-600',
210
+ red: 'border border-red-600 text-red-600',
211
+ yellow: 'border border-yellow-600 text-yellow-600',
212
+ purple: 'border border-purple-600 text-purple-600',
213
+ gray: 'border border-gray-600 text-gray-600',
214
+ },
215
+ soft: {
216
+ blue: 'bg-blue-100 text-blue-700',
217
+ green: 'bg-green-100 text-green-700',
218
+ red: 'bg-red-100 text-red-700',
219
+ yellow: 'bg-yellow-100 text-yellow-700',
220
+ purple: 'bg-purple-100 text-purple-700',
221
+ gray: 'bg-gray-100 text-gray-700',
222
+ },
223
+ };
224
+
225
+ return (
226
+ <span
227
+ className={`${sizeClass[size]} ${variantStyles[variant][colorScheme]} px-2.5 py-0.5 rounded-full font-medium inline-block ${className}`}
228
+ {...props}
229
+ >
230
+ {children}
231
+ </span>
232
+ );
233
+ };
234
+
235
+ export const Text: React.FC<TypographyProps> = ({
236
+ size = 'md',
237
+ variant = 'normal',
238
+ color = 'default',
239
+ align = 'left',
240
+ className = '',
241
+ children,
242
+ ...props
243
+ }) => {
244
+ return (
245
+ <span
246
+ className={`${sizeClass[size]} ${variantClass[variant]} ${colorClass[color]} ${alignClass[align]} ${className}`}
247
+ {...props}
248
+ >
249
+ {children}
250
+ </span>
251
+ );
252
+ };
253
+
254
+ export const Truncated: React.FC<TypographyProps & { lines?: number }> = ({
255
+ lines = 1,
256
+ className = '',
257
+ children,
258
+ ...props
259
+ }) => {
260
+ return (
261
+ <p className={`line-clamp-${lines} ${className}`} {...props}>
262
+ {children}
263
+ </p>
264
+ );
265
+ };
@@ -0,0 +1,265 @@
1
+ import React from 'react';
2
+
3
+ export interface TypographyProps extends React.HTMLAttributes<HTMLElement> {
4
+ children?: React.ReactNode;
5
+ variant?: 'normal' | 'bold' | 'light' | 'italic' | 'truncated' | 'clamped';
6
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
7
+ color?: 'default' | 'muted' | 'primary' | 'success' | 'warning' | 'error';
8
+ align?: 'left' | 'center' | 'right' | 'justify';
9
+ }
10
+
11
+ const sizeClass = {
12
+ xs: 'text-xs',
13
+ sm: 'text-sm',
14
+ md: 'text-base',
15
+ lg: 'text-lg',
16
+ xl: 'text-xl',
17
+ '2xl': 'text-2xl',
18
+ '3xl': 'text-3xl',
19
+ };
20
+
21
+ const variantClass = {
22
+ normal: 'font-normal',
23
+ bold: 'font-bold',
24
+ light: 'font-light',
25
+ italic: 'italic',
26
+ truncated: 'truncate',
27
+ clamped: 'line-clamp-3',
28
+ };
29
+
30
+ const colorClass = {
31
+ default: 'text-gray-900',
32
+ muted: 'text-gray-500',
33
+ primary: 'text-blue-600',
34
+ success: 'text-green-600',
35
+ warning: 'text-yellow-600',
36
+ error: 'text-red-600',
37
+ };
38
+
39
+ const alignClass = {
40
+ left: 'text-left',
41
+ center: 'text-center',
42
+ right: 'text-right',
43
+ justify: 'text-justify',
44
+ };
45
+
46
+ export const Heading: React.FC<
47
+ TypographyProps & {
48
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
49
+ }
50
+ > = ({
51
+ level = 1,
52
+ size,
53
+ variant = 'bold',
54
+ color = 'default',
55
+ align = 'left',
56
+ className = '',
57
+ children,
58
+ ...props
59
+ }) => {
60
+ const defaultSize = {
61
+ 1: '3xl',
62
+ 2: '2xl',
63
+ 3: 'xl',
64
+ 4: 'lg',
65
+ 5: 'md',
66
+ 6: 'sm',
67
+ }[level] as any;
68
+
69
+ const Tag = `h${level}` as any;
70
+
71
+ return (
72
+ <Tag
73
+ className={`${sizeClass[size || defaultSize]} ${variantClass[variant]} ${colorClass[color]} ${alignClass[align]} leading-tight ${className}`}
74
+ {...props}
75
+ >
76
+ {children}
77
+ </Tag>
78
+ );
79
+ };
80
+
81
+ export const Paragraph: React.FC<TypographyProps> = ({
82
+ size = 'md',
83
+ variant = 'normal',
84
+ color = 'default',
85
+ align = 'left',
86
+ className = '',
87
+ children,
88
+ ...props
89
+ }) => {
90
+ return (
91
+ <p
92
+ className={`${sizeClass[size]} ${variantClass[variant]} ${colorClass[color]} ${alignClass[align]} leading-relaxed ${className}`}
93
+ {...props}
94
+ >
95
+ {children}
96
+ </p>
97
+ );
98
+ };
99
+
100
+ export const Quote: React.FC<TypographyProps> = ({
101
+ size = 'lg',
102
+ variant = 'italic',
103
+ color = 'muted',
104
+ className = '',
105
+ children,
106
+ ...props
107
+ }) => {
108
+ return (
109
+ <blockquote
110
+ className={`${sizeClass[size]} ${variantClass[variant]} ${colorClass[color]} border-l-4 border-blue-600 pl-4 py-2 ${className}`}
111
+ {...props}
112
+ >
113
+ {children}
114
+ </blockquote>
115
+ );
116
+ };
117
+
118
+ export const Code: React.FC<
119
+ TypographyProps & {
120
+ inline?: boolean;
121
+ }
122
+ > = ({
123
+ size = 'sm',
124
+ color = 'error',
125
+ inline = true,
126
+ className = '',
127
+ children,
128
+ ...props
129
+ }) => {
130
+ if (inline) {
131
+ return (
132
+ <code
133
+ className={`${sizeClass[size]} ${colorClass[color]} bg-gray-100 px-1.5 py-0.5 rounded font-mono ${className}`}
134
+ {...props}
135
+ >
136
+ {children}
137
+ </code>
138
+ );
139
+ }
140
+
141
+ return (
142
+ <pre
143
+ className={`${sizeClass[size]} ${colorClass[color]} bg-gray-900 text-gray-100 p-4 rounded-lg overflow-auto font-mono ${className}`}
144
+ {...props}
145
+ >
146
+ <code>{children}</code>
147
+ </pre>
148
+ );
149
+ };
150
+
151
+ export const Label: React.FC<
152
+ TypographyProps & {
153
+ required?: boolean;
154
+ }
155
+ > = ({
156
+ size = 'sm',
157
+ variant = 'bold',
158
+ required = false,
159
+ className = '',
160
+ children,
161
+ ...props
162
+ }) => {
163
+ return (
164
+ <label className={`${sizeClass[size]} ${variantClass[variant]} text-gray-700 block ${className}`} {...props}>
165
+ {children}
166
+ {required && <span className="text-red-600 ml-1">*</span>}
167
+ </label>
168
+ );
169
+ };
170
+
171
+ export const Caption: React.FC<TypographyProps> = ({
172
+ size = 'xs',
173
+ color = 'muted',
174
+ className = '',
175
+ children,
176
+ ...props
177
+ }) => {
178
+ return (
179
+ <small className={`${sizeClass[size]} ${colorClass[color]} block ${className}`} {...props}>
180
+ {children}
181
+ </small>
182
+ );
183
+ };
184
+
185
+ export const Badge: React.FC<
186
+ TypographyProps & {
187
+ variant?: 'solid' | 'outline' | 'soft';
188
+ colorScheme?: 'blue' | 'green' | 'red' | 'yellow' | 'purple' | 'gray';
189
+ }
190
+ > = ({
191
+ size = 'sm',
192
+ variant = 'solid',
193
+ colorScheme = 'blue',
194
+ className = '',
195
+ children,
196
+ ...props
197
+ }) => {
198
+ const variantStyles = {
199
+ solid: {
200
+ blue: 'bg-blue-600 text-white',
201
+ green: 'bg-green-600 text-white',
202
+ red: 'bg-red-600 text-white',
203
+ yellow: 'bg-yellow-600 text-white',
204
+ purple: 'bg-purple-600 text-white',
205
+ gray: 'bg-gray-600 text-white',
206
+ },
207
+ outline: {
208
+ blue: 'border border-blue-600 text-blue-600',
209
+ green: 'border border-green-600 text-green-600',
210
+ red: 'border border-red-600 text-red-600',
211
+ yellow: 'border border-yellow-600 text-yellow-600',
212
+ purple: 'border border-purple-600 text-purple-600',
213
+ gray: 'border border-gray-600 text-gray-600',
214
+ },
215
+ soft: {
216
+ blue: 'bg-blue-100 text-blue-700',
217
+ green: 'bg-green-100 text-green-700',
218
+ red: 'bg-red-100 text-red-700',
219
+ yellow: 'bg-yellow-100 text-yellow-700',
220
+ purple: 'bg-purple-100 text-purple-700',
221
+ gray: 'bg-gray-100 text-gray-700',
222
+ },
223
+ };
224
+
225
+ return (
226
+ <span
227
+ className={`${sizeClass[size]} ${variantStyles[variant][colorScheme]} px-2.5 py-0.5 rounded-full font-medium inline-block ${className}`}
228
+ {...props}
229
+ >
230
+ {children}
231
+ </span>
232
+ );
233
+ };
234
+
235
+ export const Text: React.FC<TypographyProps> = ({
236
+ size = 'md',
237
+ variant = 'normal',
238
+ color = 'default',
239
+ align = 'left',
240
+ className = '',
241
+ children,
242
+ ...props
243
+ }) => {
244
+ return (
245
+ <span
246
+ className={`${sizeClass[size]} ${variantClass[variant]} ${colorClass[color]} ${alignClass[align]} ${className}`}
247
+ {...props}
248
+ >
249
+ {children}
250
+ </span>
251
+ );
252
+ };
253
+
254
+ export const Truncated: React.FC<TypographyProps & { lines?: number }> = ({
255
+ lines = 1,
256
+ className = '',
257
+ children,
258
+ ...props
259
+ }) => {
260
+ return (
261
+ <p className={`line-clamp-${lines} ${className}`} {...props}>
262
+ {children}
263
+ </p>
264
+ );
265
+ };