@weing-dev/ui-kit-primitive 0.0.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.
Files changed (328) hide show
  1. package/README.md +50 -0
  2. package/eslint.config.js +29 -0
  3. package/index.html +13 -0
  4. package/package.json +75 -0
  5. package/public/static/icon/Add.svg +1 -0
  6. package/public/static/icon/ApprovalInactive.svg +1 -0
  7. package/public/static/icon/ArrowRight.svg +5 -0
  8. package/public/static/icon/Cancle Filled.svg +1 -0
  9. package/public/static/icon/Cancle.svg +1 -0
  10. package/public/static/icon/Cart Filled.svg +1 -0
  11. package/public/static/icon/Cart.svg +1 -0
  12. package/public/static/icon/Check.svg +1 -0
  13. package/public/static/icon/CheckBoxRound.svg +3 -0
  14. package/public/static/icon/Company.svg +1 -0
  15. package/public/static/icon/DragHandle.svg +1 -0
  16. package/public/static/icon/Eco.svg +1 -0
  17. package/public/static/icon/EditSquare.svg +1 -0
  18. package/public/static/icon/Error Filled.svg +1 -0
  19. package/public/static/icon/Error.svg +1 -0
  20. package/public/static/icon/File Upload.svg +1 -0
  21. package/public/static/icon/FilecheckInactive.svg +1 -0
  22. package/public/static/icon/Go Before.svg +1 -0
  23. package/public/static/icon/Go Next.svg +1 -0
  24. package/public/static/icon/Hamburger Menu.svg +1 -0
  25. package/public/static/icon/ImagecheckPlay.svg +4 -0
  26. package/public/static/icon/Kakao Talk.svg +1 -0
  27. package/public/static/icon/Minus.svg +1 -0
  28. package/public/static/icon/Naver Blog.svg +1 -0
  29. package/public/static/icon/Naver.svg +1 -0
  30. package/public/static/icon/OrderApprove.svg +1 -0
  31. package/public/static/icon/OrderInactive.svg +1 -0
  32. package/public/static/icon/OrderPlay.svg +1 -0
  33. package/public/static/icon/PayApprove.svg +1 -0
  34. package/public/static/icon/PayInactive.svg +1 -0
  35. package/public/static/icon/PrintInactive.svg +1 -0
  36. package/public/static/icon/PrintPlay.svg +1 -0
  37. package/public/static/icon/Search.svg +1 -0
  38. package/public/static/icon/ShippingDone.svg +1 -0
  39. package/public/static/icon/Support Agent.svg +1 -0
  40. package/public/static/icon/Task.svg +1 -0
  41. package/public/static/icon/User.svg +1 -0
  42. package/public/static/icon/Warning Filled.svg +1 -0
  43. package/public/static/icon/Warning.svg +1 -0
  44. package/public/static/icon/add_a_photo.svg +3 -0
  45. package/public/static/icon/attach_file.svg +1 -0
  46. package/public/static/icon/check_circle.svg +1 -0
  47. package/public/static/icon/close.svg +1 -0
  48. package/public/static/icon/download.svg +1 -0
  49. package/public/static/icon/expand all.svg +1 -0
  50. package/public/static/icon/expand_less.svg +1 -0
  51. package/public/static/icon/expand_more.svg +1 -0
  52. package/public/static/icon/factory.svg +1 -0
  53. package/public/static/icon/inventory.svg +1 -0
  54. package/public/static/icon/listAll.svg +1 -0
  55. package/public/static/icon/local_shipping.svg +1 -0
  56. package/public/static/icon/logout.svg +1 -0
  57. package/public/static/icon/menu.svg +1 -0
  58. package/public/static/icon/mode_edit.svg +4 -0
  59. package/public/static/icon/more.svg +1 -0
  60. package/public/static/icon/outward.svg +1 -0
  61. package/public/static/icon/personcard.svg +1 -0
  62. package/public/static/icon/product.svg +1 -0
  63. package/public/static/icon/settings.svg +1 -0
  64. package/public/static/icon/swap_vert.svg +3 -0
  65. package/public/static/icon/upload.svg +1 -0
  66. package/public/static/icon/warning_amber.svg +3 -0
  67. package/public/static/image/Thumbnail.png +0 -0
  68. package/public/vite.svg +1 -0
  69. package/public/weing_logo_final.png +0 -0
  70. package/scripts/icons/setIcon.cjs +151 -0
  71. package/scripts/icons/svg-template.cjs +18 -0
  72. package/scripts/icons/svgo-config.json +9 -0
  73. package/scripts/icons/svgr-config.json +16 -0
  74. package/src/@types/color.d.ts +51 -0
  75. package/src/@types/common.d.ts +6 -0
  76. package/src/@types/extends/react.extends.d.ts +7 -0
  77. package/src/@types/quill-image-resize-module-react/index.d.ts +1 -0
  78. package/src/App.css +0 -0
  79. package/src/App.tsx +84 -0
  80. package/src/assets/react.svg +1 -0
  81. package/src/components/Accordion/Accordion.context.tsx +62 -0
  82. package/src/components/Accordion/Accordion.module.scss +163 -0
  83. package/src/components/Accordion/Accordion.tsx +242 -0
  84. package/src/components/Accordion/README.md +408 -0
  85. package/src/components/Accordion/images/as_trigger.gif +0 -0
  86. package/src/components/Accordion/images/closed.png +0 -0
  87. package/src/components/Accordion/images/open.png +0 -0
  88. package/src/components/Accordion/images/thumbnail1.png +0 -0
  89. package/src/components/Accordion/images/thumbnail2.png +0 -0
  90. package/src/components/Accordion/images/thumbnail3.png +0 -0
  91. package/src/components/Avatar/Avatar.module.scss +47 -0
  92. package/src/components/Avatar/Avatar.tsx +230 -0
  93. package/src/components/Avatar/README.md +333 -0
  94. package/src/components/Badge/Badge.module.scss +49 -0
  95. package/src/components/Badge/Badge.tsx +87 -0
  96. package/src/components/Badge/README.md +223 -0
  97. package/src/components/BarCode/BarCode.module.scss +0 -0
  98. package/src/components/BarCode/BarCode.tsx +153 -0
  99. package/src/components/Breadcrumb/Breadcrumb.module.scss +36 -0
  100. package/src/components/Breadcrumb/Breadcrumb.tsx +114 -0
  101. package/src/components/Breadcrumb/README.md +339 -0
  102. package/src/components/Button/Button.colors.tsx +322 -0
  103. package/src/components/Button/Button.context.tsx +47 -0
  104. package/src/components/Button/Button.module.scss +156 -0
  105. package/src/components/Button/Button.tsx +190 -0
  106. package/src/components/Button/Button.type.ts +11 -0
  107. package/src/components/Calendar/Calendar.context.tsx +138 -0
  108. package/src/components/Calendar/Calendar.module.scss +116 -0
  109. package/src/components/Calendar/Calendar.tsx +440 -0
  110. package/src/components/Calendar/dayjs.util.ts +312 -0
  111. package/src/components/Cascader/Cacader.data.ts +1185 -0
  112. package/src/components/Cascader/Cascader.context.tsx +61 -0
  113. package/src/components/Cascader/Cascader.hook.ts +502 -0
  114. package/src/components/Cascader/Cascader.module.scss +143 -0
  115. package/src/components/Cascader/Cascader.tsx +281 -0
  116. package/src/components/Cascader/README.md +735 -0
  117. package/src/components/Chart/Chart.module.scss +0 -0
  118. package/src/components/Chart/Chart.tsx +230 -0
  119. package/src/components/Chart/README.md +85 -0
  120. package/src/components/Chart/images/barChart.png +0 -0
  121. package/src/components/Chips/Chips.colors.tsx +185 -0
  122. package/src/components/Chips/Chips.module.scss +49 -0
  123. package/src/components/Chips/Chips.tsx +78 -0
  124. package/src/components/Comment/Comment.module.scss +14 -0
  125. package/src/components/Comment/Comment.tsx +105 -0
  126. package/src/components/Dialog/Dialog.module.scss +0 -0
  127. package/src/components/Dialog/Dialog.tsx +12 -0
  128. package/src/components/Divider/Divider.module.scss +12 -0
  129. package/src/components/Divider/Divider.tsx +33 -0
  130. package/src/components/Editor/Editor.context.tsx +12 -0
  131. package/src/components/Editor/Editor.module.scss +40 -0
  132. package/src/components/Editor/Editor.tsx +174 -0
  133. package/src/components/Form/CheckBox/CheckBox.context.tsx +56 -0
  134. package/src/components/Form/CheckBox/CheckBox.module.scss +81 -0
  135. package/src/components/Form/CheckBox/CheckBox.tsx +196 -0
  136. package/src/components/Form/CheckBox/Checkbox.colors.tsx +42 -0
  137. package/src/components/Form/Dropdown/Dropdown.colors.tsx +125 -0
  138. package/src/components/Form/Dropdown/Dropdown.context.tsx +62 -0
  139. package/src/components/Form/Dropdown/Dropdown.module.scss +133 -0
  140. package/src/components/Form/Dropdown/Dropdown.tsx +404 -0
  141. package/src/components/Form/OTPInput/OTPInput.context.tsx +104 -0
  142. package/src/components/Form/OTPInput/OTPInput.module.scss +22 -0
  143. package/src/components/Form/OTPInput/OTPInput.tsx +67 -0
  144. package/src/components/Form/Radio/Radio.colors.tsx +42 -0
  145. package/src/components/Form/Radio/Radio.context.tsx +40 -0
  146. package/src/components/Form/Radio/Radio.module.scss +61 -0
  147. package/src/components/Form/Radio/Radio.tsx +174 -0
  148. package/src/components/Form/Switch/Switch.colors.tsx +42 -0
  149. package/src/components/Form/Switch/Switch.context.tsx +50 -0
  150. package/src/components/Form/Switch/Switch.module.scss +53 -0
  151. package/src/components/Form/Switch/Switch.tsx +151 -0
  152. package/src/components/Form/TextArea/TextArea.colors.tsx +76 -0
  153. package/src/components/Form/TextArea/TextArea.context.tsx +97 -0
  154. package/src/components/Form/TextArea/TextArea.module.scss +138 -0
  155. package/src/components/Form/TextArea/TextArea.tsx +246 -0
  156. package/src/components/Form/TextInput/TextInput.colors.tsx +76 -0
  157. package/src/components/Form/TextInput/TextInput.context.tsx +106 -0
  158. package/src/components/Form/TextInput/TextInput.module.scss +160 -0
  159. package/src/components/Form/TextInput/TextInput.tsx +225 -0
  160. package/src/components/GlobalStyle/GlobalStyle.tsx +20 -0
  161. package/src/components/HelperText/HelperText.module.scss +28 -0
  162. package/src/components/HelperText/HelperText.tsx +130 -0
  163. package/src/components/Icon/Icon.tsx +29 -0
  164. package/src/components/Icons/Add.tsx +20 -0
  165. package/src/components/Icons/AddAPhoto.tsx +21 -0
  166. package/src/components/Icons/ApprovalInactive.tsx +26 -0
  167. package/src/components/Icons/ArrowRight.tsx +24 -0
  168. package/src/components/Icons/AttachFile.tsx +20 -0
  169. package/src/components/Icons/Cancle.tsx +20 -0
  170. package/src/components/Icons/CancleFilled.tsx +20 -0
  171. package/src/components/Icons/Cart.tsx +20 -0
  172. package/src/components/Icons/CartFilled.tsx +20 -0
  173. package/src/components/Icons/Check.tsx +20 -0
  174. package/src/components/Icons/CheckBoxRound.tsx +21 -0
  175. package/src/components/Icons/CheckCircle.tsx +35 -0
  176. package/src/components/Icons/Close.tsx +20 -0
  177. package/src/components/Icons/Company.tsx +20 -0
  178. package/src/components/Icons/Download.tsx +20 -0
  179. package/src/components/Icons/DragHandle.tsx +20 -0
  180. package/src/components/Icons/Eco.tsx +20 -0
  181. package/src/components/Icons/EditSquare.tsx +20 -0
  182. package/src/components/Icons/Error.tsx +20 -0
  183. package/src/components/Icons/ErrorFilled.tsx +20 -0
  184. package/src/components/Icons/ExpandAll.tsx +20 -0
  185. package/src/components/Icons/ExpandLess.tsx +20 -0
  186. package/src/components/Icons/ExpandMore.tsx +20 -0
  187. package/src/components/Icons/Factory.tsx +20 -0
  188. package/src/components/Icons/FileUpload.tsx +20 -0
  189. package/src/components/Icons/FilecheckInactive.tsx +22 -0
  190. package/src/components/Icons/GoBefore.tsx +20 -0
  191. package/src/components/Icons/GoNext.tsx +20 -0
  192. package/src/components/Icons/HamburgerMenu.tsx +20 -0
  193. package/src/components/Icons/ImagecheckPlay.tsx +27 -0
  194. package/src/components/Icons/Inventory.tsx +20 -0
  195. package/src/components/Icons/KakaoTalk.tsx +22 -0
  196. package/src/components/Icons/ListAll.tsx +20 -0
  197. package/src/components/Icons/LocalShipping.tsx +20 -0
  198. package/src/components/Icons/Logout.tsx +20 -0
  199. package/src/components/Icons/Menu.tsx +20 -0
  200. package/src/components/Icons/Minus.tsx +18 -0
  201. package/src/components/Icons/ModeEdit.tsx +25 -0
  202. package/src/components/Icons/More.tsx +20 -0
  203. package/src/components/Icons/Naver.tsx +20 -0
  204. package/src/components/Icons/NaverBlog.tsx +22 -0
  205. package/src/components/Icons/OrderApprove.tsx +20 -0
  206. package/src/components/Icons/OrderInactive.tsx +20 -0
  207. package/src/components/Icons/OrderPlay.tsx +20 -0
  208. package/src/components/Icons/Outward.tsx +20 -0
  209. package/src/components/Icons/PayApprove.tsx +24 -0
  210. package/src/components/Icons/PayInactive.tsx +24 -0
  211. package/src/components/Icons/Personcard.tsx +20 -0
  212. package/src/components/Icons/PrintInactive.tsx +24 -0
  213. package/src/components/Icons/PrintPlay.tsx +24 -0
  214. package/src/components/Icons/Product.tsx +20 -0
  215. package/src/components/Icons/Search.tsx +20 -0
  216. package/src/components/Icons/Settings.tsx +20 -0
  217. package/src/components/Icons/ShippingDone.tsx +20 -0
  218. package/src/components/Icons/SupportAgent.tsx +20 -0
  219. package/src/components/Icons/SwapVert.tsx +21 -0
  220. package/src/components/Icons/Task.tsx +20 -0
  221. package/src/components/Icons/Upload.tsx +20 -0
  222. package/src/components/Icons/User.tsx +20 -0
  223. package/src/components/Icons/Warning.tsx +20 -0
  224. package/src/components/Icons/WarningAmber.tsx +21 -0
  225. package/src/components/Icons/WarningFilled.tsx +20 -0
  226. package/src/components/Icons/index.ts +62 -0
  227. package/src/components/LNB/LNB.context.tsx +32 -0
  228. package/src/components/LNB/LNB.module.scss +99 -0
  229. package/src/components/LNB/LNB.tsx +190 -0
  230. package/src/components/LNB/README.md +411 -0
  231. package/src/components/LNB/makeNavigation.ts +51 -0
  232. package/src/components/LNB/navigation.d.ts +15 -0
  233. package/src/components/LNB/navigation.json +211 -0
  234. package/src/components/Label/Label.colors.tsx +241 -0
  235. package/src/components/Label/Label.module.scss +31 -0
  236. package/src/components/Label/Label.tsx +54 -0
  237. package/src/components/LazyImage/LazyImage.module.scss +6 -0
  238. package/src/components/LazyImage/LazyImage.tsx +107 -0
  239. package/src/components/List/List.module.scss +81 -0
  240. package/src/components/List/List.tsx +91 -0
  241. package/src/components/List/README.md +87 -0
  242. package/src/components/MobilePicker/MobilePicker.context.tsx +22 -0
  243. package/src/components/MobilePicker/MobilePicker.module.scss +57 -0
  244. package/src/components/MobilePicker/MobilePicker.tsx +336 -0
  245. package/src/components/MobilePicker/README.md +159 -0
  246. package/src/components/Modal/Modal.tsx +77 -0
  247. package/src/components/Modal/README.md +130 -0
  248. package/src/components/Pagination/Pagination.colors.tsx +85 -0
  249. package/src/components/Pagination/Pagination.context.tsx +28 -0
  250. package/src/components/Pagination/Pagination.module.scss +60 -0
  251. package/src/components/Pagination/Pagination.tsx +234 -0
  252. package/src/components/Popup/Popup.context.tsx +15 -0
  253. package/src/components/Popup/Popup.module.scss +53 -0
  254. package/src/components/Popup/Popup.tsx +116 -0
  255. package/src/components/Popup/README.md +170 -0
  256. package/src/components/QRCode/QRCode.module.scss +2 -0
  257. package/src/components/QRCode/QRCode.tsx +61 -0
  258. package/src/components/ScrollCalendar/ScrollCalendar.context.tsx +26 -0
  259. package/src/components/ScrollCalendar/ScrollCalendar.module.scss +42 -0
  260. package/src/components/ScrollCalendar/ScrollCalendar.tsx +448 -0
  261. package/src/components/ScrollSpy/README.md +62 -0
  262. package/src/components/ScrollSpy/ScrollSpy.tsx +130 -0
  263. package/src/components/Sheet/README.md +92 -0
  264. package/src/components/Sheet/Sheet.context.tsx +23 -0
  265. package/src/components/Sheet/Sheet.module.scss +68 -0
  266. package/src/components/Sheet/Sheet.tsx +146 -0
  267. package/src/components/Slider/README.md +639 -0
  268. package/src/components/Slider/Slider.backup.tsx +477 -0
  269. package/src/components/Slider/Slider.context.tsx +67 -0
  270. package/src/components/Slider/Slider.module.scss +123 -0
  271. package/src/components/Slider/Slider.tsx +467 -0
  272. package/src/components/Stepper/README.md +320 -0
  273. package/src/components/Stepper/Stepper.context.tsx +49 -0
  274. package/src/components/Stepper/Stepper.module.scss +163 -0
  275. package/src/components/Stepper/Stepper.tsx +219 -0
  276. package/src/components/Tab/Tab.colors.tsx +54 -0
  277. package/src/components/Tab/Tab.context.tsx +64 -0
  278. package/src/components/Tab/Tab.module.scss +239 -0
  279. package/src/components/Tab/Tab.tsx +123 -0
  280. package/src/components/Tab/cx.ts +6 -0
  281. package/src/components/Table/README.md +162 -0
  282. package/src/components/Table/Table.context.tsx +23 -0
  283. package/src/components/Table/Table.hook.ts +51 -0
  284. package/src/components/Table/Table.module.scss +83 -0
  285. package/src/components/Table/Table.tsx +147 -0
  286. package/src/components/Thumbnail/README.md +302 -0
  287. package/src/components/Thumbnail/Thumbnail.context.tsx +42 -0
  288. package/src/components/Thumbnail/Thumbnail.module.scss +149 -0
  289. package/src/components/Thumbnail/Thumbnail.tsx +391 -0
  290. package/src/components/TimeInput/README.md +118 -0
  291. package/src/components/TimeInput/TimeInput.colors.tsx +76 -0
  292. package/src/components/TimeInput/TimeInput.context.tsx +58 -0
  293. package/src/components/TimeInput/TimeInput.module.scss +211 -0
  294. package/src/components/TimeInput/TimeInput.tsx +411 -0
  295. package/src/components/WeeklyCalendar/WeeklyCalendar.context.tsx +88 -0
  296. package/src/components/WeeklyCalendar/WeeklyCalendar.module.scss +225 -0
  297. package/src/components/WeeklyCalendar/WeeklyCalendar.tsx +772 -0
  298. package/src/components/WeeklyCalendar/dayjs.util.ts +336 -0
  299. package/src/components/WeeklyCalendar/weeklyCalendar.util.ts +583 -0
  300. package/src/components/WisywygEditor/Quill/Editor.tsx +148 -0
  301. package/src/constant/locale.constant.ts +6 -0
  302. package/src/globals.scss +80 -0
  303. package/src/hooks/useColorScheme.tsx +48 -0
  304. package/src/hooks/useElementRect.tsx +128 -0
  305. package/src/hooks/useIntersectionObserver.tsx +33 -0
  306. package/src/index.css +17 -0
  307. package/src/index.ts +187 -0
  308. package/src/main.tsx +10 -0
  309. package/src/styles/_fontSize.mixin.scss +57 -0
  310. package/src/styles/_fontWeight.mixin.scss +15 -0
  311. package/src/styles/_lineHeight.mixin.scss +57 -0
  312. package/src/styles/_scrollbar.mixin.scss +49 -0
  313. package/src/styles/baseColor.ts +297 -0
  314. package/src/styles/color.ts +272 -0
  315. package/src/styles/color2.ts +200 -0
  316. package/src/styles/scrollbar.README.md +72 -0
  317. package/src/styles/typography.scss +170 -0
  318. package/src/utils/aws.util.ts +180 -0
  319. package/src/utils/common.utill.ts +45 -0
  320. package/src/vite-env.d.ts +1 -0
  321. package/tsconfig.app.json +24 -0
  322. package/tsconfig.json +29 -0
  323. package/tsconfig.node.json +10 -0
  324. package/tsconfig.node.tsbuildinfo +1 -0
  325. package/tsconfig.tsbuildinfo +1 -0
  326. package/vite.config.d.ts +2 -0
  327. package/vite.config.js +47 -0
  328. package/vite.config.ts +50 -0
@@ -0,0 +1,242 @@
1
+ "use client";
2
+ /* eslint-disable react-refresh/only-export-components */
3
+ import React from "react";
4
+ import cn from "classnames/bind";
5
+ import styles from "./Accordion.module.scss";
6
+ import {
7
+ AccordionRootContext,
8
+ AccordionRootProvider,
9
+ AccordionsRootProviderProps,
10
+ } from "./Accordion.context";
11
+
12
+ import { Icon } from "../Icon/Icon";
13
+
14
+ const cx = cn.bind(styles);
15
+
16
+ type ItemProps = React.PropsWithChildren<{
17
+ className?: string;
18
+ }>;
19
+
20
+ const Item = (props: ItemProps) => {
21
+ const { children, className } = props;
22
+
23
+ const itemRef = React.useRef<HTMLDivElement>(null);
24
+
25
+ const rootContext = React.useContext(AccordionRootContext);
26
+ const { open, disabled, transition, "#firstClick": firstClick } = rootContext;
27
+
28
+ React.useEffect(() => {
29
+ if (!itemRef.current || !transition) return;
30
+ const computedStyle = window.getComputedStyle(itemRef.current);
31
+ const pb = computedStyle.paddingBottom;
32
+
33
+ const currMaxHeight = `${Array.from(itemRef.current.childNodes).reduce(
34
+ (acc, child) => acc + (child as HTMLDivElement).scrollHeight,
35
+ +pb.split("px")[0]
36
+ )}`;
37
+
38
+ const animationOptions = {
39
+ duration:
40
+ typeof transition === "boolean" ? 250 : transition?.duration ?? 250,
41
+ easing:
42
+ typeof transition === "boolean"
43
+ ? "ease-in-out"
44
+ : transition?.timingFC ?? "ease-in-out",
45
+ };
46
+
47
+ const animate = (...keyframes: Keyframe[]) => {
48
+ if (itemRef.current) itemRef.current.animate(keyframes, animationOptions);
49
+ };
50
+
51
+ if (open) {
52
+ if (!firstClick) return;
53
+
54
+ animate(
55
+ { maxHeight: 0, opacity: 0, marginBottom: `-${pb}` },
56
+ { maxHeight: `${currMaxHeight}px`, opacity: 1, marginBottom: 0 }
57
+ );
58
+ } else {
59
+ if (!firstClick) return;
60
+ animate(
61
+ {
62
+ maxHeight: `${itemRef.current.scrollHeight}px`,
63
+ opacity: 1,
64
+ marginBottom: 0,
65
+ },
66
+ { maxHeight: 0, opacity: 0, marginBottom: `-${pb}` }
67
+ );
68
+ }
69
+ }, [firstClick, transition, open]);
70
+
71
+ return (
72
+ <div
73
+ ref={itemRef}
74
+ className={cx("Item", className, {
75
+ open: open,
76
+ disabled: disabled,
77
+ transition: !!transition,
78
+ })}
79
+ >
80
+ {children}
81
+ </div>
82
+ );
83
+ };
84
+
85
+ type AsProps = {
86
+ id?: string;
87
+ open?: boolean;
88
+ disabled?: boolean;
89
+ };
90
+
91
+ type TriggerProps = React.PropsWithChildren<{
92
+ as?: (props: AsProps) => React.ReactNode;
93
+ className?: string;
94
+ }>;
95
+
96
+ const Trigger = (props: TriggerProps) => {
97
+ const { as, children, className } = props;
98
+
99
+ const {
100
+ id,
101
+ open,
102
+ disabled,
103
+ transition,
104
+ onClick,
105
+ onChange,
106
+ "#triggerRef": triggerRef,
107
+ } = React.useContext(AccordionRootContext);
108
+
109
+ const inputProps = {
110
+ hidden: true,
111
+ type: "checkbox",
112
+ defaultChecked: open,
113
+ id,
114
+ disabled,
115
+ onClick,
116
+ onChange,
117
+ };
118
+
119
+ return as ? (
120
+ <label htmlFor={id}>
121
+ <input ref={triggerRef} {...inputProps} />
122
+ {as({ id, open, disabled })}
123
+ </label>
124
+ ) : (
125
+ <label
126
+ htmlFor={id}
127
+ className={cx("Trigger", className, {
128
+ disabled: disabled,
129
+ })}
130
+ >
131
+ <input ref={triggerRef} {...inputProps} />
132
+ {children}
133
+ <Icon
134
+ name={"ExpandMore"}
135
+ className={cx("TriggerIcon", {
136
+ open,
137
+ transition: !!transition,
138
+ })}
139
+ />
140
+ </label>
141
+ );
142
+ };
143
+
144
+ const Root = (
145
+ props: Omit<AccordionsRootProviderProps, "#triggerRef" | "#firstClick">
146
+ ) => {
147
+ const {
148
+ children,
149
+ className,
150
+ open,
151
+ variant = "contained",
152
+ disabled = false,
153
+ autoClosed = true,
154
+ transition = true,
155
+ onClick,
156
+ } = props;
157
+
158
+ const [privateOpen, setPrivateOpen] = React.useState(false);
159
+ const [firstClick, setFirstClick] = React.useState(false);
160
+
161
+ const privateId = React.useId();
162
+
163
+ const rootRef = React.useRef<HTMLDivElement>(null);
164
+ const triggerRef = React.useRef<HTMLInputElement>(null);
165
+
166
+ const handleTriggerClick = React.useCallback(() => {
167
+ if (disabled) return;
168
+ if (open === undefined) setPrivateOpen?.((curr) => !curr);
169
+ if (!firstClick) setFirstClick?.(true);
170
+ onClick?.();
171
+ }, [disabled, open, firstClick, setPrivateOpen, onClick, setFirstClick]);
172
+
173
+ const currOpen = React.useMemo(
174
+ () => open ?? privateOpen,
175
+ [open, privateOpen]
176
+ );
177
+ const contextValue = React.useMemo(() => {
178
+ return {
179
+ ...props,
180
+ id: props.id ?? privateId,
181
+ open: currOpen,
182
+ "#triggerRef": triggerRef,
183
+ "#firstClick": firstClick,
184
+ onClick: handleTriggerClick,
185
+ };
186
+ }, [props, privateId, currOpen, firstClick, handleTriggerClick]);
187
+
188
+ const handleClickOutside = React.useCallback((e: MouseEvent) => {
189
+ const target = e.target as HTMLElement;
190
+ if (!rootRef.current?.contains(target)) {
191
+ triggerRef.current?.click();
192
+ }
193
+ }, []);
194
+
195
+ React.useEffect(() => {
196
+ if (disabled || !currOpen) return;
197
+ if (autoClosed) {
198
+ document.addEventListener("click", handleClickOutside);
199
+ return () => {
200
+ document.removeEventListener("click", handleClickOutside);
201
+ };
202
+ }
203
+ }, [disabled, currOpen, autoClosed, handleClickOutside]);
204
+
205
+ return (
206
+ <AccordionRootProvider {...contextValue}>
207
+ <div
208
+ ref={rootRef}
209
+ className={cx(
210
+ variant === "unset" ? "Unset" : "Root",
211
+ className,
212
+ variant,
213
+ {
214
+ open: currOpen,
215
+ transition: !!transition,
216
+ disabled,
217
+ }
218
+ )}
219
+ style={{
220
+ ...(typeof transition !== "boolean" && {
221
+ transitionDuration: `${+(transition?.duration ?? 250) / 1000}s`,
222
+ transitionTimingFunction: transition?.timingFC ?? "ease-in-out",
223
+ }),
224
+ }}
225
+ >
226
+ {children}
227
+ </div>
228
+ </AccordionRootProvider>
229
+ );
230
+ };
231
+
232
+ interface IAccordion {
233
+ Root: typeof Root;
234
+ Trigger: typeof Trigger;
235
+ Item: typeof Item;
236
+ }
237
+
238
+ export default {
239
+ Root,
240
+ Trigger,
241
+ Item,
242
+ } as IAccordion;
@@ -0,0 +1,408 @@
1
+ # Accordion UI
2
+
3
+ ## Contents List
4
+
5
+ 1. [Quick Start](#QuickStart)
6
+ 2. [Reference](#Reference)
7
+ 3. [Example](#Example)
8
+
9
+ ## Quick Start
10
+
11
+ ```ts
12
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
13
+
14
+ const components = () => {
15
+ // ...
16
+
17
+ return (
18
+ <Accordion.Root>
19
+ <Accordion.Trigger>
20
+ <div>{TITLE}</div>
21
+ </Accordion.Trigger>
22
+ <Accordion.Item>
23
+ <div>{CONTENT}</div>
24
+ </Accordion.Item>
25
+ </Accordion.Root>
26
+ );
27
+ };
28
+ ```
29
+
30
+ > closed
31
+
32
+ ![alt text](./images/closed.png)
33
+
34
+ > open
35
+
36
+ ![alt text](./images/open.png)
37
+
38
+ ## Reference
39
+
40
+ ### Root
41
+
42
+ | Prop | Type | Required | Default Value |
43
+ | :--------------------------- | :-----------------------------------------------: | :------: | :-----------: |
44
+ | [open](#open) | Boolean | - | false |
45
+ | [disabled](#disabled) | Boolean | - | false |
46
+ | [autoClosed](#autoClosed) | Boolean | - | true |
47
+ | [id](#id) | String | - | React.useId() |
48
+ | [variant](#variant) | [String](#variantType) | - | "contained" |
49
+ | [transition](#transition) | Boolean or [Object](#transitionType) | - | true |
50
+ | [onClick](#onClick) | (e?: React.MouseEvent<HTMLInputElement>) => void | - | - |
51
+ | [onChange](#onChange) | (e?: React.ChangeEvent<HTMLInputElement>) => void | - | - |
52
+ | [className](#Root-className) | String | - | - |
53
+ | [children](#Root-children) | React.ReactNode | - | - |
54
+
55
+ #### open
56
+
57
+ `Accordion`์˜ `open`์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `false`๋กœ ์•„๋ฌด๋Ÿฐ `props`๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์„ ์‹œ `Accordion.Trigger`๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ `open`์˜ ์ƒํƒœ๊ฐ€ ๋ฐ˜์ „๋ฉ๋‹ˆ๋‹ค. [โ†—๊ธฐ๋ณธ ์˜ˆ์‹œ](#QuickStart)
58
+
59
+ `Accordion.Root`์— `boolean`๊ฐ’์„ ๋„ฃ์–ด ์ž„์˜๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
60
+
61
+ ```ts
62
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
63
+
64
+ const components = () => {
65
+ const [open, setOpen] = React.useState<boolean>(false);
66
+
67
+ return (
68
+ <Accordion.Root open={open}>
69
+ <!-- ... -->
70
+ </Accordion.Root>
71
+ );
72
+ }
73
+ ```
74
+
75
+ `๐Ÿ””Tip: open์˜ ์ƒํƒœ๊ฐ’์„ ์ž„์˜๋กœ ์ง€์ •ํ•  ์‹œ onClick์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.` [โ†—onClick](#onClick)
76
+
77
+ #### disabled
78
+
79
+ `Accordion`์˜ `disabled`์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `false`์ž…๋‹ˆ๋‹ค.
80
+
81
+ `disabled === true`์ผ์‹œ ์•„์ฝ”๋””์–ธ์˜ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€ํ•ด์ง‘๋‹ˆ๋‹ค.
82
+
83
+ ```ts
84
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
85
+
86
+ const components = () => {
87
+ return (
88
+ <Accordion.Root disabled>
89
+ <!-- ... -->
90
+ </Accordion.Root>
91
+ );
92
+ }
93
+ ```
94
+
95
+ #### autoClosed
96
+
97
+ `Accordion`์˜ `autoClosed`์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `true`์ž…๋‹ˆ๋‹ค.
98
+
99
+ `autoClosed`๋Š” `Accordion`์ด `open === true && autoClosed === true`์ผ๋•Œ `Accordion`์˜ ์™ธ๋ถ€๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
100
+
101
+ ```ts
102
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
103
+
104
+ const components = () => {
105
+ return (
106
+ <Accordion.Root autoClosed>
107
+ <!-- ... -->
108
+ </Accordion.Root>
109
+ );
110
+ }
111
+ ```
112
+
113
+ #### id
114
+
115
+ `Accordion.Trigger`์˜ `id`๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. `props`๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์„ ์‹œ Accordion์€ ๋‚ด๋ถ€์ ์œผ๋กœ `id`๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ฐ `Accordion.Trigger`๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
116
+
117
+ `Accordion`์˜ ์™ธ๋ถ€์—์„œ ์ž„์˜์˜ `id`๋ฅผ ์ƒ์„ฑํ•ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
118
+
119
+ ```ts
120
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
121
+
122
+ const components = () => {
123
+ const id = `812ee3f3-c35d-4009-8a29-6103917d1cb0`;
124
+
125
+ return (
126
+ <Accordion.Root id={id}>
127
+ <!-- ... -->
128
+ </Accordion.Root>
129
+ );
130
+ }
131
+ ```
132
+
133
+ #### variant
134
+
135
+ `Accordion`์˜ `variant`๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `"contained"`์ž…๋‹ˆ๋‹ค.
136
+
137
+ `Accordion`์˜ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
138
+
139
+ ##### variant Type
140
+
141
+ ```ts
142
+ "contained" |
143
+ "outlined" |
144
+ "adaptived" |
145
+ "sideLined" |
146
+ "bottomLined" |
147
+ "shadow" |
148
+ "unset";
149
+ ```
150
+
151
+ ```ts
152
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
153
+
154
+ const components = () => {
155
+ const variant = "sideLined";
156
+
157
+ return (
158
+ <Accordion.Root variant={variant}>
159
+ <!-- ... -->
160
+ </Accordion.Root>
161
+ );
162
+ }
163
+ ```
164
+
165
+ `๐Ÿ””Tip: Accordion์˜ ์Šคํƒ€์ผ์„ ์ปค์Šคํ…€์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” "unset"์„ ์ง€์ •ํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.`
166
+
167
+ #### transition
168
+
169
+ `Accordion`์˜ `transition`๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `true`์ž…๋‹ˆ๋‹ค.
170
+
171
+ `boolean`๊ฐ’์„ ํ†ตํ•ด `transition`์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋„๊ณ  ํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ `true`์ผ์‹œ ๊ธฐ๋ณธ ํŠธ๋žœ์ง€์…˜์˜ ์‹œ๊ฐ„์€ `0.25s` ํƒ€์ด๋ฐ ํ•จ์ˆ˜๋Š” `ease-in-out`์ž…๋‹ˆ๋‹ค.
172
+
173
+ ์‹œ๊ฐ„๊ณผ ํƒ€์ด๋ฐ์„ ์„ธ๋ถ€์ ์œผ๋กœ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
174
+
175
+ ##### transition Type
176
+
177
+ ```ts
178
+ boolean | {
179
+ /** 0.25s => 2500 */
180
+ duration?: number;
181
+ timingFC?: React.CSSProperties["transitionTimingFunction"];
182
+ }
183
+ ```
184
+
185
+ ```ts
186
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
187
+
188
+ const components = () => {
189
+ const transition = {
190
+ duration: 1000, // 1s
191
+ timingFC: "cubic-bezier(0.64, 2, 0.46, 1.51)"
192
+ };
193
+
194
+ return (
195
+ <Accordion.Root transition={transition}>
196
+ <!-- ... -->
197
+ </Accordion.Root>
198
+ );
199
+ }
200
+ ```
201
+
202
+ #### onClick
203
+
204
+ `Accordion.Trigger`์— `onClick` ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ `props`์ž…๋‹ˆ๋‹ค.
205
+
206
+ `onClick`์— ์ „๋‹ฌ๋˜๋Š” `event`๋Š” `React.MouseEvent<HTMLInputElement>` ์ž…๋‹ˆ๋‹ค.
207
+
208
+ ```ts
209
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
210
+
211
+ const components = () => {
212
+ const [open, setOpen] = React.useState<boolean>(false)
213
+
214
+ const onClick = (e) => {
215
+ setOpen((curr) => !curr);
216
+ };
217
+
218
+ return (
219
+ <Accordion.Root open={open} onClick={onClick}>
220
+ <!-- ... -->
221
+ </Accordion.Root>
222
+ );
223
+ }
224
+ ```
225
+
226
+ `๐Ÿ””Tip: open์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” onChange๋Œ€์‹  onClick์„ ์‚ฌ์šฉํ•ด ๋ณ€๊ฒฝํ•˜์„ธ์š”.`
227
+
228
+ #### onChange
229
+
230
+ `Accordion.Trigger`์— `onChange` ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ `props`์ž…๋‹ˆ๋‹ค.
231
+
232
+ ```ts
233
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
234
+
235
+ const components = () => {
236
+ const onChange = (e) => {
237
+ console.log(e?.target.checked);
238
+ };
239
+
240
+ return (
241
+ <Accordion.Root open={open} onChange={onChange}>
242
+ <!-- ... -->
243
+ </Accordion.Root>
244
+ );
245
+ }
246
+ ```
247
+
248
+ #### Root-className
249
+
250
+ `Accordion.Root`์— `className` class๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ `props`์ž…๋‹ˆ๋‹ค.
251
+
252
+ ```ts
253
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
254
+
255
+ const components = () => {
256
+
257
+ return (
258
+ <Accordion.Root className="RootClassName">
259
+ <!-- ... -->
260
+ </Accordion.Root>
261
+ );
262
+ }
263
+ ```
264
+
265
+ `๐Ÿ””Tip: Accordion.Root์˜ class๋ฅผ ์ „๋‹ฌํ•ด์ค„๋•Œ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์„ ์—†์• ๊ธฐ ์œ„ํ•ด variant="unset"์„ ์ง€์ •ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.`
266
+
267
+ #### Root-children
268
+
269
+ `Accordion.Root`์˜ ๋‚ด๋ถ€์— `Accordion.Trigger`์™€ `Accordion.Item`์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋ณธ ์•„์ฝ”๋””์–ธ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.[โ†—๊ธฐ๋ณธ ์˜ˆ์‹œ](#QuickStart)
270
+
271
+ `Accordion`์ปดํฌ๋„ŒํŠธ ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ui๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
272
+
273
+ ### Trigger
274
+
275
+ | Prop | Type | Required | Default Value |
276
+ | :------------------------------ | :----------------: | :------: | :-----------: |
277
+ | [as](#as) | React.ReactElement | - | - |
278
+ | [className](#Trigger-className) | String | - | - |
279
+ | [children](#Trigger-children) | React.ReactNode | - | - |
280
+
281
+ #### as
282
+
283
+ `Accordion.Trigger`์˜ ์ „์ฒด์ ์ธ ui๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์žˆ๋Š” `props`์ž…๋‹ˆ๋‹ค.
284
+
285
+ ํ•ด๋‹น `props`์—๋Š” `JSX`์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ui์˜ ์Šคํƒ€์ผ๊ณผ ๊ธฐ๋Šฅ์„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
286
+
287
+ ```ts
288
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
289
+
290
+ const components = () => {
291
+
292
+ const [asOpen, setAsOpen] = React.useState<boolean>(false);
293
+
294
+ return (
295
+ <Accordion.Root
296
+ open={asOpen}
297
+ onClick={
298
+ () => setAsOpen((curr) => !curr)
299
+ }
300
+ >
301
+ <Accordion.Trigger as={
302
+ <div className={cx("AsTriggerWrap", { open: asOpen })}>
303
+ <Icon name="Company" className={cx("CompanyIcon")} />
304
+ <div>
305
+ TEAM <strong>WEing</strong> ์ด๋ž€?
306
+ </div>
307
+ <Icon
308
+ name="ExpandMore"
309
+ className={cx("ExpandIcon", { open: asOpen })}
310
+ color="#ffd016"
311
+ />
312
+ </div>
313
+ }>
314
+ <!-- ... -->
315
+ </Accordion.Root>
316
+ );
317
+ }
318
+ ```
319
+
320
+ `๐Ÿ””Tip: open ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•ด ๊ด€๋ฆฌํ•˜๋ฉด as ๋‚ด๋ถ€์— Accordion์˜ open์ƒํƒœ์— ๋”ฐ๋ผ ui ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`
321
+ ![alt text](./images/as_trigger.gif)
322
+
323
+ #### Trigger-className
324
+
325
+ `Accordion.Trigger`์— `className` class๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ `props`์ž…๋‹ˆ๋‹ค.
326
+
327
+ ```ts
328
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
329
+
330
+ const components = () => {
331
+
332
+ return (
333
+ <Accordion.Root>
334
+ <Accordion.Trigger className="TriggerClassName"/>
335
+ <!-- ... -->
336
+ </Accordion.Root>
337
+ );
338
+ }
339
+ ```
340
+
341
+ #### Trigger-children
342
+
343
+ `Accordion.Trigger`์˜ `Text`์— ๋“ค์–ด๊ฐ€๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
344
+
345
+ ```ts
346
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
347
+
348
+ const components = () => {
349
+
350
+ return (
351
+ <Accordion.Root>
352
+ <Accordion.Trigger>
353
+ <div>Trigger Text</div>
354
+ </Accordion.Trigger>
355
+ <!-- ... -->
356
+ </Accordion.Root>
357
+ );
358
+ }
359
+ ```
360
+
361
+ ### Item
362
+
363
+ | Prop | Type | Required | Default Value |
364
+ | :--------------------------- | :-------------: | :------: | :-----------: |
365
+ | [className](#Item-className) | String | - | - |
366
+ | [children](#Item-children) | React.ReactNode | - | - |
367
+
368
+ #### Item-className
369
+
370
+ `Accordion.Item`์— `className` class๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ `props`์ž…๋‹ˆ๋‹ค.
371
+
372
+ ```ts
373
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
374
+
375
+ const components = () => {
376
+
377
+ return (
378
+ <Accordion.Root>
379
+ <!-- ... -->
380
+ <Accordion.Item className="ItemClassName"/>
381
+ </Accordion.Root>
382
+ );
383
+ }
384
+ ```
385
+
386
+ #### Item-children
387
+
388
+ `Accordion.Item`์˜ `Text`์— ๋“ค์–ด๊ฐ€๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
389
+
390
+ ```ts
391
+ import { Accordion } from "@weing-dev/ui-kit-primitive";
392
+
393
+ const components = () => {
394
+
395
+ return (
396
+ <Accordion.Root>
397
+ <!-- ... -->
398
+ <Accordion.Item>
399
+ <div>Item Text</div>
400
+ </Accordion.Item>
401
+ </Accordion.Root>
402
+ );
403
+ }
404
+ ```
405
+
406
+ ## Example
407
+
408
+ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น [Link](http://localhost:3000/users/accordion)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@@ -0,0 +1,47 @@
1
+ @layer {
2
+ .Group {
3
+ display: flex;
4
+ }
5
+
6
+ .GroupItem {
7
+ margin-inline: -4px;
8
+ }
9
+
10
+ .Item {
11
+ --bg-color: white;
12
+ --size: 40px;
13
+ box-sizing: border-box;
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ overflow: hidden;
18
+ user-select: none;
19
+ border: 2px solid var(--backgroundDefault, #fff);
20
+ background-color: var(--bgColor);
21
+ width: var(--size);
22
+ height: var(--size);
23
+
24
+ &.rounded {
25
+ border-radius: 10px;
26
+ }
27
+ &.circle {
28
+ border-radius: 50%;
29
+ }
30
+ }
31
+
32
+ .Text {
33
+ width: inherit;
34
+ height: inherit;
35
+ font-size: 100%;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ white-space: nowrap;
40
+ }
41
+
42
+ .AvatarImage {
43
+ width: inherit;
44
+ height: inherit;
45
+ object-fit: cover;
46
+ }
47
+ }