@hua-labs/ui 1.0.0 → 1.1.0-alpha.0.2

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 (348) hide show
  1. package/README.md +897 -210
  2. package/dist/ComponentLayout-BxCenSAm.d.mts +73 -0
  3. package/dist/advanced/dashboard.d.ts +7 -0
  4. package/dist/advanced/dashboard.d.ts.map +1 -0
  5. package/dist/advanced/motion.d.ts +2 -0
  6. package/dist/advanced/motion.d.ts.map +1 -0
  7. package/dist/advanced-dashboard.d.mts +4 -0
  8. package/dist/advanced-dashboard.js +2 -0
  9. package/dist/advanced-dashboard.js.map +1 -0
  10. package/dist/advanced-dashboard.mjs +2 -0
  11. package/dist/advanced-dashboard.mjs.map +1 -0
  12. package/dist/advanced-motion.d.mts +93 -0
  13. package/dist/advanced-motion.js +2 -0
  14. package/dist/advanced-motion.js.map +1 -0
  15. package/dist/advanced-motion.mjs +2 -0
  16. package/dist/advanced-motion.mjs.map +1 -0
  17. package/dist/advanced.d.mts +734 -0
  18. package/dist/advanced.d.ts +17 -0
  19. package/dist/advanced.d.ts.map +1 -0
  20. package/dist/advanced.js +2 -0
  21. package/dist/advanced.js.map +1 -0
  22. package/dist/advanced.mjs +2 -0
  23. package/dist/advanced.mjs.map +1 -0
  24. package/dist/chunk-627HOIRV.mjs +2 -0
  25. package/dist/chunk-627HOIRV.mjs.map +1 -0
  26. package/dist/chunk-ACEKLG37.mjs +2 -0
  27. package/dist/chunk-ACEKLG37.mjs.map +1 -0
  28. package/dist/chunk-E5PN4LUS.mjs +2 -0
  29. package/dist/chunk-E5PN4LUS.mjs.map +1 -0
  30. package/dist/chunk-KHEJZ3U4.mjs +2 -0
  31. package/dist/chunk-KHEJZ3U4.mjs.map +1 -0
  32. package/dist/chunk-MXGXBG63.mjs +2 -0
  33. package/dist/chunk-MXGXBG63.mjs.map +1 -0
  34. package/dist/chunk-R5KCFRYV.mjs +2 -0
  35. package/dist/chunk-R5KCFRYV.mjs.map +1 -0
  36. package/dist/chunk-UGSYQDR4.mjs +2 -0
  37. package/dist/chunk-UGSYQDR4.mjs.map +1 -0
  38. package/dist/chunk-UUHAXGMO.mjs +2 -0
  39. package/dist/chunk-UUHAXGMO.mjs.map +1 -0
  40. package/dist/chunk-VU264VFN.mjs +2 -0
  41. package/dist/chunk-VU264VFN.mjs.map +1 -0
  42. package/dist/chunk-ZFS4B5QT.mjs +2 -0
  43. package/dist/chunk-ZFS4B5QT.mjs.map +1 -0
  44. package/dist/components/Accordion.d.ts +109 -1
  45. package/dist/components/Accordion.d.ts.map +1 -1
  46. package/dist/components/Action.d.ts +68 -0
  47. package/dist/components/Action.d.ts.map +1 -0
  48. package/dist/components/ActionToolbar.d.ts +65 -0
  49. package/dist/components/ActionToolbar.d.ts.map +1 -0
  50. package/dist/components/Alert.d.ts +49 -0
  51. package/dist/components/Alert.d.ts.map +1 -1
  52. package/dist/components/Autocomplete.d.ts +88 -0
  53. package/dist/components/Autocomplete.d.ts.map +1 -0
  54. package/dist/components/Avatar.d.ts +71 -1
  55. package/dist/components/Avatar.d.ts.map +1 -1
  56. package/dist/components/Badge.d.ts +32 -2
  57. package/dist/components/Badge.d.ts.map +1 -1
  58. package/dist/components/Bookmark.d.ts +49 -0
  59. package/dist/components/Bookmark.d.ts.map +1 -0
  60. package/dist/components/BottomSheet.d.ts +91 -1
  61. package/dist/components/BottomSheet.d.ts.map +1 -1
  62. package/dist/components/Breadcrumb.d.ts +73 -14
  63. package/dist/components/Breadcrumb.d.ts.map +1 -1
  64. package/dist/components/Button.d.ts +82 -7
  65. package/dist/components/Button.d.ts.map +1 -1
  66. package/dist/components/Card.d.ts +122 -5
  67. package/dist/components/Card.d.ts.map +1 -1
  68. package/dist/components/ChatMessage.d.ts +67 -1
  69. package/dist/components/ChatMessage.d.ts.map +1 -1
  70. package/dist/components/Checkbox.d.ts +48 -2
  71. package/dist/components/Checkbox.d.ts.map +1 -1
  72. package/dist/components/Command.d.ts +82 -1
  73. package/dist/components/Command.d.ts.map +1 -1
  74. package/dist/components/ComponentLayout.d.ts +72 -0
  75. package/dist/components/ComponentLayout.d.ts.map +1 -0
  76. package/dist/components/ConfirmModal.d.ts +66 -1
  77. package/dist/components/ConfirmModal.d.ts.map +1 -1
  78. package/dist/components/Container.d.ts +39 -0
  79. package/dist/components/Container.d.ts.map +1 -1
  80. package/dist/components/ContextMenu.d.ts +51 -1
  81. package/dist/components/ContextMenu.d.ts.map +1 -1
  82. package/dist/components/DatePicker.d.ts +62 -0
  83. package/dist/components/DatePicker.d.ts.map +1 -0
  84. package/dist/components/Divider.d.ts +13 -3
  85. package/dist/components/Divider.d.ts.map +1 -1
  86. package/dist/components/Drawer.d.ts +103 -1
  87. package/dist/components/Drawer.d.ts.map +1 -1
  88. package/dist/components/Dropdown.d.ts +51 -1
  89. package/dist/components/Dropdown.d.ts.map +1 -1
  90. package/dist/components/EmotionAnalysis.d.ts +59 -1
  91. package/dist/components/EmotionAnalysis.d.ts.map +1 -1
  92. package/dist/components/EmotionButton.d.ts +35 -1
  93. package/dist/components/EmotionButton.d.ts.map +1 -1
  94. package/dist/components/EmotionMeter.d.ts +38 -2
  95. package/dist/components/EmotionMeter.d.ts.map +1 -1
  96. package/dist/components/EmotionSelector.d.ts +51 -1
  97. package/dist/components/EmotionSelector.d.ts.map +1 -1
  98. package/dist/components/FeatureCard.d.ts +61 -0
  99. package/dist/components/FeatureCard.d.ts.map +1 -0
  100. package/dist/components/Form.d.ts +114 -0
  101. package/dist/components/Form.d.ts.map +1 -0
  102. package/dist/components/Grid.d.ts +42 -1
  103. package/dist/components/Grid.d.ts.map +1 -1
  104. package/dist/components/HeroSection.d.ts +77 -0
  105. package/dist/components/HeroSection.d.ts.map +1 -0
  106. package/dist/components/Icon/Icon.d.ts +159 -0
  107. package/dist/components/Icon/Icon.d.ts.map +1 -0
  108. package/dist/components/Icon/IconProvider.d.ts +94 -0
  109. package/dist/components/Icon/IconProvider.d.ts.map +1 -0
  110. package/dist/components/Icon/icon-store.d.ts +21 -0
  111. package/dist/components/Icon/icon-store.d.ts.map +1 -0
  112. package/dist/components/Icon/index.d.ts +10 -0
  113. package/dist/components/Icon/index.d.ts.map +1 -0
  114. package/dist/components/InfoCard.d.ts +48 -0
  115. package/dist/components/InfoCard.d.ts.map +1 -0
  116. package/dist/components/Input.d.ts +40 -8
  117. package/dist/components/Input.d.ts.map +1 -1
  118. package/dist/components/Label.d.ts +50 -0
  119. package/dist/components/Label.d.ts.map +1 -0
  120. package/dist/components/LanguageToggle.d.ts +41 -1
  121. package/dist/components/LanguageToggle.d.ts.map +1 -1
  122. package/dist/components/Link.d.ts +52 -0
  123. package/dist/components/Link.d.ts.map +1 -0
  124. package/dist/components/LoadingSpinner.d.ts +44 -5
  125. package/dist/components/LoadingSpinner.d.ts.map +1 -1
  126. package/dist/components/Menu.d.ts +92 -1
  127. package/dist/components/Menu.d.ts.map +1 -1
  128. package/dist/components/Modal.d.ts +67 -5
  129. package/dist/components/Modal.d.ts.map +1 -1
  130. package/dist/components/Navigation.d.ts +72 -0
  131. package/dist/components/Navigation.d.ts.map +1 -0
  132. package/dist/components/PageNavigation.d.ts +48 -0
  133. package/dist/components/PageNavigation.d.ts.map +1 -0
  134. package/dist/components/PageTransition.d.ts +44 -1
  135. package/dist/components/PageTransition.d.ts.map +1 -1
  136. package/dist/components/Pagination.d.ts +52 -1
  137. package/dist/components/Pagination.d.ts.map +1 -1
  138. package/dist/components/Panel.d.ts +99 -0
  139. package/dist/components/Panel.d.ts.map +1 -0
  140. package/dist/components/Popover.d.ts +46 -1
  141. package/dist/components/Popover.d.ts.map +1 -1
  142. package/dist/components/Progress.d.ts +52 -3
  143. package/dist/components/Progress.d.ts.map +1 -1
  144. package/dist/components/Radio.d.ts +44 -2
  145. package/dist/components/Radio.d.ts.map +1 -1
  146. package/dist/components/ScrollArea.d.ts +53 -1
  147. package/dist/components/ScrollArea.d.ts.map +1 -1
  148. package/dist/components/ScrollIndicator.d.ts +43 -1
  149. package/dist/components/ScrollIndicator.d.ts.map +1 -1
  150. package/dist/components/ScrollProgress.d.ts +37 -0
  151. package/dist/components/ScrollProgress.d.ts.map +1 -1
  152. package/dist/components/ScrollToTop.d.ts +48 -11
  153. package/dist/components/ScrollToTop.d.ts.map +1 -1
  154. package/dist/components/SectionHeader.d.ts +42 -0
  155. package/dist/components/SectionHeader.d.ts.map +1 -0
  156. package/dist/components/Select.d.ts +59 -2
  157. package/dist/components/Select.d.ts.map +1 -1
  158. package/dist/components/Skeleton.d.ts +44 -1
  159. package/dist/components/Skeleton.d.ts.map +1 -1
  160. package/dist/components/Slider.d.ts +75 -0
  161. package/dist/components/Slider.d.ts.map +1 -0
  162. package/dist/components/Stack.d.ts +42 -1
  163. package/dist/components/Stack.d.ts.map +1 -1
  164. package/dist/components/StatsPanel.d.ts +72 -0
  165. package/dist/components/StatsPanel.d.ts.map +1 -0
  166. package/dist/components/Switch.d.ts +48 -2
  167. package/dist/components/Switch.d.ts.map +1 -1
  168. package/dist/components/Table.d.ts +206 -0
  169. package/dist/components/Table.d.ts.map +1 -0
  170. package/dist/components/Tabs.d.ts +123 -10
  171. package/dist/components/Tabs.d.ts.map +1 -1
  172. package/dist/components/Textarea.d.ts +48 -2
  173. package/dist/components/Textarea.d.ts.map +1 -1
  174. package/dist/components/ThemeProvider.d.ts +67 -2
  175. package/dist/components/ThemeProvider.d.ts.map +1 -1
  176. package/dist/components/ThemeToggle.d.ts +44 -0
  177. package/dist/components/ThemeToggle.d.ts.map +1 -1
  178. package/dist/components/Toast.d.ts +75 -1
  179. package/dist/components/Toast.d.ts.map +1 -1
  180. package/dist/components/Toggle.d.ts +62 -0
  181. package/dist/components/Toggle.d.ts.map +1 -0
  182. package/dist/components/Tooltip.d.ts +48 -1
  183. package/dist/components/Tooltip.d.ts.map +1 -1
  184. package/dist/components/Upload.d.ts +87 -0
  185. package/dist/components/Upload.d.ts.map +1 -0
  186. package/dist/components/advanced/AdvancedPageTransition.d.ts +25 -0
  187. package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -0
  188. package/dist/components/advanced/index.d.ts +4 -0
  189. package/dist/components/advanced/index.d.ts.map +1 -0
  190. package/dist/components/advanced/usePageTransition.d.ts +33 -0
  191. package/dist/components/advanced/usePageTransition.d.ts.map +1 -0
  192. package/dist/components/advanced/usePageTransitionManager.d.ts +44 -0
  193. package/dist/components/advanced/usePageTransitionManager.d.ts.map +1 -0
  194. package/dist/components/dashboard/ActivityFeed.d.ts +87 -0
  195. package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -0
  196. package/dist/components/dashboard/BarChart.d.ts +82 -0
  197. package/dist/components/dashboard/BarChart.d.ts.map +1 -0
  198. package/dist/components/dashboard/DashboardGrid.d.ts +44 -0
  199. package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -0
  200. package/dist/components/dashboard/DashboardSidebar.d.ts +105 -0
  201. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
  202. package/dist/components/dashboard/DashboardToolbar.d.ts +120 -0
  203. package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -0
  204. package/dist/components/dashboard/EmptyState.d.ts +61 -0
  205. package/dist/components/dashboard/EmptyState.d.ts.map +1 -0
  206. package/dist/components/dashboard/MembershipBadge.d.ts +45 -0
  207. package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -0
  208. package/dist/components/dashboard/MerchantList.d.ts +98 -0
  209. package/dist/components/dashboard/MerchantList.d.ts.map +1 -0
  210. package/dist/components/dashboard/MetricCard.d.ts +75 -0
  211. package/dist/components/dashboard/MetricCard.d.ts.map +1 -0
  212. package/dist/components/dashboard/MiniBarChart.d.ts +60 -0
  213. package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -0
  214. package/dist/components/dashboard/NotificationCard.d.ts +89 -0
  215. package/dist/components/dashboard/NotificationCard.d.ts.map +1 -0
  216. package/dist/components/dashboard/ProfileCard.d.ts +82 -0
  217. package/dist/components/dashboard/ProfileCard.d.ts.map +1 -0
  218. package/dist/components/dashboard/ProgressCard.d.ts +71 -0
  219. package/dist/components/dashboard/ProgressCard.d.ts.map +1 -0
  220. package/dist/components/dashboard/QuickActionCard.d.ts +63 -0
  221. package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -0
  222. package/dist/components/dashboard/RoutingBreakdownCard.d.ts +88 -0
  223. package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -0
  224. package/dist/components/dashboard/SettlementTimeline.d.ts +90 -0
  225. package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -0
  226. package/dist/components/dashboard/StatCard.d.ts +70 -0
  227. package/dist/components/dashboard/StatCard.d.ts.map +1 -0
  228. package/dist/components/dashboard/SummaryCard.d.ts +73 -0
  229. package/dist/components/dashboard/SummaryCard.d.ts.map +1 -0
  230. package/dist/components/dashboard/TransactionDetailDrawer.d.ts +183 -0
  231. package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -0
  232. package/dist/components/dashboard/TransactionsTable.d.ts +137 -0
  233. package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -0
  234. package/dist/components/dashboard/TrendChart.d.ts +75 -0
  235. package/dist/components/dashboard/TrendChart.d.ts.map +1 -0
  236. package/dist/components/dashboard/index.d.ts +41 -0
  237. package/dist/components/dashboard/index.d.ts.map +1 -0
  238. package/dist/components/scrollbar/scrollbar.d.ts +12 -0
  239. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -0
  240. package/dist/dashboard-QMssHf5j.d.mts +1801 -0
  241. package/dist/feedback.d.mts +103 -0
  242. package/dist/feedback.d.ts +21 -0
  243. package/dist/feedback.d.ts.map +1 -0
  244. package/dist/feedback.js +2 -0
  245. package/dist/feedback.js.map +1 -0
  246. package/dist/feedback.mjs +2 -0
  247. package/dist/feedback.mjs.map +1 -0
  248. package/dist/form.d.mts +803 -0
  249. package/dist/form.d.ts +42 -0
  250. package/dist/form.d.ts.map +1 -0
  251. package/dist/form.js +2 -0
  252. package/dist/form.js.map +1 -0
  253. package/dist/form.mjs +2 -0
  254. package/dist/form.mjs.map +1 -0
  255. package/dist/hooks/useScrollToggle.d.ts +12 -0
  256. package/dist/hooks/useScrollToggle.d.ts.map +1 -0
  257. package/dist/icons-DoSGIez_.d.mts +135 -0
  258. package/dist/index.d.mts +3770 -0
  259. package/dist/index.d.ts +76 -38
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +37 -49
  262. package/dist/index.js.map +1 -0
  263. package/dist/index.mjs +37 -0
  264. package/dist/index.mjs.map +1 -0
  265. package/dist/lib/icon-aliases.d.ts +24 -0
  266. package/dist/lib/icon-aliases.d.ts.map +1 -0
  267. package/dist/lib/icon-names.d.ts +47 -0
  268. package/dist/lib/icon-names.d.ts.map +1 -0
  269. package/dist/lib/icon-providers.d.ts +559 -0
  270. package/dist/lib/icon-providers.d.ts.map +1 -0
  271. package/dist/lib/icons.d.ts +113 -24
  272. package/dist/lib/icons.d.ts.map +1 -1
  273. package/dist/lib/phosphor-icons.d.ts +6 -0
  274. package/dist/lib/phosphor-icons.d.ts.map +1 -0
  275. package/dist/lib/styles/colors.d.ts +131 -0
  276. package/dist/lib/styles/colors.d.ts.map +1 -0
  277. package/dist/lib/styles/index.d.ts +8 -0
  278. package/dist/lib/styles/index.d.ts.map +1 -0
  279. package/dist/lib/styles/utils.d.ts +87 -0
  280. package/dist/lib/styles/utils.d.ts.map +1 -0
  281. package/dist/lib/styles/variants.d.ts +79 -0
  282. package/dist/lib/styles/variants.d.ts.map +1 -0
  283. package/dist/lib/types/common.d.ts +80 -0
  284. package/dist/lib/types/common.d.ts.map +1 -0
  285. package/dist/lib/types/index.d.ts +6 -0
  286. package/dist/lib/types/index.d.ts.map +1 -0
  287. package/dist/lib/utils.d.ts +73 -1
  288. package/dist/lib/utils.d.ts.map +1 -1
  289. package/dist/navigation.d.mts +105 -0
  290. package/dist/navigation.d.ts +22 -0
  291. package/dist/navigation.d.ts.map +1 -0
  292. package/dist/navigation.js +2 -0
  293. package/dist/navigation.js.map +1 -0
  294. package/dist/navigation.mjs +2 -0
  295. package/dist/navigation.mjs.map +1 -0
  296. package/package.json +92 -25
  297. package/src/styles/toast.css +23 -0
  298. package/dist/components/Accordion.js +0 -84
  299. package/dist/components/Alert.js +0 -61
  300. package/dist/components/Avatar.js +0 -18
  301. package/dist/components/Badge.js +0 -15
  302. package/dist/components/BottomSheet.js +0 -96
  303. package/dist/components/Breadcrumb.js +0 -47
  304. package/dist/components/Button.js +0 -23
  305. package/dist/components/Card.js +0 -18
  306. package/dist/components/ChatMessage.js +0 -59
  307. package/dist/components/Checkbox.js +0 -30
  308. package/dist/components/Command.js +0 -119
  309. package/dist/components/ConfirmModal.js +0 -53
  310. package/dist/components/Container.js +0 -23
  311. package/dist/components/ContextMenu.js +0 -110
  312. package/dist/components/Divider.js +0 -39
  313. package/dist/components/Drawer.js +0 -79
  314. package/dist/components/Dropdown.js +0 -174
  315. package/dist/components/EmotionAnalysis.js +0 -40
  316. package/dist/components/EmotionButton.js +0 -16
  317. package/dist/components/EmotionMeter.js +0 -21
  318. package/dist/components/EmotionSelector.js +0 -46
  319. package/dist/components/Grid.js +0 -44
  320. package/dist/components/Icon.d.ts +0 -26
  321. package/dist/components/Icon.d.ts.map +0 -1
  322. package/dist/components/Icon.js +0 -48
  323. package/dist/components/Input.js +0 -25
  324. package/dist/components/LanguageToggle.js +0 -61
  325. package/dist/components/LoadingSpinner.js +0 -37
  326. package/dist/components/Menu.js +0 -122
  327. package/dist/components/Modal.js +0 -62
  328. package/dist/components/PageTransition.js +0 -39
  329. package/dist/components/Pagination.js +0 -87
  330. package/dist/components/Popover.js +0 -159
  331. package/dist/components/Progress.js +0 -51
  332. package/dist/components/Radio.js +0 -29
  333. package/dist/components/ScrollArea.js +0 -42
  334. package/dist/components/ScrollIndicator.js +0 -60
  335. package/dist/components/ScrollProgress.js +0 -39
  336. package/dist/components/ScrollToTop.js +0 -46
  337. package/dist/components/Select.js +0 -29
  338. package/dist/components/Skeleton.js +0 -71
  339. package/dist/components/Stack.js +0 -34
  340. package/dist/components/Switch.js +0 -29
  341. package/dist/components/Tabs.js +0 -117
  342. package/dist/components/Textarea.js +0 -31
  343. package/dist/components/ThemeProvider.js +0 -76
  344. package/dist/components/ThemeToggle.js +0 -49
  345. package/dist/components/Toast.js +0 -138
  346. package/dist/components/Tooltip.js +0 -102
  347. package/dist/lib/icons.js +0 -321
  348. package/dist/lib/utils.js +0 -5
@@ -1,39 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import React, { useState, useEffect } from 'react';
4
- import { cn } from '../lib/utils';
5
- import { LoadingSpinner } from './LoadingSpinner';
6
- export const PageTransition = React.forwardRef(({ children, className, duration = 300, variant = 'fade', loadingVariant = 'butterfly', loadingText = '페이지 로딩 중...', showLoading = true, onTransitionStart, onTransitionEnd }, ref) => {
7
- const [isLoading, setIsLoading] = useState(true);
8
- const [isVisible, setIsVisible] = useState(false);
9
- useEffect(() => {
10
- const timer = setTimeout(() => {
11
- setIsLoading(false);
12
- setIsVisible(true);
13
- onTransitionEnd?.();
14
- }, duration);
15
- onTransitionStart?.();
16
- return () => clearTimeout(timer);
17
- }, [duration, onTransitionStart, onTransitionEnd]);
18
- const transitionClasses = {
19
- fade: cn('transition-opacity duration-300 ease-in-out', isVisible ? 'opacity-100' : 'opacity-0'),
20
- slide: cn('transition-transform duration-300 ease-in-out', isVisible ? 'translate-x-0' : 'translate-x-full'),
21
- scale: cn('transition-all duration-300 ease-in-out', isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'),
22
- flip: cn('transition-all duration-500 ease-in-out', isVisible ? 'rotate-y-0 opacity-100' : 'rotate-y-90 opacity-0')
23
- };
24
- if (isLoading && showLoading) {
25
- return (_jsx("div", { className: cn('flex items-center justify-center min-h-screen', className), children: _jsx(LoadingSpinner, { size: "lg" }) }));
26
- }
27
- return (_jsx("div", { ref: ref, className: cn('w-full', transitionClasses[variant], className), style: { transitionDuration: `${duration}ms` }, children: children }));
28
- });
29
- PageTransition.displayName = 'PageTransition';
30
- // Convenience components for different transition types
31
- export const FadeTransition = React.forwardRef((props, ref) => (_jsx(PageTransition, { ref: ref, variant: "fade", ...props })));
32
- export const SlideTransition = React.forwardRef((props, ref) => (_jsx(PageTransition, { ref: ref, variant: "slide", ...props })));
33
- export const ScaleTransition = React.forwardRef((props, ref) => (_jsx(PageTransition, { ref: ref, variant: "scale", ...props })));
34
- export const FlipTransition = React.forwardRef((props, ref) => (_jsx(PageTransition, { ref: ref, variant: "flip", ...props })));
35
- // Add displayName for convenience components
36
- FadeTransition.displayName = 'FadeTransition';
37
- SlideTransition.displayName = 'SlideTransition';
38
- ScaleTransition.displayName = 'ScaleTransition';
39
- FlipTransition.displayName = 'FlipTransition';
@@ -1,87 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { cn } from "../lib/utils";
5
- const Pagination = React.forwardRef(({ className, currentPage, totalPages, onPageChange, showFirstLast = true, showPrevNext = true, maxVisiblePages = 5, size = "md", variant = "default", ...props }, ref) => {
6
- const getVisiblePages = () => {
7
- const pages = [];
8
- const halfVisible = Math.floor(maxVisiblePages / 2);
9
- let start = Math.max(1, currentPage - halfVisible);
10
- let end = Math.min(totalPages, currentPage + halfVisible);
11
- // 조정
12
- if (end - start + 1 < maxVisiblePages) {
13
- if (start === 1) {
14
- end = Math.min(totalPages, start + maxVisiblePages - 1);
15
- }
16
- else {
17
- start = Math.max(1, end - maxVisiblePages + 1);
18
- }
19
- }
20
- // 첫 페이지
21
- if (start > 1) {
22
- pages.push(1);
23
- if (start > 2) {
24
- pages.push("...");
25
- }
26
- }
27
- // 중간 페이지들
28
- for (let i = start; i <= end; i++) {
29
- pages.push(i);
30
- }
31
- // 마지막 페이지
32
- if (end < totalPages) {
33
- if (end < totalPages - 1) {
34
- pages.push("...");
35
- }
36
- pages.push(totalPages);
37
- }
38
- return pages;
39
- };
40
- const getSizeClasses = () => {
41
- switch (size) {
42
- case "sm":
43
- return "h-8 px-2 text-sm"; // 32px 높이, 8px 패딩
44
- case "lg":
45
- return "h-12 px-4 text-base"; // 48px 높이, 16px 패딩
46
- default:
47
- return "h-10 px-3 text-sm"; // 40px 높이, 12px 패딩
48
- }
49
- };
50
- const getVariantClasses = (isActive = false) => {
51
- switch (variant) {
52
- case "outlined":
53
- return cn("border border-gray-300 dark:border-gray-600", isActive
54
- ? "bg-blue-500 border-blue-500 text-white"
55
- : "bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700");
56
- case "minimal":
57
- return cn("border-0", isActive
58
- ? "bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300"
59
- : "bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700");
60
- default:
61
- return cn("border-0", isActive
62
- ? "bg-blue-500 text-white"
63
- : "bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700");
64
- }
65
- };
66
- const handlePageClick = (page) => {
67
- if (page >= 1 && page <= totalPages && page !== currentPage) {
68
- onPageChange(page);
69
- }
70
- };
71
- const visiblePages = getVisiblePages();
72
- return (_jsxs("div", { ref: ref, className: cn("flex items-center justify-center space-x-1", className), ...props, children: [showFirstLast && currentPage > 1 && (_jsx("button", { onClick: () => handlePageClick(1), className: cn("inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", getSizeClasses(), getVariantClasses()), "aria-label": "\uCCAB \uD398\uC774\uC9C0\uB85C \uC774\uB3D9", children: _jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M11 19l-7-7 7-7m8 14l-7-7 7-7" }) }) })), showPrevNext && currentPage > 1 && (_jsx("button", { onClick: () => handlePageClick(currentPage - 1), className: cn("inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", getSizeClasses(), getVariantClasses()), "aria-label": "\uC774\uC804 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9", children: _jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) }) })), visiblePages.map((page, index) => (_jsx(React.Fragment, { children: page === "..." ? (_jsx("span", { className: cn("inline-flex items-center justify-center px-3 py-2 text-sm font-medium text-gray-500 dark:text-gray-400", getSizeClasses()), children: "..." })) : (_jsx("button", { onClick: () => handlePageClick(page), className: cn("inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", getSizeClasses(), getVariantClasses(page === currentPage)), "aria-label": `${page}페이지로 이동`, "aria-current": page === currentPage ? "page" : undefined, children: page })) }, index))), showPrevNext && currentPage < totalPages && (_jsx("button", { onClick: () => handlePageClick(currentPage + 1), className: cn("inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", getSizeClasses(), getVariantClasses()), "aria-label": "\uB2E4\uC74C \uD398\uC774\uC9C0\uB85C \uC774\uB3D9", children: _jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }) })), showFirstLast && currentPage < totalPages && (_jsx("button", { onClick: () => handlePageClick(totalPages), className: cn("inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", getSizeClasses(), getVariantClasses()), "aria-label": "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9", children: _jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) }) }))] }));
73
- });
74
- Pagination.displayName = "Pagination";
75
- // 편의 컴포넌트들
76
- export const PaginationOutlined = React.forwardRef(({ className, ...props }, ref) => (_jsx(Pagination, { ref: ref, variant: "outlined", className: className, ...props })));
77
- PaginationOutlined.displayName = "PaginationOutlined";
78
- export const PaginationMinimal = React.forwardRef(({ className, ...props }, ref) => (_jsx(Pagination, { ref: ref, variant: "minimal", className: className, ...props })));
79
- PaginationMinimal.displayName = "PaginationMinimal";
80
- // 복합 컴포넌트들
81
- export const PaginationWithInfo = React.forwardRef(({ totalItems = 0, itemsPerPage = 10, showInfo = true, className, ...props }, ref) => {
82
- const startItem = (props.currentPage - 1) * itemsPerPage + 1;
83
- const endItem = Math.min(props.currentPage * itemsPerPage, totalItems);
84
- return (_jsxs("div", { ref: ref, className: cn("flex flex-col sm:flex-row items-center justify-between gap-4", className), children: [showInfo && totalItems > 0 && (_jsxs("div", { className: "text-sm text-gray-700 dark:text-gray-300", children: [startItem, "-", endItem, " / ", totalItems, "\uAC1C \uD56D\uBAA9"] })), _jsx(Pagination, { ...props })] }));
85
- });
86
- PaginationWithInfo.displayName = "PaginationWithInfo";
87
- export { Pagination };
@@ -1,159 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { cn } from "../lib/utils";
5
- const Popover = React.forwardRef(({ className, children, trigger, open: controlledOpen, onOpenChange, position = "bottom", align = "center", offset = 8, disabled = false, ...props }, ref) => {
6
- const [internalOpen, setInternalOpen] = React.useState(false);
7
- const [coords, setCoords] = React.useState({ x: 0, y: 0 });
8
- const triggerRef = React.useRef(null);
9
- const popoverRef = React.useRef(null);
10
- const isControlled = controlledOpen !== undefined;
11
- const isOpen = isControlled ? controlledOpen : internalOpen;
12
- const handleOpenChange = (newOpen) => {
13
- if (disabled)
14
- return;
15
- if (!isControlled) {
16
- setInternalOpen(newOpen);
17
- }
18
- onOpenChange?.(newOpen);
19
- };
20
- const handleTriggerClick = () => {
21
- handleOpenChange(!isOpen);
22
- };
23
- const updatePosition = React.useCallback(() => {
24
- if (!triggerRef.current || !popoverRef.current)
25
- return;
26
- const triggerRect = triggerRef.current.getBoundingClientRect();
27
- const popoverRect = popoverRef.current.getBoundingClientRect();
28
- const viewportWidth = window.innerWidth;
29
- const viewportHeight = window.innerHeight;
30
- let x = 0;
31
- let y = 0;
32
- // 기본 위치 계산
33
- switch (position) {
34
- case "top":
35
- x = triggerRect.left + triggerRect.width / 2;
36
- y = triggerRect.top - offset;
37
- break;
38
- case "bottom":
39
- x = triggerRect.left + triggerRect.width / 2;
40
- y = triggerRect.bottom + offset;
41
- break;
42
- case "left":
43
- x = triggerRect.left - offset;
44
- y = triggerRect.top + triggerRect.height / 2;
45
- break;
46
- case "right":
47
- x = triggerRect.right + offset;
48
- y = triggerRect.top + triggerRect.height / 2;
49
- break;
50
- }
51
- // 정렬 조정
52
- switch (align) {
53
- case "start":
54
- if (position === "top" || position === "bottom") {
55
- x = triggerRect.left;
56
- }
57
- else {
58
- y = triggerRect.top;
59
- }
60
- break;
61
- case "end":
62
- if (position === "top" || position === "bottom") {
63
- x = triggerRect.right - popoverRect.width;
64
- }
65
- else {
66
- y = triggerRect.bottom - popoverRect.height;
67
- }
68
- break;
69
- case "center":
70
- default:
71
- if (position === "top" || position === "bottom") {
72
- x = triggerRect.left + triggerRect.width / 2 - popoverRect.width / 2;
73
- }
74
- else {
75
- y = triggerRect.top + triggerRect.height / 2 - popoverRect.height / 2;
76
- }
77
- break;
78
- }
79
- // 뷰포트 경계 확인 및 조정
80
- if (x < 0)
81
- x = 8; // 8px 여백
82
- if (x + popoverRect.width > viewportWidth) {
83
- x = viewportWidth - popoverRect.width - 8; // 8px 여백
84
- }
85
- if (y < 0)
86
- y = 8; // 8px 여백
87
- if (y + popoverRect.height > viewportHeight) {
88
- y = viewportHeight - popoverRect.height - 8; // 8px 여백
89
- }
90
- setCoords({ x, y });
91
- }, [position, align, offset]);
92
- React.useEffect(() => {
93
- if (isOpen) {
94
- updatePosition();
95
- window.addEventListener('resize', updatePosition);
96
- window.addEventListener('scroll', updatePosition);
97
- return () => {
98
- window.removeEventListener('resize', updatePosition);
99
- window.removeEventListener('scroll', updatePosition);
100
- };
101
- }
102
- }, [isOpen, updatePosition]);
103
- React.useEffect(() => {
104
- const handleClickOutside = (event) => {
105
- if (triggerRef.current &&
106
- popoverRef.current &&
107
- !triggerRef.current.contains(event.target) &&
108
- !popoverRef.current.contains(event.target)) {
109
- handleOpenChange(false);
110
- }
111
- };
112
- if (isOpen) {
113
- document.addEventListener('mousedown', handleClickOutside);
114
- return () => {
115
- document.removeEventListener('mousedown', handleClickOutside);
116
- };
117
- }
118
- }, [isOpen]);
119
- const getPositionClasses = () => {
120
- switch (position) {
121
- case "top":
122
- return "bottom-full left-0 mb-2"; // 8px 간격
123
- case "bottom":
124
- return "top-full left-0 mt-2"; // 8px 간격
125
- case "left":
126
- return "right-full top-0 mr-2"; // 8px 간격
127
- case "right":
128
- return "left-full top-0 ml-2"; // 8px 간격
129
- default:
130
- return "top-full left-0 mt-2";
131
- }
132
- };
133
- const getArrowClasses = () => {
134
- switch (position) {
135
- case "top":
136
- return "top-full left-1/2 -translate-x-1/2 border-t-gray-200 dark:border-t-gray-700";
137
- case "bottom":
138
- return "bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700";
139
- case "left":
140
- return "left-full top-1/2 -translate-y-1/2 border-l-gray-200 dark:border-l-gray-700";
141
- case "right":
142
- return "right-full top-1/2 -translate-y-1/2 border-r-gray-200 dark:border-r-gray-700";
143
- default:
144
- return "bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700";
145
- }
146
- };
147
- return (_jsxs("div", { ref: ref, className: cn("relative", className), ...props, children: [_jsx("div", { ref: triggerRef, onClick: handleTriggerClick, className: "inline-block cursor-pointer", children: trigger }), isOpen && (_jsxs("div", { ref: popoverRef, className: cn("absolute z-50 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4", // 16px 패딩
148
- getPositionClasses()), style: {
149
- transform: `translate(${coords.x}px, ${coords.y}px)`,
150
- minWidth: '200px'
151
- }, children: [_jsx("div", { className: cn("absolute w-0 h-0 border-4 border-transparent", getArrowClasses()) }), _jsx("div", { className: "relative z-10", children: children })] }))] }));
152
- });
153
- Popover.displayName = "Popover";
154
- // 편의 컴포넌트들
155
- export const PopoverTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsx("div", { ref: ref, className: cn("inline-block cursor-pointer", className), ...props, children: children })));
156
- PopoverTrigger.displayName = "PopoverTrigger";
157
- export const PopoverContent = React.forwardRef(({ className, children, ...props }, ref) => (_jsx("div", { ref: ref, className: cn("bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4", className), ...props, children: children })));
158
- PopoverContent.displayName = "PopoverContent";
159
- export { Popover };
@@ -1,51 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { cn } from "../lib/utils";
5
- const Progress = React.forwardRef(({ className, value = 0, max = 100, size = "md", variant = "default", showValue = false, animated = true, striped = false, label, description, ...props }, ref) => {
6
- const percentage = Math.min(Math.max((value / max) * 100, 0), 100);
7
- const sizeClasses = {
8
- sm: "h-2", // 8px 높이
9
- md: "h-3", // 12px 높이
10
- lg: "h-4" // 16px 높이
11
- };
12
- const getVariantClasses = () => {
13
- switch (variant) {
14
- case "success":
15
- return "bg-green-500 dark:bg-green-400";
16
- case "warning":
17
- return "bg-yellow-500 dark:bg-yellow-400";
18
- case "error":
19
- return "bg-red-500 dark:bg-red-400";
20
- case "info":
21
- return "bg-blue-500 dark:bg-blue-400";
22
- default:
23
- return "bg-gray-900 dark:bg-gray-100";
24
- }
25
- };
26
- const getStripedClasses = () => {
27
- if (!striped)
28
- return "";
29
- return "bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse";
30
- };
31
- return (_jsxs("div", { className: cn("w-full", className), ...props, children: [(label || showValue) && (_jsxs("div", { className: "flex items-center justify-between mb-2", children: [" ", label && (_jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: label })), showValue && (_jsxs("span", { className: "text-sm text-gray-600 dark:text-gray-400", children: [Math.round(percentage), "%"] }))] })), _jsx("div", { ref: ref, className: cn("relative w-full overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700", sizeClasses[size]), children: _jsx("div", { className: cn("h-full rounded-full transition-all duration-300 ease-out", getVariantClasses(), getStripedClasses(), animated && "animate-pulse"), style: {
32
- width: `${percentage}%`,
33
- transition: animated ? "width 0.3s ease-out" : "none"
34
- } }) }), description && (_jsxs("p", { className: "mt-2 text-xs text-gray-500 dark:text-gray-400", children: [" ", description] }))] }));
35
- });
36
- Progress.displayName = "Progress";
37
- // 편의 컴포넌트들
38
- export const ProgressSuccess = React.forwardRef(({ className, ...props }, ref) => (_jsx(Progress, { ref: ref, variant: "success", className: className, ...props })));
39
- ProgressSuccess.displayName = "ProgressSuccess";
40
- export const ProgressWarning = React.forwardRef(({ className, ...props }, ref) => (_jsx(Progress, { ref: ref, variant: "warning", className: className, ...props })));
41
- ProgressWarning.displayName = "ProgressWarning";
42
- export const ProgressError = React.forwardRef(({ className, ...props }, ref) => (_jsx(Progress, { ref: ref, variant: "error", className: className, ...props })));
43
- ProgressError.displayName = "ProgressError";
44
- export const ProgressInfo = React.forwardRef(({ className, ...props }, ref) => (_jsx(Progress, { ref: ref, variant: "info", className: className, ...props })));
45
- ProgressInfo.displayName = "ProgressInfo";
46
- // 복합 Progress 컴포넌트들
47
- export const ProgressCard = React.forwardRef(({ title, className, ...props }, ref) => (_jsxs("div", { className: cn("p-4 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700", className), children: [title && (_jsxs("h3", { className: "text-sm font-semibold text-gray-900 dark:text-white mb-3", children: [" ", title] })), _jsx(Progress, { ref: ref, ...props })] })));
48
- ProgressCard.displayName = "ProgressCard";
49
- export const ProgressGroup = React.forwardRef(({ className, children, ...props }, ref) => (_jsx("div", { ref: ref, className: cn("space-y-4", className), ...props, children: children })));
50
- ProgressGroup.displayName = "ProgressGroup";
51
- export { Progress };
@@ -1,29 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { cn } from "../lib/utils";
5
- const Radio = React.forwardRef(({ className, variant = "default", size = "md", error = false, success = false, label, description, ...props }, ref) => {
6
- const sizeClasses = {
7
- sm: "w-4 h-4",
8
- md: "w-5 h-5",
9
- lg: "w-6 h-6"
10
- };
11
- const dotSizes = {
12
- sm: "w-1.5 h-1.5",
13
- md: "w-2 h-2",
14
- lg: "w-2.5 h-2.5"
15
- };
16
- const variantClasses = {
17
- default: "border-gray-300 bg-white text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-blue-400",
18
- outline: "border-2 border-gray-200 bg-transparent text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:focus:ring-blue-400",
19
- filled: "border-transparent bg-gray-50 text-blue-600 focus:bg-white focus:ring-blue-500 dark:bg-gray-700 dark:focus:bg-gray-800 dark:focus:ring-blue-400"
20
- };
21
- const stateClasses = error
22
- ? "border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:ring-red-400"
23
- : success
24
- ? "border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:ring-green-400"
25
- : "";
26
- return (_jsxs("div", { className: "flex items-start space-x-3", children: [_jsxs("div", { className: "relative", children: [_jsx("input", { type: "radio", className: cn("peer sr-only", className), ref: ref, ...props }), _jsx("div", { className: cn("flex items-center justify-center rounded-full border transition-all duration-200 cursor-pointer", "peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2", "peer-disabled:cursor-not-allowed peer-disabled:opacity-50", sizeClasses[size], variantClasses[variant], stateClasses, "peer-checked:border-blue-600 dark:peer-checked:border-blue-500"), children: _jsx("div", { className: cn("rounded-full bg-blue-600 dark:bg-blue-500 opacity-0 peer-checked:opacity-100 transition-opacity duration-200", dotSizes[size]) }) })] }), (label || description) && (_jsxs("div", { className: "flex flex-col", children: [label && (_jsx("label", { className: "text-sm font-medium text-gray-900 dark:text-white cursor-pointer", children: label })), description && (_jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: description }))] }))] }));
27
- });
28
- Radio.displayName = "Radio";
29
- export { Radio };
@@ -1,42 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { cn } from "../lib/utils";
5
- const ScrollArea = React.forwardRef(({ children, className, orientation = "vertical", scrollHideDelay = 600, type = "hover", ...props }, ref) => {
6
- const [showScrollbar, setShowScrollbar] = React.useState(false);
7
- const timeoutRef = React.useRef(undefined);
8
- const handleMouseEnter = () => {
9
- if (type === "hover" || type === "always") {
10
- setShowScrollbar(true);
11
- }
12
- };
13
- const handleMouseLeave = () => {
14
- if (type === "hover") {
15
- if (timeoutRef.current) {
16
- clearTimeout(timeoutRef.current);
17
- }
18
- timeoutRef.current = setTimeout(() => {
19
- setShowScrollbar(false);
20
- }, scrollHideDelay);
21
- }
22
- };
23
- React.useEffect(() => {
24
- if (type === "always") {
25
- setShowScrollbar(true);
26
- }
27
- }, [type]);
28
- React.useEffect(() => {
29
- return () => {
30
- if (timeoutRef.current) {
31
- clearTimeout(timeoutRef.current);
32
- }
33
- };
34
- }, []);
35
- return (_jsx("div", { ref: ref, className: cn("relative overflow-auto scrollbar-thin", orientation === "vertical" && "overflow-y-auto overflow-x-hidden", orientation === "horizontal" && "overflow-x-auto overflow-y-hidden", orientation === "both" && "overflow-auto", showScrollbar ? "scrollbar-visible" : "scrollbar-hidden", className), onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ...props, children: children }));
36
- });
37
- ScrollArea.displayName = "ScrollArea";
38
- const ScrollBar = React.forwardRef(({ orientation = "vertical", className, ...props }, ref) => {
39
- return (_jsx("div", { ref: ref, className: cn("flex touch-none select-none transition-colors duration-150 ease-out", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]", className), ...props }));
40
- });
41
- ScrollBar.displayName = "ScrollBar";
42
- export { ScrollArea, ScrollBar };
@@ -1,60 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import React, { useState, useEffect } from 'react';
4
- import { Button } from './Button';
5
- import { Icon } from './Icon';
6
- import { cn } from '../lib/utils';
7
- const ScrollIndicator = React.forwardRef(({ className, targetId, text = 'Scroll down', iconName = 'arrowDown', iconSize = 20, position = 'bottom-center', variant = 'default', size = 'md', animated = true, autoHide = true, hideThreshold = 100, ...props }, ref) => {
8
- const [isVisible, setIsVisible] = useState(true);
9
- useEffect(() => {
10
- if (!autoHide)
11
- return;
12
- const handleScroll = () => {
13
- const scrollTop = window.scrollY;
14
- setIsVisible(scrollTop < hideThreshold);
15
- };
16
- // 초기 실행
17
- handleScroll();
18
- window.addEventListener('scroll', handleScroll, { passive: true });
19
- return () => window.removeEventListener('scroll', handleScroll);
20
- }, [autoHide, hideThreshold]);
21
- const scrollToTarget = () => {
22
- if (targetId) {
23
- const targetElement = document.getElementById(targetId);
24
- if (targetElement) {
25
- targetElement.scrollIntoView({ behavior: 'smooth' });
26
- }
27
- }
28
- else {
29
- // 기본적으로 다음 섹션으로 스크롤
30
- const currentSection = ref;
31
- if (currentSection.current) {
32
- const nextSection = currentSection.current.nextElementSibling;
33
- if (nextSection) {
34
- nextSection.scrollIntoView({ behavior: 'smooth' });
35
- }
36
- }
37
- }
38
- };
39
- const positionClasses = {
40
- 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2',
41
- 'bottom-left': 'bottom-8 left-8',
42
- 'bottom-right': 'bottom-8 right-8'
43
- };
44
- const sizeClasses = {
45
- sm: 'text-sm',
46
- md: 'text-base',
47
- lg: 'text-lg'
48
- };
49
- const variantClasses = {
50
- default: 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white',
51
- primary: 'text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200',
52
- secondary: 'text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200',
53
- outline: 'text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white'
54
- };
55
- if (!isVisible)
56
- return null;
57
- return (_jsx("div", { ref: ref, className: cn('absolute z-10', positionClasses[position], className), ...props, children: _jsxs(Button, { onClick: scrollToTarget, variant: "ghost", size: "sm", className: cn('flex flex-col items-center space-y-2 transition-all duration-300', sizeClasses[size], variantClasses[variant], animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-500'), "aria-label": text, children: [_jsx("span", { className: "text-xs opacity-80", children: text }), _jsx(Icon, { name: iconName, size: iconSize, className: cn(animated && 'animate-bounce') })] }) }));
58
- });
59
- ScrollIndicator.displayName = 'ScrollIndicator';
60
- export { ScrollIndicator };
@@ -1,39 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import React, { useState, useEffect } from 'react';
4
- import { cn } from '../lib/utils';
5
- const ScrollProgress = React.forwardRef(({ className, height = 2, color = 'gradient', position = 'top', animated = true, showPercentage = false, ...props }, ref) => {
6
- const [progress, setProgress] = useState(0);
7
- useEffect(() => {
8
- const updateProgress = () => {
9
- const scrollTop = window.scrollY;
10
- const docHeight = document.documentElement.scrollHeight - window.innerHeight;
11
- const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0;
12
- setProgress(currentProgress);
13
- };
14
- // 초기 실행
15
- updateProgress();
16
- window.addEventListener('scroll', updateProgress, { passive: true });
17
- window.addEventListener('resize', updateProgress, { passive: true });
18
- return () => {
19
- window.removeEventListener('scroll', updateProgress);
20
- window.removeEventListener('resize', updateProgress);
21
- };
22
- }, []);
23
- const colorClasses = {
24
- default: 'bg-blue-600',
25
- primary: 'bg-purple-600',
26
- secondary: 'bg-gray-600',
27
- gradient: 'bg-gradient-to-r from-purple-600 via-blue-600 to-purple-600'
28
- };
29
- const positionClasses = {
30
- top: 'top-0 left-0 right-0',
31
- bottom: 'bottom-0 left-0 right-0'
32
- };
33
- return (_jsxs("div", { ref: ref, className: cn('fixed z-50', positionClasses[position], className), style: { height: `${height}px` }, ...props, children: [_jsx("div", { className: "w-full h-full bg-gray-200 dark:bg-gray-700" }), _jsx("div", { className: cn('h-full origin-left transition-all duration-100 ease-out', colorClasses[color]), style: {
34
- width: `${progress}%`,
35
- transformOrigin: 'left'
36
- } }), showPercentage && (_jsxs("div", { className: "absolute top-2 right-2 text-xs text-gray-600 dark:text-gray-400 bg-white dark:bg-gray-800 px-2 py-1 rounded", children: [Math.round(progress), "%"] }))] }));
37
- });
38
- ScrollProgress.displayName = 'ScrollProgress';
39
- export { ScrollProgress };
@@ -1,46 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import React, { useState, useEffect } from 'react';
4
- import { Button } from './Button';
5
- import { cn } from '../lib/utils';
6
- const ScrollToTop = React.forwardRef(({ className, threshold = 300, position = 'bottom-right', size = 'md', variant = 'default', showIcon = true, iconName = 'arrowUp', iconSize = 20, animated = true, ...props }, ref) => {
7
- const [isVisible, setIsVisible] = useState(false);
8
- useEffect(() => {
9
- const toggleVisibility = () => {
10
- const scrollTop = window.scrollY;
11
- const shouldShow = scrollTop > threshold;
12
- setIsVisible(shouldShow);
13
- };
14
- // 초기 실행
15
- toggleVisibility();
16
- window.addEventListener('scroll', toggleVisibility, { passive: true });
17
- return () => window.removeEventListener('scroll', toggleVisibility);
18
- }, [threshold]);
19
- const scrollToTop = () => {
20
- window.scrollTo({
21
- top: 0,
22
- behavior: 'smooth',
23
- });
24
- };
25
- const positionClasses = {
26
- 'bottom-right': 'bottom-8 right-8', // 32px 여백
27
- 'bottom-left': 'bottom-8 left-8', // 32px 여백
28
- 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2' // 32px 여백
29
- };
30
- const sizeClasses = {
31
- sm: 'w-12 h-12', // 48px - 더 넉넉한 크기
32
- md: 'w-14 h-14', // 56px - 더 넉넉한 크기
33
- lg: 'w-16 h-16' // 64px - 더 넉넉한 크기
34
- };
35
- const variantClasses = {
36
- default: 'bg-gray-800 dark:bg-gray-200 text-white dark:text-gray-800 hover:bg-gray-700 dark:hover:bg-gray-300',
37
- primary: 'bg-blue-600 text-white hover:bg-blue-700',
38
- secondary: 'bg-gray-600 text-white hover:bg-gray-700',
39
- outline: 'bg-white dark:bg-gray-800 border-2 border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700'
40
- };
41
- if (!isVisible)
42
- return null;
43
- return (_jsx("div", { ref: ref, className: cn('fixed z-50', positionClasses[position], className), ...props, children: _jsx(Button, { onClick: scrollToTop, size: "icon", variant: "default", className: cn('rounded-full shadow-lg hover:shadow-xl transition-all duration-300', sizeClasses[size], variantClasses[variant], animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-300'), "aria-label": "Scroll to top", children: showIcon && (_jsx("svg", { className: cn('text-white', animated && 'animate-bounce'), width: iconSize, height: iconSize, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 10l7-7m0 0l7 7m-7-7v18" }) })) }) }));
44
- });
45
- ScrollToTop.displayName = 'ScrollToTop';
46
- export { ScrollToTop };
@@ -1,29 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { cn } from "../lib/utils";
5
- import { Icon } from "./Icon";
6
- const Select = React.forwardRef(({ className, variant = "default", size = "md", error = false, success = false, leftIcon, placeholder, children, ...props }, ref) => {
7
- const variantClasses = {
8
- default: "border-gray-300 bg-white text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:focus:border-blue-400 dark:focus:ring-blue-400",
9
- outline: "border-2 border-gray-200 bg-transparent text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-700 dark:text-white dark:focus:border-blue-400 dark:focus:ring-blue-400",
10
- filled: "border-transparent bg-gray-50 text-gray-900 focus:bg-white focus:border-blue-500 focus:ring-blue-500 dark:bg-gray-700 dark:text-white dark:focus:bg-gray-800 dark:focus:border-blue-400 dark:focus:ring-blue-400",
11
- ghost: "border-transparent bg-transparent text-gray-900 focus:bg-gray-50 focus:border-gray-300 focus:ring-gray-500 dark:text-white dark:focus:bg-gray-800 dark:focus:border-gray-600 dark:focus:ring-gray-400"
12
- };
13
- const sizeClasses = {
14
- sm: "h-8 px-3 text-sm",
15
- md: "h-10 px-4 text-base",
16
- lg: "h-12 px-4 text-lg"
17
- };
18
- const stateClasses = error
19
- ? "border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:border-red-400 dark:focus:ring-red-400"
20
- : success
21
- ? "border-green-500 focus:border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:border-green-400 dark:focus:ring-green-400"
22
- : "";
23
- return (_jsxs("div", { className: "relative", children: [leftIcon && (_jsx("div", { className: "absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none", children: leftIcon })), _jsxs("select", { className: cn("flex w-full appearance-none rounded-md border transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", variantClasses[variant], sizeClasses[size], stateClasses, leftIcon ? "pl-10" : "", "pr-10", // 화살표 아이콘을 위한 공간
24
- className), ref: ref, ...props, children: [placeholder && (_jsx("option", { value: "", disabled: true, children: placeholder })), children] }), _jsx("div", { className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none", children: _jsx(Icon, { name: "chevronDown", size: 16 }) })] }));
25
- });
26
- Select.displayName = "Select";
27
- const SelectOption = React.forwardRef(({ className, ...props }, ref) => (_jsx("option", { className: cn("", className), ref: ref, ...props })));
28
- SelectOption.displayName = "SelectOption";
29
- export { Select, SelectOption };