@hua-labs/ui 2.1.1 → 2.2.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/{ComponentLayout-DrZpz0yv.d.mts → ComponentLayout-BhM4VSoq.d.mts} +1 -1
- package/dist/advanced-dashboard.d.mts +1 -1
- package/dist/advanced-dashboard.mjs +3 -3
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +9 -6
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +3 -3
- package/dist/advanced.mjs +2 -2
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-5DPW7SVD.mjs +4 -0
- package/dist/{chunk-AOSXB5JJ.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
- package/dist/chunk-5L5HIPKA.mjs +3 -0
- package/dist/{chunk-3GAUTZXQ.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
- package/dist/chunk-A5YOVVM5.mjs +3 -0
- package/dist/chunk-A5YOVVM5.mjs.map +1 -0
- package/dist/chunk-CNW22G24.mjs +13 -0
- package/dist/chunk-CNW22G24.mjs.map +1 -0
- package/dist/chunk-CW66UBQG.mjs +3 -0
- package/dist/{chunk-6HVJFEDA.mjs.map → chunk-CW66UBQG.mjs.map} +1 -1
- package/dist/chunk-EAZEI74V.mjs +3 -0
- package/dist/chunk-EAZEI74V.mjs.map +1 -0
- package/dist/chunk-EPY3432E.mjs +3 -0
- package/dist/{chunk-MDLCJASB.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
- package/dist/chunk-F2M4YDDQ.mjs +3 -0
- package/dist/{chunk-OZNST3EZ.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
- package/dist/chunk-FHMFDCX2.mjs +3 -0
- package/dist/{chunk-4NJE7D6X.mjs.map → chunk-FHMFDCX2.mjs.map} +1 -1
- package/dist/chunk-HBIUCLFL.mjs +3 -0
- package/dist/chunk-HBIUCLFL.mjs.map +1 -0
- package/dist/chunk-HEBXAFRY.mjs +3 -0
- package/dist/{chunk-KJZGOL2Z.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
- package/dist/chunk-IG47LMOD.mjs +3 -0
- package/dist/{chunk-42RGFEL2.mjs.map → chunk-IG47LMOD.mjs.map} +1 -1
- package/dist/chunk-J47ZEXEL.mjs +3 -0
- package/dist/{chunk-3CCF7U3P.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
- package/dist/chunk-K2FOFIST.mjs +3 -0
- package/dist/{chunk-IJSYSNM5.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
- package/dist/chunk-LL6QPRD7.mjs +3 -0
- package/dist/{chunk-TZ4YSHMC.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
- package/dist/chunk-NMJLOK6M.mjs +3 -0
- package/dist/{chunk-KYRIUUQP.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
- package/dist/chunk-O24K56OS.mjs +3 -0
- package/dist/chunk-O24K56OS.mjs.map +1 -0
- package/dist/chunk-OIWG3IJ7.mjs +3 -0
- package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
- package/dist/chunk-OLLU7ZFH.mjs +3 -0
- package/dist/{chunk-XL4KTJ4L.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
- package/dist/chunk-Q76JW7X5.mjs +73 -0
- package/dist/chunk-Q76JW7X5.mjs.map +1 -0
- package/dist/chunk-QEMPERUK.mjs +3 -0
- package/dist/chunk-QEMPERUK.mjs.map +1 -0
- package/dist/chunk-QRM66RQG.mjs +3 -0
- package/dist/{chunk-N56BUOCD.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
- package/dist/chunk-QRRP7TGF.mjs +13 -0
- package/dist/{chunk-RS6RKW5U.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
- package/dist/chunk-SD6XGDAC.mjs +3 -0
- package/dist/chunk-SD6XGDAC.mjs.map +1 -0
- package/dist/chunk-SDFVGFXT.mjs +3 -0
- package/dist/{chunk-CVWWS25A.mjs.map → chunk-SDFVGFXT.mjs.map} +1 -1
- package/dist/chunk-SMLDNOV3.mjs +8 -0
- package/dist/{chunk-ZXZIHU7J.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
- package/dist/{chunk-FX57OSYG.mjs → chunk-TAP6MYDW.mjs} +2 -2
- package/dist/{chunk-FX57OSYG.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
- package/dist/{chunk-WP7VFE77.mjs → chunk-TBZ645BI.mjs} +2 -2
- package/dist/{chunk-WP7VFE77.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
- package/dist/{chunk-TXBZZJNR.mjs → chunk-V2DNYJR6.mjs} +2 -2
- package/dist/{chunk-TXBZZJNR.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
- package/dist/{chunk-Z74YUUVT.mjs → chunk-VBABZXL7.mjs} +2 -2
- package/dist/{chunk-Z74YUUVT.mjs.map → chunk-VBABZXL7.mjs.map} +1 -1
- package/dist/chunk-WYBSHTGY.mjs +3 -0
- package/dist/{chunk-DYNBM24D.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
- package/dist/chunk-ZQUMJQYV.mjs +3 -0
- package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
- package/dist/chunk-ZY23NOT4.mjs +3 -0
- package/dist/chunk-ZY23NOT4.mjs.map +1 -0
- package/dist/components/Action.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +0 -50
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +2 -2
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/Carousel.d.ts.map +1 -1
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
- package/dist/components/advanced/Parallax.d.ts +9 -6
- package/dist/components/advanced/Parallax.d.ts.map +1 -1
- package/dist/components/advanced/TextReveal.d.ts.map +1 -1
- package/dist/data.mjs +2 -2
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.mjs +4 -4
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-DmhQEH_E.d.mts → icons-DcOBy9Hf.d.mts} +4 -0
- package/dist/iconsax-extended.mjs +2 -2
- package/dist/iconsax-extended.mjs.map +1 -1
- package/dist/index.d.mts +6 -87
- package/dist/index.mjs +14 -14
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing.mjs +7 -7
- package/dist/landing.mjs.map +1 -1
- package/dist/lib/icon-providers.d.ts +9 -25
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/lib/icons.d.ts +4 -0
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +0 -50
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/dist/theme.d.mts +85 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.mjs +3 -0
- package/dist/theme.mjs.map +1 -0
- package/package.json +18 -14
- package/dist/advanced-dashboard.js +0 -39
- package/dist/advanced-dashboard.js.map +0 -1
- package/dist/advanced-emotion.js +0 -2
- package/dist/advanced-emotion.js.map +0 -1
- package/dist/advanced-motion.js +0 -82
- package/dist/advanced-motion.js.map +0 -1
- package/dist/advanced.js +0 -112
- package/dist/advanced.js.map +0 -1
- package/dist/chunk-3CCF7U3P.mjs +0 -3
- package/dist/chunk-3GAUTZXQ.mjs +0 -3
- package/dist/chunk-42RGFEL2.mjs +0 -3
- package/dist/chunk-4NJE7D6X.mjs +0 -3
- package/dist/chunk-6HVJFEDA.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs.map +0 -1
- package/dist/chunk-ANYZ56VB.mjs +0 -3
- package/dist/chunk-ANYZ56VB.mjs.map +0 -1
- package/dist/chunk-AOSXB5JJ.mjs +0 -4
- package/dist/chunk-B544MRF7.mjs +0 -3
- package/dist/chunk-B544MRF7.mjs.map +0 -1
- package/dist/chunk-CVWWS25A.mjs +0 -3
- package/dist/chunk-DYNBM24D.mjs +0 -3
- package/dist/chunk-IJSYSNM5.mjs +0 -3
- package/dist/chunk-KJZGOL2Z.mjs +0 -3
- package/dist/chunk-KYRIUUQP.mjs +0 -3
- package/dist/chunk-LSA7DU3N.mjs +0 -73
- package/dist/chunk-LSA7DU3N.mjs.map +0 -1
- package/dist/chunk-MDLCJASB.mjs +0 -3
- package/dist/chunk-N56BUOCD.mjs +0 -3
- package/dist/chunk-OFYITQXI.mjs +0 -13
- package/dist/chunk-OFYITQXI.mjs.map +0 -1
- package/dist/chunk-OZNST3EZ.mjs +0 -3
- package/dist/chunk-RS6RKW5U.mjs +0 -13
- package/dist/chunk-TZ4YSHMC.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs.map +0 -1
- package/dist/chunk-XCZMLKPK.mjs +0 -3
- package/dist/chunk-XCZMLKPK.mjs.map +0 -1
- package/dist/chunk-XGHT7WMO.mjs +0 -3
- package/dist/chunk-XGHT7WMO.mjs.map +0 -1
- package/dist/chunk-XL4KTJ4L.mjs +0 -3
- package/dist/chunk-ZXZIHU7J.mjs +0 -8
- package/dist/data.js +0 -3
- package/dist/data.js.map +0 -1
- package/dist/feedback.js +0 -12
- package/dist/feedback.js.map +0 -1
- package/dist/form.js +0 -8
- package/dist/form.js.map +0 -1
- package/dist/iconsax-extended.js +0 -3
- package/dist/iconsax-extended.js.map +0 -1
- package/dist/iconsax.js +0 -3
- package/dist/iconsax.js.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive.js +0 -2
- package/dist/interactive.js.map +0 -1
- package/dist/landing.js +0 -100
- package/dist/landing.js.map +0 -1
- package/dist/lib/phosphor-icons.d.ts +0 -6
- package/dist/lib/phosphor-icons.d.ts.map +0 -1
- package/dist/navigation.js +0 -12
- package/dist/navigation.js.map +0 -1
- package/dist/overlay.js +0 -3
- package/dist/overlay.js.map +0 -1
- package/dist/sdui.js +0 -9
- package/dist/sdui.js.map +0 -1
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
*
|
|
6
6
|
* 1. Phosphor Icons (https://phosphoricons.com) - default
|
|
7
7
|
* - Official package: @phosphor-icons/react (MIT License)
|
|
8
|
-
* - icons.ts에서 정적 import (SSR-safe /dist/ssr)
|
|
8
|
+
* - icons.ts에서 정적 subpath import (SSR-safe /dist/ssr)
|
|
9
9
|
* - PROJECT_ICONS 매핑으로 통합 이름 지원
|
|
10
|
-
* -
|
|
10
|
+
* - 정적 맵에 없는 아이콘은 "?" fallback UI 표시
|
|
11
11
|
*
|
|
12
|
-
* 2.
|
|
13
|
-
* - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand
|
|
14
|
-
* - 향후 제거 예정 / Will be removed in future
|
|
15
|
-
*
|
|
16
|
-
* 3. Iconsax Icons (https://iconsax.io) - separate entry
|
|
12
|
+
* 2. Iconsax Icons (https://iconsax.io) - separate entry
|
|
17
13
|
* - '@hua-labs/ui/iconsax'에서 import 시 자동 등록
|
|
18
14
|
* - 코어 번들에 포함되지 않음 / Not in core bundle
|
|
19
15
|
* - registerIconsaxResolver()로 lazy 연결
|
|
16
|
+
*
|
|
17
|
+
* Note: Lucide provider는 deprecated → 제거됨.
|
|
18
|
+
* Note: 동적 barrel import (import('@phosphor-icons/react'))는 Turbopack에서
|
|
19
|
+
* 전체 라이브러리(4.6MB)를 번들하므로 사용 금지.
|
|
20
20
|
*/
|
|
21
21
|
declare let iconsaxResolver: ((name: string, variant?: string) => any) | null;
|
|
22
22
|
/**
|
|
@@ -612,29 +612,13 @@ export declare const PROJECT_ICONS: {
|
|
|
612
612
|
};
|
|
613
613
|
};
|
|
614
614
|
/**
|
|
615
|
-
*
|
|
616
|
-
* icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용
|
|
617
|
-
*/
|
|
618
|
-
export declare function initPhosphorIcons(): Promise<any>;
|
|
619
|
-
/**
|
|
620
|
-
* Initialize Lucide Icons (lazy load)
|
|
621
|
-
*/
|
|
622
|
-
export declare function initLucideIcons(): Promise<any>;
|
|
623
|
-
/**
|
|
624
|
-
* Get icon from provider
|
|
625
|
-
* Only resolves icons that are in PROJECT_ICONS for optimal bundle size
|
|
615
|
+
* Get icon from provider (iconsax only)
|
|
626
616
|
*
|
|
627
|
-
*
|
|
628
|
-
* @param provider - 아이콘 프로바이더 / Icon provider
|
|
629
|
-
* @returns 아이콘 컴포넌트 또는 null / Icon component or null
|
|
617
|
+
* Phosphor/Lucide는 정적 맵(icons.ts)으로 해결. 이 함수는 iconsax fallback용.
|
|
630
618
|
*/
|
|
631
619
|
export declare function getIconFromProvider(iconName: string, provider?: IconProvider): React.ComponentType<Record<string, unknown>> | null;
|
|
632
620
|
/**
|
|
633
621
|
* Get icon name for provider
|
|
634
|
-
*
|
|
635
|
-
* @param iconName - 아이콘 이름 / Icon name
|
|
636
|
-
* @param provider - 아이콘 프로바이더 / Icon provider
|
|
637
|
-
* @returns 프로바이더별 아이콘 이름 / Icon name for provider
|
|
638
622
|
*/
|
|
639
623
|
export declare function getIconNameForProvider(iconName: string, provider: IconProvider): string;
|
|
640
624
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-providers.d.ts","sourceRoot":"","sources":["../../src/lib/icon-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"icon-providers.d.ts","sourceRoot":"","sources":["../../src/lib/icon-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,QAAA,IAAI,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAW,CAAA;AAE5E;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,eAAe,QAEvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,YAdL,MAAM,YAAY,MAAM,KAAK,GAAG,SAgB5D;AAGD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;AAG5D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,YAAY,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsKhB,CAAA;AAEV;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,YAAyB,GAClC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CASrD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,GACrB,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
package/dist/lib/icons.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export declare const icons: {
|
|
|
18
18
|
readonly arrowUp: import("@phosphor-icons/react").Icon;
|
|
19
19
|
readonly arrowDown: import("@phosphor-icons/react").Icon;
|
|
20
20
|
readonly menu: import("@phosphor-icons/react").Icon;
|
|
21
|
+
readonly x: import("@phosphor-icons/react").Icon;
|
|
21
22
|
readonly close: import("@phosphor-icons/react").Icon;
|
|
22
23
|
readonly search: import("@phosphor-icons/react").Icon;
|
|
23
24
|
readonly settings: import("@phosphor-icons/react").Icon;
|
|
@@ -76,6 +77,9 @@ export declare const icons: {
|
|
|
76
77
|
readonly shield: import("@phosphor-icons/react").Icon;
|
|
77
78
|
readonly wallet: import("@phosphor-icons/react").Icon;
|
|
78
79
|
readonly key: import("@phosphor-icons/react").Icon;
|
|
80
|
+
readonly dollar: import("@phosphor-icons/react").Icon;
|
|
81
|
+
readonly dollarSign: import("@phosphor-icons/react").Icon;
|
|
82
|
+
readonly currency: import("@phosphor-icons/react").Icon;
|
|
79
83
|
readonly clock: import("@phosphor-icons/react").Icon;
|
|
80
84
|
readonly calendar: import("@phosphor-icons/react").Icon;
|
|
81
85
|
readonly calendarPlus: import("@phosphor-icons/react").Icon;
|
package/dist/lib/icons.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/lib/icons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/lib/icons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwIH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiJR,CAAA;AAGV,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAA;AAGzC,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAA;AAGV,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAA;AAGV,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAA"}
|
package/dist/lib/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAG5C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAE5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CACrB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,UAAU,EACrB,UAAU,CAAC,EAAE,UAAU,UAGxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,MAAM,SAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAG5C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAE5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CACrB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,UAAU,EACrB,UAAU,CAAC,EAAE,UAAU,UAGxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,MAAM,SAAU,GAAG,MAAM,CA0BrF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,UAM5E;AAGD,eAAO,MAAM,EAAE,cAAQ,CAAA"}
|
package/dist/navigation.d.mts
CHANGED
package/dist/navigation.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export{a as Breadcrumb,b as BreadcrumbItem}from'./chunk-KJZGOL2Z.mjs';import {l}from'./chunk-7OYT3QSY.mjs';import {a}from'./chunk-RS6RKW5U.mjs';import {b}from'./chunk-U6CTBZ2U.mjs';import p,{useState,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var A=p.forwardRef(({className:n,value:e,defaultValue:t,onValueChange:o,variant:s="pills",scale:l="medium",children:m,...d},f)=>{let [g,c]=p.useState(e||t||""),b$1=e!==void 0,x=b$1?e:g;return p.useEffect(()=>{e!==void 0&&c(e);},[e]),jsx("div",{ref:f,className:b("w-full",n),...d,children:p.Children.map(m,u=>p.isValidElement(u)?p.cloneElement(u,{value:x,variant:s,scale:l}):u)})});A.displayName="Navigation";var B=p.forwardRef(({className:n,value:e,onValueChange:t,variant:o="pills",scale:s="medium",children:l,...m},d)=>{let f=()=>{switch(o){case "pills":return "bg-muted p-1 rounded-xl";case "underline":return "border-b border-border";case "cards":return "bg-muted/50 p-1 rounded-xl";default:return "bg-muted p-1 rounded-xl"}},g=()=>{switch(s){case "small":return "gap-1";case "large":return "gap-3";default:return "gap-2"}};return jsx("div",{ref:d,className:b("flex",f(),g(),n),...m,children:p.Children.map(l,c=>p.isValidElement(c)?p.cloneElement(c,{value:e,variant:o,scale:s}):c)})});B.displayName="NavigationList";var O=p.forwardRef(({className:n,value:e,onValueChange:t,variant:o="pills",scale:s="medium",active:l=false,children:m,...d},f)=>{let g=()=>{switch(o){case "pills":return b("rounded-lg px-3 py-2 text-sm font-medium transition-all",l?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground");case "underline":return b("border-b-2 px-3 py-2 text-sm font-medium transition-all",l?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground");case "cards":return b("rounded-lg px-3 py-2 text-sm font-medium transition-all",l?"bg-background text-foreground shadow-sm border border-border":"text-muted-foreground hover:text-foreground");default:return b("rounded-lg px-3 py-2 text-sm font-medium transition-all",l?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground")}},c=()=>{switch(s){case "small":return "text-xs px-2 py-1";case "large":return "text-base px-4 py-3";default:return "text-sm px-3 py-2"}},b$1=()=>{t==null||t(e);};return jsx("button",{ref:f,className:b(g(),c(),"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",n),onClick:b$1,...d,children:m})});O.displayName="NavigationItem";var j=p.forwardRef(({className:n,active:e=false,...t},o)=>e?jsx("div",{ref:o,className:b("mt-4",n),...t}):null);j.displayName="NavigationContent";var H=A;H.List=B;H.Item=O;H.Content=j;var C=p.forwardRef(({className:n,currentPage:e,totalPages:t,onPageChange:o,showFirstLast:s=true,showPrevNext:l=true,maxVisiblePages:m=5,size:d="md",variant:f="default",shape:g="square",...c},b$1)=>{let x=()=>{let r=[],R=Math.floor(m/2),h=Math.max(1,e-R),P=Math.min(t,e+R);P-h+1<m&&(h===1?P=Math.min(t,h+m-1):h=Math.max(1,P-m+1)),h>1&&(r.push(1),h>2&&r.push("..."));for(let D=h;D<=P;D++)r.push(D);return P<t&&(P<t-1&&r.push("..."),r.push(t)),r},v=()=>{switch(d){case "sm":return "h-8 px-2 text-sm";case "lg":return "h-12 px-4 text-base";default:return "h-10 px-3 text-sm"}},u=()=>g==="circle"?"rounded-full aspect-square flex items-center justify-center":"rounded-md",N=(r=false)=>{switch(f){case "outlined":return b("border border-border",r?"bg-primary border-primary text-primary-foreground":"bg-background text-foreground hover:bg-muted");case "minimal":return b("border-0",r?"bg-primary/10 text-primary":"bg-transparent text-foreground hover:bg-muted");default:return b("border-0",r?"bg-primary text-primary-foreground":"bg-background text-foreground hover:bg-muted")}},M=r=>{r>=1&&r<=t&&r!==e&&o(r);},G=x();return jsxs("div",{ref:b$1,className:b("flex items-center justify-center gap-1",n),...c,children:[s&&e>1&&jsx("button",{onClick:()=>M(1),className:b("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uCCAB \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M11 19l-7-7 7-7M19 19l-7-7 7-7"})})}),l&&e>1&&jsx("button",{onClick:()=>M(e-1),className:b("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uC774\uC804 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}),G.map((r,R)=>jsx(p.Fragment,{children:r==="..."?jsx("span",{className:b("inline-flex items-center justify-center px-3 py-2 text-sm font-medium text-muted-foreground",v()),children:"..."}):jsx("button",{onClick:()=>M(r),className:b("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N(r===e)),"aria-label":`${r}\uD398\uC774\uC9C0\uB85C \uC774\uB3D9`,"aria-current":r===e?"page":void 0,children:r})},R)),l&&e<t&&jsx("button",{onClick:()=>M(e+1),className:b("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uB2E4\uC74C \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})}),s&&e<t&&jsx("button",{onClick:()=>M(t),className:b("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 5l7 7-7 7M5 5l7 7-7 7"})})})]})});C.displayName="Pagination";var V=p.forwardRef(({className:n,...e},t)=>jsx(C,{ref:t,variant:"outlined",className:n,...e}));V.displayName="PaginationOutlined";var q=p.forwardRef(({className:n,...e},t)=>jsx(C,{ref:t,variant:"minimal",className:n,...e}));q.displayName="PaginationMinimal";var z=p.forwardRef(({totalItems:n=0,itemsPerPage:e=10,showInfo:t=true,className:o,...s},l)=>{let m=(s.currentPage-1)*e+1,d=Math.min(s.currentPage*e,n);return jsxs("div",{className:b("flex flex-col sm:flex-row items-center justify-between gap-4",o),children:[t&&jsx("div",{className:"text-sm text-foreground",children:n>0?jsxs(Fragment,{children:[jsx("span",{className:"font-medium",children:m})," - ",jsx("span",{className:"font-medium",children:d})," of ",jsx("span",{className:"font-medium",children:n})," results"]}):"No results"}),jsx(C,{ref:l,...s})]})});z.displayName="PaginationWithInfo";var _=p.forwardRef(({className:n,prevPage:e,nextPage:t,showOnMobile:o=false,...s},l$1)=>!e&&!t?null:jsxs("div",{ref:l$1,className:b("flex items-center justify-between py-4",!o&&"hidden md:flex",n),...s,children:[jsx("div",{className:"flex-1",children:e&&jsxs("a",{href:e.href,className:"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[jsx(l,{name:"chevronLeft",className:"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1"}),jsx("span",{className:"hidden sm:inline",children:e.title})]})}),jsx("div",{className:"flex-1 flex justify-end",children:t&&jsxs("a",{href:t.href,className:"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[jsx("span",{className:"hidden sm:inline mr-2",children:t.title}),jsx(l,{name:"chevronRight",className:"w-4 h-4 transition-transform group-hover:translate-x-1"})]})})]}));_.displayName="PageNavigation";var T=p.forwardRef(({children:n,className:e,duration:t=300,variant:o="fade",loadingVariant:s="ripple",loadingText:l="\uD398\uC774\uC9C0 \uB85C\uB529 \uC911...",showLoading:m=true,onTransitionStart:d,onTransitionEnd:f},g)=>{let[c,b$1]=useState(true),[x,v]=useState(false);useEffect(()=>{let N=setTimeout(()=>{b$1(false),v(true),f==null||f();},t);return d==null||d(),()=>clearTimeout(N)},[t,d,f]);let u={fade:b("transition-opacity duration-300 ease-in-out",x?"opacity-100":"opacity-0"),slide:b("transition-transform duration-300 ease-in-out",x?"translate-x-0":"translate-x-full"),scale:b("transition-all duration-300 ease-in-out",x?"scale-100 opacity-100":"scale-95 opacity-0"),flip:b("transition-all duration-500 ease-in-out",x?"rotate-y-0 opacity-100":"rotate-y-90 opacity-0")};return c&&m?jsx("div",{className:b("flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-indigo-50 to-purple-50 dark:from-slate-900 dark:to-slate-800",e),children:jsx(a,{size:"lg",variant:s,text:l})}):jsx("div",{ref:g,className:b("w-full",u[o],e),style:{transitionDuration:`${t}ms`},children:n})});T.displayName="PageTransition";var Y=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"fade",...n})),Z=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"slide",...n})),ee=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"scale",...n})),te=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"flip",...n}));Y.displayName="FadeTransition";Z.displayName="SlideTransition";ee.displayName="ScaleTransition";te.displayName="FlipTransition";export{H as Navigation,j as NavigationContent,O as NavigationItem,B as NavigationList,_ as PageNavigation,T as PageTransition,C as Pagination,q as PaginationMinimal,V as PaginationOutlined,z as PaginationWithInfo};//# sourceMappingURL=navigation.mjs.map
|
|
2
|
+
import {a as a$1}from'./chunk-QRRP7TGF.mjs';export{a as Breadcrumb,b as BreadcrumbItem}from'./chunk-HEBXAFRY.mjs';import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import'./chunk-EAZEI74V.mjs';import p,{useState,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var A=p.forwardRef(({className:n,value:e,defaultValue:t,onValueChange:o,variant:s="pills",scale:l="medium",children:m,...d},f)=>{let [g,c]=p.useState(e||t||""),b=e!==void 0,x=b?e:g;return p.useEffect(()=>{e!==void 0&&c(e);},[e]),jsx("div",{ref:f,className:a("w-full",n),...d,children:p.Children.map(m,u=>p.isValidElement(u)?p.cloneElement(u,{value:x,variant:s,scale:l}):u)})});A.displayName="Navigation";var B=p.forwardRef(({className:n,value:e,onValueChange:t,variant:o="pills",scale:s="medium",children:l,...m},d)=>{let f=()=>{switch(o){case "pills":return "bg-muted p-1 rounded-xl";case "underline":return "border-b border-border";case "cards":return "bg-muted/50 p-1 rounded-xl";default:return "bg-muted p-1 rounded-xl"}},g=()=>{switch(s){case "small":return "gap-1";case "large":return "gap-3";default:return "gap-2"}};return jsx("div",{ref:d,className:a("flex",f(),g(),n),...m,children:p.Children.map(l,c=>p.isValidElement(c)?p.cloneElement(c,{value:e,variant:o,scale:s}):c)})});B.displayName="NavigationList";var O=p.forwardRef(({className:n,value:e,onValueChange:t,variant:o="pills",scale:s="medium",active:l=false,children:m,...d},f)=>{let g=()=>{switch(o){case "pills":return a("rounded-lg px-3 py-2 text-sm font-medium transition-all",l?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground");case "underline":return a("border-b-2 px-3 py-2 text-sm font-medium transition-all",l?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground");case "cards":return a("rounded-lg px-3 py-2 text-sm font-medium transition-all",l?"bg-background text-foreground shadow-sm border border-border":"text-muted-foreground hover:text-foreground");default:return a("rounded-lg px-3 py-2 text-sm font-medium transition-all",l?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground")}},c=()=>{switch(s){case "small":return "text-xs px-2 py-1";case "large":return "text-base px-4 py-3";default:return "text-sm px-3 py-2"}},b=()=>{t==null||t(e);};return jsx("button",{ref:f,className:a(g(),c(),"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",n),onClick:b,...d,children:m})});O.displayName="NavigationItem";var j=p.forwardRef(({className:n,active:e=false,...t},o)=>e?jsx("div",{ref:o,className:a("mt-4",n),...t}):null);j.displayName="NavigationContent";var H=A;H.List=B;H.Item=O;H.Content=j;var C=p.forwardRef(({className:n,currentPage:e,totalPages:t,onPageChange:o,showFirstLast:s=true,showPrevNext:l=true,maxVisiblePages:m=5,size:d="md",variant:f="default",shape:g="square",...c},b)=>{let x=()=>{let r=[],R=Math.floor(m/2),h=Math.max(1,e-R),P=Math.min(t,e+R);P-h+1<m&&(h===1?P=Math.min(t,h+m-1):h=Math.max(1,P-m+1)),h>1&&(r.push(1),h>2&&r.push("..."));for(let D=h;D<=P;D++)r.push(D);return P<t&&(P<t-1&&r.push("..."),r.push(t)),r},v=()=>{switch(d){case "sm":return "h-8 px-2 text-sm";case "lg":return "h-12 px-4 text-base";default:return "h-10 px-3 text-sm"}},u=()=>g==="circle"?"rounded-full aspect-square flex items-center justify-center":"rounded-md",N=(r=false)=>{switch(f){case "outlined":return a("border border-border",r?"bg-primary border-primary text-primary-foreground":"bg-background text-foreground hover:bg-muted");case "minimal":return a("border-0",r?"bg-primary/10 text-primary":"bg-transparent text-foreground hover:bg-muted");default:return a("border-0",r?"bg-primary text-primary-foreground":"bg-background text-foreground hover:bg-muted")}},M=r=>{r>=1&&r<=t&&r!==e&&o(r);},G=x();return jsxs("div",{ref:b,className:a("flex items-center justify-center gap-1",n),...c,children:[s&&e>1&&jsx("button",{onClick:()=>M(1),className:a("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uCCAB \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M11 19l-7-7 7-7M19 19l-7-7 7-7"})})}),l&&e>1&&jsx("button",{onClick:()=>M(e-1),className:a("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uC774\uC804 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}),G.map((r,R)=>jsx(p.Fragment,{children:r==="..."?jsx("span",{className:a("inline-flex items-center justify-center px-3 py-2 text-sm font-medium text-muted-foreground",v()),children:"..."}):jsx("button",{onClick:()=>M(r),className:a("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N(r===e)),"aria-label":`${r}\uD398\uC774\uC9C0\uB85C \uC774\uB3D9`,"aria-current":r===e?"page":void 0,children:r})},R)),l&&e<t&&jsx("button",{onClick:()=>M(e+1),className:a("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uB2E4\uC74C \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})}),s&&e<t&&jsx("button",{onClick:()=>M(t),className:a("inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",v(),u(),N()),"aria-label":"\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 5l7 7-7 7M5 5l7 7-7 7"})})})]})});C.displayName="Pagination";var V=p.forwardRef(({className:n,...e},t)=>jsx(C,{ref:t,variant:"outlined",className:n,...e}));V.displayName="PaginationOutlined";var q=p.forwardRef(({className:n,...e},t)=>jsx(C,{ref:t,variant:"minimal",className:n,...e}));q.displayName="PaginationMinimal";var z=p.forwardRef(({totalItems:n=0,itemsPerPage:e=10,showInfo:t=true,className:o,...s},l)=>{let m=(s.currentPage-1)*e+1,d=Math.min(s.currentPage*e,n);return jsxs("div",{className:a("flex flex-col sm:flex-row items-center justify-between gap-4",o),children:[t&&jsx("div",{className:"text-sm text-foreground",children:n>0?jsxs(Fragment,{children:[jsx("span",{className:"font-medium",children:m})," - ",jsx("span",{className:"font-medium",children:d})," of ",jsx("span",{className:"font-medium",children:n})," results"]}):"No results"}),jsx(C,{ref:l,...s})]})});z.displayName="PaginationWithInfo";var _=p.forwardRef(({className:n,prevPage:e,nextPage:t,showOnMobile:o=false,...s},l$1)=>!e&&!t?null:jsxs("div",{ref:l$1,className:a("flex items-center justify-between py-4",!o&&"hidden md:flex",n),...s,children:[jsx("div",{className:"flex-1",children:e&&jsxs("a",{href:e.href,className:"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[jsx(l,{name:"chevronLeft",className:"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1"}),jsx("span",{className:"hidden sm:inline",children:e.title})]})}),jsx("div",{className:"flex-1 flex justify-end",children:t&&jsxs("a",{href:t.href,className:"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[jsx("span",{className:"hidden sm:inline mr-2",children:t.title}),jsx(l,{name:"chevronRight",className:"w-4 h-4 transition-transform group-hover:translate-x-1"})]})})]}));_.displayName="PageNavigation";var T=p.forwardRef(({children:n,className:e,duration:t=300,variant:o="fade",loadingVariant:s="ripple",loadingText:l="\uD398\uC774\uC9C0 \uB85C\uB529 \uC911...",showLoading:m=true,onTransitionStart:d,onTransitionEnd:f},g)=>{let[c,b]=useState(true),[x,v]=useState(false);useEffect(()=>{let N=setTimeout(()=>{b(false),v(true),f==null||f();},t);return d==null||d(),()=>clearTimeout(N)},[t,d,f]);let u={fade:a("transition-opacity duration-300 ease-in-out",x?"opacity-100":"opacity-0"),slide:a("transition-transform duration-300 ease-in-out",x?"translate-x-0":"translate-x-full"),scale:a("transition-all duration-300 ease-in-out",x?"scale-100 opacity-100":"scale-95 opacity-0"),flip:a("transition-all duration-500 ease-in-out",x?"rotate-y-0 opacity-100":"rotate-y-90 opacity-0")};return c&&m?jsx("div",{className:a("flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-indigo-50 to-purple-50 dark:from-slate-900 dark:to-slate-800",e),children:jsx(a$1,{size:"lg",variant:s,text:l})}):jsx("div",{ref:g,className:a("w-full",u[o],e),style:{transitionDuration:`${t}ms`},children:n})});T.displayName="PageTransition";var Y=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"fade",...n})),Z=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"slide",...n})),ee=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"scale",...n})),te=p.forwardRef((n,e)=>jsx(T,{ref:e,variant:"flip",...n}));Y.displayName="FadeTransition";Z.displayName="SlideTransition";ee.displayName="ScaleTransition";te.displayName="FlipTransition";export{H as Navigation,j as NavigationContent,O as NavigationItem,B as NavigationList,_ as PageNavigation,T as PageTransition,C as Pagination,q as PaginationMinimal,V as PaginationOutlined,z as PaginationWithInfo};//# sourceMappingURL=navigation.mjs.map
|
|
3
3
|
//# sourceMappingURL=navigation.mjs.map
|
package/dist/navigation.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Navigation.tsx","../src/components/Pagination.tsx","../src/components/PageNavigation.tsx","../src/components/PageTransition.tsx"],"names":["Navigation","React","className","value","defaultValue","onValueChange","variant","scale","children","props","ref","activeTab","setActiveTab","isControlled","currentValue","jsx","merge","child","NavigationList","_onValueChange","getStyleClasses","getScaleClasses","NavigationItem","active","handleClick","NavigationContent","NavigationComponent","Pagination","currentPage","totalPages","onPageChange","showFirstLast","showPrevNext","maxVisiblePages","size","shape","getVisiblePages","pages","halfVisible","start","end","i","getSizeClasses","getShapeClasses","getVariantClasses","isActive","handlePageClick","page","visiblePages","jsxs","index","PaginationOutlined","PaginationMinimal","PaginationWithInfo","totalItems","itemsPerPage","showInfo","startItem","endItem","Fragment","PageNavigation","prevPage","nextPage","showOnMobile","Icon","PageTransition","duration","loadingVariant","loadingText","showLoading","onTransitionStart","onTransitionEnd","isLoading","setIsLoading","useState","isVisible","setIsVisible","useEffect","timer","transitionClasses","LoadingSpinner","FadeTransition","SlideTransition","ScaleTransition","FlipTransition"],"mappings":"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","file":"navigation.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Navigation 컴포넌트의 props / Navigation component props\n * @typedef {Object} NavigationProps\n * @property {string} [value] - 제어 모드에서 활성 탭 값 / Active tab value in controlled mode\n * @property {string} [defaultValue] - 비제어 모드에서 기본 활성 탭 값 / Default active tab value in uncontrolled mode\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 / Tab change callback\n * @property {\"pills\" | \"underline\" | \"cards\"} [variant=\"pills\"] - Navigation 스타일 변형 / Navigation style variant\n * @property {\"small\" | \"medium\" | \"large\"} [scale=\"medium\"] - Navigation 크기 / Navigation size\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>}\n */\nexport interface NavigationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n variant?: \"pills\" | \"underline\" | \"cards\"\n scale?: \"small\" | \"medium\" | \"large\"\n}\n\n/**\n * Navigation 컴포넌트 / Navigation component\n * \n * 탭 네비게이션 컴포넌트입니다.\n * NavigationList, NavigationItem, NavigationContent와 함께 사용합니다.\n * \n * Tab navigation component.\n * Used with NavigationList, NavigationItem, and NavigationContent.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Navigation>\n * <Navigation.List>\n * <Navigation.Item value=\"tab1\">탭 1</Navigation.Item>\n * <Navigation.Item value=\"tab2\">탭 2</Navigation.Item>\n * </Navigation.List>\n * <Navigation.Content value=\"tab1\">내용 1</Navigation.Content>\n * </Navigation>\n * \n * @param {NavigationProps} props - Navigation 컴포넌트의 props / Navigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Navigation 컴포넌트 / Navigation component\n */\nconst Navigation = React.forwardRef<HTMLDivElement, NavigationProps>(\n ({ \n className, \n value,\n defaultValue,\n onValueChange,\n variant = \"pills\",\n scale = \"medium\",\n children,\n ...props \n }, ref) => {\n const [activeTab, setActiveTab] = React.useState(value || defaultValue || \"\")\n const isControlled = value !== undefined\n const currentValue = isControlled ? value : activeTab\n\n const _handleTabChange = (newValue: string) => {\n if (!isControlled) {\n setActiveTab(newValue)\n }\n onValueChange?.(newValue)\n }\n\n React.useEffect(() => {\n if (value !== undefined) {\n setActiveTab(value)\n }\n }, [value])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value: currentValue,\n variant,\n scale\n } as Partial<NavigationListProps | NavigationItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nNavigation.displayName = \"Navigation\"\n\n/**\n * NavigationList 컴포넌트의 props / NavigationList component props\n * @typedef {Object} NavigationListProps\n * @property {string} [value] - 활성 탭 값 / Active tab value\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 / Tab change callback\n * @property {\"pills\" | \"underline\" | \"cards\"} [variant=\"pills\"] - Navigation 스타일 변형 / Navigation style variant\n * @property {\"small\" | \"medium\" | \"large\"} [scale=\"medium\"] - Navigation 크기 / Navigation size\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>}\n */\nexport interface NavigationListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'> {\n value?: string\n onValueChange?: (value: string) => void\n variant?: \"pills\" | \"underline\" | \"cards\"\n scale?: \"small\" | \"medium\" | \"large\"\n}\n\nconst NavigationList = React.forwardRef<HTMLDivElement, NavigationListProps>(\n ({\n className,\n value,\n onValueChange: _onValueChange,\n variant = \"pills\",\n scale = \"medium\",\n children,\n ...props\n }, ref) => {\n const getStyleClasses = () => {\n switch (variant) {\n case \"pills\":\n return \"bg-muted p-1 rounded-xl\"\n case \"underline\":\n return \"border-b border-border\"\n case \"cards\":\n return \"bg-muted/50 p-1 rounded-xl\"\n default:\n return \"bg-muted p-1 rounded-xl\"\n }\n }\n\n const getScaleClasses = () => {\n switch (scale) {\n case \"small\":\n return \"gap-1\"\n case \"large\":\n return \"gap-3\"\n default:\n return \"gap-2\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex\",\n getStyleClasses(),\n getScaleClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value,\n variant,\n scale\n } as Partial<NavigationItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nNavigationList.displayName = \"NavigationList\"\n\n/**\n * NavigationItem 컴포넌트의 props / NavigationItem component props\n * @typedef {Object} NavigationItemProps\n * @property {string} value - 탭 값 / Tab value\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 / Tab change callback\n * @property {\"pills\" | \"underline\" | \"cards\"} [variant] - Navigation 스타일 변형 (자동으로 설정됨) / Navigation style variant (auto-set)\n * @property {\"small\" | \"medium\" | \"large\"} [scale] - Navigation 크기 (자동으로 설정됨) / Navigation size (auto-set)\n * @property {boolean} [active] - 활성 상태 (자동으로 설정됨) / Active state (auto-set)\n * @extends {Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'style'>}\n */\nexport interface NavigationItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'style'> {\n value: string\n onValueChange?: (value: string) => void\n variant?: \"pills\" | \"underline\" | \"cards\"\n scale?: \"small\" | \"medium\" | \"large\"\n active?: boolean\n}\n\nconst NavigationItem = React.forwardRef<HTMLButtonElement, NavigationItemProps>(\n ({ \n className, \n value,\n onValueChange,\n variant = \"pills\",\n scale = \"medium\",\n active = false,\n children,\n ...props \n }, ref) => {\n const getStyleClasses = () => {\n switch (variant) {\n case \"pills\":\n return merge(\n \"rounded-lg px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )\n case \"underline\":\n return merge(\n \"border-b-2 px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"border-primary text-primary\"\n : \"border-transparent text-muted-foreground hover:text-foreground\"\n )\n case \"cards\":\n return merge(\n \"rounded-lg px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"bg-background text-foreground shadow-sm border border-border\"\n : \"text-muted-foreground hover:text-foreground\"\n )\n default:\n return merge(\n \"rounded-lg px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )\n }\n }\n\n const getScaleClasses = () => {\n switch (scale) {\n case \"small\":\n return \"text-xs px-2 py-1\"\n case \"large\":\n return \"text-base px-4 py-3\"\n default:\n return \"text-sm px-3 py-2\"\n }\n }\n\n const handleClick = () => {\n onValueChange?.(value)\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n getStyleClasses(),\n getScaleClasses(),\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nNavigationItem.displayName = \"NavigationItem\"\n\n/**\n * NavigationContent 컴포넌트의 props / NavigationContent component props\n * @typedef {Object} NavigationContentProps\n * @property {string} value - 탭 값 / Tab value\n * @property {boolean} [active] - 활성 상태 (자동으로 설정됨) / Active state (auto-set)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface NavigationContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n active?: boolean\n}\n\nconst NavigationContent = React.forwardRef<HTMLDivElement, NavigationContentProps>(\n ({ className, active = false, ...props }, ref) => {\n if (!active) return null\n\n return (\n <div\n ref={ref}\n className={merge(\"mt-4\", className)}\n {...props}\n />\n )\n }\n)\nNavigationContent.displayName = \"NavigationContent\"\n\n// 서브컴포넌트 타입 정의\nexport interface NavigationComponent extends React.ForwardRefExoticComponent<NavigationProps & React.RefAttributes<HTMLDivElement>> {\n List: typeof NavigationList\n Item: typeof NavigationItem\n Content: typeof NavigationContent\n}\n\nconst NavigationComponent = Navigation as NavigationComponent\nNavigationComponent.List = NavigationList\nNavigationComponent.Item = NavigationItem\nNavigationComponent.Content = NavigationContent\n\nexport { NavigationComponent as Navigation, NavigationList, NavigationItem, NavigationContent } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Pagination 컴포넌트의 props / Pagination component props\n * @typedef {Object} PaginationProps\n * @property {number} currentPage - 현재 페이지 번호 / Current page number\n * @property {number} totalPages - 전체 페이지 수 / Total number of pages\n * @property {(page: number) => void} onPageChange - 페이지 변경 콜백 / Page change callback\n * @property {boolean} [showFirstLast=true] - 첫/마지막 페이지 버튼 표시 여부 / Show first/last page buttons\n * @property {boolean} [showPrevNext=true] - 이전/다음 페이지 버튼 표시 여부 / Show previous/next page buttons\n * @property {number} [maxVisiblePages=5] - 최대 표시 페이지 수 / Maximum visible page numbers\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Pagination 크기 / Pagination size\n * @property {\"default\" | \"outlined\" | \"minimal\"} [variant=\"default\"] - Pagination 스타일 변형 / Pagination style variant\n * @property {\"square\" | \"circle\"} [shape=\"square\"] - 버튼 모양 / Button shape\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PaginationProps extends React.HTMLAttributes<HTMLDivElement> {\n currentPage: number\n totalPages: number\n onPageChange: (page: number) => void\n showFirstLast?: boolean\n showPrevNext?: boolean\n maxVisiblePages?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"outlined\" | \"minimal\"\n shape?: \"square\" | \"circle\"\n}\n\n/**\n * Pagination 컴포넌트 / Pagination component\n * \n * 페이지네이션 컨트롤을 제공하는 컴포넌트입니다.\n * 첫/마지막 페이지, 이전/다음 페이지 버튼을 지원하며,\n * 많은 페이지가 있을 경우 자동으로 생략 표시(...)를 합니다.\n * \n * Component that provides pagination controls.\n * Supports first/last page and previous/next page buttons,\n * and automatically shows ellipsis (...) when there are many pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [page, setPage] = useState(1)\n * \n * <Pagination\n * currentPage={page}\n * totalPages={10}\n * onPageChange={setPage}\n * />\n * \n * @example\n * // Outlined 스타일, 원형 버튼 / Outlined style, circular buttons\n * <Pagination\n * currentPage={page}\n * totalPages={20}\n * onPageChange={setPage}\n * variant=\"outlined\"\n * shape=\"circle\"\n * />\n * \n * @param {PaginationProps} props - Pagination 컴포넌트의 props / Pagination component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Pagination 컴포넌트 / Pagination component\n */\nconst Pagination = React.forwardRef<HTMLDivElement, PaginationProps>(\n ({ \n className, \n currentPage,\n totalPages,\n onPageChange,\n showFirstLast = true,\n showPrevNext = true,\n maxVisiblePages = 5,\n size = \"md\",\n variant = \"default\",\n shape = \"square\",\n ...props \n }, ref) => {\n const getVisiblePages = () => {\n const pages: (number | string)[] = []\n const halfVisible = Math.floor(maxVisiblePages / 2)\n \n let start = Math.max(1, currentPage - halfVisible)\n let end = Math.min(totalPages, currentPage + halfVisible)\n \n // 조정\n if (end - start + 1 < maxVisiblePages) {\n if (start === 1) {\n end = Math.min(totalPages, start + maxVisiblePages - 1)\n } else {\n start = Math.max(1, end - maxVisiblePages + 1)\n }\n }\n \n // 첫 페이지\n if (start > 1) {\n pages.push(1)\n if (start > 2) {\n pages.push(\"...\")\n }\n }\n \n // 중간 페이지들\n for (let i = start; i <= end; i++) {\n pages.push(i)\n }\n \n // 마지막 페이지\n if (end < totalPages) {\n if (end < totalPages - 1) {\n pages.push(\"...\")\n }\n pages.push(totalPages)\n }\n \n return pages\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-8 px-2 text-sm\" // 32px 높이, 8px 패딩\n case \"lg\":\n return \"h-12 px-4 text-base\" // 48px 높이, 16px 패딩\n default:\n return \"h-10 px-3 text-sm\" // 40px 높이, 12px 패딩\n }\n }\n\n const getShapeClasses = () => {\n switch (shape) {\n case \"circle\":\n return \"rounded-full aspect-square flex items-center justify-center\"\n default:\n return \"rounded-md\"\n }\n }\n\n const getVariantClasses = (isActive: boolean = false) => {\n switch (variant) {\n case \"outlined\":\n return merge(\n \"border border-border\",\n isActive\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"bg-background text-foreground hover:bg-muted\"\n )\n case \"minimal\":\n return merge(\n \"border-0\",\n isActive\n ? \"bg-primary/10 text-primary\"\n : \"bg-transparent text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"border-0\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"bg-background text-foreground hover:bg-muted\"\n )\n }\n }\n\n const handlePageClick = (page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n onPageChange(page)\n }\n }\n\n const visiblePages = getVisiblePages()\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-center gap-1\",\n className\n )}\n {...props}\n >\n {/* 첫 페이지 버튼 */}\n {showFirstLast && currentPage > 1 && (\n <button\n onClick={() => handlePageClick(1)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"첫 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 19l-7-7 7-7M19 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* 이전 페이지 버튼 */}\n {showPrevNext && currentPage > 1 && (\n <button\n onClick={() => handlePageClick(currentPage - 1)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"이전 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* 페이지 번호들 */}\n {visiblePages.map((page, index) => (\n <React.Fragment key={index}>\n {page === \"...\" ? (\n <span className={merge(\n \"inline-flex items-center justify-center px-3 py-2 text-sm font-medium text-muted-foreground\",\n getSizeClasses()\n )}>\n ...\n </span>\n ) : (\n <button\n onClick={() => handlePageClick(page as number)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses(page === currentPage)\n )}\n aria-label={`${page}페이지로 이동`}\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </button>\n )}\n </React.Fragment>\n ))}\n\n {/* 다음 페이지 버튼 */}\n {showPrevNext && currentPage < totalPages && (\n <button\n onClick={() => handlePageClick(currentPage + 1)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"다음 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n\n {/* 마지막 페이지 버튼 */}\n {showFirstLast && currentPage < totalPages && (\n <button\n onClick={() => handlePageClick(totalPages)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"마지막 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 5l7 7-7 7M5 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n </div>\n )\n }\n)\nPagination.displayName = \"Pagination\"\n\n// 편의 컴포넌트들\nexport const PaginationOutlined = React.forwardRef<HTMLDivElement, Omit<PaginationProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Pagination ref={ref} variant=\"outlined\" className={className} {...props} />\n )\n)\nPaginationOutlined.displayName = \"PaginationOutlined\"\n\nexport const PaginationMinimal = React.forwardRef<HTMLDivElement, Omit<PaginationProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Pagination ref={ref} variant=\"minimal\" className={className} {...props} />\n )\n)\nPaginationMinimal.displayName = \"PaginationMinimal\"\n\n// 복합 컴포넌트들\nexport const PaginationWithInfo = React.forwardRef<HTMLDivElement, PaginationProps & { \n totalItems?: number\n itemsPerPage?: number\n showInfo?: boolean\n}>(\n ({ \n totalItems = 0, \n itemsPerPage = 10, \n showInfo = true, \n className, \n ...props \n }, ref) => {\n const startItem = (props.currentPage - 1) * itemsPerPage + 1\n const endItem = Math.min(props.currentPage * itemsPerPage, totalItems)\n \n return (\n <div className={merge(\"flex flex-col sm:flex-row items-center justify-between gap-4\", className)}>\n {showInfo && (\n <div className=\"text-sm text-foreground\">\n {totalItems > 0 ? (\n <>\n <span className=\"font-medium\">{startItem}</span>\n {\" - \"}\n <span className=\"font-medium\">{endItem}</span>\n {\" of \"}\n <span className=\"font-medium\">{totalItems}</span>\n {\" results\"}\n </>\n ) : (\n \"No results\"\n )}\n </div>\n )}\n <Pagination ref={ref} {...props} />\n </div>\n )\n }\n)\nPaginationWithInfo.displayName = \"PaginationWithInfo\"\n\nexport { Pagination } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * PageNavigation 컴포넌트의 props / PageNavigation component props\n * @typedef {Object} PageNavigationProps\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {boolean} [showOnMobile=false] - 모바일에서 표시 여부 / Show on mobile\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PageNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n showOnMobile?: boolean\n}\n\n/**\n * PageNavigation 컴포넌트 / PageNavigation component\n * \n * 이전/다음 페이지로 이동하는 네비게이션 컴포넌트입니다.\n * 문서 페이지나 가이드 페이지에서 사용하기 적합합니다.\n * \n * Navigation component for moving to previous/next pages.\n * Suitable for documentation or guide pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageNavigation\n * prevPage={{ title: \"이전 페이지\", href: \"/prev\" }}\n * nextPage={{ title: \"다음 페이지\", href: \"/next\" }}\n * />\n * \n * @param {PageNavigationProps} props - PageNavigation 컴포넌트의 props / PageNavigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageNavigation 컴포넌트 / PageNavigation component\n */\nconst PageNavigation = React.forwardRef<HTMLDivElement, PageNavigationProps>(\n ({ \n className, \n prevPage, \n nextPage, \n showOnMobile = false,\n ...props \n }, ref) => {\n if (!prevPage && !nextPage) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between py-4\",\n !showOnMobile && \"hidden md:flex\",\n className\n )}\n {...props}\n >\n {/* 이전 페이지 */}\n <div className=\"flex-1\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Icon \n name=\"chevronLeft\" \n className=\"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1\" \n />\n <span className=\"hidden sm:inline\">{prevPage.title}</span>\n </a>\n )}\n </div>\n\n {/* 다음 페이지 */}\n <div className=\"flex-1 flex justify-end\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <span className=\"hidden sm:inline mr-2\">{nextPage.title}</span>\n <Icon \n name=\"chevronRight\" \n className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" \n />\n </a>\n )}\n </div>\n </div>\n )\n }\n)\nPageNavigation.displayName = \"PageNavigation\"\n\nexport { PageNavigation } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\nimport { LoadingSpinner } from './LoadingSpinner'\n\n/**\n * PageTransition 컴포넌트의 props / PageTransition component props\n * @typedef {Object} PageTransitionProps\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [duration=300] - 전환 지속 시간 (ms) / Transition duration (ms)\n * @property {'fade' | 'slide' | 'scale' | 'flip'} [variant='fade'] - 전환 애니메이션 타입 / Transition animation type\n * @property {'default' | 'dots' | 'bars' | 'ring' | 'ripple'} [loadingVariant='ripple'] - 로딩 스피너 타입 / Loading spinner type\n * @property {string} [loadingText='페이지 로딩 중...'] - 로딩 텍스트 / Loading text\n * @property {boolean} [showLoading=true] - 로딩 표시 여부 / Show loading\n * @property {() => void} [onTransitionStart] - 전환 시작 콜백 / Transition start callback\n * @property {() => void} [onTransitionEnd] - 전환 종료 콜백 / Transition end callback\n */\nexport interface PageTransitionProps {\n children: React.ReactNode\n className?: string\n duration?: number\n variant?: 'fade' | 'slide' | 'scale' | 'flip'\n loadingVariant?: 'default' | 'dots' | 'bars' | 'ring' | 'ripple'\n loadingText?: string\n showLoading?: boolean\n onTransitionStart?: () => void\n onTransitionEnd?: () => void\n}\n\n/**\n * PageTransition 컴포넌트 / PageTransition component\n * \n * 페이지 전환 애니메이션을 제공하는 컴포넌트입니다.\n * 다양한 전환 효과와 로딩 스피너를 지원합니다.\n * \n * Component that provides page transition animations.\n * Supports various transition effects and loading spinners.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageTransition>\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @example\n * // Slide 전환 / Slide transition\n * <PageTransition\n * variant=\"slide\"\n * duration={500}\n * loadingVariant=\"dots\"\n * >\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @param {PageTransitionProps} props - PageTransition 컴포넌트의 props / PageTransition component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageTransition 컴포넌트 / PageTransition component\n */\nexport const PageTransition = React.forwardRef<HTMLDivElement, PageTransitionProps>(({\n children,\n className,\n duration = 300,\n variant = 'fade',\n loadingVariant = 'ripple',\n loadingText = '페이지 로딩 중...',\n showLoading = true,\n onTransitionStart,\n onTransitionEnd\n}, ref) => {\n const [isLoading, setIsLoading] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoading(false)\n setIsVisible(true)\n onTransitionEnd?.()\n }, duration)\n\n onTransitionStart?.()\n\n return () => clearTimeout(timer)\n }, [duration, onTransitionStart, onTransitionEnd])\n\n const transitionClasses = {\n fade: merge(\n 'transition-opacity duration-300 ease-in-out',\n isVisible ? 'opacity-100' : 'opacity-0'\n ),\n slide: merge(\n 'transition-transform duration-300 ease-in-out',\n isVisible ? 'translate-x-0' : 'translate-x-full'\n ),\n scale: merge(\n 'transition-all duration-300 ease-in-out',\n isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'\n ),\n flip: merge(\n 'transition-all duration-500 ease-in-out',\n isVisible ? 'rotate-y-0 opacity-100' : 'rotate-y-90 opacity-0'\n )\n }\n\n if (isLoading && showLoading) {\n return (\n <div className={merge('flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-indigo-50 to-purple-50 dark:from-slate-900 dark:to-slate-800', className)}>\n <LoadingSpinner\n size=\"lg\"\n variant={loadingVariant}\n text={loadingText}\n />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'w-full',\n transitionClasses[variant],\n className\n )}\n style={{ transitionDuration: `${duration}ms` }}\n >\n {children}\n </div>\n )\n})\n\nPageTransition.displayName = 'PageTransition'\n\n// Convenience components for different transition types\nexport const FadeTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"fade\" {...props} />\n))\n\nexport const SlideTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"slide\" {...props} />\n))\n\nexport const ScaleTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"scale\" {...props} />\n))\n\nexport const FlipTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"flip\" {...props} />\n))\n\n// Add displayName for convenience components\nFadeTransition.displayName = 'FadeTransition'\nSlideTransition.displayName = 'SlideTransition'\nScaleTransition.displayName = 'ScaleTransition'\nFlipTransition.displayName = 'FlipTransition' "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Navigation.tsx","../src/components/Pagination.tsx","../src/components/PageNavigation.tsx","../src/components/PageTransition.tsx"],"names":["Navigation","React","className","value","defaultValue","onValueChange","variant","scale","children","props","ref","activeTab","setActiveTab","isControlled","currentValue","jsx","merge","child","NavigationList","_onValueChange","getStyleClasses","getScaleClasses","NavigationItem","active","handleClick","NavigationContent","NavigationComponent","Pagination","currentPage","totalPages","onPageChange","showFirstLast","showPrevNext","maxVisiblePages","size","shape","getVisiblePages","pages","halfVisible","start","end","i","getSizeClasses","getShapeClasses","getVariantClasses","isActive","handlePageClick","page","visiblePages","jsxs","index","PaginationOutlined","PaginationMinimal","PaginationWithInfo","totalItems","itemsPerPage","showInfo","startItem","endItem","Fragment","PageNavigation","prevPage","nextPage","showOnMobile","Icon","PageTransition","duration","loadingVariant","loadingText","showLoading","onTransitionStart","onTransitionEnd","isLoading","setIsLoading","useState","isVisible","setIsVisible","useEffect","timer","transitionClasses","LoadingSpinner","FadeTransition","SlideTransition","ScaleTransition","FlipTransition"],"mappings":"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","file":"navigation.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Navigation 컴포넌트의 props / Navigation component props\n * @typedef {Object} NavigationProps\n * @property {string} [value] - 제어 모드에서 활성 탭 값 / Active tab value in controlled mode\n * @property {string} [defaultValue] - 비제어 모드에서 기본 활성 탭 값 / Default active tab value in uncontrolled mode\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 / Tab change callback\n * @property {\"pills\" | \"underline\" | \"cards\"} [variant=\"pills\"] - Navigation 스타일 변형 / Navigation style variant\n * @property {\"small\" | \"medium\" | \"large\"} [scale=\"medium\"] - Navigation 크기 / Navigation size\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>}\n */\nexport interface NavigationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n variant?: \"pills\" | \"underline\" | \"cards\"\n scale?: \"small\" | \"medium\" | \"large\"\n}\n\n/**\n * Navigation 컴포넌트 / Navigation component\n * \n * 탭 네비게이션 컴포넌트입니다.\n * NavigationList, NavigationItem, NavigationContent와 함께 사용합니다.\n * \n * Tab navigation component.\n * Used with NavigationList, NavigationItem, and NavigationContent.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Navigation>\n * <Navigation.List>\n * <Navigation.Item value=\"tab1\">탭 1</Navigation.Item>\n * <Navigation.Item value=\"tab2\">탭 2</Navigation.Item>\n * </Navigation.List>\n * <Navigation.Content value=\"tab1\">내용 1</Navigation.Content>\n * </Navigation>\n * \n * @param {NavigationProps} props - Navigation 컴포넌트의 props / Navigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Navigation 컴포넌트 / Navigation component\n */\nconst Navigation = React.forwardRef<HTMLDivElement, NavigationProps>(\n ({ \n className, \n value,\n defaultValue,\n onValueChange,\n variant = \"pills\",\n scale = \"medium\",\n children,\n ...props \n }, ref) => {\n const [activeTab, setActiveTab] = React.useState(value || defaultValue || \"\")\n const isControlled = value !== undefined\n const currentValue = isControlled ? value : activeTab\n\n const _handleTabChange = (newValue: string) => {\n if (!isControlled) {\n setActiveTab(newValue)\n }\n onValueChange?.(newValue)\n }\n\n React.useEffect(() => {\n if (value !== undefined) {\n setActiveTab(value)\n }\n }, [value])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value: currentValue,\n variant,\n scale\n } as Partial<NavigationListProps | NavigationItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nNavigation.displayName = \"Navigation\"\n\n/**\n * NavigationList 컴포넌트의 props / NavigationList component props\n * @typedef {Object} NavigationListProps\n * @property {string} [value] - 활성 탭 값 / Active tab value\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 / Tab change callback\n * @property {\"pills\" | \"underline\" | \"cards\"} [variant=\"pills\"] - Navigation 스타일 변형 / Navigation style variant\n * @property {\"small\" | \"medium\" | \"large\"} [scale=\"medium\"] - Navigation 크기 / Navigation size\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>}\n */\nexport interface NavigationListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'> {\n value?: string\n onValueChange?: (value: string) => void\n variant?: \"pills\" | \"underline\" | \"cards\"\n scale?: \"small\" | \"medium\" | \"large\"\n}\n\nconst NavigationList = React.forwardRef<HTMLDivElement, NavigationListProps>(\n ({\n className,\n value,\n onValueChange: _onValueChange,\n variant = \"pills\",\n scale = \"medium\",\n children,\n ...props\n }, ref) => {\n const getStyleClasses = () => {\n switch (variant) {\n case \"pills\":\n return \"bg-muted p-1 rounded-xl\"\n case \"underline\":\n return \"border-b border-border\"\n case \"cards\":\n return \"bg-muted/50 p-1 rounded-xl\"\n default:\n return \"bg-muted p-1 rounded-xl\"\n }\n }\n\n const getScaleClasses = () => {\n switch (scale) {\n case \"small\":\n return \"gap-1\"\n case \"large\":\n return \"gap-3\"\n default:\n return \"gap-2\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex\",\n getStyleClasses(),\n getScaleClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value,\n variant,\n scale\n } as Partial<NavigationItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nNavigationList.displayName = \"NavigationList\"\n\n/**\n * NavigationItem 컴포넌트의 props / NavigationItem component props\n * @typedef {Object} NavigationItemProps\n * @property {string} value - 탭 값 / Tab value\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 / Tab change callback\n * @property {\"pills\" | \"underline\" | \"cards\"} [variant] - Navigation 스타일 변형 (자동으로 설정됨) / Navigation style variant (auto-set)\n * @property {\"small\" | \"medium\" | \"large\"} [scale] - Navigation 크기 (자동으로 설정됨) / Navigation size (auto-set)\n * @property {boolean} [active] - 활성 상태 (자동으로 설정됨) / Active state (auto-set)\n * @extends {Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'style'>}\n */\nexport interface NavigationItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'style'> {\n value: string\n onValueChange?: (value: string) => void\n variant?: \"pills\" | \"underline\" | \"cards\"\n scale?: \"small\" | \"medium\" | \"large\"\n active?: boolean\n}\n\nconst NavigationItem = React.forwardRef<HTMLButtonElement, NavigationItemProps>(\n ({ \n className, \n value,\n onValueChange,\n variant = \"pills\",\n scale = \"medium\",\n active = false,\n children,\n ...props \n }, ref) => {\n const getStyleClasses = () => {\n switch (variant) {\n case \"pills\":\n return merge(\n \"rounded-lg px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )\n case \"underline\":\n return merge(\n \"border-b-2 px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"border-primary text-primary\"\n : \"border-transparent text-muted-foreground hover:text-foreground\"\n )\n case \"cards\":\n return merge(\n \"rounded-lg px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"bg-background text-foreground shadow-sm border border-border\"\n : \"text-muted-foreground hover:text-foreground\"\n )\n default:\n return merge(\n \"rounded-lg px-3 py-2 text-sm font-medium transition-all\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )\n }\n }\n\n const getScaleClasses = () => {\n switch (scale) {\n case \"small\":\n return \"text-xs px-2 py-1\"\n case \"large\":\n return \"text-base px-4 py-3\"\n default:\n return \"text-sm px-3 py-2\"\n }\n }\n\n const handleClick = () => {\n onValueChange?.(value)\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n getStyleClasses(),\n getScaleClasses(),\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nNavigationItem.displayName = \"NavigationItem\"\n\n/**\n * NavigationContent 컴포넌트의 props / NavigationContent component props\n * @typedef {Object} NavigationContentProps\n * @property {string} value - 탭 값 / Tab value\n * @property {boolean} [active] - 활성 상태 (자동으로 설정됨) / Active state (auto-set)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface NavigationContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n active?: boolean\n}\n\nconst NavigationContent = React.forwardRef<HTMLDivElement, NavigationContentProps>(\n ({ className, active = false, ...props }, ref) => {\n if (!active) return null\n\n return (\n <div\n ref={ref}\n className={merge(\"mt-4\", className)}\n {...props}\n />\n )\n }\n)\nNavigationContent.displayName = \"NavigationContent\"\n\n// 서브컴포넌트 타입 정의\nexport interface NavigationComponent extends React.ForwardRefExoticComponent<NavigationProps & React.RefAttributes<HTMLDivElement>> {\n List: typeof NavigationList\n Item: typeof NavigationItem\n Content: typeof NavigationContent\n}\n\nconst NavigationComponent = Navigation as NavigationComponent\nNavigationComponent.List = NavigationList\nNavigationComponent.Item = NavigationItem\nNavigationComponent.Content = NavigationContent\n\nexport { NavigationComponent as Navigation, NavigationList, NavigationItem, NavigationContent } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Pagination 컴포넌트의 props / Pagination component props\n * @typedef {Object} PaginationProps\n * @property {number} currentPage - 현재 페이지 번호 / Current page number\n * @property {number} totalPages - 전체 페이지 수 / Total number of pages\n * @property {(page: number) => void} onPageChange - 페이지 변경 콜백 / Page change callback\n * @property {boolean} [showFirstLast=true] - 첫/마지막 페이지 버튼 표시 여부 / Show first/last page buttons\n * @property {boolean} [showPrevNext=true] - 이전/다음 페이지 버튼 표시 여부 / Show previous/next page buttons\n * @property {number} [maxVisiblePages=5] - 최대 표시 페이지 수 / Maximum visible page numbers\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Pagination 크기 / Pagination size\n * @property {\"default\" | \"outlined\" | \"minimal\"} [variant=\"default\"] - Pagination 스타일 변형 / Pagination style variant\n * @property {\"square\" | \"circle\"} [shape=\"square\"] - 버튼 모양 / Button shape\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PaginationProps extends React.HTMLAttributes<HTMLDivElement> {\n currentPage: number\n totalPages: number\n onPageChange: (page: number) => void\n showFirstLast?: boolean\n showPrevNext?: boolean\n maxVisiblePages?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"outlined\" | \"minimal\"\n shape?: \"square\" | \"circle\"\n}\n\n/**\n * Pagination 컴포넌트 / Pagination component\n * \n * 페이지네이션 컨트롤을 제공하는 컴포넌트입니다.\n * 첫/마지막 페이지, 이전/다음 페이지 버튼을 지원하며,\n * 많은 페이지가 있을 경우 자동으로 생략 표시(...)를 합니다.\n * \n * Component that provides pagination controls.\n * Supports first/last page and previous/next page buttons,\n * and automatically shows ellipsis (...) when there are many pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [page, setPage] = useState(1)\n * \n * <Pagination\n * currentPage={page}\n * totalPages={10}\n * onPageChange={setPage}\n * />\n * \n * @example\n * // Outlined 스타일, 원형 버튼 / Outlined style, circular buttons\n * <Pagination\n * currentPage={page}\n * totalPages={20}\n * onPageChange={setPage}\n * variant=\"outlined\"\n * shape=\"circle\"\n * />\n * \n * @param {PaginationProps} props - Pagination 컴포넌트의 props / Pagination component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Pagination 컴포넌트 / Pagination component\n */\nconst Pagination = React.forwardRef<HTMLDivElement, PaginationProps>(\n ({ \n className, \n currentPage,\n totalPages,\n onPageChange,\n showFirstLast = true,\n showPrevNext = true,\n maxVisiblePages = 5,\n size = \"md\",\n variant = \"default\",\n shape = \"square\",\n ...props \n }, ref) => {\n const getVisiblePages = () => {\n const pages: (number | string)[] = []\n const halfVisible = Math.floor(maxVisiblePages / 2)\n \n let start = Math.max(1, currentPage - halfVisible)\n let end = Math.min(totalPages, currentPage + halfVisible)\n \n // 조정\n if (end - start + 1 < maxVisiblePages) {\n if (start === 1) {\n end = Math.min(totalPages, start + maxVisiblePages - 1)\n } else {\n start = Math.max(1, end - maxVisiblePages + 1)\n }\n }\n \n // 첫 페이지\n if (start > 1) {\n pages.push(1)\n if (start > 2) {\n pages.push(\"...\")\n }\n }\n \n // 중간 페이지들\n for (let i = start; i <= end; i++) {\n pages.push(i)\n }\n \n // 마지막 페이지\n if (end < totalPages) {\n if (end < totalPages - 1) {\n pages.push(\"...\")\n }\n pages.push(totalPages)\n }\n \n return pages\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-8 px-2 text-sm\" // 32px 높이, 8px 패딩\n case \"lg\":\n return \"h-12 px-4 text-base\" // 48px 높이, 16px 패딩\n default:\n return \"h-10 px-3 text-sm\" // 40px 높이, 12px 패딩\n }\n }\n\n const getShapeClasses = () => {\n switch (shape) {\n case \"circle\":\n return \"rounded-full aspect-square flex items-center justify-center\"\n default:\n return \"rounded-md\"\n }\n }\n\n const getVariantClasses = (isActive: boolean = false) => {\n switch (variant) {\n case \"outlined\":\n return merge(\n \"border border-border\",\n isActive\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"bg-background text-foreground hover:bg-muted\"\n )\n case \"minimal\":\n return merge(\n \"border-0\",\n isActive\n ? \"bg-primary/10 text-primary\"\n : \"bg-transparent text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"border-0\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"bg-background text-foreground hover:bg-muted\"\n )\n }\n }\n\n const handlePageClick = (page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n onPageChange(page)\n }\n }\n\n const visiblePages = getVisiblePages()\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-center gap-1\",\n className\n )}\n {...props}\n >\n {/* 첫 페이지 버튼 */}\n {showFirstLast && currentPage > 1 && (\n <button\n onClick={() => handlePageClick(1)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"첫 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 19l-7-7 7-7M19 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* 이전 페이지 버튼 */}\n {showPrevNext && currentPage > 1 && (\n <button\n onClick={() => handlePageClick(currentPage - 1)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"이전 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* 페이지 번호들 */}\n {visiblePages.map((page, index) => (\n <React.Fragment key={index}>\n {page === \"...\" ? (\n <span className={merge(\n \"inline-flex items-center justify-center px-3 py-2 text-sm font-medium text-muted-foreground\",\n getSizeClasses()\n )}>\n ...\n </span>\n ) : (\n <button\n onClick={() => handlePageClick(page as number)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses(page === currentPage)\n )}\n aria-label={`${page}페이지로 이동`}\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </button>\n )}\n </React.Fragment>\n ))}\n\n {/* 다음 페이지 버튼 */}\n {showPrevNext && currentPage < totalPages && (\n <button\n onClick={() => handlePageClick(currentPage + 1)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"다음 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n\n {/* 마지막 페이지 버튼 */}\n {showFirstLast && currentPage < totalPages && (\n <button\n onClick={() => handlePageClick(totalPages)}\n className={merge(\n \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n getSizeClasses(),\n getShapeClasses(),\n getVariantClasses()\n )}\n aria-label=\"마지막 페이지로 이동\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 5l7 7-7 7M5 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n </div>\n )\n }\n)\nPagination.displayName = \"Pagination\"\n\n// 편의 컴포넌트들\nexport const PaginationOutlined = React.forwardRef<HTMLDivElement, Omit<PaginationProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Pagination ref={ref} variant=\"outlined\" className={className} {...props} />\n )\n)\nPaginationOutlined.displayName = \"PaginationOutlined\"\n\nexport const PaginationMinimal = React.forwardRef<HTMLDivElement, Omit<PaginationProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Pagination ref={ref} variant=\"minimal\" className={className} {...props} />\n )\n)\nPaginationMinimal.displayName = \"PaginationMinimal\"\n\n// 복합 컴포넌트들\nexport const PaginationWithInfo = React.forwardRef<HTMLDivElement, PaginationProps & { \n totalItems?: number\n itemsPerPage?: number\n showInfo?: boolean\n}>(\n ({ \n totalItems = 0, \n itemsPerPage = 10, \n showInfo = true, \n className, \n ...props \n }, ref) => {\n const startItem = (props.currentPage - 1) * itemsPerPage + 1\n const endItem = Math.min(props.currentPage * itemsPerPage, totalItems)\n \n return (\n <div className={merge(\"flex flex-col sm:flex-row items-center justify-between gap-4\", className)}>\n {showInfo && (\n <div className=\"text-sm text-foreground\">\n {totalItems > 0 ? (\n <>\n <span className=\"font-medium\">{startItem}</span>\n {\" - \"}\n <span className=\"font-medium\">{endItem}</span>\n {\" of \"}\n <span className=\"font-medium\">{totalItems}</span>\n {\" results\"}\n </>\n ) : (\n \"No results\"\n )}\n </div>\n )}\n <Pagination ref={ref} {...props} />\n </div>\n )\n }\n)\nPaginationWithInfo.displayName = \"PaginationWithInfo\"\n\nexport { Pagination } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * PageNavigation 컴포넌트의 props / PageNavigation component props\n * @typedef {Object} PageNavigationProps\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {boolean} [showOnMobile=false] - 모바일에서 표시 여부 / Show on mobile\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PageNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n showOnMobile?: boolean\n}\n\n/**\n * PageNavigation 컴포넌트 / PageNavigation component\n * \n * 이전/다음 페이지로 이동하는 네비게이션 컴포넌트입니다.\n * 문서 페이지나 가이드 페이지에서 사용하기 적합합니다.\n * \n * Navigation component for moving to previous/next pages.\n * Suitable for documentation or guide pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageNavigation\n * prevPage={{ title: \"이전 페이지\", href: \"/prev\" }}\n * nextPage={{ title: \"다음 페이지\", href: \"/next\" }}\n * />\n * \n * @param {PageNavigationProps} props - PageNavigation 컴포넌트의 props / PageNavigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageNavigation 컴포넌트 / PageNavigation component\n */\nconst PageNavigation = React.forwardRef<HTMLDivElement, PageNavigationProps>(\n ({ \n className, \n prevPage, \n nextPage, \n showOnMobile = false,\n ...props \n }, ref) => {\n if (!prevPage && !nextPage) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between py-4\",\n !showOnMobile && \"hidden md:flex\",\n className\n )}\n {...props}\n >\n {/* 이전 페이지 */}\n <div className=\"flex-1\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Icon \n name=\"chevronLeft\" \n className=\"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1\" \n />\n <span className=\"hidden sm:inline\">{prevPage.title}</span>\n </a>\n )}\n </div>\n\n {/* 다음 페이지 */}\n <div className=\"flex-1 flex justify-end\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group inline-flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <span className=\"hidden sm:inline mr-2\">{nextPage.title}</span>\n <Icon \n name=\"chevronRight\" \n className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" \n />\n </a>\n )}\n </div>\n </div>\n )\n }\n)\nPageNavigation.displayName = \"PageNavigation\"\n\nexport { PageNavigation } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\nimport { LoadingSpinner } from './LoadingSpinner'\n\n/**\n * PageTransition 컴포넌트의 props / PageTransition component props\n * @typedef {Object} PageTransitionProps\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [duration=300] - 전환 지속 시간 (ms) / Transition duration (ms)\n * @property {'fade' | 'slide' | 'scale' | 'flip'} [variant='fade'] - 전환 애니메이션 타입 / Transition animation type\n * @property {'default' | 'dots' | 'bars' | 'ring' | 'ripple'} [loadingVariant='ripple'] - 로딩 스피너 타입 / Loading spinner type\n * @property {string} [loadingText='페이지 로딩 중...'] - 로딩 텍스트 / Loading text\n * @property {boolean} [showLoading=true] - 로딩 표시 여부 / Show loading\n * @property {() => void} [onTransitionStart] - 전환 시작 콜백 / Transition start callback\n * @property {() => void} [onTransitionEnd] - 전환 종료 콜백 / Transition end callback\n */\nexport interface PageTransitionProps {\n children: React.ReactNode\n className?: string\n duration?: number\n variant?: 'fade' | 'slide' | 'scale' | 'flip'\n loadingVariant?: 'default' | 'dots' | 'bars' | 'ring' | 'ripple'\n loadingText?: string\n showLoading?: boolean\n onTransitionStart?: () => void\n onTransitionEnd?: () => void\n}\n\n/**\n * PageTransition 컴포넌트 / PageTransition component\n * \n * 페이지 전환 애니메이션을 제공하는 컴포넌트입니다.\n * 다양한 전환 효과와 로딩 스피너를 지원합니다.\n * \n * Component that provides page transition animations.\n * Supports various transition effects and loading spinners.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageTransition>\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @example\n * // Slide 전환 / Slide transition\n * <PageTransition\n * variant=\"slide\"\n * duration={500}\n * loadingVariant=\"dots\"\n * >\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @param {PageTransitionProps} props - PageTransition 컴포넌트의 props / PageTransition component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageTransition 컴포넌트 / PageTransition component\n */\nexport const PageTransition = React.forwardRef<HTMLDivElement, PageTransitionProps>(({\n children,\n className,\n duration = 300,\n variant = 'fade',\n loadingVariant = 'ripple',\n loadingText = '페이지 로딩 중...',\n showLoading = true,\n onTransitionStart,\n onTransitionEnd\n}, ref) => {\n const [isLoading, setIsLoading] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoading(false)\n setIsVisible(true)\n onTransitionEnd?.()\n }, duration)\n\n onTransitionStart?.()\n\n return () => clearTimeout(timer)\n }, [duration, onTransitionStart, onTransitionEnd])\n\n const transitionClasses = {\n fade: merge(\n 'transition-opacity duration-300 ease-in-out',\n isVisible ? 'opacity-100' : 'opacity-0'\n ),\n slide: merge(\n 'transition-transform duration-300 ease-in-out',\n isVisible ? 'translate-x-0' : 'translate-x-full'\n ),\n scale: merge(\n 'transition-all duration-300 ease-in-out',\n isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'\n ),\n flip: merge(\n 'transition-all duration-500 ease-in-out',\n isVisible ? 'rotate-y-0 opacity-100' : 'rotate-y-90 opacity-0'\n )\n }\n\n if (isLoading && showLoading) {\n return (\n <div className={merge('flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-indigo-50 to-purple-50 dark:from-slate-900 dark:to-slate-800', className)}>\n <LoadingSpinner\n size=\"lg\"\n variant={loadingVariant}\n text={loadingText}\n />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'w-full',\n transitionClasses[variant],\n className\n )}\n style={{ transitionDuration: `${duration}ms` }}\n >\n {children}\n </div>\n )\n})\n\nPageTransition.displayName = 'PageTransition'\n\n// Convenience components for different transition types\nexport const FadeTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"fade\" {...props} />\n))\n\nexport const SlideTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"slide\" {...props} />\n))\n\nexport const ScaleTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"scale\" {...props} />\n))\n\nexport const FlipTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"flip\" {...props} />\n))\n\n// Add displayName for convenience components\nFadeTransition.displayName = 'FadeTransition'\nSlideTransition.displayName = 'SlideTransition'\nScaleTransition.displayName = 'ScaleTransition'\nFlipTransition.displayName = 'FlipTransition' "]}
|
package/dist/overlay.d.mts
CHANGED
|
@@ -153,20 +153,6 @@ declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefA
|
|
|
153
153
|
declare const PopoverTrigger: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
154
154
|
declare const PopoverContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
155
155
|
|
|
156
|
-
/**
|
|
157
|
-
* Dropdown 컴포넌트의 props / Dropdown component props
|
|
158
|
-
* @typedef {Object} DropdownProps
|
|
159
|
-
* @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown
|
|
160
|
-
* @property {React.ReactNode} children - Dropdown 내용 / Dropdown content
|
|
161
|
-
* @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode
|
|
162
|
-
* @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback
|
|
163
|
-
* @property {"top" | "bottom" | "left" | "right"} [placement="bottom"] - Dropdown 표시 위치 / Dropdown display position
|
|
164
|
-
* @property {"start" | "center" | "end"} [align="start"] - Dropdown 정렬 / Dropdown alignment
|
|
165
|
-
* @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)
|
|
166
|
-
* @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown
|
|
167
|
-
* @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow
|
|
168
|
-
* @extends {React.HTMLAttributes<HTMLDivElement>}
|
|
169
|
-
*/
|
|
170
156
|
interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
171
157
|
trigger: React.ReactNode;
|
|
172
158
|
children: React.ReactNode;
|
|
@@ -178,42 +164,6 @@ interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
178
164
|
disabled?: boolean;
|
|
179
165
|
showArrow?: boolean;
|
|
180
166
|
}
|
|
181
|
-
/**
|
|
182
|
-
* Dropdown 컴포넌트 / Dropdown component
|
|
183
|
-
*
|
|
184
|
-
* 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.
|
|
185
|
-
* 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.
|
|
186
|
-
*
|
|
187
|
-
* Dropdown menu component that appears when the trigger element is clicked.
|
|
188
|
-
* Automatically closes on outside click and adjusts position by detecting viewport boundaries.
|
|
189
|
-
*
|
|
190
|
-
* @component
|
|
191
|
-
* @example
|
|
192
|
-
* // 기본 사용 / Basic usage
|
|
193
|
-
* <Dropdown trigger={<Button>메뉴</Button>}>
|
|
194
|
-
* <Menu>
|
|
195
|
-
* <MenuItem>항목 1</MenuItem>
|
|
196
|
-
* <MenuItem>항목 2</MenuItem>
|
|
197
|
-
* </Menu>
|
|
198
|
-
* </Dropdown>
|
|
199
|
-
*
|
|
200
|
-
* @example
|
|
201
|
-
* // 제어 모드, 화살표 없음 / Controlled mode, no arrow
|
|
202
|
-
* const [open, setOpen] = useState(false)
|
|
203
|
-
* <Dropdown
|
|
204
|
-
* open={open}
|
|
205
|
-
* onOpenChange={setOpen}
|
|
206
|
-
* trigger={<Button>제어 모드</Button>}
|
|
207
|
-
* placement="top"
|
|
208
|
-
* showArrow={false}
|
|
209
|
-
* >
|
|
210
|
-
* <div className="p-4">내용</div>
|
|
211
|
-
* </Dropdown>
|
|
212
|
-
*
|
|
213
|
-
* @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props
|
|
214
|
-
* @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref
|
|
215
|
-
* @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component
|
|
216
|
-
*/
|
|
217
167
|
declare const Dropdown: React.ForwardRefExoticComponent<DropdownProps & React.RefAttributes<HTMLDivElement>>;
|
|
218
168
|
interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
219
169
|
icon?: React.ReactNode;
|
package/dist/overlay.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {a}from'./chunk-
|
|
2
|
+
import {a}from'./chunk-HBIUCLFL.mjs';export{a as Modal}from'./chunk-HBIUCLFL.mjs';export{g as Drawer,i as DrawerContent,j as DrawerFooter,h as DrawerHeader,a as Dropdown,f as DropdownGroup,b as DropdownItem,d as DropdownLabel,e as DropdownMenu,c as DropdownSeparator}from'./chunk-OIWG3IJ7.mjs';export{a as Popover,c as PopoverContent,b as PopoverTrigger}from'./chunk-ZY23NOT4.mjs';import {d}from'./chunk-O24K56OS.mjs';import'./chunk-SD6XGDAC.mjs';import {l}from'./chunk-ZQUMJQYV.mjs';import {a as a$1}from'./chunk-QEMPERUK.mjs';import'./chunk-EAZEI74V.mjs';import o from'react';import {jsx,jsxs}from'react/jsx-runtime';var W=o.forwardRef(({isOpen:s,onClose:r,onConfirm:c,title:d$1,message:a$2,warning:m,confirmText:T="\uD655\uC778",cancelText:D="\uCDE8\uC18C",confirmButtonText:x,type:E="danger",loading:w=false,disabled:g=false,showInput:y=false,inputValue:C="",onInputChange:p,inputPlaceholder:l,inputLabel:v,requiredInputValue:k,showCancel:b=true,size:N="md"},h)=>{let f={danger:{icon:jsx("svg",{className:"h-6 w-6 text-destructive",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"})}),bgColor:"bg-destructive/10",buttonColor:"bg-destructive hover:bg-destructive/90 focus:ring-destructive",textColor:"text-destructive"},warning:{icon:jsx("svg",{className:"h-6 w-6 text-yellow-600 dark:text-yellow-400",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"})}),bgColor:"bg-yellow-100 dark:bg-yellow-900/20",buttonColor:"bg-yellow-600 hover:bg-yellow-700 focus:ring-yellow-500",textColor:"text-yellow-600 dark:text-yellow-400"},info:{icon:jsx("svg",{className:"h-6 w-6 text-primary",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"})}),bgColor:"bg-primary/10",buttonColor:"bg-primary hover:bg-primary/80 focus:ring-ring",textColor:"text-primary"},success:{icon:jsx("svg",{className:"h-6 w-6 text-green-600 dark:text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})}),bgColor:"bg-green-100 dark:bg-green-900/20",buttonColor:"bg-green-600 hover:bg-green-700 focus:ring-green-500",textColor:"text-green-600 dark:text-green-400"},error:{icon:jsx("svg",{className:"h-6 w-6 text-destructive",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})}),bgColor:"bg-destructive/10",buttonColor:"bg-destructive hover:bg-destructive/90 focus:ring-destructive",textColor:"text-destructive"}}[E],M=g||w||!(!y||!k||C===k);return jsx(a,{isOpen:s,onClose:r,closable:false,size:N,children:jsxs("div",{className:"text-center",children:[jsx("div",{className:a$1("mx-auto flex items-center justify-center h-16 w-16 rounded-full mb-6",f.bgColor),children:f.icon}),jsxs("h3",{className:"text-xl font-semibold text-foreground mb-4",children:[" ",d$1]}),jsxs("div",{className:"mb-6",children:[" ",jsx("p",{className:"text-sm text-muted-foreground",children:a$2}),m&&jsx("p",{className:a$1("text-sm mt-3 font-medium",f.textColor),children:m})]}),y&&jsxs("div",{className:"mb-6",children:[" ",jsxs("label",{htmlFor:"confirmInput",className:"block text-sm font-medium text-foreground mb-3 text-left",children:[" ",v]}),jsx("input",{type:"text",id:"confirmInput",value:C,onChange:S=>p==null?void 0:p(S.target.value),placeholder:l,className:"w-full px-4 py-3 border border-input rounded-lg focus:outline-none focus:ring-1 focus:ring-destructive focus:border-transparent bg-background text-foreground transition-colors"})]}),jsxs("div",{className:a$1("flex gap-3","justify-center"),children:[b&&jsx(d,{variant:"outline",onClick:r,disabled:w,className:"px-6 py-3",children:D}),jsx(d,{variant:"default",onClick:c,disabled:M,className:a$1("px-6 py-3",f.buttonColor),children:w?jsxs("div",{className:"flex items-center",children:[jsxs("svg",{className:"animate-spin -ml-1 mr-2 h-4 w-4 text-white",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),"\uCC98\uB9AC \uC911..."]}):x||T})]})]})})});W.displayName="ConfirmModal";var V=o.forwardRef(({isOpen:s,onClose:r,children:c,className:d,height:a="md",showBackdrop:m=true,backdropClassName:T,closeOnBackdropClick:D=true,closeOnEscape:x=true,showDragHandle:E=true,closable:w=true,snapPoints:g=[25,50,75,100],defaultSnap:y=50,...C},p)=>{let l=s!=null?s:false,v=()=>{r==null||r();},[k,b]=o.useState(false),[N,h]=o.useState(false),[H,f]=o.useState(y),[B,M]=o.useState(false),[S,K]=o.useState(0),[Y,j]=o.useState(0),O={sm:"h-64",md:"h-96",lg:"h-[32rem]",xl:"h-[40rem]",full:"h-full"};o.useEffect(()=>{if(l){b(true),h(true);let t=setTimeout(()=>h(false),50);return ()=>clearTimeout(t)}else {h(true);let t=setTimeout(()=>{b(false),h(false);},300);return ()=>clearTimeout(t)}},[l]),o.useEffect(()=>{if(!x)return;let t=L=>{L.key==="Escape"&&l&&v();};return l&&(document.addEventListener("keydown",t),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",t),document.body.style.overflow="";}},[l,x]);let _=t=>{M(true),K(t.touches[0].clientY),j(t.touches[0].clientY);},$=t=>{B&&j(t.touches[0].clientY);},G=()=>{if(!B)return;M(false);let t=Y-S,L=100;if(t>L)v();else if(t<-L){let q=g.indexOf(H),J=Math.min(q+1,g.length-1);f(g[J]);}};return k?jsxs("div",{className:"fixed inset-0 z-50",children:[m&&jsx("div",{className:a$1("absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300",N?l?"opacity-100":"opacity-0":"",T),onClick:D?v:void 0}),jsxs("div",{ref:p,className:a$1("absolute bottom-0 left-0 right-0 bg-background/95 backdrop-blur-xl border-t border-border/50 shadow-2xl rounded-t-lg transition-transform duration-300 ease-out pb-safe",a!=="full"?O[a]:"",N?l?"translate-y-0":"translate-y-full":"",d),style:{height:a==="full"?`${H}%`:void 0,maxHeight:a!=="full"?void 0:"100%",transform:B?`translateY(${Y-S}px)`:void 0},onTouchStart:_,onTouchMove:$,onTouchEnd:G,...C,children:[E&&jsx("div",{className:"flex justify-center pt-3 pb-2",children:jsx("div",{className:"w-12 h-1.5 bg-muted-foreground/30 rounded-full"})}),c]})]}):null});V.displayName="BottomSheet";var A=o.forwardRef(({children:s,className:r,showCloseButton:c=true,onClose:d,...a},m)=>jsxs("div",{ref:m,className:a$1("flex items-center justify-between px-6 py-4",r),...a,children:[jsx("div",{className:"flex-1",children:s}),c&&jsx("button",{onClick:d,className:"p-2 rounded-lg hover:bg-muted transition-colors",children:jsx(l,{name:"close",size:20})})]}));A.displayName="BottomSheetHeader";var F=o.forwardRef(({children:s,className:r,...c},d)=>jsx("div",{ref:d,className:a$1("flex-1 px-6 pb-6 overflow-y-auto",r),...c,children:s}));F.displayName="BottomSheetContent";
|
|
3
3
|
export{V as BottomSheet,F as BottomSheetContent,A as BottomSheetHeader,W as ConfirmModal};//# sourceMappingURL=overlay.mjs.map
|
|
4
4
|
//# sourceMappingURL=overlay.mjs.map
|