@exem-ui/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/Button-CMenVfb7.d.mts +35 -0
- package/dist/Button-CMenVfb7.d.ts +35 -0
- package/dist/Select-DMvWV_rF.d.mts +94 -0
- package/dist/Select-DMvWV_rF.d.ts +94 -0
- package/dist/avatar/index.d.mts +37 -0
- package/dist/avatar/index.d.ts +37 -0
- package/dist/avatar/index.js +13 -0
- package/dist/avatar/index.js.map +1 -0
- package/dist/avatar/index.mjs +4 -0
- package/dist/avatar/index.mjs.map +1 -0
- package/dist/badge/index.d.mts +29 -0
- package/dist/badge/index.d.ts +29 -0
- package/dist/badge/index.js +12 -0
- package/dist/badge/index.js.map +1 -0
- package/dist/badge/index.mjs +3 -0
- package/dist/badge/index.mjs.map +1 -0
- package/dist/breadcrumb/index.d.mts +43 -0
- package/dist/breadcrumb/index.d.ts +43 -0
- package/dist/breadcrumb/index.js +13 -0
- package/dist/breadcrumb/index.js.map +1 -0
- package/dist/breadcrumb/index.mjs +4 -0
- package/dist/breadcrumb/index.mjs.map +1 -0
- package/dist/button/index.d.mts +9 -0
- package/dist/button/index.d.ts +9 -0
- package/dist/button/index.js +29 -0
- package/dist/button/index.js.map +1 -0
- package/dist/button/index.mjs +12 -0
- package/dist/button/index.mjs.map +1 -0
- package/dist/checkbox/index.d.mts +54 -0
- package/dist/checkbox/index.d.ts +54 -0
- package/dist/checkbox/index.js +13 -0
- package/dist/checkbox/index.js.map +1 -0
- package/dist/checkbox/index.mjs +4 -0
- package/dist/checkbox/index.mjs.map +1 -0
- package/dist/chunk-34QIGWCT.mjs +10 -0
- package/dist/chunk-34QIGWCT.mjs.map +1 -0
- package/dist/chunk-3FPMWAQT.js +30 -0
- package/dist/chunk-3FPMWAQT.js.map +1 -0
- package/dist/chunk-3HMT3DQV.js +104 -0
- package/dist/chunk-3HMT3DQV.js.map +1 -0
- package/dist/chunk-4WAO7CUT.mjs +95 -0
- package/dist/chunk-4WAO7CUT.mjs.map +1 -0
- package/dist/chunk-5M47B2XJ.js +4096 -0
- package/dist/chunk-5M47B2XJ.js.map +1 -0
- package/dist/chunk-5QX4TO4F.js +61 -0
- package/dist/chunk-5QX4TO4F.js.map +1 -0
- package/dist/chunk-5TEFN2CW.js +97 -0
- package/dist/chunk-5TEFN2CW.js.map +1 -0
- package/dist/chunk-5TES5PG6.js +41 -0
- package/dist/chunk-5TES5PG6.js.map +1 -0
- package/dist/chunk-5TVMECVF.js +148 -0
- package/dist/chunk-5TVMECVF.js.map +1 -0
- package/dist/chunk-5WGNZX7Z.mjs +27 -0
- package/dist/chunk-5WGNZX7Z.mjs.map +1 -0
- package/dist/chunk-AQ3OIM2T.js +103 -0
- package/dist/chunk-AQ3OIM2T.js.map +1 -0
- package/dist/chunk-AU5NTBK3.js +361 -0
- package/dist/chunk-AU5NTBK3.js.map +1 -0
- package/dist/chunk-DJHGCJR4.mjs +224 -0
- package/dist/chunk-DJHGCJR4.mjs.map +1 -0
- package/dist/chunk-DPUTW5KD.mjs +74 -0
- package/dist/chunk-DPUTW5KD.mjs.map +1 -0
- package/dist/chunk-E53FHDVN.mjs +336 -0
- package/dist/chunk-E53FHDVN.mjs.map +1 -0
- package/dist/chunk-ECRQD7UU.js +82 -0
- package/dist/chunk-ECRQD7UU.js.map +1 -0
- package/dist/chunk-FB4ESGOX.mjs +59 -0
- package/dist/chunk-FB4ESGOX.mjs.map +1 -0
- package/dist/chunk-FDX4IQK5.js +76 -0
- package/dist/chunk-FDX4IQK5.js.map +1 -0
- package/dist/chunk-FOMIUDRM.js +96 -0
- package/dist/chunk-FOMIUDRM.js.map +1 -0
- package/dist/chunk-FR5F3VTU.js +139 -0
- package/dist/chunk-FR5F3VTU.js.map +1 -0
- package/dist/chunk-GW53LH3I.mjs +81 -0
- package/dist/chunk-GW53LH3I.mjs.map +1 -0
- package/dist/chunk-GXMRIT5E.mjs +94 -0
- package/dist/chunk-GXMRIT5E.mjs.map +1 -0
- package/dist/chunk-IANSI7F7.mjs +393 -0
- package/dist/chunk-IANSI7F7.mjs.map +1 -0
- package/dist/chunk-IDM6MZHF.js +415 -0
- package/dist/chunk-IDM6MZHF.js.map +1 -0
- package/dist/chunk-J5ZYQ3TP.js +104 -0
- package/dist/chunk-J5ZYQ3TP.js.map +1 -0
- package/dist/chunk-KPAUBWZA.mjs +39 -0
- package/dist/chunk-KPAUBWZA.mjs.map +1 -0
- package/dist/chunk-L7P2NDST.mjs +124 -0
- package/dist/chunk-L7P2NDST.mjs.map +1 -0
- package/dist/chunk-LZWKMQJL.mjs +3886 -0
- package/dist/chunk-LZWKMQJL.mjs.map +1 -0
- package/dist/chunk-M6OWN7QH.js +118 -0
- package/dist/chunk-M6OWN7QH.js.map +1 -0
- package/dist/chunk-MQVHREEI.js +448 -0
- package/dist/chunk-MQVHREEI.js.map +1 -0
- package/dist/chunk-MT47ECUN.js +127 -0
- package/dist/chunk-MT47ECUN.js.map +1 -0
- package/dist/chunk-N6U54JI4.mjs +126 -0
- package/dist/chunk-N6U54JI4.mjs.map +1 -0
- package/dist/chunk-NDG4LR3Q.js +139 -0
- package/dist/chunk-NDG4LR3Q.js.map +1 -0
- package/dist/chunk-PPD4BU4W.mjs +80 -0
- package/dist/chunk-PPD4BU4W.mjs.map +1 -0
- package/dist/chunk-PU5NO5EZ.js +4 -0
- package/dist/chunk-PU5NO5EZ.js.map +1 -0
- package/dist/chunk-Q442ZDTI.mjs +117 -0
- package/dist/chunk-Q442ZDTI.mjs.map +1 -0
- package/dist/chunk-QH23RO3C.mjs +137 -0
- package/dist/chunk-QH23RO3C.mjs.map +1 -0
- package/dist/chunk-REBHUF4L.js +226 -0
- package/dist/chunk-REBHUF4L.js.map +1 -0
- package/dist/chunk-RGB3QLQT.js +275 -0
- package/dist/chunk-RGB3QLQT.js.map +1 -0
- package/dist/chunk-T7U2QRLC.js +94 -0
- package/dist/chunk-T7U2QRLC.js.map +1 -0
- package/dist/chunk-TEHHJ3CS.mjs +73 -0
- package/dist/chunk-TEHHJ3CS.mjs.map +1 -0
- package/dist/chunk-TJY4MIBC.js +117 -0
- package/dist/chunk-TJY4MIBC.js.map +1 -0
- package/dist/chunk-VCMZQOQM.mjs +102 -0
- package/dist/chunk-VCMZQOQM.mjs.map +1 -0
- package/dist/chunk-VKN4H4WI.mjs +3 -0
- package/dist/chunk-VKN4H4WI.mjs.map +1 -0
- package/dist/chunk-VSB25XTY.js +12 -0
- package/dist/chunk-VSB25XTY.js.map +1 -0
- package/dist/chunk-VWTE74UT.mjs +96 -0
- package/dist/chunk-VWTE74UT.mjs.map +1 -0
- package/dist/chunk-WBTL7PBV.js +105 -0
- package/dist/chunk-WBTL7PBV.js.map +1 -0
- package/dist/chunk-WOK3EP3O.js +83 -0
- package/dist/chunk-WOK3EP3O.js.map +1 -0
- package/dist/chunk-WWT73GGM.mjs +83 -0
- package/dist/chunk-WWT73GGM.mjs.map +1 -0
- package/dist/chunk-XBDXTRK3.mjs +102 -0
- package/dist/chunk-XBDXTRK3.mjs.map +1 -0
- package/dist/chunk-YGBEKZWU.mjs +81 -0
- package/dist/chunk-YGBEKZWU.mjs.map +1 -0
- package/dist/chunk-YVFLRPFV.mjs +72 -0
- package/dist/chunk-YVFLRPFV.mjs.map +1 -0
- package/dist/chunk-ZMVBIQ2Z.mjs +253 -0
- package/dist/chunk-ZMVBIQ2Z.mjs.map +1 -0
- package/dist/chunk-ZWCMSHDP.mjs +425 -0
- package/dist/chunk-ZWCMSHDP.mjs.map +1 -0
- package/dist/flat/index.d.mts +13 -0
- package/dist/flat/index.d.ts +13 -0
- package/dist/flat/index.js +31 -0
- package/dist/flat/index.js.map +1 -0
- package/dist/flat/index.mjs +10 -0
- package/dist/flat/index.mjs.map +1 -0
- package/dist/flat/segment.d.mts +39 -0
- package/dist/flat/segment.d.ts +39 -0
- package/dist/flat/segment.js +13 -0
- package/dist/flat/segment.js.map +1 -0
- package/dist/flat/segment.mjs +4 -0
- package/dist/flat/segment.mjs.map +1 -0
- package/dist/flat/select.d.mts +58 -0
- package/dist/flat/select.d.ts +58 -0
- package/dist/flat/select.js +14 -0
- package/dist/flat/select.js.map +1 -0
- package/dist/flat/select.mjs +5 -0
- package/dist/flat/select.mjs.map +1 -0
- package/dist/flat/tooltip.d.mts +98 -0
- package/dist/flat/tooltip.d.ts +98 -0
- package/dist/flat/tooltip.js +17 -0
- package/dist/flat/tooltip.js.map +1 -0
- package/dist/flat/tooltip.mjs +4 -0
- package/dist/flat/tooltip.mjs.map +1 -0
- package/dist/icon/index.d.mts +1258 -0
- package/dist/icon/index.d.ts +1258 -0
- package/dist/icon/index.js +1672 -0
- package/dist/icon/index.js.map +1 -0
- package/dist/icon/index.mjs +3 -0
- package/dist/icon/index.mjs.map +1 -0
- package/dist/index-CXip5Wb1.d.mts +62 -0
- package/dist/index-Drz3P-6Y.d.ts +62 -0
- package/dist/index.d.mts +37 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +150 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +29 -0
- package/dist/index.mjs.map +1 -0
- package/dist/input/index.d.mts +82 -0
- package/dist/input/index.d.ts +82 -0
- package/dist/input/index.js +22 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/index.mjs +5 -0
- package/dist/input/index.mjs.map +1 -0
- package/dist/loading/index.d.mts +54 -0
- package/dist/loading/index.d.ts +54 -0
- package/dist/loading/index.js +12 -0
- package/dist/loading/index.js.map +1 -0
- package/dist/loading/index.mjs +3 -0
- package/dist/loading/index.mjs.map +1 -0
- package/dist/messageBox/index.d.mts +33 -0
- package/dist/messageBox/index.d.ts +33 -0
- package/dist/messageBox/index.js +13 -0
- package/dist/messageBox/index.js.map +1 -0
- package/dist/messageBox/index.mjs +4 -0
- package/dist/messageBox/index.mjs.map +1 -0
- package/dist/modal/index.d.mts +97 -0
- package/dist/modal/index.d.ts +97 -0
- package/dist/modal/index.js +15 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/modal/index.mjs +6 -0
- package/dist/modal/index.mjs.map +1 -0
- package/dist/picker/index.d.mts +12 -0
- package/dist/picker/index.d.ts +12 -0
- package/dist/picker/index.js +13 -0
- package/dist/picker/index.js.map +1 -0
- package/dist/picker/index.mjs +4 -0
- package/dist/picker/index.mjs.map +1 -0
- package/dist/progress/index.d.mts +36 -0
- package/dist/progress/index.d.ts +36 -0
- package/dist/progress/index.js +12 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/index.mjs +3 -0
- package/dist/progress/index.mjs.map +1 -0
- package/dist/radio/index.d.mts +39 -0
- package/dist/radio/index.d.ts +39 -0
- package/dist/radio/index.js +12 -0
- package/dist/radio/index.js.map +1 -0
- package/dist/radio/index.mjs +3 -0
- package/dist/radio/index.mjs.map +1 -0
- package/dist/scrollArea/index.d.mts +31 -0
- package/dist/scrollArea/index.d.ts +31 -0
- package/dist/scrollArea/index.js +16 -0
- package/dist/scrollArea/index.js.map +1 -0
- package/dist/scrollArea/index.mjs +3 -0
- package/dist/scrollArea/index.mjs.map +1 -0
- package/dist/segment/index.d.mts +46 -0
- package/dist/segment/index.d.ts +46 -0
- package/dist/segment/index.js +12 -0
- package/dist/segment/index.js.map +1 -0
- package/dist/segment/index.mjs +3 -0
- package/dist/segment/index.mjs.map +1 -0
- package/dist/star/index.d.mts +30 -0
- package/dist/star/index.d.ts +30 -0
- package/dist/star/index.js +12 -0
- package/dist/star/index.js.map +1 -0
- package/dist/star/index.mjs +3 -0
- package/dist/star/index.mjs.map +1 -0
- package/dist/switch/index.d.mts +32 -0
- package/dist/switch/index.d.ts +32 -0
- package/dist/switch/index.js +12 -0
- package/dist/switch/index.js.map +1 -0
- package/dist/switch/index.mjs +3 -0
- package/dist/switch/index.mjs.map +1 -0
- package/dist/tabs/index.d.mts +52 -0
- package/dist/tabs/index.d.ts +52 -0
- package/dist/tabs/index.js +12 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tabs/index.mjs +3 -0
- package/dist/tabs/index.mjs.map +1 -0
- package/dist/tag/index.d.mts +68 -0
- package/dist/tag/index.d.ts +68 -0
- package/dist/tag/index.js +17 -0
- package/dist/tag/index.js.map +1 -0
- package/dist/tag/index.mjs +4 -0
- package/dist/tag/index.mjs.map +1 -0
- package/dist/toast/index.d.mts +175 -0
- package/dist/toast/index.d.ts +175 -0
- package/dist/toast/index.js +25 -0
- package/dist/toast/index.js.map +1 -0
- package/dist/toast/index.mjs +4 -0
- package/dist/toast/index.mjs.map +1 -0
- package/dist/tooltip/index.d.mts +26 -0
- package/dist/tooltip/index.d.ts +26 -0
- package/dist/tooltip/index.js +12 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tooltip/index.mjs +3 -0
- package/dist/tooltip/index.mjs.map +1 -0
- package/package.json +249 -0
- package/styles.css +20 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Select } from './chunk-ZWCMSHDP.mjs';
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function FlatSelect({
|
|
6
|
+
options,
|
|
7
|
+
placeholder,
|
|
8
|
+
onBlur,
|
|
9
|
+
onFocus,
|
|
10
|
+
onOpenChange,
|
|
11
|
+
label,
|
|
12
|
+
description,
|
|
13
|
+
required,
|
|
14
|
+
listClassName,
|
|
15
|
+
leftIcon,
|
|
16
|
+
...props
|
|
17
|
+
}) {
|
|
18
|
+
const { className, ...selectProps } = props;
|
|
19
|
+
const selectRef = useRef(null);
|
|
20
|
+
const { handleBlur, handleFocus } = useFocusWithin(selectRef, {
|
|
21
|
+
onBlur,
|
|
22
|
+
onFocus
|
|
23
|
+
});
|
|
24
|
+
const handleOpenChange = (open) => {
|
|
25
|
+
if (open) {
|
|
26
|
+
handleFocus();
|
|
27
|
+
}
|
|
28
|
+
onOpenChange?.(open);
|
|
29
|
+
};
|
|
30
|
+
return /* @__PURE__ */ jsx("div", { ref: selectRef, className, children: /* @__PURE__ */ jsxs(Select, { ...selectProps, onOpenChange: handleOpenChange, children: [
|
|
31
|
+
label && /* @__PURE__ */ jsx(Select.Label, { required, children: label }),
|
|
32
|
+
/* @__PURE__ */ jsx(Select.Trigger, { onBlur: handleBlur, onFocus: handleFocus, leftIcon, children: /* @__PURE__ */ jsx(Select.Value, { placeholder, className: "truncate" }) }),
|
|
33
|
+
description && /* @__PURE__ */ jsx(Select.Description, { children: description }),
|
|
34
|
+
/* @__PURE__ */ jsxs(Select.List, { className: listClassName, children: [
|
|
35
|
+
options.length === 0 && /* @__PURE__ */ jsx(Select.Empty, { children: placeholder }),
|
|
36
|
+
options.map((option) => /* @__PURE__ */ jsxs(
|
|
37
|
+
Select.Item,
|
|
38
|
+
{
|
|
39
|
+
value: option.value,
|
|
40
|
+
disabled: option.disabled,
|
|
41
|
+
className: "flex max-w-full items-center justify-between",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ jsx("div", { className: "block flex-1 truncate", children: option.label }),
|
|
44
|
+
option.rightSlot
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
option.value
|
|
48
|
+
))
|
|
49
|
+
] })
|
|
50
|
+
] }) });
|
|
51
|
+
}
|
|
52
|
+
function useFocusWithin(containerRef, callbacks) {
|
|
53
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
54
|
+
const handleBlur = (event) => {
|
|
55
|
+
if (containerRef.current?.contains(event.relatedTarget)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
setIsFocused(false);
|
|
59
|
+
callbacks?.onBlur?.();
|
|
60
|
+
};
|
|
61
|
+
const handleFocus = () => {
|
|
62
|
+
if (isFocused) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
setIsFocused(true);
|
|
66
|
+
callbacks?.onFocus?.();
|
|
67
|
+
};
|
|
68
|
+
return { handleBlur, handleFocus, isFocused };
|
|
69
|
+
}
|
|
70
|
+
FlatSelect.displayName = "FlatSelect";
|
|
71
|
+
|
|
72
|
+
export { FlatSelect };
|
|
73
|
+
//# sourceMappingURL=chunk-DPUTW5KD.mjs.map
|
|
74
|
+
//# sourceMappingURL=chunk-DPUTW5KD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/flat/FlatSelect.tsx"],"names":[],"mappings":"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","file":"chunk-DPUTW5KD.mjs","sourcesContent":["import type { ComponentProps, RefObject } from 'react';\nimport { useRef, useState } from 'react';\nimport { Select } from '../input/Select';\n\ntype FlatSelectOption = {\n value: string;\n label: string | React.ReactNode;\n /** 아이템 오른쪽에 표시할 슬롯 요소 */\n rightSlot?: React.ReactNode;\n disabled?: boolean;\n};\n\ninterface FlatSelectProps extends React.ComponentProps<typeof Select> {\n /** 선택 가능한 옵션 배열 */\n options: FlatSelectOption[];\n /** 값이 선택되지 않았을 때 표시할 텍스트 */\n placeholder?: string;\n /** 드롭다운 열림/닫힘 상태 변경 핸들러 */\n onOpenChange?: (open: boolean) => void;\n /** 포커스 획득 핸들러 */\n onFocus?: () => void;\n /** 포커스 해제 핸들러 */\n onBlur?: () => void;\n /** 트리거 왼쪽에 표시할 아이콘 */\n leftIcon?: ComponentProps<typeof Select.Trigger>['leftIcon'];\n /** 라벨 텍스트 */\n label?: ComponentProps<typeof Select.Label>['children'];\n /** 필수 입력 여부 */\n required?: ComponentProps<typeof Select.Label>['required'];\n /** 설명 텍스트 */\n description?: ComponentProps<typeof Select.Description>['children'];\n /** 드롭다운 리스트 className */\n listClassName?: string;\n}\n\n/**\n * Select 컴포넌트의 간소화된 Flat API입니다.\n * options 배열만 전달하면 Compound Component 없이 간편하게 사용할 수 있습니다.\n *\n * @example\n * ```tsx\n * <FlatSelect\n * options={[\n * { value: '1', label: '옵션 1' },\n * { value: '2', label: '옵션 2' },\n * ]}\n * placeholder=\"선택하세요\"\n * label=\"항목\"\n * />\n * ```\n *\n * @see {@link FlatSelectProps} props 상세\n */\nfunction FlatSelect({\n options,\n placeholder,\n onBlur,\n onFocus,\n onOpenChange,\n label,\n description,\n required,\n listClassName,\n leftIcon,\n ...props\n}: FlatSelectProps) {\n const { className, ...selectProps } = props;\n const selectRef = useRef<HTMLDivElement>(null);\n const { handleBlur, handleFocus } = useFocusWithin(selectRef, {\n onBlur,\n onFocus,\n });\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n handleFocus();\n }\n onOpenChange?.(open);\n };\n\n return (\n <div ref={selectRef} className={className}>\n <Select {...selectProps} onOpenChange={handleOpenChange}>\n {label && <Select.Label required={required}>{label}</Select.Label>}\n <Select.Trigger onBlur={handleBlur} onFocus={handleFocus} leftIcon={leftIcon}>\n <Select.Value placeholder={placeholder} className=\"truncate\" />\n </Select.Trigger>\n {description && <Select.Description>{description}</Select.Description>}\n <Select.List className={listClassName}>\n {options.length === 0 && <Select.Empty>{placeholder}</Select.Empty>}\n {options.map((option) => (\n <Select.Item\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n className=\"flex max-w-full items-center justify-between\"\n >\n <div className=\"block flex-1 truncate\">{option.label}</div>\n {option.rightSlot}\n </Select.Item>\n ))}\n </Select.List>\n </Select>\n </div>\n );\n}\n\nfunction useFocusWithin(\n containerRef: RefObject<HTMLElement | null>,\n callbacks?: { onFocus?: () => void; onBlur?: () => void },\n) {\n const [isFocused, setIsFocused] = useState(false);\n\n const handleBlur = (event: React.FocusEvent) => {\n if (containerRef.current?.contains(event.relatedTarget as Node)) {\n return;\n }\n setIsFocused(false);\n callbacks?.onBlur?.();\n };\n\n const handleFocus = () => {\n if (isFocused) {\n return;\n }\n setIsFocused(true);\n callbacks?.onFocus?.();\n };\n\n return { handleBlur, handleFocus, isFocused };\n}\n\nFlatSelect.displayName = 'FlatSelect';\n\nexport { FlatSelect };\nexport type { FlatSelectProps, FlatSelectOption };\n"]}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { X, Warning, Info, Error, Check } from './chunk-LZWKMQJL.mjs';
|
|
2
|
+
import { cn } from '@exem-ui/core/utils';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { toast as toast$1, Toaster as Toaster$1 } from 'sonner';
|
|
5
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var positionFix = `
|
|
8
|
+
[data-sonner-toaster][data-x-position='center'] [data-sonner-toast] {
|
|
9
|
+
left: calc(var(--width) / 2) !important;
|
|
10
|
+
transform: translateX(-50%) var(--y) !important;
|
|
11
|
+
width: fit-content !important;
|
|
12
|
+
max-width: calc(100% - var(--mobile-offset-left) * 2) !important;
|
|
13
|
+
}
|
|
14
|
+
@media (max-width: 600px) {
|
|
15
|
+
[data-sonner-toaster] {
|
|
16
|
+
left: 0 !important;
|
|
17
|
+
right: 0 !important;
|
|
18
|
+
}
|
|
19
|
+
[data-sonner-toaster] [data-sonner-toast] {
|
|
20
|
+
width: fit-content !important;
|
|
21
|
+
max-width: calc(100% - var(--mobile-offset-left) - var(--mobile-offset-right)) !important;
|
|
22
|
+
}
|
|
23
|
+
[data-sonner-toaster][data-x-position='center'] [data-sonner-toast] {
|
|
24
|
+
left: 50% !important;
|
|
25
|
+
}
|
|
26
|
+
[data-sonner-toaster][data-x-position='right'] [data-sonner-toast] {
|
|
27
|
+
left: auto !important;
|
|
28
|
+
right: var(--mobile-offset-right) !important;
|
|
29
|
+
}
|
|
30
|
+
[data-sonner-toaster][data-x-position='left'] [data-sonner-toast] {
|
|
31
|
+
left: var(--mobile-offset-left) !important;
|
|
32
|
+
right: auto !important;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
var Toaster = ({ ...props }) => {
|
|
37
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
38
|
+
/* @__PURE__ */ jsx("style", { children: positionFix }),
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
Toaster$1,
|
|
41
|
+
{
|
|
42
|
+
className: "toaster group [--toast-width:auto] [&_li]:!flex [&_li]:!items-center [&_li]:!justify-between [&_li]:!gap-2",
|
|
43
|
+
closeButton: false,
|
|
44
|
+
toastOptions: {
|
|
45
|
+
closeButton: false
|
|
46
|
+
},
|
|
47
|
+
...props
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
] });
|
|
51
|
+
};
|
|
52
|
+
Toaster.Container = React.forwardRef(
|
|
53
|
+
({ className, children, ...props }, ref) => {
|
|
54
|
+
return /* @__PURE__ */ jsx(
|
|
55
|
+
"div",
|
|
56
|
+
{
|
|
57
|
+
ref,
|
|
58
|
+
className: cn(
|
|
59
|
+
"flex items-center gap-3 rounded-medium border border-border-primary bg-component-toast py-[10px] pl-3 pr-4 text-mono-light shadow-strong",
|
|
60
|
+
"h-10 w-auto min-w-0 max-w-none",
|
|
61
|
+
className
|
|
62
|
+
),
|
|
63
|
+
...props,
|
|
64
|
+
children
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
Toaster.Icon = React.forwardRef(
|
|
70
|
+
({ className, children, ...props }, ref) => {
|
|
71
|
+
return /* @__PURE__ */ jsx(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
ref,
|
|
75
|
+
className: cn("flex shrink-0 items-center justify-center", className),
|
|
76
|
+
...props,
|
|
77
|
+
children
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
Toaster.Title = React.forwardRef(
|
|
83
|
+
({ className, children, ...props }, ref) => {
|
|
84
|
+
return /* @__PURE__ */ jsx(
|
|
85
|
+
"div",
|
|
86
|
+
{
|
|
87
|
+
ref,
|
|
88
|
+
className: cn(
|
|
89
|
+
"flex-1 overflow-hidden text-ellipsis whitespace-nowrap text-body-2 font-medium",
|
|
90
|
+
className
|
|
91
|
+
),
|
|
92
|
+
...props,
|
|
93
|
+
children
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
Toaster.Description = React.forwardRef(
|
|
99
|
+
({ className, children, ...props }, ref) => {
|
|
100
|
+
return /* @__PURE__ */ jsx(
|
|
101
|
+
"div",
|
|
102
|
+
{
|
|
103
|
+
ref,
|
|
104
|
+
className: cn(
|
|
105
|
+
"w-full text-body-3 font-regular text-text-static-light/80",
|
|
106
|
+
"overflow-hidden text-ellipsis",
|
|
107
|
+
className
|
|
108
|
+
),
|
|
109
|
+
...props,
|
|
110
|
+
children
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
Toaster.Action = React.forwardRef(
|
|
116
|
+
({ className, children, altText, ...props }, ref) => {
|
|
117
|
+
return /* @__PURE__ */ jsx(
|
|
118
|
+
"button",
|
|
119
|
+
{
|
|
120
|
+
ref,
|
|
121
|
+
type: "button",
|
|
122
|
+
className: cn(
|
|
123
|
+
"flex h-7 min-h-[28px] w-auto min-w-[28px] shrink-0 items-center justify-center",
|
|
124
|
+
"rounded-small bg-transparent px-0 py-0",
|
|
125
|
+
"border-0 transition-colors",
|
|
126
|
+
"hover:bg-solid-primary-hovered",
|
|
127
|
+
"whitespace-nowrap",
|
|
128
|
+
"cursor-pointer",
|
|
129
|
+
"text-body-2",
|
|
130
|
+
className
|
|
131
|
+
),
|
|
132
|
+
"aria-label": altText,
|
|
133
|
+
...props,
|
|
134
|
+
children: children || /* @__PURE__ */ jsx(X, { type: "regular", className: "size-4" })
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
Toaster.displayName = "Toaster";
|
|
140
|
+
Toaster.Container.displayName = "Toaster.Container";
|
|
141
|
+
Toaster.Icon.displayName = "Toaster.Icon";
|
|
142
|
+
Toaster.Title.displayName = "Toaster.Title";
|
|
143
|
+
Toaster.Description.displayName = "Toaster.Description";
|
|
144
|
+
Toaster.Action.displayName = "Toaster.Action";
|
|
145
|
+
var ToastProvider = ({
|
|
146
|
+
children,
|
|
147
|
+
expand = true,
|
|
148
|
+
richColors = false,
|
|
149
|
+
closeButton = false,
|
|
150
|
+
position = "top-center",
|
|
151
|
+
duration = 4e3,
|
|
152
|
+
visibleToasts = 10,
|
|
153
|
+
toasterProps
|
|
154
|
+
}) => {
|
|
155
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
156
|
+
children,
|
|
157
|
+
/* @__PURE__ */ jsx(
|
|
158
|
+
Toaster,
|
|
159
|
+
{
|
|
160
|
+
position,
|
|
161
|
+
closeButton,
|
|
162
|
+
richColors,
|
|
163
|
+
expand,
|
|
164
|
+
duration,
|
|
165
|
+
visibleToasts,
|
|
166
|
+
...toasterProps
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
] });
|
|
170
|
+
};
|
|
171
|
+
function isToastOptions(input) {
|
|
172
|
+
return typeof input === "object" && input !== null && "title" in input;
|
|
173
|
+
}
|
|
174
|
+
function extractToastParams(input, options) {
|
|
175
|
+
if (isToastOptions(input)) {
|
|
176
|
+
return {
|
|
177
|
+
title: input.title,
|
|
178
|
+
description: input.description,
|
|
179
|
+
action: input.action,
|
|
180
|
+
close: input.close
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
title: input,
|
|
185
|
+
description: options?.description,
|
|
186
|
+
action: options?.action,
|
|
187
|
+
close: options?.close
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function getSonnerOptions(options) {
|
|
191
|
+
if (!options) {
|
|
192
|
+
return void 0;
|
|
193
|
+
}
|
|
194
|
+
const { description: _description, action: _action, close: _close, ...sonnerOptions } = options;
|
|
195
|
+
return sonnerOptions;
|
|
196
|
+
}
|
|
197
|
+
function ToastContent({
|
|
198
|
+
id,
|
|
199
|
+
icon,
|
|
200
|
+
title,
|
|
201
|
+
description,
|
|
202
|
+
action,
|
|
203
|
+
close
|
|
204
|
+
}) {
|
|
205
|
+
const hasExtra = description || action;
|
|
206
|
+
if (hasExtra) {
|
|
207
|
+
return /* @__PURE__ */ jsxs(Toaster.Container, { className: "h-auto min-h-12 flex-col items-start gap-1 py-3", children: [
|
|
208
|
+
/* @__PURE__ */ jsxs("div", { className: "flex w-full items-center gap-2", children: [
|
|
209
|
+
icon && /* @__PURE__ */ jsx(Toaster.Icon, { children: icon }),
|
|
210
|
+
/* @__PURE__ */ jsx(Toaster.Title, { children: title }),
|
|
211
|
+
close && /* @__PURE__ */ jsx(Toaster.Action, { className: "rounded-medium", onClick: () => toast$1.dismiss(id) })
|
|
212
|
+
] }),
|
|
213
|
+
description && /* @__PURE__ */ jsx(Toaster.Description, { children: description }),
|
|
214
|
+
action && /* @__PURE__ */ jsx(
|
|
215
|
+
Toaster.Action,
|
|
216
|
+
{
|
|
217
|
+
className: "mt-1 text-text-info hover:text-text-info-hovered",
|
|
218
|
+
onClick: () => {
|
|
219
|
+
action.onClick();
|
|
220
|
+
toast$1.dismiss(id);
|
|
221
|
+
},
|
|
222
|
+
children: action.label
|
|
223
|
+
}
|
|
224
|
+
)
|
|
225
|
+
] });
|
|
226
|
+
}
|
|
227
|
+
if (close) {
|
|
228
|
+
return /* @__PURE__ */ jsxs(Toaster.Container, { className: "py-1.5 pr-1.5", children: [
|
|
229
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center gap-2 overflow-hidden", children: [
|
|
230
|
+
icon && /* @__PURE__ */ jsx(Toaster.Icon, { children: icon }),
|
|
231
|
+
/* @__PURE__ */ jsx(Toaster.Title, { children: title })
|
|
232
|
+
] }),
|
|
233
|
+
/* @__PURE__ */ jsx(Toaster.Action, { className: "rounded-medium", onClick: () => toast$1.dismiss(id) })
|
|
234
|
+
] });
|
|
235
|
+
}
|
|
236
|
+
return /* @__PURE__ */ jsxs(Toaster.Container, { children: [
|
|
237
|
+
icon && /* @__PURE__ */ jsx(Toaster.Icon, { children: icon }),
|
|
238
|
+
/* @__PURE__ */ jsx(Toaster.Title, { children: title })
|
|
239
|
+
] });
|
|
240
|
+
}
|
|
241
|
+
function createToast(input, options, icon) {
|
|
242
|
+
const { title, description, action, close } = extractToastParams(input, options);
|
|
243
|
+
return toast$1.custom(
|
|
244
|
+
(id) => /* @__PURE__ */ jsx(
|
|
245
|
+
ToastContent,
|
|
246
|
+
{
|
|
247
|
+
id,
|
|
248
|
+
icon,
|
|
249
|
+
title,
|
|
250
|
+
description,
|
|
251
|
+
action,
|
|
252
|
+
close
|
|
253
|
+
}
|
|
254
|
+
),
|
|
255
|
+
{ unstyled: true, ...getSonnerOptions(options) }
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
var toast = Object.assign(
|
|
259
|
+
(input, options) => createToast(input, options),
|
|
260
|
+
{
|
|
261
|
+
success: (input, options) => createToast(
|
|
262
|
+
input,
|
|
263
|
+
options,
|
|
264
|
+
/* @__PURE__ */ jsx(Check, { type: "regular", className: "size-5 text-icon-success" })
|
|
265
|
+
),
|
|
266
|
+
error: (input, options) => createToast(
|
|
267
|
+
input,
|
|
268
|
+
options,
|
|
269
|
+
/* @__PURE__ */ jsx(Error, { type: "regular", className: "size-5 text-icon-critical" })
|
|
270
|
+
),
|
|
271
|
+
info: (input, options) => createToast(
|
|
272
|
+
input,
|
|
273
|
+
options,
|
|
274
|
+
/* @__PURE__ */ jsx(Info, { type: "regular", className: "size-5 text-icon-static-light" })
|
|
275
|
+
),
|
|
276
|
+
warning: (input, options) => createToast(
|
|
277
|
+
input,
|
|
278
|
+
options,
|
|
279
|
+
/* @__PURE__ */ jsx(Warning, { type: "regular", className: "size-5 text-icon-warning" })
|
|
280
|
+
),
|
|
281
|
+
loading: (input, options) => createToast(input, options),
|
|
282
|
+
dismiss: toast$1.dismiss,
|
|
283
|
+
promise: toast$1.promise,
|
|
284
|
+
custom: toast$1.custom
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
function toExtended(options) {
|
|
288
|
+
if (!options) {
|
|
289
|
+
return void 0;
|
|
290
|
+
}
|
|
291
|
+
const { description: _desc, action: _act, ...rest } = options;
|
|
292
|
+
const converted = { ...rest };
|
|
293
|
+
if (typeof _desc === "string") {
|
|
294
|
+
converted.description = _desc;
|
|
295
|
+
}
|
|
296
|
+
return converted;
|
|
297
|
+
}
|
|
298
|
+
var DEFAULT_MESSAGES = {
|
|
299
|
+
success: "\uC131\uACF5",
|
|
300
|
+
error: "\uC624\uB958",
|
|
301
|
+
info: "\uC815\uBCF4",
|
|
302
|
+
warning: "\uACBD\uACE0",
|
|
303
|
+
loading: "\uB85C\uB529"
|
|
304
|
+
};
|
|
305
|
+
function useToast() {
|
|
306
|
+
const show = (message, options) => toast(message, toExtended(options));
|
|
307
|
+
const dismiss = (toastId) => toast.dismiss(toastId);
|
|
308
|
+
const showTypedToast = (type, message, options) => {
|
|
309
|
+
const toastMessage = message ?? DEFAULT_MESSAGES[type];
|
|
310
|
+
return toast[type](toastMessage, toExtended(options));
|
|
311
|
+
};
|
|
312
|
+
const promiseToast = (promiseTask, options, toastOptions) => toast$1.promise(promiseTask, {
|
|
313
|
+
loading: options.loading ?? DEFAULT_MESSAGES.loading,
|
|
314
|
+
success: options.success ?? DEFAULT_MESSAGES.success,
|
|
315
|
+
error: options.error ?? DEFAULT_MESSAGES.error,
|
|
316
|
+
finally: options.finally,
|
|
317
|
+
description: options.description,
|
|
318
|
+
...toastOptions
|
|
319
|
+
});
|
|
320
|
+
const custom = (render, options) => toast.custom(render, options);
|
|
321
|
+
return {
|
|
322
|
+
show,
|
|
323
|
+
dismiss,
|
|
324
|
+
promise: promiseToast,
|
|
325
|
+
custom,
|
|
326
|
+
success: (message, options) => showTypedToast("success", message, options),
|
|
327
|
+
error: (message, options) => showTypedToast("error", message, options),
|
|
328
|
+
info: (message, options) => showTypedToast("info", message, options),
|
|
329
|
+
warning: (message, options) => showTypedToast("warning", message, options),
|
|
330
|
+
loading: (message, options) => showTypedToast("loading", message, options)
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export { ToastProvider, Toaster, toast, useToast };
|
|
335
|
+
//# sourceMappingURL=chunk-E53FHDVN.mjs.map
|
|
336
|
+
//# sourceMappingURL=chunk-E53FHDVN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/toast/Toaster.tsx","../src/toast/ToastProvider.tsx","../src/toast/toast.tsx","../src/toast/useToast.tsx"],"names":["Sonner","jsxs","Fragment","jsx","sonnerToast"],"mappings":"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","file":"chunk-E53FHDVN.mjs","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport type * as ReactTypes from 'react';\nimport * as React from 'react';\nimport { Toaster as Sonner } from 'sonner';\nimport { XIcon } from '../icon';\n\n// Props 타입 정의\ntype ToasterRootProps = ReactTypes.ComponentProps<typeof Sonner>;\n\ntype ToasterContainerProps = {\n children: ReactTypes.ReactNode;\n} & ReactTypes.HTMLAttributes<HTMLDivElement>;\n\ntype ToasterIconProps = {\n children: ReactTypes.ReactNode;\n} & ReactTypes.HTMLAttributes<HTMLDivElement>;\n\ntype ToasterTitleProps = {\n children: ReactTypes.ReactNode;\n} & ReactTypes.HTMLAttributes<HTMLDivElement>;\n\ntype ToasterDescriptionProps = {\n children: ReactTypes.ReactNode;\n} & ReactTypes.HTMLAttributes<HTMLDivElement>;\n\ntype ToasterActionProps = {\n children?: ReactTypes.ReactNode;\n altText?: string;\n} & ReactTypes.ButtonHTMLAttributes<HTMLButtonElement>;\n\n// Namespace 타입 정의\ntype ToasterComponent = React.FC<ToasterRootProps> & {\n Container: React.ForwardRefExoticComponent<\n ToasterContainerProps & React.RefAttributes<HTMLDivElement>\n >;\n Icon: React.ForwardRefExoticComponent<ToasterIconProps & React.RefAttributes<HTMLDivElement>>;\n Title: React.ForwardRefExoticComponent<ToasterTitleProps & React.RefAttributes<HTMLDivElement>>;\n Description: React.ForwardRefExoticComponent<\n ToasterDescriptionProps & React.RefAttributes<HTMLDivElement>\n >;\n Action: React.ForwardRefExoticComponent<\n ToasterActionProps & React.RefAttributes<HTMLButtonElement>\n >;\n};\n\n/**\n * Sonner center 포지셔닝 보정\n *\n * Sonner는 toaster(`<ol>`)를 left:50% + translateX(-50%)로 중앙 정렬하지만,\n * 개별 toast는 toaster 내에서 left:0으로 왼쪽 정렬됩니다.\n * auto-width toast는 toaster(356px)보다 좁아 왼쪽으로 치우칩니다.\n *\n * 해결: 개별 toast에 left:calc(--width/2) + translateX(-50%) 적용\n * (참고: https://github.com/emilkowalski/sonner/issues/678)\n */\nconst positionFix = `\n[data-sonner-toaster][data-x-position='center'] [data-sonner-toast] {\n left: calc(var(--width) / 2) !important;\n transform: translateX(-50%) var(--y) !important;\n width: fit-content !important;\n max-width: calc(100% - var(--mobile-offset-left) * 2) !important;\n}\n@media (max-width: 600px) {\n [data-sonner-toaster] {\n left: 0 !important;\n right: 0 !important;\n }\n [data-sonner-toaster] [data-sonner-toast] {\n width: fit-content !important;\n max-width: calc(100% - var(--mobile-offset-left) - var(--mobile-offset-right)) !important;\n }\n [data-sonner-toaster][data-x-position='center'] [data-sonner-toast] {\n left: 50% !important;\n }\n [data-sonner-toaster][data-x-position='right'] [data-sonner-toast] {\n left: auto !important;\n right: var(--mobile-offset-right) !important;\n }\n [data-sonner-toaster][data-x-position='left'] [data-sonner-toast] {\n left: var(--mobile-offset-left) !important;\n right: auto !important;\n }\n}\n`;\n\n// Root 컴포넌트 (Provider)\nconst Toaster: ToasterComponent = ({ ...props }: ToasterRootProps) => {\n return (\n <>\n <style>{positionFix}</style>\n <Sonner\n // eslint-disable-next-line tailwindcss/no-custom-classname -- toaster는 shadcn의 클래스 구성임\n className=\"toaster group [--toast-width:auto] [&_li]:!flex [&_li]:!items-center [&_li]:!justify-between [&_li]:!gap-2\"\n closeButton={false}\n toastOptions={{\n closeButton: false,\n }}\n {...props}\n />\n </>\n );\n};\n\n// Toast Container (커스텀 토스트용)\nToaster.Container = React.forwardRef<HTMLDivElement, ToasterContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-3 rounded-medium border border-border-primary bg-component-toast py-[10px] pl-3 pr-4 text-mono-light shadow-strong',\n 'h-10 w-auto min-w-0 max-w-none',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n },\n) as ToasterComponent['Container'];\n\n// Icon 컴포넌트\nToaster.Icon = React.forwardRef<HTMLDivElement, ToasterIconProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('flex shrink-0 items-center justify-center', className)}\n {...props}\n >\n {children}\n </div>\n );\n },\n) as ToasterComponent['Icon'];\n\n// Title 컴포넌트\nToaster.Title = React.forwardRef<HTMLDivElement, ToasterTitleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex-1 overflow-hidden text-ellipsis whitespace-nowrap text-body-2 font-medium',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n },\n) as ToasterComponent['Title'];\n\n// Description 컴포넌트\nToaster.Description = React.forwardRef<HTMLDivElement, ToasterDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full text-body-3 font-regular text-text-static-light/80',\n 'overflow-hidden text-ellipsis',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n },\n) as ToasterComponent['Description'];\n\n// Action 컴포넌트 (닫기 버튼 등)\nToaster.Action = React.forwardRef<HTMLButtonElement, ToasterActionProps>(\n ({ className, children, altText, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'flex h-7 min-h-[28px] w-auto min-w-[28px] shrink-0 items-center justify-center',\n 'rounded-small bg-transparent px-0 py-0',\n 'border-0 transition-colors',\n 'hover:bg-solid-primary-hovered',\n 'whitespace-nowrap',\n 'cursor-pointer',\n 'text-body-2',\n className,\n )}\n aria-label={altText}\n {...props}\n >\n {children || <XIcon type=\"regular\" className=\"size-4\" />}\n </button>\n );\n },\n) as ToasterComponent['Action'];\n\n// displayName 설정\nToaster.displayName = 'Toaster';\nToaster.Container.displayName = 'Toaster.Container';\nToaster.Icon.displayName = 'Toaster.Icon';\nToaster.Title.displayName = 'Toaster.Title';\nToaster.Description.displayName = 'Toaster.Description';\nToaster.Action.displayName = 'Toaster.Action';\n\nexport { Toaster };\nexport type {\n ToasterActionProps,\n ToasterComponent,\n ToasterContainerProps,\n ToasterDescriptionProps,\n ToasterIconProps,\n ToasterRootProps,\n ToasterTitleProps,\n};\n","import type React from 'react';\n\nimport type { ToasterRootProps } from './Toaster';\nimport { Toaster } from './Toaster';\n\nexport interface ToastProviderProps {\n children?: React.ReactNode;\n /**\n * 호버 시 토스트 확장\n * @default true\n */\n expand?: boolean;\n /**\n * Rich colors 스타일 적용\n * @default false\n */\n richColors?: boolean;\n /**\n * Provider 레벨 닫기 버튼\n * @default false\n */\n closeButton?: boolean;\n /**\n * 토스트가 표시될 위치\n * @default 'top-center'\n */\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n /**\n * 토스트 표시 시간 (ms)\n * @default 4000\n */\n duration?: number;\n /**\n * 토스트 최대 개수\n * @default 10\n */\n visibleToasts?: number;\n /**\n * 추가 Toaster props\n */\n toasterProps?: Omit<ToasterRootProps, 'children' | 'expand' | 'richColors' | 'closeButton'>;\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n children,\n expand = true,\n richColors = false,\n closeButton = false,\n position = 'top-center',\n duration = 4000,\n visibleToasts = 10,\n toasterProps,\n}) => {\n return (\n <>\n {children}\n <Toaster\n position={position}\n closeButton={closeButton}\n richColors={richColors}\n expand={expand}\n duration={duration}\n visibleToasts={visibleToasts}\n {...toasterProps}\n />\n </>\n );\n};\n","import type { ExternalToast } from 'sonner';\nimport { toast as sonnerToast } from 'sonner';\n\nimport { CheckIcon, ErrorIcon, InfoIcon, WarningIcon } from '../icon';\nimport { Toaster } from './Toaster';\n\n// ── Types ──\n\ninterface ToastAction {\n label: string;\n onClick: () => void;\n}\n\ninterface ToastOptions {\n title: string;\n description?: string;\n action?: ToastAction;\n close?: boolean;\n}\n\ninterface ExtendedExternalToast extends ExternalToast {\n description?: string;\n action?: ToastAction;\n close?: boolean;\n}\n\ntype ToastInput = string | ToastOptions;\n\n// ── Helpers ──\n\nfunction isToastOptions(input: ToastInput): input is ToastOptions {\n return typeof input === 'object' && input !== null && 'title' in input;\n}\n\nfunction extractToastParams(\n input: ToastInput,\n options?: ExtendedExternalToast,\n): { title: string; description?: string; action?: ToastAction; close?: boolean } {\n if (isToastOptions(input)) {\n return {\n title: input.title,\n description: input.description,\n action: input.action,\n close: input.close,\n };\n }\n return {\n title: input,\n description: options?.description,\n action: options?.action,\n close: options?.close,\n };\n}\n\nfunction getSonnerOptions(options?: ExtendedExternalToast): ExternalToast | undefined {\n if (!options) {\n return undefined;\n }\n const { description: _description, action: _action, close: _close, ...sonnerOptions } = options;\n return sonnerOptions;\n}\n\n// ── Toast Content ──\n\nfunction ToastContent({\n id,\n icon,\n title,\n description,\n action,\n close,\n}: {\n id: string | number;\n icon?: React.ReactNode;\n title: string;\n description?: string;\n action?: ToastAction;\n close?: boolean;\n}) {\n const hasExtra = description || action;\n\n if (hasExtra) {\n return (\n <Toaster.Container className=\"h-auto min-h-12 flex-col items-start gap-1 py-3\">\n <div className=\"flex w-full items-center gap-2\">\n {icon && <Toaster.Icon>{icon}</Toaster.Icon>}\n <Toaster.Title>{title}</Toaster.Title>\n {close && (\n <Toaster.Action className=\"rounded-medium\" onClick={() => sonnerToast.dismiss(id)} />\n )}\n </div>\n {description && <Toaster.Description>{description}</Toaster.Description>}\n {action && (\n <Toaster.Action\n className=\"mt-1 text-text-info hover:text-text-info-hovered\"\n onClick={() => {\n action.onClick();\n sonnerToast.dismiss(id);\n }}\n >\n {action.label}\n </Toaster.Action>\n )}\n </Toaster.Container>\n );\n }\n\n // Figma: close=true → pl-12 pr-6 py-6 gap-12, Content(icon+text) gap-8\n // Figma: close=false → pl-12 pr-16 py-10, Content(icon+text) gap-8\n if (close) {\n return (\n <Toaster.Container className=\"py-1.5 pr-1.5\">\n <div className=\"flex flex-1 items-center gap-2 overflow-hidden\">\n {icon && <Toaster.Icon>{icon}</Toaster.Icon>}\n <Toaster.Title>{title}</Toaster.Title>\n </div>\n <Toaster.Action className=\"rounded-medium\" onClick={() => sonnerToast.dismiss(id)} />\n </Toaster.Container>\n );\n }\n\n return (\n <Toaster.Container>\n {icon && <Toaster.Icon>{icon}</Toaster.Icon>}\n <Toaster.Title>{title}</Toaster.Title>\n </Toaster.Container>\n );\n}\n\n// ── Internal creator ──\n\nfunction createToast(\n input: ToastInput,\n options: ExtendedExternalToast | undefined,\n icon?: React.ReactNode,\n) {\n const { title, description, action, close } = extractToastParams(input, options);\n\n return sonnerToast.custom(\n (id) => (\n <ToastContent\n id={id}\n icon={icon}\n title={title}\n description={description}\n action={action}\n close={close}\n />\n ),\n { unstyled: true, ...getSonnerOptions(options) },\n );\n}\n\n// ── Public API ──\n\n/**\n * toast() — 커스텀 디자인이 적용된 toast 함수\n *\n * sonner의 toast를 래핑하여 프로젝트의 디자인 시스템을 자동으로 적용합니다.\n *\n * @example\n * ```tsx\n * import { toast } from '@exem-ui/react';\n *\n * // 간단한 메시지\n * toast('기본 메시지');\n * toast.success('성공');\n * toast.error('오류');\n * toast.info('정보');\n * toast.warning('경고');\n *\n * // title + description + action\n * toast.success({\n * title: '저장 완료',\n * description: '변경사항이 저장되었습니다.',\n * action: { label: '되돌리기', onClick: () => handleUndo() },\n * });\n *\n * // 닫기 버튼\n * toast.success({ title: '저장 완료', close: true });\n *\n * // 문자열 + 옵션 (sonner 스타일)\n * toast.success('생성 완료', {\n * description: '일요일, 12월 3일',\n * action: { label: 'Undo', onClick: () => console.log('Undo') },\n * });\n * ```\n */\nexport const toast = Object.assign(\n (input: ToastInput, options?: ExtendedExternalToast) => createToast(input, options),\n {\n success: (input: ToastInput, options?: ExtendedExternalToast) =>\n createToast(\n input,\n options,\n <CheckIcon type=\"regular\" className=\"size-5 text-icon-success\" />,\n ),\n\n error: (input: ToastInput, options?: ExtendedExternalToast) =>\n createToast(\n input,\n options,\n <ErrorIcon type=\"regular\" className=\"size-5 text-icon-critical\" />,\n ),\n\n info: (input: ToastInput, options?: ExtendedExternalToast) =>\n createToast(\n input,\n options,\n <InfoIcon type=\"regular\" className=\"size-5 text-icon-static-light\" />,\n ),\n\n warning: (input: ToastInput, options?: ExtendedExternalToast) =>\n createToast(\n input,\n options,\n <WarningIcon type=\"regular\" className=\"size-5 text-icon-warning\" />,\n ),\n\n loading: (input: ToastInput, options?: ExtendedExternalToast) => createToast(input, options),\n\n dismiss: sonnerToast.dismiss,\n promise: sonnerToast.promise as typeof sonnerToast.promise,\n custom: sonnerToast.custom,\n },\n);\n\nexport type { ExtendedExternalToast, ToastAction, ToastInput, ToastOptions };\n","import type React from 'react';\nimport { toast as sonnerToast } from 'sonner';\nimport type { ExtendedExternalToast } from './toast';\nimport { toast } from './toast';\nimport type * as Toast from './types';\n\nfunction toExtended(options?: Toast.Options): ExtendedExternalToast | undefined {\n if (!options) {\n return undefined;\n }\n const { description: _desc, action: _act, ...rest } = options;\n const converted: Record<string, unknown> = { ...rest };\n if (typeof _desc === 'string') {\n converted.description = _desc;\n }\n return converted as ExtendedExternalToast;\n}\n\nconst DEFAULT_MESSAGES: Toast.DefaultMessage = {\n success: '성공',\n error: '오류',\n info: '정보',\n warning: '경고',\n loading: '로딩',\n};\n\n/**\n * @deprecated `toast` 함수를 직접 사용하세요.\n *\n * 하위호환을 위해 유지되며, 내부적으로 `toast`에 위임합니다.\n *\n * @example\n * ```tsx\n * // Before (useToast)\n * const { success } = useToast();\n * success('완료');\n *\n * // After (toast 직접 사용)\n * import { toast } from '@exem-ui/react';\n * toast.success('완료');\n * ```\n */\nexport function useToast() {\n const show = (message: string, options?: Toast.Options) => toast(message, toExtended(options));\n\n const dismiss = (toastId: string | number) => toast.dismiss(toastId);\n\n const showTypedToast = (type: Toast.Type, message?: string, options?: Toast.Options) => {\n const toastMessage = message ?? DEFAULT_MESSAGES[type];\n return toast[type](toastMessage, toExtended(options));\n };\n\n const promiseToast = <T,>(\n promiseTask: Promise<T>,\n options: Toast.PromiseOptions<T>,\n toastOptions?: Toast.Options,\n ) =>\n sonnerToast.promise(promiseTask, {\n loading: options.loading ?? DEFAULT_MESSAGES.loading,\n success: options.success ?? DEFAULT_MESSAGES.success,\n error: options.error ?? DEFAULT_MESSAGES.error,\n finally: options.finally,\n description: options.description,\n ...toastOptions,\n });\n\n const custom = (render: (id: string | number) => React.ReactElement, options?: Toast.Options) =>\n toast.custom(render, options);\n\n return {\n show,\n dismiss,\n promise: promiseToast,\n custom,\n success: (message?: string, options?: Toast.Options) =>\n showTypedToast('success', message, options),\n error: (message?: string, options?: Toast.Options) => showTypedToast('error', message, options),\n info: (message?: string, options?: Toast.Options) => showTypedToast('info', message, options),\n warning: (message?: string, options?: Toast.Options) =>\n showTypedToast('warning', message, options),\n loading: (message?: string, options?: Toast.Options) =>\n showTypedToast('loading', message, options),\n };\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5M47B2XJ_js = require('./chunk-5M47B2XJ.js');
|
|
4
|
+
var utils = require('@exem-ui/core/utils');
|
|
5
|
+
var reactSlot = require('@radix-ui/react-slot');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
var Breadcrumb = react.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("nav", { ref, "aria-label": "breadcrumb", ...props }));
|
|
10
|
+
Breadcrumb.List = react.forwardRef(
|
|
11
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
12
|
+
"ol",
|
|
13
|
+
{
|
|
14
|
+
ref,
|
|
15
|
+
className: utils.cn(
|
|
16
|
+
"flex flex-wrap items-center gap-[4px] break-words text-body-2 text-text-tertiary",
|
|
17
|
+
className
|
|
18
|
+
),
|
|
19
|
+
...props
|
|
20
|
+
}
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
Breadcrumb.Item = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("li", { ref, className: utils.cn("inline-flex items-center", className), ...props }));
|
|
24
|
+
Breadcrumb.Link = react.forwardRef(
|
|
25
|
+
({ asChild, className, ...props }, ref) => {
|
|
26
|
+
const Comp = asChild ? reactSlot.Slot : "a";
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Comp, { ref, className: utils.cn("text-text-link", className), ...props });
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
Breadcrumb.Page = react.forwardRef(
|
|
31
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
32
|
+
"span",
|
|
33
|
+
{
|
|
34
|
+
ref,
|
|
35
|
+
role: "link",
|
|
36
|
+
"aria-disabled": "true",
|
|
37
|
+
"aria-current": "page",
|
|
38
|
+
className: utils.cn("text-text-primary", className),
|
|
39
|
+
...props
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
);
|
|
43
|
+
Breadcrumb.Separator = react.forwardRef(
|
|
44
|
+
({ children, className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
45
|
+
"li",
|
|
46
|
+
{
|
|
47
|
+
ref,
|
|
48
|
+
role: "presentation",
|
|
49
|
+
"aria-hidden": "true",
|
|
50
|
+
className: utils.cn("[&>svg]:size-3.5", className),
|
|
51
|
+
...props,
|
|
52
|
+
children: children ?? "/"
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
);
|
|
56
|
+
Breadcrumb.Ellipsis = react.forwardRef(
|
|
57
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
58
|
+
"span",
|
|
59
|
+
{
|
|
60
|
+
ref,
|
|
61
|
+
role: "presentation",
|
|
62
|
+
"aria-hidden": "true",
|
|
63
|
+
className: utils.cn("flex h-9 w-9 items-center justify-center", className),
|
|
64
|
+
...props,
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5M47B2XJ_js.MoreHorizontal, { type: "regular", className: "size-4" }),
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "More" })
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
);
|
|
72
|
+
Breadcrumb.displayName = "Breadcrumb";
|
|
73
|
+
Breadcrumb.List.displayName = "Breadcrumb.List";
|
|
74
|
+
Breadcrumb.Item.displayName = "Breadcrumb.Item";
|
|
75
|
+
Breadcrumb.Link.displayName = "Breadcrumb.Link";
|
|
76
|
+
Breadcrumb.Page.displayName = "Breadcrumb.Page";
|
|
77
|
+
Breadcrumb.Separator.displayName = "Breadcrumb.Separator";
|
|
78
|
+
Breadcrumb.Ellipsis.displayName = "Breadcrumb.Ellipsis";
|
|
79
|
+
|
|
80
|
+
exports.Breadcrumb = Breadcrumb;
|
|
81
|
+
//# sourceMappingURL=chunk-ECRQD7UU.js.map
|
|
82
|
+
//# sourceMappingURL=chunk-ECRQD7UU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/breadcrumb/Breadcrumb.tsx"],"names":["forwardRef","jsx","cn","Slot","jsxs","MoreHorizontal"],"mappings":"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","file":"chunk-ECRQD7UU.js","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport type React from 'react';\nimport { forwardRef } from 'react';\nimport { MoreHorizontalIcon } from '../icon';\n\ntype BreadcrumbRootProps = React.ComponentPropsWithoutRef<'nav'>;\n\ntype BreadcrumbListProps = React.ComponentPropsWithoutRef<'ol'>;\n\ntype BreadcrumbItemProps = React.ComponentPropsWithoutRef<'li'>;\n\ntype BreadcrumbLinkProps = React.ComponentPropsWithoutRef<'a'> & {\n asChild?: boolean;\n};\n\ntype BreadcrumbPageProps = React.ComponentPropsWithoutRef<'span'>;\n\ntype BreadcrumbSeparatorProps = React.ComponentProps<'li'>;\n\ntype BreadcrumbEllipsisProps = React.ComponentProps<'span'>;\n\ntype BreadcrumbComponent = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbRootProps> & React.RefAttributes<HTMLElement>\n> & {\n List: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbListProps> & React.RefAttributes<HTMLOListElement>\n >;\n Item: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbItemProps> & React.RefAttributes<HTMLLIElement>\n >;\n Link: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbLinkProps> & React.RefAttributes<HTMLAnchorElement>\n >;\n Page: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbPageProps> & React.RefAttributes<HTMLSpanElement>\n >;\n Separator: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbSeparatorProps> & React.RefAttributes<HTMLLIElement>\n >;\n Ellipsis: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<BreadcrumbEllipsisProps> & React.RefAttributes<HTMLSpanElement>\n >;\n};\n\n/**\n * 현재 페이지의 계층 위치를 표시하는 탐색 경로 컴포넌트입니다.\n * Compound Component 패턴으로 하위 컴포넌트와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Breadcrumb>\n * <Breadcrumb.List>\n * <Breadcrumb.Item>\n * <Breadcrumb.Link href=\"/\">홈</Breadcrumb.Link>\n * </Breadcrumb.Item>\n * <Breadcrumb.Separator />\n * <Breadcrumb.Item>\n * <Breadcrumb.Page>현재 페이지</Breadcrumb.Page>\n * </Breadcrumb.Item>\n * </Breadcrumb.List>\n * </Breadcrumb>\n * ```\n *\n * @see {@link BreadcrumbRootProps} props 상세\n */\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbRootProps>(({ ...props }, ref) => (\n <nav ref={ref} aria-label=\"breadcrumb\" {...props} />\n)) as BreadcrumbComponent;\n\nBreadcrumb.List = forwardRef<HTMLOListElement, BreadcrumbListProps>(\n ({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n 'flex flex-wrap items-center gap-[4px] break-words text-body-2 text-text-tertiary',\n className,\n )}\n {...props}\n />\n ),\n) as BreadcrumbComponent['List'];\n\nBreadcrumb.Item = forwardRef<HTMLLIElement, BreadcrumbItemProps>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn('inline-flex items-center', className)} {...props} />\n)) as BreadcrumbComponent['Item'];\n\nBreadcrumb.Link = forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n ({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a';\n\n return <Comp ref={ref} className={cn('text-text-link', className)} {...props} />;\n },\n) as BreadcrumbComponent['Link'];\n\nBreadcrumb.Page = forwardRef<HTMLSpanElement, BreadcrumbPageProps>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('text-text-primary', className)}\n {...props}\n />\n ),\n) as BreadcrumbComponent['Page'];\n\nBreadcrumb.Separator = forwardRef<HTMLLIElement, BreadcrumbSeparatorProps>(\n ({ children, className, ...props }, ref) => (\n <li\n ref={ref}\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('[&>svg]:size-3.5', className)}\n {...props}\n >\n {children ?? '/'}\n </li>\n ),\n) as BreadcrumbComponent['Separator'];\n\nBreadcrumb.Ellipsis = forwardRef<HTMLSpanElement, BreadcrumbEllipsisProps>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('flex h-9 w-9 items-center justify-center', className)}\n {...props}\n >\n <MoreHorizontalIcon type=\"regular\" className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n ),\n) as BreadcrumbComponent['Ellipsis'];\n\nBreadcrumb.displayName = 'Breadcrumb';\nBreadcrumb.List.displayName = 'Breadcrumb.List';\nBreadcrumb.Item.displayName = 'Breadcrumb.Item';\nBreadcrumb.Link.displayName = 'Breadcrumb.Link';\nBreadcrumb.Page.displayName = 'Breadcrumb.Page';\nBreadcrumb.Separator.displayName = 'Breadcrumb.Separator';\nBreadcrumb.Ellipsis.displayName = 'Breadcrumb.Ellipsis';\n\nexport { Breadcrumb };\nexport type {\n BreadcrumbComponent,\n BreadcrumbRootProps,\n BreadcrumbListProps,\n BreadcrumbItemProps,\n BreadcrumbLinkProps,\n BreadcrumbPageProps,\n BreadcrumbSeparatorProps,\n BreadcrumbEllipsisProps,\n};\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { cva, cn } from '@exem-ui/core/utils';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/progress/Progress.tsx
|
|
6
|
+
var trackVariants = cva("w-full overflow-hidden rounded-full bg-elevation-elevation-3", {
|
|
7
|
+
variants: {
|
|
8
|
+
size: {
|
|
9
|
+
small: "h-1",
|
|
10
|
+
medium: "h-1.5",
|
|
11
|
+
large: "h-2"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
defaultVariants: {
|
|
15
|
+
size: "large"
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var gaugeVariants = cva("h-full rounded-full bg-icon-accent transition-[width] duration-300", {
|
|
19
|
+
variants: {
|
|
20
|
+
size: {
|
|
21
|
+
small: "",
|
|
22
|
+
medium: "",
|
|
23
|
+
large: ""
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: {
|
|
27
|
+
size: "medium"
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
var Progress = forwardRef(
|
|
31
|
+
({ value = 0, max = 100, size = "medium", trackClassName, gaugeClassName, className, ...props }, ref) => {
|
|
32
|
+
const clampedValue = Math.min(Math.max(value, 0), max);
|
|
33
|
+
const percent = max > 0 ? clampedValue / max * 100 : 0;
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
ref,
|
|
38
|
+
role: "progressbar",
|
|
39
|
+
"aria-valuenow": clampedValue,
|
|
40
|
+
"aria-valuemin": 0,
|
|
41
|
+
"aria-valuemax": max,
|
|
42
|
+
className: cn(trackVariants({ size }), trackClassName, className),
|
|
43
|
+
...props,
|
|
44
|
+
children: /* @__PURE__ */ jsx(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
className: cn(gaugeVariants({ size }), gaugeClassName),
|
|
48
|
+
style: { width: `${percent}%` }
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
Progress.displayName = "Progress";
|
|
56
|
+
|
|
57
|
+
export { Progress };
|
|
58
|
+
//# sourceMappingURL=chunk-FB4ESGOX.mjs.map
|
|
59
|
+
//# sourceMappingURL=chunk-FB4ESGOX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/progress/Progress.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,aAAA,GAAgB,IAAI,8DAAA,EAAgE;AAAA,EACxF,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAED,IAAM,aAAA,GAAgB,IAAI,oEAAA,EAAsE;AAAA,EAC9F,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAkCD,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CACE,EAAE,KAAA,GAAQ,CAAA,EAAG,MAAM,GAAA,EAAK,IAAA,GAAO,QAAA,EAAU,cAAA,EAAgB,cAAA,EAAgB,SAAA,EAAW,GAAG,KAAA,IACvF,GAAA,KACG;AACH,IAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,CAAC,GAAG,GAAG,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,GAAA,GAAM,CAAA,GAAK,YAAA,GAAe,MAAO,GAAA,GAAM,CAAA;AAEvD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,aAAA;AAAA,QACL,eAAA,EAAe,YAAA;AAAA,QACf,eAAA,EAAe,CAAA;AAAA,QACf,eAAA,EAAe,GAAA;AAAA,QACf,SAAA,EAAW,GAAG,aAAA,CAAc,EAAE,MAAM,CAAA,EAAG,gBAAgB,SAAS,CAAA;AAAA,QAC/D,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,IAAA,EAAM,GAAG,cAAc,CAAA;AAAA,YACrD,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAAI;AAAA;AAChC;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-FB4ESGOX.mjs","sourcesContent":["import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport { forwardRef } from 'react';\n\nconst trackVariants = cva('w-full overflow-hidden rounded-full bg-elevation-elevation-3', {\n variants: {\n size: {\n small: 'h-1',\n medium: 'h-1.5',\n large: 'h-2',\n },\n },\n defaultVariants: {\n size: 'large',\n },\n});\n\nconst gaugeVariants = cva('h-full rounded-full bg-icon-accent transition-[width] duration-300', {\n variants: {\n size: {\n small: '',\n medium: '',\n large: '',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n});\n\ninterface ProgressProps\n extends VariantProps<typeof trackVariants>,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * 현재 진행 값\n * @default 0\n */\n value?: number;\n /**\n * 최대 값\n * @default 100\n */\n max?: number;\n /** 트랙(배경) 추가 클래스 */\n trackClassName?: string;\n /** 게이지(채움) 추가 클래스 */\n gaugeClassName?: string;\n}\n\ntype ProgressComponent = React.ForwardRefExoticComponent<\n ProgressProps & React.RefAttributes<HTMLDivElement>\n>;\n\n/**\n * 작업 진행률을 시각적으로 표시하는 바 컴포넌트입니다.\n *\n * @example\n * ```tsx\n * <Progress value={60} />\n * <Progress value={30} max={100} size=\"large\" />\n * ```\n */\nconst Progress = forwardRef<HTMLDivElement, ProgressProps>(\n (\n { value = 0, max = 100, size = 'medium', trackClassName, gaugeClassName, className, ...props },\n ref,\n ) => {\n const clampedValue = Math.min(Math.max(value, 0), max);\n const percent = max > 0 ? (clampedValue / max) * 100 : 0;\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={max}\n className={cn(trackVariants({ size }), trackClassName, className)}\n {...props}\n >\n <div\n className={cn(gaugeVariants({ size }), gaugeClassName)}\n style={{ width: `${percent}%` }}\n />\n </div>\n );\n },\n) as ProgressComponent;\n\nProgress.displayName = 'Progress';\n\nexport { Progress };\nexport type { ProgressComponent, ProgressProps };\n"]}
|