@exem-ui/react 0.1.0-next.bf3c711
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.en.md +141 -0
- package/README.md +141 -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 +251 -0
- package/styles.css +20 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkFOMIUDRM_js = require('./chunk-FOMIUDRM.js');
|
|
4
|
+
var chunkREBHUF4L_js = require('./chunk-REBHUF4L.js');
|
|
5
|
+
var chunk5M47B2XJ_js = require('./chunk-5M47B2XJ.js');
|
|
6
|
+
var utils = require('@exem-ui/core/utils');
|
|
7
|
+
var DialogPrimitive = require('@radix-ui/react-dialog');
|
|
8
|
+
var react = require('react');
|
|
9
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n.default = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
|
|
30
|
+
|
|
31
|
+
var MODAL_PADDING = {
|
|
32
|
+
body: "px-4 pb-4",
|
|
33
|
+
footer: "px-4 py-3"
|
|
34
|
+
};
|
|
35
|
+
var ModalContext = react.createContext({ size: "medium" });
|
|
36
|
+
var Modal = DialogPrimitive__namespace.Root;
|
|
37
|
+
Modal.Trigger = DialogPrimitive__namespace.Trigger;
|
|
38
|
+
Modal.Portal = DialogPrimitive__namespace.Portal;
|
|
39
|
+
Modal.Close = react.forwardRef(({ size, ...props }, ref) => {
|
|
40
|
+
const { size: modalSize } = react.useContext(ModalContext);
|
|
41
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
42
|
+
chunkREBHUF4L_js.Button,
|
|
43
|
+
{
|
|
44
|
+
...props,
|
|
45
|
+
ref,
|
|
46
|
+
color: "assistive",
|
|
47
|
+
variant: "contained",
|
|
48
|
+
size: size ?? (modalSize === "fullsize" ? "large" : "medium")
|
|
49
|
+
}
|
|
50
|
+
) });
|
|
51
|
+
});
|
|
52
|
+
Modal.Overlay = react.forwardRef(
|
|
53
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
54
|
+
DialogPrimitive__namespace.Overlay,
|
|
55
|
+
{
|
|
56
|
+
ref,
|
|
57
|
+
className: utils.cn(
|
|
58
|
+
"fixed inset-0 z-50 bg-component-dim data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
59
|
+
className
|
|
60
|
+
),
|
|
61
|
+
...props
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
Modal.Content = react.forwardRef(
|
|
66
|
+
({ className, children, size = "medium", onInteractOutside, onFocusOutside, ...props }, ref) => {
|
|
67
|
+
const isFullSize = size === "fullsize";
|
|
68
|
+
const sizeWidthMap = {
|
|
69
|
+
small: "max-w-[640px]",
|
|
70
|
+
medium: "max-w-[800px]",
|
|
71
|
+
large: "max-w-[960px]",
|
|
72
|
+
xlarge: "max-w-[1120px]"
|
|
73
|
+
};
|
|
74
|
+
const shouldPreventDismissForSelect = (target) => {
|
|
75
|
+
const isSelectOpen = Boolean(
|
|
76
|
+
document.querySelector('[data-radix-select-content][data-state="open"]')
|
|
77
|
+
);
|
|
78
|
+
if (isSelectOpen) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (!(target instanceof Element)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return Boolean(
|
|
85
|
+
target.closest("[data-radix-select-content]") || target.closest("[data-radix-select-viewport]")
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
const handleInteractOutside = (event) => {
|
|
89
|
+
if (shouldPreventDismissForSelect(event.target)) {
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
}
|
|
92
|
+
onInteractOutside?.(event);
|
|
93
|
+
};
|
|
94
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ModalContext.Provider, { value: { size }, children: /* @__PURE__ */ jsxRuntime.jsxs(Modal.Portal, { children: [
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(Modal.Overlay, {}),
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
97
|
+
DialogPrimitive__namespace.Content,
|
|
98
|
+
{
|
|
99
|
+
ref,
|
|
100
|
+
className: utils.cn(
|
|
101
|
+
// 공통 스타일
|
|
102
|
+
"fixed z-50 flex flex-col rounded-strong border border-border-primary bg-elevation-elevation-0 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
103
|
+
// fullsize일 때
|
|
104
|
+
isFullSize ? "inset-0 m-10" : (
|
|
105
|
+
// 일반 모달일 때
|
|
106
|
+
utils.cn(
|
|
107
|
+
"left-[50%] top-[50%] w-full max-h-[90vh] translate-x-[-50%] translate-y-[-50%] shadow-strong data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
|
|
108
|
+
sizeWidthMap[size]
|
|
109
|
+
)
|
|
110
|
+
),
|
|
111
|
+
className
|
|
112
|
+
),
|
|
113
|
+
...props,
|
|
114
|
+
onInteractOutside: handleInteractOutside,
|
|
115
|
+
children
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
] }) });
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
Modal.Header = react.forwardRef(
|
|
122
|
+
({ className, line = false, showCloseIcon = true, children, ...props }, ref) => {
|
|
123
|
+
const { size } = react.useContext(ModalContext);
|
|
124
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
125
|
+
"div",
|
|
126
|
+
{
|
|
127
|
+
ref,
|
|
128
|
+
className: utils.cn(
|
|
129
|
+
"flex shrink-0 flex-row items-center gap-2 pl-4 pr-3",
|
|
130
|
+
line && "border-b border-border-primary",
|
|
131
|
+
size === "fullsize" ? "h-16" : "h-14",
|
|
132
|
+
className
|
|
133
|
+
),
|
|
134
|
+
...props,
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children }),
|
|
137
|
+
showCloseIcon && /* @__PURE__ */ jsxRuntime.jsx(
|
|
138
|
+
DialogPrimitive__namespace.Close,
|
|
139
|
+
{
|
|
140
|
+
className: utils.cn(
|
|
141
|
+
"flex shrink-0 items-center justify-center size-8 rounded-medium text-icon-secondary transition-colors hover:bg-elevation-elevation-2 focus:outline-none disabled:pointer-events-none"
|
|
142
|
+
),
|
|
143
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunk5M47B2XJ_js.X, { type: "regular", size: 20 })
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
Modal.Body = react.forwardRef(
|
|
152
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
153
|
+
"div",
|
|
154
|
+
{
|
|
155
|
+
ref,
|
|
156
|
+
className: utils.cn(
|
|
157
|
+
"flex-1 flex flex-col min-h-0 h-full",
|
|
158
|
+
"[&_[data-slot=scroll-area-viewport]>div]:h-full"
|
|
159
|
+
),
|
|
160
|
+
...props,
|
|
161
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkFOMIUDRM_js.ScrollArea, { className: "h-full flex flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn(MODAL_PADDING.body, className), children }) })
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
);
|
|
165
|
+
Modal.Footer = react.forwardRef(
|
|
166
|
+
({ className, line = true, ...props }, ref) => {
|
|
167
|
+
const { size } = react.useContext(ModalContext);
|
|
168
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
169
|
+
"div",
|
|
170
|
+
{
|
|
171
|
+
ref,
|
|
172
|
+
className: utils.cn(
|
|
173
|
+
"flex flex-row items-center justify-between",
|
|
174
|
+
line && "border-t border-border-primary",
|
|
175
|
+
size === "fullsize" ? "gap-3" : "h-14 gap-3",
|
|
176
|
+
MODAL_PADDING.footer,
|
|
177
|
+
className
|
|
178
|
+
),
|
|
179
|
+
...props
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
Modal.FooterDescription = react.forwardRef(
|
|
185
|
+
({ className, error = false, icon, children, ...props }, ref) => {
|
|
186
|
+
const { size } = react.useContext(ModalContext);
|
|
187
|
+
const isLargeFooter = size === "fullsize";
|
|
188
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
189
|
+
"div",
|
|
190
|
+
{
|
|
191
|
+
ref,
|
|
192
|
+
className: utils.cn(
|
|
193
|
+
"flex flex-row items-center gap-1",
|
|
194
|
+
isLargeFooter ? "text-body-2" : "text-body-3",
|
|
195
|
+
error ? "text-text-critical" : "text-text-tertiary",
|
|
196
|
+
className
|
|
197
|
+
),
|
|
198
|
+
...props,
|
|
199
|
+
children: [
|
|
200
|
+
icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 size-4 items-center justify-center [&>svg]:size-4", children: icon }),
|
|
201
|
+
children
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
Modal.Actions = react.forwardRef(({ className, ...props }, ref) => {
|
|
208
|
+
const { size } = react.useContext(ModalContext);
|
|
209
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
210
|
+
"div",
|
|
211
|
+
{
|
|
212
|
+
ref,
|
|
213
|
+
className: utils.cn(
|
|
214
|
+
"ml-auto flex flex-row items-center",
|
|
215
|
+
size === "fullsize" ? "gap-3" : "gap-2",
|
|
216
|
+
className
|
|
217
|
+
),
|
|
218
|
+
...props
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
});
|
|
222
|
+
Modal.Action = react.forwardRef(
|
|
223
|
+
({ color = "primary", size, ...props }, ref) => {
|
|
224
|
+
const { size: modalSize } = react.useContext(ModalContext);
|
|
225
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
226
|
+
chunkREBHUF4L_js.Button,
|
|
227
|
+
{
|
|
228
|
+
...props,
|
|
229
|
+
ref,
|
|
230
|
+
color,
|
|
231
|
+
variant: "contained",
|
|
232
|
+
size: size ?? (modalSize === "fullsize" ? "large" : "medium")
|
|
233
|
+
}
|
|
234
|
+
) });
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
Modal.Title = react.forwardRef(
|
|
238
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
239
|
+
DialogPrimitive__namespace.Title,
|
|
240
|
+
{
|
|
241
|
+
ref,
|
|
242
|
+
className: utils.cn(
|
|
243
|
+
"text-title-2 font-semibold leading-none tracking-tight text-text-primary",
|
|
244
|
+
className
|
|
245
|
+
),
|
|
246
|
+
...props
|
|
247
|
+
}
|
|
248
|
+
)
|
|
249
|
+
);
|
|
250
|
+
Modal.Description = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
251
|
+
DialogPrimitive__namespace.Description,
|
|
252
|
+
{
|
|
253
|
+
ref,
|
|
254
|
+
className: utils.cn("text-body-2 text-text-tertiary", className),
|
|
255
|
+
...props
|
|
256
|
+
}
|
|
257
|
+
));
|
|
258
|
+
Modal.displayName = "Modal";
|
|
259
|
+
Modal.Trigger.displayName = "Modal.Trigger";
|
|
260
|
+
Modal.Portal.displayName = "Modal.Portal";
|
|
261
|
+
Modal.Close.displayName = "Modal.Close";
|
|
262
|
+
Modal.Overlay.displayName = "Modal.Overlay";
|
|
263
|
+
Modal.Content.displayName = "Modal.Content";
|
|
264
|
+
Modal.Header.displayName = "Modal.Header";
|
|
265
|
+
Modal.Body.displayName = "Modal.Body";
|
|
266
|
+
Modal.Footer.displayName = "Modal.Footer";
|
|
267
|
+
Modal.FooterDescription.displayName = "Modal.FooterDescription";
|
|
268
|
+
Modal.Actions.displayName = "Modal.Actions";
|
|
269
|
+
Modal.Action.displayName = "Modal.Action";
|
|
270
|
+
Modal.Title.displayName = "Modal.Title";
|
|
271
|
+
Modal.Description.displayName = "Modal.Description";
|
|
272
|
+
|
|
273
|
+
exports.Modal = Modal;
|
|
274
|
+
//# sourceMappingURL=chunk-RGB3QLQT.js.map
|
|
275
|
+
//# sourceMappingURL=chunk-RGB3QLQT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modal/Modal.tsx"],"names":["createContext","DialogPrimitive","forwardRef","useContext","jsx","Button","cn","jsxs","X","ScrollArea"],"mappings":"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","file":"chunk-RGB3QLQT.js","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport type React from 'react';\nimport { createContext, forwardRef, useContext } from 'react';\nimport type { ButtonProps } from '../button/Button';\nimport { Button } from '../button/Button';\nimport { XIcon } from '../icon';\nimport { ScrollArea } from '../scrollArea/ScrollArea';\n\ntype ModalSize = 'small' | 'medium' | 'large' | 'xlarge' | 'fullsize';\n\ntype ModalRootProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;\n\ntype ModalTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;\n\ntype ModalPortalProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>;\n\ntype ModalOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;\n\ntype ModalContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n /**\n * 모달 크기\n * @default 'medium'\n */\n size?: ModalSize;\n};\n\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>;\ntype InteractOutsideEvent = Parameters<NonNullable<DialogContentProps['onInteractOutside']>>[0];\n\ntype ModalCloseProps = Omit<ButtonProps, 'color' | 'variant'>;\n\ntype ModalHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n /**\n * 하단 구분선 표시 여부\n * @default false\n */\n line?: boolean;\n /**\n * 닫기 아이콘 표시 여부\n * @default true\n */\n showCloseIcon?: boolean;\n};\n\ntype ModalBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype ModalFooterProps = React.HTMLAttributes<HTMLDivElement> & {\n /**\n * 상단 구분선 표시 여부\n * @default true\n */\n line?: boolean;\n};\n\ntype ModalFooterDescriptionProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 에러 상태 표시 여부 */\n error?: boolean;\n /** 설명 앞에 표시할 아이콘 요소 */\n icon?: React.ReactNode;\n};\n\ntype ModalActionsProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype ModalActionProps = Omit<ButtonProps, 'color' | 'variant'> & {\n /**\n * 버튼 색상\n * @default 'primary'\n */\n color?: 'primary' | 'critical';\n};\n\ntype ModalTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\n\ntype ModalDescriptionProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>;\n\ntype ModalComponent = typeof DialogPrimitive.Root & {\n Trigger: typeof DialogPrimitive.Trigger;\n Portal: typeof DialogPrimitive.Portal;\n Close: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalCloseProps> & React.RefAttributes<HTMLButtonElement>\n >;\n Overlay: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalOverlayProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Overlay>>\n >;\n Content: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalContentProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Content>>\n >;\n Header: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalHeaderProps> & React.RefAttributes<HTMLDivElement>\n >;\n Body: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalBodyProps> & React.RefAttributes<HTMLDivElement>\n >;\n Footer: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalFooterProps> & React.RefAttributes<HTMLDivElement>\n >;\n FooterDescription: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalFooterDescriptionProps> & React.RefAttributes<HTMLDivElement>\n >;\n Actions: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalActionsProps> & React.RefAttributes<HTMLDivElement>\n >;\n Action: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalActionProps> & React.RefAttributes<HTMLButtonElement>\n >;\n Title: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalTitleProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Title>>\n >;\n Description: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalDescriptionProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Description>>\n >;\n};\n\nconst MODAL_PADDING = {\n body: 'px-4 pb-4',\n footer: 'px-4 py-3',\n};\n\nconst ModalContext = createContext<{ size: ModalSize }>({ size: 'medium' });\n\n/**\n * 사용자 인터랙션이 필요한 오버레이 다이얼로그 컴포넌트입니다.\n * Compound Component 패턴으로 하위 컴포넌트와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Modal>\n * <Modal.Trigger>열기</Modal.Trigger>\n * <Modal.Content size=\"medium\">\n * <Modal.Header>\n * <Modal.Title>제목</Modal.Title>\n * </Modal.Header>\n * <Modal.Body>내용</Modal.Body>\n * <Modal.Footer>\n * <Modal.Actions>\n * <Modal.Close>닫기</Modal.Close>\n * </Modal.Actions>\n * </Modal.Footer>\n * </Modal.Content>\n * </Modal>\n * ```\n *\n * @see {@link ModalContentProps} Content props 상세\n */\nconst Modal = DialogPrimitive.Root as ModalComponent;\n\nModal.Trigger = DialogPrimitive.Trigger;\n\nModal.Portal = DialogPrimitive.Portal;\n\nModal.Close = forwardRef<HTMLButtonElement, ModalCloseProps>(({ size, ...props }, ref) => {\n const { size: modalSize } = useContext(ModalContext);\n\n return (\n <DialogPrimitive.Close asChild>\n <Button\n {...props}\n ref={ref}\n color=\"assistive\"\n variant=\"contained\"\n size={size ?? (modalSize === 'fullsize' ? 'large' : 'medium')}\n />\n </DialogPrimitive.Close>\n );\n}) as ModalComponent['Close'];\n\nModal.Overlay = forwardRef<React.ComponentRef<typeof DialogPrimitive.Overlay>, ModalOverlayProps>(\n ({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-component-dim data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n ),\n) as ModalComponent['Overlay'];\n\nModal.Content = forwardRef<React.ComponentRef<typeof DialogPrimitive.Content>, ModalContentProps>(\n ({ className, children, size = 'medium', onInteractOutside, onFocusOutside, ...props }, ref) => {\n const isFullSize = size === 'fullsize';\n\n const sizeWidthMap: Record<Exclude<ModalSize, 'fullsize'>, string> = {\n small: 'max-w-[640px]',\n medium: 'max-w-[800px]',\n large: 'max-w-[960px]',\n xlarge: 'max-w-[1120px]',\n };\n\n const shouldPreventDismissForSelect = (target: EventTarget | null) => {\n const isSelectOpen = Boolean(\n document.querySelector('[data-radix-select-content][data-state=\"open\"]'),\n );\n if (isSelectOpen) {\n return true;\n }\n\n if (!(target instanceof Element)) {\n return false;\n }\n\n return Boolean(\n target.closest('[data-radix-select-content]') ||\n target.closest('[data-radix-select-viewport]'),\n );\n };\n\n const handleInteractOutside = (event: InteractOutsideEvent) => {\n // Select가 열려있는 경우: Modal 닫힘 방지\n if (shouldPreventDismissForSelect(event.target)) {\n event.preventDefault();\n }\n\n onInteractOutside?.(event);\n };\n\n return (\n <ModalContext.Provider value={{ size }}>\n <Modal.Portal>\n <Modal.Overlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n // 공통 스타일\n 'fixed z-50 flex flex-col rounded-strong border border-border-primary bg-elevation-elevation-0 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n // fullsize일 때\n isFullSize\n ? 'inset-0 m-10'\n : // 일반 모달일 때\n cn(\n 'left-[50%] top-[50%] w-full max-h-[90vh] translate-x-[-50%] translate-y-[-50%] shadow-strong data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]',\n sizeWidthMap[size],\n ),\n className,\n )}\n {...props}\n onInteractOutside={handleInteractOutside}\n >\n {children}\n </DialogPrimitive.Content>\n </Modal.Portal>\n </ModalContext.Provider>\n );\n },\n) as ModalComponent['Content'];\n\nModal.Header = forwardRef<HTMLDivElement, ModalHeaderProps>(\n ({ className, line = false, showCloseIcon = true, children, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex shrink-0 flex-row items-center gap-2 pl-4 pr-3',\n line && 'border-b border-border-primary',\n size === 'fullsize' ? 'h-16' : 'h-14',\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-1 flex-row items-center gap-1\">{children}</div>\n {showCloseIcon && (\n <DialogPrimitive.Close\n className={cn(\n 'flex shrink-0 items-center justify-center size-8 rounded-medium text-icon-secondary transition-colors hover:bg-elevation-elevation-2 focus:outline-none disabled:pointer-events-none',\n )}\n >\n <XIcon type=\"regular\" size={20} />\n </DialogPrimitive.Close>\n )}\n </div>\n );\n },\n) as ModalComponent['Header'];\n\nModal.Body = forwardRef<HTMLDivElement, ModalBodyProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex-1 flex flex-col min-h-0 h-full',\n '[&_[data-slot=scroll-area-viewport]>div]:h-full',\n )}\n {...props}\n >\n <ScrollArea className=\"h-full flex flex-col\">\n <div className={cn(MODAL_PADDING.body, className)}>{children}</div>\n </ScrollArea>\n </div>\n ),\n) as ModalComponent['Body'];\n\nModal.Footer = forwardRef<HTMLDivElement, ModalFooterProps>(\n ({ className, line = true, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center justify-between',\n line && 'border-t border-border-primary',\n size === 'fullsize' ? 'gap-3' : 'h-14 gap-3',\n MODAL_PADDING.footer,\n className,\n )}\n {...props}\n />\n );\n },\n) as ModalComponent['Footer'];\n\nModal.FooterDescription = forwardRef<HTMLDivElement, ModalFooterDescriptionProps>(\n ({ className, error = false, icon, children, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n const isLargeFooter = size === 'fullsize';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center gap-1',\n isLargeFooter ? 'text-body-2' : 'text-body-3',\n error ? 'text-text-critical' : 'text-text-tertiary',\n className,\n )}\n {...props}\n >\n {icon && (\n <span className=\"flex shrink-0 size-4 items-center justify-center [&>svg]:size-4\">\n {icon}\n </span>\n )}\n {children}\n </div>\n );\n },\n) as ModalComponent['FooterDescription'];\n\nModal.Actions = forwardRef<HTMLDivElement, ModalActionsProps>(({ className, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'ml-auto flex flex-row items-center',\n size === 'fullsize' ? 'gap-3' : 'gap-2',\n className,\n )}\n {...props}\n />\n );\n}) as ModalComponent['Actions'];\n\nModal.Action = forwardRef<HTMLButtonElement, ModalActionProps>(\n ({ color = 'primary', size, ...props }, ref) => {\n const { size: modalSize } = useContext(ModalContext);\n\n return (\n <DialogPrimitive.Close asChild>\n <Button\n {...props}\n ref={ref}\n color={color}\n variant=\"contained\"\n size={size ?? (modalSize === 'fullsize' ? 'large' : 'medium')}\n />\n </DialogPrimitive.Close>\n );\n },\n) as ModalComponent['Action'];\n\nModal.Title = forwardRef<React.ComponentRef<typeof DialogPrimitive.Title>, ModalTitleProps>(\n ({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-title-2 font-semibold leading-none tracking-tight text-text-primary',\n className,\n )}\n {...props}\n />\n ),\n) as ModalComponent['Title'];\n\nModal.Description = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n ModalDescriptionProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-body-2 text-text-tertiary', className)}\n {...props}\n />\n)) as ModalComponent['Description'];\n\nModal.displayName = 'Modal';\nModal.Trigger.displayName = 'Modal.Trigger';\nModal.Portal.displayName = 'Modal.Portal';\nModal.Close.displayName = 'Modal.Close';\nModal.Overlay.displayName = 'Modal.Overlay';\nModal.Content.displayName = 'Modal.Content';\nModal.Header.displayName = 'Modal.Header';\nModal.Body.displayName = 'Modal.Body';\nModal.Footer.displayName = 'Modal.Footer';\nModal.FooterDescription.displayName = 'Modal.FooterDescription';\nModal.Actions.displayName = 'Modal.Actions';\nModal.Action.displayName = 'Modal.Action';\nModal.Title.displayName = 'Modal.Title';\nModal.Description.displayName = 'Modal.Description';\n\nexport { Modal };\nexport type {\n ModalComponent,\n ModalRootProps,\n ModalTriggerProps,\n ModalPortalProps,\n ModalOverlayProps,\n ModalContentProps,\n ModalCloseProps,\n ModalHeaderProps,\n ModalBodyProps,\n ModalFooterProps,\n ModalFooterDescriptionProps,\n ModalActionsProps,\n ModalActionProps,\n ModalTitleProps,\n ModalDescriptionProps,\n};\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@exem-ui/core/utils');
|
|
4
|
+
var TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
|
|
27
|
+
|
|
28
|
+
// src/tooltip/Tooltip.tsx
|
|
29
|
+
var tooltipContentVariants = utils.cva(
|
|
30
|
+
[
|
|
31
|
+
// Base layout
|
|
32
|
+
"z-50 flex flex-col items-start overflow-hidden",
|
|
33
|
+
"rounded-medium",
|
|
34
|
+
"text-text-static-light",
|
|
35
|
+
"bg-component-tooltip border border-border-primary",
|
|
36
|
+
"shadow-medium",
|
|
37
|
+
"animate-in fade-in-0 zoom-in-95",
|
|
38
|
+
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
39
|
+
"data-[side=bottom]:slide-in-from-top-2",
|
|
40
|
+
"data-[side=left]:slide-in-from-right-2",
|
|
41
|
+
"data-[side=right]:slide-in-from-left-2",
|
|
42
|
+
"data-[side=top]:slide-in-from-bottom-2"
|
|
43
|
+
],
|
|
44
|
+
{
|
|
45
|
+
variants: {
|
|
46
|
+
size: {
|
|
47
|
+
tiny: "px-2 py-1 text-body-3",
|
|
48
|
+
small: "w-[160px] gap-[8px] px-[12px] py-[10px]",
|
|
49
|
+
medium: "w-[240px] gap-[8px] px-[12px] py-[10px]",
|
|
50
|
+
large: "w-[320px] gap-[8px] px-[12px] py-[10px]",
|
|
51
|
+
xlarge: "w-[400px] gap-[8px] px-[12px] py-[10px]"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
defaultVariants: { size: "small" }
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
var tooltipTitleVariants = utils.cva([
|
|
58
|
+
"text-body-1 font-semibold text-text-static-light",
|
|
59
|
+
"group-data-[size=tiny]/tooltip-content:text-body-3"
|
|
60
|
+
]);
|
|
61
|
+
var tooltipTextVariants = utils.cva([
|
|
62
|
+
"text-body-2 font-regular text-text-static-light",
|
|
63
|
+
"group-data-[size=tiny]/tooltip-content:text-body-3"
|
|
64
|
+
]);
|
|
65
|
+
var Tooltip = TooltipPrimitive__namespace.Root;
|
|
66
|
+
Tooltip.Provider = TooltipPrimitive__namespace.Provider;
|
|
67
|
+
Tooltip.Trigger = TooltipPrimitive__namespace.Trigger;
|
|
68
|
+
Tooltip.Content = react.forwardRef(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
69
|
+
TooltipPrimitive__namespace.Content,
|
|
70
|
+
{
|
|
71
|
+
ref,
|
|
72
|
+
sideOffset,
|
|
73
|
+
"data-size": size,
|
|
74
|
+
className: utils.cn("group/tooltip-content", tooltipContentVariants({ size }), className),
|
|
75
|
+
...props,
|
|
76
|
+
children
|
|
77
|
+
}
|
|
78
|
+
) }));
|
|
79
|
+
Tooltip.Title = react.forwardRef(
|
|
80
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: utils.cn(tooltipTitleVariants(), className), ...props, children })
|
|
81
|
+
);
|
|
82
|
+
Tooltip.Description = react.forwardRef(
|
|
83
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: utils.cn(tooltipTextVariants(), className), ...props, children })
|
|
84
|
+
);
|
|
85
|
+
Tooltip.displayName = "Tooltip";
|
|
86
|
+
Tooltip.Content.displayName = "Tooltip.Content";
|
|
87
|
+
Tooltip.Title.displayName = "Tooltip.Title";
|
|
88
|
+
Tooltip.Description.displayName = "Tooltip.Description";
|
|
89
|
+
Tooltip.Trigger.displayName = "Tooltip.Trigger";
|
|
90
|
+
Tooltip.Provider.displayName = "Tooltip.Provider";
|
|
91
|
+
|
|
92
|
+
exports.Tooltip = Tooltip;
|
|
93
|
+
//# sourceMappingURL=chunk-T7U2QRLC.js.map
|
|
94
|
+
//# sourceMappingURL=chunk-T7U2QRLC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tooltip/Tooltip.tsx"],"names":["cva","TooltipPrimitive","forwardRef","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAM,sBAAA,GAAyBA,SAAA;AAAA,EAC7B;AAAA;AAAA,IAEE,gDAAA;AAAA,IACA,gBAAA;AAAA,IACA,wBAAA;AAAA,IACA,mDAAA;AAAA,IACA,eAAA;AAAA,IACA,iCAAA;AAAA,IACA,gGAAA;AAAA,IACA,wCAAA;AAAA,IACA,wCAAA;AAAA,IACA,wCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,uBAAA;AAAA,QACN,KAAA,EAAO,yCAAA;AAAA,QACP,MAAA,EAAQ,yCAAA;AAAA,QACR,KAAA,EAAO,yCAAA;AAAA,QACP,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,OAAA;AAAQ;AAErC,CAAA;AAEA,IAAM,uBAAuBA,SAAA,CAAI;AAAA,EAC/B,kDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,sBAAsBA,SAAA,CAAI;AAAA,EAC9B,iDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,OAAA,GAA2BC,2BAAA,CAAA;AAEjC,OAAA,CAAQ,QAAA,GAA4BA,2BAAA,CAAA,QAAA;AAEpC,OAAA,CAAQ,OAAA,GAA2BA,2BAAA,CAAA,OAAA;AAEnC,OAAA,CAAQ,UAAUC,gBAAA,CAGhB,CAAC,EAAE,SAAA,EAAW,UAAA,GAAa,GAAG,IAAA,EAAM,QAAA,EAAU,eAAA,EAAiB,GAAG,OAAM,EAAG,GAAA,oCACzDD,2BAAA,CAAA,MAAA,EAAjB,EAAwB,WAAW,eAAA,EAClC,QAAA,kBAAAE,cAAA;AAAA,EAAkBF,2BAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAWG,SAAG,uBAAA,EAAyB,sBAAA,CAAuB,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,IACjF,GAAG,KAAA;AAAA,IAEH;AAAA;AACH,CAAA,EACF,CACD,CAAA;AAED,OAAA,CAAQ,KAAA,GAAQF,gBAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,qBAClCC,cAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAWC,SAAG,oBAAA,EAAqB,EAAG,SAAS,CAAA,EAAI,GAAG,OAClE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAcF,gBAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,qBAClCC,cAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAWC,SAAG,mBAAA,EAAoB,EAAG,SAAS,CAAA,EAAI,GAAG,OACjE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AACtB,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,MAAM,WAAA,GAAc,eAAA;AAC5B,OAAA,CAAQ,YAAY,WAAA,GAAc,qBAAA;AAClC,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,SAAS,WAAA,GAAc,kBAAA","file":"chunk-T7U2QRLC.js","sourcesContent":["import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type React from 'react';\nimport { forwardRef } from 'react';\n\ntype TooltipRootProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>;\n\ntype TooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\n\ntype TooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\n\ntype TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n VariantProps<typeof tooltipContentVariants> & {\n portalContainer?: HTMLElement | null;\n };\n\ntype TooltipTitleProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype TooltipDescriptionProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype TooltipComponent = typeof TooltipPrimitive.Root & {\n Provider: typeof TooltipPrimitive.Provider;\n Trigger: typeof TooltipPrimitive.Trigger;\n Content: React.ForwardRefExoticComponent<\n TooltipContentProps & React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n >;\n Title: React.ForwardRefExoticComponent<TooltipTitleProps & React.RefAttributes<HTMLDivElement>>;\n Description: React.ForwardRefExoticComponent<\n TooltipDescriptionProps & React.RefAttributes<HTMLDivElement>\n >;\n};\n\nconst tooltipContentVariants = cva(\n [\n // Base layout\n 'z-50 flex flex-col items-start overflow-hidden',\n 'rounded-medium',\n 'text-text-static-light',\n 'bg-component-tooltip border border-border-primary',\n 'shadow-medium',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n variants: {\n size: {\n tiny: 'px-2 py-1 text-body-3',\n small: 'w-[160px] gap-[8px] px-[12px] py-[10px]',\n medium: 'w-[240px] gap-[8px] px-[12px] py-[10px]',\n large: 'w-[320px] gap-[8px] px-[12px] py-[10px]',\n xlarge: 'w-[400px] gap-[8px] px-[12px] py-[10px]',\n },\n },\n defaultVariants: { size: 'small' },\n },\n);\n\nconst tooltipTitleVariants = cva([\n 'text-body-1 font-semibold text-text-static-light',\n 'group-data-[size=tiny]/tooltip-content:text-body-3',\n]);\n\nconst tooltipTextVariants = cva([\n 'text-body-2 font-regular text-text-static-light',\n 'group-data-[size=tiny]/tooltip-content:text-body-3',\n]);\n\nconst Tooltip = TooltipPrimitive.Root as TooltipComponent;\n\nTooltip.Provider = TooltipPrimitive.Provider;\n\nTooltip.Trigger = TooltipPrimitive.Trigger;\n\nTooltip.Content = forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => (\n <TooltipPrimitive.Portal container={portalContainer}>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n data-size={size}\n className={cn('group/tooltip-content', tooltipContentVariants({ size }), className)}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n)) as TooltipComponent['Content'];\n\nTooltip.Title = forwardRef<HTMLDivElement, TooltipTitleProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(tooltipTitleVariants(), className)} {...props}>\n {children}\n </div>\n ),\n) as TooltipComponent['Title'];\n\nTooltip.Description = forwardRef<HTMLDivElement, TooltipDescriptionProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(tooltipTextVariants(), className)} {...props}>\n {children}\n </div>\n ),\n) as TooltipComponent['Description'];\n\nTooltip.displayName = 'Tooltip';\nTooltip.Content.displayName = 'Tooltip.Content';\nTooltip.Title.displayName = 'Tooltip.Title';\nTooltip.Description.displayName = 'Tooltip.Description';\nTooltip.Trigger.displayName = 'Tooltip.Trigger';\nTooltip.Provider.displayName = 'Tooltip.Provider';\n\nexport { Tooltip };\nexport type {\n TooltipComponent,\n TooltipContentProps,\n TooltipDescriptionProps,\n TooltipProviderProps,\n TooltipRootProps,\n TooltipTitleProps,\n TooltipTriggerProps,\n};\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { cn } from '@exem-ui/core/utils';
|
|
2
|
+
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/scrollArea/ScrollArea.tsx
|
|
6
|
+
function ScrollBar({
|
|
7
|
+
className,
|
|
8
|
+
orientation = "vertical",
|
|
9
|
+
...props
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
ScrollAreaPrimitive.ScrollAreaScrollbar,
|
|
13
|
+
{
|
|
14
|
+
"data-slot": "scroll-area-scrollbar",
|
|
15
|
+
orientation,
|
|
16
|
+
className: cn(
|
|
17
|
+
"flex touch-none select-none transition-opacity",
|
|
18
|
+
orientation === "vertical" && "w-[10px] p-[2px] opacity-0 duration-300 ease-out group-hover:opacity-100",
|
|
19
|
+
orientation === "horizontal" && "h-[10px] flex-col px-[3px] py-[2px]",
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
...props,
|
|
23
|
+
children: /* @__PURE__ */ jsx(
|
|
24
|
+
ScrollAreaPrimitive.ScrollAreaThumb,
|
|
25
|
+
{
|
|
26
|
+
"data-slot": "scroll-area-thumb",
|
|
27
|
+
className: "relative flex-1 rounded-full bg-component-scroll"
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
function ScrollArea({
|
|
34
|
+
className,
|
|
35
|
+
children,
|
|
36
|
+
onScroll,
|
|
37
|
+
scrollRef,
|
|
38
|
+
hideVerticalScrollbar = false,
|
|
39
|
+
hideHorizontalScrollbar = false,
|
|
40
|
+
disableHorizontalScroll = false,
|
|
41
|
+
...props
|
|
42
|
+
}) {
|
|
43
|
+
return /* @__PURE__ */ jsxs(
|
|
44
|
+
ScrollAreaPrimitive.Root,
|
|
45
|
+
{
|
|
46
|
+
"data-slot": "scroll-area",
|
|
47
|
+
className: cn("group relative overflow-hidden", className),
|
|
48
|
+
...props,
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ jsx(
|
|
51
|
+
ScrollAreaPrimitive.Viewport,
|
|
52
|
+
{
|
|
53
|
+
"data-slot": "scroll-area-viewport",
|
|
54
|
+
ref: scrollRef,
|
|
55
|
+
onScroll,
|
|
56
|
+
className: cn(
|
|
57
|
+
"size-full rounded-[inherit]",
|
|
58
|
+
disableHorizontalScroll && "!overflow-x-hidden"
|
|
59
|
+
),
|
|
60
|
+
children
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
!hideVerticalScrollbar && /* @__PURE__ */ jsx(ScrollBar, { orientation: "vertical", forceMount: true }),
|
|
64
|
+
!(hideHorizontalScrollbar || disableHorizontalScroll) && /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal", forceMount: true }),
|
|
65
|
+
/* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { ScrollArea, ScrollBar };
|
|
72
|
+
//# sourceMappingURL=chunk-TEHHJ3CS.mjs.map
|
|
73
|
+
//# sourceMappingURL=chunk-TEHHJ3CS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scrollArea/ScrollArea.tsx"],"names":[],"mappings":";;;;;AAeA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAyE;AACvE,EAAA,uBACE,GAAA;AAAA,IAAqB,mBAAA,CAAA,mBAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,gDAAA;AAAA,QACA,gBAAgB,UAAA,IACd,0EAAA;AAAA,QACF,gBAAgB,YAAA,IAAgB,qCAAA;AAAA,QAChC;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA;AAAA,QAAqB,mBAAA,CAAA,eAAA;AAAA,QAApB;AAAA,UACC,WAAA,EAAU,mBAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ;AAeA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAA,GAAwB,KAAA;AAAA,EACxB,uBAAA,GAA0B,KAAA;AAAA,EAC1B,uBAAA,GAA0B,KAAA;AAAA,EAC1B,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACE,IAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA;AAAA,MACxD,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAqB,mBAAA,CAAA,QAAA;AAAA,UAApB;AAAA,YACC,WAAA,EAAU,sBAAA;AAAA,YACV,GAAA,EAAK,SAAA;AAAA,YACL,QAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,6BAAA;AAAA,cACA,uBAAA,IAA2B;AAAA,aAC7B;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,QACC,CAAC,qBAAA,oBAAyB,GAAA,CAAC,aAAU,WAAA,EAAY,UAAA,EAAW,YAAU,IAAA,EAAC,CAAA;AAAA,QACvE,EAAE,2BAA2B,uBAAA,CAAA,oBAC5B,GAAA,CAAC,aAAU,WAAA,EAAY,YAAA,EAAa,YAAU,IAAA,EAAC,CAAA;AAAA,wBAEjD,GAAA,CAAqB,4BAApB,EAA2B;AAAA;AAAA;AAAA,GAC9B;AAEJ","file":"chunk-TEHHJ3CS.mjs","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport type React from 'react';\n\ninterface ScrollAreaProps extends React.ComponentProps<typeof ScrollAreaPrimitive.Root> {\n /** 스크롤 뷰포트의 ref. 스크롤 위치 제어 시 사용합니다. */\n scrollRef?: React.ComponentProps<typeof ScrollAreaPrimitive.Viewport>['ref'];\n /** 세로 스크롤바 숨김 여부 */\n hideVerticalScrollbar?: boolean;\n /** 가로 스크롤바 숨김 여부 */\n hideHorizontalScrollbar?: boolean;\n /** 가로 스크롤 비활성화 (overflow-x: hidden) */\n disableHorizontalScroll?: boolean;\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-opacity',\n orientation === 'vertical' &&\n 'w-[10px] p-[2px] opacity-0 duration-300 ease-out group-hover:opacity-100',\n orientation === 'horizontal' && 'h-[10px] flex-col px-[3px] py-[2px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-component-scroll\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\n/**\n * 커스텀 스크롤바를 제공하는 스크롤 영역 컴포넌트입니다.\n * 마우스 호버 시 스크롤바가 나타나는 UX를 제공합니다.\n *\n * @example\n * ```tsx\n * <ScrollArea className=\"h-[300px]\">\n * <div>스크롤 가능한 콘텐츠</div>\n * </ScrollArea>\n * ```\n *\n * @see {@link ScrollAreaProps} props 상세\n */\nfunction ScrollArea({\n className,\n children,\n onScroll,\n scrollRef,\n hideVerticalScrollbar = false,\n hideHorizontalScrollbar = false,\n disableHorizontalScroll = false,\n ...props\n}: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('group relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n ref={scrollRef}\n onScroll={onScroll}\n className={cn(\n 'size-full rounded-[inherit]',\n disableHorizontalScroll && '!overflow-x-hidden',\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {!hideVerticalScrollbar && <ScrollBar orientation=\"vertical\" forceMount />}\n {!(hideHorizontalScrollbar || disableHorizontalScroll) && (\n <ScrollBar orientation=\"horizontal\" forceMount />\n )}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport { ScrollArea, ScrollBar };\nexport type { ScrollAreaProps };\n"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@exem-ui/core/utils');
|
|
4
|
+
var TabsPrimitive = require('@radix-ui/react-tabs');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
|
|
27
|
+
|
|
28
|
+
// src/tabs/Tabs.tsx
|
|
29
|
+
var TabsContext = react.createContext({ type: "primary" });
|
|
30
|
+
var useTabsContext = () => {
|
|
31
|
+
const context = react.useContext(TabsContext);
|
|
32
|
+
if (!context) {
|
|
33
|
+
throw new Error("useTabsContext must be used within a TabsProvider");
|
|
34
|
+
}
|
|
35
|
+
return context;
|
|
36
|
+
};
|
|
37
|
+
var tabsListVariants = utils.cva("inline-flex items-center", {
|
|
38
|
+
variants: {
|
|
39
|
+
type: {
|
|
40
|
+
primary: "h-9 gap-5 border-b border-border-primary",
|
|
41
|
+
secondary: "h-8 gap-1"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
defaultVariants: {
|
|
45
|
+
type: "primary"
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
var tabsTriggerVariants = utils.cva(
|
|
49
|
+
"group inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-pretendard font-semibold text-body-2 leading-[140%] transition-all disabled:pointer-events-none disabled:opacity-50",
|
|
50
|
+
{
|
|
51
|
+
variants: {
|
|
52
|
+
type: {
|
|
53
|
+
primary: [
|
|
54
|
+
"h-9 border-b-2 border-transparent p-0 text-text-tertiary",
|
|
55
|
+
"hover:text-text-primary",
|
|
56
|
+
"data-[state=active]:border-border-focused data-[state=active]:text-text-primary"
|
|
57
|
+
],
|
|
58
|
+
secondary: [
|
|
59
|
+
"h-8 rounded-strong px-2 text-text-tertiary",
|
|
60
|
+
"hover:text-text-primary",
|
|
61
|
+
"data-[state=active]:rounded-medium data-[state=active]:bg-elevation-elevation-2 data-[state=active]:text-text-primary"
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
defaultVariants: {
|
|
66
|
+
type: "primary"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
var Tabs = react.forwardRef(
|
|
71
|
+
({ type = "primary", children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { type }, children: /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Root, { ref, ...props, children }) })
|
|
72
|
+
);
|
|
73
|
+
Tabs.List = react.forwardRef(
|
|
74
|
+
({ className, ...props }, ref) => {
|
|
75
|
+
const { type } = useTabsContext();
|
|
76
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
77
|
+
TabsPrimitive__namespace.List,
|
|
78
|
+
{
|
|
79
|
+
ref,
|
|
80
|
+
className: utils.cn(tabsListVariants({ type }), className),
|
|
81
|
+
...props
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
Tabs.Trigger = react.forwardRef(
|
|
87
|
+
({ className, leftIcon, rightIcon, badge, children, ...props }, ref) => {
|
|
88
|
+
const { type } = useTabsContext();
|
|
89
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
90
|
+
TabsPrimitive__namespace.Trigger,
|
|
91
|
+
{
|
|
92
|
+
ref,
|
|
93
|
+
className: utils.cn(tabsTriggerVariants({ type }), className),
|
|
94
|
+
...props,
|
|
95
|
+
children: [
|
|
96
|
+
leftIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-4", children: leftIcon }),
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
|
|
98
|
+
children,
|
|
99
|
+
badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-text-tertiary group-data-[state=active]:text-text-accent", children: badge })
|
|
100
|
+
] }),
|
|
101
|
+
rightIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-4", children: rightIcon })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
Tabs.Content = react.forwardRef(
|
|
108
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Content, { ref, className: utils.cn(className), ...props })
|
|
109
|
+
);
|
|
110
|
+
Tabs.displayName = "Tabs";
|
|
111
|
+
Tabs.List.displayName = "Tabs.List";
|
|
112
|
+
Tabs.Trigger.displayName = "Tabs.Trigger";
|
|
113
|
+
Tabs.Content.displayName = "Tabs.Content";
|
|
114
|
+
|
|
115
|
+
exports.Tabs = Tabs;
|
|
116
|
+
//# sourceMappingURL=chunk-TJY4MIBC.js.map
|
|
117
|
+
//# sourceMappingURL=chunk-TJY4MIBC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tabs/Tabs.tsx"],"names":["createContext","useContext","cva","forwardRef","jsx","TabsPrimitive","cn","jsxs"],"mappings":"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","file":"chunk-TJY4MIBC.js","sourcesContent":["import { cn, cva } from '@exem-ui/core/utils';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport type React from 'react';\nimport { createContext, forwardRef, useContext } from 'react';\n\ntype TabsType = 'primary' | 'secondary';\n\ntype TabsContextType = {\n type: TabsType;\n};\n\ntype TabsRootProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root> & {\n /**\n * 탭 스타일 유형\n * @default 'primary'\n */\n type?: TabsType;\n};\n\ntype TabsListProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>;\n\ntype TabsTriggerProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n /** 텍스트 왼쪽에 표시할 아이콘 요소 */\n leftIcon?: React.ReactElement<{ className?: string }>;\n /** 텍스트 오른쪽에 표시할 아이콘 요소 */\n rightIcon?: React.ReactElement<{ className?: string }>;\n /** 탭 라벨 옆에 표시할 배지 텍스트 */\n badge?: string | number;\n};\n\ntype TabsContentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\ntype TabsComponent = React.ForwardRefExoticComponent<\n TabsRootProps & React.RefAttributes<React.ElementRef<typeof TabsPrimitive.Root>>\n> & {\n List: React.ForwardRefExoticComponent<TabsListProps>;\n Trigger: React.ForwardRefExoticComponent<TabsTriggerProps>;\n Content: React.ForwardRefExoticComponent<TabsContentProps>;\n};\n\nconst TabsContext = createContext<TabsContextType>({ type: 'primary' });\n\nconst useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error('useTabsContext must be used within a TabsProvider');\n }\n return context;\n};\n\n// TabsList variants\nconst tabsListVariants = cva('inline-flex items-center', {\n variants: {\n type: {\n primary: 'h-9 gap-5 border-b border-border-primary',\n secondary: 'h-8 gap-1',\n },\n },\n defaultVariants: {\n type: 'primary',\n },\n});\n\n// TabsTrigger variants\nconst tabsTriggerVariants = cva(\n 'group inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-pretendard font-semibold text-body-2 leading-[140%] transition-all disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n type: {\n primary: [\n 'h-9 border-b-2 border-transparent p-0 text-text-tertiary',\n 'hover:text-text-primary',\n 'data-[state=active]:border-border-focused data-[state=active]:text-text-primary',\n ],\n secondary: [\n 'h-8 rounded-strong px-2 text-text-tertiary',\n 'hover:text-text-primary',\n 'data-[state=active]:rounded-medium data-[state=active]:bg-elevation-elevation-2 data-[state=active]:text-text-primary',\n ],\n },\n },\n defaultVariants: {\n type: 'primary',\n },\n },\n);\n\n/**\n * 탭 형태의 콘텐츠 전환 컴포넌트입니다.\n * Compound Component 패턴으로 `Tabs.List`, `Tabs.Trigger`, `Tabs.Content`와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\" type=\"primary\">\n * <Tabs.List>\n * <Tabs.Trigger value=\"tab1\">첫 번째</Tabs.Trigger>\n * <Tabs.Trigger value=\"tab2\">두 번째</Tabs.Trigger>\n * </Tabs.List>\n * <Tabs.Content value=\"tab1\">첫 번째 내용</Tabs.Content>\n * <Tabs.Content value=\"tab2\">두 번째 내용</Tabs.Content>\n * </Tabs>\n * ```\n *\n * @see {@link TabsRootProps} 루트 props 상세\n * @see {@link TabsTriggerProps} 트리거 props 상세\n */\nconst Tabs = forwardRef<React.ElementRef<typeof TabsPrimitive.Root>, TabsRootProps>(\n ({ type = 'primary', children, ...props }, ref) => (\n <TabsContext.Provider value={{ type }}>\n <TabsPrimitive.Root ref={ref} {...props}>\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n ),\n) as TabsComponent;\n\nTabs.List = forwardRef<React.ElementRef<typeof TabsPrimitive.List>, TabsListProps>(\n ({ className, ...props }, ref) => {\n const { type } = useTabsContext();\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(tabsListVariants({ type }), className)}\n {...props}\n />\n );\n },\n) as TabsComponent['List'];\n\nTabs.Trigger = forwardRef<React.ElementRef<typeof TabsPrimitive.Trigger>, TabsTriggerProps>(\n ({ className, leftIcon, rightIcon, badge, children, ...props }, ref) => {\n const { type } = useTabsContext();\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(tabsTriggerVariants({ type }), className)}\n {...props}\n >\n {leftIcon && <span className=\"size-4\">{leftIcon}</span>}\n <span className=\"flex items-center gap-1\">\n {children}\n {badge && (\n <span className=\"text-text-tertiary group-data-[state=active]:text-text-accent\">\n {badge}\n </span>\n )}\n </span>\n {rightIcon && <span className=\"size-4\">{rightIcon}</span>}\n </TabsPrimitive.Trigger>\n );\n },\n) as TabsComponent['Trigger'];\n\nTabs.Content = forwardRef<React.ElementRef<typeof TabsPrimitive.Content>, TabsContentProps>(\n ({ className, ...props }, ref) => (\n <TabsPrimitive.Content ref={ref} className={cn(className)} {...props} />\n ),\n) as TabsComponent['Content'];\n\nTabs.displayName = 'Tabs';\nTabs.List.displayName = 'Tabs.List';\nTabs.Trigger.displayName = 'Tabs.Trigger';\nTabs.Content.displayName = 'Tabs.Content';\n\nexport { Tabs };\nexport type { TabsComponent, TabsRootProps, TabsListProps, TabsTriggerProps, TabsContentProps };\n"]}
|