@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,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@exem-ui/core/utils');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
// src/progress/Progress.tsx
|
|
8
|
+
var trackVariants = utils.cva("w-full overflow-hidden rounded-full bg-elevation-elevation-3", {
|
|
9
|
+
variants: {
|
|
10
|
+
size: {
|
|
11
|
+
small: "h-1",
|
|
12
|
+
medium: "h-1.5",
|
|
13
|
+
large: "h-2"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
defaultVariants: {
|
|
17
|
+
size: "large"
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
var gaugeVariants = utils.cva("h-full rounded-full bg-icon-accent transition-[width] duration-300", {
|
|
21
|
+
variants: {
|
|
22
|
+
size: {
|
|
23
|
+
small: "",
|
|
24
|
+
medium: "",
|
|
25
|
+
large: ""
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: {
|
|
29
|
+
size: "medium"
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
var Progress = react.forwardRef(
|
|
33
|
+
({ value = 0, max = 100, size = "medium", trackClassName, gaugeClassName, className, ...props }, ref) => {
|
|
34
|
+
const clampedValue = Math.min(Math.max(value, 0), max);
|
|
35
|
+
const percent = max > 0 ? clampedValue / max * 100 : 0;
|
|
36
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
ref,
|
|
40
|
+
role: "progressbar",
|
|
41
|
+
"aria-valuenow": clampedValue,
|
|
42
|
+
"aria-valuemin": 0,
|
|
43
|
+
"aria-valuemax": max,
|
|
44
|
+
className: utils.cn(trackVariants({ size }), trackClassName, className),
|
|
45
|
+
...props,
|
|
46
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: utils.cn(gaugeVariants({ size }), gaugeClassName),
|
|
50
|
+
style: { width: `${percent}%` }
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
Progress.displayName = "Progress";
|
|
58
|
+
|
|
59
|
+
exports.Progress = Progress;
|
|
60
|
+
//# sourceMappingURL=chunk-5QX4TO4F.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-5QX4TO4F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/progress/Progress.tsx"],"names":["cva","forwardRef","jsx","cn"],"mappings":";;;;;;;AAIA,IAAM,aAAA,GAAgBA,UAAI,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,GAAgBA,UAAI,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,GAAWC,gBAAA;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,uBACEC,cAAA;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,EAAWC,SAAG,aAAA,CAAc,EAAE,MAAM,CAAA,EAAG,gBAAgB,SAAS,CAAA;AAAA,QAC/D,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAAD,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAWC,QAAA,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-5QX4TO4F.js","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"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkREBHUF4L_js = require('./chunk-REBHUF4L.js');
|
|
4
|
+
var chunk3FPMWAQT_js = require('./chunk-3FPMWAQT.js');
|
|
5
|
+
var utils = require('@exem-ui/core/utils');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
var iconButtonSizeClasses = {
|
|
10
|
+
xsmall: "size-6",
|
|
11
|
+
small: "size-7",
|
|
12
|
+
medium: "size-8",
|
|
13
|
+
large: "size-10",
|
|
14
|
+
xlarge: "size-12"
|
|
15
|
+
};
|
|
16
|
+
var IconButton = react.forwardRef(
|
|
17
|
+
({
|
|
18
|
+
className,
|
|
19
|
+
tooltip,
|
|
20
|
+
variant = "contained",
|
|
21
|
+
icon,
|
|
22
|
+
size = "medium",
|
|
23
|
+
color = "primary",
|
|
24
|
+
...props
|
|
25
|
+
}, ref) => {
|
|
26
|
+
const buttonProps = {
|
|
27
|
+
className: utils.cn(iconButtonSizeClasses[size], "px-0", className),
|
|
28
|
+
color,
|
|
29
|
+
icon,
|
|
30
|
+
size,
|
|
31
|
+
variant,
|
|
32
|
+
...props
|
|
33
|
+
};
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunk3FPMWAQT_js.ConditionalTooltip, { tooltip, children: /* @__PURE__ */ jsxRuntime.jsx(chunkREBHUF4L_js.Button, { ref, ...buttonProps }) });
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
IconButton.displayName = "IconButton";
|
|
38
|
+
var ButtonGroup = react.forwardRef(
|
|
39
|
+
({
|
|
40
|
+
variant = "contained",
|
|
41
|
+
iconOnly = false,
|
|
42
|
+
hasBackground = false,
|
|
43
|
+
size = "medium",
|
|
44
|
+
items,
|
|
45
|
+
className
|
|
46
|
+
}, ref) => {
|
|
47
|
+
if (items.length === 0) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const isOutlined = variant === "outlined";
|
|
51
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
ref,
|
|
55
|
+
className: utils.cn(
|
|
56
|
+
"inline-flex items-center overflow-hidden rounded-medium",
|
|
57
|
+
hasBackground && "bg-elevation-elevation-0",
|
|
58
|
+
className
|
|
59
|
+
),
|
|
60
|
+
role: "group",
|
|
61
|
+
children: items.map((item, index) => {
|
|
62
|
+
const isFirst = index === 0;
|
|
63
|
+
const isLast = index === items.length - 1;
|
|
64
|
+
const roundedClasses = utils.cn("rounded-none", {
|
|
65
|
+
"rounded-l-medium": isFirst,
|
|
66
|
+
"rounded-r-medium": isLast
|
|
67
|
+
});
|
|
68
|
+
const dividerClasses = !isOutlined && !isLast ? "border-r border-border-primary" : "";
|
|
69
|
+
const mergeClasses = isOutlined && !isFirst ? "-ml-px" : "";
|
|
70
|
+
const hoverClasses = isOutlined ? "relative hover:z-10" : "";
|
|
71
|
+
if (iconOnly) {
|
|
72
|
+
const iconBaseProps = {
|
|
73
|
+
className: utils.cn(roundedClasses, dividerClasses, mergeClasses, hoverClasses),
|
|
74
|
+
icon: item.icon,
|
|
75
|
+
onClick: item.onClick,
|
|
76
|
+
size
|
|
77
|
+
};
|
|
78
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunk3FPMWAQT_js.ConditionalTooltip, { tooltip: item.tooltip, children: variant === "contained" ? /* @__PURE__ */ jsxRuntime.jsx(IconButton, { ...iconBaseProps, color: "assistive", variant: "contained" }) : /* @__PURE__ */ jsxRuntime.jsx(IconButton, { ...iconBaseProps, color: "primary", variant: "outlined" }) }, item.id);
|
|
79
|
+
}
|
|
80
|
+
const buttonBaseProps = {
|
|
81
|
+
className: utils.cn(roundedClasses, dividerClasses, mergeClasses, hoverClasses),
|
|
82
|
+
icon: item.icon,
|
|
83
|
+
onClick: item.onClick,
|
|
84
|
+
size
|
|
85
|
+
};
|
|
86
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunk3FPMWAQT_js.ConditionalTooltip, { tooltip: item.tooltip, children: variant === "contained" ? /* @__PURE__ */ jsxRuntime.jsx(chunkREBHUF4L_js.Button, { ...buttonBaseProps, color: "assistive", variant: "contained", children: item.label }) : /* @__PURE__ */ jsxRuntime.jsx(chunkREBHUF4L_js.Button, { ...buttonBaseProps, color: "primary", variant: "outlined", children: item.label }) }, item.id);
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
ButtonGroup.displayName = "ButtonGroup";
|
|
93
|
+
|
|
94
|
+
exports.ButtonGroup = ButtonGroup;
|
|
95
|
+
exports.IconButton = IconButton;
|
|
96
|
+
//# sourceMappingURL=chunk-5TEFN2CW.js.map
|
|
97
|
+
//# sourceMappingURL=chunk-5TEFN2CW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/button/IconButton.tsx","../src/button/ButtonGroup.tsx"],"names":["forwardRef","cn","jsx","ConditionalTooltip","Button"],"mappings":";;;;;;;;AA6BA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,UAAA,GAAaA,gBAAA;AAAA,EACjB,CACE;AAAA,IACE,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,GAAU,WAAA;AAAA,IACV,IAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,KAAA,GAAQ,SAAA;AAAA,IACR,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,WAAWC,QAAA,CAAG,qBAAA,CAAsB,IAAI,CAAA,EAAG,QAAQ,SAAS,CAAA;AAAA,MAC5D,KAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACL;AAEA,IAAA,uBACEC,cAAA,CAACC,uCAAmB,OAAA,EAClB,QAAA,kBAAAD,cAAA,CAACE,2BAAO,GAAA,EAAW,GAAI,aAAqD,CAAA,EAC9E,CAAA;AAAA,EAEJ;AACF;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;AC7BzB,IAAM,WAAA,GAAcJ,gBAAAA;AAAA,EAClB,CACE;AAAA,IACE,OAAA,GAAU,WAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,aAAA,GAAgB,KAAA;AAAA,IAChB,IAAA,GAAO,QAAA;AAAA,IACP,KAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAa,OAAA,KAAY,UAAA;AAE/B,IAAA,uBACEE,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWD,QAAAA;AAAA,UACT,yDAAA;AAAA,UACA,aAAA,IAAiB,0BAAA;AAAA,UACjB;AAAA,SACF;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QAEJ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,UAAA,MAAM,UAAU,KAAA,KAAU,CAAA;AAC1B,UAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAA;AAExC,UAAA,MAAM,cAAA,GAAiBA,SAAG,cAAA,EAAgB;AAAA,YACxC,kBAAA,EAAoB,OAAA;AAAA,YACpB,kBAAA,EAAoB;AAAA,WACrB,CAAA;AAGD,UAAA,MAAM,cAAA,GAAiB,CAAC,UAAA,IAAc,CAAC,SAAS,gCAAA,GAAmC,EAAA;AACnF,UAAA,MAAM,YAAA,GAAe,UAAA,IAAc,CAAC,OAAA,GAAU,QAAA,GAAW,EAAA;AACzD,UAAA,MAAM,YAAA,GAAe,aAAa,qBAAA,GAAwB,EAAA;AAE1D,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAM,aAAA,GAAgB;AAAA,cACpB,SAAA,EAAWA,QAAAA,CAAG,cAAA,EAAgB,cAAA,EAAgB,cAAc,YAAY,CAAA;AAAA,cACxE,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,SAAS,IAAA,CAAK,OAAA;AAAA,cACd;AAAA,aACF;AAEA,YAAA,uBACEC,cAAAA,CAACC,mCAAA,EAAA,EAAiC,OAAA,EAAS,IAAA,CAAK,OAAA,EAC7C,QAAA,EAAA,OAAA,KAAY,WAAA,mBACXD,cAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,aAAA,EAAe,KAAA,EAAM,WAAA,EAAY,OAAA,EAAQ,WAAA,EAAY,CAAA,mBAErEA,cAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,aAAA,EAAe,KAAA,EAAM,SAAA,EAAU,OAAA,EAAQ,UAAA,EAAW,CAAA,EAAA,EAJ7C,KAAK,EAM9B,CAAA;AAAA,UAEJ;AAEA,UAAA,MAAM,eAAA,GAAkB;AAAA,YACtB,SAAA,EAAWD,QAAAA,CAAG,cAAA,EAAgB,cAAA,EAAgB,cAAc,YAAY,CAAA;AAAA,YACxE,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,SAAS,IAAA,CAAK,OAAA;AAAA,YACd;AAAA,WACF;AAEA,UAAA,uBACEC,cAAAA,CAACC,mCAAA,EAAA,EAAiC,OAAA,EAAS,KAAK,OAAA,EAC7C,QAAA,EAAA,OAAA,KAAY,WAAA,mBACXD,cAAAA,CAACE,uBAAA,EAAA,EAAQ,GAAG,eAAA,EAAiB,OAAM,WAAA,EAAY,OAAA,EAAQ,WAAA,EACpD,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA,mBAEAF,cAAAA,CAACE,2BAAQ,GAAG,eAAA,EAAiB,KAAA,EAAM,SAAA,EAAU,SAAQ,UAAA,EAClD,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA,EAAA,EARqB,KAAK,EAU9B,CAAA;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-5TEFN2CW.js","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport type { ComponentProps } from 'react';\nimport { forwardRef } from 'react';\nimport { ConditionalTooltip } from '../flat';\nimport { Button } from './Button';\n\ntype IconButtonVariant = 'contained' | 'outlined' | 'invisible';\n\ntype IconButtonColorVariantCombination =\n | { color?: 'primary'; variant?: 'contained' | 'outlined' | 'invisible' }\n | { color?: 'accent'; variant?: 'contained' | 'outlined' | 'invisible' }\n | { color?: 'critical'; variant?: 'contained' | 'outlined' | 'invisible' }\n | { color?: 'assistive'; variant?: 'contained' }\n | { color?: 'inverse'; variant?: 'contained' };\n\ntype IconButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> &\n IconButtonColorVariantCombination & {\n icon: React.ReactElement<{ className?: string }>;\n variant?: IconButtonVariant;\n size?: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\n /** 툴팁 설정 (문자열 또는 FlatTooltip 설정 객체) */\n tooltip?: ComponentProps<typeof ConditionalTooltip>['tooltip'];\n };\n\ntype IconButtonComponent = React.ForwardRefExoticComponent<\n IconButtonProps & React.RefAttributes<HTMLButtonElement>\n>;\n\nconst iconButtonSizeClasses = {\n xsmall: 'size-6',\n small: 'size-7',\n medium: 'size-8',\n large: 'size-10',\n xlarge: 'size-12',\n};\n\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n className,\n tooltip,\n variant = 'contained',\n icon,\n size = 'medium',\n color = 'primary',\n ...props\n },\n ref,\n ) => {\n const buttonProps = {\n className: cn(iconButtonSizeClasses[size], 'px-0', className),\n color,\n icon,\n size,\n variant,\n ...props,\n };\n\n return (\n <ConditionalTooltip tooltip={tooltip}>\n <Button ref={ref} {...(buttonProps as React.ComponentProps<typeof Button>)} />\n </ConditionalTooltip>\n );\n },\n) as IconButtonComponent;\n\nIconButton.displayName = 'IconButton';\n\nexport { IconButton };\nexport type { IconButtonComponent, IconButtonProps };\n","import { cn } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport type { ComponentProps } from 'react';\nimport { forwardRef } from 'react';\nimport { ConditionalTooltip } from '../flat';\nimport { Button } from './Button';\nimport { IconButton } from './IconButton';\n\ntype ButtonGroupSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\n\ninterface ButtonGroupItem {\n id: string;\n label?: string;\n icon?: React.ReactElement<{ className?: string }>;\n /** 툴팁 설정 (문자열 또는 FlatTooltip 설정 객체) */\n tooltip?: ComponentProps<typeof ConditionalTooltip>['tooltip'];\n onClick?: () => void;\n}\n\ninterface ButtonGroupProps {\n /** 버튼 그룹 스타일 변형 */\n variant?: 'contained' | 'outlined';\n /** 아이콘만 표시 */\n iconOnly?: boolean;\n /** 배경색 표시 여부 (뒷 레이어가 보이지 않아야 할 때) */\n hasBackground?: boolean;\n /** 버튼 크기 */\n size?: ButtonGroupSize;\n /** 버튼 항목 목록 */\n items: ButtonGroupItem[];\n /** 커스텀 className */\n className?: string;\n}\n\ntype ButtonGroupComponent = React.ForwardRefExoticComponent<\n ButtonGroupProps & React.RefAttributes<HTMLDivElement>\n>;\n\nconst ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n (\n {\n variant = 'contained',\n iconOnly = false,\n hasBackground = false,\n size = 'medium',\n items,\n className,\n },\n ref,\n ) => {\n if (items.length === 0) {\n return null;\n }\n\n const isOutlined = variant === 'outlined';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'inline-flex items-center overflow-hidden rounded-medium',\n hasBackground && 'bg-elevation-elevation-0',\n className,\n )}\n role=\"group\"\n >\n {items.map((item, index) => {\n const isFirst = index === 0;\n const isLast = index === items.length - 1;\n\n const roundedClasses = cn('rounded-none', {\n 'rounded-l-medium': isFirst,\n 'rounded-r-medium': isLast,\n });\n\n // contained: 버튼 사이 divider, outlined: -ml-px로 border 병합\n const dividerClasses = !isOutlined && !isLast ? 'border-r border-border-primary' : '';\n const mergeClasses = isOutlined && !isFirst ? '-ml-px' : '';\n const hoverClasses = isOutlined ? 'relative hover:z-10' : '';\n\n if (iconOnly) {\n const iconBaseProps = {\n className: cn(roundedClasses, dividerClasses, mergeClasses, hoverClasses),\n icon: item.icon!,\n onClick: item.onClick,\n size,\n };\n\n return (\n <ConditionalTooltip key={item.id} tooltip={item.tooltip}>\n {variant === 'contained' ? (\n <IconButton {...iconBaseProps} color=\"assistive\" variant=\"contained\" />\n ) : (\n <IconButton {...iconBaseProps} color=\"primary\" variant=\"outlined\" />\n )}\n </ConditionalTooltip>\n );\n }\n\n const buttonBaseProps = {\n className: cn(roundedClasses, dividerClasses, mergeClasses, hoverClasses),\n icon: item.icon as React.ReactElement<{ className?: string }>,\n onClick: item.onClick,\n size,\n };\n\n return (\n <ConditionalTooltip key={item.id} tooltip={item.tooltip}>\n {variant === 'contained' ? (\n <Button {...buttonBaseProps} color=\"assistive\" variant=\"contained\">\n {item.label}\n </Button>\n ) : (\n <Button {...buttonBaseProps} color=\"primary\" variant=\"outlined\">\n {item.label}\n </Button>\n )}\n </ConditionalTooltip>\n );\n })}\n </div>\n );\n },\n) as ButtonGroupComponent;\n\nButtonGroup.displayName = 'ButtonGroup';\n\nexport { ButtonGroup };\nexport type { ButtonGroupComponent, ButtonGroupItem, ButtonGroupProps };\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@exem-ui/core/utils');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
// src/badge/Badge.tsx
|
|
8
|
+
var badgeVariants = utils.cva(
|
|
9
|
+
"inline-flex items-center rounded-strong border px-[4px] text-body-3 font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
accent: "border-transparent bg-solid-accent-default text-text-static-light",
|
|
14
|
+
"accent-disabled": "border-transparent bg-solid-accent-disabled text-text-inverse-disabled",
|
|
15
|
+
default: "border-transparent bg-elevation-elevation-3 text-text-secondary",
|
|
16
|
+
"default-disabled": "border-transparent bg-elevation-elevation-2 text-text-disabled"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
variant: "default"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
var Badge = react.forwardRef(
|
|
25
|
+
({ className, variant = "default", disabled = false, ...props }, ref) => {
|
|
26
|
+
const finalVariant = disabled ? `${variant}-disabled` : variant;
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
ref,
|
|
31
|
+
className: utils.cn(badgeVariants({ variant: finalVariant }), className),
|
|
32
|
+
...props
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
Badge.displayName = "Badge";
|
|
38
|
+
|
|
39
|
+
exports.Badge = Badge;
|
|
40
|
+
//# sourceMappingURL=chunk-5TES5PG6.js.map
|
|
41
|
+
//# sourceMappingURL=chunk-5TES5PG6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/badge/Badge.tsx"],"names":["cva","forwardRef","jsx","cn"],"mappings":";;;;;;;AAqBA,IAAM,aAAA,GAAgBA,SAAA;AAAA,EACpB,uKAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,mEAAA;AAAA,QACR,iBAAA,EAAmB,wEAAA;AAAA,QACnB,OAAA,EAAS,iEAAA;AAAA,QACT,kBAAA,EAAoB;AAAA;AACtB,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AAaA,IAAM,KAAA,GAAQC,gBAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,WAAW,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACvE,IAAA,MAAM,YAAA,GAAe,QAAA,GAAY,CAAA,EAAG,OAAO,CAAA,SAAA,CAAA,GAAwB,OAAA;AAEnE,IAAA,uBACEC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWC,SAAG,aAAA,CAAc,EAAE,SAAS,YAAA,EAAc,GAAG,SAAS,CAAA;AAAA,QAChE,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-5TES5PG6.js","sourcesContent":["import { cn, cva } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport { forwardRef } from 'react';\n\ninterface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * 배지 스타일 변형\n * @default 'default'\n */\n variant?: 'default' | 'accent';\n /**\n * 비활성화 상태\n * @default false\n */\n disabled?: boolean;\n}\n\ntype BadgeComponent = React.ForwardRefExoticComponent<\n BadgeProps & React.RefAttributes<HTMLDivElement>\n>;\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-strong border px-[4px] text-body-3 font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n accent: 'border-transparent bg-solid-accent-default text-text-static-light',\n 'accent-disabled': 'border-transparent bg-solid-accent-disabled text-text-inverse-disabled',\n default: 'border-transparent bg-elevation-elevation-3 text-text-secondary',\n 'default-disabled': 'border-transparent bg-elevation-elevation-2 text-text-disabled',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\n/**\n * 상태나 카운트를 표시하는 배지 컴포넌트입니다.\n *\n * @example\n * ```tsx\n * <Badge variant=\"accent\">3</Badge>\n * <Badge variant=\"default\" disabled>0</Badge>\n * ```\n *\n * @see {@link BadgeProps} props 상세\n */\nconst Badge = forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = 'default', disabled = false, ...props }, ref) => {\n const finalVariant = disabled ? (`${variant}-disabled` as const) : variant;\n\n return (\n <div\n ref={ref}\n className={cn(badgeVariants({ variant: finalVariant }), className)}\n {...props}\n />\n );\n },\n) as BadgeComponent;\n\nBadge.displayName = 'Badge';\n\nexport { Badge };\nexport type { BadgeComponent, BadgeProps };\n"]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5M47B2XJ_js = require('./chunk-5M47B2XJ.js');
|
|
4
|
+
var utils = require('@exem-ui/core/utils');
|
|
5
|
+
var CheckboxPrimitive = require('@radix-ui/react-checkbox');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
|
|
28
|
+
|
|
29
|
+
var containerVariants = utils.cva("inline-flex items-center", {
|
|
30
|
+
variants: {
|
|
31
|
+
size: {
|
|
32
|
+
small: "gap-1",
|
|
33
|
+
medium: "gap-1.5",
|
|
34
|
+
large: "gap-2"
|
|
35
|
+
},
|
|
36
|
+
labelPosition: {
|
|
37
|
+
right: "flex-row",
|
|
38
|
+
left: "flex-row-reverse"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
defaultVariants: {
|
|
42
|
+
size: "medium",
|
|
43
|
+
labelPosition: "right"
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
var boxVariants = utils.cva(
|
|
47
|
+
"peer shrink-0 cursor-pointer rounded-weak border border-border-secondary ring-offset-background transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed enabled:data-[state=unchecked]:hover:bg-elevation-elevation-2 disabled:data-[state=unchecked]:bg-elevation-elevation-3 bg-background-primary",
|
|
48
|
+
{
|
|
49
|
+
variants: {
|
|
50
|
+
size: {
|
|
51
|
+
small: "size-4",
|
|
52
|
+
medium: "size-5",
|
|
53
|
+
large: "size-6"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
size: "medium"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
var labelVariants = utils.cva(
|
|
62
|
+
"cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
|
|
63
|
+
{
|
|
64
|
+
variants: {
|
|
65
|
+
size: {
|
|
66
|
+
small: "text-body-3",
|
|
67
|
+
medium: "text-body-2",
|
|
68
|
+
large: "text-body-1"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
size: "medium"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
var iconVariants = utils.cva("text-icon-static-light", {
|
|
77
|
+
variants: {
|
|
78
|
+
size: {
|
|
79
|
+
small: "size-4",
|
|
80
|
+
medium: "size-5",
|
|
81
|
+
large: "size-6"
|
|
82
|
+
},
|
|
83
|
+
disabled: {
|
|
84
|
+
true: "text-icon-inverse-disabled"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
defaultVariants: {
|
|
88
|
+
size: "medium"
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
var stateClasses = [
|
|
92
|
+
"data-[state=checked]:bg-solid-accent-default data-[state=checked]:border-transparent",
|
|
93
|
+
"data-[state=indeterminate]:bg-solid-accent-default data-[state=indeterminate]:border-transparent",
|
|
94
|
+
"enabled:data-[state=checked]:hover:bg-solid-accent-hovered enabled:data-[state=indeterminate]:hover:bg-solid-accent-hovered",
|
|
95
|
+
"enabled:data-[state=checked]:hover:border-transparent enabled:data-[state=indeterminate]:hover:border-transparent",
|
|
96
|
+
"disabled:data-[state=checked]:bg-solid-accent-disabled disabled:data-[state=indeterminate]:bg-solid-accent-disabled",
|
|
97
|
+
"disabled:data-[state=checked]:border-transparent disabled:data-[state=indeterminate]:border-transparent"
|
|
98
|
+
];
|
|
99
|
+
var Checkbox = react.forwardRef(
|
|
100
|
+
({
|
|
101
|
+
className,
|
|
102
|
+
label,
|
|
103
|
+
id,
|
|
104
|
+
size = "medium",
|
|
105
|
+
labelPosition = "right",
|
|
106
|
+
checked,
|
|
107
|
+
onCheckedChange,
|
|
108
|
+
disabled = false,
|
|
109
|
+
defaultChecked,
|
|
110
|
+
...props
|
|
111
|
+
}, ref) => {
|
|
112
|
+
const uniqueId = react.useId();
|
|
113
|
+
const checkboxId = id || uniqueId;
|
|
114
|
+
const checkboxState = checked === "indeterminate" ? "indeterminate" : checked ? "checked" : "unchecked";
|
|
115
|
+
const checkboxProps = {
|
|
116
|
+
...props,
|
|
117
|
+
ref,
|
|
118
|
+
id: checkboxId,
|
|
119
|
+
className: utils.cn(boxVariants({ size }), stateClasses, className),
|
|
120
|
+
onCheckedChange: (state) => {
|
|
121
|
+
onCheckedChange?.(state === "indeterminate" ? true : !!state);
|
|
122
|
+
},
|
|
123
|
+
"data-state": checkboxState,
|
|
124
|
+
disabled
|
|
125
|
+
};
|
|
126
|
+
if (checked !== void 0) {
|
|
127
|
+
checkboxProps.checked = checked;
|
|
128
|
+
}
|
|
129
|
+
if (defaultChecked !== void 0) {
|
|
130
|
+
checkboxProps.defaultChecked = defaultChecked;
|
|
131
|
+
}
|
|
132
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn(containerVariants({ size, labelPosition })), children: [
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
134
|
+
CheckboxPrimitive__namespace.Root,
|
|
135
|
+
{
|
|
136
|
+
...checkboxProps,
|
|
137
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(CheckboxPrimitive__namespace.Indicator, { className: "flex items-center justify-center", children: checkboxState === "indeterminate" ? /* @__PURE__ */ jsxRuntime.jsx(chunk5M47B2XJ_js.Minus, { type: "regular", className: utils.cn(iconVariants({ size, disabled })) }) : checkboxState === "checked" ? /* @__PURE__ */ jsxRuntime.jsx(chunk5M47B2XJ_js.Check, { type: "regular", className: utils.cn(iconVariants({ size, disabled })) }) : null })
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
label && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: checkboxId, className: utils.cn(labelVariants({ size })), children: label })
|
|
141
|
+
] });
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
Checkbox.displayName = CheckboxPrimitive__namespace.Root.displayName;
|
|
145
|
+
|
|
146
|
+
exports.Checkbox = Checkbox;
|
|
147
|
+
//# sourceMappingURL=chunk-5TVMECVF.js.map
|
|
148
|
+
//# sourceMappingURL=chunk-5TVMECVF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/checkbox/Checkbox.tsx"],"names":["cva","forwardRef","useId","cn","jsxs","jsx","CheckboxPrimitive","Minus","Check"],"mappings":"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","file":"chunk-5TVMECVF.js","sourcesContent":["import { cn, cva } from '@exem-ui/core/utils';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport type React from 'react';\nimport { forwardRef, useId } from 'react';\nimport { CheckIcon, MinusIcon } from '../icon';\n\ntype CheckboxSize = 'small' | 'medium' | 'large';\n\ntype LabelPosition = 'left' | 'right';\n\ninterface CheckboxProps extends React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> {\n /** 체크 상태. `'indeterminate'`는 부분 선택을 나타냅니다. */\n checked?: boolean | 'indeterminate';\n /** 체크박스 옆에 표시할 레이블 */\n label?: React.ReactNode;\n /** 추가 클래스명 */\n className?: string;\n /**\n * 체크박스 크기\n * @default 'medium'\n */\n size?: CheckboxSize;\n /**\n * 레이블 위치\n * @default 'right'\n */\n labelPosition?: LabelPosition;\n /** 체크 상태 변경 핸들러 */\n onCheckedChange?: (checked: boolean) => void;\n /** 초기 체크 상태 (비제어) */\n defaultChecked?: boolean;\n /**\n * 비활성화 상태\n * @default false\n */\n disabled?: boolean;\n}\n\ntype CheckboxComponent = React.ForwardRefExoticComponent<\n CheckboxProps & React.RefAttributes<HTMLButtonElement>\n>;\n\nconst containerVariants = cva('inline-flex items-center', {\n variants: {\n size: {\n small: 'gap-1',\n medium: 'gap-1.5',\n large: 'gap-2',\n },\n labelPosition: {\n right: 'flex-row',\n left: 'flex-row-reverse',\n },\n },\n defaultVariants: {\n size: 'medium',\n labelPosition: 'right',\n },\n});\n\nconst boxVariants = cva(\n 'peer shrink-0 cursor-pointer rounded-weak border border-border-secondary ring-offset-background transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed enabled:data-[state=unchecked]:hover:bg-elevation-elevation-2 disabled:data-[state=unchecked]:bg-elevation-elevation-3 bg-background-primary',\n {\n variants: {\n size: {\n small: 'size-4',\n medium: 'size-5',\n large: 'size-6',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\nconst labelVariants = cva(\n 'cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled',\n {\n variants: {\n size: {\n small: 'text-body-3',\n medium: 'text-body-2',\n large: 'text-body-1',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\nconst iconVariants = cva('text-icon-static-light', {\n variants: {\n size: {\n small: 'size-4',\n medium: 'size-5',\n large: 'size-6',\n },\n disabled: {\n true: 'text-icon-inverse-disabled',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n});\n\nconst stateClasses = [\n 'data-[state=checked]:bg-solid-accent-default data-[state=checked]:border-transparent',\n 'data-[state=indeterminate]:bg-solid-accent-default data-[state=indeterminate]:border-transparent',\n 'enabled:data-[state=checked]:hover:bg-solid-accent-hovered enabled:data-[state=indeterminate]:hover:bg-solid-accent-hovered',\n 'enabled:data-[state=checked]:hover:border-transparent enabled:data-[state=indeterminate]:hover:border-transparent',\n 'disabled:data-[state=checked]:bg-solid-accent-disabled disabled:data-[state=indeterminate]:bg-solid-accent-disabled',\n 'disabled:data-[state=checked]:border-transparent disabled:data-[state=indeterminate]:border-transparent',\n];\n\n/**\n * 하나 이상의 항목을 선택하는 체크박스 컴포넌트입니다.\n * 체크, 미체크, indeterminate(부분 선택) 상태를 지원합니다.\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <Checkbox label=\"이용 약관에 동의합니다\" />\n *\n * // 제어 컴포넌트\n * <Checkbox checked={isChecked} onCheckedChange={setIsChecked} label=\"선택\" />\n *\n * // 부분 선택 상태\n * <Checkbox checked=\"indeterminate\" label=\"전체 선택\" />\n * ```\n *\n * @see {@link CheckboxProps} props 상세\n */\nconst Checkbox = forwardRef<React.ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n (\n {\n className,\n label,\n id,\n size = 'medium',\n labelPosition = 'right',\n checked,\n onCheckedChange,\n disabled = false,\n defaultChecked,\n ...props\n },\n ref,\n ) => {\n const uniqueId = useId();\n const checkboxId = id || uniqueId;\n\n const checkboxState =\n checked === 'indeterminate' ? 'indeterminate' : checked ? 'checked' : 'unchecked';\n\n const checkboxProps: Record<string, unknown> = {\n ...props,\n ref,\n id: checkboxId,\n className: cn(boxVariants({ size }), stateClasses, className),\n onCheckedChange: (state: boolean | 'indeterminate') => {\n onCheckedChange?.(state === 'indeterminate' ? true : !!state);\n },\n 'data-state': checkboxState,\n disabled,\n };\n\n if (checked !== undefined) {\n checkboxProps.checked = checked;\n }\n\n if (defaultChecked !== undefined) {\n checkboxProps.defaultChecked = defaultChecked;\n }\n\n return (\n <div className={cn(containerVariants({ size, labelPosition }))}>\n <CheckboxPrimitive.Root\n {...(checkboxProps as React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>)}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center\">\n {checkboxState === 'indeterminate' ? (\n <MinusIcon type=\"regular\" className={cn(iconVariants({ size, disabled }))} />\n ) : checkboxState === 'checked' ? (\n <CheckIcon type=\"regular\" className={cn(iconVariants({ size, disabled }))} />\n ) : null}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n {label && (\n <label htmlFor={checkboxId} className={cn(labelVariants({ size }))}>\n {label}\n </label>\n )}\n </div>\n );\n },\n) as CheckboxComponent;\n\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\nexport type { CheckboxComponent, CheckboxProps };\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Tooltip } from './chunk-YVFLRPFV.mjs';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
var FlatTooltip = ({ children, title, size, description, ...props }) => {
|
|
5
|
+
return /* @__PURE__ */ jsx(Tooltip.Provider, { delayDuration: 0, skipDelayDuration: 0, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
6
|
+
/* @__PURE__ */ jsx(Tooltip.Trigger, { asChild: true, children }),
|
|
7
|
+
/* @__PURE__ */ jsxs(Tooltip.Content, { size, ...props, children: [
|
|
8
|
+
title && /* @__PURE__ */ jsx(Tooltip.Title, { children: title }),
|
|
9
|
+
description && /* @__PURE__ */ jsx(Tooltip.Description, { children: description })
|
|
10
|
+
] })
|
|
11
|
+
] }) });
|
|
12
|
+
};
|
|
13
|
+
function ConditionalTooltip({ children, tooltip }) {
|
|
14
|
+
if (typeof tooltip === "string") {
|
|
15
|
+
return /* @__PURE__ */ jsx(FlatTooltip, { size: "tiny", description: tooltip, children });
|
|
16
|
+
}
|
|
17
|
+
if (tooltip && typeof tooltip === "object" && "description" in tooltip && tooltip.use !== false) {
|
|
18
|
+
return /* @__PURE__ */ jsx(FlatTooltip, { size: tooltip.size || "tiny", ...tooltip, children });
|
|
19
|
+
}
|
|
20
|
+
return children;
|
|
21
|
+
}
|
|
22
|
+
FlatTooltip.displayName = "FlatTooltip";
|
|
23
|
+
ConditionalTooltip.displayName = "ConditionalTooltip";
|
|
24
|
+
|
|
25
|
+
export { ConditionalTooltip, FlatTooltip };
|
|
26
|
+
//# sourceMappingURL=chunk-5WGNZX7Z.mjs.map
|
|
27
|
+
//# sourceMappingURL=chunk-5WGNZX7Z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/flat/FlatTooltip.tsx"],"names":[],"mappings":";;;AAuCA,IAAM,WAAA,GAAc,CAAC,EAAE,QAAA,EAAU,OAAO,IAAA,EAAM,WAAA,EAAa,GAAG,KAAA,EAAM,KAAwB;AAC1F,EAAA,uBACE,GAAA,CAAC,QAAQ,QAAA,EAAR,EAAiB,eAAe,CAAA,EAAG,iBAAA,EAAmB,CAAA,EACrD,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,CAAQ,OAAA,EAAR,EAAgB,OAAA,EAAO,MAAE,QAAA,EAAS,CAAA;AAAA,yBAClC,OAAA,CAAQ,OAAA,EAAR,EAAgB,IAAA,EAAa,GAAG,KAAA,EAC9B,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAS,GAAA,CAAC,OAAA,CAAQ,KAAA,EAAR,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC/B,WAAA,oBAAe,GAAA,CAAC,OAAA,CAAQ,WAAA,EAAR,EAAqB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACpD;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAiDA,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA4B;AAC1E,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,2BACG,WAAA,EAAA,EAAY,IAAA,EAAK,MAAA,EAAO,WAAA,EAAa,SACnC,QAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,iBAAiB,OAAA,IAAW,OAAA,CAAQ,QAAQ,KAAA,EAAO;AAC/F,IAAA,uBACE,GAAA,CAAC,eAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,MAAA,EAAS,GAAG,SAC5C,QAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAC1B,kBAAA,CAAmB,WAAA,GAAc,oBAAA","file":"chunk-5WGNZX7Z.mjs","sourcesContent":["import type { ComponentProps } from 'react';\nimport { Tooltip } from '../tooltip/Tooltip';\n\ninterface FlatTooltipProps {\n /** 툴팁을 적용할 자식 요소 */\n children: React.ReactNode;\n /** 툴팁 제목 (선택) */\n title?: React.ReactNode;\n /** 툴팁 크기 */\n size: ComponentProps<typeof Tooltip.Content>['size'];\n /** 툴팁 표시 위치 */\n side?: ComponentProps<typeof Tooltip.Content>['side'];\n /** 툴팁 정렬 */\n align?: ComponentProps<typeof Tooltip.Content>['align'];\n /** 사이드 방향 오프셋 (px) */\n sideOffset?: ComponentProps<typeof Tooltip.Content>['sideOffset'];\n /** 정렬 방향 오프셋 (px) */\n alignOffset?: ComponentProps<typeof Tooltip.Content>['alignOffset'];\n /** 툴팁 설명 텍스트 */\n description: React.ReactNode;\n}\n\n/**\n * Tooltip 컴포넌트의 간소화된 Flat API입니다.\n * Compound Component 없이 props만으로 간편하게 사용할 수 있습니다.\n *\n * @example\n * ```tsx\n * <FlatTooltip size=\"small\" description=\"도움말 텍스트\">\n * <button>호버하세요</button>\n * </FlatTooltip>\n *\n * <FlatTooltip size=\"tiny\" title=\"제목\" description=\"설명\">\n * <span>정보</span>\n * </FlatTooltip>\n * ```\n *\n * @see {@link FlatTooltipProps} props 상세\n */\nconst FlatTooltip = ({ children, title, size, description, ...props }: FlatTooltipProps) => {\n return (\n <Tooltip.Provider delayDuration={0} skipDelayDuration={0}>\n <Tooltip>\n <Tooltip.Trigger asChild>{children}</Tooltip.Trigger>\n <Tooltip.Content size={size} {...props}>\n {title && <Tooltip.Title>{title}</Tooltip.Title>}\n {description && <Tooltip.Description>{description}</Tooltip.Description>}\n </Tooltip.Content>\n </Tooltip>\n </Tooltip.Provider>\n );\n};\n\n/** FlatTooltip 설정 객체 타입 (children 제외) */\ntype TooltipConfig = Omit<ComponentProps<typeof FlatTooltip>, 'children' | 'size'> & {\n /**\n * 툴팁 사용 여부\n * @default true\n */\n use?: boolean;\n size?: ComponentProps<typeof FlatTooltip>['size'];\n};\n\ninterface ConditionalTooltipProps {\n /** 툴팁으로 감쌀 자식 요소 */\n children: React.ReactNode;\n /**\n * 툴팁 설정값\n * - `string`: 기본 tiny 사이즈의 툴팁 description으로 사용\n * - `object`: FlatTooltip props를 직접 전달 (`use: false`로 비활성화 가능)\n */\n tooltip: ComponentProps<typeof FlatTooltip>['description'] | TooltipConfig;\n}\n\n/**\n * 조건부로 FlatTooltip을 적용하는 래퍼 컴포넌트입니다.\n *\n * @description\n * tooltip prop의 타입에 따라 다르게 동작합니다:\n * - `string`: tiny 사이즈의 기본 툴팁으로 렌더링\n * - `object` (`use !== false`): 전달된 props로 FlatTooltip 렌더링\n * - `object` (`use === false`) 또는 기타: children만 반환 (툴팁 없음)\n *\n * @example\n * ```tsx\n * <ConditionalTooltip tooltip=\"도움말 텍스트\">\n * <button>버튼</button>\n * </ConditionalTooltip>\n *\n * <ConditionalTooltip tooltip={{ description: \"설명\", size: \"small\", side: \"top\" }}>\n * <button>버튼</button>\n * </ConditionalTooltip>\n *\n * <ConditionalTooltip tooltip={{ use: false, description: \"\" }}>\n * <button>툴팁 없음</button>\n * </ConditionalTooltip>\n * ```\n *\n * @see {@link ConditionalTooltipProps} props 상세\n */\nfunction ConditionalTooltip({ children, tooltip }: ConditionalTooltipProps) {\n if (typeof tooltip === 'string') {\n return (\n <FlatTooltip size=\"tiny\" description={tooltip}>\n {children}\n </FlatTooltip>\n );\n }\n\n if (tooltip && typeof tooltip === 'object' && 'description' in tooltip && tooltip.use !== false) {\n return (\n <FlatTooltip size={tooltip.size || 'tiny'} {...tooltip}>\n {children}\n </FlatTooltip>\n );\n }\n\n return children;\n}\n\nFlatTooltip.displayName = 'FlatTooltip';\nConditionalTooltip.displayName = 'ConditionalTooltip';\n\nexport { FlatTooltip, ConditionalTooltip };\nexport type { FlatTooltipProps, ConditionalTooltipProps, TooltipConfig };\n"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkREBHUF4L_js = require('./chunk-REBHUF4L.js');
|
|
4
|
+
var utils = require('@exem-ui/core/utils');
|
|
5
|
+
var DialogPrimitive = require('@radix-ui/react-dialog');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
|
|
28
|
+
|
|
29
|
+
var MessageBoxContext = react.createContext({ variant: "default" });
|
|
30
|
+
var MessageBoxRoot = (props) => /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Root, { ...props });
|
|
31
|
+
var MessageBox = MessageBoxRoot;
|
|
32
|
+
MessageBox.Trigger = DialogPrimitive__namespace.Trigger;
|
|
33
|
+
MessageBox.Content = react.forwardRef(({ className, children, variant = "default", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(MessageBoxContext.Provider, { value: { variant }, children: /* @__PURE__ */ jsxRuntime.jsxs(DialogPrimitive__namespace.Portal, { children: [
|
|
34
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
35
|
+
DialogPrimitive__namespace.Overlay,
|
|
36
|
+
{
|
|
37
|
+
className: utils.cn(
|
|
38
|
+
"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"
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
DialogPrimitive__namespace.Content,
|
|
44
|
+
{
|
|
45
|
+
ref,
|
|
46
|
+
className: utils.cn(
|
|
47
|
+
"fixed left-[50%] top-[50%] z-50 flex w-[400px] translate-x-[-50%] translate-y-[-50%] flex-col items-end gap-4 rounded-medium border border-border-primary bg-elevation-elevation-0 p-4 shadow-strong duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 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%]",
|
|
48
|
+
className
|
|
49
|
+
),
|
|
50
|
+
...props,
|
|
51
|
+
children
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
] }) }));
|
|
55
|
+
MessageBox.Title = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
56
|
+
DialogPrimitive__namespace.Title,
|
|
57
|
+
{
|
|
58
|
+
ref,
|
|
59
|
+
className: utils.cn("w-full text-title-2 font-semibold text-text-primary", className),
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
));
|
|
63
|
+
MessageBox.Description = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
64
|
+
DialogPrimitive__namespace.Description,
|
|
65
|
+
{
|
|
66
|
+
ref,
|
|
67
|
+
className: utils.cn("w-full text-body-2 text-text-secondary", className),
|
|
68
|
+
...props
|
|
69
|
+
}
|
|
70
|
+
));
|
|
71
|
+
MessageBox.Actions = react.forwardRef(
|
|
72
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: utils.cn("flex flex-row gap-2", className), ...props })
|
|
73
|
+
);
|
|
74
|
+
MessageBox.Cancel = react.forwardRef(
|
|
75
|
+
({ size = "medium", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(chunkREBHUF4L_js.Button, { ref, color: "assistive", variant: "contained", size, ...props }) })
|
|
76
|
+
);
|
|
77
|
+
MessageBox.Action = react.forwardRef(
|
|
78
|
+
({ size = "medium", ...props }, ref) => {
|
|
79
|
+
const { variant } = react.useContext(MessageBoxContext);
|
|
80
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
81
|
+
chunkREBHUF4L_js.Button,
|
|
82
|
+
{
|
|
83
|
+
ref,
|
|
84
|
+
color: variant === "critical" ? "critical" : "primary",
|
|
85
|
+
variant: "contained",
|
|
86
|
+
size,
|
|
87
|
+
...props
|
|
88
|
+
}
|
|
89
|
+
) });
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
MessageBox.displayName = "MessageBox";
|
|
93
|
+
MessageBox.Trigger.displayName = "MessageBox.Trigger";
|
|
94
|
+
MessageBox.Content.displayName = "MessageBox.Content";
|
|
95
|
+
MessageBox.Title.displayName = "MessageBox.Title";
|
|
96
|
+
MessageBox.Description.displayName = "MessageBox.Description";
|
|
97
|
+
MessageBox.Actions.displayName = "MessageBox.Actions";
|
|
98
|
+
MessageBox.Cancel.displayName = "MessageBox.Cancel";
|
|
99
|
+
MessageBox.Action.displayName = "MessageBox.Action";
|
|
100
|
+
|
|
101
|
+
exports.MessageBox = MessageBox;
|
|
102
|
+
//# sourceMappingURL=chunk-AQ3OIM2T.js.map
|
|
103
|
+
//# sourceMappingURL=chunk-AQ3OIM2T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/messageBox/MessageBox.tsx"],"names":["createContext","DialogPrimitive","forwardRef","jsx","jsxs","cn","Button","useContext"],"mappings":"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","file":"chunk-AQ3OIM2T.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';\n\ntype MessageBoxVariant = 'default' | 'critical';\n\ntype MessageBoxRootProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;\n\ntype MessageBoxTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;\n\ntype MessageBoxContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n /**\n * 메시지 박스 variant\n * @default 'default'\n */\n variant?: MessageBoxVariant;\n};\n\ntype MessageBoxTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\n\ntype MessageBoxDescriptionProps = React.ComponentPropsWithoutRef<\n typeof DialogPrimitive.Description\n>;\n\ntype MessageBoxActionsProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype MessageBoxCancelProps = Omit<ButtonProps, 'color' | 'variant'>;\n\ntype MessageBoxActionProps = Omit<ButtonProps, 'color' | 'variant'>;\n\ntype MessageBoxComponent = React.FC<MessageBoxRootProps> & {\n Trigger: typeof DialogPrimitive.Trigger;\n Content: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<MessageBoxContentProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Content>>\n >;\n Title: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<MessageBoxTitleProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Title>>\n >;\n Description: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<MessageBoxDescriptionProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Description>>\n >;\n Actions: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<MessageBoxActionsProps> & React.RefAttributes<HTMLDivElement>\n >;\n Cancel: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<MessageBoxCancelProps> & React.RefAttributes<HTMLButtonElement>\n >;\n Action: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<MessageBoxActionProps> & React.RefAttributes<HTMLButtonElement>\n >;\n};\n\nconst MessageBoxContext = createContext<{ variant: MessageBoxVariant }>({ variant: 'default' });\n\n/**\n * 확인/경고 다이얼로그 컴포넌트입니다.\n * Modal보다 단순한 구조로, title + description + 버튼(취소/확인)으로 구성됩니다.\n *\n * @example\n * ```tsx\n * <MessageBox>\n * <MessageBox.Trigger>열기</MessageBox.Trigger>\n * <MessageBox.Content variant=\"default\">\n * <MessageBox.Title>상태를 확인하시겠습니까?</MessageBox.Title>\n * <MessageBox.Description>현재 상태에 대한 추가 확인이 필요합니다.</MessageBox.Description>\n * <MessageBox.Actions>\n * <MessageBox.Cancel>취소</MessageBox.Cancel>\n * <MessageBox.Action>확인</MessageBox.Action>\n * </MessageBox.Actions>\n * </MessageBox.Content>\n * </MessageBox>\n * ```\n */\nconst MessageBoxRoot: React.FC<MessageBoxRootProps> = (props) => (\n <DialogPrimitive.Root {...props} />\n);\n\nconst MessageBox = MessageBoxRoot as MessageBoxComponent;\n\nMessageBox.Trigger = DialogPrimitive.Trigger;\n\nMessageBox.Content = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n MessageBoxContentProps\n>(({ className, children, variant = 'default', ...props }, ref) => (\n <MessageBoxContext.Provider value={{ variant }}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\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 )}\n />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 flex w-[400px] translate-x-[-50%] translate-y-[-50%] flex-col items-end gap-4 rounded-medium border border-border-primary bg-elevation-elevation-0 p-4 shadow-strong duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 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 className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </MessageBoxContext.Provider>\n)) as MessageBoxComponent['Content'];\n\nMessageBox.Title = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n MessageBoxTitleProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('w-full text-title-2 font-semibold text-text-primary', className)}\n {...props}\n />\n)) as MessageBoxComponent['Title'];\n\nMessageBox.Description = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n MessageBoxDescriptionProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('w-full text-body-2 text-text-secondary', className)}\n {...props}\n />\n)) as MessageBoxComponent['Description'];\n\nMessageBox.Actions = forwardRef<HTMLDivElement, MessageBoxActionsProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-row gap-2', className)} {...props} />\n ),\n) as MessageBoxComponent['Actions'];\n\nMessageBox.Cancel = forwardRef<HTMLButtonElement, MessageBoxCancelProps>(\n ({ size = 'medium', ...props }, ref) => (\n <DialogPrimitive.Close asChild>\n <Button ref={ref} color=\"assistive\" variant=\"contained\" size={size} {...props} />\n </DialogPrimitive.Close>\n ),\n) as MessageBoxComponent['Cancel'];\n\nMessageBox.Action = forwardRef<HTMLButtonElement, MessageBoxActionProps>(\n ({ size = 'medium', ...props }, ref) => {\n const { variant } = useContext(MessageBoxContext);\n\n return (\n <DialogPrimitive.Close asChild>\n <Button\n ref={ref}\n color={variant === 'critical' ? 'critical' : 'primary'}\n variant=\"contained\"\n size={size}\n {...props}\n />\n </DialogPrimitive.Close>\n );\n },\n) as MessageBoxComponent['Action'];\n\nMessageBox.displayName = 'MessageBox';\nMessageBox.Trigger.displayName = 'MessageBox.Trigger';\nMessageBox.Content.displayName = 'MessageBox.Content';\nMessageBox.Title.displayName = 'MessageBox.Title';\nMessageBox.Description.displayName = 'MessageBox.Description';\nMessageBox.Actions.displayName = 'MessageBox.Actions';\nMessageBox.Cancel.displayName = 'MessageBox.Cancel';\nMessageBox.Action.displayName = 'MessageBox.Action';\n\nexport { MessageBox };\nexport type {\n MessageBoxActionProps,\n MessageBoxActionsProps,\n MessageBoxCancelProps,\n MessageBoxComponent,\n MessageBoxContentProps,\n MessageBoxDescriptionProps,\n MessageBoxRootProps,\n MessageBoxTitleProps,\n MessageBoxTriggerProps,\n MessageBoxVariant,\n};\n"]}
|