@hua-labs/ui 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.
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/dist/components/Accordion.d.ts +39 -0
- package/dist/components/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion.js +84 -0
- package/dist/components/Alert.d.ts +17 -0
- package/dist/components/Alert.d.ts.map +1 -0
- package/dist/components/Alert.js +61 -0
- package/dist/components/Avatar.d.ts +13 -0
- package/dist/components/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar.js +18 -0
- package/dist/components/Badge.d.ts +7 -0
- package/dist/components/Badge.d.ts.map +1 -0
- package/dist/components/Badge.js +15 -0
- package/dist/components/BottomSheet.d.ts +29 -0
- package/dist/components/BottomSheet.d.ts.map +1 -0
- package/dist/components/BottomSheet.js +96 -0
- package/dist/components/Breadcrumb.d.ts +27 -0
- package/dist/components/Breadcrumb.d.ts.map +1 -0
- package/dist/components/Breadcrumb.js +47 -0
- package/dist/components/Button.d.ts +9 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +23 -0
- package/dist/components/Card.d.ts +21 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +18 -0
- package/dist/components/ChatMessage.d.ts +35 -0
- package/dist/components/ChatMessage.d.ts.map +1 -0
- package/dist/components/ChatMessage.js +59 -0
- package/dist/components/Checkbox.d.ts +12 -0
- package/dist/components/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox.js +30 -0
- package/dist/components/Command.d.ts +36 -0
- package/dist/components/Command.d.ts.map +1 -0
- package/dist/components/Command.js +119 -0
- package/dist/components/ConfirmModal.d.ts +26 -0
- package/dist/components/ConfirmModal.d.ts.map +1 -0
- package/dist/components/ConfirmModal.js +53 -0
- package/dist/components/Container.d.ts +10 -0
- package/dist/components/Container.d.ts.map +1 -0
- package/dist/components/Container.js +23 -0
- package/dist/components/ContextMenu.d.ts +26 -0
- package/dist/components/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu.js +110 -0
- package/dist/components/Divider.d.ts +11 -0
- package/dist/components/Divider.d.ts.map +1 -0
- package/dist/components/Divider.js +39 -0
- package/dist/components/Drawer.d.ts +32 -0
- package/dist/components/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer.js +79 -0
- package/dist/components/Dropdown.d.ts +28 -0
- package/dist/components/Dropdown.d.ts.map +1 -0
- package/dist/components/Dropdown.js +174 -0
- package/dist/components/EmotionAnalysis.d.ts +25 -0
- package/dist/components/EmotionAnalysis.d.ts.map +1 -0
- package/dist/components/EmotionAnalysis.js +40 -0
- package/dist/components/EmotionButton.d.ts +9 -0
- package/dist/components/EmotionButton.d.ts.map +1 -0
- package/dist/components/EmotionButton.js +16 -0
- package/dist/components/EmotionMeter.d.ts +10 -0
- package/dist/components/EmotionMeter.d.ts.map +1 -0
- package/dist/components/EmotionMeter.js +21 -0
- package/dist/components/EmotionSelector.d.ts +20 -0
- package/dist/components/EmotionSelector.d.ts.map +1 -0
- package/dist/components/EmotionSelector.js +46 -0
- package/dist/components/Grid.d.ts +11 -0
- package/dist/components/Grid.d.ts.map +1 -0
- package/dist/components/Grid.js +44 -0
- package/dist/components/Icon.d.ts +26 -0
- package/dist/components/Icon.d.ts.map +1 -0
- package/dist/components/Icon.js +48 -0
- package/dist/components/Input.d.ts +12 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +25 -0
- package/dist/components/LanguageToggle.d.ts +17 -0
- package/dist/components/LanguageToggle.d.ts.map +1 -0
- package/dist/components/LanguageToggle.js +61 -0
- package/dist/components/LoadingSpinner.d.ts +10 -0
- package/dist/components/LoadingSpinner.d.ts.map +1 -0
- package/dist/components/LoadingSpinner.js +37 -0
- package/dist/components/Menu.d.ts +29 -0
- package/dist/components/Menu.d.ts.map +1 -0
- package/dist/components/Menu.js +122 -0
- package/dist/components/Modal.d.ts +15 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +62 -0
- package/dist/components/PageTransition.d.ts +18 -0
- package/dist/components/PageTransition.d.ts.map +1 -0
- package/dist/components/PageTransition.js +39 -0
- package/dist/components/Pagination.d.ts +21 -0
- package/dist/components/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination.js +87 -0
- package/dist/components/Popover.d.ts +16 -0
- package/dist/components/Popover.d.ts.map +1 -0
- package/dist/components/Popover.js +159 -0
- package/dist/components/Progress.d.ts +23 -0
- package/dist/components/Progress.d.ts.map +1 -0
- package/dist/components/Progress.js +51 -0
- package/dist/components/Radio.d.ts +12 -0
- package/dist/components/Radio.d.ts.map +1 -0
- package/dist/components/Radio.js +29 -0
- package/dist/components/ScrollArea.d.ts +16 -0
- package/dist/components/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea.js +42 -0
- package/dist/components/ScrollIndicator.d.ts +17 -0
- package/dist/components/ScrollIndicator.d.ts.map +1 -0
- package/dist/components/ScrollIndicator.js +60 -0
- package/dist/components/ScrollProgress.d.ts +12 -0
- package/dist/components/ScrollProgress.d.ts.map +1 -0
- package/dist/components/ScrollProgress.js +39 -0
- package/dist/components/ScrollToTop.d.ts +15 -0
- package/dist/components/ScrollToTop.d.ts.map +1 -0
- package/dist/components/ScrollToTop.js +46 -0
- package/dist/components/Select.d.ts +17 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +29 -0
- package/dist/components/Skeleton.d.ts +19 -0
- package/dist/components/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton.js +71 -0
- package/dist/components/Stack.d.ts +11 -0
- package/dist/components/Stack.d.ts.map +1 -0
- package/dist/components/Stack.js +34 -0
- package/dist/components/Switch.d.ts +12 -0
- package/dist/components/Switch.d.ts.map +1 -0
- package/dist/components/Switch.js +29 -0
- package/dist/components/Tabs.d.ts +36 -0
- package/dist/components/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs.js +117 -0
- package/dist/components/Textarea.d.ts +11 -0
- package/dist/components/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea.js +31 -0
- package/dist/components/ThemeProvider.d.ts +19 -0
- package/dist/components/ThemeProvider.d.ts.map +1 -0
- package/dist/components/ThemeProvider.js +76 -0
- package/dist/components/ThemeToggle.d.ts +14 -0
- package/dist/components/ThemeToggle.d.ts.map +1 -0
- package/dist/components/ThemeToggle.js +49 -0
- package/dist/components/Toast.d.ts +32 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +138 -0
- package/dist/components/Tooltip.d.ts +14 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +102 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/lib/icons.d.ts +43 -0
- package/dist/lib/icons.d.ts.map +1 -0
- package/dist/lib/icons.js +321 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +5 -0
- package/package.json +67 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { createContext, useContext, useState, useCallback } from "react";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
// Toast Context 생성
|
|
7
|
+
const ToastContext = createContext(undefined);
|
|
8
|
+
// Toast Hook
|
|
9
|
+
export function useToast() {
|
|
10
|
+
const context = useContext(ToastContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error("useToast must be used within a ToastProvider");
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
}
|
|
16
|
+
// Toast Provider
|
|
17
|
+
export function ToastProvider({ children, maxToasts = 5, position = "top-right" }) {
|
|
18
|
+
const [toasts, setToasts] = useState([]);
|
|
19
|
+
const removeToast = useCallback((id) => {
|
|
20
|
+
setToasts(prev => prev.filter(toast => toast.id !== id));
|
|
21
|
+
}, []);
|
|
22
|
+
const addToast = useCallback((toast) => {
|
|
23
|
+
const id = Math.random().toString(36).substr(2, 9);
|
|
24
|
+
const newToast = { ...toast, id };
|
|
25
|
+
setToasts(prev => {
|
|
26
|
+
const updatedToasts = [...prev, newToast];
|
|
27
|
+
return updatedToasts.slice(-maxToasts); // 최대 개수 제한
|
|
28
|
+
});
|
|
29
|
+
// 자동 제거
|
|
30
|
+
if (toast.duration !== 0) {
|
|
31
|
+
setTimeout(() => {
|
|
32
|
+
removeToast(id);
|
|
33
|
+
}, toast.duration || 5000);
|
|
34
|
+
}
|
|
35
|
+
}, [maxToasts, removeToast]);
|
|
36
|
+
const clearToasts = useCallback(() => {
|
|
37
|
+
setToasts([]);
|
|
38
|
+
}, []);
|
|
39
|
+
return (_jsxs(ToastContext.Provider, { value: { toasts, addToast, removeToast, clearToasts }, children: [children, _jsx(ToastContainer, { toasts: toasts, removeToast: removeToast, position: position })] }));
|
|
40
|
+
}
|
|
41
|
+
// Toast Container
|
|
42
|
+
function ToastContainer({ toasts, removeToast, position }) {
|
|
43
|
+
const positionClasses = {
|
|
44
|
+
"top-right": "top-4 right-4",
|
|
45
|
+
"top-left": "top-4 left-4",
|
|
46
|
+
"bottom-right": "bottom-4 right-4",
|
|
47
|
+
"bottom-left": "bottom-4 left-4",
|
|
48
|
+
"top-center": "top-4 left-1/2 transform -translate-x-1/2",
|
|
49
|
+
"bottom-center": "bottom-4 left-1/2 transform -translate-x-1/2"
|
|
50
|
+
};
|
|
51
|
+
if (toasts.length === 0)
|
|
52
|
+
return null;
|
|
53
|
+
return (_jsx("div", { className: cn("fixed z-50 space-y-3 max-w-sm", // 12px 간격
|
|
54
|
+
positionClasses[position]), children: toasts.map((toast) => (_jsx(ToastItem, { toast: toast, onRemove: removeToast }, toast.id))) }));
|
|
55
|
+
}
|
|
56
|
+
// Toast Item
|
|
57
|
+
function ToastItem({ toast, onRemove }) {
|
|
58
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
59
|
+
React.useEffect(() => {
|
|
60
|
+
setIsVisible(true);
|
|
61
|
+
}, []);
|
|
62
|
+
const handleRemove = () => {
|
|
63
|
+
setIsVisible(false);
|
|
64
|
+
setTimeout(() => onRemove(toast.id), 300);
|
|
65
|
+
};
|
|
66
|
+
const getToastStyles = (type) => {
|
|
67
|
+
switch (type) {
|
|
68
|
+
case "success":
|
|
69
|
+
return "bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800 text-green-800 dark:text-green-200";
|
|
70
|
+
case "error":
|
|
71
|
+
return "bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800 text-red-800 dark:text-red-200";
|
|
72
|
+
case "warning":
|
|
73
|
+
return "bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800 text-yellow-800 dark:text-yellow-200";
|
|
74
|
+
case "info":
|
|
75
|
+
return "bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 text-blue-800 dark:text-blue-200";
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const getIconStyles = (type) => {
|
|
79
|
+
switch (type) {
|
|
80
|
+
case "success":
|
|
81
|
+
return "text-green-500 dark:text-green-400";
|
|
82
|
+
case "error":
|
|
83
|
+
return "text-red-500 dark:text-red-400";
|
|
84
|
+
case "warning":
|
|
85
|
+
return "text-yellow-500 dark:text-yellow-400";
|
|
86
|
+
case "info":
|
|
87
|
+
return "text-blue-500 dark:text-blue-400";
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const getToastIcon = (type) => {
|
|
91
|
+
switch (type) {
|
|
92
|
+
case "success":
|
|
93
|
+
return (_jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }));
|
|
94
|
+
case "error":
|
|
95
|
+
return (_jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }));
|
|
96
|
+
case "warning":
|
|
97
|
+
return (_jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" }) }));
|
|
98
|
+
case "info":
|
|
99
|
+
return (_jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }));
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
return (_jsxs("div", { className: cn("flex items-start p-4 rounded-xl border shadow-lg backdrop-blur-sm transition-all duration-300 transform", getToastStyles(toast.type), isVisible
|
|
103
|
+
? "translate-x-0 opacity-100 scale-100"
|
|
104
|
+
: "translate-x-full opacity-0 scale-95"), style: {
|
|
105
|
+
animation: "slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)"
|
|
106
|
+
}, children: [_jsxs("div", { className: cn("flex-shrink-0 mr-3", getIconStyles(toast.type)), children: [" ", getToastIcon(toast.type)] }), _jsxs("div", { className: "flex-1 min-w-0", children: [toast.title && (_jsxs("h4", { className: "text-sm font-semibold mb-1", children: [" ", toast.title] })), _jsx("p", { className: "text-sm leading-relaxed", children: toast.message }), toast.action && (_jsx("button", { onClick: toast.action.onClick, className: "mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200" // 12px 여백
|
|
107
|
+
, children: toast.action.label }))] }), _jsxs("div", { className: "flex-shrink-0 ml-4", children: [" ", _jsx("button", { onClick: handleRemove, className: cn("inline-flex rounded-md p-1.5 focus:outline-none focus:ring-2 focus:ring-offset-2 transition-all duration-200 hover:bg-black/5 dark:hover:bg-white/5", getIconStyles(toast.type)), "aria-label": "\uB2EB\uAE30", 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: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsx("style", { dangerouslySetInnerHTML: {
|
|
108
|
+
__html: `
|
|
109
|
+
@keyframes slideInRight {
|
|
110
|
+
from {
|
|
111
|
+
transform: translateX(100%) scale(0.95);
|
|
112
|
+
opacity: 0;
|
|
113
|
+
}
|
|
114
|
+
to {
|
|
115
|
+
transform: translateX(0) scale(1);
|
|
116
|
+
opacity: 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
`
|
|
120
|
+
} })] }));
|
|
121
|
+
}
|
|
122
|
+
// 편의 함수들
|
|
123
|
+
export const showToast = (toast) => {
|
|
124
|
+
// 이 함수는 ToastProvider 내부에서만 사용 가능
|
|
125
|
+
console.warn("showToast is deprecated. Use useToast hook instead.");
|
|
126
|
+
};
|
|
127
|
+
export const showSuccessToast = (message, title, duration) => {
|
|
128
|
+
console.warn("showSuccessToast is deprecated. Use useToast hook instead.");
|
|
129
|
+
};
|
|
130
|
+
export const showErrorToast = (message, title, duration) => {
|
|
131
|
+
console.warn("showErrorToast is deprecated. Use useToast hook instead.");
|
|
132
|
+
};
|
|
133
|
+
export const showWarningToast = (message, title, duration) => {
|
|
134
|
+
console.warn("showWarningToast is deprecated. Use useToast hook instead.");
|
|
135
|
+
};
|
|
136
|
+
export const showInfoToast = (message, title, duration) => {
|
|
137
|
+
console.warn("showInfoToast is deprecated. Use useToast hook instead.");
|
|
138
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
content: string;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
position?: "top" | "bottom" | "left" | "right";
|
|
6
|
+
variant?: "default" | "light" | "dark";
|
|
7
|
+
delay?: number;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare const Tooltip: React.ForwardRefExoticComponent<TooltipProps & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
export declare const TooltipLight: React.ForwardRefExoticComponent<Omit<TooltipProps, "variant"> & React.RefAttributes<HTMLDivElement>>;
|
|
12
|
+
export declare const TooltipDark: React.ForwardRefExoticComponent<Omit<TooltipProps, "variant"> & React.RefAttributes<HTMLDivElement>>;
|
|
13
|
+
export { Tooltip };
|
|
14
|
+
//# sourceMappingURL=Tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IAC9C,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,QAAA,MAAM,OAAO,qFA8IZ,CAAA;AAID,eAAO,MAAM,YAAY,sGAIxB,CAAA;AAGD,eAAO,MAAM,WAAW,sGAIvB,CAAA;AAGD,OAAO,EAAE,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
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 Tooltip = React.forwardRef(({ className, content, children, position = "top", variant = "default", delay = 300, disabled = false, ...props }, ref) => {
|
|
6
|
+
const [isVisible, setIsVisible] = React.useState(false);
|
|
7
|
+
const [coords, setCoords] = React.useState({ x: 0, y: 0 });
|
|
8
|
+
const timeoutRef = React.useRef(undefined);
|
|
9
|
+
const tooltipRef = React.useRef(null);
|
|
10
|
+
const showTooltip = (e) => {
|
|
11
|
+
if (disabled)
|
|
12
|
+
return;
|
|
13
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
14
|
+
const tooltipRect = tooltipRef.current?.getBoundingClientRect();
|
|
15
|
+
let x = 0;
|
|
16
|
+
let y = 0;
|
|
17
|
+
switch (position) {
|
|
18
|
+
case "top":
|
|
19
|
+
x = rect.left + rect.width / 2;
|
|
20
|
+
y = rect.top - 8; // 8px 간격
|
|
21
|
+
break;
|
|
22
|
+
case "bottom":
|
|
23
|
+
x = rect.left + rect.width / 2;
|
|
24
|
+
y = rect.bottom + 8; // 8px 간격
|
|
25
|
+
break;
|
|
26
|
+
case "left":
|
|
27
|
+
x = rect.left - 8; // 8px 간격
|
|
28
|
+
y = rect.top + rect.height / 2;
|
|
29
|
+
break;
|
|
30
|
+
case "right":
|
|
31
|
+
x = rect.right + 8; // 8px 간격
|
|
32
|
+
y = rect.top + rect.height / 2;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
setCoords({ x, y });
|
|
36
|
+
timeoutRef.current = setTimeout(() => {
|
|
37
|
+
setIsVisible(true);
|
|
38
|
+
}, delay);
|
|
39
|
+
};
|
|
40
|
+
const hideTooltip = () => {
|
|
41
|
+
if (timeoutRef.current) {
|
|
42
|
+
clearTimeout(timeoutRef.current);
|
|
43
|
+
}
|
|
44
|
+
setIsVisible(false);
|
|
45
|
+
};
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
return () => {
|
|
48
|
+
if (timeoutRef.current) {
|
|
49
|
+
clearTimeout(timeoutRef.current);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}, []);
|
|
53
|
+
const getVariantClasses = () => {
|
|
54
|
+
switch (variant) {
|
|
55
|
+
case "light":
|
|
56
|
+
return "bg-white text-gray-900 border border-gray-200 shadow-lg";
|
|
57
|
+
case "dark":
|
|
58
|
+
return "bg-gray-900 text-white shadow-lg";
|
|
59
|
+
default:
|
|
60
|
+
return "bg-gray-800 text-white shadow-lg";
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const getPositionClasses = () => {
|
|
64
|
+
switch (position) {
|
|
65
|
+
case "top":
|
|
66
|
+
return "bottom-full left-1/2 -translate-x-1/2 mb-2"; // 8px 간격
|
|
67
|
+
case "bottom":
|
|
68
|
+
return "top-full left-1/2 -translate-x-1/2 mt-2"; // 8px 간격
|
|
69
|
+
case "left":
|
|
70
|
+
return "right-full top-1/2 -translate-y-1/2 mr-2"; // 8px 간격
|
|
71
|
+
case "right":
|
|
72
|
+
return "left-full top-1/2 -translate-y-1/2 ml-2"; // 8px 간격
|
|
73
|
+
default:
|
|
74
|
+
return "bottom-full left-1/2 -translate-x-1/2 mb-2";
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const getArrowClasses = () => {
|
|
78
|
+
switch (position) {
|
|
79
|
+
case "top":
|
|
80
|
+
return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800";
|
|
81
|
+
case "bottom":
|
|
82
|
+
return "bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800";
|
|
83
|
+
case "left":
|
|
84
|
+
return "left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800";
|
|
85
|
+
case "right":
|
|
86
|
+
return "right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800";
|
|
87
|
+
default:
|
|
88
|
+
return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800";
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return (_jsxs("div", { ref: ref, className: cn("relative inline-block", className), onMouseEnter: showTooltip, onMouseLeave: hideTooltip, ...props, children: [children, isVisible && (_jsxs("div", { ref: tooltipRef, className: cn("absolute z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none", // 12px, 8px 패딩
|
|
92
|
+
getVariantClasses(), getPositionClasses()), style: {
|
|
93
|
+
transform: `translate(${coords.x}px, ${coords.y}px)`
|
|
94
|
+
}, children: [content, _jsx("div", { className: cn("absolute w-0 h-0 border-4 border-transparent", getArrowClasses()) })] }))] }));
|
|
95
|
+
});
|
|
96
|
+
Tooltip.displayName = "Tooltip";
|
|
97
|
+
// 편의 컴포넌트들
|
|
98
|
+
export const TooltipLight = React.forwardRef(({ className, ...props }, ref) => (_jsx(Tooltip, { ref: ref, variant: "light", className: className, ...props })));
|
|
99
|
+
TooltipLight.displayName = "TooltipLight";
|
|
100
|
+
export const TooltipDark = React.forwardRef(({ className, ...props }, ref) => (_jsx(Tooltip, { ref: ref, variant: "dark", className: className, ...props })));
|
|
101
|
+
TooltipDark.displayName = "TooltipDark";
|
|
102
|
+
export { Tooltip };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from './components/Accordion';
|
|
2
|
+
export { Alert, AlertSuccess, AlertWarning, AlertError, AlertInfo } from './components/Alert';
|
|
3
|
+
export { Avatar, AvatarImage, AvatarFallback } from './components/Avatar';
|
|
4
|
+
export { Badge } from './components/Badge';
|
|
5
|
+
export { BottomSheet } from './components/BottomSheet';
|
|
6
|
+
export { Breadcrumb } from './components/Breadcrumb';
|
|
7
|
+
export { Button } from './components/Button';
|
|
8
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } from './components/Card';
|
|
9
|
+
export { ChatMessage } from './components/ChatMessage';
|
|
10
|
+
export { Checkbox } from './components/Checkbox';
|
|
11
|
+
export { ConfirmModal } from './components/ConfirmModal';
|
|
12
|
+
export { Container } from './components/Container';
|
|
13
|
+
export { Divider } from './components/Divider';
|
|
14
|
+
export { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } from './components/Dropdown';
|
|
15
|
+
export { Drawer } from './components/Drawer';
|
|
16
|
+
export { Menu, MenuItem, MenuSeparator, MenuLabel, MenuHorizontal, MenuVertical, MenuCompact } from './components/Menu';
|
|
17
|
+
export { ContextMenu, ContextMenuItem, ContextMenuSeparator, ContextMenuLabel, ContextMenuGroup } from './components/ContextMenu';
|
|
18
|
+
export { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandSeparator, CommandEmpty, CommandDialog } from './components/Command';
|
|
19
|
+
export { EmotionAnalysis } from './components/EmotionAnalysis';
|
|
20
|
+
export { EmotionButton } from './components/EmotionButton';
|
|
21
|
+
export { EmotionMeter } from './components/EmotionMeter';
|
|
22
|
+
export { EmotionSelector } from './components/EmotionSelector';
|
|
23
|
+
export { Grid } from './components/Grid';
|
|
24
|
+
export { Icon } from './components/Icon';
|
|
25
|
+
export { iconCategories, emotionIcons, statusIcons } from './lib/icons';
|
|
26
|
+
export { Input } from './components/Input';
|
|
27
|
+
export { LanguageToggle } from './components/LanguageToggle';
|
|
28
|
+
export { LoadingSpinner } from './components/LoadingSpinner';
|
|
29
|
+
export { Modal } from './components/Modal';
|
|
30
|
+
export { PageTransition } from './components/PageTransition';
|
|
31
|
+
export { Progress, ProgressSuccess, ProgressWarning, ProgressError, ProgressInfo, ProgressCard, ProgressGroup } from './components/Progress';
|
|
32
|
+
export { Pagination, PaginationOutlined, PaginationMinimal, PaginationWithInfo } from './components/Pagination';
|
|
33
|
+
export { Popover, PopoverTrigger, PopoverContent } from './components/Popover';
|
|
34
|
+
export { Radio } from './components/Radio';
|
|
35
|
+
export { ScrollArea } from './components/ScrollArea';
|
|
36
|
+
export { ScrollIndicator } from './components/ScrollIndicator';
|
|
37
|
+
export { ScrollProgress } from './components/ScrollProgress';
|
|
38
|
+
export { ScrollToTop } from './components/ScrollToTop';
|
|
39
|
+
export { Select, SelectOption } from './components/Select';
|
|
40
|
+
export { Skeleton, SkeletonText, SkeletonCircle, SkeletonRectangle, SkeletonRounded, SkeletonCard, SkeletonAvatar, SkeletonList, SkeletonTable } from './components/Skeleton';
|
|
41
|
+
export { Stack } from './components/Stack';
|
|
42
|
+
export { Switch } from './components/Switch';
|
|
43
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent, TabsPills, TabsUnderline, TabsCards } from './components/Tabs';
|
|
44
|
+
export { Textarea } from './components/Textarea';
|
|
45
|
+
export { ThemeProvider } from './components/ThemeProvider';
|
|
46
|
+
export { ThemeToggle } from './components/ThemeToggle';
|
|
47
|
+
export { Tooltip, TooltipLight, TooltipDark } from './components/Tooltip';
|
|
48
|
+
export { ToastProvider, useToast } from './components/Toast';
|
|
49
|
+
export type { Toast } from './components/Toast';
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// UI Components
|
|
2
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from './components/Accordion';
|
|
3
|
+
export { Alert, AlertSuccess, AlertWarning, AlertError, AlertInfo } from './components/Alert';
|
|
4
|
+
export { Avatar, AvatarImage, AvatarFallback } from './components/Avatar';
|
|
5
|
+
export { Badge } from './components/Badge';
|
|
6
|
+
export { BottomSheet } from './components/BottomSheet';
|
|
7
|
+
export { Breadcrumb } from './components/Breadcrumb';
|
|
8
|
+
export { Button } from './components/Button';
|
|
9
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } from './components/Card';
|
|
10
|
+
export { ChatMessage } from './components/ChatMessage';
|
|
11
|
+
export { Checkbox } from './components/Checkbox';
|
|
12
|
+
export { ConfirmModal } from './components/ConfirmModal';
|
|
13
|
+
export { Container } from './components/Container';
|
|
14
|
+
export { Divider } from './components/Divider';
|
|
15
|
+
export { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } from './components/Dropdown';
|
|
16
|
+
export { Drawer } from './components/Drawer';
|
|
17
|
+
export { Menu, MenuItem, MenuSeparator, MenuLabel, MenuHorizontal, MenuVertical, MenuCompact } from './components/Menu';
|
|
18
|
+
export { ContextMenu, ContextMenuItem, ContextMenuSeparator, ContextMenuLabel, ContextMenuGroup } from './components/ContextMenu';
|
|
19
|
+
export { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandSeparator, CommandEmpty, CommandDialog } from './components/Command';
|
|
20
|
+
export { EmotionAnalysis } from './components/EmotionAnalysis';
|
|
21
|
+
export { EmotionButton } from './components/EmotionButton';
|
|
22
|
+
export { EmotionMeter } from './components/EmotionMeter';
|
|
23
|
+
export { EmotionSelector } from './components/EmotionSelector';
|
|
24
|
+
export { Grid } from './components/Grid';
|
|
25
|
+
export { Icon } from './components/Icon';
|
|
26
|
+
export { iconCategories, emotionIcons, statusIcons } from './lib/icons';
|
|
27
|
+
export { Input } from './components/Input';
|
|
28
|
+
export { LanguageToggle } from './components/LanguageToggle';
|
|
29
|
+
export { LoadingSpinner } from './components/LoadingSpinner';
|
|
30
|
+
export { Modal } from './components/Modal';
|
|
31
|
+
export { PageTransition } from './components/PageTransition';
|
|
32
|
+
export { Progress, ProgressSuccess, ProgressWarning, ProgressError, ProgressInfo, ProgressCard, ProgressGroup } from './components/Progress';
|
|
33
|
+
export { Pagination, PaginationOutlined, PaginationMinimal, PaginationWithInfo } from './components/Pagination';
|
|
34
|
+
export { Popover, PopoverTrigger, PopoverContent } from './components/Popover';
|
|
35
|
+
export { Radio } from './components/Radio';
|
|
36
|
+
export { ScrollArea } from './components/ScrollArea';
|
|
37
|
+
export { ScrollIndicator } from './components/ScrollIndicator';
|
|
38
|
+
export { ScrollProgress } from './components/ScrollProgress';
|
|
39
|
+
export { ScrollToTop } from './components/ScrollToTop';
|
|
40
|
+
export { Select, SelectOption } from './components/Select';
|
|
41
|
+
export { Skeleton, SkeletonText, SkeletonCircle, SkeletonRectangle, SkeletonRounded, SkeletonCard, SkeletonAvatar, SkeletonList, SkeletonTable } from './components/Skeleton';
|
|
42
|
+
export { Stack } from './components/Stack';
|
|
43
|
+
export { Switch } from './components/Switch';
|
|
44
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent, TabsPills, TabsUnderline, TabsCards } from './components/Tabs';
|
|
45
|
+
export { Textarea } from './components/Textarea';
|
|
46
|
+
export { ThemeProvider } from './components/ThemeProvider';
|
|
47
|
+
export { ThemeToggle } from './components/ThemeToggle';
|
|
48
|
+
export { Tooltip, TooltipLight, TooltipDark } from './components/Tooltip';
|
|
49
|
+
export { ToastProvider, useToast } from './components/Toast';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { LucideIcon } from 'lucide-react';
|
|
2
|
+
export declare const icons: Record<string, LucideIcon>;
|
|
3
|
+
export type IconName = keyof typeof icons;
|
|
4
|
+
export declare const iconCategories: {
|
|
5
|
+
readonly navigation: readonly ["home", "menu", "close", "search", "settings", "user", "bell", "map", "mapPin", "navigation", "compass", "globe", "flag", "sidebar"];
|
|
6
|
+
readonly actions: readonly ["edit", "delete", "add", "remove", "check", "share", "download", "upload", "save", "undo", "redo", "copy", "scissors", "mousePointer", "toggleLeft"];
|
|
7
|
+
readonly communication: readonly ["message", "phone", "mail", "send", "reply", "forward", "messageSquare", "phoneCall", "mailOpen"];
|
|
8
|
+
readonly media: readonly ["play", "pause", "skipBack", "skipForward", "volume", "mute", "music", "video", "image", "camera", "mic", "headphones"];
|
|
9
|
+
readonly emotions: readonly ["smile", "frown", "meh", "laugh", "angry"];
|
|
10
|
+
readonly feedback: readonly ["thumbsUp", "thumbsDown", "success", "error", "warning", "info", "heart", "star", "bookmark"];
|
|
11
|
+
readonly data: readonly ["chart", "pieChart", "trendingUp", "trendingDown", "activity", "database", "barChart", "lineChart"];
|
|
12
|
+
readonly status: readonly ["loader", "refresh", "lock", "unlock", "eye", "eyeOff", "shield", "battery", "wifi"];
|
|
13
|
+
readonly weather: readonly ["sun", "moon", "cloud", "rain", "cloudSnow", "cloudLightning", "wind", "thermometer"];
|
|
14
|
+
readonly finance: readonly ["creditCard", "dollarSign", "euro", "poundSterling", "bitcoin", "shoppingCart", "wallet", "calculator"];
|
|
15
|
+
readonly business: readonly ["briefcase", "building", "users", "userPlus", "userCheck", "userCog"];
|
|
16
|
+
readonly files: readonly ["fileText", "fileImage", "fileVideo", "folder", "fileCheck", "bookOpen"];
|
|
17
|
+
readonly social: readonly ["facebook", "twitter", "instagram", "linkedin", "youtube", "github", "slack"];
|
|
18
|
+
readonly mobile: readonly ["smartphone", "tablet", "monitor", "laptop", "bluetooth", "signal", "fullscreen"];
|
|
19
|
+
readonly editing: readonly ["type", "bold", "italic", "underline", "alignLeft", "alignCenter", "list", "listOrdered", "palette", "layers", "square"];
|
|
20
|
+
readonly time: readonly ["clock", "timer", "calendar", "calendarDays", "calendarCheck", "calendarClock"];
|
|
21
|
+
};
|
|
22
|
+
export declare const emotionIcons: {
|
|
23
|
+
readonly happy: "smile";
|
|
24
|
+
readonly sad: "frown";
|
|
25
|
+
readonly neutral: "meh";
|
|
26
|
+
readonly excited: "laugh";
|
|
27
|
+
readonly angry: "angry";
|
|
28
|
+
readonly love: "heart";
|
|
29
|
+
readonly like: "thumbsUp";
|
|
30
|
+
readonly dislike: "thumbsDown";
|
|
31
|
+
};
|
|
32
|
+
export declare const statusIcons: {
|
|
33
|
+
readonly loading: "loader";
|
|
34
|
+
readonly success: "success";
|
|
35
|
+
readonly error: "error";
|
|
36
|
+
readonly warning: "warning";
|
|
37
|
+
readonly info: "info";
|
|
38
|
+
readonly locked: "lock";
|
|
39
|
+
readonly unlocked: "unlock";
|
|
40
|
+
readonly visible: "eye";
|
|
41
|
+
readonly hidden: "eyeOff";
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/lib/icons.ts"],"names":[],"mappings":"AAAA,OAAO,EA6RL,UAAU,EAYX,MAAM,cAAc,CAAA;AAGrB,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAwQ5C,CAAA;AAGD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAA;AAGzC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;CAiBjB,CAAA;AAGV,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAA;AAGV,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAA"}
|