@tipp/ui 2.0.3 → 2.0.4

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.
Files changed (116) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +12 -16
  3. package/dist/chunk-2K4GU6TT.js +0 -174
  4. package/dist/chunk-2K4GU6TT.js.map +0 -1
  5. package/dist/chunk-3CVQG5IO.js +0 -54
  6. package/dist/chunk-3CVQG5IO.js.map +0 -1
  7. package/dist/chunk-3FEMWCWV.js +0 -23
  8. package/dist/chunk-3FEMWCWV.js.map +0 -1
  9. package/dist/chunk-3UJOUGH3.js +0 -169
  10. package/dist/chunk-3UJOUGH3.js.map +0 -1
  11. package/dist/chunk-4LYUNBCH.js +0 -174
  12. package/dist/chunk-4LYUNBCH.js.map +0 -1
  13. package/dist/chunk-4NBRGUIC.js +0 -144
  14. package/dist/chunk-4NBRGUIC.js.map +0 -1
  15. package/dist/chunk-4YKESXWQ.js +0 -68
  16. package/dist/chunk-4YKESXWQ.js.map +0 -1
  17. package/dist/chunk-54C63CWN.js +0 -74
  18. package/dist/chunk-54C63CWN.js.map +0 -1
  19. package/dist/chunk-5DTCJF6D.js +0 -144
  20. package/dist/chunk-5DTCJF6D.js.map +0 -1
  21. package/dist/chunk-6OQQUSCX.js +0 -281
  22. package/dist/chunk-6OQQUSCX.js.map +0 -1
  23. package/dist/chunk-75ENC5RS.js +0 -30
  24. package/dist/chunk-75ENC5RS.js.map +0 -1
  25. package/dist/chunk-7IX5IEPU.js +0 -63
  26. package/dist/chunk-7IX5IEPU.js.map +0 -1
  27. package/dist/chunk-7VJB7OZ3.js +0 -145
  28. package/dist/chunk-7VJB7OZ3.js.map +0 -1
  29. package/dist/chunk-ACG3G2CH.js +0 -31
  30. package/dist/chunk-ACG3G2CH.js.map +0 -1
  31. package/dist/chunk-AEPCBZF7.js +0 -30
  32. package/dist/chunk-AEPCBZF7.js.map +0 -1
  33. package/dist/chunk-AJU5NJ2C.js +0 -97
  34. package/dist/chunk-AJU5NJ2C.js.map +0 -1
  35. package/dist/chunk-BFLGQQJZ.js +0 -30
  36. package/dist/chunk-BFLGQQJZ.js.map +0 -1
  37. package/dist/chunk-BZVP23R4.js +0 -145
  38. package/dist/chunk-BZVP23R4.js.map +0 -1
  39. package/dist/chunk-CQSOA3HY.js +0 -144
  40. package/dist/chunk-CQSOA3HY.js.map +0 -1
  41. package/dist/chunk-D6WG5BHL.js +0 -39
  42. package/dist/chunk-D6WG5BHL.js.map +0 -1
  43. package/dist/chunk-DFXO2GOC.js +0 -144
  44. package/dist/chunk-DFXO2GOC.js.map +0 -1
  45. package/dist/chunk-DQGB3JQA.js +0 -63
  46. package/dist/chunk-DQGB3JQA.js.map +0 -1
  47. package/dist/chunk-E3T66HOA.js +0 -106
  48. package/dist/chunk-E3T66HOA.js.map +0 -1
  49. package/dist/chunk-EJ3JNXLY.js +0 -99
  50. package/dist/chunk-EJ3JNXLY.js.map +0 -1
  51. package/dist/chunk-ESHEHOVH.js +0 -63
  52. package/dist/chunk-ESHEHOVH.js.map +0 -1
  53. package/dist/chunk-F5MKSWHL.js +0 -163
  54. package/dist/chunk-F5MKSWHL.js.map +0 -1
  55. package/dist/chunk-FV26PAOO.js +0 -352
  56. package/dist/chunk-FV26PAOO.js.map +0 -1
  57. package/dist/chunk-GSU262TZ.js +0 -101
  58. package/dist/chunk-GSU262TZ.js.map +0 -1
  59. package/dist/chunk-HOKENHFD.js +0 -281
  60. package/dist/chunk-HOKENHFD.js.map +0 -1
  61. package/dist/chunk-IIN3YNMK.js +0 -281
  62. package/dist/chunk-IIN3YNMK.js.map +0 -1
  63. package/dist/chunk-JDE7356R.js +0 -64
  64. package/dist/chunk-JDE7356R.js.map +0 -1
  65. package/dist/chunk-JKNCADEB.js +0 -74
  66. package/dist/chunk-JKNCADEB.js.map +0 -1
  67. package/dist/chunk-JLT3GUBP.js +0 -144
  68. package/dist/chunk-JLT3GUBP.js.map +0 -1
  69. package/dist/chunk-JMS4TRIK.js +0 -64
  70. package/dist/chunk-JMS4TRIK.js.map +0 -1
  71. package/dist/chunk-KXEHA6WD.js +0 -63
  72. package/dist/chunk-KXEHA6WD.js.map +0 -1
  73. package/dist/chunk-L44AC52S.js +0 -145
  74. package/dist/chunk-L44AC52S.js.map +0 -1
  75. package/dist/chunk-LFZ22PRA.js +0 -281
  76. package/dist/chunk-LFZ22PRA.js.map +0 -1
  77. package/dist/chunk-NBPRKG6W.js +0 -106
  78. package/dist/chunk-NBPRKG6W.js.map +0 -1
  79. package/dist/chunk-NJ4N3VCI.js +0 -174
  80. package/dist/chunk-NJ4N3VCI.js.map +0 -1
  81. package/dist/chunk-NNPT6BV4.js +0 -117
  82. package/dist/chunk-NNPT6BV4.js.map +0 -1
  83. package/dist/chunk-NVIBNWII.js +0 -57
  84. package/dist/chunk-NVIBNWII.js.map +0 -1
  85. package/dist/chunk-OHIU6IRT.js +0 -174
  86. package/dist/chunk-OHIU6IRT.js.map +0 -1
  87. package/dist/chunk-PE4V3SCZ.js +0 -145
  88. package/dist/chunk-PE4V3SCZ.js.map +0 -1
  89. package/dist/chunk-PEIOKCXD.js +0 -144
  90. package/dist/chunk-PEIOKCXD.js.map +0 -1
  91. package/dist/chunk-PLAQRGID.js +0 -281
  92. package/dist/chunk-PLAQRGID.js.map +0 -1
  93. package/dist/chunk-PWXFETED.js +0 -146
  94. package/dist/chunk-PWXFETED.js.map +0 -1
  95. package/dist/chunk-QMT5IFKD.js +0 -64
  96. package/dist/chunk-QMT5IFKD.js.map +0 -1
  97. package/dist/chunk-RIGG6NNZ.js +0 -74
  98. package/dist/chunk-RIGG6NNZ.js.map +0 -1
  99. package/dist/chunk-S52LOF3I.js +0 -354
  100. package/dist/chunk-S52LOF3I.js.map +0 -1
  101. package/dist/chunk-S6DQEDBV.js +0 -145
  102. package/dist/chunk-S6DQEDBV.js.map +0 -1
  103. package/dist/chunk-UVACR5CC.js +0 -174
  104. package/dist/chunk-UVACR5CC.js.map +0 -1
  105. package/dist/chunk-VTWZCX6H.js +0 -281
  106. package/dist/chunk-VTWZCX6H.js.map +0 -1
  107. package/dist/chunk-X2Q6QPMS.js +0 -165
  108. package/dist/chunk-X2Q6QPMS.js.map +0 -1
  109. package/dist/chunk-YAKVZPPI.js +0 -39
  110. package/dist/chunk-YAKVZPPI.js.map +0 -1
  111. package/dist/chunk-ZEAJABLA.js +0 -146
  112. package/dist/chunk-ZEAJABLA.js.map +0 -1
  113. package/dist/chunk-ZJTONHYI.js +0 -144
  114. package/dist/chunk-ZJTONHYI.js.map +0 -1
  115. package/dist/chunk-ZN52UBYA.js +0 -39
  116. package/dist/chunk-ZN52UBYA.js.map +0 -1
@@ -1,163 +0,0 @@
1
- import {
2
- ThemeProvider
3
- } from "./chunk-RX5DC5KO.js";
4
- import {
5
- Grid
6
- } from "./chunk-EGEQY3KT.js";
7
- import {
8
- Heading
9
- } from "./chunk-3IT3NVK6.js";
10
- import {
11
- Box
12
- } from "./chunk-4Y5BEXVN.js";
13
- import {
14
- Typo
15
- } from "./chunk-LH57PIY2.js";
16
- import {
17
- Flex
18
- } from "./chunk-25HMMI7R.js";
19
- import {
20
- Button
21
- } from "./chunk-AFPH32MF.js";
22
- import {
23
- AspectRatio
24
- } from "./chunk-EAXUQEO5.js";
25
- import {
26
- Badge
27
- } from "./chunk-FCIHNIOH.js";
28
- import {
29
- __spreadProps,
30
- __spreadValues
31
- } from "./chunk-2NMEKWO5.js";
32
-
33
- // src/molecules/learning-post.tsx
34
- import { jsx, jsxs } from "react/jsx-runtime";
35
- function LearningPost(props) {
36
- const {
37
- defaultThemeProps,
38
- html,
39
- tags,
40
- title,
41
- metaDescription,
42
- imageComp,
43
- onPageBack,
44
- children
45
- } = props;
46
- return /* @__PURE__ */ jsx(
47
- ThemeProvider,
48
- __spreadProps(__spreadValues({}, defaultThemeProps), {
49
- accentColor: "iris",
50
- scaling: "110%",
51
- style: {},
52
- children: html ? /* @__PURE__ */ jsxs(
53
- Grid,
54
- {
55
- columns: { initial: "1", md: "130px 1fr 130px" },
56
- gap: { initial: "2", md: "5" },
57
- height: "100%",
58
- justify: "center",
59
- pb: "160px",
60
- position: "relative",
61
- px: "4",
62
- width: "100%",
63
- children: [
64
- /* @__PURE__ */ jsx("div", {}),
65
- /* @__PURE__ */ jsxs(
66
- Flex,
67
- {
68
- align: "center",
69
- direction: "column",
70
- maxWidth: "880px",
71
- mt: { initial: "3", md: "8" },
72
- overflow: "hidden",
73
- width: "100%",
74
- children: [
75
- /* @__PURE__ */ jsxs(Grid, { align: "start", columns: { initial: "1", sm: "2" }, gap: "2", children: [
76
- /* @__PURE__ */ jsxs(
77
- Grid,
78
- {
79
- gap: "3",
80
- mb: { initial: "4", sm: "0" },
81
- style: { alignSelf: "flex-start" },
82
- children: [
83
- /* @__PURE__ */ jsx(
84
- Heading,
85
- {
86
- style: {
87
- fontSize: "2.4rem",
88
- lineHeight: 1.25,
89
- wordBreak: "keep-all"
90
- },
91
- variant: "heading1",
92
- children: title
93
- }
94
- ),
95
- /* @__PURE__ */ jsx(Typo, { children: metaDescription }),
96
- /* @__PURE__ */ jsx(Flex, { gap: "1", wrap: "wrap", children: tags == null ? void 0 : tags.map((el) => {
97
- var _a;
98
- if ((_a = el.name) == null ? void 0 : _a.startsWith("filter")) return;
99
- return /* @__PURE__ */ jsx(Badge, { size: "large", variant: "solid", children: el.name }, el.id);
100
- }) })
101
- ]
102
- }
103
- ),
104
- /* @__PURE__ */ jsx(
105
- AspectRatio,
106
- {
107
- ratio: 5 / 3,
108
- style: {
109
- overflow: "hidden",
110
- borderRadius: "var(--radius-4)",
111
- objectFit: "cover"
112
- },
113
- children: imageComp
114
- }
115
- )
116
- ] }),
117
- /* @__PURE__ */ jsx(Box, { mt: "5", width: "100%", children: /* @__PURE__ */ jsx(
118
- "div",
119
- {
120
- className: "gh-content",
121
- dangerouslySetInnerHTML: { __html: html }
122
- }
123
- ) })
124
- ]
125
- }
126
- ),
127
- children
128
- ]
129
- }
130
- ) : /* @__PURE__ */ jsxs(
131
- Flex,
132
- {
133
- align: "center",
134
- direction: "column",
135
- gap: "6",
136
- height: "100%",
137
- justify: "center",
138
- width: "100%",
139
- children: [
140
- /* @__PURE__ */ jsx(Heading, { variant: "heading1", children: "\uCF58\uD150\uCE20\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4." }),
141
- /* @__PURE__ */ jsx(
142
- Heading,
143
- {
144
- align: "center",
145
- color: "gray",
146
- variant: "heading4",
147
- weight: "regular",
148
- children: `\uC694\uCCAD\uD558\uC2E0 \uCF58\uD150\uCE20\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
149
- \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.`
150
- }
151
- ),
152
- /* @__PURE__ */ jsx(Button, { onClick: onPageBack, size: "large", children: "\uB4A4\uB85C\uAC00\uAE30" })
153
- ]
154
- }
155
- )
156
- })
157
- );
158
- }
159
-
160
- export {
161
- LearningPost
162
- };
163
- //# sourceMappingURL=chunk-F5MKSWHL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/molecules/learning-post.tsx"],"sourcesContent":["import React from 'react';\nimport type { ThemeProviderProps } from '../theme/theme-provider';\nimport { ThemeProvider } from '../theme/theme-provider';\nimport { Grid } from '../atoms/grid';\nimport { Flex } from '../atoms/flex';\nimport { Heading } from '../atoms/heading';\nimport { Typo } from '../atoms/typo';\nimport { AspectRatio } from '../atoms/aspect-ratio';\nimport { Badge } from '../atoms/badge';\nimport { Box } from '../atoms/box';\nimport { Button } from '../atoms/button';\n\ninterface Tag {\n name?: string;\n id: string;\n}\nexport interface LearningPostProps {\n defaultThemeProps?: Partial<ThemeProviderProps>;\n html?: string;\n title?: string;\n metaDescription?: string;\n /** 섬네일에 해당하는 이미지 컴포넌트 */\n imageComp?: React.ReactNode;\n tags?: Tag[];\n children?: React.ReactNode;\n onPageBack?: () => void;\n}\n\nexport function LearningPost(props: LearningPostProps): React.ReactNode {\n const {\n defaultThemeProps,\n html,\n tags,\n title,\n metaDescription,\n imageComp,\n onPageBack,\n children,\n } = props;\n return (\n <ThemeProvider\n {...defaultThemeProps}\n accentColor=\"iris\"\n scaling=\"110%\"\n style={{}}\n >\n {html ? (\n <Grid\n columns={{ initial: '1', md: '130px 1fr 130px' }}\n gap={{ initial: '2', md: '5' }}\n height=\"100%\"\n justify=\"center\"\n pb=\"160px\"\n position=\"relative\"\n px=\"4\"\n width=\"100%\"\n >\n <div />\n <Flex\n align=\"center\"\n direction=\"column\"\n maxWidth=\"880px\"\n mt={{ initial: '3', md: '8' }}\n overflow=\"hidden\"\n width=\"100%\"\n >\n <Grid align=\"start\" columns={{ initial: '1', sm: '2' }} gap=\"2\">\n <Grid\n gap=\"3\"\n mb={{ initial: '4', sm: '0' }}\n style={{ alignSelf: 'flex-start' }}\n >\n <Heading\n style={{\n fontSize: '2.4rem',\n lineHeight: 1.25,\n wordBreak: 'keep-all',\n }}\n variant=\"heading1\"\n >\n {title}\n </Heading>\n <Typo>{metaDescription}</Typo>\n <Flex gap=\"1\" wrap=\"wrap\">\n {tags?.map((el) => {\n if (el.name?.startsWith('filter')) return;\n return (\n <Badge key={el.id} size=\"large\" variant=\"solid\">\n {el.name}\n </Badge>\n );\n })}\n </Flex>\n </Grid>\n\n <AspectRatio\n ratio={5 / 3}\n style={{\n overflow: 'hidden',\n borderRadius: 'var(--radius-4)',\n objectFit: 'cover',\n }}\n >\n {imageComp}\n </AspectRatio>\n </Grid>\n\n <Box mt=\"5\" width=\"100%\">\n <div\n className=\"gh-content\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </Box>\n </Flex>\n {children}\n </Grid>\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n gap=\"6\"\n height=\"100%\"\n justify=\"center\"\n width=\"100%\"\n >\n <Heading variant=\"heading1\">콘텐츠를 찾을 수 없습니다.</Heading>\n <Heading\n align=\"center\"\n color=\"gray\"\n variant=\"heading4\"\n weight=\"regular\"\n >\n {`요청하신 콘텐츠를 찾을 수 없습니다.\n 잠시 후 다시 시도해주세요.`}\n </Heading>\n <Button onClick={onPageBack} size=\"large\">\n 뒤로가기\n </Button>\n </Flex>\n )}\n </ThemeProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDU,cAUI,YAVJ;AA7BH,SAAS,aAAa,OAA2C;AACtE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,SACE;AAAA,IAAC;AAAA,qCACK,oBADL;AAAA,MAEC,aAAY;AAAA,MACZ,SAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MAEP,iBACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,EAAE,SAAS,KAAK,IAAI,kBAAkB;AAAA,UAC/C,KAAK,EAAE,SAAS,KAAK,IAAI,IAAI;AAAA,UAC7B,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,IAAG;AAAA,UACH,UAAS;AAAA,UACT,IAAG;AAAA,UACH,OAAM;AAAA,UAEN;AAAA,gCAAC,SAAI;AAAA,YACL;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,WAAU;AAAA,gBACV,UAAS;AAAA,gBACT,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI;AAAA,gBAC5B,UAAS;AAAA,gBACT,OAAM;AAAA,gBAEN;AAAA,uCAAC,QAAK,OAAM,SAAQ,SAAS,EAAE,SAAS,KAAK,IAAI,IAAI,GAAG,KAAI,KAC1D;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAI;AAAA,wBACJ,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI;AAAA,wBAC5B,OAAO,EAAE,WAAW,aAAa;AAAA,wBAEjC;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO;AAAA,gCACL,UAAU;AAAA,gCACV,YAAY;AAAA,gCACZ,WAAW;AAAA,8BACb;AAAA,8BACA,SAAQ;AAAA,8BAEP;AAAA;AAAA,0BACH;AAAA,0BACA,oBAAC,QAAM,2BAAgB;AAAA,0BACvB,oBAAC,QAAK,KAAI,KAAI,MAAK,QAChB,uCAAM,IAAI,CAAC,OAAO;AApFrC;AAqFoB,iCAAI,QAAG,SAAH,mBAAS,WAAW,UAAW;AACnC,mCACE,oBAAC,SAAkB,MAAK,SAAQ,SAAQ,SACrC,aAAG,QADM,GAAG,EAEf;AAAA,0BAEJ,IACF;AAAA;AAAA;AAAA,oBACF;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO,IAAI;AAAA,wBACX,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA,qBACF;AAAA,kBAEA,oBAAC,OAAI,IAAG,KAAI,OAAM,QAChB;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,yBAAyB,EAAE,QAAQ,KAAK;AAAA;AAAA,kBAC1C,GACF;AAAA;AAAA;AAAA,YACF;AAAA,YACC;AAAA;AAAA;AAAA,MACH,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,KAAI;AAAA,UACJ,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,OAAM;AAAA,UAEN;AAAA,gCAAC,WAAQ,SAAQ,YAAW,oFAAe;AAAA,YAC3C;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,SAAQ;AAAA,gBACR,QAAO;AAAA,gBAEN;AAAA;AAAA;AAAA,YAEH;AAAA,YACA,oBAAC,UAAO,SAAS,YAAY,MAAK,SAAQ,sCAE1C;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -1,352 +0,0 @@
1
- import {
2
- Popover
3
- } from "./chunk-5AVBYDPB.js";
4
- import {
5
- ScrollArea
6
- } from "./chunk-MUPK4L3U.js";
7
- import {
8
- Grid
9
- } from "./chunk-EGEQY3KT.js";
10
- import {
11
- AutoSizingInput
12
- } from "./chunk-XTHDFSN3.js";
13
- import {
14
- Badge
15
- } from "./chunk-FCIHNIOH.js";
16
- import {
17
- Typo
18
- } from "./chunk-LH57PIY2.js";
19
- import {
20
- Flex
21
- } from "./chunk-25HMMI7R.js";
22
- import {
23
- Button
24
- } from "./chunk-AFPH32MF.js";
25
- import {
26
- CheckIcon
27
- } from "./chunk-HLFG5ZTU.js";
28
-
29
- // src/molecules/tag-selector.tsx
30
- import {
31
- useCallback,
32
- useEffect,
33
- useMemo,
34
- useRef,
35
- useState
36
- } from "react";
37
- import {
38
- ChevronRightIcon,
39
- Cross1Icon,
40
- MagnifyingGlassIcon
41
- } from "@radix-ui/react-icons";
42
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
43
- var OPTION_HEIGHT = 32;
44
- var DefaultDropdownContainer = (props) => {
45
- return props.children;
46
- };
47
- function TagSelector(props) {
48
- const {
49
- options = [],
50
- tagRender,
51
- placeholder,
52
- maxCount = 0,
53
- DropdownContainer = DefaultDropdownContainer,
54
- size = "medium",
55
- readOnly,
56
- error,
57
- open: propsOpen,
58
- dropdownItemRender
59
- } = props;
60
- const [_selected, _setSelected] = useState(props.selected || []);
61
- const selected = props.selected || _selected;
62
- const setSelected = props.onChange || _setSelected;
63
- const [value, setValue] = useState("");
64
- const [focusIndex, setFocusIndex] = useState(null);
65
- const [open, setOpen] = useState(false);
66
- const [focus, setFocus] = useState(false);
67
- const fieldRef = useRef(null);
68
- const scrollRef = useRef(null);
69
- const closeRef = useRef();
70
- const onFocus = useCallback(() => {
71
- clearTimeout(closeRef.current);
72
- setFocus(true);
73
- setOpen(true);
74
- }, []);
75
- const onBlur = useCallback(() => {
76
- closeRef.current = setTimeout(() => {
77
- setFocus(false);
78
- setOpen(false);
79
- setTimeout(() => {
80
- setValue("");
81
- }, 100);
82
- }, 300);
83
- }, []);
84
- const onChangeValue = useCallback(
85
- (e) => {
86
- setValue(e.target.value);
87
- },
88
- []
89
- );
90
- const filteredOptions = useMemo(() => {
91
- return options.filter((option) => {
92
- return option.name.includes(value);
93
- });
94
- }, [options, value]);
95
- const selectedItem = useMemo(() => {
96
- const result = [];
97
- selected.forEach((id) => {
98
- const maybeItem = options.find((option) => option.id === id);
99
- if (maybeItem) result.push(maybeItem);
100
- });
101
- return result;
102
- }, [options, selected]);
103
- const onDelete = useCallback(
104
- (id) => {
105
- setSelected(selected.filter((el) => el !== id));
106
- },
107
- [selected, setSelected]
108
- );
109
- const onSelect = useCallback(
110
- (id) => {
111
- if (maxCount && selected.length + 1 > maxCount) return;
112
- setSelected([...selected, id]);
113
- },
114
- [maxCount, selected, setSelected]
115
- );
116
- const toggleItem = useCallback(
117
- (id) => {
118
- if (selected.includes(id)) {
119
- onDelete(id);
120
- } else {
121
- onSelect(id);
122
- }
123
- },
124
- [onDelete, onSelect, selected]
125
- );
126
- const setScroll = useCallback((index) => {
127
- if (scrollRef.current) {
128
- const scrollTop = scrollRef.current.scrollTop;
129
- const clientHeight = scrollRef.current.clientHeight;
130
- const focusTop = index * OPTION_HEIGHT;
131
- if (focusTop < scrollTop) {
132
- scrollRef.current.scrollTop = focusTop;
133
- } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {
134
- scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;
135
- }
136
- }
137
- }, []);
138
- const handleKeyDown = useCallback(
139
- (e) => {
140
- var _a;
141
- const key = e.key;
142
- switch (key) {
143
- case "ArrowDown": {
144
- e.preventDefault();
145
- let newFocus = 0;
146
- if (typeof focusIndex === "number") {
147
- newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;
148
- }
149
- setFocusIndex(newFocus);
150
- setScroll(newFocus);
151
- break;
152
- }
153
- case "ArrowUp": {
154
- e.preventDefault();
155
- let newFocus = 0;
156
- if (typeof focusIndex === "number") {
157
- newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;
158
- }
159
- setFocusIndex(newFocus);
160
- setScroll(newFocus);
161
- break;
162
- }
163
- case "Enter":
164
- setValue("");
165
- if (focusIndex !== null) {
166
- toggleItem((_a = filteredOptions[focusIndex]) == null ? void 0 : _a.id);
167
- }
168
- break;
169
- case "Backspace":
170
- if (value.length === 0) {
171
- setSelected(selected.slice(0, -1));
172
- }
173
- break;
174
- case "Escape":
175
- setOpen(false);
176
- break;
177
- }
178
- },
179
- [
180
- focusIndex,
181
- value.length,
182
- setScroll,
183
- options.length,
184
- toggleItem,
185
- filteredOptions,
186
- setSelected,
187
- selected
188
- ]
189
- );
190
- const placeholderVisible = useMemo(() => {
191
- if (selectedItem.length) return false;
192
- if (value) return false;
193
- if (focus) return false;
194
- return true;
195
- }, [focus, selectedItem.length, value]);
196
- useEffect(() => {
197
- setFocusIndex(null);
198
- }, [open]);
199
- useEffect(() => {
200
- setFocusIndex(0);
201
- }, [filteredOptions]);
202
- const badgeSize = useMemo(() => {
203
- switch (size) {
204
- case "large":
205
- return "large";
206
- case "medium":
207
- case "small":
208
- default:
209
- return "small";
210
- }
211
- }, [size]);
212
- const placeholderVariant = useMemo(() => {
213
- switch (size) {
214
- case "large":
215
- return "subtitle";
216
- case "medium":
217
- default:
218
- return "body";
219
- }
220
- }, [size]);
221
- const focusClassName = focus ? " focused" : "";
222
- const readOnlyClassName = readOnly ? " read-only" : "";
223
- const errorClassName = error ? " error" : "";
224
- const readonlyContent = /* @__PURE__ */ jsx(Flex, { gap: "1", children: selectedItem.map((item) => {
225
- return tagRender ? tagRender(item) : /* @__PURE__ */ jsx(Badge, { size: badgeSize, children: item.name }, item.id);
226
- }) });
227
- const editContent = /* @__PURE__ */ jsxs(Fragment, { children: [
228
- /* @__PURE__ */ jsxs(
229
- Flex,
230
- {
231
- align: "center",
232
- gap: "1",
233
- maxWidth: "100%",
234
- overflow: "hidden",
235
- wrap: "wrap",
236
- children: [
237
- selectedItem.map((item) => {
238
- return tagRender ? tagRender(item, () => {
239
- onDelete(item.id);
240
- }) : /* @__PURE__ */ jsxs(Badge, { size: badgeSize, children: [
241
- item.name,
242
- /* @__PURE__ */ jsx(
243
- Button,
244
- {
245
- onClick: () => {
246
- onDelete(item.id);
247
- },
248
- variant: "transparent",
249
- children: /* @__PURE__ */ jsx(Cross1Icon, {})
250
- }
251
- )
252
- ] }, item.id);
253
- }),
254
- placeholderVisible ? /* @__PURE__ */ jsx(Typo, { color: "gray", variant: placeholderVariant, children: placeholder }) : null,
255
- /* @__PURE__ */ jsx(
256
- AutoSizingInput,
257
- {
258
- onBlur,
259
- onChange: onChangeValue,
260
- onFocus,
261
- onKeyDown: handleKeyDown,
262
- ref: fieldRef,
263
- value
264
- }
265
- )
266
- ]
267
- }
268
- ),
269
- focus ? /* @__PURE__ */ jsx(MagnifyingGlassIcon, {}) : /* @__PURE__ */ jsx(ChevronRightIcon, {})
270
- ] });
271
- return /* @__PURE__ */ jsxs(Popover.Root, { open: Boolean(filteredOptions.length) && propsOpen || open, children: [
272
- /* @__PURE__ */ jsx(Popover.Trigger, { style: { position: "relative" }, children: /* @__PURE__ */ jsx(
273
- Grid,
274
- {
275
- align: "center",
276
- className: `tag-selector ${size} ${focusClassName}${readOnlyClassName}${errorClassName}`,
277
- columns: "1fr auto",
278
- gap: "1",
279
- onClick: () => {
280
- var _a;
281
- return !readOnly && ((_a = fieldRef.current) == null ? void 0 : _a.focus());
282
- },
283
- children: readOnly ? readonlyContent : editContent
284
- }
285
- ) }),
286
- /* @__PURE__ */ jsx(
287
- Popover.Content,
288
- {
289
- onOpenAutoFocus: preventDefault,
290
- onTouchMove: stopPropagationTouch,
291
- onWheel: stopPropagationWheel,
292
- sticky: "always",
293
- children: /* @__PURE__ */ jsx(
294
- DropdownContainer,
295
- {
296
- currentItem: filteredOptions[focusIndex || 0],
297
- items: filteredOptions,
298
- children: /* @__PURE__ */ jsx(
299
- ScrollArea,
300
- {
301
- ref: scrollRef,
302
- scrollbars: "vertical",
303
- style: { height: OPTION_HEIGHT * 8 },
304
- type: "auto",
305
- children: /* @__PURE__ */ jsx(Flex, { direction: "column", children: filteredOptions.map((item, i) => {
306
- const isSelected = Boolean(
307
- selected.find((el) => el === item.id)
308
- );
309
- const isFocus = i === focusIndex;
310
- return /* @__PURE__ */ jsx(
311
- Button,
312
- {
313
- className: `tag-selector-button ${isFocus ? "focused" : ""}`,
314
- onClick: () => {
315
- var _a;
316
- toggleItem(item.id);
317
- (_a = fieldRef.current) == null ? void 0 : _a.focus();
318
- },
319
- onMouseEnter: () => {
320
- setFocusIndex(i);
321
- },
322
- variant: isSelected ? "soft" : "outline",
323
- children: /* @__PURE__ */ jsxs(Flex, { justify: "between", width: "100%", children: [
324
- dropdownItemRender ? dropdownItemRender(item) : item.name,
325
- isSelected ? /* @__PURE__ */ jsx(CheckIcon, {}) : null
326
- ] })
327
- },
328
- item.id
329
- );
330
- }) })
331
- }
332
- )
333
- }
334
- )
335
- }
336
- )
337
- ] });
338
- }
339
- var stopPropagationTouch = (e) => {
340
- e.stopPropagation();
341
- };
342
- var stopPropagationWheel = (e) => {
343
- e.stopPropagation();
344
- };
345
- var preventDefault = (e) => {
346
- e.preventDefault();
347
- };
348
-
349
- export {
350
- TagSelector
351
- };
352
- //# sourceMappingURL=chunk-FV26PAOO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/molecules/tag-selector.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n ChevronRightIcon,\n Cross1Icon,\n MagnifyingGlassIcon,\n} from '@radix-ui/react-icons';\nimport { Popover } from '../atoms/popover';\nimport { Flex } from '../atoms/flex';\nimport { Button } from '../atoms/button';\nimport type { BadgeProps } from '../atoms/badge';\nimport { Badge } from '../atoms/badge';\nimport { CheckIcon } from '../icon';\nimport { ScrollArea } from '../atoms/scroll-area';\nimport { Grid } from '../atoms/grid';\nimport type { TypoProps } from '../atoms';\nimport { AutoSizingInput, Typo } from '../atoms';\n\ntype ID = string;\ninterface Item {\n name: string;\n id: ID;\n}\n\nconst OPTION_HEIGHT = 32;\n\nexport interface TagSelectorProps<T extends Item> {\n options?: T[];\n selected?: ID[];\n placeholder?: string;\n disabled?: boolean;\n maxCount?: number;\n style?: React.CSSProperties;\n size?: 'large' | 'medium' | 'small';\n readOnly?: boolean;\n error?: boolean;\n\n onChange?: (selected: ID[]) => void;\n tagRender?: (item: T, onClickDelete?: () => void) => React.ReactNode;\n DropdownContainer?: DropdownContainer<T>;\n open?: boolean;\n dropdownItemRender?: (item: T) => React.ReactNode;\n}\ntype DropdownContainer<T> = (props: {\n items: T[];\n children: React.ReactNode;\n currentItem?: T;\n}) => React.ReactNode;\n\nconst DefaultDropdownContainer = (props: {\n children: React.ReactNode;\n}): React.ReactNode => {\n return props.children;\n};\n\nexport function TagSelector<T extends Item>(\n props: TagSelectorProps<T>\n): React.ReactNode {\n const {\n options = [],\n tagRender,\n placeholder,\n maxCount = 0,\n DropdownContainer = DefaultDropdownContainer,\n size = 'medium',\n readOnly,\n error,\n open: propsOpen,\n dropdownItemRender,\n } = props;\n // eslint-disable-next-line react/hook-use-state -- props에 따라 미사용 상태가 될 수 있음\n const [_selected, _setSelected] = useState<string[]>(props.selected || []);\n const selected = props.selected || _selected;\n const setSelected: (v: ID[]) => void = props.onChange || _setSelected;\n const [value, setValue] = useState<string>('');\n const [focusIndex, setFocusIndex] = useState<number | null>(null);\n const [open, setOpen] = useState(false);\n const [focus, setFocus] = useState(false);\n const fieldRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const closeRef = useRef<ReturnType<typeof setTimeout>>();\n\n const onFocus = useCallback(() => {\n clearTimeout(closeRef.current);\n setFocus(true);\n setOpen(true);\n }, []);\n\n const onBlur = useCallback(() => {\n closeRef.current = setTimeout(() => {\n setFocus(false);\n setOpen(false);\n setTimeout(() => {\n setValue('');\n }, 100);\n }, 300);\n }, []);\n\n const onChangeValue = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n setValue(e.target.value);\n },\n []\n );\n\n const filteredOptions = useMemo<T[]>(() => {\n return options.filter((option) => {\n return option.name.includes(value);\n });\n }, [options, value]);\n\n const selectedItem = useMemo<T[]>(() => {\n const result = [] as T[];\n selected.forEach((id) => {\n const maybeItem = options.find((option) => option.id === id);\n if (maybeItem) result.push(maybeItem);\n });\n return result;\n }, [options, selected]);\n\n const onDelete = useCallback(\n (id: string) => {\n setSelected(selected.filter((el) => el !== id));\n },\n [selected, setSelected]\n );\n\n const onSelect = useCallback(\n (id: string) => {\n if (maxCount && selected.length + 1 > maxCount) return;\n setSelected([...selected, id]);\n },\n [maxCount, selected, setSelected]\n );\n\n const toggleItem = useCallback(\n (id: string) => {\n if (selected.includes(id)) {\n onDelete(id);\n } else {\n onSelect(id);\n }\n },\n [onDelete, onSelect, selected]\n );\n\n const setScroll = useCallback((index: number): void => {\n if (scrollRef.current) {\n const scrollTop = scrollRef.current.scrollTop;\n const clientHeight = scrollRef.current.clientHeight;\n const focusTop = index * OPTION_HEIGHT;\n if (focusTop < scrollTop) {\n scrollRef.current.scrollTop = focusTop;\n } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {\n scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;\n }\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const key = e.key;\n\n switch (key) {\n case 'ArrowDown': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'ArrowUp': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'Enter':\n setValue('');\n if (focusIndex !== null) {\n toggleItem(filteredOptions[focusIndex]?.id);\n }\n break;\n\n case 'Backspace':\n if (value.length === 0) {\n setSelected(selected.slice(0, -1));\n }\n break;\n\n case 'Escape':\n setOpen(false);\n break;\n }\n },\n [\n focusIndex,\n value.length,\n setScroll,\n options.length,\n toggleItem,\n filteredOptions,\n setSelected,\n selected,\n ]\n );\n\n const placeholderVisible = useMemo(() => {\n if (selectedItem.length) return false;\n if (value) return false;\n if (focus) return false;\n return true;\n }, [focus, selectedItem.length, value]);\n\n useEffect(() => {\n setFocusIndex(null);\n }, [open]);\n\n useEffect(() => {\n setFocusIndex(0);\n }, [filteredOptions]);\n\n const badgeSize = useMemo<BadgeProps['size']>(() => {\n switch (size) {\n case 'large':\n return 'large';\n case 'medium':\n case 'small':\n default:\n return 'small';\n }\n }, [size]);\n\n const placeholderVariant = useMemo<TypoProps['variant']>(() => {\n switch (size) {\n case 'large':\n return 'subtitle';\n case 'medium':\n default:\n return 'body';\n }\n }, [size]);\n\n const focusClassName = focus ? ' focused' : '';\n const readOnlyClassName = readOnly ? ' read-only' : '';\n const errorClassName = error ? ' error' : '';\n\n const readonlyContent = (\n <Flex gap=\"1\">\n {selectedItem.map((item) => {\n return tagRender ? (\n tagRender(item)\n ) : (\n <Badge key={item.id} size={badgeSize}>\n {item.name}\n </Badge>\n );\n })}\n </Flex>\n );\n\n const editContent = (\n <>\n <Flex\n align=\"center\"\n gap=\"1\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n wrap=\"wrap\"\n >\n {selectedItem.map((item) => {\n return tagRender ? (\n tagRender(item, () => {\n onDelete(item.id);\n })\n ) : (\n <Badge key={item.id} size={badgeSize}>\n {item.name}\n <Button\n onClick={() => {\n onDelete(item.id);\n }}\n variant=\"transparent\"\n >\n <Cross1Icon />\n </Button>\n </Badge>\n );\n })}\n {placeholderVisible ? (\n <Typo color=\"gray\" variant={placeholderVariant}>\n {placeholder}\n </Typo>\n ) : null}\n <AutoSizingInput\n onBlur={onBlur}\n onChange={onChangeValue}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n ref={fieldRef}\n value={value}\n />\n </Flex>\n {focus ? <MagnifyingGlassIcon /> : <ChevronRightIcon />}\n </>\n );\n return (\n <Popover.Root open={(Boolean(filteredOptions.length) && propsOpen) || open}>\n <Popover.Trigger style={{ position: 'relative' }}>\n <Grid\n align=\"center\"\n className={`tag-selector ${size} ${focusClassName}${readOnlyClassName}${errorClassName}`}\n columns=\"1fr auto\"\n gap=\"1\"\n onClick={() => !readOnly && fieldRef.current?.focus()}\n >\n {readOnly ? readonlyContent : editContent}\n </Grid>\n </Popover.Trigger>\n\n <Popover.Content\n onOpenAutoFocus={preventDefault}\n onTouchMove={stopPropagationTouch}\n onWheel={stopPropagationWheel}\n sticky=\"always\"\n >\n <DropdownContainer\n currentItem={filteredOptions[focusIndex || 0]}\n items={filteredOptions}\n >\n <ScrollArea\n ref={scrollRef}\n scrollbars=\"vertical\"\n style={{ height: OPTION_HEIGHT * 8 }}\n type=\"auto\"\n >\n <Flex direction=\"column\">\n {filteredOptions.map((item, i) => {\n const isSelected = Boolean(\n selected.find((el) => el === item.id)\n );\n const isFocus = i === focusIndex;\n\n return (\n <Button\n className={`tag-selector-button ${isFocus ? 'focused' : ''}`}\n key={item.id}\n onClick={() => {\n toggleItem(item.id);\n fieldRef.current?.focus();\n }}\n onMouseEnter={() => {\n setFocusIndex(i);\n }}\n variant={isSelected ? 'soft' : 'outline'}\n >\n <Flex justify=\"between\" width=\"100%\">\n {dropdownItemRender\n ? dropdownItemRender(item)\n : item.name}\n {isSelected ? <CheckIcon /> : null}\n </Flex>\n </Button>\n );\n })}\n </Flex>\n </ScrollArea>\n </DropdownContainer>\n </Popover.Content>\n </Popover.Root>\n );\n}\n\nconst stopPropagationTouch: React.TouchEventHandler<HTMLDivElement> = (\n e\n): void => {\n e.stopPropagation();\n};\n\nconst stopPropagationWheel: React.WheelEventHandler<HTMLDivElement> = (\n e\n): void => {\n e.stopPropagation();\n};\n\nconst preventDefault = (e: Event): void => {\n e.preventDefault();\n};\n"],"mappings":"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","names":[]}
@@ -1,101 +0,0 @@
1
- import {
2
- Heading
3
- } from "./chunk-3IT3NVK6.js";
4
- import {
5
- IconButton
6
- } from "./chunk-O3DNDMV3.js";
7
- import {
8
- Flex
9
- } from "./chunk-25HMMI7R.js";
10
- import {
11
- ChevronLeftIcon,
12
- ChevronRightIcon
13
- } from "./chunk-HLFG5ZTU.js";
14
- import {
15
- __objRest,
16
- __spreadProps,
17
- __spreadValues
18
- } from "./chunk-2NMEKWO5.js";
19
-
20
- // src/molecules/date-picker/index.tsx
21
- import { forwardRef } from "react";
22
- import * as RDP from "react-datepicker";
23
- import { registerLocale, setDefaultLocale } from "react-datepicker";
24
- import { ko as fnKo } from "date-fns/locale";
25
- import { jsx, jsxs } from "react/jsx-runtime";
26
- registerLocale("ko", fnKo);
27
- setDefaultLocale("ko");
28
- var ReactDatePicker = RDP.default.default || RDP.default || RDP;
29
- var DatePicker = forwardRef(
30
- (props, ref) => {
31
- const _a = props, { fullWidth } = _a, rest = __objRest(_a, ["fullWidth"]);
32
- const fullWidthClassName = fullWidth ? "full-width" : "";
33
- return /* @__PURE__ */ jsx(Flex, { p: "0", width: "100%", children: /* @__PURE__ */ jsx(
34
- ReactDatePicker,
35
- __spreadProps(__spreadValues({
36
- dateFormat: "YYYY/MM/dd",
37
- nextMonthButtonLabel: "\uB2E4\uC74C \uB2EC",
38
- placeholderText: "YYYY/mm/dd",
39
- popperProps: { strategy: "fixed" },
40
- previousMonthButtonLabel: "\uC774\uC804 \uB2EC",
41
- ref,
42
- renderCustomHeader,
43
- showPopperArrow: false,
44
- timeIntervals: 10
45
- }, rest), {
46
- calendarClassName: `tipp_datePicker_calendar ${rest.calendarClassName || ""}`,
47
- timeCaption: "\uC2DC\uAC04",
48
- wrapperClassName: `tipp_datePicker ${fullWidthClassName} ${rest.wrapperClassName || ""}`
49
- })
50
- ) });
51
- }
52
- );
53
- DatePicker.displayName = "DatePicker";
54
- var renderCustomHeader = (props) => {
55
- const {
56
- date,
57
- decreaseMonth,
58
- increaseMonth,
59
- prevMonthButtonDisabled,
60
- nextMonthButtonDisabled
61
- } = props;
62
- const year = date ? new Date(date).getFullYear() : "-";
63
- const month = date ? new Date(date).getMonth() + 1 : "-";
64
- return /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "between", pb: "2", pl: "2", pr: "2", children: [
65
- /* @__PURE__ */ jsx(
66
- IconButton,
67
- {
68
- disabled: prevMonthButtonDisabled,
69
- onClick: decreaseMonth,
70
- type: "button",
71
- variant: "ghost",
72
- children: /* @__PURE__ */ jsx(ChevronLeftIcon, {})
73
- }
74
- ),
75
- /* @__PURE__ */ jsxs(Flex, { gap: "3", children: [
76
- /* @__PURE__ */ jsxs(Heading, { variant: "heading4", weight: "regular", children: [
77
- year,
78
- "\uB144"
79
- ] }),
80
- /* @__PURE__ */ jsxs(Heading, { variant: "heading4", weight: "regular", children: [
81
- month,
82
- "\uC6D4"
83
- ] })
84
- ] }),
85
- /* @__PURE__ */ jsx(
86
- IconButton,
87
- {
88
- disabled: nextMonthButtonDisabled,
89
- onClick: increaseMonth,
90
- type: "button",
91
- variant: "ghost",
92
- children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
93
- }
94
- )
95
- ] });
96
- };
97
-
98
- export {
99
- DatePicker
100
- };
101
- //# sourceMappingURL=chunk-GSU262TZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/molecules/date-picker/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- ReactPicker의 렌더러가 object를 return함 버그를 해결하기 위해 강제 assertion 사용 */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access -- ReactPicker의 렌더러가 object를 return함 버그를 해결하기 위해 강제 assertion 사용 */\nimport type { ElementRef } from 'react';\nimport React, { forwardRef } from 'react';\nimport type { DatePickerProps as ReactDatePickerProps } from 'react-datepicker';\nimport * as RDP from 'react-datepicker';\nimport { registerLocale, setDefaultLocale } from 'react-datepicker';\nimport { ko as fnKo } from 'date-fns/locale';\nimport { IconButton } from '../../atoms/icon-button';\nimport { Flex } from '../../atoms/flex';\nimport { ChevronLeftIcon, ChevronRightIcon } from '../../icon';\nimport { Heading } from '../../atoms/heading';\n\nregisterLocale('ko', fnKo);\nsetDefaultLocale('ko');\n\nexport type DatePickerProps = ReactDatePickerProps & {\n fullWidth?: boolean;\n};\ntype DatePickerRef = ElementRef<typeof ReactDatePicker>;\n\nconst ReactDatePicker = ((RDP.default as any).default ||\n (RDP.default as any) ||\n (RDP as any)) as typeof RDP.default;\n\nexport const DatePicker = forwardRef<DatePickerRef, DatePickerProps>(\n (props, ref): React.ReactNode => {\n const { fullWidth, ...rest } = props;\n const fullWidthClassName = fullWidth ? 'full-width' : '';\n return (\n <Flex p=\"0\" width=\"100%\">\n <ReactDatePicker\n dateFormat=\"YYYY/MM/dd\"\n nextMonthButtonLabel=\"다음 달\"\n placeholderText=\"YYYY/mm/dd\"\n popperProps={{ strategy: 'fixed' }}\n previousMonthButtonLabel=\"이전 달\"\n ref={ref}\n renderCustomHeader={renderCustomHeader}\n showPopperArrow={false}\n timeIntervals={10}\n {...rest}\n calendarClassName={`tipp_datePicker_calendar ${rest.calendarClassName || ''}`}\n timeCaption=\"시간\"\n wrapperClassName={`tipp_datePicker ${fullWidthClassName} ${rest.wrapperClassName || ''}`}\n />\n </Flex>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n\nconst renderCustomHeader: ReactDatePickerProps['renderCustomHeader'] = (\n props\n) => {\n const {\n date,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n } = props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- date가 undefined일 수 있음\n const year = date ? new Date(date).getFullYear() : '-';\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- date가 undefined일 수 있음\n const month = date ? new Date(date).getMonth() + 1 : '-';\n\n return (\n <Flex align=\"center\" justify=\"between\" pb=\"2\" pl=\"2\" pr=\"2\">\n <IconButton\n disabled={prevMonthButtonDisabled}\n onClick={decreaseMonth}\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronLeftIcon />\n </IconButton>\n <Flex gap=\"3\">\n <Heading variant=\"heading4\" weight=\"regular\">\n {year}년\n </Heading>\n <Heading variant=\"heading4\" weight=\"regular\">\n {month}월\n </Heading>\n </Flex>\n\n <IconButton\n disabled={nextMonthButtonDisabled}\n onClick={increaseMonth}\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronRightIcon />\n </IconButton>\n </Flex>\n );\n};\n\n// DatePicker.displayName = 'DatePicker';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGA,SAAgB,kBAAkB;AAElC,YAAY,SAAS;AACrB,SAAS,gBAAgB,wBAAwB;AACjD,SAAS,MAAM,YAAY;AAwBnB,cAiDA,YAjDA;AAlBR,eAAe,MAAM,IAAI;AACzB,iBAAiB,IAAI;AAOrB,IAAM,kBAAwB,YAAgB,WACvC,eACJ;AAEI,IAAM,aAAa;AAAA,EACxB,CAAC,OAAO,QAAyB;AAC/B,UAA+B,YAAvB,YA3BZ,IA2BmC,IAAT,iBAAS,IAAT,CAAd;AACR,UAAM,qBAAqB,YAAY,eAAe;AACtD,WACE,oBAAC,QAAK,GAAE,KAAI,OAAM,QAChB;AAAA,MAAC;AAAA;AAAA,QACC,YAAW;AAAA,QACX,sBAAqB;AAAA,QACrB,iBAAgB;AAAA,QAChB,aAAa,EAAE,UAAU,QAAQ;AAAA,QACjC,0BAAyB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,eAAe;AAAA,SACX,OAVL;AAAA,QAWC,mBAAmB,4BAA4B,KAAK,qBAAqB,EAAE;AAAA,QAC3E,aAAY;AAAA,QACZ,kBAAkB,mBAAmB,kBAAkB,IAAI,KAAK,oBAAoB,EAAE;AAAA;AAAA,IACxF,GACF;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAEzB,IAAM,qBAAiE,CACrE,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,OAAO,OAAO,IAAI,KAAK,IAAI,EAAE,YAAY,IAAI;AAEnD,QAAM,QAAQ,OAAO,IAAI,KAAK,IAAI,EAAE,SAAS,IAAI,IAAI;AAErD,SACE,qBAAC,QAAK,OAAM,UAAS,SAAQ,WAAU,IAAG,KAAI,IAAG,KAAI,IAAG,KACtD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAK;AAAA,QACL,SAAQ;AAAA,QAER,8BAAC,mBAAgB;AAAA;AAAA,IACnB;AAAA,IACA,qBAAC,QAAK,KAAI,KACR;AAAA,2BAAC,WAAQ,SAAQ,YAAW,QAAO,WAChC;AAAA;AAAA,QAAK;AAAA,SACR;AAAA,MACA,qBAAC,WAAQ,SAAQ,YAAW,QAAO,WAChC;AAAA;AAAA,QAAM;AAAA,SACT;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAK;AAAA,QACL,SAAQ;AAAA,QAER,8BAAC,oBAAiB;AAAA;AAAA,IACpB;AAAA,KACF;AAEJ;","names":[]}