@hua-labs/ui 2.0.1 → 2.1.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/README.md +1 -1
- package/dist/{Switch-O4TpMKfQ.d.mts → Switch-Dzm5TLR3.d.mts} +1 -1
- package/dist/advanced/dashboard.d.ts.map +1 -1
- package/dist/advanced-dashboard.js +1 -1
- package/dist/advanced-dashboard.js.map +1 -1
- package/dist/advanced-dashboard.mjs +1 -1
- package/dist/advanced-emotion.js +1 -1
- package/dist/advanced-emotion.js.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.js +5 -5
- package/dist/advanced-motion.js.map +1 -1
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.js +7 -7
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +1 -1
- package/dist/chunk-BXX2TZUB.mjs +3 -0
- package/dist/chunk-BXX2TZUB.mjs.map +1 -0
- package/dist/{chunk-ECLIPN34.mjs → chunk-COR6CDMA.mjs} +3 -3
- package/dist/{chunk-ECLIPN34.mjs.map → chunk-COR6CDMA.mjs.map} +1 -1
- package/dist/chunk-HN5LSP6L.mjs +3 -0
- package/dist/chunk-HN5LSP6L.mjs.map +1 -0
- package/dist/{chunk-T3GU5BJ3.mjs → chunk-LOYAJIWO.mjs} +2 -2
- package/dist/{chunk-T3GU5BJ3.mjs.map → chunk-LOYAJIWO.mjs.map} +1 -1
- package/dist/{chunk-TOANBEPN.mjs → chunk-NBJUE7NR.mjs} +2 -2
- package/dist/{chunk-TOANBEPN.mjs.map → chunk-NBJUE7NR.mjs.map} +1 -1
- package/dist/{chunk-5BMH7223.mjs → chunk-PYBYZVSL.mjs} +2 -2
- package/dist/{chunk-5BMH7223.mjs.map → chunk-PYBYZVSL.mjs.map} +1 -1
- package/dist/{chunk-PQ3DBOMK.mjs → chunk-QQCELXFD.mjs} +2 -2
- package/dist/{chunk-PQ3DBOMK.mjs.map → chunk-QQCELXFD.mjs.map} +1 -1
- package/dist/{chunk-OI66ZLUB.mjs → chunk-UWHCM3S6.mjs} +2 -2
- package/dist/{chunk-OI66ZLUB.mjs.map → chunk-UWHCM3S6.mjs.map} +1 -1
- package/dist/{chunk-MYFMKCYX.mjs → chunk-XV3Y7QVU.mjs} +2 -2
- package/dist/{chunk-MYFMKCYX.mjs.map → chunk-XV3Y7QVU.mjs.map} +1 -1
- package/dist/components/Avatar.d.ts +1 -1
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Badge.d.ts.map +1 -1
- package/dist/components/Button.variants.d.ts +1 -1
- package/dist/components/Button.variants.d.ts.map +1 -1
- package/dist/components/Card.d.ts +1 -1
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/CodeBlock.d.ts +1 -1
- package/dist/components/Container.d.ts +1 -1
- package/dist/components/Container.d.ts.map +1 -1
- package/dist/components/Grid.d.ts +1 -1
- package/dist/components/Grid.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Input.d.ts +1 -1
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Label.d.ts +1 -1
- package/dist/components/Label.d.ts.map +1 -1
- package/dist/components/Link.d.ts +1 -1
- package/dist/components/Link.d.ts.map +1 -1
- package/dist/components/Panel.d.ts +1 -1
- package/dist/components/Panel.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +2 -2
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Select.d.ts +1 -1
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Skeleton.d.ts +1 -1
- package/dist/components/Skeleton.d.ts.map +1 -1
- package/dist/components/Stack.d.ts +1 -1
- package/dist/components/Stack.d.ts.map +1 -1
- package/dist/components/Textarea.d.ts +1 -1
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/icons/essential.d.ts +68 -0
- package/dist/components/icons/essential.d.ts.map +1 -0
- package/dist/components/icons-bold/essential.d.ts +68 -0
- package/dist/components/icons-bold/essential.d.ts.map +1 -0
- package/dist/data.d.mts +1 -1
- package/dist/data.js.map +1 -1
- package/dist/data.mjs.map +1 -1
- package/dist/form.d.mts +1 -1
- package/dist/form.js +1 -1
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +1 -1
- package/dist/iconsax-extended.d.ts +19 -0
- package/dist/iconsax-extended.d.ts.map +1 -0
- package/dist/iconsax-extended.js +3 -0
- package/dist/iconsax-extended.js.map +1 -0
- package/dist/iconsax-extended.mjs +4 -0
- package/dist/iconsax-extended.mjs.map +1 -0
- package/dist/iconsax.d.ts +10 -11
- package/dist/iconsax.d.ts.map +1 -1
- package/dist/iconsax.js +2 -2
- package/dist/iconsax.js.map +1 -1
- package/dist/iconsax.mjs +2 -2
- package/dist/iconsax.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/interactive.js +1 -1
- package/dist/interactive.js.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/lib/iconsax-loader.d.ts +15 -45
- package/dist/lib/iconsax-loader.d.ts.map +1 -1
- package/dist/navigation.js +2 -2
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/overlay.js +1 -1
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.mjs +1 -1
- package/dist/sdui.js +3 -3
- package/dist/sdui.js.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/package.json +23 -7
- package/src/components/icons/essential.ts +195 -0
- package/src/components/icons-bold/essential.ts +195 -0
- package/LICENSE +0 -21
- package/dist/chunk-AANHUMJ2.mjs +0 -3
- package/dist/chunk-AANHUMJ2.mjs.map +0 -1
- package/dist/chunk-FSL373O6.mjs +0 -3
- package/dist/chunk-FSL373O6.mjs.map +0 -1
- package/dist/components/icons/Frame2.d.ts +0 -4
- package/dist/components/icons/Frame2.d.ts.map +0 -1
- package/dist/components/icons/Group.d.ts +0 -4
- package/dist/components/icons/Group.d.ts.map +0 -1
- package/dist/components/icons/Group1.d.ts +0 -4
- package/dist/components/icons/Group1.d.ts.map +0 -1
- package/dist/components/icons/GroupCopy.d.ts +0 -4
- package/dist/components/icons/GroupCopy.d.ts.map +0 -1
- package/dist/iconsax.d.mts +0 -160
- package/src/components/icons/Frame2.tsx +0 -28
- package/src/components/icons/Group.tsx +0 -35
- package/src/components/icons/Group1.tsx +0 -21
- package/src/components/icons/GroupCopy.tsx +0 -21
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iconsax Essential Icons (Line variant)
|
|
3
|
+
* PROJECT_ICONS에서 iconsax 매핑된 아이콘만 포함 (57개)
|
|
4
|
+
* Auto-generated - do not edit manually
|
|
5
|
+
*/
|
|
6
|
+
import type { ComponentType, SVGProps } from 'react';
|
|
7
|
+
export type IconsaxIcon = ComponentType<SVGProps<SVGSVGElement>>;
|
|
8
|
+
import Add from './Add';
|
|
9
|
+
import ArrowDown from './ArrowDown';
|
|
10
|
+
import ArrowDown2 from './ArrowDown2';
|
|
11
|
+
import ArrowLeft from './ArrowLeft';
|
|
12
|
+
import ArrowLeft2 from './ArrowLeft2';
|
|
13
|
+
import ArrowRight from './ArrowRight';
|
|
14
|
+
import ArrowRight2 from './ArrowRight2';
|
|
15
|
+
import ArrowUp from './ArrowUp';
|
|
16
|
+
import ArrowUp2 from './ArrowUp2';
|
|
17
|
+
import Book from './Book';
|
|
18
|
+
import Camera from './Camera';
|
|
19
|
+
import Check from './Check';
|
|
20
|
+
import Chrome from './Chrome';
|
|
21
|
+
import CloseCircle from './CloseCircle';
|
|
22
|
+
import Code from './Code';
|
|
23
|
+
import Computing from './Computing';
|
|
24
|
+
import Danger from './Danger';
|
|
25
|
+
import EmojiHappy from './EmojiHappy';
|
|
26
|
+
import EmojiNormal from './EmojiNormal';
|
|
27
|
+
import EmojiSad from './EmojiSad';
|
|
28
|
+
import Eye from './Eye';
|
|
29
|
+
import EyeSlash from './EyeSlash';
|
|
30
|
+
import Flag from './Flag';
|
|
31
|
+
import Folder from './Folder';
|
|
32
|
+
import Global from './Global';
|
|
33
|
+
import Heart from './Heart';
|
|
34
|
+
import Home2 from './Home2';
|
|
35
|
+
import Image from './Image';
|
|
36
|
+
import InfoCircle from './InfoCircle';
|
|
37
|
+
import Link from './Link';
|
|
38
|
+
import Lock from './Lock';
|
|
39
|
+
import Login from './Login';
|
|
40
|
+
import Logout from './Logout';
|
|
41
|
+
import Menu from './Menu';
|
|
42
|
+
import Minus from './Minus';
|
|
43
|
+
import Monitor from './Monitor';
|
|
44
|
+
import Moon from './Moon';
|
|
45
|
+
import Pause from './Pause';
|
|
46
|
+
import People from './People';
|
|
47
|
+
import Play from './Play';
|
|
48
|
+
import QuoteUp from './QuoteUp';
|
|
49
|
+
import Refresh from './Refresh';
|
|
50
|
+
import SearchNormal from './SearchNormal';
|
|
51
|
+
import Shield from './Shield';
|
|
52
|
+
import Star from './Star';
|
|
53
|
+
import Sticker from './Sticker';
|
|
54
|
+
import Sun from './Sun';
|
|
55
|
+
import TickCircle from './TickCircle';
|
|
56
|
+
import Ticket from './Ticket';
|
|
57
|
+
import TickSquare from './TickSquare';
|
|
58
|
+
import Trash from './Trash';
|
|
59
|
+
import Unlock from './Unlock';
|
|
60
|
+
import User from './User';
|
|
61
|
+
import UserAdd from './UserAdd';
|
|
62
|
+
import Video from './Video';
|
|
63
|
+
import Warning2 from './Warning2';
|
|
64
|
+
import Wifi from './Wifi';
|
|
65
|
+
export declare const ESSENTIAL_ICONSAX_ICONS: Record<string, IconsaxIcon>;
|
|
66
|
+
export declare function getEssentialIconsaxIcon(name: string): IconsaxIcon | null;
|
|
67
|
+
export { Add, ArrowDown, ArrowDown2, ArrowLeft, ArrowLeft2, ArrowRight, ArrowRight2, ArrowUp, ArrowUp2, Book, Camera, Check, Chrome, CloseCircle, Code, Computing, Danger, EmojiHappy, EmojiNormal, EmojiSad, Eye, EyeSlash, Flag, Folder, Global, Heart, Home2, Image, InfoCircle, Link, Lock, Login, Logout, Menu, Minus, Monitor, Moon, Pause, People, Play, QuoteUp, Refresh, SearchNormal, Shield, Star, Sticker, Sun, TickCircle, Ticket, TickSquare, Trash, Unlock, User, UserAdd, Video, Warning2, Wifi, };
|
|
68
|
+
//# sourceMappingURL=essential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"essential.d.ts","sourceRoot":"","sources":["../../../src/components/icons/essential.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iconsax Essential Bold Icons
|
|
3
|
+
* PROJECT_ICONS에서 iconsax 매핑된 아이콘만 포함 (57개)
|
|
4
|
+
* Auto-generated - do not edit manually
|
|
5
|
+
*/
|
|
6
|
+
import type { ComponentType, SVGProps } from 'react';
|
|
7
|
+
export type IconsaxBoldIcon = ComponentType<SVGProps<SVGSVGElement>>;
|
|
8
|
+
import { Add } from './Add';
|
|
9
|
+
import { ArrowDown } from './ArrowDown';
|
|
10
|
+
import { ArrowDown2 } from './ArrowDown2';
|
|
11
|
+
import { ArrowLeft } from './ArrowLeft';
|
|
12
|
+
import { ArrowLeft2 } from './ArrowLeft2';
|
|
13
|
+
import { ArrowRight } from './ArrowRight';
|
|
14
|
+
import { ArrowRight2 } from './ArrowRight2';
|
|
15
|
+
import { ArrowUp } from './ArrowUp';
|
|
16
|
+
import { ArrowUp2 } from './ArrowUp2';
|
|
17
|
+
import { Book } from './Book';
|
|
18
|
+
import { Camera } from './Camera';
|
|
19
|
+
import { Check } from './Check';
|
|
20
|
+
import { Chrome } from './Chrome';
|
|
21
|
+
import { CloseCircle } from './CloseCircle';
|
|
22
|
+
import { Code } from './Code';
|
|
23
|
+
import { Computing } from './Computing';
|
|
24
|
+
import { Danger } from './Danger';
|
|
25
|
+
import { EmojiHappy } from './EmojiHappy';
|
|
26
|
+
import { EmojiNormal } from './EmojiNormal';
|
|
27
|
+
import { EmojiSad } from './EmojiSad';
|
|
28
|
+
import { Eye } from './Eye';
|
|
29
|
+
import { EyeSlash } from './EyeSlash';
|
|
30
|
+
import { Flag } from './Flag';
|
|
31
|
+
import { Folder } from './Folder';
|
|
32
|
+
import { Global } from './Global';
|
|
33
|
+
import { Heart } from './Heart';
|
|
34
|
+
import { Home2 } from './Home2';
|
|
35
|
+
import { Image } from './Image';
|
|
36
|
+
import { InfoCircle } from './InfoCircle';
|
|
37
|
+
import { Link } from './Link';
|
|
38
|
+
import { Lock } from './Lock';
|
|
39
|
+
import { Login } from './Login';
|
|
40
|
+
import { Logout } from './Logout';
|
|
41
|
+
import { Menu } from './Menu';
|
|
42
|
+
import { Minus } from './Minus';
|
|
43
|
+
import { Monitor } from './Monitor';
|
|
44
|
+
import { Moon } from './Moon';
|
|
45
|
+
import { Pause } from './Pause';
|
|
46
|
+
import { People } from './People';
|
|
47
|
+
import { Play } from './Play';
|
|
48
|
+
import { QuoteUp } from './QuoteUp';
|
|
49
|
+
import { Refresh } from './Refresh';
|
|
50
|
+
import { SearchNormal } from './SearchNormal';
|
|
51
|
+
import { Shield } from './Shield';
|
|
52
|
+
import { Star } from './Star';
|
|
53
|
+
import { Sticker } from './Sticker';
|
|
54
|
+
import { Sun } from './Sun';
|
|
55
|
+
import { TickCircle } from './TickCircle';
|
|
56
|
+
import { Ticket } from './Ticket';
|
|
57
|
+
import { TickSquare } from './TickSquare';
|
|
58
|
+
import { Trash } from './Trash';
|
|
59
|
+
import { Unlock } from './Unlock';
|
|
60
|
+
import { User } from './User';
|
|
61
|
+
import { UserAdd } from './UserAdd';
|
|
62
|
+
import { Video } from './Video';
|
|
63
|
+
import { Warning2 } from './Warning2';
|
|
64
|
+
import { Wifi } from './Wifi';
|
|
65
|
+
export declare const ESSENTIAL_ICONSAX_BOLD_ICONS: Record<string, IconsaxBoldIcon>;
|
|
66
|
+
export declare function getEssentialIconsaxBoldIcon(name: string): IconsaxBoldIcon | null;
|
|
67
|
+
export { Add, ArrowDown, ArrowDown2, ArrowLeft, ArrowLeft2, ArrowRight, ArrowRight2, ArrowUp, ArrowUp2, Book, Camera, Check, Chrome, CloseCircle, Code, Computing, Danger, EmojiHappy, EmojiNormal, EmojiSad, Eye, EyeSlash, Flag, Folder, Global, Heart, Home2, Image, InfoCircle, Link, Lock, Login, Logout, Menu, Minus, Monitor, Moon, Pause, People, Play, QuoteUp, Refresh, SearchNormal, Shield, Star, Sticker, Sun, TickCircle, Ticket, TickSquare, Trash, Unlock, User, UserAdd, Video, Warning2, Wifi, };
|
|
68
|
+
//# sourceMappingURL=essential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"essential.d.ts","sourceRoot":"","sources":["../../../src/components/icons-bold/essential.ts"],"names":[],"mappings":"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"}
|
package/dist/data.d.mts
CHANGED
package/dist/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Table.tsx","../src/components/CodeBlock.tsx"],"names":["merge","inputs","twMerge","clsx","Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","CodeBlock","code","language","filename","showLineNumbers","showCopyButton","onCopy","_copySuccessMessage","maxHeight","theme","copied","setCopied","useState","handleCopy","useCallback","err","lines","highlightedLines","useMemo","line","highlight","highlightedCode","isDark","jsxs","CopyButton","i","onClick","CheckIcon","CopyIcon","InlineCode","children"],"mappings":"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","file":"data.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-border divide-x divide-border\"\n case \"striped\":\n return \"divide-y divide-border\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-muted/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React, { useState, useCallback, useMemo } from \"react\"\nimport { highlight } from \"sugar-high\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * CodeBlock 컴포넌트 Props\n */\nexport interface CodeBlockProps {\n /** 표시할 코드 */\n code: string\n /** 프로그래밍 언어 (표시용) */\n language?: string\n /** 파일명 (헤더에 표시) */\n filename?: string\n /** 줄 번호 표시 여부 */\n showLineNumbers?: boolean\n /** 복사 버튼 표시 여부 */\n showCopyButton?: boolean\n /** 복사 성공 시 콜백 */\n onCopy?: () => void\n /** 복사 성공 메시지 */\n copySuccessMessage?: string\n /** 추가 className */\n className?: string\n /** 최대 높이 (스크롤) */\n maxHeight?: string | number\n /** 테마 (기본: dark) */\n theme?: \"dark\" | \"light\"\n}\n\n/**\n * CodeBlock 컴포넌트\n *\n * 코드를 표시하고 복사 기능을 제공하는 컴포넌트입니다.\n * Sugar-high를 사용한 신택스 하이라이팅을 지원합니다.\n *\n * @remarks\n * 신택스 하이라이팅을 위해 CSS 파일을 import하세요:\n * ```tsx\n * import '@hua-labs/ui/styles/codeblock.css';\n * ```\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <CodeBlock code=\"console.log('Hello')\" language=\"javascript\" />\n *\n * // 파일명 표시\n * <CodeBlock\n * code={configCode}\n * language=\"typescript\"\n * filename=\"hua-ux.config.ts\"\n * />\n *\n * // Toast와 함께 사용\n * const { addToast } = useToast()\n * <CodeBlock\n * code={code}\n * onCopy={() => addToast({ type: 'success', message: 'Copied!' })}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n showCopyButton = true,\n onCopy,\n copySuccessMessage: _copySuccessMessage = \"Copied!\",\n className,\n maxHeight,\n theme = \"dark\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n onCopy?.()\n\n // 2초 후 복사 상태 리셋\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }, [code, onCopy])\n\n const lines = code.split(\"\\n\")\n\n // 신택스 하이라이팅\n const highlightedLines = useMemo(() => {\n return lines.map(line => highlight(line) || \" \")\n }, [lines])\n\n const highlightedCode = useMemo(() => highlight(code), [code])\n\n const isDark = theme === \"dark\"\n\n return (\n <div\n className={merge(\n \"group relative rounded-lg overflow-hidden\",\n isDark\n ? \"bg-[#0d1117] border border-[#30363d]\"\n : \"bg-muted/50 border border-border\",\n className\n )}\n >\n {/* 헤더 - 항상 표시 */}\n <div className={merge(\n \"flex items-center justify-between px-4 py-2.5 border-b\",\n isDark\n ? \"bg-[#161b22] border-[#30363d]\"\n : \"bg-muted/30 border-border\"\n )}>\n <div className=\"flex items-center gap-3\">\n {/* Traffic lights (macOS 스타일) */}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-3 h-3 rounded-full bg-[#ff5f56]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#ffbd2e]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#27c93f]\" />\n </div>\n {filename && (\n <span className={merge(\n \"text-sm font-medium\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {filename}\n </span>\n )}\n {language && !filename && (\n <span className={merge(\n \"text-xs uppercase tracking-wider\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n {language && filename && (\n <span className={merge(\n \"text-xs\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n </div>\n {showCopyButton && (\n <CopyButton copied={copied} onClick={handleCopy} theme={theme} />\n )}\n </div>\n\n {/* 코드 영역 */}\n <div\n className=\"overflow-auto\"\n style={{ maxHeight: maxHeight }}\n >\n <pre className={merge(\n \"p-4 text-sm leading-7 overflow-x-auto\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {showLineNumbers ? (\n <code className=\"block font-mono\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className={merge(\n \"select-none w-8 text-right mr-4 flex-shrink-0\",\n isDark ? \"text-[#484f58]\" : \"text-muted-foreground\"\n )}>\n {i + 1}\n </span>\n <span\n dangerouslySetInnerHTML={{ __html: highlightedLines[i] }}\n />\n </div>\n ))}\n </code>\n ) : (\n <code\n className=\"font-mono whitespace-pre\"\n dangerouslySetInnerHTML={{ __html: highlightedCode }}\n />\n )}\n </pre>\n </div>\n\n </div>\n )\n}\n\n/**\n * 복사 버튼 컴포넌트 (아이콘만)\n */\nfunction CopyButton({\n copied,\n onClick,\n theme = \"dark\"\n}: {\n copied: boolean\n onClick: () => void\n theme?: \"dark\" | \"light\"\n}) {\n const isDark = theme === \"dark\"\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={merge(\n \"inline-flex items-center justify-center w-8 h-8 rounded-md transition-all duration-200\",\n copied\n ? isDark\n ? \"bg-green-500/20 text-green-400\"\n : \"bg-green-100 text-green-700\"\n : isDark\n ? \"bg-transparent hover:bg-[#30363d] text-[#8b949e] hover:text-[#c9d1d9]\"\n : \"bg-transparent hover:bg-secondary/80 text-muted-foreground hover:text-foreground\"\n )}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <CopyIcon className=\"w-4 h-4\" />\n )}\n </button>\n )\n}\n\n/**\n * 복사 아이콘\n */\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/**\n * 체크 아이콘\n */\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/**\n * 인라인 코드 컴포넌트\n *\n * 텍스트 내 인라인 코드 표시용\n *\n * @example\n * ```tsx\n * <p>Use the <InlineCode>npm install</InlineCode> command.</p>\n * ```\n */\nexport function InlineCode({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return (\n <code\n className={merge(\n \"px-1.5 py-0.5 rounded-md bg-muted text-sm font-mono text-foreground\",\n className\n )}\n >\n {children}\n </code>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Table.tsx","../src/components/CodeBlock.tsx"],"names":["merge","inputs","twMerge","clsx","Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","CodeBlock","code","language","filename","showLineNumbers","showCopyButton","onCopy","_copySuccessMessage","maxHeight","theme","copied","setCopied","useState","handleCopy","useCallback","err","lines","highlightedLines","useMemo","line","highlight","highlightedCode","isDark","jsxs","CopyButton","i","onClick","CheckIcon","CopyIcon","InlineCode","children"],"mappings":"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","file":"data.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-border divide-x divide-border\"\n case \"striped\":\n return \"divide-y divide-border\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-muted/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React, { useState, useCallback, useMemo } from \"react\"\nimport { highlight } from \"sugar-high\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * CodeBlock 컴포넌트 Props\n */\nexport interface CodeBlockProps {\n /** 표시할 코드 */\n code: string\n /** 프로그래밍 언어 (표시용) */\n language?: string\n /** 파일명 (헤더에 표시) */\n filename?: string\n /** 줄 번호 표시 여부 */\n showLineNumbers?: boolean\n /** 복사 버튼 표시 여부 */\n showCopyButton?: boolean\n /** 복사 성공 시 콜백 */\n onCopy?: () => void\n /** 복사 성공 메시지 */\n copySuccessMessage?: string\n /** 추가 className */\n className?: string\n /** 최대 높이 (스크롤) */\n maxHeight?: string | number\n /** 테마 (기본: dark) */\n theme?: \"dark\" | \"light\"\n}\n\n/**\n * CodeBlock 컴포넌트\n *\n * 코드를 표시하고 복사 기능을 제공하는 컴포넌트입니다.\n * Sugar-high를 사용한 신택스 하이라이팅을 지원합니다.\n *\n * @remarks\n * 신택스 하이라이팅을 위해 CSS 파일을 import하세요:\n * ```tsx\n * import '@hua-labs/ui/styles/codeblock.css';\n * ```\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <CodeBlock code=\"console.log('Hello')\" language=\"javascript\" />\n *\n * // 파일명 표시\n * <CodeBlock\n * code={configCode}\n * language=\"typescript\"\n * filename=\"hua.config.ts\"\n * />\n *\n * // Toast와 함께 사용\n * const { addToast } = useToast()\n * <CodeBlock\n * code={code}\n * onCopy={() => addToast({ type: 'success', message: 'Copied!' })}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n showCopyButton = true,\n onCopy,\n copySuccessMessage: _copySuccessMessage = \"Copied!\",\n className,\n maxHeight,\n theme = \"dark\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n onCopy?.()\n\n // 2초 후 복사 상태 리셋\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }, [code, onCopy])\n\n const lines = code.split(\"\\n\")\n\n // 신택스 하이라이팅\n const highlightedLines = useMemo(() => {\n return lines.map(line => highlight(line) || \" \")\n }, [lines])\n\n const highlightedCode = useMemo(() => highlight(code), [code])\n\n const isDark = theme === \"dark\"\n\n return (\n <div\n className={merge(\n \"group relative rounded-lg overflow-hidden\",\n isDark\n ? \"bg-[#0d1117] border border-[#30363d]\"\n : \"bg-muted/50 border border-border\",\n className\n )}\n >\n {/* 헤더 - 항상 표시 */}\n <div className={merge(\n \"flex items-center justify-between px-4 py-2.5 border-b\",\n isDark\n ? \"bg-[#161b22] border-[#30363d]\"\n : \"bg-muted/30 border-border\"\n )}>\n <div className=\"flex items-center gap-3\">\n {/* Traffic lights (macOS 스타일) */}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-3 h-3 rounded-full bg-[#ff5f56]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#ffbd2e]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#27c93f]\" />\n </div>\n {filename && (\n <span className={merge(\n \"text-sm font-medium\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {filename}\n </span>\n )}\n {language && !filename && (\n <span className={merge(\n \"text-xs uppercase tracking-wider\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n {language && filename && (\n <span className={merge(\n \"text-xs\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n </div>\n {showCopyButton && (\n <CopyButton copied={copied} onClick={handleCopy} theme={theme} />\n )}\n </div>\n\n {/* 코드 영역 */}\n <div\n className=\"overflow-auto\"\n style={{ maxHeight: maxHeight }}\n >\n <pre className={merge(\n \"p-4 text-sm leading-7 overflow-x-auto\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {showLineNumbers ? (\n <code className=\"block font-mono\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className={merge(\n \"select-none w-8 text-right mr-4 flex-shrink-0\",\n isDark ? \"text-[#484f58]\" : \"text-muted-foreground\"\n )}>\n {i + 1}\n </span>\n <span\n dangerouslySetInnerHTML={{ __html: highlightedLines[i] }}\n />\n </div>\n ))}\n </code>\n ) : (\n <code\n className=\"font-mono whitespace-pre\"\n dangerouslySetInnerHTML={{ __html: highlightedCode }}\n />\n )}\n </pre>\n </div>\n\n </div>\n )\n}\n\n/**\n * 복사 버튼 컴포넌트 (아이콘만)\n */\nfunction CopyButton({\n copied,\n onClick,\n theme = \"dark\"\n}: {\n copied: boolean\n onClick: () => void\n theme?: \"dark\" | \"light\"\n}) {\n const isDark = theme === \"dark\"\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={merge(\n \"inline-flex items-center justify-center w-8 h-8 rounded-md transition-all duration-200\",\n copied\n ? isDark\n ? \"bg-green-500/20 text-green-400\"\n : \"bg-green-100 text-green-700\"\n : isDark\n ? \"bg-transparent hover:bg-[#30363d] text-[#8b949e] hover:text-[#c9d1d9]\"\n : \"bg-transparent hover:bg-secondary/80 text-muted-foreground hover:text-foreground\"\n )}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <CopyIcon className=\"w-4 h-4\" />\n )}\n </button>\n )\n}\n\n/**\n * 복사 아이콘\n */\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/**\n * 체크 아이콘\n */\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/**\n * 인라인 코드 컴포넌트\n *\n * 텍스트 내 인라인 코드 표시용\n *\n * @example\n * ```tsx\n * <p>Use the <InlineCode>npm install</InlineCode> command.</p>\n * ```\n */\nexport function InlineCode({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return (\n <code\n className={merge(\n \"px-1.5 py-0.5 rounded-md bg-muted text-sm font-mono text-foreground\",\n className\n )}\n >\n {children}\n </code>\n )\n}\n"]}
|
package/dist/data.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/CodeBlock.tsx"],"names":["CodeBlock","code","language","filename","showLineNumbers","showCopyButton","onCopy","_copySuccessMessage","className","maxHeight","theme","copied","setCopied","useState","handleCopy","useCallback","err","lines","highlightedLines","useMemo","line","highlight","highlightedCode","isDark","jsxs","merge","jsx","CopyButton","i","onClick","CheckIcon","CopyIcon","InlineCode","children"],"mappings":"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","file":"data.mjs","sourcesContent":["\"use client\"\n\nimport React, { useState, useCallback, useMemo } from \"react\"\nimport { highlight } from \"sugar-high\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * CodeBlock 컴포넌트 Props\n */\nexport interface CodeBlockProps {\n /** 표시할 코드 */\n code: string\n /** 프로그래밍 언어 (표시용) */\n language?: string\n /** 파일명 (헤더에 표시) */\n filename?: string\n /** 줄 번호 표시 여부 */\n showLineNumbers?: boolean\n /** 복사 버튼 표시 여부 */\n showCopyButton?: boolean\n /** 복사 성공 시 콜백 */\n onCopy?: () => void\n /** 복사 성공 메시지 */\n copySuccessMessage?: string\n /** 추가 className */\n className?: string\n /** 최대 높이 (스크롤) */\n maxHeight?: string | number\n /** 테마 (기본: dark) */\n theme?: \"dark\" | \"light\"\n}\n\n/**\n * CodeBlock 컴포넌트\n *\n * 코드를 표시하고 복사 기능을 제공하는 컴포넌트입니다.\n * Sugar-high를 사용한 신택스 하이라이팅을 지원합니다.\n *\n * @remarks\n * 신택스 하이라이팅을 위해 CSS 파일을 import하세요:\n * ```tsx\n * import '@hua-labs/ui/styles/codeblock.css';\n * ```\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <CodeBlock code=\"console.log('Hello')\" language=\"javascript\" />\n *\n * // 파일명 표시\n * <CodeBlock\n * code={configCode}\n * language=\"typescript\"\n * filename=\"hua-ux.config.ts\"\n * />\n *\n * // Toast와 함께 사용\n * const { addToast } = useToast()\n * <CodeBlock\n * code={code}\n * onCopy={() => addToast({ type: 'success', message: 'Copied!' })}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n showCopyButton = true,\n onCopy,\n copySuccessMessage: _copySuccessMessage = \"Copied!\",\n className,\n maxHeight,\n theme = \"dark\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n onCopy?.()\n\n // 2초 후 복사 상태 리셋\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }, [code, onCopy])\n\n const lines = code.split(\"\\n\")\n\n // 신택스 하이라이팅\n const highlightedLines = useMemo(() => {\n return lines.map(line => highlight(line) || \" \")\n }, [lines])\n\n const highlightedCode = useMemo(() => highlight(code), [code])\n\n const isDark = theme === \"dark\"\n\n return (\n <div\n className={merge(\n \"group relative rounded-lg overflow-hidden\",\n isDark\n ? \"bg-[#0d1117] border border-[#30363d]\"\n : \"bg-muted/50 border border-border\",\n className\n )}\n >\n {/* 헤더 - 항상 표시 */}\n <div className={merge(\n \"flex items-center justify-between px-4 py-2.5 border-b\",\n isDark\n ? \"bg-[#161b22] border-[#30363d]\"\n : \"bg-muted/30 border-border\"\n )}>\n <div className=\"flex items-center gap-3\">\n {/* Traffic lights (macOS 스타일) */}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-3 h-3 rounded-full bg-[#ff5f56]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#ffbd2e]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#27c93f]\" />\n </div>\n {filename && (\n <span className={merge(\n \"text-sm font-medium\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {filename}\n </span>\n )}\n {language && !filename && (\n <span className={merge(\n \"text-xs uppercase tracking-wider\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n {language && filename && (\n <span className={merge(\n \"text-xs\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n </div>\n {showCopyButton && (\n <CopyButton copied={copied} onClick={handleCopy} theme={theme} />\n )}\n </div>\n\n {/* 코드 영역 */}\n <div\n className=\"overflow-auto\"\n style={{ maxHeight: maxHeight }}\n >\n <pre className={merge(\n \"p-4 text-sm leading-7 overflow-x-auto\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {showLineNumbers ? (\n <code className=\"block font-mono\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className={merge(\n \"select-none w-8 text-right mr-4 flex-shrink-0\",\n isDark ? \"text-[#484f58]\" : \"text-muted-foreground\"\n )}>\n {i + 1}\n </span>\n <span\n dangerouslySetInnerHTML={{ __html: highlightedLines[i] }}\n />\n </div>\n ))}\n </code>\n ) : (\n <code\n className=\"font-mono whitespace-pre\"\n dangerouslySetInnerHTML={{ __html: highlightedCode }}\n />\n )}\n </pre>\n </div>\n\n </div>\n )\n}\n\n/**\n * 복사 버튼 컴포넌트 (아이콘만)\n */\nfunction CopyButton({\n copied,\n onClick,\n theme = \"dark\"\n}: {\n copied: boolean\n onClick: () => void\n theme?: \"dark\" | \"light\"\n}) {\n const isDark = theme === \"dark\"\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={merge(\n \"inline-flex items-center justify-center w-8 h-8 rounded-md transition-all duration-200\",\n copied\n ? isDark\n ? \"bg-green-500/20 text-green-400\"\n : \"bg-green-100 text-green-700\"\n : isDark\n ? \"bg-transparent hover:bg-[#30363d] text-[#8b949e] hover:text-[#c9d1d9]\"\n : \"bg-transparent hover:bg-secondary/80 text-muted-foreground hover:text-foreground\"\n )}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <CopyIcon className=\"w-4 h-4\" />\n )}\n </button>\n )\n}\n\n/**\n * 복사 아이콘\n */\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/**\n * 체크 아이콘\n */\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/**\n * 인라인 코드 컴포넌트\n *\n * 텍스트 내 인라인 코드 표시용\n *\n * @example\n * ```tsx\n * <p>Use the <InlineCode>npm install</InlineCode> command.</p>\n * ```\n */\nexport function InlineCode({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return (\n <code\n className={merge(\n \"px-1.5 py-0.5 rounded-md bg-muted text-sm font-mono text-foreground\",\n className\n )}\n >\n {children}\n </code>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/CodeBlock.tsx"],"names":["CodeBlock","code","language","filename","showLineNumbers","showCopyButton","onCopy","_copySuccessMessage","className","maxHeight","theme","copied","setCopied","useState","handleCopy","useCallback","err","lines","highlightedLines","useMemo","line","highlight","highlightedCode","isDark","jsxs","merge","jsx","CopyButton","i","onClick","CheckIcon","CopyIcon","InlineCode","children"],"mappings":"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","file":"data.mjs","sourcesContent":["\"use client\"\n\nimport React, { useState, useCallback, useMemo } from \"react\"\nimport { highlight } from \"sugar-high\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * CodeBlock 컴포넌트 Props\n */\nexport interface CodeBlockProps {\n /** 표시할 코드 */\n code: string\n /** 프로그래밍 언어 (표시용) */\n language?: string\n /** 파일명 (헤더에 표시) */\n filename?: string\n /** 줄 번호 표시 여부 */\n showLineNumbers?: boolean\n /** 복사 버튼 표시 여부 */\n showCopyButton?: boolean\n /** 복사 성공 시 콜백 */\n onCopy?: () => void\n /** 복사 성공 메시지 */\n copySuccessMessage?: string\n /** 추가 className */\n className?: string\n /** 최대 높이 (스크롤) */\n maxHeight?: string | number\n /** 테마 (기본: dark) */\n theme?: \"dark\" | \"light\"\n}\n\n/**\n * CodeBlock 컴포넌트\n *\n * 코드를 표시하고 복사 기능을 제공하는 컴포넌트입니다.\n * Sugar-high를 사용한 신택스 하이라이팅을 지원합니다.\n *\n * @remarks\n * 신택스 하이라이팅을 위해 CSS 파일을 import하세요:\n * ```tsx\n * import '@hua-labs/ui/styles/codeblock.css';\n * ```\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <CodeBlock code=\"console.log('Hello')\" language=\"javascript\" />\n *\n * // 파일명 표시\n * <CodeBlock\n * code={configCode}\n * language=\"typescript\"\n * filename=\"hua.config.ts\"\n * />\n *\n * // Toast와 함께 사용\n * const { addToast } = useToast()\n * <CodeBlock\n * code={code}\n * onCopy={() => addToast({ type: 'success', message: 'Copied!' })}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n showCopyButton = true,\n onCopy,\n copySuccessMessage: _copySuccessMessage = \"Copied!\",\n className,\n maxHeight,\n theme = \"dark\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n onCopy?.()\n\n // 2초 후 복사 상태 리셋\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }, [code, onCopy])\n\n const lines = code.split(\"\\n\")\n\n // 신택스 하이라이팅\n const highlightedLines = useMemo(() => {\n return lines.map(line => highlight(line) || \" \")\n }, [lines])\n\n const highlightedCode = useMemo(() => highlight(code), [code])\n\n const isDark = theme === \"dark\"\n\n return (\n <div\n className={merge(\n \"group relative rounded-lg overflow-hidden\",\n isDark\n ? \"bg-[#0d1117] border border-[#30363d]\"\n : \"bg-muted/50 border border-border\",\n className\n )}\n >\n {/* 헤더 - 항상 표시 */}\n <div className={merge(\n \"flex items-center justify-between px-4 py-2.5 border-b\",\n isDark\n ? \"bg-[#161b22] border-[#30363d]\"\n : \"bg-muted/30 border-border\"\n )}>\n <div className=\"flex items-center gap-3\">\n {/* Traffic lights (macOS 스타일) */}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-3 h-3 rounded-full bg-[#ff5f56]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#ffbd2e]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#27c93f]\" />\n </div>\n {filename && (\n <span className={merge(\n \"text-sm font-medium\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {filename}\n </span>\n )}\n {language && !filename && (\n <span className={merge(\n \"text-xs uppercase tracking-wider\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n {language && filename && (\n <span className={merge(\n \"text-xs\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n </div>\n {showCopyButton && (\n <CopyButton copied={copied} onClick={handleCopy} theme={theme} />\n )}\n </div>\n\n {/* 코드 영역 */}\n <div\n className=\"overflow-auto\"\n style={{ maxHeight: maxHeight }}\n >\n <pre className={merge(\n \"p-4 text-sm leading-7 overflow-x-auto\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {showLineNumbers ? (\n <code className=\"block font-mono\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className={merge(\n \"select-none w-8 text-right mr-4 flex-shrink-0\",\n isDark ? \"text-[#484f58]\" : \"text-muted-foreground\"\n )}>\n {i + 1}\n </span>\n <span\n dangerouslySetInnerHTML={{ __html: highlightedLines[i] }}\n />\n </div>\n ))}\n </code>\n ) : (\n <code\n className=\"font-mono whitespace-pre\"\n dangerouslySetInnerHTML={{ __html: highlightedCode }}\n />\n )}\n </pre>\n </div>\n\n </div>\n )\n}\n\n/**\n * 복사 버튼 컴포넌트 (아이콘만)\n */\nfunction CopyButton({\n copied,\n onClick,\n theme = \"dark\"\n}: {\n copied: boolean\n onClick: () => void\n theme?: \"dark\" | \"light\"\n}) {\n const isDark = theme === \"dark\"\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={merge(\n \"inline-flex items-center justify-center w-8 h-8 rounded-md transition-all duration-200\",\n copied\n ? isDark\n ? \"bg-green-500/20 text-green-400\"\n : \"bg-green-100 text-green-700\"\n : isDark\n ? \"bg-transparent hover:bg-[#30363d] text-[#8b949e] hover:text-[#c9d1d9]\"\n : \"bg-transparent hover:bg-secondary/80 text-muted-foreground hover:text-foreground\"\n )}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <CopyIcon className=\"w-4 h-4\" />\n )}\n </button>\n )\n}\n\n/**\n * 복사 아이콘\n */\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/**\n * 체크 아이콘\n */\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/**\n * 인라인 코드 컴포넌트\n *\n * 텍스트 내 인라인 코드 표시용\n *\n * @example\n * ```tsx\n * <p>Use the <InlineCode>npm install</InlineCode> command.</p>\n * ```\n */\nexport function InlineCode({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return (\n <code\n className={merge(\n \"px-1.5 py-0.5 rounded-md bg-muted text-sm font-mono text-foreground\",\n className\n )}\n >\n {children}\n </code>\n )\n}\n"]}
|
package/dist/form.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
-
export { I as Input,
|
|
3
|
+
export { I as Input, a as InputProps, L as Label, b as LabelProps, N as NumberInput, c as NumberInputProps, S as Switch, d as SwitchProps } from './Switch-Dzm5TLR3.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Form 컴포넌트의 props / Form component props
|