@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
package/dist/overlay.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ConfirmModal.tsx","../src/components/BottomSheet.tsx"],"names":["ConfirmModal","React","isOpen","onClose","onConfirm","title","message","warning","confirmText","cancelText","confirmButtonText","type","loading","disabled","showInput","inputValue","onInputChange","inputPlaceholder","inputLabel","requiredInputValue","showCancel","size","_ref","config","jsx","isDisabled","Modal","jsxs","merge","e","Button","BottomSheet","children","className","height","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","showDragHandle","closable","snapPoints","defaultSnap","props","ref","_isOpen","handleClose","isVisible","setIsVisible","isAnimating","setIsAnimating","currentHeight","setCurrentHeight","isDragging","setIsDragging","startY","setStartY","currentY","setCurrentY","heightClasses","timer","handleEscapeKey","handleTouchStart","handleTouchMove","handleTouchEnd","deltaY","threshold","currentIndex","nextIndex","BottomSheetHeader","showCloseButton","Icon","BottomSheetContent"],"mappings":"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","file":"overlay.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Modal } from \"./Modal\"\nimport { Button } from \"./Button\"\n\n/**\n * ConfirmModal 컴포넌트의 props / ConfirmModal component props\n * @typedef {Object} ConfirmModalProps\n * @property {boolean} isOpen - 모달 열림/닫힘 상태 / Modal open/close state\n * @property {() => void} onClose - 닫기 콜백 / Close callback\n * @property {() => void} onConfirm - 확인 콜백 / Confirm callback\n * @property {string} title - 모달 제목 / Modal title\n * @property {string} message - 모달 메시지 / Modal message\n * @property {string} [warning] - 경고 메시지 / Warning message\n * @property {string} [confirmText=\"확인\"] - 확인 버튼 텍스트 / Confirm button text\n * @property {string} [cancelText=\"취소\"] - 취소 버튼 텍스트 / Cancel button text\n * @property {string} [confirmButtonText] - 확인 버튼 커스텀 텍스트 / Custom confirm button text\n * @property {\"danger\" | \"warning\" | \"info\" | \"success\" | \"error\"} [type=\"danger\"] - 모달 타입 / Modal type\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {boolean} [disabled=false] - 비활성화 여부 / Disabled state\n * @property {boolean} [showInput=false] - 입력 필드 표시 여부 / Show input field\n * @property {string} [inputValue=\"\"] - 입력 필드 값 / Input field value\n * @property {(value: string) => void} [onInputChange] - 입력 값 변경 콜백 / Input value change callback\n * @property {string} [inputPlaceholder] - 입력 필드 플레이스홀더 / Input field placeholder\n * @property {string} [inputLabel] - 입력 필드 라벨 / Input field label\n * @property {string} [requiredInputValue] - 필수 입력 값 (확인 버튼 활성화 조건) / Required input value (confirm button activation condition)\n * @property {boolean} [showCancel=true] - 취소 버튼 표시 여부 / Show cancel button\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"} [size=\"md\"] - 모달 크기 / Modal size\n */\nexport interface ConfirmModalProps {\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n message: string\n warning?: string\n confirmText?: string\n cancelText?: string\n confirmButtonText?: string\n type?: \"danger\" | \"warning\" | \"info\" | \"success\" | \"error\"\n loading?: boolean\n disabled?: boolean\n showInput?: boolean\n inputValue?: string\n onInputChange?: (value: string) => void\n inputPlaceholder?: string\n inputLabel?: string\n requiredInputValue?: string\n showCancel?: boolean\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n}\n\n/**\n * ConfirmModal 컴포넌트 / ConfirmModal component\n * \n * 확인/취소가 필요한 모달 컴포넌트입니다.\n * 다양한 타입(danger, warning, info, success, error)을 지원하며,\n * 입력 필드와 필수 입력 값 검증을 지원합니다.\n * \n * Modal component that requires confirmation/cancellation.\n * Supports various types (danger, warning, info, success, error),\n * and supports input fields and required input value validation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ConfirmModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * onConfirm={handleConfirm}\n * title=\"삭제 확인\"\n * message=\"정말 삭제하시겠습니까?\"\n * />\n * \n * @example\n * // 입력 필드와 함께 / With input field\n * <ConfirmModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * onConfirm={handleDelete}\n * title=\"삭제 확인\"\n * message=\"삭제하려면 'DELETE'를 입력하세요\"\n * showInput\n * inputLabel=\"확인 입력\"\n * requiredInputValue=\"DELETE\"\n * inputValue={inputValue}\n * onInputChange={setInputValue}\n * />\n * \n * @param {ConfirmModalProps} props - ConfirmModal 컴포넌트의 props / ConfirmModal component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ConfirmModal 컴포넌트 / ConfirmModal component\n */\nconst ConfirmModal = React.forwardRef<HTMLDivElement, ConfirmModalProps>(\n ({\n isOpen,\n onClose,\n onConfirm,\n title,\n message,\n warning,\n confirmText = \"확인\",\n cancelText = \"취소\",\n confirmButtonText,\n type = \"danger\",\n loading = false,\n disabled = false,\n showInput = false,\n inputValue = \"\",\n onInputChange,\n inputPlaceholder,\n inputLabel,\n requiredInputValue,\n showCancel = true,\n size = \"md\"\n }, _ref) => {\n // 타입별 아이콘과 색상\n const typeConfig = {\n danger: {\n icon: (\n <svg className=\"h-6 w-6 text-destructive\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n ),\n bgColor: \"bg-destructive/10\",\n buttonColor: \"bg-destructive hover:bg-destructive/90 focus:ring-destructive\",\n textColor: \"text-destructive\"\n },\n warning: {\n icon: (\n <svg className=\"h-6 w-6 text-yellow-600 dark:text-yellow-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n ),\n bgColor: \"bg-yellow-100 dark:bg-yellow-900/20\",\n buttonColor: \"bg-yellow-600 hover:bg-yellow-700 focus:ring-yellow-500\",\n textColor: \"text-yellow-600 dark:text-yellow-400\"\n },\n info: {\n icon: (\n <svg className=\"h-6 w-6 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n ),\n bgColor: \"bg-primary/10\",\n buttonColor: \"bg-primary hover:bg-primary/80 focus:ring-ring\",\n textColor: \"text-primary\"\n },\n success: {\n icon: (\n <svg className=\"h-6 w-6 text-green-600 dark:text-green-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n bgColor: \"bg-green-100 dark:bg-green-900/20\",\n buttonColor: \"bg-green-600 hover:bg-green-700 focus:ring-green-500\",\n textColor: \"text-green-600 dark:text-green-400\"\n },\n error: {\n icon: (\n <svg className=\"h-6 w-6 text-destructive\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ),\n bgColor: \"bg-destructive/10\",\n buttonColor: \"bg-destructive hover:bg-destructive/90 focus:ring-destructive\",\n textColor: \"text-destructive\"\n }\n }\n\n const config = typeConfig[type]\n const isInputValid = !showInput || !requiredInputValue || inputValue === requiredInputValue\n const isDisabled = disabled || loading || !isInputValid\n\n return (\n <Modal \n isOpen={isOpen} \n onClose={onClose} \n closable={false}\n size={size}\n >\n <div className=\"text-center\">\n {/* 아이콘 */}\n <div className={merge(\n \"mx-auto flex items-center justify-center h-16 w-16 rounded-full mb-6\", // 64px 아이콘, 24px 여백\n config.bgColor\n )}>\n {config.icon}\n </div>\n\n {/* 제목 */}\n <h3 className=\"text-xl font-semibold text-foreground mb-4\"> {/* 16px 여백 */}\n {title}\n </h3>\n\n {/* 메시지 */}\n <div className=\"mb-6\"> {/* 24px 여백 */}\n <p className=\"text-sm text-muted-foreground\">\n {message}\n </p>\n \n {/* 경고 메시지 */}\n {warning && (\n <p className={merge(\n \"text-sm mt-3 font-medium\", // 12px 여백\n config.textColor\n )}>\n {warning}\n </p>\n )}\n </div>\n\n {/* 입력 필드 */}\n {showInput && (\n <div className=\"mb-6\"> {/* 24px 여백 */}\n <label htmlFor=\"confirmInput\" className=\"block text-sm font-medium text-foreground mb-3 text-left\"> {/* 12px 여백 */}\n {inputLabel}\n </label>\n <input\n type=\"text\"\n id=\"confirmInput\"\n value={inputValue}\n onChange={(e) => onInputChange?.(e.target.value)}\n placeholder={inputPlaceholder}\n 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\" // 16px, 12px 패딩\n />\n </div>\n )}\n\n {/* 버튼 */}\n <div className={merge(\n \"flex gap-3\", // 12px 간격\n showCancel ? \"justify-center\" : \"justify-center\"\n )}>\n {showCancel && (\n <Button\n variant=\"outline\"\n onClick={onClose}\n disabled={loading}\n className=\"px-6 py-3\" // 24px, 12px 패딩\n >\n {cancelText}\n </Button>\n )}\n <Button\n variant=\"default\"\n onClick={onConfirm}\n disabled={isDisabled}\n className={merge(\n \"px-6 py-3\", // 24px, 12px 패딩\n config.buttonColor\n )}\n >\n {loading ? (\n <div className=\"flex items-center\">\n <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\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <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\"></path>\n </svg>\n 처리 중...\n </div>\n ) : (\n confirmButtonText || confirmText\n )}\n </Button>\n </div>\n </div>\n </Modal>\n )\n }\n)\nConfirmModal.displayName = \"ConfirmModal\"\n\nexport { ConfirmModal } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * BottomSheet 컴포넌트의 props / BottomSheet component props\n * @typedef {Object} BottomSheetProps\n * @property {boolean} open - BottomSheet 열림/닫힘 상태 / BottomSheet open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - BottomSheet 내용 / BottomSheet content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [height=\"md\"] - BottomSheet 높이 / BottomSheet height\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n * @property {boolean} [showDragHandle=true] - 드래그 핸들 표시 여부 / Show drag handle\n * @property {number[]} [snapPoints=[25, 50, 75, 100]] - 스냅 포인트 (퍼센트) / Snap points (percentage)\n * @property {number} [defaultSnap=50] - 기본 스냅 포인트 (퍼센트) / Default snap point (percentage)\n */\ninterface BottomSheetProps {\n /** BottomSheet 열림/닫힘 상태 / BottomSheet open/close state */\n isOpen?: boolean\n /** BottomSheet 닫기 콜백 / BottomSheet close callback */\n onClose?: () => void\n /** BottomSheet 내용 / BottomSheet content */\n children: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS class */\n className?: string\n /** BottomSheet 높이 / BottomSheet height */\n height?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class */\n backdropClassName?: string\n /** 배경 클릭 시 닫기 여부 / Close on backdrop click */\n closeOnBackdropClick?: boolean\n /** ESC 키로 닫기 여부 / Close on ESC key */\n closeOnEscape?: boolean\n /** 드래그 핸들 표시 여부 / Show drag handle */\n showDragHandle?: boolean\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n /** 스냅 포인트 (퍼센트) / Snap points (percentage) */\n snapPoints?: number[]\n /** 기본 스냅 포인트 (퍼센트) / Default snap point (percentage) */\n defaultSnap?: number\n}\n\n/**\n * BottomSheet 컴포넌트 / BottomSheet component\n * \n * 화면 하단에서 올라오는 시트 컴포넌트입니다.\n * 모바일 친화적인 UI를 제공하며, 드래그로 높이를 조절할 수 있습니다.\n * 스냅 포인트를 지원하여 특정 높이에서 멈출 수 있습니다.\n * \n * Sheet component that slides up from the bottom of the screen.\n * Provides mobile-friendly UI and allows height adjustment by dragging.\n * Supports snap points to stop at specific heights.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <BottomSheet open={open} onOpenChange={setOpen}>\n * <BottomSheetHeader>제목</BottomSheetHeader>\n * <BottomSheetContent>내용</BottomSheetContent>\n * </BottomSheet>\n * \n * @example\n * // 커스텀 스냅 포인트 / Custom snap points\n * <BottomSheet \n * open={open} \n * onOpenChange={setOpen}\n * snapPoints={[30, 60, 90]}\n * defaultSnap={30}\n * >\n * <BottomSheetContent>내용</BottomSheetContent>\n * </BottomSheet>\n * \n * @param {BottomSheetProps} props - BottomSheet 컴포넌트의 props / BottomSheet component props\n * @param {React.Ref<HTMLDivElement>} ref - BottomSheet 컨테이너 ref / BottomSheet container ref\n * @returns {JSX.Element} BottomSheet 컴포넌트 / BottomSheet component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst BottomSheet = React.forwardRef<HTMLDivElement, BottomSheetProps>(\n ({\n isOpen,\n onClose,\n children,\n className,\n height = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n showDragHandle = true,\n closable = true,\n snapPoints = [25, 50, 75, 100],\n defaultSnap = 50,\n ...props\n }, ref) => {\n const _isOpen = isOpen ?? false\n const handleClose = () => {\n onClose?.()\n }\n\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n const [currentHeight, setCurrentHeight] = React.useState(defaultSnap)\n const [isDragging, setIsDragging] = React.useState(false)\n const [startY, setStartY] = React.useState(0)\n const [currentY, setCurrentY] = React.useState(0)\n\n const heightClasses = {\n sm: \"h-64\",\n md: \"h-96\",\n lg: \"h-[32rem]\",\n xl: \"h-[40rem]\",\n full: \"h-full\"\n }\n\n React.useEffect(() => {\n if (_isOpen) {\n setIsVisible(true)\n setIsAnimating(true)\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300)\n return () => clearTimeout(timer)\n }\n }, [_isOpen])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscapeKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && _isOpen) {\n handleClose()\n }\n }\n\n if (_isOpen) {\n document.addEventListener(\"keydown\", handleEscapeKey)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKey)\n document.body.style.overflow = \"\"\n }\n }, [_isOpen, closeOnEscape])\n\n const handleTouchStart = (e: React.TouchEvent) => {\n setIsDragging(true)\n setStartY(e.touches[0].clientY)\n setCurrentY(e.touches[0].clientY)\n }\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!isDragging) return\n setCurrentY(e.touches[0].clientY)\n }\n\n const handleTouchEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n\n const deltaY = currentY - startY\n const threshold = 100\n\n if (deltaY > threshold) {\n // 아래로 드래그 - 닫기\n handleClose()\n } else if (deltaY < -threshold) {\n // 위로 드래그 - 다음 스냅 포인트\n const currentIndex = snapPoints.indexOf(currentHeight)\n const nextIndex = Math.min(currentIndex + 1, snapPoints.length - 1)\n setCurrentHeight(snapPoints[nextIndex])\n }\n }\n\n if (!isVisible) return null\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (_isOpen ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? handleClose : undefined}\n />\n )}\n\n {/* Bottom Sheet */}\n <div\n ref={ref}\n className={merge(\n \"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\",\n height !== \"full\" ? heightClasses[height] : \"\",\n isAnimating ? (_isOpen ? \"translate-y-0\" : \"translate-y-full\") : \"\",\n className\n )}\n style={{\n // height prop이 \"full\"일 때만 퍼센트 높이 사용 (스냅 포인트)\n // 그 외에는 heightClasses의 고정 높이 사용\n height: height === \"full\" ? `${currentHeight}%` : undefined,\n maxHeight: height !== \"full\" ? undefined : \"100%\",\n transform: isDragging ? `translateY(${currentY - startY}px)` : undefined\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n {...props}\n >\n {/* Drag Handle */}\n {showDragHandle && (\n <div className=\"flex justify-center pt-3 pb-2\">\n <div className=\"w-12 h-1.5 bg-muted-foreground/30 rounded-full\" />\n </div>\n )}\n\n {children}\n </div>\n </div>\n )\n }\n)\nBottomSheet.displayName = \"BottomSheet\"\n\n/**\n * BottomSheetHeader 컴포넌트의 props / BottomSheetHeader component props\n * @typedef {Object} BottomSheetHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface BottomSheetHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * BottomSheetHeader 컴포넌트 / BottomSheetHeader component\n * BottomSheet의 헤더 영역을 표시합니다.\n * Displays the header area of a BottomSheet.\n * \n * @component\n * @param {BottomSheetHeaderProps} props - BottomSheetHeader 컴포넌트의 props / BottomSheetHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} BottomSheetHeader 컴포넌트 / BottomSheetHeader component\n */\nconst BottomSheetHeader = React.forwardRef<HTMLDivElement, BottomSheetHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between px-6 py-4\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-muted transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nBottomSheetHeader.displayName = \"BottomSheetHeader\"\n\n/**\n * BottomSheetContent 컴포넌트의 props / BottomSheetContent component props\n * @typedef {Object} BottomSheetContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface BottomSheetContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * BottomSheetContent 컴포넌트 / BottomSheetContent component\n * BottomSheet의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a BottomSheet.\n * \n * @component\n * @param {BottomSheetContentProps} props - BottomSheetContent 컴포넌트의 props / BottomSheetContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} BottomSheetContent 컴포넌트 / BottomSheetContent component\n */\nconst BottomSheetContent = React.forwardRef<HTMLDivElement, BottomSheetContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 px-6 pb-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nBottomSheetContent.displayName = \"BottomSheetContent\"\n\nexport { BottomSheet, BottomSheetHeader, BottomSheetContent } "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ConfirmModal.tsx","../src/components/BottomSheet.tsx"],"names":["ConfirmModal","React","isOpen","onClose","onConfirm","title","message","warning","confirmText","cancelText","confirmButtonText","type","loading","disabled","showInput","inputValue","onInputChange","inputPlaceholder","inputLabel","requiredInputValue","showCancel","size","_ref","config","jsx","isDisabled","Modal","jsxs","merge","e","Button","BottomSheet","children","className","height","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","showDragHandle","closable","snapPoints","defaultSnap","props","ref","_isOpen","handleClose","isVisible","setIsVisible","isAnimating","setIsAnimating","currentHeight","setCurrentHeight","isDragging","setIsDragging","startY","setStartY","currentY","setCurrentY","heightClasses","timer","handleEscapeKey","handleTouchStart","handleTouchMove","handleTouchEnd","deltaY","threshold","currentIndex","nextIndex","BottomSheetHeader","showCloseButton","Icon","BottomSheetContent"],"mappings":"2mBA+FA,IAAMA,CAAAA,CAAeC,CAAAA,CAAM,UAAA,CACzB,CAAC,CACC,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,GAAAA,CACA,OAAA,CAAAC,GAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,eACd,UAAA,CAAAC,CAAAA,CAAa,cAAA,CACb,iBAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CAAO,QAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,KAAA,CACV,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,UAAAC,CAAAA,CAAY,KAAA,CACZ,UAAA,CAAAC,CAAAA,CAAa,EAAA,CACb,aAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,EAAa,IAAA,CACb,IAAA,CAAAC,CAAAA,CAAO,IACT,CAAA,CAAGC,CAAAA,GAAS,CAuDV,IAAMC,CAAAA,CArDa,CACjB,MAAA,CAAQ,CACN,IAAA,CACEC,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CAClF,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,2IAAA,CAA4I,CAAA,CACnN,CAAA,CAEF,OAAA,CAAS,mBAAA,CACT,WAAA,CAAa,+DAAA,CACb,SAAA,CAAW,kBACb,CAAA,CACA,QAAS,CACP,IAAA,CACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CAA+C,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACtG,QAAA,CAAAA,GAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,2IAAA,CAA4I,CAAA,CACnN,CAAA,CAEF,OAAA,CAAS,qCAAA,CACT,WAAA,CAAa,0DACb,SAAA,CAAW,sCACb,CAAA,CACA,IAAA,CAAM,CACJ,IAAA,CACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,CAC9E,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,2DAAA,CAA4D,CAAA,CACnI,CAAA,CAEF,QAAS,eAAA,CACT,WAAA,CAAa,gDAAA,CACb,SAAA,CAAW,cACb,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CAA6C,IAAA,CAAK,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACpG,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,iBAAiB,CAAA,CACxF,CAAA,CAEF,OAAA,CAAS,mCAAA,CACT,WAAA,CAAa,sDAAA,CACb,SAAA,CAAW,oCACb,CAAA,CACA,KAAA,CAAO,CACL,IAAA,CACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0BAAA,CAA2B,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CAClF,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,sBAAA,CAAuB,CAAA,CAC9F,CAAA,CAEF,OAAA,CAAS,mBAAA,CACT,WAAA,CAAa,+DAAA,CACb,SAAA,CAAW,kBACb,CACF,CAAA,CAE0Bb,CAAI,EAExBc,CAAAA,CAAaZ,CAAAA,EAAYD,CAAAA,EAAW,EADrB,CAACE,CAAAA,EAAa,CAACK,CAAAA,EAAsBJ,CAAAA,GAAeI,CAAAA,CAAAA,CAGzE,OACEK,GAAAA,CAACE,CAAAA,CAAA,CACC,MAAA,CAAQxB,CAAAA,CACR,OAAA,CAASC,CAAAA,CACT,QAAA,CAAU,KAAA,CACV,IAAA,CAAMkB,CAAAA,CAEN,QAAA,CAAAM,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CAEb,QAAA,CAAA,CAAAH,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWI,GAAAA,CACd,sEAAA,CACAL,CAAAA,CAAO,OACT,CAAA,CACG,QAAA,CAAAA,CAAAA,CAAO,IAAA,CACV,CAAA,CAGAI,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,6CAA6C,QAAA,CAAA,CAAA,GAAA,CACxDtB,GAAAA,CAAAA,CACH,CAAA,CAGAsB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAO,QAAA,CAAA,CAAA,GAAA,CACpBH,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CACV,QAAA,CAAAlB,GAAAA,CACH,EAGCC,CAAAA,EACCiB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWI,GAAAA,CACZ,0BAAA,CACAL,CAAAA,CAAO,SACT,CAAA,CACG,QAAA,CAAAhB,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAGCO,CAAAA,EACCa,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAO,QAAA,CAAA,CAAA,GAAA,CACpBA,IAAAA,CAAC,OAAA,CAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,SAAA,CAAU,0DAAA,CAA2D,QAAA,CAAA,CAAA,GAAA,CAChGT,CAAAA,CAAAA,CACH,CAAA,CACAM,GAAAA,CAAC,SACC,IAAA,CAAK,MAAA,CACL,EAAA,CAAG,cAAA,CACH,KAAA,CAAOT,CAAAA,CACP,QAAA,CAAWc,CAAAA,EAAMb,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAgBa,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAA,CAC1C,YAAaZ,CAAAA,CACb,SAAA,CAAU,iLAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAIFU,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,GAAAA,CACd,YAAA,CACa,gBACf,CAAA,CACG,QAAA,CAAA,CAAAR,CAAAA,EACCI,IAACM,CAAAA,CAAA,CACC,OAAA,CAAQ,SAAA,CACR,OAAA,CAAS3B,CAAAA,CACT,SAAUS,CAAAA,CACV,SAAA,CAAU,WAAA,CAET,QAAA,CAAAH,CAAAA,CACH,CAAA,CAEFe,IAACM,CAAAA,CAAA,CACC,OAAA,CAAQ,SAAA,CACR,OAAA,CAAS1B,CAAAA,CACT,QAAA,CAAUqB,CAAAA,CACV,SAAA,CAAWG,GAAAA,CACT,WAAA,CACAL,CAAAA,CAAO,WACT,CAAA,CAEC,SAAAX,CAAAA,CACCe,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CAA6C,KAAA,CAAM,4BAAA,CAA6B,IAAA,CAAK,MAAA,CAAO,QAAQ,WAAA,CACjH,QAAA,CAAA,CAAAH,GAAAA,CAAC,QAAA,CAAA,CAAO,SAAA,CAAU,YAAA,CAAa,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,YAAY,GAAA,CAAI,CAAA,CAC5FA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAa,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,iHAAA,CAAkH,CAAA,CAAA,CACvK,CAAA,CAAM,wBAAA,CAAA,CAER,CAAA,CAEAd,GAAqBF,CAAAA,CAEzB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CACF,EACAR,CAAAA,CAAa,WAAA,CAAc,cAAA,CCvL3B,IAAM+B,CAAAA,CAAc9B,CAAAA,CAAM,UAAA,CACxB,CAAC,CACC,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAA6B,EACA,SAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CAAS,IAAA,CACT,YAAA,CAAAC,CAAAA,CAAe,IAAA,CACf,iBAAA,CAAAC,CAAAA,CACA,oBAAA,CAAAC,CAAAA,CAAuB,IAAA,CACvB,aAAA,CAAAC,EAAgB,IAAA,CAChB,cAAA,CAAAC,CAAAA,CAAiB,IAAA,CACjB,QAAA,CAAAC,CAAAA,CAAW,KACX,UAAA,CAAAC,CAAAA,CAAa,CAAC,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,GAAG,CAAA,CAC7B,WAAA,CAAAC,CAAAA,CAAc,EAAA,CACd,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAU3C,CAAAA,EAAA,IAAA,CAAAA,CAAAA,CAAU,MACpB4C,CAAAA,CAAc,IAAM,CACxB3C,CAAAA,EAAA,IAAA,EAAAA,CAAAA,GACF,CAAA,CAEM,CAAC4C,CAAAA,CAAWC,CAAY,CAAA,CAAI/C,CAAAA,CAAM,QAAA,CAAS,KAAK,EAChD,CAACgD,CAAAA,CAAaC,CAAc,CAAA,CAAIjD,CAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CACpD,CAACkD,CAAAA,CAAeC,CAAgB,CAAA,CAAInD,CAAAA,CAAM,QAAA,CAASyC,CAAW,CAAA,CAC9D,CAACW,CAAAA,CAAYC,CAAa,CAAA,CAAIrD,CAAAA,CAAM,SAAS,KAAK,CAAA,CAClD,CAACsD,CAAAA,CAAQC,CAAS,CAAA,CAAIvD,EAAM,QAAA,CAAS,CAAC,CAAA,CACtC,CAACwD,CAAAA,CAAUC,CAAW,CAAA,CAAIzD,CAAAA,CAAM,QAAA,CAAS,CAAC,CAAA,CAE1C0D,CAAAA,CAAgB,CACpB,EAAA,CAAI,OACJ,EAAA,CAAI,MAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,QACR,CAAA,CAEA1D,CAAAA,CAAM,SAAA,CAAU,IAAM,CACpB,GAAI4C,EAAS,CACXG,CAAAA,CAAa,IAAI,CAAA,CACjBE,CAAAA,CAAe,IAAI,CAAA,CACnB,IAAMU,CAAAA,CAAQ,UAAA,CAAW,IAAMV,CAAAA,CAAe,KAAK,CAAA,CAAG,EAAE,CAAA,CACxD,OAAO,IAAM,YAAA,CAAaU,CAAK,CACjC,MAAO,CACLV,CAAAA,CAAe,IAAI,CAAA,CACnB,IAAMU,CAAAA,CAAQ,WAAW,IAAM,CAC7BZ,CAAAA,CAAa,KAAK,CAAA,CAClBE,CAAAA,CAAe,KAAK,EACtB,CAAA,CAAG,GAAG,CAAA,CACN,OAAO,IAAM,YAAA,CAAaU,CAAK,CACjC,CACF,CAAA,CAAG,CAACf,CAAO,CAAC,CAAA,CAEZ5C,CAAAA,CAAM,SAAA,CAAU,IAAM,CACpB,GAAI,CAACqC,CAAAA,CAAe,OAEpB,IAAMuB,CAAAA,CAAmBhC,CAAAA,EAAqB,CACxCA,CAAAA,CAAE,GAAA,GAAQ,QAAA,EAAYgB,CAAAA,EACxBC,CAAAA,GAEJ,CAAA,CAEA,OAAID,CAAAA,GACF,QAAA,CAAS,iBAAiB,SAAA,CAAWgB,CAAe,CAAA,CACpD,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,QAAA,CAAA,CAG1B,IAAM,CACX,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWA,CAAe,EACvD,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,GACjC,CACF,CAAA,CAAG,CAAChB,CAAAA,CAASP,CAAa,CAAC,CAAA,CAE3B,IAAMwB,CAAAA,CAAoBjC,GAAwB,CAChDyB,CAAAA,CAAc,IAAI,CAAA,CAClBE,CAAAA,CAAU3B,CAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,CAAA,CAC9B6B,CAAAA,CAAY7B,CAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,EAClC,CAAA,CAEMkC,CAAAA,CAAmBlC,CAAAA,EAAwB,CAC1CwB,CAAAA,EACLK,CAAAA,CAAY7B,CAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,EAClC,CAAA,CAEMmC,CAAAA,CAAiB,IAAM,CAC3B,GAAI,CAACX,EAAY,OACjBC,CAAAA,CAAc,KAAK,CAAA,CAEnB,IAAMW,CAAAA,CAASR,EAAWF,CAAAA,CACpBW,CAAAA,CAAY,GAAA,CAElB,GAAID,CAAAA,CAASC,CAAAA,CAEXpB,CAAAA,EAAY,CAAA,KAAA,GACHmB,CAAAA,CAAS,CAACC,CAAAA,CAAW,CAE9B,IAAMC,CAAAA,CAAe1B,EAAW,OAAA,CAAQU,CAAa,CAAA,CAC/CiB,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAe,CAAA,CAAG1B,CAAAA,CAAW,MAAA,CAAS,CAAC,CAAA,CAClEW,CAAAA,CAAiBX,CAAAA,CAAW2B,CAAS,CAAC,EACxC,CACF,CAAA,CAEA,OAAKrB,CAAAA,CAGHpB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CAEZ,QAAA,CAAA,CAAAQ,CAAAA,EACCX,GAAAA,CAAC,KAAA,CAAA,CACC,UAAWI,GAAAA,CACT,+EAAA,CACAqB,CAAAA,CAAeJ,CAAAA,CAAU,aAAA,CAAgB,WAAA,CAAe,EAAA,CACxDT,CACF,CAAA,CACA,OAAA,CAASC,CAAAA,CAAuBS,CAAAA,CAAc,MAAA,CAChD,CAAA,CAIFnB,KAAC,KAAA,CAAA,CACC,GAAA,CAAKiB,CAAAA,CACL,SAAA,CAAWhB,GAAAA,CACT,yKAAA,CACAM,CAAAA,GAAW,MAAA,CAASyB,CAAAA,CAAczB,CAAM,CAAA,CAAI,EAAA,CAC5Ce,CAAAA,CAAeJ,CAAAA,CAAU,gBAAkB,kBAAA,CAAsB,EAAA,CACjEZ,CACF,CAAA,CACA,KAAA,CAAO,CAGL,MAAA,CAAQC,CAAAA,GAAW,MAAA,CAAS,CAAA,EAAGiB,CAAa,CAAA,CAAA,CAAA,CAAM,MAAA,CAClD,SAAA,CAAWjB,IAAW,MAAA,CAAS,MAAA,CAAY,MAAA,CAC3C,SAAA,CAAWmB,CAAAA,CAAa,CAAA,WAAA,EAAcI,CAAAA,CAAWF,CAAM,CAAA,GAAA,CAAA,CAAQ,MACjE,CAAA,CACA,YAAA,CAAcO,CAAAA,CACd,WAAA,CAAaC,EACb,UAAA,CAAYC,CAAAA,CACX,GAAGrB,CAAAA,CAGH,QAAA,CAAA,CAAAJ,CAAAA,EACCf,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gDAAA,CAAiD,CAAA,CAClE,CAAA,CAGDQ,CAAAA,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CA9CqB,IAgDzB,CACF,EACAD,CAAAA,CAAY,WAAA,CAAc,aAAA,CA2B1B,IAAMsC,CAAAA,CAAoBpE,EAAM,UAAA,CAC9B,CAAC,CAAE,QAAA,CAAA+B,CAAAA,CAAU,SAAA,CAAAC,CAAAA,CAAW,eAAA,CAAAqC,CAAAA,CAAkB,IAAA,CAAM,OAAA,CAAAnE,CAAAA,CAAS,GAAGwC,CAAM,EAAGC,CAAAA,GAEjEjB,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKiB,CAAAA,CACL,SAAA,CAAWhB,GAAAA,CAAM,6CAAA,CAA+CK,CAAS,CAAA,CACxE,GAAGU,CAAAA,CAEJ,QAAA,CAAA,CAAAnB,GAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CAAU,QAAA,CAAAQ,CAAAA,CAAS,CAAA,CACjCsC,CAAAA,EACC9C,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASrB,CAAAA,CACT,SAAA,CAAU,iDAAA,CAEV,QAAA,CAAAqB,GAAAA,CAAC+C,EAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,CAAA,CAC/B,CAAA,CAAA,CAEJ,CAGN,EACAF,CAAAA,CAAkB,WAAA,CAAc,mBAAA,CAuBhC,IAAMG,CAAAA,CAAqBvE,EAAM,UAAA,CAC/B,CAAC,CAAE,QAAA,CAAA+B,CAAAA,CAAU,SAAA,CAAAC,CAAAA,CAAW,GAAGU,CAAM,CAAA,CAAGC,CAAAA,GAEhCpB,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKoB,EACL,SAAA,CAAWhB,GAAAA,CAAM,kCAAA,CAAoCK,CAAS,CAAA,CAC7D,GAAGU,CAAAA,CAEH,QAAA,CAAAX,CAAAA,CACH,CAGN,EACAwC,CAAAA,CAAmB,WAAA,CAAc,oBAAA","file":"overlay.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Modal } from \"./Modal\"\nimport { Button } from \"./Button\"\n\n/**\n * ConfirmModal 컴포넌트의 props / ConfirmModal component props\n * @typedef {Object} ConfirmModalProps\n * @property {boolean} isOpen - 모달 열림/닫힘 상태 / Modal open/close state\n * @property {() => void} onClose - 닫기 콜백 / Close callback\n * @property {() => void} onConfirm - 확인 콜백 / Confirm callback\n * @property {string} title - 모달 제목 / Modal title\n * @property {string} message - 모달 메시지 / Modal message\n * @property {string} [warning] - 경고 메시지 / Warning message\n * @property {string} [confirmText=\"확인\"] - 확인 버튼 텍스트 / Confirm button text\n * @property {string} [cancelText=\"취소\"] - 취소 버튼 텍스트 / Cancel button text\n * @property {string} [confirmButtonText] - 확인 버튼 커스텀 텍스트 / Custom confirm button text\n * @property {\"danger\" | \"warning\" | \"info\" | \"success\" | \"error\"} [type=\"danger\"] - 모달 타입 / Modal type\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {boolean} [disabled=false] - 비활성화 여부 / Disabled state\n * @property {boolean} [showInput=false] - 입력 필드 표시 여부 / Show input field\n * @property {string} [inputValue=\"\"] - 입력 필드 값 / Input field value\n * @property {(value: string) => void} [onInputChange] - 입력 값 변경 콜백 / Input value change callback\n * @property {string} [inputPlaceholder] - 입력 필드 플레이스홀더 / Input field placeholder\n * @property {string} [inputLabel] - 입력 필드 라벨 / Input field label\n * @property {string} [requiredInputValue] - 필수 입력 값 (확인 버튼 활성화 조건) / Required input value (confirm button activation condition)\n * @property {boolean} [showCancel=true] - 취소 버튼 표시 여부 / Show cancel button\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"} [size=\"md\"] - 모달 크기 / Modal size\n */\nexport interface ConfirmModalProps {\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n message: string\n warning?: string\n confirmText?: string\n cancelText?: string\n confirmButtonText?: string\n type?: \"danger\" | \"warning\" | \"info\" | \"success\" | \"error\"\n loading?: boolean\n disabled?: boolean\n showInput?: boolean\n inputValue?: string\n onInputChange?: (value: string) => void\n inputPlaceholder?: string\n inputLabel?: string\n requiredInputValue?: string\n showCancel?: boolean\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n}\n\n/**\n * ConfirmModal 컴포넌트 / ConfirmModal component\n * \n * 확인/취소가 필요한 모달 컴포넌트입니다.\n * 다양한 타입(danger, warning, info, success, error)을 지원하며,\n * 입력 필드와 필수 입력 값 검증을 지원합니다.\n * \n * Modal component that requires confirmation/cancellation.\n * Supports various types (danger, warning, info, success, error),\n * and supports input fields and required input value validation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ConfirmModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * onConfirm={handleConfirm}\n * title=\"삭제 확인\"\n * message=\"정말 삭제하시겠습니까?\"\n * />\n * \n * @example\n * // 입력 필드와 함께 / With input field\n * <ConfirmModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * onConfirm={handleDelete}\n * title=\"삭제 확인\"\n * message=\"삭제하려면 'DELETE'를 입력하세요\"\n * showInput\n * inputLabel=\"확인 입력\"\n * requiredInputValue=\"DELETE\"\n * inputValue={inputValue}\n * onInputChange={setInputValue}\n * />\n * \n * @param {ConfirmModalProps} props - ConfirmModal 컴포넌트의 props / ConfirmModal component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ConfirmModal 컴포넌트 / ConfirmModal component\n */\nconst ConfirmModal = React.forwardRef<HTMLDivElement, ConfirmModalProps>(\n ({\n isOpen,\n onClose,\n onConfirm,\n title,\n message,\n warning,\n confirmText = \"확인\",\n cancelText = \"취소\",\n confirmButtonText,\n type = \"danger\",\n loading = false,\n disabled = false,\n showInput = false,\n inputValue = \"\",\n onInputChange,\n inputPlaceholder,\n inputLabel,\n requiredInputValue,\n showCancel = true,\n size = \"md\"\n }, _ref) => {\n // 타입별 아이콘과 색상\n const typeConfig = {\n danger: {\n icon: (\n <svg className=\"h-6 w-6 text-destructive\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n ),\n bgColor: \"bg-destructive/10\",\n buttonColor: \"bg-destructive hover:bg-destructive/90 focus:ring-destructive\",\n textColor: \"text-destructive\"\n },\n warning: {\n icon: (\n <svg className=\"h-6 w-6 text-yellow-600 dark:text-yellow-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n ),\n bgColor: \"bg-yellow-100 dark:bg-yellow-900/20\",\n buttonColor: \"bg-yellow-600 hover:bg-yellow-700 focus:ring-yellow-500\",\n textColor: \"text-yellow-600 dark:text-yellow-400\"\n },\n info: {\n icon: (\n <svg className=\"h-6 w-6 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n ),\n bgColor: \"bg-primary/10\",\n buttonColor: \"bg-primary hover:bg-primary/80 focus:ring-ring\",\n textColor: \"text-primary\"\n },\n success: {\n icon: (\n <svg className=\"h-6 w-6 text-green-600 dark:text-green-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n bgColor: \"bg-green-100 dark:bg-green-900/20\",\n buttonColor: \"bg-green-600 hover:bg-green-700 focus:ring-green-500\",\n textColor: \"text-green-600 dark:text-green-400\"\n },\n error: {\n icon: (\n <svg className=\"h-6 w-6 text-destructive\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ),\n bgColor: \"bg-destructive/10\",\n buttonColor: \"bg-destructive hover:bg-destructive/90 focus:ring-destructive\",\n textColor: \"text-destructive\"\n }\n }\n\n const config = typeConfig[type]\n const isInputValid = !showInput || !requiredInputValue || inputValue === requiredInputValue\n const isDisabled = disabled || loading || !isInputValid\n\n return (\n <Modal \n isOpen={isOpen} \n onClose={onClose} \n closable={false}\n size={size}\n >\n <div className=\"text-center\">\n {/* 아이콘 */}\n <div className={merge(\n \"mx-auto flex items-center justify-center h-16 w-16 rounded-full mb-6\", // 64px 아이콘, 24px 여백\n config.bgColor\n )}>\n {config.icon}\n </div>\n\n {/* 제목 */}\n <h3 className=\"text-xl font-semibold text-foreground mb-4\"> {/* 16px 여백 */}\n {title}\n </h3>\n\n {/* 메시지 */}\n <div className=\"mb-6\"> {/* 24px 여백 */}\n <p className=\"text-sm text-muted-foreground\">\n {message}\n </p>\n \n {/* 경고 메시지 */}\n {warning && (\n <p className={merge(\n \"text-sm mt-3 font-medium\", // 12px 여백\n config.textColor\n )}>\n {warning}\n </p>\n )}\n </div>\n\n {/* 입력 필드 */}\n {showInput && (\n <div className=\"mb-6\"> {/* 24px 여백 */}\n <label htmlFor=\"confirmInput\" className=\"block text-sm font-medium text-foreground mb-3 text-left\"> {/* 12px 여백 */}\n {inputLabel}\n </label>\n <input\n type=\"text\"\n id=\"confirmInput\"\n value={inputValue}\n onChange={(e) => onInputChange?.(e.target.value)}\n placeholder={inputPlaceholder}\n 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\" // 16px, 12px 패딩\n />\n </div>\n )}\n\n {/* 버튼 */}\n <div className={merge(\n \"flex gap-3\", // 12px 간격\n showCancel ? \"justify-center\" : \"justify-center\"\n )}>\n {showCancel && (\n <Button\n variant=\"outline\"\n onClick={onClose}\n disabled={loading}\n className=\"px-6 py-3\" // 24px, 12px 패딩\n >\n {cancelText}\n </Button>\n )}\n <Button\n variant=\"default\"\n onClick={onConfirm}\n disabled={isDisabled}\n className={merge(\n \"px-6 py-3\", // 24px, 12px 패딩\n config.buttonColor\n )}\n >\n {loading ? (\n <div className=\"flex items-center\">\n <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\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <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\"></path>\n </svg>\n 처리 중...\n </div>\n ) : (\n confirmButtonText || confirmText\n )}\n </Button>\n </div>\n </div>\n </Modal>\n )\n }\n)\nConfirmModal.displayName = \"ConfirmModal\"\n\nexport { ConfirmModal } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * BottomSheet 컴포넌트의 props / BottomSheet component props\n * @typedef {Object} BottomSheetProps\n * @property {boolean} open - BottomSheet 열림/닫힘 상태 / BottomSheet open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - BottomSheet 내용 / BottomSheet content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [height=\"md\"] - BottomSheet 높이 / BottomSheet height\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n * @property {boolean} [showDragHandle=true] - 드래그 핸들 표시 여부 / Show drag handle\n * @property {number[]} [snapPoints=[25, 50, 75, 100]] - 스냅 포인트 (퍼센트) / Snap points (percentage)\n * @property {number} [defaultSnap=50] - 기본 스냅 포인트 (퍼센트) / Default snap point (percentage)\n */\ninterface BottomSheetProps {\n /** BottomSheet 열림/닫힘 상태 / BottomSheet open/close state */\n isOpen?: boolean\n /** BottomSheet 닫기 콜백 / BottomSheet close callback */\n onClose?: () => void\n /** BottomSheet 내용 / BottomSheet content */\n children: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS class */\n className?: string\n /** BottomSheet 높이 / BottomSheet height */\n height?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class */\n backdropClassName?: string\n /** 배경 클릭 시 닫기 여부 / Close on backdrop click */\n closeOnBackdropClick?: boolean\n /** ESC 키로 닫기 여부 / Close on ESC key */\n closeOnEscape?: boolean\n /** 드래그 핸들 표시 여부 / Show drag handle */\n showDragHandle?: boolean\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n /** 스냅 포인트 (퍼센트) / Snap points (percentage) */\n snapPoints?: number[]\n /** 기본 스냅 포인트 (퍼센트) / Default snap point (percentage) */\n defaultSnap?: number\n}\n\n/**\n * BottomSheet 컴포넌트 / BottomSheet component\n * \n * 화면 하단에서 올라오는 시트 컴포넌트입니다.\n * 모바일 친화적인 UI를 제공하며, 드래그로 높이를 조절할 수 있습니다.\n * 스냅 포인트를 지원하여 특정 높이에서 멈출 수 있습니다.\n * \n * Sheet component that slides up from the bottom of the screen.\n * Provides mobile-friendly UI and allows height adjustment by dragging.\n * Supports snap points to stop at specific heights.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <BottomSheet open={open} onOpenChange={setOpen}>\n * <BottomSheetHeader>제목</BottomSheetHeader>\n * <BottomSheetContent>내용</BottomSheetContent>\n * </BottomSheet>\n * \n * @example\n * // 커스텀 스냅 포인트 / Custom snap points\n * <BottomSheet \n * open={open} \n * onOpenChange={setOpen}\n * snapPoints={[30, 60, 90]}\n * defaultSnap={30}\n * >\n * <BottomSheetContent>내용</BottomSheetContent>\n * </BottomSheet>\n * \n * @param {BottomSheetProps} props - BottomSheet 컴포넌트의 props / BottomSheet component props\n * @param {React.Ref<HTMLDivElement>} ref - BottomSheet 컨테이너 ref / BottomSheet container ref\n * @returns {JSX.Element} BottomSheet 컴포넌트 / BottomSheet component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst BottomSheet = React.forwardRef<HTMLDivElement, BottomSheetProps>(\n ({\n isOpen,\n onClose,\n children,\n className,\n height = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n showDragHandle = true,\n closable = true,\n snapPoints = [25, 50, 75, 100],\n defaultSnap = 50,\n ...props\n }, ref) => {\n const _isOpen = isOpen ?? false\n const handleClose = () => {\n onClose?.()\n }\n\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n const [currentHeight, setCurrentHeight] = React.useState(defaultSnap)\n const [isDragging, setIsDragging] = React.useState(false)\n const [startY, setStartY] = React.useState(0)\n const [currentY, setCurrentY] = React.useState(0)\n\n const heightClasses = {\n sm: \"h-64\",\n md: \"h-96\",\n lg: \"h-[32rem]\",\n xl: \"h-[40rem]\",\n full: \"h-full\"\n }\n\n React.useEffect(() => {\n if (_isOpen) {\n setIsVisible(true)\n setIsAnimating(true)\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300)\n return () => clearTimeout(timer)\n }\n }, [_isOpen])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscapeKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && _isOpen) {\n handleClose()\n }\n }\n\n if (_isOpen) {\n document.addEventListener(\"keydown\", handleEscapeKey)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKey)\n document.body.style.overflow = \"\"\n }\n }, [_isOpen, closeOnEscape])\n\n const handleTouchStart = (e: React.TouchEvent) => {\n setIsDragging(true)\n setStartY(e.touches[0].clientY)\n setCurrentY(e.touches[0].clientY)\n }\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!isDragging) return\n setCurrentY(e.touches[0].clientY)\n }\n\n const handleTouchEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n\n const deltaY = currentY - startY\n const threshold = 100\n\n if (deltaY > threshold) {\n // 아래로 드래그 - 닫기\n handleClose()\n } else if (deltaY < -threshold) {\n // 위로 드래그 - 다음 스냅 포인트\n const currentIndex = snapPoints.indexOf(currentHeight)\n const nextIndex = Math.min(currentIndex + 1, snapPoints.length - 1)\n setCurrentHeight(snapPoints[nextIndex])\n }\n }\n\n if (!isVisible) return null\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (_isOpen ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? handleClose : undefined}\n />\n )}\n\n {/* Bottom Sheet */}\n <div\n ref={ref}\n className={merge(\n \"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\",\n height !== \"full\" ? heightClasses[height] : \"\",\n isAnimating ? (_isOpen ? \"translate-y-0\" : \"translate-y-full\") : \"\",\n className\n )}\n style={{\n // height prop이 \"full\"일 때만 퍼센트 높이 사용 (스냅 포인트)\n // 그 외에는 heightClasses의 고정 높이 사용\n height: height === \"full\" ? `${currentHeight}%` : undefined,\n maxHeight: height !== \"full\" ? undefined : \"100%\",\n transform: isDragging ? `translateY(${currentY - startY}px)` : undefined\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n {...props}\n >\n {/* Drag Handle */}\n {showDragHandle && (\n <div className=\"flex justify-center pt-3 pb-2\">\n <div className=\"w-12 h-1.5 bg-muted-foreground/30 rounded-full\" />\n </div>\n )}\n\n {children}\n </div>\n </div>\n )\n }\n)\nBottomSheet.displayName = \"BottomSheet\"\n\n/**\n * BottomSheetHeader 컴포넌트의 props / BottomSheetHeader component props\n * @typedef {Object} BottomSheetHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface BottomSheetHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * BottomSheetHeader 컴포넌트 / BottomSheetHeader component\n * BottomSheet의 헤더 영역을 표시합니다.\n * Displays the header area of a BottomSheet.\n * \n * @component\n * @param {BottomSheetHeaderProps} props - BottomSheetHeader 컴포넌트의 props / BottomSheetHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} BottomSheetHeader 컴포넌트 / BottomSheetHeader component\n */\nconst BottomSheetHeader = React.forwardRef<HTMLDivElement, BottomSheetHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between px-6 py-4\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-muted transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nBottomSheetHeader.displayName = \"BottomSheetHeader\"\n\n/**\n * BottomSheetContent 컴포넌트의 props / BottomSheetContent component props\n * @typedef {Object} BottomSheetContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface BottomSheetContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * BottomSheetContent 컴포넌트 / BottomSheetContent component\n * BottomSheet의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a BottomSheet.\n * \n * @component\n * @param {BottomSheetContentProps} props - BottomSheetContent 컴포넌트의 props / BottomSheetContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} BottomSheetContent 컴포넌트 / BottomSheetContent component\n */\nconst BottomSheetContent = React.forwardRef<HTMLDivElement, BottomSheetContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 px-6 pb-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nBottomSheetContent.displayName = \"BottomSheetContent\"\n\nexport { BottomSheet, BottomSheetHeader, BottomSheetContent } "]}
|
package/dist/sdui.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {a as a$9,b as b$5,c as c$3,d as d$3,f as f$2,g,h,e as e$1}from'./chunk-N56BUOCD.mjs';import {a as a$3}from'./chunk-42RGFEL2.mjs';import {a as a$7}from'./chunk-CVWWS25A.mjs';import {a,b}from'./chunk-AOSXB5JJ.mjs';import {c as c$2,b as b$2,a as a$5}from'./chunk-IJSYSNM5.mjs';import {a as a$4}from'./chunk-ZXZIHU7J.mjs';import {f,e,d,c,b as b$1,a as a$2}from'./chunk-6HVJFEDA.mjs';import {a as a$6}from'./chunk-3CCF7U3P.mjs';import {b as b$3,a as a$8}from'./chunk-TZ4YSHMC.mjs';import {c as c$1,d as d$2,b as b$4}from'./chunk-OZNST3EZ.mjs';import {d as d$1}from'./chunk-XCZMLKPK.mjs';import {l}from'./chunk-7OYT3QSY.mjs';import {a as a$1}from'./chunk-TXBZZJNR.mjs';import {f as f$1}from'./chunk-U6CTBZ2U.mjs';import {createContext,useState,useContext,useMemo,useCallback}from'react';import {jsx,jsxs}from'react/jsx-runtime';var fe=({children:e,justify:t,align:r,className:n="",style:o,backgroundColor:s,padding:a,margin:c,borderRadius:i,border:u,...m})=>{let d={...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a},...c!==void 0&&{margin:typeof c=="number"?`${c}px`:c},...i!==void 0&&{borderRadius:typeof i=="number"?`${i}px`:i},...u&&{border:u}};return jsx("div",{className:f$1((t||r)&&"flex",t&&oe[t],r&&ae[r],n),style:Object.keys(d).length>0?d:void 0,...m,children:e})},ye=({size:e=16,className:t=""})=>jsx("div",{className:t,style:{width:e,height:e,flexShrink:0}}),oe={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between"},ae={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},Se=({children:e,direction:t="row",gap:r=0,justify:n="start",align:o="stretch",className:s="",style:a,backgroundColor:c,padding:i,...u})=>{let m={gap:`${r*4}px`,...a,...c&&{backgroundColor:c},...i!==void 0&&{padding:typeof i=="number"?`${i}px`:i}};return jsx("div",{className:`flex ${t==="column"?"flex-col":"flex-row"} ${oe[n]} ${ae[o]} ${s}`,style:m,...u,children:e})},be=({children:e,cols:t=1,gap:r=4,className:n="",style:o,backgroundColor:s,padding:a,...c})=>{let i={gridTemplateColumns:`repeat(${t}, 1fr)`,gap:`${r*4}px`,...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a}};return jsx("div",{className:`grid ${n}`,style:i,...c,children:e})},y={left:"text-left",center:"text-center",right:"text-right"};function S(e){let t={};return e.fontSize&&(t.fontSize=e.fontSize),e.lineHeight&&(t.lineHeight=e.lineHeight),e.fontWeight&&(t.fontWeight=e.fontWeight),e.letterSpacing&&(t.letterSpacing=e.letterSpacing),t}var he=({children:e,variant:t="body",align:r="center",className:n="",style:o,fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i,...u})=>{let m={body:"text-foreground",muted:"text-muted-foreground text-sm",lead:"text-xl text-muted-foreground"},d=S({fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i}),g=Object.keys(d).length>0?{...o,...d}:o;return jsx("p",{className:`${m[t]} ${y[r]} ${n}`,style:g,...u,children:e})},xe=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h1",{className:`text-4xl md:text-5xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},Re=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h2",{className:`text-3xl md:text-4xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},ve=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h3",{className:`text-2xl md:text-3xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},Ie=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h4",{className:`text-xl md:text-2xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},ke=({children:e,href:t="#",className:r="",...n})=>{let o=t.startsWith("http://")||t.startsWith("https://");return jsx("a",{href:t,className:`text-primary hover:underline ${r}`,...o?{target:"_blank",rel:"noopener noreferrer"}:{},...n,children:e})},Ce=({className:e="",alt:t="",...r})=>jsx("img",{className:`max-w-full h-auto ${e}`,alt:t,...r}),De=({name:e="star",size:t=24,className:r=""})=>jsx(l,{name:e,size:t,className:r}),Ue=({children:e,className:t="",...r})=>jsx("section",{className:`py-10 ${t}`,...r,children:e}),we=({className:e="",...t})=>jsx("hr",{className:`border-border ${e}`,...t}),Te=({children:e,sticky:t=true,transparent:r=false,blur:n=true,overlay:o=false,className:s="",...a})=>jsx("header",{className:f$1("w-full px-4 py-3 z-50",o?"absolute top-0 left-0 right-0":t&&"sticky top-0",r?"bg-transparent":"bg-background/80",n&&!r&&"backdrop-blur-md",!r&&"border-b border-border",s),...a,children:jsx("div",{className:"max-w-7xl mx-auto",children:e})}),Pe=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$3,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},He=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(d$2,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},Ne=({defaultValue:e="",onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$4,{...r,value:n,onChange:s=>{o(s.target.value),t==null||t(s);}})},$e=({defaultValue:e="",onChange:t,resize:r="vertical",...n})=>{let[o,s]=useState(e);return jsx(a$8,{...n,resize:r,value:o,onChange:a=>{s(a.target.value),t==null||t(a);}})},Fe=({items:e=[],type:t="single",collapsible:r=true,defaultValue:n,className:o=""})=>jsx(a$9,{type:t,collapsible:r,defaultValue:n,className:o,children:e.map((s,a)=>{let c=s.value||`item-${a}`;return jsxs(b$5,{value:c,children:[jsx(c$3,{children:s.title}),jsx(d$3,{children:s.content})]},c)})}),Me=({tabs:e=[],defaultValue:t,variant:r="default",className:n=""})=>{var s;let o=((s=e[0])==null?void 0:s.value)||"tab-0";return jsxs(f$2,{defaultValue:t||o,variant:r,className:n,children:[jsx(g,{children:e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(h,{value:i,children:a.label},i)})}),e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(e$1,{value:i,children:a.content},i)})]})},R={Box:fe,Spacer:ye,Flex:Se,Grid:be,Section:Ue,Container:a$7,Divider:we,Text:he,H1:xe,H2:Re,H3:ve,H4:Ie,Link:ke,Image:Ce,Icon:De,Button:d$1,Badge:a$6,Avatar:a$5,AvatarImage:b$2,AvatarFallback:c$2,Input:Ne,Textarea:$e,Label:c$1,Checkbox:Pe,Switch:He,Skeleton:a$4,Progress:a$3,Card:a$2,CardHeader:b$1,CardTitle:c,CardDescription:d,CardContent:e,CardFooter:f,Alert:a$1,Header:Te,HeroSection:b,ScrollProgress:a,Accordion:Fe,Tabs:Me};function Le(e){return {...R,...e}}function Ae(e,t){return t in e}var le=createContext(null);function ue(){let e=useContext(le);if(!e)throw new Error("useSDUI must be used within SDUIRenderer");return e}function v(e,t){return t.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},e)}function Ve(e,t,r){let n=t.split("."),o={...e},s=o;for(let a=0;a<n.length-1;a++){let c=n[a];s[c]={...s[c]||{}},s=s[c];}return s[n[n.length-1]]=r,o}function ze(e,t){let r=v(t,e.path);switch(e.operator){case "eq":return r===e.value;case "neq":return r!==e.value;case "gt":return typeof r=="number"&&r>e.value;case "lt":return typeof r=="number"&&r<e.value;case "gte":return typeof r=="number"&&r>=e.value;case "lte":return typeof r=="number"&&r<=e.value;case "exists":return r!=null;case "notExists":return r==null;default:return true}}function C(e,t){let r={};for(let[n,o]of Object.entries(e))if(typeof o=="string"){let s=o.match(/^\{\{\s*(.+?)\s*\}\}$/);s?r[n]=v(t,s[1]):r[n]=o.replace(/\{\{\s*(.+?)\s*\}\}/g,(a,c)=>{let i=v(t,c);return i!==void 0?String(i):""});}else Array.isArray(o)?r[n]=o.map(s=>typeof s=="object"&&s!==null?C(s,t):s):typeof o=="object"&&o!==null?r[n]=C(o,t):r[n]=o;return r}function me({node:e,registry:t}){let{data:r,handleAction:n}=ue();if(e.when&&!ze(e.when,r))return null;let o=t[e.type];if(!o)return console.warn(`[SDUI] Unknown component type: ${e.type}`),jsxs("div",{className:"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive",children:["Unknown component: ",e.type]});let s=e.props?C(e.props,r):{},a={};e.on&&(e.on.click&&(a.onClick=()=>n(e.on.click)),e.on.submit&&(a.onSubmit=m=>{m.preventDefault(),n(e.on.submit);}));let c=null;return e.children&&(typeof e.children=="string"?c=e.children.replace(/\{\{\s*(.+?)\s*\}\}/g,(m,d)=>{let g=v(r,d);return g!==void 0?String(g):""}):Array.isArray(e.children)&&(c=e.children.map((m,d)=>jsx(me,{node:m,registry:t},m.key||`child-${d}`)))),["Divider","Input","Textarea","Checkbox","Switch","Progress","Skeleton","Image","ScrollProgress"].includes(e.type)||c===null?jsx(o,{...s,...a}):jsx(o,{...s,...a,children:c})}function de({schema:e,components:t,data:r={},onAction:n,onNavigate:o}){let s="root"in e,a=s?e.root:e,c=s?e.data:{},[i,u]=useState({...c,...r}),m=useMemo(()=>({...R,...t}),[t]),d=useCallback((p,b)=>{u(h=>Ve(h,p,b));},[]),g=useCallback(p=>{o?o(p):typeof window!="undefined"&&(window.location.href=p);},[o]),D=useCallback(p=>{var b,h,U;switch(p.type){case "navigate":g((b=p.payload)==null?void 0:b.path);break;case "setState":(h=p.payload)!=null&&h.path&&((U=p.payload)==null?void 0:U.value)!==void 0&&d(p.payload.path,p.payload.value);break;case "api":n==null||n(p);break;case "custom":n==null||n(p);break;default:n==null||n(p);}},[g,d,n]),ge=useMemo(()=>({data:i,setData:d,handleAction:D,navigate:g}),[i,d,D,g]);return jsx(le.Provider,{value:ge,children:jsx(me,{node:a,registry:m})})}function We({json:e,...t}){try{let r=JSON.parse(e);return jsx(de,{schema:r,...t})}catch(r){return jsxs("div",{className:"p-4 border border-destructive bg-destructive/10 rounded",children:[jsx("p",{className:"font-semibold text-destructive",children:"SDUI Parse Error"}),jsx("pre",{className:"text-sm mt-2 text-destructive/80",children:r.message})]})}}
|
|
2
|
+
import {a as a$9,b as b$5,c as c$3,d as d$3,f as f$1,g,h,e as e$2}from'./chunk-QRM66RQG.mjs';import {a as a$3}from'./chunk-IG47LMOD.mjs';import {a as a$1}from'./chunk-V2DNYJR6.mjs';import {a as a$7}from'./chunk-SDFVGFXT.mjs';import {a,b}from'./chunk-5DPW7SVD.mjs';import {c as c$2,b as b$2,a as a$5}from'./chunk-K2FOFIST.mjs';import {a as a$4}from'./chunk-SMLDNOV3.mjs';import {f,e,d,c,b as b$1,a as a$2}from'./chunk-CW66UBQG.mjs';import {a as a$6}from'./chunk-J47ZEXEL.mjs';import {b as b$3,a as a$8}from'./chunk-LL6QPRD7.mjs';import {c as c$1,d as d$2,b as b$4}from'./chunk-F2M4YDDQ.mjs';import {d as d$1}from'./chunk-O24K56OS.mjs';import'./chunk-SD6XGDAC.mjs';import {l}from'./chunk-ZQUMJQYV.mjs';import {e as e$1}from'./chunk-QEMPERUK.mjs';import'./chunk-EAZEI74V.mjs';import {createContext,useState,useContext,useMemo,useCallback}from'react';import {jsx,jsxs}from'react/jsx-runtime';var fe=({children:e,justify:t,align:r,className:n="",style:o,backgroundColor:s,padding:a,margin:c,borderRadius:i,border:u,...m})=>{let d={...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a},...c!==void 0&&{margin:typeof c=="number"?`${c}px`:c},...i!==void 0&&{borderRadius:typeof i=="number"?`${i}px`:i},...u&&{border:u}};return jsx("div",{className:e$1((t||r)&&"flex",t&&oe[t],r&&ae[r],n),style:Object.keys(d).length>0?d:void 0,...m,children:e})},ye=({size:e=16,className:t=""})=>jsx("div",{className:t,style:{width:e,height:e,flexShrink:0}}),oe={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between"},ae={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},Se=({children:e,direction:t="row",gap:r=0,justify:n="start",align:o="stretch",className:s="",style:a,backgroundColor:c,padding:i,...u})=>{let m={gap:`${r*4}px`,...a,...c&&{backgroundColor:c},...i!==void 0&&{padding:typeof i=="number"?`${i}px`:i}};return jsx("div",{className:`flex ${t==="column"?"flex-col":"flex-row"} ${oe[n]} ${ae[o]} ${s}`,style:m,...u,children:e})},be=({children:e,cols:t=1,gap:r=4,className:n="",style:o,backgroundColor:s,padding:a,...c})=>{let i={gridTemplateColumns:`repeat(${t}, 1fr)`,gap:`${r*4}px`,...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a}};return jsx("div",{className:`grid ${n}`,style:i,...c,children:e})},y={left:"text-left",center:"text-center",right:"text-right"};function S(e){let t={};return e.fontSize&&(t.fontSize=e.fontSize),e.lineHeight&&(t.lineHeight=e.lineHeight),e.fontWeight&&(t.fontWeight=e.fontWeight),e.letterSpacing&&(t.letterSpacing=e.letterSpacing),t}var he=({children:e,variant:t="body",align:r="center",className:n="",style:o,fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i,...u})=>{let m={body:"text-foreground",muted:"text-muted-foreground text-sm",lead:"text-xl text-muted-foreground"},d=S({fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i}),g=Object.keys(d).length>0?{...o,...d}:o;return jsx("p",{className:`${m[t]} ${y[r]} ${n}`,style:g,...u,children:e})},xe=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h1",{className:`text-4xl md:text-5xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},Re=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h2",{className:`text-3xl md:text-4xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},ve=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h3",{className:`text-2xl md:text-3xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},Ie=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h4",{className:`text-xl md:text-2xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},ke=({children:e,href:t="#",className:r="",...n})=>{let o=t.startsWith("http://")||t.startsWith("https://");return jsx("a",{href:t,className:`text-primary hover:underline ${r}`,...o?{target:"_blank",rel:"noopener noreferrer"}:{},...n,children:e})},Ce=({className:e="",alt:t="",...r})=>jsx("img",{className:`max-w-full h-auto ${e}`,alt:t,...r}),De=({name:e="star",size:t=24,className:r=""})=>jsx(l,{name:e,size:t,className:r}),Ue=({children:e,className:t="",...r})=>jsx("section",{className:`py-10 ${t}`,...r,children:e}),we=({className:e="",...t})=>jsx("hr",{className:`border-border ${e}`,...t}),Te=({children:e,sticky:t=true,transparent:r=false,blur:n=true,overlay:o=false,className:s="",...a})=>jsx("header",{className:e$1("w-full px-4 py-3 z-50",o?"absolute top-0 left-0 right-0":t&&"sticky top-0",r?"bg-transparent":"bg-background/80",n&&!r&&"backdrop-blur-md",!r&&"border-b border-border",s),...a,children:jsx("div",{className:"max-w-7xl mx-auto",children:e})}),Pe=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$3,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},He=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(d$2,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},Ne=({defaultValue:e="",onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$4,{...r,value:n,onChange:s=>{o(s.target.value),t==null||t(s);}})},$e=({defaultValue:e="",onChange:t,resize:r="vertical",...n})=>{let[o,s]=useState(e);return jsx(a$8,{...n,resize:r,value:o,onChange:a=>{s(a.target.value),t==null||t(a);}})},Fe=({items:e=[],type:t="single",collapsible:r=true,defaultValue:n,className:o=""})=>jsx(a$9,{type:t,collapsible:r,defaultValue:n,className:o,children:e.map((s,a)=>{let c=s.value||`item-${a}`;return jsxs(b$5,{value:c,children:[jsx(c$3,{children:s.title}),jsx(d$3,{children:s.content})]},c)})}),Me=({tabs:e=[],defaultValue:t,variant:r="default",className:n=""})=>{var s;let o=((s=e[0])==null?void 0:s.value)||"tab-0";return jsxs(f$1,{defaultValue:t||o,variant:r,className:n,children:[jsx(g,{children:e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(h,{value:i,children:a.label},i)})}),e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(e$2,{value:i,children:a.content},i)})]})},R={Box:fe,Spacer:ye,Flex:Se,Grid:be,Section:Ue,Container:a$7,Divider:we,Text:he,H1:xe,H2:Re,H3:ve,H4:Ie,Link:ke,Image:Ce,Icon:De,Button:d$1,Badge:a$6,Avatar:a$5,AvatarImage:b$2,AvatarFallback:c$2,Input:Ne,Textarea:$e,Label:c$1,Checkbox:Pe,Switch:He,Skeleton:a$4,Progress:a$3,Card:a$2,CardHeader:b$1,CardTitle:c,CardDescription:d,CardContent:e,CardFooter:f,Alert:a$1,Header:Te,HeroSection:b,ScrollProgress:a,Accordion:Fe,Tabs:Me};function Le(e){return {...R,...e}}function Ae(e,t){return t in e}var le=createContext(null);function ue(){let e=useContext(le);if(!e)throw new Error("useSDUI must be used within SDUIRenderer");return e}function v(e,t){return t.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},e)}function Ve(e,t,r){let n=t.split("."),o={...e},s=o;for(let a=0;a<n.length-1;a++){let c=n[a];s[c]={...s[c]||{}},s=s[c];}return s[n[n.length-1]]=r,o}function ze(e,t){let r=v(t,e.path);switch(e.operator){case "eq":return r===e.value;case "neq":return r!==e.value;case "gt":return typeof r=="number"&&r>e.value;case "lt":return typeof r=="number"&&r<e.value;case "gte":return typeof r=="number"&&r>=e.value;case "lte":return typeof r=="number"&&r<=e.value;case "exists":return r!=null;case "notExists":return r==null;default:return true}}function C(e,t){let r={};for(let[n,o]of Object.entries(e))if(typeof o=="string"){let s=o.match(/^\{\{\s*(.+?)\s*\}\}$/);s?r[n]=v(t,s[1]):r[n]=o.replace(/\{\{\s*(.+?)\s*\}\}/g,(a,c)=>{let i=v(t,c);return i!==void 0?String(i):""});}else Array.isArray(o)?r[n]=o.map(s=>typeof s=="object"&&s!==null?C(s,t):s):typeof o=="object"&&o!==null?r[n]=C(o,t):r[n]=o;return r}function me({node:e,registry:t}){let{data:r,handleAction:n}=ue();if(e.when&&!ze(e.when,r))return null;let o=t[e.type];if(!o)return console.warn(`[SDUI] Unknown component type: ${e.type}`),jsxs("div",{className:"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive",children:["Unknown component: ",e.type]});let s=e.props?C(e.props,r):{},a={};e.on&&(e.on.click&&(a.onClick=()=>n(e.on.click)),e.on.submit&&(a.onSubmit=m=>{m.preventDefault(),n(e.on.submit);}));let c=null;return e.children&&(typeof e.children=="string"?c=e.children.replace(/\{\{\s*(.+?)\s*\}\}/g,(m,d)=>{let g=v(r,d);return g!==void 0?String(g):""}):Array.isArray(e.children)&&(c=e.children.map((m,d)=>jsx(me,{node:m,registry:t},m.key||`child-${d}`)))),["Divider","Input","Textarea","Checkbox","Switch","Progress","Skeleton","Image","ScrollProgress"].includes(e.type)||c===null?jsx(o,{...s,...a}):jsx(o,{...s,...a,children:c})}function de({schema:e,components:t,data:r={},onAction:n,onNavigate:o}){let s="root"in e,a=s?e.root:e,c=s?e.data:{},[i,u]=useState({...c,...r}),m=useMemo(()=>({...R,...t}),[t]),d=useCallback((p,b)=>{u(h=>Ve(h,p,b));},[]),g=useCallback(p=>{o?o(p):typeof window!="undefined"&&(window.location.href=p);},[o]),D=useCallback(p=>{var b,h,U;switch(p.type){case "navigate":g((b=p.payload)==null?void 0:b.path);break;case "setState":(h=p.payload)!=null&&h.path&&((U=p.payload)==null?void 0:U.value)!==void 0&&d(p.payload.path,p.payload.value);break;case "api":n==null||n(p);break;case "custom":n==null||n(p);break;default:n==null||n(p);}},[g,d,n]),ge=useMemo(()=>({data:i,setData:d,handleAction:D,navigate:g}),[i,d,D,g]);return jsx(le.Provider,{value:ge,children:jsx(me,{node:a,registry:m})})}function We({json:e,...t}){try{let r=JSON.parse(e);return jsx(de,{schema:r,...t})}catch(r){return jsxs("div",{className:"p-4 border border-destructive bg-destructive/10 rounded",children:[jsx("p",{className:"font-semibold text-destructive",children:"SDUI Parse Error"}),jsx("pre",{className:"text-sm mt-2 text-destructive/80",children:r.message})]})}}
|
|
3
3
|
export{We as SDUIFromJSON,de as SDUIRenderer,R as defaultRegistry,Le as extendRegistry,Ae as hasComponent,ue as useSDUI};//# sourceMappingURL=sdui.mjs.map
|
|
4
4
|
//# sourceMappingURL=sdui.mjs.map
|
package/dist/sdui.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["Box","children","justify","align","className","style","backgroundColor","padding","margin","borderRadius","border","props","customStyle","jsx","cn","justifyMap","alignMap","Spacer","size","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","variant","fontSize","lineHeight","fontWeight","letterSpacing","variantClasses","typoStyle","mergedStyle","H1","H2","H3","H4","Link","href","isExternal","Image","alt","SDUIIcon","name","Icon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","onChange","checked","setChecked","useState","Checkbox","e","SDUISwitch","Switch","SDUIInput","defaultValue","value","setValue","Input","SDUITextarea","resize","Textarea","SDUIAccordion","items","type","collapsible","Accordion","item","index","jsxs","AccordionItem","AccordionTrigger","AccordionContent","SDUITabs","tabs","_a","firstValue","Tabs","TabsList","tab","TabsTrigger","TabsContent","defaultRegistry","Container","Button","Badge","Avatar","AvatarImage","AvatarFallback","Label","Skeleton","Progress","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Alert","HeroSection","ScrollProgress","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","createContext","useSDUI","context","useContext","getByPath","obj","path","acc","key","setByPath","keys","result","current","i","evaluateCondition","condition","data","resolveProps","resolved","bindingMatch","_","val","NodeRenderer","node","handleAction","Component","resolvedProps","eventProps","child","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","useCallback","prev","navigate","action","_b","_c","contextValue","SDUIFromJSON","json","error"],"mappings":"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","file":"sdui.mjs","sourcesContent":["\"use client\";\n\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["Box","children","justify","align","className","style","backgroundColor","padding","margin","borderRadius","border","props","customStyle","jsx","cn","justifyMap","alignMap","Spacer","size","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","variant","fontSize","lineHeight","fontWeight","letterSpacing","variantClasses","typoStyle","mergedStyle","H1","H2","H3","H4","Link","href","isExternal","Image","alt","SDUIIcon","name","Icon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","onChange","checked","setChecked","useState","Checkbox","e","SDUISwitch","Switch","SDUIInput","defaultValue","value","setValue","Input","SDUITextarea","resize","Textarea","SDUIAccordion","items","type","collapsible","Accordion","item","index","jsxs","AccordionItem","AccordionTrigger","AccordionContent","SDUITabs","tabs","_a","firstValue","Tabs","TabsList","tab","TabsTrigger","TabsContent","defaultRegistry","Container","Button","Badge","Avatar","AvatarImage","AvatarFallback","Label","Skeleton","Progress","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Alert","HeroSection","ScrollProgress","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","createContext","useSDUI","context","useContext","getByPath","obj","path","acc","key","setByPath","keys","result","current","i","evaluateCondition","condition","data","resolveProps","resolved","bindingMatch","_","val","NodeRenderer","node","handleAction","Component","resolvedProps","eventProps","child","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","useCallback","prev","navigate","action","_b","_c","contextValue","SDUIFromJSON","json","error"],"mappings":"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","file":"sdui.mjs","sourcesContent":["\"use client\";\n\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|
package/dist/theme.d.mts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type Theme = "light" | "dark" | "system";
|
|
4
|
+
/**
|
|
5
|
+
* ThemeProvider 컴포넌트의 props / ThemeProvider component props
|
|
6
|
+
* @typedef {Object} ThemeProviderProps
|
|
7
|
+
* @property {React.ReactNode} children - 자식 컴포넌트 / Child components
|
|
8
|
+
* @property {"light" | "dark" | "system"} [defaultTheme="light"] - 기본 테마 / Default theme
|
|
9
|
+
* @property {string} [storageKey="hua-ui-theme"] - localStorage 키 / localStorage key
|
|
10
|
+
* @property {boolean} [enableSystem=true] - 시스템 테마 감지 활성화 / Enable system theme detection
|
|
11
|
+
* @property {boolean} [enableTransition=true] - 테마 전환 애니메이션 활성화 / Enable theme transition animation
|
|
12
|
+
*/
|
|
13
|
+
interface ThemeProviderProps {
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
defaultTheme?: Theme;
|
|
16
|
+
storageKey?: string;
|
|
17
|
+
enableSystem?: boolean;
|
|
18
|
+
enableTransition?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ThemeProvider의 상태 타입 / ThemeProvider state type
|
|
22
|
+
* @typedef {Object} ThemeProviderState
|
|
23
|
+
* @property {"light" | "dark" | "system"} theme - 현재 테마 / Current theme
|
|
24
|
+
* @property {(theme: "light" | "dark" | "system") => void} setTheme - 테마 설정 함수 / Theme setter function
|
|
25
|
+
* @property {"light" | "dark"} resolvedTheme - 실제 적용된 테마 (system일 경우 시스템 테마) / Actually applied theme (system theme when system is selected)
|
|
26
|
+
* @property {() => void} toggleTheme - 테마 토글 함수 / Theme toggle function
|
|
27
|
+
*/
|
|
28
|
+
interface ThemeProviderState {
|
|
29
|
+
theme: Theme;
|
|
30
|
+
setTheme: (theme: Theme) => void;
|
|
31
|
+
resolvedTheme: "light" | "dark";
|
|
32
|
+
toggleTheme: () => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* ThemeProvider 컴포넌트 / ThemeProvider component
|
|
36
|
+
*
|
|
37
|
+
* 테마 관리를 위한 Context Provider 컴포넌트입니다.
|
|
38
|
+
* localStorage에 테마를 저장하고, 시스템 테마를 감지할 수 있습니다.
|
|
39
|
+
* useTheme 훅을 통해 테마 상태에 접근할 수 있습니다.
|
|
40
|
+
*
|
|
41
|
+
* Context Provider component for theme management.
|
|
42
|
+
* Saves theme to localStorage and can detect system theme.
|
|
43
|
+
* Access theme state through useTheme hook.
|
|
44
|
+
*
|
|
45
|
+
* @component
|
|
46
|
+
* @example
|
|
47
|
+
* // 기본 사용 / Basic usage
|
|
48
|
+
* <ThemeProvider>
|
|
49
|
+
* <App />
|
|
50
|
+
* </ThemeProvider>
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* // 커스텀 설정 / Custom settings
|
|
54
|
+
* <ThemeProvider
|
|
55
|
+
* defaultTheme="dark"
|
|
56
|
+
* storageKey="my-app-theme"
|
|
57
|
+
* enableSystem={true}
|
|
58
|
+
* enableTransition={true}
|
|
59
|
+
* >
|
|
60
|
+
* <App />
|
|
61
|
+
* </ThemeProvider>
|
|
62
|
+
*
|
|
63
|
+
* @param {ThemeProviderProps} props - ThemeProvider 컴포넌트의 props / ThemeProvider component props
|
|
64
|
+
* @returns {JSX.Element} ThemeProvider 컴포넌트 / ThemeProvider component
|
|
65
|
+
*/
|
|
66
|
+
declare function ThemeProvider({ children, defaultTheme, // system에서 light로 변경
|
|
67
|
+
storageKey, enableSystem, enableTransition, ...props }: ThemeProviderProps): React.ReactElement;
|
|
68
|
+
/**
|
|
69
|
+
* useTheme 훅 / useTheme hook
|
|
70
|
+
*
|
|
71
|
+
* ThemeProvider의 테마 상태에 접근하는 훅입니다.
|
|
72
|
+
* ThemeProvider 내부에서만 사용할 수 있습니다.
|
|
73
|
+
*
|
|
74
|
+
* Hook to access ThemeProvider's theme state.
|
|
75
|
+
* Can only be used inside ThemeProvider.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* const { theme, setTheme, resolvedTheme, toggleTheme } = useTheme()
|
|
79
|
+
*
|
|
80
|
+
* @returns {ThemeProviderState} 테마 상태와 함수들 / Theme state and functions
|
|
81
|
+
* @throws {Error} ThemeProvider 외부에서 사용 시 에러 발생 / Error when used outside ThemeProvider
|
|
82
|
+
*/
|
|
83
|
+
declare const useTheme: () => ThemeProviderState;
|
|
84
|
+
|
|
85
|
+
export { ThemeProvider, type ThemeProviderProps, type ThemeProviderState, useTheme };
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hua-labs/ui/theme — Lightweight theme subpath
|
|
3
|
+
*
|
|
4
|
+
* ThemeProvider와 useTheme만 포함합니다.
|
|
5
|
+
* Phosphor Icons 등 무거운 의존성 없이 테마 기능만 필요한 경우 사용하세요.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { ThemeProvider, useTheme } from '@hua-labs/ui/theme'
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export { ThemeProvider, useTheme } from './components/ThemeProvider';
|
|
13
|
+
export type { ThemeProviderProps, ThemeProviderState } from './components/ThemeProvider';
|
|
14
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACpE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
|
package/dist/theme.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"theme.mjs"}
|