@hua-labs/ui 2.2.0 → 2.3.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 (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -43
  3. package/dist/{ComponentLayout-BhM4VSoq.d.mts → ComponentLayout-Clf6C2jV.d.mts} +37 -3
  4. package/dist/DashboardSidebar-ZulecqKs.d.mts +54 -0
  5. package/dist/DashboardToolbar-BRZayZNz.d.mts +122 -0
  6. package/dist/EmptyState-SQ3Z6Vf2.d.mts +64 -0
  7. package/dist/{Modal-CrXmb3Ll.d.mts → Modal-DKKtBtbh.d.mts} +12 -6
  8. package/dist/{Section-BWzyshgX.d.mts → Section-DKdIG1sg.d.mts} +11 -12
  9. package/dist/SectionHeader-DHwQ_xh8.d.mts +1653 -0
  10. package/dist/{Switch-Dzm5TLR3.d.mts → Switch-D0l7SJrz.d.mts} +31 -15
  11. package/dist/Tooltip-Cv7nYhPW.d.mts +304 -0
  12. package/dist/advanced/Logo.d.ts +8 -4
  13. package/dist/advanced/Logo.d.ts.map +1 -1
  14. package/dist/advanced/dashboard.d.ts +28 -6
  15. package/dist/advanced/dashboard.d.ts.map +1 -1
  16. package/dist/advanced-dashboard.d.mts +9 -2278
  17. package/dist/advanced-dashboard.mjs +1 -33
  18. package/dist/advanced-dashboard.mjs.map +1 -1
  19. package/dist/advanced-emotion.d.mts +13 -5
  20. package/dist/advanced-emotion.mjs +1 -1
  21. package/dist/advanced-motion.d.mts +136 -56
  22. package/dist/advanced-motion.mjs +1 -1
  23. package/dist/advanced.d.mts +69 -36
  24. package/dist/advanced.mjs +14 -3
  25. package/dist/advanced.mjs.map +1 -1
  26. package/dist/chunk-32OZGTPV.mjs +41 -0
  27. package/dist/chunk-32OZGTPV.mjs.map +1 -0
  28. package/dist/chunk-6WBFZ2KV.mjs +3 -0
  29. package/dist/chunk-6WBFZ2KV.mjs.map +1 -0
  30. package/dist/chunk-7CGJQSJO.mjs +3 -0
  31. package/dist/chunk-7CGJQSJO.mjs.map +1 -0
  32. package/dist/chunk-7T3IUG3G.mjs +3 -0
  33. package/dist/chunk-7T3IUG3G.mjs.map +1 -0
  34. package/dist/chunk-AJOGTUWS.mjs +3 -0
  35. package/dist/chunk-AJOGTUWS.mjs.map +1 -0
  36. package/dist/chunk-AQTSQYH2.mjs +3 -0
  37. package/dist/chunk-AQTSQYH2.mjs.map +1 -0
  38. package/dist/chunk-B2MRZJQA.mjs +3 -0
  39. package/dist/chunk-B2MRZJQA.mjs.map +1 -0
  40. package/dist/chunk-BOX4TONF.mjs +3 -0
  41. package/dist/chunk-BOX4TONF.mjs.map +1 -0
  42. package/dist/chunk-C2DOXNBK.mjs +3 -0
  43. package/dist/chunk-C2DOXNBK.mjs.map +1 -0
  44. package/dist/chunk-CQBMR7VU.mjs +3 -0
  45. package/dist/chunk-CQBMR7VU.mjs.map +1 -0
  46. package/dist/chunk-CYAAAEPJ.mjs +3 -0
  47. package/dist/chunk-CYAAAEPJ.mjs.map +1 -0
  48. package/dist/chunk-D7MTTTQY.mjs +8 -0
  49. package/dist/chunk-D7MTTTQY.mjs.map +1 -0
  50. package/dist/chunk-DABVKUJN.mjs +3 -0
  51. package/dist/chunk-DABVKUJN.mjs.map +1 -0
  52. package/dist/chunk-EK6BLFVQ.mjs +3 -0
  53. package/dist/chunk-EK6BLFVQ.mjs.map +1 -0
  54. package/dist/chunk-FVUAVGP5.mjs +3 -0
  55. package/dist/chunk-FVUAVGP5.mjs.map +1 -0
  56. package/dist/chunk-GAIUZVNC.mjs +3 -0
  57. package/dist/chunk-GAIUZVNC.mjs.map +1 -0
  58. package/dist/chunk-HLBIIF4I.mjs +3 -0
  59. package/dist/chunk-HLBIIF4I.mjs.map +1 -0
  60. package/dist/chunk-I6NCGF6E.mjs +3 -0
  61. package/dist/chunk-I6NCGF6E.mjs.map +1 -0
  62. package/dist/chunk-J46VEBVF.mjs +3 -0
  63. package/dist/chunk-J46VEBVF.mjs.map +1 -0
  64. package/dist/chunk-JNW3CLCA.mjs +3 -0
  65. package/dist/chunk-JNW3CLCA.mjs.map +1 -0
  66. package/dist/chunk-JY3QVUGW.mjs +3 -0
  67. package/dist/chunk-JY3QVUGW.mjs.map +1 -0
  68. package/dist/chunk-KHBZOGUU.mjs +3 -0
  69. package/dist/chunk-KHBZOGUU.mjs.map +1 -0
  70. package/dist/chunk-KPNNAQLI.mjs +3 -0
  71. package/dist/chunk-KPNNAQLI.mjs.map +1 -0
  72. package/dist/chunk-L2LGSILS.mjs +13 -0
  73. package/dist/chunk-L2LGSILS.mjs.map +1 -0
  74. package/dist/chunk-LPHUWTQ2.mjs +3 -0
  75. package/dist/chunk-LPHUWTQ2.mjs.map +1 -0
  76. package/dist/chunk-M4JE7TQL.mjs +3 -0
  77. package/dist/chunk-M4JE7TQL.mjs.map +1 -0
  78. package/dist/chunk-MEDKGNLV.mjs +3 -0
  79. package/dist/chunk-MEDKGNLV.mjs.map +1 -0
  80. package/dist/chunk-MR46CSMC.mjs +3 -0
  81. package/dist/chunk-MR46CSMC.mjs.map +1 -0
  82. package/dist/chunk-NSDWT2JM.mjs +3 -0
  83. package/dist/chunk-NSDWT2JM.mjs.map +1 -0
  84. package/dist/chunk-OBMOTQEU.mjs +3 -0
  85. package/dist/chunk-OBMOTQEU.mjs.map +1 -0
  86. package/dist/chunk-RICRFXFP.mjs +3 -0
  87. package/dist/chunk-RICRFXFP.mjs.map +1 -0
  88. package/dist/chunk-SOK7VBSM.mjs +13 -0
  89. package/dist/chunk-SOK7VBSM.mjs.map +1 -0
  90. package/dist/chunk-SPZ7SZH4.mjs +3 -0
  91. package/dist/chunk-SPZ7SZH4.mjs.map +1 -0
  92. package/dist/chunk-TB3DARQO.mjs +3 -0
  93. package/dist/chunk-TB3DARQO.mjs.map +1 -0
  94. package/dist/chunk-TND4HPKW.mjs +51 -0
  95. package/dist/chunk-TND4HPKW.mjs.map +1 -0
  96. package/dist/chunk-TSAXVD2H.mjs +35 -0
  97. package/dist/chunk-TSAXVD2H.mjs.map +1 -0
  98. package/dist/chunk-UR3TIWBS.mjs +3 -0
  99. package/dist/chunk-UR3TIWBS.mjs.map +1 -0
  100. package/dist/chunk-XU2XBAEW.mjs +3 -0
  101. package/dist/chunk-XU2XBAEW.mjs.map +1 -0
  102. package/dist/chunk-XXHDNZTG.mjs +3 -0
  103. package/dist/chunk-XXHDNZTG.mjs.map +1 -0
  104. package/dist/chunk-YW5DA7Q6.mjs +3 -0
  105. package/dist/chunk-YW5DA7Q6.mjs.map +1 -0
  106. package/dist/chunk-ZTHUGQZL.mjs +3 -0
  107. package/dist/chunk-ZTHUGQZL.mjs.map +1 -0
  108. package/dist/chunk-ZVCGC6EV.mjs +3 -0
  109. package/dist/chunk-ZVCGC6EV.mjs.map +1 -0
  110. package/dist/chunk-ZZ67E3M5.mjs +3 -0
  111. package/dist/chunk-ZZ67E3M5.mjs.map +1 -0
  112. package/dist/{common-YLvZxA_K.d.mts → common-Bej8Okcg.d.mts} +1 -1
  113. package/dist/components/Accordion.d.ts +14 -7
  114. package/dist/components/Accordion.d.ts.map +1 -1
  115. package/dist/components/Action.d.ts.map +1 -1
  116. package/dist/components/ActionToolbar.d.ts +10 -6
  117. package/dist/components/ActionToolbar.d.ts.map +1 -1
  118. package/dist/components/Alert.d.ts +16 -2
  119. package/dist/components/Alert.d.ts.map +1 -1
  120. package/dist/components/Autocomplete.d.ts +6 -4
  121. package/dist/components/Autocomplete.d.ts.map +1 -1
  122. package/dist/components/Avatar.d.ts +20 -7
  123. package/dist/components/Avatar.d.ts.map +1 -1
  124. package/dist/components/Badge.d.ts +27 -9
  125. package/dist/components/Badge.d.ts.map +1 -1
  126. package/dist/components/Bookmark.d.ts +4 -2
  127. package/dist/components/Bookmark.d.ts.map +1 -1
  128. package/dist/components/BottomSheet.d.ts +13 -9
  129. package/dist/components/BottomSheet.d.ts.map +1 -1
  130. package/dist/components/Box.d.ts +9 -0
  131. package/dist/components/Box.d.ts.map +1 -0
  132. package/dist/components/Breadcrumb.d.ts +9 -4
  133. package/dist/components/Breadcrumb.d.ts.map +1 -1
  134. package/dist/components/Button.d.ts +3 -29
  135. package/dist/components/Button.d.ts.map +1 -1
  136. package/dist/components/Button.variants.d.ts +54 -10
  137. package/dist/components/Button.variants.d.ts.map +1 -1
  138. package/dist/components/Card.d.ts +49 -14
  139. package/dist/components/Card.d.ts.map +1 -1
  140. package/dist/components/ChatMessage.d.ts +3 -2
  141. package/dist/components/ChatMessage.d.ts.map +1 -1
  142. package/dist/components/Checkbox.d.ts +5 -2
  143. package/dist/components/Checkbox.d.ts.map +1 -1
  144. package/dist/components/CodeBlock.d.ts +8 -5
  145. package/dist/components/CodeBlock.d.ts.map +1 -1
  146. package/dist/components/ColorPicker.d.ts +4 -2
  147. package/dist/components/ColorPicker.d.ts.map +1 -1
  148. package/dist/components/Command.d.ts +28 -14
  149. package/dist/components/Command.d.ts.map +1 -1
  150. package/dist/components/ComponentLayout.d.ts +5 -2
  151. package/dist/components/ComponentLayout.d.ts.map +1 -1
  152. package/dist/components/ConfirmModal.d.ts +4 -0
  153. package/dist/components/ConfirmModal.d.ts.map +1 -1
  154. package/dist/components/Container.d.ts +18 -5
  155. package/dist/components/Container.d.ts.map +1 -1
  156. package/dist/components/ContextMenu.d.ts +36 -36
  157. package/dist/components/ContextMenu.d.ts.map +1 -1
  158. package/dist/components/DatePicker.d.ts +12 -5
  159. package/dist/components/DatePicker.d.ts.map +1 -1
  160. package/dist/components/Divider.d.ts +2 -1
  161. package/dist/components/Divider.d.ts.map +1 -1
  162. package/dist/components/Drawer.d.ts +17 -12
  163. package/dist/components/Drawer.d.ts.map +1 -1
  164. package/dist/components/Dropdown.d.ts +25 -7
  165. package/dist/components/Dropdown.d.ts.map +1 -1
  166. package/dist/components/EmotionAnalysis.d.ts +3 -1
  167. package/dist/components/EmotionAnalysis.d.ts.map +1 -1
  168. package/dist/components/EmotionButton.d.ts +3 -1
  169. package/dist/components/EmotionButton.d.ts.map +1 -1
  170. package/dist/components/EmotionMeter.d.ts +3 -1
  171. package/dist/components/EmotionMeter.d.ts.map +1 -1
  172. package/dist/components/EmotionSelector.d.ts +3 -1
  173. package/dist/components/EmotionSelector.d.ts.map +1 -1
  174. package/dist/components/FeatureCard.d.ts +9 -3
  175. package/dist/components/FeatureCard.d.ts.map +1 -1
  176. package/dist/components/Form.d.ts +20 -54
  177. package/dist/components/Form.d.ts.map +1 -1
  178. package/dist/components/FormControl.d.ts +3 -2
  179. package/dist/components/FormControl.d.ts.map +1 -1
  180. package/dist/components/Grid.d.ts +11 -4
  181. package/dist/components/Grid.d.ts.map +1 -1
  182. package/dist/components/HeroSection.d.ts +4 -2
  183. package/dist/components/HeroSection.d.ts.map +1 -1
  184. package/dist/components/Icon/Icon.d.ts +12 -8
  185. package/dist/components/Icon/Icon.d.ts.map +1 -1
  186. package/dist/components/IconsaxGallery/index.d.ts +8 -5
  187. package/dist/components/IconsaxGallery/index.d.ts.map +1 -1
  188. package/dist/components/InfoCard.d.ts +5 -2
  189. package/dist/components/InfoCard.d.ts.map +1 -1
  190. package/dist/components/Input.d.ts +29 -4
  191. package/dist/components/Input.d.ts.map +1 -1
  192. package/dist/components/Label.d.ts +15 -10
  193. package/dist/components/Label.d.ts.map +1 -1
  194. package/dist/components/LanguageToggle.d.ts +5 -3
  195. package/dist/components/LanguageToggle.d.ts.map +1 -1
  196. package/dist/components/Link.d.ts +17 -6
  197. package/dist/components/Link.d.ts.map +1 -1
  198. package/dist/components/LoadingSpinner.d.ts +7 -3
  199. package/dist/components/LoadingSpinner.d.ts.map +1 -1
  200. package/dist/components/Menu.d.ts +59 -60
  201. package/dist/components/Menu.d.ts.map +1 -1
  202. package/dist/components/Modal.d.ts +12 -6
  203. package/dist/components/Modal.d.ts.map +1 -1
  204. package/dist/components/Navigation.d.ts +26 -11
  205. package/dist/components/Navigation.d.ts.map +1 -1
  206. package/dist/components/NumberInput.d.ts +5 -2
  207. package/dist/components/NumberInput.d.ts.map +1 -1
  208. package/dist/components/PageNavigation.d.ts +6 -3
  209. package/dist/components/PageNavigation.d.ts.map +1 -1
  210. package/dist/components/PageTransition.d.ts +2 -2
  211. package/dist/components/PageTransition.d.ts.map +1 -1
  212. package/dist/components/Pagination.d.ts +5 -2
  213. package/dist/components/Pagination.d.ts.map +1 -1
  214. package/dist/components/Panel.d.ts +1 -7
  215. package/dist/components/Panel.d.ts.map +1 -1
  216. package/dist/components/Popover.d.ts +25 -9
  217. package/dist/components/Popover.d.ts.map +1 -1
  218. package/dist/components/Pressable.d.ts +14 -0
  219. package/dist/components/Pressable.d.ts.map +1 -0
  220. package/dist/components/Progress.d.ts +36 -13
  221. package/dist/components/Progress.d.ts.map +1 -1
  222. package/dist/components/Prose.d.ts +51 -0
  223. package/dist/components/Prose.d.ts.map +1 -0
  224. package/dist/components/Radio.d.ts +29 -33
  225. package/dist/components/Radio.d.ts.map +1 -1
  226. package/dist/components/ScrollArea.d.ts +8 -9
  227. package/dist/components/ScrollArea.d.ts.map +1 -1
  228. package/dist/components/ScrollIndicator.d.ts +9 -8
  229. package/dist/components/ScrollIndicator.d.ts.map +1 -1
  230. package/dist/components/ScrollProgress.d.ts +3 -2
  231. package/dist/components/ScrollProgress.d.ts.map +1 -1
  232. package/dist/components/ScrollToTop.d.ts +5 -5
  233. package/dist/components/ScrollToTop.d.ts.map +1 -1
  234. package/dist/components/Section.d.ts +12 -9
  235. package/dist/components/Section.d.ts.map +1 -1
  236. package/dist/components/SectionHeader.d.ts +3 -2
  237. package/dist/components/SectionHeader.d.ts.map +1 -1
  238. package/dist/components/Select.d.ts +18 -5
  239. package/dist/components/Select.d.ts.map +1 -1
  240. package/dist/components/Skeleton.d.ts +43 -15
  241. package/dist/components/Skeleton.d.ts.map +1 -1
  242. package/dist/components/Slider.d.ts +7 -5
  243. package/dist/components/Slider.d.ts.map +1 -1
  244. package/dist/components/Stack.d.ts +22 -6
  245. package/dist/components/Stack.d.ts.map +1 -1
  246. package/dist/components/StatsPanel.d.ts +4 -2
  247. package/dist/components/StatsPanel.d.ts.map +1 -1
  248. package/dist/components/Switch.d.ts +9 -4
  249. package/dist/components/Switch.d.ts.map +1 -1
  250. package/dist/components/Table.d.ts +43 -18
  251. package/dist/components/Table.d.ts.map +1 -1
  252. package/dist/components/Tabs.d.ts +50 -77
  253. package/dist/components/Tabs.d.ts.map +1 -1
  254. package/dist/components/Text.d.ts +11 -0
  255. package/dist/components/Text.d.ts.map +1 -0
  256. package/dist/components/Textarea.d.ts +24 -6
  257. package/dist/components/Textarea.d.ts.map +1 -1
  258. package/dist/components/ThemeToggle.d.ts +18 -27
  259. package/dist/components/ThemeToggle.d.ts.map +1 -1
  260. package/dist/components/Timeline.d.ts +4 -2
  261. package/dist/components/Timeline.d.ts.map +1 -1
  262. package/dist/components/Toast.d.ts +1 -1
  263. package/dist/components/Toast.d.ts.map +1 -1
  264. package/dist/components/Toggle.d.ts +11 -2
  265. package/dist/components/Toggle.d.ts.map +1 -1
  266. package/dist/components/Tooltip.d.ts +5 -2
  267. package/dist/components/Tooltip.d.ts.map +1 -1
  268. package/dist/components/Upload.d.ts +5 -3
  269. package/dist/components/Upload.d.ts.map +1 -1
  270. package/dist/components/advanced/AdvancedPageTransition.d.ts +7 -5
  271. package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -1
  272. package/dist/components/advanced/AnimatedGradient.d.ts +6 -2
  273. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  274. package/dist/components/advanced/Carousel.d.ts +3 -1
  275. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  276. package/dist/components/advanced/DotNav.d.ts +12 -5
  277. package/dist/components/advanced/DotNav.d.ts.map +1 -1
  278. package/dist/components/advanced/GlowCard.d.ts +4 -1
  279. package/dist/components/advanced/GlowCard.d.ts.map +1 -1
  280. package/dist/components/advanced/HorizontalScroll.d.ts +4 -1
  281. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -1
  282. package/dist/components/advanced/ImageReveal.d.ts +23 -1
  283. package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
  284. package/dist/components/advanced/Marquee.d.ts +4 -2
  285. package/dist/components/advanced/Marquee.d.ts.map +1 -1
  286. package/dist/components/advanced/Parallax.d.ts +4 -2
  287. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  288. package/dist/components/advanced/SpotlightCard.d.ts +13 -12
  289. package/dist/components/advanced/SpotlightCard.d.ts.map +1 -1
  290. package/dist/components/advanced/TextReveal.d.ts +5 -1
  291. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  292. package/dist/components/advanced/TiltCard.d.ts +6 -2
  293. package/dist/components/advanced/TiltCard.d.ts.map +1 -1
  294. package/dist/components/advanced/VideoBackground.d.ts +4 -1
  295. package/dist/components/advanced/VideoBackground.d.ts.map +1 -1
  296. package/dist/components/advanced/blog-editor/BlogEditor.d.ts +4 -2
  297. package/dist/components/advanced/blog-editor/BlogEditor.d.ts.map +1 -1
  298. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts +4 -2
  299. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts.map +1 -1
  300. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts +4 -2
  301. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts.map +1 -1
  302. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts +4 -2
  303. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts.map +1 -1
  304. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts +4 -2
  305. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts.map +1 -1
  306. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts +5 -3
  307. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts.map +1 -1
  308. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts +5 -3
  309. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts.map +1 -1
  310. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts +4 -2
  311. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts.map +1 -1
  312. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts +4 -2
  313. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts.map +1 -1
  314. package/dist/components/advanced/blog-editor/types.d.ts +5 -2
  315. package/dist/components/advanced/blog-editor/types.d.ts.map +1 -1
  316. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts +3 -1
  317. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts.map +1 -1
  318. package/dist/components/advanced/emotion/EmotionButton.d.ts +3 -1
  319. package/dist/components/advanced/emotion/EmotionButton.d.ts.map +1 -1
  320. package/dist/components/advanced/emotion/EmotionMeter.d.ts +4 -2
  321. package/dist/components/advanced/emotion/EmotionMeter.d.ts.map +1 -1
  322. package/dist/components/advanced/emotion/EmotionSelector.d.ts +3 -1
  323. package/dist/components/advanced/emotion/EmotionSelector.d.ts.map +1 -1
  324. package/dist/components/dashboard/ActivityFeed.d.ts +5 -2
  325. package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -1
  326. package/dist/components/dashboard/BarChart.d.ts +3 -2
  327. package/dist/components/dashboard/BarChart.d.ts.map +1 -1
  328. package/dist/components/dashboard/DashboardGrid.d.ts +13 -3
  329. package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -1
  330. package/dist/components/dashboard/DashboardSidebar.d.ts +15 -82
  331. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -1
  332. package/dist/components/dashboard/DashboardToolbar.d.ts +3 -2
  333. package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -1
  334. package/dist/components/dashboard/EmptyState.d.ts +3 -2
  335. package/dist/components/dashboard/EmptyState.d.ts.map +1 -1
  336. package/dist/components/dashboard/MembershipBadge.d.ts +3 -2
  337. package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -1
  338. package/dist/components/dashboard/MerchantList.d.ts +3 -2
  339. package/dist/components/dashboard/MerchantList.d.ts.map +1 -1
  340. package/dist/components/dashboard/MetricCard.d.ts +3 -2
  341. package/dist/components/dashboard/MetricCard.d.ts.map +1 -1
  342. package/dist/components/dashboard/MiniBarChart.d.ts +3 -2
  343. package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -1
  344. package/dist/components/dashboard/NotificationCard.d.ts +5 -2
  345. package/dist/components/dashboard/NotificationCard.d.ts.map +1 -1
  346. package/dist/components/dashboard/ProfileCard.d.ts +5 -2
  347. package/dist/components/dashboard/ProfileCard.d.ts.map +1 -1
  348. package/dist/components/dashboard/ProgressCard.d.ts +6 -3
  349. package/dist/components/dashboard/ProgressCard.d.ts.map +1 -1
  350. package/dist/components/dashboard/QuickActionCard.d.ts +22 -27
  351. package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -1
  352. package/dist/components/dashboard/RoutingBreakdownCard.d.ts +3 -2
  353. package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -1
  354. package/dist/components/dashboard/SettlementTimeline.d.ts +3 -2
  355. package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -1
  356. package/dist/components/dashboard/StatCard.d.ts +7 -4
  357. package/dist/components/dashboard/StatCard.d.ts.map +1 -1
  358. package/dist/components/dashboard/SummaryCard.d.ts +6 -3
  359. package/dist/components/dashboard/SummaryCard.d.ts.map +1 -1
  360. package/dist/components/dashboard/TransactionDetailDrawer.d.ts +2 -2
  361. package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -1
  362. package/dist/components/dashboard/TransactionsTable.d.ts +3 -2
  363. package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -1
  364. package/dist/components/dashboard/TrendChart.d.ts +3 -2
  365. package/dist/components/dashboard/TrendChart.d.ts.map +1 -1
  366. package/dist/components/dashboard/YearlyHeatmap.d.ts +4 -2
  367. package/dist/components/dashboard/YearlyHeatmap.d.ts.map +1 -1
  368. package/dist/components/dashboard/kanban/KanbanAddCard.d.ts.map +1 -1
  369. package/dist/components/dashboard/kanban/KanbanAddColumn.d.ts.map +1 -1
  370. package/dist/components/dashboard/kanban/KanbanBoard.d.ts.map +1 -1
  371. package/dist/components/dashboard/kanban/KanbanCard.d.ts.map +1 -1
  372. package/dist/components/dashboard/kanban/KanbanColumn.d.ts.map +1 -1
  373. package/dist/components/dashboard/kanban/KanbanColumnHeader.d.ts.map +1 -1
  374. package/dist/components/dashboard/kanban/KanbanDropIndicator.d.ts.map +1 -1
  375. package/dist/components/dashboard/kanban/index.d.ts +1 -1
  376. package/dist/components/dashboard/kanban/types.d.ts +24 -12
  377. package/dist/components/dashboard/kanban/types.d.ts.map +1 -1
  378. package/dist/components/scrollbar/scrollbar.d.ts +2 -1
  379. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
  380. package/dist/context/MotionConfigContext.d.ts +41 -0
  381. package/dist/context/MotionConfigContext.d.ts.map +1 -0
  382. package/dist/data.d.mts +55 -23
  383. package/dist/data.d.ts +45 -3
  384. package/dist/data.d.ts.map +1 -1
  385. package/dist/data.mjs +2 -2
  386. package/dist/data.mjs.map +1 -1
  387. package/dist/feedback.d.mts +6 -293
  388. package/dist/feedback.d.ts +7 -5
  389. package/dist/feedback.d.ts.map +1 -1
  390. package/dist/feedback.mjs +1 -1
  391. package/dist/form.d.mts +99 -114
  392. package/dist/form.mjs +8 -3
  393. package/dist/form.mjs.map +1 -1
  394. package/dist/hooks/index.d.ts +6 -0
  395. package/dist/hooks/index.d.ts.map +1 -1
  396. package/dist/hooks/useAnimatedEntrance.d.ts +24 -0
  397. package/dist/hooks/useAnimatedEntrance.d.ts.map +1 -0
  398. package/dist/hooks/useBreakpoint.d.ts +22 -0
  399. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  400. package/dist/hooks/useDotEnv.d.ts +12 -0
  401. package/dist/hooks/useDotEnv.d.ts.map +1 -0
  402. package/dist/hooks/useDotMap.d.ts +38 -0
  403. package/dist/hooks/useDotMap.d.ts.map +1 -0
  404. package/dist/iconsax-extended.mjs +2 -2
  405. package/dist/iconsax-extended.mjs.map +1 -1
  406. package/dist/iconsax.mjs +2 -2
  407. package/dist/iconsax.mjs.map +1 -1
  408. package/dist/index.d.mts +358 -127
  409. package/dist/index.d.ts +74 -64
  410. package/dist/index.d.ts.map +1 -1
  411. package/dist/index.mjs +15 -15
  412. package/dist/index.mjs.map +1 -1
  413. package/dist/interactive/kanban.d.ts +12 -0
  414. package/dist/interactive/kanban.d.ts.map +1 -0
  415. package/dist/interactive-kanban.d.mts +378 -0
  416. package/dist/interactive-kanban.mjs +3 -0
  417. package/dist/interactive-kanban.mjs.map +1 -0
  418. package/dist/interactive.d.mts +193 -197
  419. package/dist/interactive.d.ts +7 -5
  420. package/dist/interactive.d.ts.map +1 -1
  421. package/dist/interactive.mjs +1 -1
  422. package/dist/interactive.mjs.map +1 -1
  423. package/dist/landing/LandingAbout.d.ts +2 -2
  424. package/dist/landing/LandingAbout.d.ts.map +1 -1
  425. package/dist/landing/LandingCTA.d.ts +2 -2
  426. package/dist/landing/LandingCTA.d.ts.map +1 -1
  427. package/dist/landing/LandingContact.d.ts +2 -2
  428. package/dist/landing/LandingContact.d.ts.map +1 -1
  429. package/dist/landing/LandingExperience.d.ts +1 -1
  430. package/dist/landing/LandingExperience.d.ts.map +1 -1
  431. package/dist/landing/LandingFeatures.d.ts +1 -1
  432. package/dist/landing/LandingFeatures.d.ts.map +1 -1
  433. package/dist/landing/LandingHero.d.ts +2 -2
  434. package/dist/landing/LandingHero.d.ts.map +1 -1
  435. package/dist/landing/LandingLogoCloud.d.ts +2 -2
  436. package/dist/landing/LandingLogoCloud.d.ts.map +1 -1
  437. package/dist/landing/LandingMetrics.d.ts +1 -1
  438. package/dist/landing/LandingMetrics.d.ts.map +1 -1
  439. package/dist/landing/LandingProjects.d.ts +1 -1
  440. package/dist/landing/LandingProjects.d.ts.map +1 -1
  441. package/dist/landing/LandingShowcase.d.ts +2 -2
  442. package/dist/landing/LandingShowcase.d.ts.map +1 -1
  443. package/dist/landing/LandingSkills.d.ts +1 -1
  444. package/dist/landing/LandingSkills.d.ts.map +1 -1
  445. package/dist/landing/LandingStats.d.ts +1 -1
  446. package/dist/landing/LandingStats.d.ts.map +1 -1
  447. package/dist/landing/LandingTestimonials.d.ts +1 -1
  448. package/dist/landing/LandingTestimonials.d.ts.map +1 -1
  449. package/dist/landing/types.d.ts +42 -30
  450. package/dist/landing/types.d.ts.map +1 -1
  451. package/dist/landing.d.mts +47 -37
  452. package/dist/landing.mjs +4 -20
  453. package/dist/landing.mjs.map +1 -1
  454. package/dist/lib/Slot.d.ts.map +1 -1
  455. package/dist/lib/icon-providers.d.ts +17 -3
  456. package/dist/lib/icon-providers.d.ts.map +1 -1
  457. package/dist/lib/styles/animation.d.ts +35 -0
  458. package/dist/lib/styles/animation.d.ts.map +1 -0
  459. package/dist/lib/styles/disabled.d.ts +15 -0
  460. package/dist/lib/styles/disabled.d.ts.map +1 -0
  461. package/dist/lib/styles/focus.d.ts +34 -0
  462. package/dist/lib/styles/focus.d.ts.map +1 -0
  463. package/dist/lib/styles/glass.d.ts +18 -0
  464. package/dist/lib/styles/glass.d.ts.map +1 -0
  465. package/dist/lib/styles/hover.d.ts +9 -0
  466. package/dist/lib/styles/hover.d.ts.map +1 -0
  467. package/dist/lib/styles/index.d.ts +6 -0
  468. package/dist/lib/styles/index.d.ts.map +1 -1
  469. package/dist/lib/styles/transition.d.ts +42 -0
  470. package/dist/lib/styles/transition.d.ts.map +1 -0
  471. package/dist/lib/types/common.d.ts +3 -3
  472. package/dist/lib/types/common.d.ts.map +1 -1
  473. package/dist/native/Box.d.ts +11 -0
  474. package/dist/native/Box.d.ts.map +1 -0
  475. package/dist/native/Pressable.d.ts +10 -0
  476. package/dist/native/Pressable.d.ts.map +1 -0
  477. package/dist/native/Text.d.ts +11 -0
  478. package/dist/native/Text.d.ts.map +1 -0
  479. package/dist/native/index.d.ts +9 -0
  480. package/dist/native/index.d.ts.map +1 -0
  481. package/dist/native/useDotMap.d.ts +51 -0
  482. package/dist/native/useDotMap.d.ts.map +1 -0
  483. package/dist/native.mjs +2 -0
  484. package/dist/native.mjs.map +1 -0
  485. package/dist/navigation.d.mts +48 -21
  486. package/dist/navigation.d.ts +10 -8
  487. package/dist/navigation.d.ts.map +1 -1
  488. package/dist/navigation.mjs +1 -1
  489. package/dist/navigation.mjs.map +1 -1
  490. package/dist/overlay.d.mts +84 -37
  491. package/dist/overlay.mjs +2 -2
  492. package/dist/overlay.mjs.map +1 -1
  493. package/dist/sdui/SDUIRenderer.d.ts.map +1 -1
  494. package/dist/sdui/core.d.ts +50 -0
  495. package/dist/sdui/core.d.ts.map +1 -0
  496. package/dist/sdui/index.d.ts +3 -1
  497. package/dist/sdui/index.d.ts.map +1 -1
  498. package/dist/sdui/registry.d.ts.map +1 -1
  499. package/dist/sdui/types.d.ts +38 -0
  500. package/dist/sdui/types.d.ts.map +1 -1
  501. package/dist/sdui.d.mts +89 -1
  502. package/dist/sdui.mjs +2 -2
  503. package/dist/sdui.mjs.map +1 -1
  504. package/package.json +39 -15
  505. package/src/styles/component-vars.css +503 -69
  506. package/src/styles/landing.css +12 -12
  507. package/src/styles/prose.css +284 -0
  508. package/src/styles/recommended-theme.css +123 -141
  509. package/src/styles/utilities.css +3 -3
  510. package/dist/chunk-5DPW7SVD.mjs +0 -4
  511. package/dist/chunk-5DPW7SVD.mjs.map +0 -1
  512. package/dist/chunk-5L5HIPKA.mjs +0 -3
  513. package/dist/chunk-5L5HIPKA.mjs.map +0 -1
  514. package/dist/chunk-CNW22G24.mjs +0 -13
  515. package/dist/chunk-CNW22G24.mjs.map +0 -1
  516. package/dist/chunk-CW66UBQG.mjs +0 -3
  517. package/dist/chunk-CW66UBQG.mjs.map +0 -1
  518. package/dist/chunk-EPY3432E.mjs +0 -3
  519. package/dist/chunk-EPY3432E.mjs.map +0 -1
  520. package/dist/chunk-F2M4YDDQ.mjs +0 -3
  521. package/dist/chunk-F2M4YDDQ.mjs.map +0 -1
  522. package/dist/chunk-FHMFDCX2.mjs +0 -3
  523. package/dist/chunk-FHMFDCX2.mjs.map +0 -1
  524. package/dist/chunk-HBIUCLFL.mjs +0 -3
  525. package/dist/chunk-HBIUCLFL.mjs.map +0 -1
  526. package/dist/chunk-HEBXAFRY.mjs +0 -3
  527. package/dist/chunk-HEBXAFRY.mjs.map +0 -1
  528. package/dist/chunk-IG47LMOD.mjs +0 -3
  529. package/dist/chunk-IG47LMOD.mjs.map +0 -1
  530. package/dist/chunk-J47ZEXEL.mjs +0 -3
  531. package/dist/chunk-J47ZEXEL.mjs.map +0 -1
  532. package/dist/chunk-K2FOFIST.mjs +0 -3
  533. package/dist/chunk-K2FOFIST.mjs.map +0 -1
  534. package/dist/chunk-LL6QPRD7.mjs +0 -3
  535. package/dist/chunk-LL6QPRD7.mjs.map +0 -1
  536. package/dist/chunk-NMJLOK6M.mjs +0 -3
  537. package/dist/chunk-NMJLOK6M.mjs.map +0 -1
  538. package/dist/chunk-O24K56OS.mjs +0 -3
  539. package/dist/chunk-O24K56OS.mjs.map +0 -1
  540. package/dist/chunk-OIWG3IJ7.mjs +0 -3
  541. package/dist/chunk-OIWG3IJ7.mjs.map +0 -1
  542. package/dist/chunk-OLLU7ZFH.mjs +0 -3
  543. package/dist/chunk-OLLU7ZFH.mjs.map +0 -1
  544. package/dist/chunk-Q76JW7X5.mjs +0 -73
  545. package/dist/chunk-Q76JW7X5.mjs.map +0 -1
  546. package/dist/chunk-QRM66RQG.mjs +0 -3
  547. package/dist/chunk-QRM66RQG.mjs.map +0 -1
  548. package/dist/chunk-QRRP7TGF.mjs +0 -13
  549. package/dist/chunk-QRRP7TGF.mjs.map +0 -1
  550. package/dist/chunk-SD6XGDAC.mjs +0 -3
  551. package/dist/chunk-SD6XGDAC.mjs.map +0 -1
  552. package/dist/chunk-SDFVGFXT.mjs +0 -3
  553. package/dist/chunk-SDFVGFXT.mjs.map +0 -1
  554. package/dist/chunk-SMLDNOV3.mjs +0 -8
  555. package/dist/chunk-SMLDNOV3.mjs.map +0 -1
  556. package/dist/chunk-TAP6MYDW.mjs +0 -3
  557. package/dist/chunk-TAP6MYDW.mjs.map +0 -1
  558. package/dist/chunk-TBZ645BI.mjs +0 -3
  559. package/dist/chunk-TBZ645BI.mjs.map +0 -1
  560. package/dist/chunk-V2DNYJR6.mjs +0 -3
  561. package/dist/chunk-V2DNYJR6.mjs.map +0 -1
  562. package/dist/chunk-VBABZXL7.mjs +0 -3
  563. package/dist/chunk-VBABZXL7.mjs.map +0 -1
  564. package/dist/chunk-WYBSHTGY.mjs +0 -3
  565. package/dist/chunk-WYBSHTGY.mjs.map +0 -1
  566. package/dist/chunk-ZQUMJQYV.mjs +0 -3
  567. package/dist/chunk-ZQUMJQYV.mjs.map +0 -1
  568. package/dist/chunk-ZY23NOT4.mjs +0 -3
  569. package/dist/chunk-ZY23NOT4.mjs.map +0 -1
  570. package/dist/components/EmptyState.d.ts +0 -62
  571. package/dist/components/EmptyState.d.ts.map +0 -1
package/dist/form.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Form.tsx","../src/components/FormControl.tsx","../src/components/Select.tsx","../src/components/Radio.tsx","../src/components/Slider.tsx","../src/components/DatePicker.tsx","../src/components/Upload.tsx","../src/components/Autocomplete.tsx","../src/components/ColorPicker.tsx"],"names":["Form","React","className","children","onSubmit","variant","props","ref","jsx","e","merge","FormField","error","required","errorId","enhancedChildren","child","childProps","childType","isFormComponent","typeObj","displayName","name","isNativeFormElement","existingAriaDescribedBy","ariaDescribedBy","jsxs","FormGroup","inline","FormControl","label","description","htmlFor","showErrorIcon","suppressBrowserValidation","hasError","originalOnInvalid","ErrorIcon","VALIDATION_PRESETS","useFormValidation","initialErrors","errors","setErrors","validate","rules","newErrors","field","rule","value","type","minLength","maxLength","min","max","pattern","custom","messages","stringValue","preset","customError","clearError","prev","next","clearAllErrors","selectVariants","cva","Select","size","success","leftIcon","placeholder","ariaLabel","ariaInvalid","selectRef","combinedRef","node","isFocused","setIsFocused","FORM_STATE","_a","SelectOption","Radio","id","_b","generatedId","radioId","labelId","descriptionId","sizeClasses","dotSizes","variantClasses","stateClasses","isControlled","isChecked","needsReadOnly","Slider","showValue","showLabel","step","onValueChange","orientation","disabled","isRange","currentValue","handleChange","newValue","index","newRange","thumbVariantClasses","thumbSizeClasses","orientationClasses","renderSlider","renderValue","val","_","formatDate","date","format","_locale","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","onChange","minDate","maxDate","dateFormat","locale","markedDates","isOpen","setIsOpen","currentMonth","setCurrentMonth","hoveredDate","setHoveredDate","displayDate","handleDateSelect","handlePrevMonth","handleNextMonth","handleToday","today","daysInMonth","firstDay","weekDaysMap","weekDays","formatMonth","loc","todayText","ariaLabels","formatDateAriaLabel","isDateDisabled","isDateSelected","isToday","isMarkedDate","marked","calendarDays","i","remainingDays","triggerButton","Icon","Popover","isCurrentMonth","isDisabled","isSelected","isTodayDate","isMarked","isHovered","buttonStyle","Button","formatFileSize","bytes","k","sizes","getFileIcon","Upload","files","onRemove","multiple","accept","maxSize","maxFiles","dragDrop","fileInputRef","isDragging","setIsDragging","handleFileSelect","selectedFiles","fileArray","validFiles","file","handleClick","handleDragOver","handleDragLeave","handleDrop","handleRemove","Fragment","Autocomplete","options","loading","maxHeight","clearable","filterable","onSearch","emptyText","inputValue","setInputValue","filteredOptions","setFilteredOptions","selectedIndex","setSelectedIndex","isSearching","setIsSearching","inputRef","dropdownRef","selectedOption","opt","result","filtered","option","handleInputChange","handleInputFocus","handleInputBlur","handleOptionSelect","handleClear","handleKeyDown","Input","isValueSelected","TAILWIND_PALETTE","SPECIAL_COLORS","hexToHsl","hex","r","g","b","h","s","l","d","hslToHex","f","n","color","isValidColor","SaturationLightnessPicker","hue","saturation","lightness","boxRef","useRef","useCallback","clientX","clientY","rect","x","y","newS","newL","handleMouseDown","useEffect","handleMouseMove","handleMouseUp","cursorX","cursorY","cn","HueSlider","TailwindTab","currentColor","onColorSelect","colorName","shades","idx","CustomTab","hexInput","onHslChange","onHexInputChange","newH","ColorPicker","activeTab","setActiveTab","useState","setH","setS","setL","setHexInput","handleHslChange","handleHexInputChange","handleColorSelect"],"mappings":"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","file":"form.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Form 컴포넌트의 props / Form component props\n * @typedef {Object} FormProps\n * @property {(e: React.FormEvent<HTMLFormElement>) => void} [onSubmit] - 폼 제출 핸들러 / Form submit handler\n * @property {\"default\" | \"glass\"} [variant=\"default\"] - Form 스타일 변형 / Form style variant\n * @extends {React.FormHTMLAttributes<HTMLFormElement>}\n */\nexport interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * FormField 컴포넌트의 props / FormField component props\n * @typedef {Object} FormFieldProps\n * @property {string} [error] - 에러 메시지 / Error message\n * @property {boolean} [required=false] - 필수 필드 여부 / Required field\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FormFieldProps extends React.HTMLAttributes<HTMLDivElement> {\n error?: string\n required?: boolean\n}\n\n/**\n * FormGroup 컴포넌트의 props / FormGroup component props\n * @typedef {Object} FormGroupProps\n * @property {boolean} [inline=false] - 인라인 레이아웃 여부 / Inline layout\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FormGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n inline?: boolean\n}\n\n/**\n * Form 컴포넌트 / Form component\n * \n * 폼 컨테이너 컴포넌트입니다.\n * FormField, FormGroup과 함께 사용하여 구조화된 폼을 구성합니다.\n * \n * Form container component.\n * Used with FormField and FormGroup to create structured forms.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Form onSubmit={(e) => { e.preventDefault(); console.log('제출') }}>\n * <FormField>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * </Form>\n * \n * @example\n * // Glass 스타일 / Glass style\n * <Form variant=\"glass\" onSubmit={handleSubmit}>\n * <FormGroup>\n * <FormField>\n * <Label>이메일</Label>\n * <Input type=\"email\" />\n * </FormField>\n * </FormGroup>\n * </Form>\n * \n * @param {FormProps} props - Form 컴포넌트의 props / Form component props\n * @param {React.Ref<HTMLFormElement>} ref - form 요소 ref / form element ref\n * @returns {JSX.Element} Form 컴포넌트 / Form component\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ \n className, \n children, \n onSubmit,\n variant = \"default\",\n ...props \n }, ref) => {\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n onSubmit?.(e)\n }\n\n const variantClasses = {\n default: \"space-y-6\",\n glass: \"space-y-6 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl p-6 shadow-xl dark:bg-slate-800/20 dark:border-slate-700/50\"\n }\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={merge(variantClasses[variant], className)}\n {...props}\n >\n {children}\n </form>\n )\n }\n)\nForm.displayName = \"Form\"\n\n/**\n * FormField 컴포넌트 / FormField component\n * \n * 폼 필드를 감싸는 컨테이너입니다.\n * 에러 메시지를 표시하고 필수 필드 표시를 지원합니다.\n * \n * Container that wraps a form field.\n * Displays error messages and supports required field indication.\n * \n * @component\n * @example\n * <FormField error=\"이 필드는 필수입니다\" required>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * \n * @param {FormFieldProps} props - FormField 컴포넌트의 props / FormField component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FormField 컴포넌트 / FormField component\n */\nconst FormField = React.forwardRef<HTMLDivElement, FormFieldProps>(\n ({ \n className, \n children, \n error,\n required,\n ...props \n }, ref) => {\n const errorId = React.useId()\n\n // 자식 요소에 aria-describedby와 aria-invalid 연결\n // Connect aria-describedby and aria-invalid to child elements\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>\n const childType = child.type\n \n // Input, Select, Textarea 컴포넌트 확인\n // Check for Input, Select, Textarea components\n let isFormComponent = false\n if (typeof childType === 'object' && childType !== null) {\n const typeObj = childType as Record<string, unknown>\n const displayName = typeObj.displayName as string | undefined\n const name = typeObj.name as string | undefined\n isFormComponent = \n displayName === 'Input' || \n displayName === 'Select' || \n displayName === 'Textarea' ||\n name === 'Input' || \n name === 'Select' || \n name === 'Textarea'\n }\n \n // 네이티브 HTML 요소 확인\n // Check for native HTML elements\n const isNativeFormElement = \n typeof childType === 'string' &&\n ['input', 'select', 'textarea'].includes(childType.toLowerCase())\n \n if (isFormComponent || isNativeFormElement) {\n const existingAriaDescribedBy = childProps['aria-describedby'] as string | undefined\n const ariaDescribedBy = error \n ? existingAriaDescribedBy \n ? `${existingAriaDescribedBy} ${errorId}`\n : errorId\n : existingAriaDescribedBy\n \n return React.cloneElement(child, {\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': error ? true : childProps['aria-invalid'],\n required: required || childProps.required,\n } as Record<string, unknown>)\n }\n }\n return child\n })\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)}\n {...props}\n >\n {enhancedChildren}\n {error && (\n <p \n id={errorId}\n className=\"text-sm text-red-600 dark:text-red-400\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nFormField.displayName = \"FormField\"\n\n/**\n * FormGroup 컴포넌트 / FormGroup component\n * \n * 여러 폼 필드를 그룹화하는 컨테이너입니다.\n * Container that groups multiple form fields.\n * \n * @component\n * @example\n * <FormGroup inline>\n * <FormField>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * <FormField>\n * <Label>성</Label>\n * <Input />\n * </FormField>\n * </FormGroup>\n * \n * @param {FormGroupProps} props - FormGroup 컴포넌트의 props / FormGroup component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FormGroup 컴포넌트 / FormGroup component\n */\nconst FormGroup = React.forwardRef<HTMLDivElement, FormGroupProps>(\n ({ \n className, \n children, \n inline = false,\n ...props \n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n inline ? \"flex gap-4\" : \"space-y-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nFormGroup.displayName = \"FormGroup\"\n\nexport { Form, FormField, FormGroup } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * FormControl 컴포넌트의 props / FormControl component props\n * @typedef {Object} FormControlProps\n * @property {string} [label] - 필드 레이블 / Field label\n * @property {string} [description] - 필드 설명 / Field description\n * @property {string} [error] - 에러 메시지 / Error message\n * @property {boolean} [required=false] - 필수 필드 표시 / Required field indicator\n * @property {string} [htmlFor] - 레이블의 for 속성 / Label's for attribute\n * @property {boolean} [showErrorIcon=true] - 에러 아이콘 표시 / Show error icon\n * @property {boolean} [suppressBrowserValidation=true] - 브라우저 유효성 검사 UI 숨기기 / Hide browser validation UI\n * @property {React.ReactNode} children - 폼 입력 요소 / Form input element\n */\nexport interface FormControlProps {\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n htmlFor?: string;\n showErrorIcon?: boolean;\n suppressBrowserValidation?: boolean;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * FormControl 컴포넌트 / FormControl component\n *\n * 폼 입력 요소를 감싸서 레이블, 설명, 에러 메시지를 표시합니다.\n * 브라우저 기본 유효성 검사 팝업 대신 커스텀 에러 메시지를 사용합니다.\n *\n * Wraps form input elements with label, description, and error messages.\n * Uses custom error messages instead of browser default validation popups.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FormControl label=\"Email\" required error={errors.email}>\n * <Input type=\"email\" />\n * </FormControl>\n *\n * @example\n * // 설명 포함 / With description\n * <FormControl\n * label=\"Password\"\n * description=\"Must be at least 8 characters\"\n * error={errors.password}\n * >\n * <Input type=\"password\" />\n * </FormControl>\n */\nfunction FormControl({\n label,\n description,\n error,\n required = false,\n htmlFor,\n showErrorIcon = true,\n suppressBrowserValidation = true,\n className,\n children,\n}: FormControlProps) {\n const hasError = !!error;\n\n // Clone children to add aria-invalid and suppress browser validation\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps: Record<string, unknown> = {\n \"aria-invalid\": hasError || undefined,\n \"aria-describedby\": hasError ? `${htmlFor}-error` : undefined,\n };\n\n // Suppress browser validation tooltip by handling onInvalid\n if (suppressBrowserValidation) {\n childProps.onInvalid = (e: React.FormEvent) => {\n e.preventDefault();\n // Call original onInvalid if exists\n const originalOnInvalid = (child.props as Record<string, unknown>).onInvalid;\n if (typeof originalOnInvalid === \"function\") {\n originalOnInvalid(e);\n }\n };\n }\n\n return React.cloneElement(child, childProps);\n }\n return child;\n });\n\n return (\n <div className={merge(\"space-y-2\", className)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={htmlFor}\n className={merge(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n hasError && \"text-destructive\"\n )}\n >\n {label}\n {required && (\n <span className=\"text-destructive ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n {/* Description */}\n {description && !hasError && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n\n {/* Input - with :invalid styling support */}\n <div className=\"relative [&_input:invalid]:border-destructive/50 [&_select:invalid]:border-destructive/50 [&_textarea:invalid]:border-destructive/50\">\n {enhancedChildren}\n </div>\n\n {/* Error Message */}\n {hasError && (\n <div\n id={htmlFor ? `${htmlFor}-error` : undefined}\n className=\"flex items-start gap-2 text-sm text-destructive\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {showErrorIcon && <ErrorIcon className=\"w-4 h-4 mt-0.5 flex-shrink-0\" />}\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useFormValidation 훅 / useFormValidation hook\n *\n * 폼 유효성 검사를 위한 훅입니다.\n * 브라우저 기본 유효성 검사를 비활성화하고 커스텀 에러 메시지를 사용합니다.\n *\n * Hook for form validation.\n * Disables browser default validation and uses custom error messages.\n *\n * @example\n * const { errors, validate, clearError } = useFormValidation();\n *\n * const handleSubmit = (e) => {\n * e.preventDefault();\n * const isValid = validate({\n * email: { value: email, required: true, pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/ },\n * password: { value: password, required: true, minLength: 8 },\n * });\n * if (isValid) { ... }\n * };\n */\n/**\n * Validation preset types for common field formats\n */\ntype ValidationPreset = \"email\" | \"phone\" | \"url\" | \"alphanumeric\" | \"password\";\n\n/**\n * Preset validation patterns and error messages\n */\nconst VALIDATION_PRESETS: Record<ValidationPreset, { pattern: RegExp; message: string }> = {\n email: {\n pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Invalid email format\",\n },\n phone: {\n pattern: /^[\\d\\s\\-+()]{10,}$/,\n message: \"Invalid phone number format\",\n },\n url: {\n pattern: /^https?:\\/\\/.+\\..+/,\n message: \"Invalid URL format (must start with http:// or https://)\",\n },\n alphanumeric: {\n pattern: /^[a-zA-Z0-9]+$/,\n message: \"Only letters and numbers are allowed\",\n },\n password: {\n pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/,\n message: \"Must contain at least 8 characters with uppercase, lowercase, and number\",\n },\n};\n\ninterface ValidationRule {\n value: string | number | boolean;\n type?: ValidationPreset;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n pattern?: RegExp;\n custom?: (value: string | number | boolean) => string | undefined;\n messages?: {\n required?: string;\n type?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n };\n}\n\ntype ValidationRules = Record<string, ValidationRule>;\ntype ValidationErrors = Record<string, string>;\n\nfunction useFormValidation(initialErrors: ValidationErrors = {}) {\n const [errors, setErrors] = React.useState<ValidationErrors>(initialErrors);\n\n const validate = React.useCallback((rules: ValidationRules): boolean => {\n const newErrors: ValidationErrors = {};\n\n for (const [field, rule] of Object.entries(rules)) {\n const { value, type, required, minLength, maxLength, min, max, pattern, custom, messages = {} } = rule;\n const stringValue = String(value);\n\n // Required check\n if (required && (!value || stringValue.trim() === \"\")) {\n newErrors[field] = messages.required || \"This field is required\";\n continue;\n }\n\n // Skip other validations if empty and not required\n if (!value || stringValue.trim() === \"\") continue;\n\n // Type preset check (email, phone, url, alphanumeric, password)\n if (type) {\n const preset = VALIDATION_PRESETS[type];\n if (preset && !preset.pattern.test(stringValue)) {\n newErrors[field] = messages.type || preset.message;\n continue;\n }\n }\n\n // MinLength check\n if (minLength !== undefined && stringValue.length < minLength) {\n newErrors[field] = messages.minLength || `Must be at least ${minLength} characters`;\n continue;\n }\n\n // MaxLength check\n if (maxLength !== undefined && stringValue.length > maxLength) {\n newErrors[field] = messages.maxLength || `Must be at most ${maxLength} characters`;\n continue;\n }\n\n // Min check (for numbers)\n if (min !== undefined && typeof value === \"number\" && value < min) {\n newErrors[field] = messages.min || `Must be at least ${min}`;\n continue;\n }\n\n // Max check (for numbers)\n if (max !== undefined && typeof value === \"number\" && value > max) {\n newErrors[field] = messages.max || `Must be at most ${max}`;\n continue;\n }\n\n // Pattern check (for custom patterns, overrides type preset)\n if (pattern && !pattern.test(stringValue)) {\n newErrors[field] = messages.pattern || \"Invalid format\";\n continue;\n }\n\n // Custom validation\n if (custom) {\n const customError = custom(value);\n if (customError) {\n newErrors[field] = customError;\n }\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, []);\n\n const clearError = React.useCallback((field: string) => {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n\n const clearAllErrors = React.useCallback(() => {\n setErrors({});\n }, []);\n\n return { errors, validate, clearError, clearAllErrors, setErrors };\n}\n\n// Error icon component\nfunction ErrorIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n );\n}\n\nexport { FormControl, useFormValidation, VALIDATION_PRESETS };\nexport type { ValidationRule, ValidationRules, ValidationErrors, ValidationPreset };\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const selectVariants = cva(\n \"flex w-full appearance-none rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-ring focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background text-foreground focus:border-ring focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring\",\n filled: \"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring\",\n ghost: \"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"h-8 pl-2 text-sm\",\n md: \"h-10 pl-3 text-sm\",\n lg: \"h-12 pl-4 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Select 컴포넌트의 props / Select component props\n */\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n leftIcon?: React.ReactNode\n placeholder?: string\n}\n\n/**\n * SelectOption 컴포넌트의 props / SelectOption component props\n * @typedef {Object} SelectOptionProps\n * @property {string} value - 옵션 값 / Option value\n * @property {React.ReactNode} children - 옵션 표시 텍스트 / Option display text\n * @extends {React.OptionHTMLAttributes<HTMLOptionElement>}\n */\nexport interface SelectOptionProps extends React.OptionHTMLAttributes<HTMLOptionElement> {\n value: string\n children: React.ReactNode\n}\n\n/**\n * Select 컴포넌트 / Select component\n * \n * 드롭다운 선택 메뉴를 제공하는 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Dropdown selection menu component.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Select>\n * <option value=\"option1\">옵션 1</option>\n * <option value=\"option2\">옵션 2</option>\n * </Select>\n * \n * @example\n * // 에러 상태와 아이콘 / Error state with icon\n * <Select \n * error \n * leftIcon={<Icon name=\"alert\" />}\n * aria-label=\"국가 선택\"\n * >\n * <option value=\"\">국가를 선택하세요</option>\n * <option value=\"kr\">한국</option>\n * <option value=\"us\">미국</option>\n * </Select>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Select variant=\"outline\" size=\"lg\">\n * <option value=\"1\">항목 1</option>\n * </Select>\n * \n * @param {SelectProps} props - Select 컴포넌트의 props / Select component props\n * @param {React.Ref<HTMLSelectElement>} ref - select 요소 ref / select element ref\n * @returns {JSX.Element} Select 컴포넌트 / Select component\n */\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n leftIcon,\n placeholder,\n children,\n \"aria-label\": ariaLabel,\n \"aria-invalid\": ariaInvalid,\n ...props \n }, ref) => {\n const selectRef = React.useRef<HTMLSelectElement>(null)\n const combinedRef = React.useCallback((node: HTMLSelectElement | null) => {\n selectRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLSelectElement | null>).current = node\n }\n }, [ref])\n \n const [isFocused, setIsFocused] = React.useState(false)\n\n return (\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground pointer-events-none z-10\">\n {leftIcon}\n </div>\n )}\n <select\n ref={combinedRef}\n className={merge(\n selectVariants({ variant, size }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n leftIcon ? \"pl-10\" : \"\",\n \"pr-10\",\n className\n )}\n aria-label={ariaLabel || (placeholder ? undefined : \"선택\")}\n aria-invalid={ariaInvalid !== undefined ? ariaInvalid : (error || undefined)}\n onFocus={(e) => {\n setIsFocused(true)\n props.onFocus?.(e)\n }}\n onBlur={(e) => {\n setIsFocused(false)\n props.onBlur?.(e)\n }}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n <div className={merge(\n \"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none\",\n \"transition-transform duration-200 ease-out\",\n isFocused && \"rotate-180\"\n )}>\n <svg\n className=\"w-4 h-4 text-muted-foreground\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </div>\n </div>\n )\n }\n)\nSelect.displayName = \"Select\"\n\nconst SelectOption = React.forwardRef<HTMLOptionElement, SelectOptionProps>(\n ({ className, ...props }, ref) => (\n <option\n className={className || \"\"}\n ref={ref}\n {...props}\n />\n )\n)\nSelectOption.displayName = \"SelectOption\"\n\nexport { Select, SelectOption } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Radio 컴포넌트의 props / Radio component props\n * @typedef {Object} RadioProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Radio 스타일 변형 / Radio style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Radio 크기 / Radio size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 라디오 버튼 레이블 텍스트 / Radio button label text\n * @property {string} [description] - 라디오 버튼 설명 텍스트 / Radio button description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Radio 컴포넌트 / Radio component\n * \n * 라디오 버튼 입력 필드를 제공하는 컴포넌트입니다.\n * 같은 name 속성을 가진 여러 Radio는 그룹으로 동작합니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Radio button input field component.\n * Multiple Radio components with the same name attribute work as a group.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 (그룹) / Basic usage (group)\n * <Radio name=\"option\" value=\"1\" label=\"옵션 1\" />\n * <Radio name=\"option\" value=\"2\" label=\"옵션 2\" />\n * <Radio name=\"option\" value=\"3\" label=\"옵션 3\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Radio \n * name=\"gender\"\n * value=\"male\"\n * label=\"남성\"\n * error\n * />\n * \n * @param {RadioProps} props - Radio 컴포넌트의 props / Radio component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Radio 컴포넌트 / Radio component\n */\nconst Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const radioId = id || generatedId\n const labelId = label ? `${radioId}-label` : undefined\n const descriptionId = description ? `${radioId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const dotSizes = {\n sm: \"w-1.5 h-1.5\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\"\n }\n\n const variantClasses = {\n default: \"border-input bg-background text-primary focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-primary focus:ring-ring\",\n filled: \"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20\",\n }\n\n const stateClasses = error\n ? \"border-destructive focus:ring-destructive\"\n : success\n ? \"border-green-500 focus:ring-green-500\"\n : \"\"\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"radio\"\n id={radioId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"radio\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded-full border transition-all duration-200 cursor-pointer\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"border-primary dark:border-primary\"\n )}\n >\n <div\n className={merge(\n \"rounded-full bg-primary dark:bg-primary transition-all duration-200\",\n dotSizes[size],\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={radioId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nRadio.displayName = \"Radio\"\n\nexport { Radio } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Slider 컴포넌트의 props\n * @typedef {Object} SliderProps\n * @property {\"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"} [variant=\"default\"] - Slider 스타일 변형\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Slider 크기\n * @property {boolean} [showValue=false] - 현재 값 표시 여부\n * @property {boolean} [showLabel=false] - 라벨 표시 여부\n * @property {string} [label] - 라벨 텍스트\n * @property {number} [min=0] - 최소값\n * @property {number} [max=100] - 최대값\n * @property {number} [step=1] - 단계값\n * @property {number | number[]} [value=0] - 현재 값 (배열이면 범위 슬라이더)\n * @property {(value: number | number[]) => void} [onValueChange] - 값 변경 콜백\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - Slider 방향\n * @property {boolean} [disabled=false] - 비활성화 여부\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size'>}\n */\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size'> {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"\n size?: \"sm\" | \"md\" | \"lg\"\n showValue?: boolean\n showLabel?: boolean\n label?: string\n min?: number\n max?: number\n step?: number\n value?: number | number[]\n onValueChange?: (value: number | number[]) => void\n orientation?: \"horizontal\" | \"vertical\"\n disabled?: boolean\n className?: string\n}\n\n/**\n * Slider 컴포넌트 / Slider component\n * \n * 숫자 값을 선택하는 슬라이더 컴포넌트입니다.\n * 단일 값 또는 범위 값을 선택할 수 있습니다.\n * \n * Slider component for selecting numeric values.\n * Supports single value or range value selection.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [value, setValue] = useState(50)\n * <Slider value={value} onValueChange={setValue} />\n * \n * @example\n * // 범위 슬라이더 / Range slider\n * const [range, setRange] = useState([20, 80])\n * <Slider \n * value={range} \n * onValueChange={setRange}\n * showValue\n * label=\"가격 범위\"\n * />\n * \n * @example\n * // 세로 슬라이더 / Vertical slider\n * <Slider \n * orientation=\"vertical\"\n * variant=\"primary\"\n * size=\"lg\"\n * className=\"h-64\"\n * />\n * \n * @param {SliderProps} props - Slider 컴포넌트의 props / Slider component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Slider 컴포넌트 / Slider component\n */\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n ({ \n className,\n variant = \"default\",\n size = \"md\",\n showValue = false,\n showLabel = false,\n label,\n min = 0,\n max = 100,\n step = 1,\n value = 0,\n onValueChange,\n orientation = \"horizontal\",\n disabled = false,\n ...props \n }, ref) => {\n const isRange = Array.isArray(value)\n const currentValue = isRange ? value : [value]\n \n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value)\n if (onValueChange) {\n if (isRange) {\n // 범위 슬라이더의 경우, 어떤 슬라이더가 변경되었는지 확인\n const index = parseInt(e.target.dataset.index || \"0\")\n const newRange = [...currentValue]\n newRange[index] = newValue\n onValueChange(newRange)\n } else {\n onValueChange(newValue)\n }\n }\n }\n\n const variantClasses = {\n default: \"bg-muted\",\n primary: \"bg-primary/20\",\n success: \"bg-[var(--progress-success)]/20\",\n warning: \"bg-[var(--progress-warning)]/20\",\n danger: \"bg-destructive/20\",\n }\n\n const thumbVariantClasses = {\n default: \"bg-muted-foreground hover:bg-foreground\",\n primary: \"bg-primary hover:bg-primary/90\",\n success: \"bg-[var(--progress-success)] hover:bg-[var(--progress-success)]/90\",\n warning: \"bg-[var(--progress-warning)] hover:bg-[var(--progress-warning)]/90\",\n danger: \"bg-destructive hover:bg-destructive/90\",\n }\n\n const sizeClasses = {\n sm: orientation === \"horizontal\" ? \"h-1\" : \"w-1\",\n md: orientation === \"horizontal\" ? \"h-2\" : \"w-2\",\n lg: orientation === \"horizontal\" ? \"h-3\" : \"w-3\"\n }\n\n const thumbSizeClasses = {\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-6 h-6\"\n }\n\n const orientationClasses = orientation === \"vertical\" \n ? \"flex-col h-full\" \n : \"flex-row w-full\"\n\n const renderSlider = (index: number = 0) => (\n <input\n key={index}\n ref={index === 0 ? ref : undefined}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue[index]}\n onChange={handleChange}\n data-index={index}\n disabled={disabled}\n className={merge(\n \"appearance-none cursor-pointer rounded-full transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n orientation === \"vertical\" ? \"writing-mode: bt-lr; -webkit-appearance: slider-vertical\" : \"\",\n className\n )}\n style={{\n ...(orientation === \"vertical\" && {\n writingMode: \"vertical-rl\" as const,\n WebkitAppearance: \"slider-vertical\"\n })\n }}\n {...props}\n />\n )\n\n const renderValue = () => {\n if (!showValue) return null\n \n if (isRange) {\n return (\n <div className=\"flex gap-2 text-sm text-muted-foreground\">\n {currentValue.map((val, index) => (\n <span key={index} className=\"font-mono\">\n {val}\n </span>\n ))}\n </div>\n )\n }\n \n return (\n <span className=\"text-sm font-mono text-muted-foreground\">\n {currentValue[0]}\n </span>\n )\n }\n\n return (\n <div className={merge(\"flex items-center gap-4\", orientationClasses)}>\n {showLabel && label && (\n <label className=\"text-sm font-medium text-foreground min-w-0\">\n {label}\n </label>\n )}\n \n <div className=\"flex-1 relative\">\n <div className={merge(\"relative\", orientation === \"vertical\" ? \"h-full\" : \"w-full h-4 flex items-center\")}>\n {/* 배경 트랙 */}\n <div className={merge(\n \"absolute rounded-full\",\n sizeClasses[size],\n variantClasses[variant],\n orientation === \"vertical\" ? \"h-full left-1/2 -translate-x-1/2\" : \"w-full\"\n )} />\n \n {/* 활성 트랙 (값에 따른 채워진 부분) */}\n {isRange ? (\n // 범위 슬라이더\n <div className={merge(\n \"absolute rounded-full bg-primary\",\n sizeClasses[size],\n orientation === \"vertical\"\n ? \"left-1/2 -translate-x-1/2\"\n : \"\"\n )} style={{\n ...(orientation === \"vertical\"\n ? {\n bottom: `${(currentValue[0] - min) / (max - min) * 100}%`,\n height: `${(currentValue[1] - currentValue[0]) / (max - min) * 100}%`\n }\n : {\n left: `${(currentValue[0] - min) / (max - min) * 100}%`,\n width: `${(currentValue[1] - currentValue[0]) / (max - min) * 100}%`\n }\n )\n }} />\n ) : (\n // 단일 슬라이더\n <div className={merge(\n \"absolute rounded-full bg-primary\",\n sizeClasses[size],\n orientation === \"vertical\"\n ? \"left-1/2 -translate-x-1/2 bottom-0\"\n : \"left-0\"\n )} style={{\n ...(orientation === \"vertical\"\n ? { height: `${(currentValue[0] - min) / (max - min) * 100}%` }\n : { width: `${(currentValue[0] - min) / (max - min) * 100}%` }\n )\n }} />\n )}\n \n {/* 슬라이더 핸들들 */}\n {isRange ? (\n // 범위 슬라이더 핸들\n currentValue.map((_, index) => (\n <div\n key={index}\n className={merge(\n \"absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110\",\n thumbSizeClasses[size],\n thumbVariantClasses[variant],\n orientation === \"vertical\" \n ? \"left-1/2 transform -translate-x-1/2\" \n : \"top-1/2 transform -translate-y-1/2\"\n )}\n style={{\n ...(orientation === \"vertical\"\n ? { bottom: `${(currentValue[index] - min) / (max - min) * 100}%` }\n : { left: `${(currentValue[index] - min) / (max - min) * 100}%` }\n )\n }}\n />\n ))\n ) : (\n // 단일 슬라이더 핸들\n <div\n className={merge(\n \"absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110\",\n thumbSizeClasses[size],\n thumbVariantClasses[variant],\n orientation === \"vertical\" \n ? \"left-1/2 transform -translate-x-1/2\" \n : \"top-1/2 transform -translate-y-1/2\"\n )}\n style={{\n ...(orientation === \"vertical\"\n ? { bottom: `${(currentValue[0] - min) / (max - min) * 100}%` }\n : { left: `${(currentValue[0] - min) / (max - min) * 100}%` }\n )\n }}\n />\n )}\n </div>\n \n {/* 실제 input 요소들 (숨김) */}\n <div className=\"absolute inset-0 opacity-0\">\n {isRange ? (\n currentValue.map((_, index) => renderSlider(index))\n ) : (\n renderSlider()\n )}\n </div>\n </div>\n \n {renderValue()}\n </div>\n )\n }\n)\nSlider.displayName = \"Slider\"\n\nexport { Slider }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Popover } from \"./Popover\"\nimport { Button } from \"./Button\"\n\n/**\n * DatePicker 컴포넌트의 props / DatePicker component props\n * @typedef {Object} DatePickerProps\n * @property {Date | null} [value] - 선택된 날짜 / Selected date\n * @property {(date: Date | null) => void} [onChange] - 날짜 변경 핸들러 / Date change handler\n * @property {Date} [minDate] - 최소 날짜 / Minimum date\n * @property {Date} [maxDate] - 최대 날짜 / Maximum date\n * @property {string} [placeholder=\"날짜를 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {string} [dateFormat=\"YYYY-MM-DD\"] - 날짜 포맷 / Date format\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>}\n */\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: Date | null\n onChange?: (date: Date | null) => void\n minDate?: Date\n maxDate?: Date\n placeholder?: string\n disabled?: boolean\n error?: boolean\n dateFormat?: string\n locale?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n /** 표시할 날짜 배열 (점으로 표시) / Dates to mark with a dot */\n markedDates?: Date[]\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm px-3\",\n md: \"h-10 text-sm px-4\",\n lg: \"h-12 text-base px-5\",\n}\n\nconst formatDate = (date: Date | null, format: string = \"YYYY-MM-DD\", _locale: string = \"ko-KR\"): string => {\n if (!date) return \"\"\n \n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n \n return format\n .replace(\"YYYY\", String(year))\n .replace(\"MM\", month)\n .replace(\"DD\", day)\n}\n\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate()\n}\n\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay()\n}\n\n/**\n * DatePicker 컴포넌트 / DatePicker component\n * \n * 날짜를 선택할 수 있는 컴포넌트입니다.\n * 캘린더 팝오버를 통해 직관적으로 날짜를 선택할 수 있습니다.\n * \n * Component for selecting dates.\n * Allows intuitive date selection through a calendar popover.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DatePicker\n * value={selectedDate}\n * onChange={setSelectedDate}\n * />\n * \n * @example\n * // 날짜 범위 제한 / Date range restriction\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * minDate={new Date(\"2024-01-01\")}\n * maxDate={new Date(\"2024-12-31\")}\n * placeholder=\"날짜 선택\"\n * />\n * \n * @param {DatePickerProps} props - DatePicker 컴포넌트의 props / DatePicker component props\n * @returns {JSX.Element} DatePicker 컴포넌트 / DatePicker component\n */\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n minDate,\n maxDate,\n placeholder = \"날짜를 선택하세요\",\n disabled = false,\n error = false,\n dateFormat = \"YYYY-MM-DD\",\n locale = \"ko-KR\",\n size = \"md\",\n className,\n markedDates,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(value ? new Date(value.getFullYear(), value.getMonth()) : new Date())\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null)\n\n const displayDate = value ? formatDate(value, dateFormat, locale) : \"\"\n\n const handleDateSelect = (date: Date) => {\n if (minDate && date < minDate) return\n if (maxDate && date > maxDate) return\n onChange?.(date)\n setIsOpen(false)\n }\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1))\n }\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1))\n }\n\n const handleToday = () => {\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n handleDateSelect(today)\n }\n\n const year = currentMonth.getFullYear()\n const month = currentMonth.getMonth()\n const daysInMonth = getDaysInMonth(year, month)\n const firstDay = getFirstDayOfMonth(year, month)\n\n // 로케일별 요일 텍스트\n const weekDaysMap: Record<string, string[]> = {\n \"ko-KR\": [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n \"ko\": [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n \"ja-JP\": [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n \"ja\": [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n \"en-US\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n \"en\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n }\n const weekDays = weekDaysMap[locale] || weekDaysMap[\"en\"]\n\n // 로케일별 월 포맷\n const formatMonth = (year: number, month: number, loc: string): string => {\n if (loc === \"ko-KR\" || loc === \"ko\") {\n return `${year}년 ${month + 1}월`\n } else if (loc === \"ja-JP\" || loc === \"ja\") {\n return `${year}年 ${month + 1}月`\n } else {\n const monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n return `${monthNames[month]} ${year}`\n }\n }\n\n // 로케일별 \"오늘\" 텍스트\n const todayTextMap: Record<string, string> = {\n \"ko-KR\": \"오늘\",\n \"ko\": \"오늘\",\n \"ja-JP\": \"今日\",\n \"ja\": \"今日\",\n \"en-US\": \"Today\",\n \"en\": \"Today\",\n }\n const todayText = todayTextMap[locale] || \"Today\"\n\n // 로케일별 aria-label 텍스트\n const ariaLabels = {\n prevMonth: locale.startsWith(\"ko\") ? \"이전 달\" : locale.startsWith(\"ja\") ? \"前月\" : \"Previous month\",\n nextMonth: locale.startsWith(\"ko\") ? \"다음 달\" : locale.startsWith(\"ja\") ? \"翌月\" : \"Next month\",\n }\n\n // 날짜 aria-label 포맷\n const formatDateAriaLabel = (date: Date, loc: string): string => {\n if (loc.startsWith(\"ko\")) {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`\n } else if (loc.startsWith(\"ja\")) {\n return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`\n } else {\n return date.toLocaleDateString(\"en-US\", { year: \"numeric\", month: \"long\", day: \"numeric\" })\n }\n }\n\n const isDateDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true\n if (maxDate && date > maxDate) return true\n return false\n }\n\n const isDateSelected = (date: Date): boolean => {\n if (!value) return false\n return (\n date.getFullYear() === value.getFullYear() &&\n date.getMonth() === value.getMonth() &&\n date.getDate() === value.getDate()\n )\n }\n\n const isToday = (date: Date): boolean => {\n const today = new Date()\n return (\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate()\n )\n }\n\n const isMarkedDate = (date: Date): boolean => {\n if (!markedDates) return false\n return markedDates.some(\n (marked) =>\n marked.getFullYear() === date.getFullYear() &&\n marked.getMonth() === date.getMonth() &&\n marked.getDate() === date.getDate()\n )\n }\n\n const calendarDays: (Date | null)[] = []\n\n // 이전 달의 마지막 날들\n for (let i = firstDay - 1; i >= 0; i--) {\n const date = new Date(year, month, -i)\n calendarDays.push(date)\n }\n\n // 현재 달의 날들\n for (let day = 1; day <= daysInMonth; day++) {\n calendarDays.push(new Date(year, month, day))\n }\n\n // 다음 달의 첫 날들 (현재 행만 채우기 - 불필요한 추가 행 방지)\n const totalRows = Math.ceil(calendarDays.length / 7)\n const totalSlots = totalRows * 7\n const remainingDays = totalSlots - calendarDays.length\n for (let day = 1; day <= remainingDays; day++) {\n calendarDays.push(new Date(year, month + 1, day))\n }\n\n const triggerButton = (\n <button\n type=\"button\"\n disabled={disabled}\n className={merge(\n \"flex w-full items-center justify-between rounded-lg border border-input bg-background px-4 py-2 text-left text-sm transition-colors\",\n \"hover:bg-muted focus:outline-none focus:ring-1 focus:ring-ring focus:ring-offset-2\",\n error && \"border-destructive focus:ring-destructive\",\n disabled && \"cursor-not-allowed opacity-50\",\n sizeClasses[size]\n )}\n aria-label={displayDate || placeholder}\n >\n <span className={merge(\"flex-1\", !displayDate && \"text-muted-foreground\")}>\n {displayDate || placeholder}\n </span>\n <Icon\n name=\"calendar\"\n className=\"ml-2 h-4 w-4\"\n />\n </button>\n )\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n <Popover\n open={isOpen}\n onOpenChange={setIsOpen}\n trigger={triggerButton}\n position=\"bottom\"\n align=\"start\"\n fullWidth\n contentClassName=\"p-0\"\n >\n <div\n className=\"rounded-lg bg-popover\"\n >\n <div className=\"p-4\">\n {/* 헤더 */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className=\"rounded-lg p-2 hover:bg-muted transition-colors\"\n aria-label={ariaLabels.prevMonth}\n >\n <Icon name=\"chevronLeft\" className=\"h-4 w-4\" />\n </button>\n <div className=\"text-lg font-semibold text-foreground\">\n {formatMonth(year, month, locale)}\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className=\"rounded-lg p-2 hover:bg-muted transition-colors\"\n aria-label={ariaLabels.nextMonth}\n >\n <Icon name=\"chevronRight\" className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* 요일 헤더 */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {weekDays.map((day, index) => (\n <div\n key={index}\n className={merge(\n \"text-center text-xs font-medium py-2\",\n index === 0 && \"text-destructive\",\n index === 6 && \"text-primary\"\n )}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 캘린더 그리드 */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n if (!date) return <div key={index} />\n\n const isCurrentMonth = date.getMonth() === month\n const isDisabled = isDateDisabled(date)\n const isSelected = isDateSelected(date)\n const isTodayDate = isToday(date)\n const isMarked = isMarkedDate(date)\n const isHovered = hoveredDate &&\n date.getFullYear() === hoveredDate.getFullYear() &&\n date.getMonth() === hoveredDate.getMonth() &&\n date.getDate() === hoveredDate.getDate()\n\n const buttonStyle: React.CSSProperties = {\n ...(!isCurrentMonth && !isSelected ? { opacity: 0.3 } : {}),\n ...(isSelected ? { backgroundColor: 'hsl(var(--primary, 187 92% 50%))', color: '#fff' } : {}),\n ...(isTodayDate && !isSelected ? {\n boxShadow: 'inset 0 0 0 2px hsl(var(--primary, 187 92% 50%))',\n fontWeight: 700,\n } : {}),\n ...(isHovered && !isSelected ? { backgroundColor: 'hsl(var(--primary, 187 92% 50%) / 0.15)' } : {}),\n }\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleDateSelect(date)}\n onMouseEnter={() => setHoveredDate(date)}\n onMouseLeave={() => setHoveredDate(null)}\n className=\"relative flex flex-col items-center justify-center h-9 w-9 rounded-lg text-sm font-medium transition-all focus:outline-none\"\n style={buttonStyle}\n aria-label={formatDateAriaLabel(date, locale)}\n >\n <span className=\"relative z-10 leading-none\">\n {date.getDate()}\n </span>\n {isMarked && (\n <span\n className=\"absolute rounded-full\"\n style={{\n bottom: '1px',\n width: '6px',\n height: '6px',\n backgroundColor: isSelected ? '#fff' : 'hsl(var(--primary, 187 92% 50%))',\n }}\n />\n )}\n </button>\n )\n })}\n </div>\n\n {/* 오늘 버튼 */}\n <div className=\"mt-4 pt-4 border-t border-border\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleToday}\n className=\"w-full\"\n >\n {todayText}\n </Button>\n </div>\n </div>\n </div>\n </Popover>\n </div>\n )\n }\n)\n\nDatePicker.displayName = \"DatePicker\"\n\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * 업로드된 파일 정보 인터페이스 / Uploaded file information interface\n * @typedef {Object} UploadedFile\n * @property {string} id - 파일 고유 ID / File unique ID\n * @property {File} file - 파일 객체 / File object\n * @property {string} name - 파일 이름 / File name\n * @property {number} size - 파일 크기 (bytes) / File size in bytes\n * @property {string} type - 파일 타입 / File type\n * @property {number} [progress] - 업로드 진행률 (0-100) / Upload progress (0-100)\n * @property {\"pending\" | \"uploading\" | \"success\" | \"error\"} [status] - 업로드 상태 / Upload status\n * @property {string} [url] - 업로드된 파일 URL / Uploaded file URL\n * @property {string} [error] - 에러 메시지 / Error message\n */\nexport interface UploadedFile {\n id: string\n file: File\n name: string\n size: number\n type: string\n progress?: number\n status?: \"pending\" | \"uploading\" | \"success\" | \"error\"\n url?: string\n error?: string\n}\n\n/**\n * Upload 컴포넌트의 props / Upload component props\n * @typedef {Object} UploadProps\n * @property {UploadedFile[]} [files] - 업로드된 파일 목록 / Uploaded files list\n * @property {(files: File[]) => void} [onChange] - 파일 선택 핸들러 / File selection handler\n * @property {(file: UploadedFile) => void} [onRemove] - 파일 제거 핸들러 / File removal handler\n * @property {boolean} [multiple=false] - 다중 파일 선택 허용 / Allow multiple file selection\n * @property {string} [accept] - 허용할 파일 타입 (예: \"image/*\", \".pdf\") / Accepted file types\n * @property {number} [maxSize] - 최대 파일 크기 (bytes) / Maximum file size in bytes\n * @property {number} [maxFiles] - 최대 파일 개수 / Maximum number of files\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [dragDrop=true] - 드래그 앤 드롭 활성화 / Enable drag and drop\n * @property {string} [placeholder=\"파일을 선택하거나 여기에 드래그하세요\"] - 플레이스홀더 / Placeholder\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n */\nexport interface UploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n files?: UploadedFile[]\n onChange?: (files: File[]) => void\n onRemove?: (file: UploadedFile) => void\n multiple?: boolean\n accept?: string\n maxSize?: number\n maxFiles?: number\n disabled?: boolean\n dragDrop?: boolean\n placeholder?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\"\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i]\n}\n\nconst getFileIcon = (type: string): IconName => {\n if (type.startsWith(\"image/\")) return \"image\"\n if (type.startsWith(\"video/\")) return \"video\"\n if (type.includes(\"pdf\")) return \"fileText\"\n if (type.includes(\"word\") || type.includes(\"document\")) return \"fileText\"\n if (type.includes(\"excel\") || type.includes(\"spreadsheet\")) return \"fileText\"\n return \"file\"\n}\n\n/**\n * Upload 컴포넌트 / Upload component\n * \n * 파일을 업로드할 수 있는 컴포넌트입니다.\n * 드래그 앤 드롭, 다중 파일 선택, 파일 크기 제한 등을 지원합니다.\n * \n * Component for uploading files.\n * Supports drag and drop, multiple file selection, file size limits, and more.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Upload\n * onChange={(files) => console.log(files)}\n * />\n * \n * @example\n * // 이미지만, 다중 선택 / Images only, multiple selection\n * <Upload\n * accept=\"image/*\"\n * multiple\n * maxSize={5 * 1024 * 1024} // 5MB\n * maxFiles={5}\n * files={uploadedFiles}\n * onRemove={(file) => handleRemove(file)}\n * />\n * \n * @param {UploadProps} props - Upload 컴포넌트의 props / Upload component props\n * @returns {JSX.Element} Upload 컴포넌트 / Upload component\n */\nexport const Upload = React.forwardRef<HTMLDivElement, UploadProps>(\n (\n {\n files = [],\n onChange,\n onRemove,\n multiple = false,\n accept,\n maxSize,\n maxFiles,\n disabled = false,\n dragDrop = true,\n placeholder = \"파일을 선택하거나 여기에 드래그하세요\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n\n const handleFileSelect = (selectedFiles: FileList | null) => {\n if (!selectedFiles || selectedFiles.length === 0) return\n\n const fileArray = Array.from(selectedFiles)\n \n // 파일 개수 체크\n if (maxFiles && files.length + fileArray.length > maxFiles) {\n alert(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`)\n return\n }\n\n // 파일 크기 체크\n const validFiles = fileArray.filter((file) => {\n if (maxSize && file.size > maxSize) {\n alert(`파일 크기는 ${formatFileSize(maxSize)}를 초과할 수 없습니다: ${file.name}`)\n return false\n }\n return true\n })\n\n if (validFiles.length > 0) {\n onChange?.(validFiles)\n }\n }\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click()\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n if (!disabled && dragDrop) {\n setIsDragging(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n if (!disabled && dragDrop) {\n handleFileSelect(e.dataTransfer.files)\n }\n }\n\n const handleRemove = (file: UploadedFile) => {\n onRemove?.(file)\n }\n\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\",\n }\n\n return (\n <div ref={ref} className={merge(\"w-full\", className)} {...props}>\n {/* 업로드 영역 */}\n <div\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={merge(\n \"relative border-2 border-dashed rounded-xl transition-all cursor-pointer\",\n \"bg-muted/50\",\n \"border-border\",\n isDragging && \"border-primary bg-primary/10\",\n disabled && \"cursor-not-allowed opacity-50\",\n sizeClasses[size]\n )}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={(e) => handleFileSelect(e.target.files)}\n className=\"hidden\"\n aria-label=\"파일 선택\"\n />\n \n <div className=\"flex flex-col items-center justify-center text-center\">\n <div className={merge(\n \"rounded-full bg-primary/10 p-4 mb-4\",\n isDragging && \"bg-primary/20\"\n )}>\n <Icon\n name=\"upload\"\n className={merge(\n \"h-8 w-8 text-primary\",\n isDragging && \"scale-110\"\n )} \n />\n </div>\n <p className=\"text-sm font-medium text-foreground mb-1\">\n {placeholder}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {accept && `지원 형식: ${accept}`}\n {maxSize && ` • 최대 크기: ${formatFileSize(maxSize)}`}\n {maxFiles && ` • 최대 ${maxFiles}개`}\n </p>\n </div>\n </div>\n\n {/* 파일 목록 */}\n {files.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {files.map((file) => (\n <div\n key={file.id}\n className={merge(\n \"flex items-center gap-3 p-3 rounded-lg border\",\n \"bg-card\",\n \"border-border\",\n file.status === \"error\" && \"border-destructive/50 bg-destructive/5\"\n )}\n >\n <div className=\"flex-shrink-0\">\n <div className=\"rounded-lg bg-muted p-2\">\n <Icon\n name={getFileIcon(file.type)}\n className=\"h-5 w-5 text-muted-foreground\"\n />\n </div>\n </div>\n \n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {file.name}\n </p>\n <div className=\"flex items-center gap-2 mt-1\">\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </p>\n {file.status === \"uploading\" && file.progress !== undefined && (\n <>\n <div className=\"flex-1 h-1.5 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.progress}%` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {file.progress}%\n </span>\n </>\n )}\n {file.status === \"success\" && (\n <span className=\"text-xs text-[var(--progress-success)] flex items-center gap-1\">\n <Icon name=\"check\" className=\"h-3 w-3\" />\n 완료\n </span>\n )}\n {file.status === \"error\" && (\n <span className=\"text-xs text-destructive\">\n {file.error || \"업로드 실패\"}\n </span>\n )}\n </div>\n </div>\n\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => handleRemove(file)}\n className=\"flex-shrink-0 rounded-lg p-1.5 hover:bg-muted transition-colors\"\n aria-label=\"파일 제거\"\n >\n <Icon name=\"close\" className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nUpload.displayName = \"Upload\"\n\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Input } from \"./Input\"\n\n/**\n * Autocomplete 옵션 인터페이스 / Autocomplete option interface\n * @typedef {Object} AutocompleteOption\n * @property {string} value - 옵션 값 / Option value\n * @property {string} label - 옵션 라벨 / Option label\n * @property {string} [description] - 옵션 설명 / Option description\n * @property {React.ReactNode} [icon] - 옵션 아이콘 / Option icon\n * @property {Record<string, unknown>} [data] - 추가 데이터 / Additional data\n */\nexport interface AutocompleteOption {\n value: string\n label: string\n description?: string\n icon?: React.ReactNode\n data?: Record<string, unknown>\n}\n\n/**\n * Autocomplete 컴포넌트의 props / Autocomplete component props\n * @typedef {Object} AutocompleteProps\n * @property {AutocompleteOption[]} options - 옵션 목록 / Options list\n * @property {string} [value] - 선택된 값 / Selected value\n * @property {(value: string, option?: AutocompleteOption) => void} [onChange] - 값 변경 핸들러 / Value change handler\n * @property {string} [placeholder=\"검색하거나 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {number} [maxHeight=300] - 드롭다운 최대 높이 (px) / Dropdown max height in px\n * @property {boolean} [clearable=true] - 지우기 버튼 표시 / Show clear button\n * @property {boolean} [filterable=true] - 필터링 활성화 / Enable filtering\n * @property {(query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>} [onSearch] - 검색 핸들러 (비동기 지원) / Search handler (async support)\n * @property {React.ReactNode} [emptyText=\"결과가 없습니다\"] - 빈 결과 텍스트 / Empty result text\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>}\n */\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: AutocompleteOption[]\n value?: string\n onChange?: (value: string, option?: AutocompleteOption) => void\n placeholder?: string\n disabled?: boolean\n error?: boolean\n loading?: boolean\n maxHeight?: number\n clearable?: boolean\n filterable?: boolean\n onSearch?: (query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>\n emptyText?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n}\n\n/**\n * Autocomplete 컴포넌트 / Autocomplete component\n * \n * 자동완성 입력 컴포넌트입니다.\n * 입력하면서 옵션을 필터링하고 선택할 수 있습니다.\n * \n * Autocomplete input component.\n * Filters and selects options as you type.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Autocomplete\n * options={[\n * { value: \"1\", label: \"옵션 1\" },\n * { value: \"2\", label: \"옵션 2\" }\n * ]}\n * onChange={(value) => console.log(value)}\n * />\n * \n * @example\n * // 비동기 검색 / Async search\n * <Autocomplete\n * options={options}\n * onSearch={async (query) => {\n * const results = await searchAPI(query)\n * return results\n * }}\n * loading={isLoading}\n * />\n * \n * @param {AutocompleteProps} props - Autocomplete 컴포넌트의 props / Autocomplete component props\n * @returns {JSX.Element} Autocomplete 컴포넌트 / Autocomplete component\n */\nexport const Autocomplete = React.forwardRef<HTMLDivElement, AutocompleteProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = \"검색하거나 선택하세요\",\n disabled = false,\n error = false,\n loading = false,\n maxHeight = 300,\n clearable = true,\n filterable = true,\n onSearch,\n emptyText = \"결과가 없습니다\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const [inputValue, setInputValue] = React.useState(\"\")\n const [filteredOptions, setFilteredOptions] = React.useState<AutocompleteOption[]>(options)\n const [selectedIndex, setSelectedIndex] = React.useState(-1)\n const [isSearching, setIsSearching] = React.useState(false)\n \n const inputRef = React.useRef<HTMLInputElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const selectedOption = React.useMemo(() => {\n return options.find((opt) => opt.value === value)\n }, [options, value])\n\n // 초기 입력값 설정\n React.useEffect(() => {\n if (selectedOption) {\n setInputValue(selectedOption.label)\n } else if (!value) {\n setInputValue(\"\")\n }\n }, [selectedOption, value])\n\n // 옵션 필터링\n React.useEffect(() => {\n if (onSearch) {\n setIsSearching(true)\n const result = onSearch(inputValue)\n if (result instanceof Promise) {\n result.then((filtered) => {\n setFilteredOptions(filtered)\n setIsSearching(false)\n })\n } else {\n setFilteredOptions(result)\n setIsSearching(false)\n }\n } else if (filterable) {\n if (!inputValue.trim()) {\n setFilteredOptions(options)\n } else {\n const filtered = options.filter((option) =>\n option.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.value.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.description?.toLowerCase().includes(inputValue.toLowerCase())\n )\n setFilteredOptions(filtered)\n }\n } else {\n setFilteredOptions(options)\n }\n }, [inputValue, options, filterable, onSearch])\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setInputValue(newValue)\n setIsOpen(true)\n setSelectedIndex(-1)\n \n if (!newValue && clearable) {\n onChange?.(\"\")\n }\n }\n\n const handleInputFocus = () => {\n setIsOpen(true)\n }\n\n const handleInputBlur = (e: React.FocusEvent) => {\n // 드롭다운 클릭 시에는 닫지 않음\n if (dropdownRef.current?.contains(e.relatedTarget as Node)) {\n return\n }\n setIsOpen(false)\n setSelectedIndex(-1)\n \n // 선택된 옵션이 있으면 그 라벨로 복원\n if (selectedOption) {\n setInputValue(selectedOption.label)\n }\n }\n\n const handleOptionSelect = (option: AutocompleteOption) => {\n setInputValue(option.label)\n onChange?.(option.value, option)\n setIsOpen(false)\n inputRef.current?.blur()\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange?.(\"\")\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || filteredOptions.length === 0) {\n if (e.key === \"ArrowDown\") {\n setIsOpen(true)\n }\n return\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault()\n setSelectedIndex((prev) => \n prev < filteredOptions.length - 1 ? prev + 1 : prev\n )\n break\n case \"ArrowUp\":\n e.preventDefault()\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1))\n break\n case \"Enter\":\n e.preventDefault()\n if (selectedIndex >= 0 && filteredOptions[selectedIndex]) {\n handleOptionSelect(filteredOptions[selectedIndex])\n }\n break\n case \"Escape\":\n setIsOpen(false)\n inputRef.current?.blur()\n break\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative w-full\", className)} {...props}>\n <div className=\"relative\">\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error}\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls=\"autocomplete-list\"\n className={merge(sizeClasses[size], \"pr-10\")}\n />\n \n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\n {loading || isSearching ? (\n <Icon \n name=\"loader\"\n className=\"h-4 w-4 animate-spin text-muted-foreground\"\n />\n ) : clearable && inputValue ? (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"rounded p-1 hover:bg-muted transition-colors\"\n aria-label=\"지우기\"\n >\n <Icon name=\"close\" className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n ) : (\n <Icon name=\"chevronDown\" className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </div>\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n id=\"autocomplete-list\"\n role=\"listbox\"\n className={merge(\n \"absolute z-50 w-full mt-1 rounded-lg border shadow-lg\",\n \"bg-popover text-popover-foreground\",\n \"border-border\",\n \"overflow-hidden\"\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n <div className=\"overflow-y-auto\" style={{ maxHeight: `${maxHeight}px` }}>\n {filteredOptions.length === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n {emptyText}\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = selectedIndex === index\n const isValueSelected = value === option.value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isValueSelected}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setSelectedIndex(index)}\n className={merge(\n \"px-4 py-3 cursor-pointer transition-colors\",\n \"hover:bg-muted\",\n isSelected && \"bg-primary/10\",\n isValueSelected && \"bg-primary/15\"\n )}\n >\n <div className=\"flex items-center gap-3\">\n {option.icon && (\n <div className=\"flex-shrink-0 text-muted-foreground\">\n {option.icon}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {option.label}\n </p>\n {isValueSelected && (\n <Icon \n name=\"check\" \n className=\"h-4 w-4 text-primary flex-shrink-0\"\n />\n )}\n </div>\n {option.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {option.description}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n })\n )}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nAutocomplete.displayName = \"Autocomplete\"\n\n\n","\"use client\";\n\n/**\n * ColorPicker 컴포넌트\n *\n * 탭 기반 컬러 피커 (의존성 없음)\n * - Tailwind 탭: Tailwind CSS 프리셋 팔레트\n * - Custom 탭: HSL 슬라이더 + HEX 입력\n *\n * @example\n * ```tsx\n * <ColorPicker value=\"#3b82f6\" onChange={(color) => console.log(color)} />\n * ```\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface ColorPickerProps {\n /** 현재 색상 값 (HEX 또는 'transparent') */\n value: string;\n /** 색상 변경 콜백 */\n onChange: (color: string) => void;\n /** 추가 클래스명 */\n className?: string;\n /** 비활성화 여부 */\n disabled?: boolean;\n}\n\ntype TabType = \"tailwind\" | \"custom\";\n\n// Tailwind 팔레트 프리셋\nconst TAILWIND_PALETTE = {\n gray: [\"#f9fafb\", \"#f3f4f6\", \"#e5e7eb\", \"#d1d5db\", \"#9ca3af\", \"#6b7280\", \"#4b5563\", \"#374151\", \"#1f2937\", \"#111827\"],\n red: [\"#fef2f2\", \"#fee2e2\", \"#fecaca\", \"#fca5a5\", \"#f87171\", \"#ef4444\", \"#dc2626\", \"#b91c1c\", \"#991b1b\", \"#7f1d1d\"],\n orange: [\"#fff7ed\", \"#ffedd5\", \"#fed7aa\", \"#fdba74\", \"#fb923c\", \"#f97316\", \"#ea580c\", \"#c2410c\", \"#9a3412\", \"#7c2d12\"],\n amber: [\"#fffbeb\", \"#fef3c7\", \"#fde68a\", \"#fcd34d\", \"#fbbf24\", \"#f59e0b\", \"#d97706\", \"#b45309\", \"#92400e\", \"#78350f\"],\n yellow: [\"#fefce8\", \"#fef9c3\", \"#fef08a\", \"#fde047\", \"#facc15\", \"#eab308\", \"#ca8a04\", \"#a16207\", \"#854d0e\", \"#713f12\"],\n lime: [\"#f7fee7\", \"#ecfccb\", \"#d9f99d\", \"#bef264\", \"#a3e635\", \"#84cc16\", \"#65a30d\", \"#4d7c0f\", \"#3f6212\", \"#365314\"],\n green: [\"#f0fdf4\", \"#dcfce7\", \"#bbf7d0\", \"#86efac\", \"#4ade80\", \"#22c55e\", \"#16a34a\", \"#15803d\", \"#166534\", \"#14532d\"],\n emerald: [\"#ecfdf5\", \"#d1fae5\", \"#a7f3d0\", \"#6ee7b7\", \"#34d399\", \"#10b981\", \"#059669\", \"#047857\", \"#065f46\", \"#064e3b\"],\n teal: [\"#f0fdfa\", \"#ccfbf1\", \"#99f6e4\", \"#5eead4\", \"#2dd4bf\", \"#14b8a6\", \"#0d9488\", \"#0f766e\", \"#115e59\", \"#134e4a\"],\n cyan: [\"#ecfeff\", \"#cffafe\", \"#a5f3fc\", \"#67e8f9\", \"#22d3ee\", \"#06b6d4\", \"#0891b2\", \"#0e7490\", \"#155e75\", \"#164e63\"],\n sky: [\"#f0f9ff\", \"#e0f2fe\", \"#bae6fd\", \"#7dd3fc\", \"#38bdf8\", \"#0ea5e9\", \"#0284c7\", \"#0369a1\", \"#075985\", \"#0c4a6e\"],\n blue: [\"#eff6ff\", \"#dbeafe\", \"#bfdbfe\", \"#93c5fd\", \"#60a5fa\", \"#3b82f6\", \"#2563eb\", \"#1d4ed8\", \"#1e40af\", \"#1e3a8a\"],\n indigo: [\"#eef2ff\", \"#e0e7ff\", \"#c7d2fe\", \"#a5b4fc\", \"#818cf8\", \"#6366f1\", \"#4f46e5\", \"#4338ca\", \"#3730a3\", \"#312e81\"],\n violet: [\"#f5f3ff\", \"#ede9fe\", \"#ddd6fe\", \"#c4b5fd\", \"#a78bfa\", \"#8b5cf6\", \"#7c3aed\", \"#6d28d9\", \"#5b21b6\", \"#4c1d95\"],\n purple: [\"#faf5ff\", \"#f3e8ff\", \"#e9d5ff\", \"#d8b4fe\", \"#c084fc\", \"#a855f7\", \"#9333ea\", \"#7e22ce\", \"#6b21a8\", \"#581c87\"],\n fuchsia: [\"#fdf4ff\", \"#fae8ff\", \"#f5d0fe\", \"#f0abfc\", \"#e879f9\", \"#d946ef\", \"#c026d3\", \"#a21caf\", \"#86198f\", \"#701a75\"],\n pink: [\"#fdf2f8\", \"#fce7f3\", \"#fbcfe8\", \"#f9a8d4\", \"#f472b6\", \"#ec4899\", \"#db2777\", \"#be185d\", \"#9d174d\", \"#831843\"],\n rose: [\"#fff1f2\", \"#ffe4e6\", \"#fecdd3\", \"#fda4af\", \"#fb7185\", \"#f43f5e\", \"#e11d48\", \"#be123c\", \"#9f1239\", \"#881337\"],\n};\n\nconst SPECIAL_COLORS = [\"#000000\", \"#ffffff\", \"transparent\"];\n\n// HEX to HSL\nfunction hexToHsl(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [0, 100, 50];\n\n const r = parseInt(result[1], 16) / 255;\n const g = parseInt(result[2], 16) / 255;\n const b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)];\n}\n\n// HSL to HEX\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n// 유효한 색상인지 체크\nfunction isValidColor(color: string): boolean {\n return /^#[0-9A-Fa-f]{6}$/.test(color) || color === \"transparent\";\n}\n\n/**\n * Saturation-Lightness 2D 박스\n */\nfunction SaturationLightnessPicker({\n hue,\n saturation,\n lightness,\n onChange,\n disabled,\n}: {\n hue: number;\n saturation: number;\n lightness: number;\n onChange: (s: number, l: number) => void;\n disabled?: boolean;\n}) {\n const boxRef = useRef<HTMLDivElement>(null);\n const isDragging = useRef(false);\n\n const handleChange = useCallback(\n (clientX: number, clientY: number) => {\n if (!boxRef.current || disabled) return;\n const rect = boxRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (clientY - rect.top) / rect.height));\n const newS = Math.round(x * 100);\n const newL = Math.round((1 - y) * 100);\n onChange(newS, newL);\n },\n [onChange, disabled]\n );\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (disabled) return;\n isDragging.current = true;\n handleChange(e.clientX, e.clientY);\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) handleChange(e.clientX, e.clientY);\n };\n const handleMouseUp = () => { isDragging.current = false; };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [handleChange]);\n\n const cursorX = saturation;\n const cursorY = 100 - lightness;\n\n return (\n <div\n ref={boxRef}\n className={cn(\n \"relative w-full h-28 rounded-md overflow-hidden\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-crosshair\"\n )}\n style={{\n background: `\n linear-gradient(to top, #000, transparent),\n linear-gradient(to right, #fff, hsl(${hue}, 100%, 50%))\n `,\n }}\n onMouseDown={handleMouseDown}\n >\n <div\n className=\"absolute w-4 h-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-md pointer-events-none\"\n style={{\n left: `${cursorX}%`,\n top: `${cursorY}%`,\n background: hslToHex(hue, saturation, lightness),\n }}\n />\n </div>\n );\n}\n\n/**\n * Hue 슬라이더\n */\nfunction HueSlider({\n hue,\n onChange,\n disabled,\n}: {\n hue: number;\n onChange: (h: number) => void;\n disabled?: boolean;\n}) {\n return (\n <div className=\"relative\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"360\"\n value={hue}\n disabled={disabled}\n onChange={(e) => onChange(Number(e.target.value))}\n className={cn(\n \"w-full h-3 rounded-md appearance-none cursor-pointer\",\n \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3.5 [&::-webkit-slider-thumb]:h-3.5\",\n \"[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white\",\n \"[&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-current\",\n \"[&::-webkit-slider-thumb]:shadow-md [&::-webkit-slider-thumb]:cursor-pointer\",\n \"[&::-moz-range-thumb]:w-3.5 [&::-moz-range-thumb]:h-3.5\",\n \"[&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white\",\n \"[&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-current\",\n \"[&::-moz-range-thumb]:shadow-md [&::-moz-range-thumb]:cursor-pointer\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n style={{\n background: `linear-gradient(to right,\n hsl(0, 100%, 50%), hsl(60, 100%, 50%), hsl(120, 100%, 50%),\n hsl(180, 100%, 50%), hsl(240, 100%, 50%), hsl(300, 100%, 50%), hsl(360, 100%, 50%)\n )`,\n color: `hsl(${hue}, 100%, 50%)`,\n }}\n />\n </div>\n );\n}\n\n/**\n * Tailwind 프리셋 탭\n */\nfunction TailwindTab({\n currentColor,\n onColorSelect,\n disabled,\n}: {\n currentColor: string;\n onColorSelect: (color: string) => void;\n disabled?: boolean;\n}) {\n return (\n <div className=\"space-y-2\">\n {/* 팔레트 그리드 */}\n <div className=\"space-y-0.5\">\n {Object.entries(TAILWIND_PALETTE).map(([colorName, shades]) => (\n <div key={colorName} className=\"flex gap-0.5\">\n {shades.map((color, idx) => (\n <button\n key={`${colorName}-${idx}`}\n type=\"button\"\n disabled={disabled}\n className={cn(\n \"flex-1 aspect-square rounded-[2px] transition-transform\",\n !disabled && \"hover:scale-110 hover:z-10\",\n currentColor.toLowerCase() === color.toLowerCase() && \"ring-1 ring-ring ring-offset-1\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n style={{ background: color }}\n onClick={() => onColorSelect(color)}\n title={`${colorName}-${(idx + 1) * 100}`}\n />\n ))}\n </div>\n ))}\n </div>\n\n {/* 특수 색상 */}\n <div className=\"flex gap-1 pt-1 border-t border-border\">\n {SPECIAL_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n disabled={disabled}\n className={cn(\n \"w-6 h-6 rounded-sm border border-border/50 transition-transform\",\n !disabled && \"hover:scale-110\",\n currentColor === color && \"ring-1 ring-ring ring-offset-1\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n style={{\n background: color === \"transparent\"\n ? \"repeating-conic-gradient(#ccc 0% 25%, transparent 0% 50%) 50% / 8px 8px\"\n : color,\n }}\n onClick={() => onColorSelect(color)}\n title={color}\n />\n ))}\n <span className=\"flex-1 text-[10px] text-muted-foreground self-center text-right\">\n Black / White / Transparent\n </span>\n </div>\n </div>\n );\n}\n\n/**\n * Custom 탭 (HSL + HEX)\n */\nfunction CustomTab({\n h,\n s,\n l,\n hexInput,\n onHslChange,\n onHexInputChange,\n disabled,\n}: {\n h: number;\n s: number;\n l: number;\n hexInput: string;\n onHslChange: (h: number, s: number, l: number) => void;\n onHexInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n disabled?: boolean;\n}) {\n const currentColor = hslToHex(h, s, l);\n\n return (\n <div className=\"space-y-3\">\n {/* Saturation/Lightness 박스 */}\n <SaturationLightnessPicker\n hue={h}\n saturation={s}\n lightness={l}\n onChange={(newS, newL) => onHslChange(h, newS, newL)}\n disabled={disabled}\n />\n\n {/* Hue 슬라이더 */}\n <HueSlider hue={h} onChange={(newH) => onHslChange(newH, s, l)} disabled={disabled} />\n\n {/* 프리뷰 + HEX 입력 */}\n <div className=\"flex gap-2 items-center\">\n <div\n className=\"w-10 h-10 rounded-md border border-border shadow-inner flex-shrink-0\"\n style={{ background: currentColor }}\n />\n <input\n type=\"text\"\n value={hexInput}\n onChange={onHexInputChange}\n disabled={disabled}\n className={cn(\n \"flex-1 px-3 py-2 text-sm rounded-md border bg-background font-mono\",\n \"focus:outline-none focus:ring-1 focus:ring-ring\",\n !isValidColor(hexInput) && \"border-destructive\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n placeholder=\"#000000\"\n maxLength={7}\n />\n </div>\n\n {/* HSL 값 표시 */}\n <div className=\"flex gap-2 text-[10px] text-muted-foreground\">\n <span>H: {h}°</span>\n <span>S: {s}%</span>\n <span>L: {l}%</span>\n </div>\n </div>\n );\n}\n\n/**\n * ColorPicker 컴포넌트\n *\n * 탭 기반 컬러 피커로 Tailwind CSS 프리셋과 커스텀 HSL 피커를 제공합니다.\n */\nexport const ColorPicker = React.forwardRef<HTMLDivElement, ColorPickerProps>(\n ({ value, onChange, className, disabled = false }, ref) => {\n const [activeTab, setActiveTab] = useState<TabType>(\"tailwind\");\n\n // HSL 상태\n const [hue, saturation, lightness] = hexToHsl(value || \"#3b82f6\");\n const [h, setH] = useState(hue);\n const [s, setS] = useState(saturation);\n const [l, setL] = useState(lightness);\n const [hexInput, setHexInput] = useState(value || \"#3b82f6\");\n\n // 외부 value 변경 시 동기화\n useEffect(() => {\n if (isValidColor(value)) {\n const [newH, newS, newL] = hexToHsl(value);\n setH(newH);\n setS(newS);\n setL(newL);\n setHexInput(value);\n }\n }, [value]);\n\n // HSL 변경 핸들러\n const handleHslChange = useCallback(\n (newH: number, newS: number, newL: number) => {\n setH(newH);\n setS(newS);\n setL(newL);\n const hex = hslToHex(newH, newS, newL);\n setHexInput(hex);\n onChange(hex);\n },\n [onChange]\n );\n\n // HEX 입력 핸들러\n const handleHexInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n let hex = e.target.value;\n if (!hex.startsWith(\"#\")) hex = \"#\" + hex;\n setHexInput(hex);\n if (isValidColor(hex)) {\n const [newH, newS, newL] = hexToHsl(hex);\n setH(newH);\n setS(newS);\n setL(newL);\n onChange(hex);\n }\n };\n\n // 프리셋 색상 선택\n const handleColorSelect = (color: string) => {\n if (disabled) return;\n if (color === \"transparent\") {\n setHexInput(\"transparent\");\n onChange(\"transparent\");\n return;\n }\n const [newH, newS, newL] = hexToHsl(color);\n setH(newH);\n setS(newS);\n setL(newL);\n setHexInput(color);\n onChange(color);\n };\n\n const currentColor = hslToHex(h, s, l);\n\n return (\n <div ref={ref} className={cn(\"space-y-2\", className)}>\n {/* 탭 헤더 */}\n <div className=\"flex gap-1 p-0.5 bg-muted/50 rounded-md\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setActiveTab(\"tailwind\")}\n className={cn(\n \"flex-1 px-2 py-1 text-xs font-medium rounded transition-colors\",\n activeTab === \"tailwind\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n Tailwind\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setActiveTab(\"custom\")}\n className={cn(\n \"flex-1 px-2 py-1 text-xs font-medium rounded transition-colors\",\n activeTab === \"custom\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n Custom\n </button>\n </div>\n\n {/* 현재 색상 미리보기 */}\n <div className=\"flex items-center gap-2 px-1\">\n <div\n className=\"w-6 h-6 rounded border border-border shadow-inner flex-shrink-0\"\n style={{\n background: hexInput === \"transparent\"\n ? \"repeating-conic-gradient(#ccc 0% 25%, transparent 0% 50%) 50% / 8px 8px\"\n : currentColor,\n }}\n />\n <span className=\"text-xs font-mono text-muted-foreground truncate\">\n {hexInput === \"transparent\" ? \"transparent\" : currentColor}\n </span>\n </div>\n\n {/* 탭 콘텐츠 */}\n {activeTab === \"tailwind\" ? (\n <TailwindTab currentColor={hexInput} onColorSelect={handleColorSelect} disabled={disabled} />\n ) : (\n <CustomTab\n h={h}\n s={s}\n l={l}\n hexInput={hexInput}\n onHslChange={handleHslChange}\n onHexInputChange={handleHexInputChange}\n disabled={disabled}\n />\n )}\n </div>\n );\n }\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\nexport default ColorPicker;\n"]}
1
+ {"version":3,"sources":["../src/components/Form.tsx","../src/components/FormControl.tsx","../src/components/Select.tsx","../src/components/Radio.tsx","../src/components/Slider.tsx","../src/components/DatePicker.tsx","../src/components/Upload.tsx","../src/components/Autocomplete.tsx","../src/components/ColorPicker.tsx"],"names":["FORM_BASE","resolveDot","FORM_GLASS","createGlassStyle","FORM_FIELD_BASE","FORM_GROUP_STACK","FORM_GROUP_INLINE","FORM_ERROR","Form","React","dotProp","children","onSubmit","variant","style","props","ref","handleSubmit","e","computedStyle","useMemo","mergeStyles","jsx","FormField","error","required","errorId","enhancedChildren","child","childProps","childType","isFormComponent","typeObj","displayName","name","isNativeFormElement","existingAriaDescribedBy","ariaDescribedBy","jsxs","FormGroup","inline","FormControl","label","description","htmlFor","showErrorIcon","suppressBrowserValidation","hasError","originalOnInvalid","ErrorIcon","VALIDATION_PRESETS","useFormValidation","initialErrors","errors","setErrors","validate","rules","newErrors","field","rule","value","type","minLength","maxLength","min","max","pattern","custom","messages","stringValue","preset","customError","clearError","prev","next","clearAllErrors","selectVariantStyles","dotVariants","VARIANT_EXTRAS","VARIANT_FOCUS","FORM_FOCUS_BASE","Select","styleProp","size","success","leftIcon","placeholder","ariaLabel","ariaInvalid","idProp","_a","autoId","useId","id","selectRef","combinedRef","useCallback","node","isHovered","setIsHovered","useState","isFocused","setIsFocused","isDisabled","isInvalid","chevronRight","paddingRight","base","TRANSITIONS","DISABLED_INPUT","stateStyles","FORM_HOVER","FORM_FOCUS_ERROR","FORM_FOCUS_SUCCESS","FORM_BORDER_ERROR","FORM_BORDER_SUCCESS","chevronStyle","SelectOption","SR_ONLY_STYLE","WRAPPER_STYLE","LABEL_COL_STYLE","LABEL_STYLE","DESCRIPTION_STYLE","CIRCLE_SIZE","DOT_SIZE","VARIANT_BASE","Radio","disabled","onFocus","onBlur","_b","_c","generatedId","radioId","labelId","descriptionId","isControlled","isChecked","needsReadOnly","focusShadow","RADIO_FOCUS_SHADOW","stateBorderColor","circleStyle","CONTROL_HOVER_BORDER","innerDotStyle","wrapperStyle","TRACK_THICKNESS","THUMB_SIZE","TRACK_BG","THUMB_BG","FILL_BG","Slider","showValue","showLabel","step","onValueChange","orientation","isRange","currentValue","handleChange","newValue","index","newRange","trackThickness","thumbSize","trackBg","thumbBg","fillBg","isVertical","trackStyle","buildFillStyle","startPct","sizePct","buildThumbStyle","positionPct","hiddenInputStyle","renderInput","renderValue","valueTextStyle","val","labelStyle","trackContainerStyle","fillStartPct","fillSizePct","_","sizeStyles","formatDate","date","format","_locale","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","onChange","minDate","maxDate","dateFormat","locale","markedDates","markedDateKeys","triggerId","autoTriggerId","finalTriggerId","isOpen","setIsOpen","currentMonth","setCurrentMonth","hoveredDate","setHoveredDate","viewMode","setViewMode","displayDate","handleDateSelect","handlePrevMonth","handleNextMonth","handleToday","today","handleMonthSelect","monthIndex","handleYearSelect","selectedYear","handleHeaderClick","daysInMonth","firstDay","weekDaysMap","weekDays","formatMonth","loc","todayText","shortMonthsMap","shortMonths","ariaLabels","formatDateAriaLabel","isDateDisabled","isDateSelected","isToday","toDateKey","y","m","d","markedKeySet","isMarkedDate","marked","calendarDays","i","remainingDays","triggerButtonStyle","triggerButton","Icon","Popover","open","Fragment","isCurrentMonth","isSelected","isTodayDate","isMarked","buttonStyle","monthName","isCurrentMonthSelected","cellStyle","isCurrentYear","Button","now","formatFileSize","bytes","k","sizes","getFileIcon","SIZE_PADDING","Upload","files","onRemove","multiple","accept","maxSize","maxFiles","dragDrop","fileInputRef","isDragging","setIsDragging","isRemoveHovered","setIsRemoveHovered","handleFileSelect","selectedFiles","fileArray","validFiles","file","handleClick","handleDragOver","handleDragLeave","handleDrop","handleRemove","containerStyle","dropZoneStyle","innerStyle","iconWrapStyle","primaryTextStyle","hintTextStyle","fileListStyle","isError","fileRowStyle","fileIconWrapStyle","fileInfoStyle","fileNameStyle","fileMeta","fileSizeStyle","removeButtonStyle","sizeClasses","Autocomplete","options","loading","maxHeight","clearable","filterable","onSearch","emptyText","inputValue","setInputValue","filteredOptions","setFilteredOptions","selectedIndex","setSelectedIndex","isSearching","setIsSearching","inputRef","dropdownRef","selectedOption","opt","result","filtered","option","handleInputChange","handleInputFocus","handleInputBlur","handleOptionSelect","handleClear","handleKeyDown","Input","isValueSelected","TAILWIND_PALETTE","SPECIAL_COLORS","hexToHsl","hex","r","g","b","h","s","l","hslToHex","a","f","n","color","isValidColor","SaturationLightnessPicker","hue","saturation","lightness","boxRef","useRef","clientX","clientY","rect","x","newS","newL","handleMouseDown","useEffect","handleMouseMove","handleMouseUp","cursorX","cursorY","HueSlider","TailwindTab","currentColor","onColorSelect","colorName","shades","idx","CustomTab","hexInput","onHslChange","onHexInputChange","newH","ColorPicker","dotStyle","activeTab","setActiveTab","setH","setS","setL","setHexInput","handleHslChange","handleHexInputChange","handleColorSelect"],"mappings":"0uBAUA,IAAMA,EAAAA,CAAiC,CACrC,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,GAAGC,CAAAA,CAAW,OAAO,CACvB,CAAA,CAEMC,EAAAA,CAAkC,CACtC,OAAA,CAAS,MAAA,CACT,cAAe,QAAA,CACf,GAAGD,EAAW,sBAAsB,CAAA,CACpC,GAAGE,CAAAA,CAAiB,OAAO,CAAA,CAC3B,eAAA,CAAiB,sBAAA,CACjB,MAAA,CAAQ,qCACR,SAAA,CAAW,0BACb,CAAA,CAEMC,EAAAA,CAAuC,CAC3C,OAAA,CAAS,OACT,aAAA,CAAe,QAAA,CACf,GAAGH,CAAAA,CAAW,OAAO,CACvB,EAEMI,EAAAA,CAAwC,CAC5C,QAAS,MAAA,CACT,aAAA,CAAe,SACf,GAAGJ,CAAAA,CAAW,OAAO,CACvB,CAAA,CAEMK,EAAAA,CAAyC,CAC7C,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,KAAA,CACf,GAAGL,CAAAA,CAAW,OAAO,CACvB,CAAA,CAEMM,EAAAA,CAAkC,CACtC,QAAA,CAAU,UAAA,CACV,WAAY,SAAA,CACZ,KAAA,CAAO,wBACT,CAAA,CAuEMC,EAAAA,CAAOC,CAAAA,CAAM,WACjB,CACE,CAAE,GAAA,CAAKC,GAAAA,CAAS,QAAA,CAAAC,CAAAA,CAAU,SAAAC,CAAAA,CAAU,OAAA,CAAAC,CAAAA,CAAU,SAAA,CAAW,KAAA,CAAAC,CAAAA,CAAO,GAAGC,CAAM,CAAA,CACzEC,CAAAA,GACG,CACH,IAAMC,CAAAA,CAAgBC,GAAwC,CAC5DA,CAAAA,CAAE,gBAAe,CACjBN,CAAAA,EAAA,MAAAA,CAAAA,CAAWM,CAAAA,EACb,CAAA,CAEMC,GAAAA,CAAgBC,OAAAA,CAAQ,IAErBC,EADMR,CAAAA,GAAY,OAAA,CAAUX,EAAAA,CAAaF,EAAAA,CACvBC,CAAAA,CAAWS,GAAO,EAAGI,CAAK,CAAA,CAClD,CAACD,CAAAA,CAASH,GAAAA,CAASI,CAAK,CAAC,CAAA,CAE5B,OACEQ,IAAC,MAAA,CAAA,CAAK,GAAA,CAAKN,EAAK,QAAA,CAAUC,CAAAA,CAAc,KAAA,CAAOE,GAAAA,CAAgB,GAAGJ,CAAAA,CAC/D,SAAAJ,CAAAA,CACH,CAEJ,CACF,EACAH,EAAAA,CAAK,WAAA,CAAc,OAgBnB,IAAMe,EAAAA,CAAYd,CAAAA,CAAM,UAAA,CACtB,CAAC,CAAE,IAAKC,GAAAA,CAAS,QAAA,CAAAC,EAAU,KAAA,CAAAa,CAAAA,CAAO,SAAAC,CAAAA,CAAU,KAAA,CAAAX,CAAAA,CAAO,GAAGC,CAAM,CAAA,CAAGC,IAAQ,CACrE,IAAMU,CAAAA,CAAUjB,CAAAA,CAAM,KAAA,EAAM,CAGtBkB,IAAmBlB,CAAAA,CAAM,QAAA,CAAS,GAAA,CAAIE,CAAAA,CAAWiB,CAAAA,EAAU,CAC/D,GAAInB,CAAAA,CAAM,cAAA,CAAemB,CAAK,CAAA,CAAG,CAC/B,IAAMC,EAAaD,CAAAA,CAAM,KAAA,CACnBE,CAAAA,CAAYF,CAAAA,CAAM,IAAA,CAGpBG,CAAAA,CAAkB,MACtB,GAAI,OAAOD,CAAAA,EAAc,QAAA,EAAYA,CAAAA,GAAc,IAAA,CAAM,CACvD,IAAME,CAAAA,CAAUF,CAAAA,CACVG,CAAAA,CAAcD,CAAAA,CAAQ,WAAA,CACtBE,EAAOF,CAAAA,CAAQ,IAAA,CACrBD,EACEE,CAAAA,GAAgB,OAAA,EAChBA,IAAgB,QAAA,EAChBA,CAAAA,GAAgB,UAAA,EAChBC,CAAAA,GAAS,OAAA,EACTA,CAAAA,GAAS,UACTA,CAAAA,GAAS,WACb,CAGA,IAAMC,CAAAA,CACJ,OAAOL,GAAc,QAAA,EACrB,CAAC,OAAA,CAAS,QAAA,CAAU,UAAU,CAAA,CAAE,SAASA,CAAAA,CAAU,WAAA,EAAa,CAAA,CAElE,GAAIC,GAAmBI,CAAAA,CAAqB,CAC1C,IAAMC,CAAAA,CAA0BP,CAAAA,CAAW,kBAAkB,EAGvDQ,CAAAA,CAAkBb,CAAAA,CACpBY,CAAAA,CACE,CAAA,EAAGA,CAAuB,CAAA,CAAA,EAAIV,CAAO,CAAA,CAAA,CACrCA,CAAAA,CACFU,CAAAA,CAEJ,OAAO3B,CAAAA,CAAM,YAAA,CAAamB,EAAO,CAC/B,kBAAA,CAAoBS,EACpB,cAAA,CAAgBb,CAAAA,CAAQ,KAAOK,CAAAA,CAAW,cAAc,CAAA,CACxD,QAAA,CAAUJ,CAAAA,EAAYI,CAAAA,CAAW,QACnC,CAA4B,CAC9B,CACF,CACA,OAAOD,CACT,CAAC,CAAA,CAEKT,CAAAA,CAAgBC,OAAAA,CAAQ,IACrBC,CAAAA,CAAYjB,EAAAA,CAAiBH,EAAWS,GAAO,CAAA,CAAGI,CAAK,CAAA,CAC7D,CAACJ,GAAAA,CAASI,CAAK,CAAC,CAAA,CAEnB,OACEwB,IAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKtB,EAAK,KAAA,CAAOG,CAAAA,CAAgB,GAAGJ,CAAAA,CACtC,QAAA,CAAA,CAAAY,GAAAA,CACAH,GACCF,GAAAA,CAAC,GAAA,CAAA,CAAE,EAAA,CAAII,CAAAA,CAAS,KAAA,CAAOnB,EAAAA,CAAY,KAAK,OAAA,CAAQ,WAAA,CAAU,SACvD,QAAA,CAAAiB,CAAAA,CACH,GAEJ,CAEJ,CACF,EACAD,EAAAA,CAAU,WAAA,CAAc,WAAA,KAqBlBgB,EAAAA,CAAY9B,CAAAA,CAAM,UAAA,CACtB,CAAC,CAAE,GAAA,CAAKC,IAAS,QAAA,CAAAC,CAAAA,CAAU,MAAA,CAAA6B,CAAAA,CAAS,KAAA,CAAO,KAAA,CAAA1B,EAAO,GAAGC,CAAM,EAAGC,CAAAA,GAAQ,CACpE,IAAMG,CAAAA,CAAgBC,OAAAA,CAAQ,IAErBC,CAAAA,CADMmB,CAAAA,CAASlC,EAAAA,CAAoBD,GACjBJ,CAAAA,CAAWS,GAAO,CAAA,CAAGI,CAAK,CAAA,CAClD,CAAC0B,EAAQ9B,GAAAA,CAASI,CAAK,CAAC,CAAA,CAE3B,OACEQ,GAAAA,CAAC,OAAI,GAAA,CAAKN,CAAAA,CAAK,MAAOG,CAAAA,CAAgB,GAAGJ,EACtC,QAAA,CAAAJ,CAAAA,CACH,CAEJ,CACF,EACA4B,EAAAA,CAAU,YAAc,WAAA,CC1MxB,SAASE,EAAAA,CAAY,CACnB,MAAAC,GAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,KAAA,CAAAnB,CAAAA,CACA,QAAA,CAAAC,EAAW,KAAA,CACX,OAAA,CAAAmB,CAAAA,CACA,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,0BAAAC,CAAAA,CAA4B,IAAA,CAC5B,GAAA,CAAKpC,CAAAA,CACL,KAAA,CAAAI,GAAAA,CACA,SAAAH,CACF,CAAA,CAAqB,CACnB,IAAMoC,CAAAA,CAAW,CAAC,CAACvB,CAAAA,CAGbG,CAAAA,CAAmBlB,EAAM,QAAA,CAAS,GAAA,CAAIE,EAAWiB,CAAAA,EAAU,CAC/D,GAAInB,CAAAA,CAAM,cAAA,CAAemB,CAAK,EAAG,CAC/B,IAAMC,CAAAA,CAAsC,CAC1C,cAAA,CAAgBkB,CAAAA,EAAY,OAC5B,kBAAA,CAAoBA,CAAAA,CAAW,CAAA,EAAGH,CAAO,CAAA,MAAA,CAAA,CAAW,MACtD,EAGA,OAAIE,CAAAA,GACFjB,EAAW,SAAA,CAAaX,CAAAA,EAAuB,CAC7CA,CAAAA,CAAE,cAAA,EAAe,CAEjB,IAAM8B,CAAAA,CAAqBpB,CAAAA,CAAM,MAAkC,SAAA,CAC/D,OAAOoB,CAAAA,EAAsB,UAAA,EAC/BA,CAAAA,CAAkB9B,CAAC,EAEvB,CAAA,CAAA,CAGKT,CAAAA,CAAM,YAAA,CAAamB,CAAAA,CAAOC,CAAU,CAC7C,CACA,OAAOD,CACT,CAAC,CAAA,CAED,OACEU,KAAC,KAAA,CAAA,CAAI,KAAA,CAAOjB,CAAAA,CAAYpB,CAAAA,CAAW,WAAW,CAAA,CAAGA,EAAWS,CAAO,CAAA,CAAGI,GAAK,CAAA,CAExE,QAAA,CAAA,CAAA4B,GAAAA,EACCJ,KAAC,OAAA,CAAA,CACC,OAAA,CAASM,CAAAA,CACT,KAAA,CAAOvB,CAAAA,CACLpB,CAAAA,CAAW,4FAA4F,CAAA,CACvG8C,CAAAA,CAAW9C,CAAAA,CAAW,kBAAkB,CAAA,CAAI,MAC9C,EAEC,QAAA,CAAA,CAAAyC,GAAAA,CACAjB,CAAAA,EACCH,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAOrB,EAAW,uBAAuB,CAAA,CAAG,aAAA,CAAY,MAAA,CAAO,QAAA,CAAA,GAAA,CAErE,CAAA,CAAA,CAEJ,EAID0C,CAAAA,EAAe,CAACI,CAAAA,EACfzB,GAAAA,CAAC,GAAA,CAAA,CAAE,KAAA,CAAOrB,EAAW,+BAA+B,CAAA,CAAI,SAAA0C,CAAAA,CAAY,CAAA,CAItErB,IAAC,KAAA,CAAA,CAAI,KAAA,CAAOrB,CAAAA,CAAW,sIAAsI,CAAA,CAC1J,QAAA,CAAA0B,EACH,CAAA,CAGCoB,CAAAA,EACCT,IAAAA,CAAC,KAAA,CAAA,CACC,EAAA,CAAIM,CAAAA,CAAU,GAAGA,CAAO,CAAA,MAAA,CAAA,CAAW,MAAA,CACnC,KAAA,CAAO3C,CAAAA,CAAW,iDAAiD,EACnE,IAAA,CAAK,OAAA,CACL,YAAU,QAAA,CAET,QAAA,CAAA,CAAA4C,GAAiBvB,GAAAA,CAAC2B,EAAAA,CAAA,CAAU,KAAA,CAAOhD,CAAAA,CAAW,8BAA8B,EAAG,CAAA,CAChFqB,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAE,CAAAA,CAAM,CAAA,CAAA,CACf,GAEJ,CAEJ,CA+BA,IAAM0B,EAAAA,CAAqF,CACzF,KAAA,CAAO,CACL,OAAA,CAAS,4BAAA,CACT,QAAS,sBACX,CAAA,CACA,MAAO,CACL,OAAA,CAAS,oBAAA,CACT,OAAA,CAAS,6BACX,CAAA,CACA,IAAK,CACH,OAAA,CAAS,oBAAA,CACT,OAAA,CAAS,0DACX,CAAA,CACA,aAAc,CACZ,OAAA,CAAS,gBAAA,CACT,OAAA,CAAS,sCACX,CAAA,CACA,SAAU,CACR,OAAA,CAAS,uCAAA,CACT,OAAA,CAAS,0EACX,CACF,EA0BA,SAASC,EAAAA,CAAkBC,CAAAA,CAAkC,EAAC,CAAG,CAC/D,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAI7C,CAAAA,CAAM,QAAA,CAA2B2C,CAAa,CAAA,CAEpEG,CAAAA,CAAW9C,CAAAA,CAAM,WAAA,CAAa+C,CAAAA,EAAoC,CACtE,IAAMC,CAAAA,CAA8B,GAEpC,IAAA,GAAW,CAACC,EAAOC,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQH,CAAK,CAAA,CAAG,CACjD,GAAM,CAAE,KAAA,CAAAI,CAAAA,CAAO,IAAA,CAAAC,CAAAA,CAAM,SAAApC,CAAAA,CAAU,SAAA,CAAAqC,CAAAA,CAAW,SAAA,CAAAC,CAAAA,CAAW,GAAA,CAAAC,EAAK,GAAA,CAAAC,CAAAA,CAAK,QAAAC,CAAAA,CAAS,MAAA,CAAAC,EAAQ,QAAA,CAAAC,CAAAA,CAAW,EAAG,CAAA,CAAIT,CAAAA,CAC5FU,EAAc,MAAA,CAAOT,CAAK,CAAA,CAGhC,GAAInC,CAAAA,GAAa,CAACmC,GAASS,CAAAA,CAAY,IAAA,EAAK,GAAM,EAAA,CAAA,CAAK,CACrDZ,CAAAA,CAAUC,CAAK,CAAA,CAAIU,CAAAA,CAAS,UAAY,wBAAA,CACxC,QACF,CAGA,GAAI,EAAA,CAACR,CAAAA,EAASS,CAAAA,CAAY,IAAA,EAAK,GAAM,IAGrC,CAAA,GAAIR,CAAAA,CAAM,CACR,IAAMS,CAAAA,CAASpB,EAAAA,CAAmBW,CAAI,CAAA,CACtC,GAAIS,CAAAA,EAAU,CAACA,CAAAA,CAAO,OAAA,CAAQ,KAAKD,CAAW,CAAA,CAAG,CAC/CZ,CAAAA,CAAUC,CAAK,CAAA,CAAIU,EAAS,IAAA,EAAQE,CAAAA,CAAO,OAAA,CAC3C,QACF,CACF,CAGA,GAAIR,CAAAA,GAAc,MAAA,EAAaO,CAAAA,CAAY,MAAA,CAASP,CAAAA,CAAW,CAC7DL,EAAUC,CAAK,CAAA,CAAIU,CAAAA,CAAS,SAAA,EAAa,CAAA,iBAAA,EAAoBN,CAAS,cACtE,QACF,CAGA,GAAIC,CAAAA,GAAc,MAAA,EAAaM,EAAY,MAAA,CAASN,CAAAA,CAAW,CAC7DN,CAAAA,CAAUC,CAAK,CAAA,CAAIU,EAAS,SAAA,EAAa,CAAA,gBAAA,EAAmBL,CAAS,CAAA,WAAA,CAAA,CACrE,QACF,CAGA,GAAIC,CAAAA,GAAQ,MAAA,EAAa,OAAOJ,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAQI,EAAK,CACjEP,CAAAA,CAAUC,CAAK,CAAA,CAAIU,CAAAA,CAAS,GAAA,EAAO,oBAAoBJ,CAAG,CAAA,CAAA,CAC1D,QACF,CAGA,GAAIC,CAAAA,GAAQ,QAAa,OAAOL,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAQK,CAAAA,CAAK,CACjER,EAAUC,CAAK,CAAA,CAAIU,CAAAA,CAAS,GAAA,EAAO,CAAA,gBAAA,EAAmBH,CAAG,GACzD,QACF,CAGA,GAAIC,CAAAA,EAAW,CAACA,EAAQ,IAAA,CAAKG,CAAW,CAAA,CAAG,CACzCZ,CAAAA,CAAUC,CAAK,EAAIU,CAAAA,CAAS,OAAA,EAAW,gBAAA,CACvC,QACF,CAGA,GAAID,EAAQ,CACV,IAAMI,CAAAA,CAAcJ,CAAAA,CAAOP,CAAK,CAAA,CAC5BW,IACFd,CAAAA,CAAUC,CAAK,CAAA,CAAIa,CAAAA,EAEvB,CAAA,CACF,CAEA,OAAAjB,CAAAA,CAAUG,CAAS,CAAA,CACZ,MAAA,CAAO,IAAA,CAAKA,CAAS,EAAE,MAAA,GAAW,CAC3C,CAAA,CAAG,EAAE,CAAA,CAECe,EAAa/D,CAAAA,CAAM,WAAA,CAAaiD,CAAAA,EAAkB,CACtDJ,CAAAA,CAAWmB,CAAAA,EAAS,CAClB,IAAMC,CAAAA,CAAO,CAAE,GAAGD,CAAK,EACvB,OAAA,OAAOC,CAAAA,CAAKhB,CAAK,CAAA,CACVgB,CACT,CAAC,EACH,CAAA,CAAG,EAAE,CAAA,CAECC,CAAAA,CAAiBlE,CAAAA,CAAM,YAAY,IAAM,CAC7C6C,CAAAA,CAAU,EAAE,EACd,EAAG,EAAE,EAEL,OAAO,CAAE,OAAAD,CAAAA,CAAQ,QAAA,CAAAE,CAAAA,CAAU,UAAA,CAAAiB,CAAAA,CAAY,cAAA,CAAAG,EAAgB,SAAA,CAAArB,CAAU,CACnE,CAGA,SAASL,EAAAA,CAAU,CAAE,KAAA,CAAAnC,CAAM,CAAA,CAAoC,CAC7D,OACEQ,GAAAA,CAAC,OACC,KAAA,CAAOR,CAAAA,CACP,KAAK,MAAA,CACL,MAAA,CAAO,eACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAQ,GAAAA,CAAC,MAAA,CAAA,CACC,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CACf,WAAA,CAAa,CAAA,CACb,CAAA,CAAE,mDAAA,CACJ,EACF,CAEJ,CC5SO,IAAMsD,EAAAA,CAAsBC,WAAAA,CAAY,CAC7C,IAAA,CAAM,+BAAA,CACN,QAAA,CAAU,CACR,OAAA,CAAS,CACP,QACE,yFAAA,CACF,OAAA,CACE,qFACF,MAAA,CACE,kFAAA,CACF,MAAO,kEAAA,CACP,KAAA,CAAO,EACT,CAAA,CACA,IAAA,CAAM,CACJ,GAAI,kBAAA,CACJ,EAAA,CAAI,mBAAA,CACJ,EAAA,CAAI,qBACN,CACF,EACA,eAAA,CAAiB,CACf,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,IACR,CACF,CAAC,CAAA,CAGKC,GAAgD,CACpD,KAAA,CAAO,CACL,GAAG3E,CAAAA,CAAiB,OAAO,CAAA,CAC3B,WAAA,CAAa,0BAAA,CACb,MAAO,OACT,CACF,CAAA,CAGM4E,EAAAA,CAA+C,CACnD,OAAA,CAASC,EACT,OAAA,CAASA,CAAAA,CACT,MAAA,CAAQ,CACN,GAAGA,CAAAA,CACH,gBAAiB,yBACnB,CAAA,CACA,MAAO,CACL,OAAA,CAAS,OACT,SAAA,CACE,8EAAA,CACF,eAAA,CAAiB,oBAAA,CACjB,WAAA,CAAa,qBACf,EACA,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,SAAA,CACE,kEAAA,CACF,YAAa,wDAAA,CACb,eAAA,CAAiB,0BACnB,CACF,CAAA,CAsEMC,EAAAA,CAASxE,EAAM,UAAA,CACnB,CACE,CACE,GAAA,CAAKC,GAAAA,CACL,KAAA,CAAOwE,EACP,OAAA,CAAArE,CAAAA,CAAU,SAAA,CACV,IAAA,CAAAsE,CAAAA,CAAO,IAAA,CACP,MAAA3D,GAAAA,CAAQ,KAAA,CACR,OAAA,CAAA4D,CAAAA,CAAU,KAAA,CACV,QAAA,CAAAC,EACA,WAAA,CAAAC,GAAAA,CACA,QAAA,CAAA3E,GAAAA,CACA,YAAA,CAAc4E,CAAAA,CACd,eAAgBC,CAAAA,CAChB,EAAA,CAAIC,EACJ,GAAG1E,CACL,EACAC,CAAAA,GACG,CApKP,IAAA0E,CAAAA,CAqKI,IAAMC,CAAAA,CAASC,OAAM,CACfC,CAAAA,CAAKJ,CAAAA,EAAUE,CAAAA,CAEfG,CAAAA,CAAYrF,CAAAA,CAAM,OAA0B,IAAI,CAAA,CAChDsF,CAAAA,CAAcC,WAAAA,CACjBC,CAAAA,EAAmC,CAClCH,EAAU,OAAA,CAAUG,CAAAA,CAChB,OAAOjF,CAAAA,EAAQ,UAAA,CACjBA,EAAIiF,CAAI,CAAA,CACCjF,CAAAA,GACRA,CAAAA,CAAyD,OAAA,CACxDiF,CAAAA,EAEN,EACA,CAACjF,CAAG,CACN,CAAA,CAEM,CAACkF,CAAAA,CAAWC,CAAY,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAC1C,CAACC,CAAAA,CAAWC,GAAY,CAAA,CAAIF,QAAAA,CAAS,KAAK,CAAA,CAE1CG,CAAAA,CAAAA,CAAab,EAAA3E,CAAAA,CAAM,QAAA,GAAN,IAAA,CAAA2E,CAAAA,CAAkB,KAAA,CAC/Bc,CAAAA,CACJhF,MAAUgE,CAAAA,GAAgB,MAAA,CAAY,CAAA,CAAQA,CAAAA,CAAe,KAAA,CAAA,CAEzDiB,CAAAA,CAAetB,IAAS,IAAA,CAAO,CAAA,CAAIA,CAAAA,GAAS,IAAA,CAAO,EAAA,CAAK,EAAA,CACxDuB,EAAevB,CAAAA,GAAS,IAAA,CAAO,EAAA,CAAKA,CAAAA,GAAS,IAAA,CAAO,EAAA,CAAK,GAEzDhE,CAAAA,CAAgBC,OAAAA,CAAQ,IAAM,CAhMxC,IAAAsE,CAAAA,CAiMM,IAAMiB,CAAAA,CAAOtF,CAAAA,CACX,CAAE,UAAA,CAAYuF,CAAAA,CAAY,MAAA,CAAQ,WAAY,MAAgB,CAAA,CAC9DhC,EAAAA,CAAoB,CAAE,OAAA,CAAA/D,CAAAA,CAAS,KAAAsE,CAAK,CAAC,EACrCL,EAAAA,CAAejE,CAAO,EACtBwE,CAAAA,CAAW,CAAE,WAAA,CAAa,MAAO,CAAA,CAAI,MAAA,CACrC,CAAE,YAAA,CAAc,CAAA,EAAGqB,CAAY,CAAA,EAAA,CAAK,CACtC,CAAA,CAEA,GAAIH,CAAAA,CACF,OAAOlF,CAAAA,CAAYsF,CAAAA,CAAME,GAAAA,CAAe5G,CAAAA,CAAWS,GAAO,CAAA,CAAGwE,CAAS,CAAA,CAGxE,IAAI4B,CAAAA,CAA6B,GAEjC,OAAIZ,CAAAA,EAAa,CAACG,CAAAA,GAChBS,CAAAA,CAAcC,GAAAA,CAAAA,CAGZV,IACEG,CAAAA,CACFM,CAAAA,CAAcE,CAAAA,CACL5B,CAAAA,CACT0B,CAAAA,CAAcG,CAAAA,CAEdH,GAAcpB,CAAAA,CAAAX,EAAAA,CAAclE,CAAO,CAAA,GAArB,IAAA,CAAA6E,CAAAA,CAA0BX,GAAc,OAAA,CAAA,CAKrDsB,CAAAA,GACCG,EACFM,CAAAA,CAAczF,CAAAA,CAAYyF,EAAaI,CAAiB,CAAA,CAC/C9B,CAAAA,GACT0B,CAAAA,CAAczF,CAAAA,CAAYyF,CAAAA,CAAaK,CAAmB,CAAA,CAAA,CAAA,CAIvD9F,CAAAA,CAAYsF,CAAAA,CAAMG,CAAAA,CAAa7G,CAAAA,CAAWS,GAAO,EAAGwE,CAAS,CACtE,CAAA,CAAG,CACDrE,CAAAA,CACAsE,CAAAA,CACAe,EACAG,CAAAA,CACAE,CAAAA,CACAC,CAAAA,CACApB,CAAAA,CACAC,CAAAA,CACAqB,CAAAA,CACAhG,IACAwE,CACF,CAAC,CAAA,CAEKkC,CAAAA,CAAehG,OAAAA,CACnB,KAAsB,CACpB,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,CAAA,EAAGqF,CAAY,CAAA,EAAA,CAAA,CACtB,IAAK,KAAA,CACL,SAAA,CAAWJ,CAAAA,CACP,iCAAA,CACA,kBAAA,CACJ,aAAA,CAAe,OACf,UAAA,CAAYO,CAAAA,CAAY,SAC1B,CAAA,CAAA,CACA,CAACP,EAAWI,CAAY,CAC1B,CAAA,CAEA,OACEnE,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,QAAA,CAAU,UAAW,CAAA,CAChC,QAAA,CAAA,CAAA+C,CAAAA,EACC/D,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,OACN,GAAA,CAAK,KAAA,CACL,UAAW,kBAAA,CACX,KAAA,CAAO,gCACP,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,EACV,CAAA,CAEC,QAAA,CAAA+D,EACH,CAAA,CAEF/C,IAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKyD,CAAAA,CACL,EAAA,CAAIF,EACJ,KAAA,CAAO1E,CAAAA,CACP,YAAA,CAAYoE,CAAAA,GAAcD,GAAAA,CAAc,MAAA,CAAY,gBACpD,cAAA,CACEE,CAAAA,GAAgB,OAAYA,CAAAA,CAAchE,GAAAA,EAAS,OAErD,YAAA,CAAc,IAAM2E,CAAAA,CAAa,IAAI,CAAA,CACrC,YAAA,CAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CACtC,OAAA,CAAUjF,CAAAA,EAAM,CA9R1B,IAAAwE,CAAAA,CA+RYY,GAAAA,CAAa,IAAI,CAAA,CAAA,CACjBZ,CAAAA,CAAA3E,CAAAA,CAAM,UAAN,IAAA,EAAA2E,CAAAA,CAAA,IAAA,CAAA3E,CAAAA,CAAgBG,CAAAA,EAClB,CAAA,CACA,OAASA,CAAAA,EAAM,CAlSzB,IAAAwE,CAAAA,CAmSYY,GAAAA,CAAa,KAAK,GAClBZ,CAAAA,CAAA3E,CAAAA,CAAM,MAAA,GAAN,IAAA,EAAA2E,CAAAA,CAAA,IAAA,CAAA3E,EAAeG,CAAAA,EACjB,CAAA,CACC,GAAGH,CAAAA,CAEH,QAAA,CAAA,CAAAuE,GAAAA,EACChE,IAAC,QAAA,CAAA,CAAO,KAAA,CAAM,GAAG,QAAA,CAAQ,IAAA,CACtB,SAAAgE,GAAAA,CACH,CAAA,CAED3E,GAAAA,CAAAA,CACH,CAAA,CACAW,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO8F,CAAAA,CACV,QAAA,CAAA9F,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,KAAA,CAAO,+BACT,CAAA,CACA,KAAK,MAAA,CACL,MAAA,CAAO,eACP,OAAA,CAAQ,WAAA,CACR,YAAa,CAAA,CAEb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CACf,CAAA,CAAE,gBAAA,CACJ,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CACF,EACA2D,EAAAA,CAAO,WAAA,CAAc,QAAA,CAErB,IAAMoC,GAAe5G,CAAAA,CAAM,UAAA,CACzB,CAAC,CAAE,GAAGM,CAAM,CAAA,CAAGC,CAAAA,GAAQM,GAAAA,CAAC,QAAA,CAAA,CAAO,GAAA,CAAKN,CAAAA,CAAM,GAAGD,CAAAA,CAAO,CACtD,EACAsG,EAAAA,CAAa,WAAA,CAAc,cAAA,CChU3B,IAAMC,GAAqC,CACzC,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,EACR,QAAA,CAAU,QAAA,CACV,IAAA,CAAM,eAAA,CACN,UAAA,CAAY,QAAA,CACZ,OAAQ,CACV,CAAA,CAEMC,EAAAA,CAAqC,CACzC,OAAA,CAAS,MAAA,CACT,WAAY,YAAA,CACZ,GAAGtH,EAAW,OAAO,CACvB,EAEMuH,EAAAA,CAAuC,CAC3C,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QACjB,EAEMC,EAAAA,CAAmC,CACvC,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,GAAA,CACZ,MAAO,yBAAA,CACP,MAAA,CAAQ,SACV,CAAA,CAEMC,EAAAA,CAAyC,CAC7C,SAAU,UAAA,CACV,KAAA,CAAO,+BACT,CAAA,CAMMC,EAAAA,CAAiD,CACrD,EAAA,CAAI,CAAE,KAAA,CAAO,MAAA,CAAQ,MAAA,CAAQ,MAAO,EACpC,EAAA,CAAI,CAAE,KAAA,CAAO,SAAA,CAAW,MAAA,CAAQ,SAAU,EAC1C,EAAA,CAAI,CAAE,KAAA,CAAO,QAAA,CAAU,MAAA,CAAQ,QAAS,CAC1C,CAAA,CAEMC,EAAAA,CAA8C,CAClD,EAAA,CAAI,CAAE,MAAO,UAAA,CAAY,MAAA,CAAQ,UAAW,CAAA,CAC5C,EAAA,CAAI,CAAE,MAAO,QAAA,CAAU,MAAA,CAAQ,QAAS,CAAA,CACxC,EAAA,CAAI,CAAE,MAAO,UAAA,CAAY,MAAA,CAAQ,UAAW,CAC9C,CAAA,CAMMC,EAAAA,CAAqD,CACzD,OAAA,CAAS,CACP,WAAA,CAAa,oBAAA,CACb,eAAA,CAAiB,yBAAA,CACjB,MAAO,sBACT,CAAA,CACA,OAAA,CAAS,CACP,WAAA,CAAa,CAAA,CACb,YAAa,OAAA,CACb,WAAA,CAAa,oBAAA,CACb,eAAA,CAAiB,aAAA,CACjB,KAAA,CAAO,sBACT,CAAA,CACA,MAAA,CAAQ,CACN,WAAA,CAAa,aAAA,CACb,eAAA,CAAiB,qBACjB,KAAA,CAAO,sBACT,EACA,KAAA,CAAO,CACL,GAAG1H,CAAAA,CAAiB,OAAO,CAAA,CAC3B,WAAA,CAAa,uBAAA,CACb,KAAA,CAAO,MACT,CACF,CAAA,CAoDM2H,EAAAA,CAAQrH,CAAAA,CAAM,UAAA,CAClB,CACE,CACE,OAAA,CAAAI,GAAAA,CAAU,SAAA,CACV,IAAA,CAAAsE,CAAAA,CAAO,IAAA,CACP,MAAA3D,CAAAA,CAAQ,KAAA,CACR,OAAA,CAAA4D,CAAAA,CAAU,KAAA,CACV,KAAA,CAAA1C,EACA,WAAA,CAAAC,CAAAA,CACA,EAAA,CAAAkD,CAAAA,CACA,GAAA,CAAKnF,GAAAA,CACL,MAAAI,GAAAA,CACA,QAAA,CAAAiH,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,EACA,GAAGlH,CACL,CAAA,CACAC,CAAAA,GACG,CA7JP,IAAA0E,EAAAwC,CAAAA,CAAAC,CAAAA,CA8JI,IAAMC,CAAAA,CAAc3H,CAAAA,CAAM,OAAM,CAC1B4H,CAAAA,CAAUxC,CAAAA,EAAMuC,CAAAA,CAChBE,CAAAA,CAAU5F,CAAAA,CAAQ,GAAG2F,CAAO,CAAA,MAAA,CAAA,CAAW,MAAA,CACvCE,CAAAA,CAAgB5F,CAAAA,CAAc,CAAA,EAAG0F,CAAO,CAAA,YAAA,CAAA,CAAiB,MAAA,CAEzD,CAAChC,CAAAA,CAAWC,CAAY,CAAA,CAAIF,SAAS,KAAK,CAAA,CAC1C,CAACF,CAAAA,CAAWC,CAAY,CAAA,CAAIC,SAAS,KAAK,CAAA,CAG1CoC,CAAAA,CAAezH,CAAAA,CAAM,OAAA,GAAY,MAAA,CACjC0H,GAAYP,CAAAA,CAAAA,CAAAxC,CAAAA,CAAA3E,CAAAA,CAAM,OAAA,GAAN,IAAA,CAAA2E,CAAAA,CAAiB3E,EAAM,cAAA,GAAvB,IAAA,CAAAmH,CAAAA,CAAyC,KAAA,CACrDQ,CAAAA,CAAgBF,CAAAA,EAAgB,CAACzH,CAAAA,CAAM,QAAA,EAAY,CAACA,CAAAA,CAAM,QAAA,CAI1D4H,GACJR,CAAAA,CAAAS,CAAAA,CAFqBpH,CAAAA,CAAQ,OAAA,CAAU4D,CAAAA,CAAU,SAAA,CAAYvE,GAE5B,CAAA,GAAjC,IAAA,CAAAsH,CAAAA,CAAsCS,CAAAA,CAAmB,OAAA,CAGrDC,CAAAA,CAAoDrH,EACtD,CAAE,WAAA,CAAa,0BAA2B,CAAA,CAC1C4D,CAAAA,CACE,CAAE,YAAa,sBAAuB,CAAA,CACtCqD,EACE,CAAE,WAAA,CAAa,sBAAuB,CAAA,CACtC,MAAA,CAGFK,CAAAA,CAAc1H,OAAAA,CAClB,IACEC,CAAAA,CACE,CACE,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,aAAc,KAAA,CACd,MAAA,CAAQ,WAAA,CACR,UAAA,CAAYuF,CAAAA,CAAY,MAAA,CACxB,OAAQmB,CAAAA,CAAW,aAAA,CAAgB,UACnC,OAAA,CAASA,CAAAA,CAAW,GAAM,CAAA,CAC1B,OAAA,CAAS,MACX,CAAA,CACAJ,EAAAA,CAAYxC,CAAI,EAChB0C,EAAAA,CAAahH,GAAO,CAAA,CACpBgI,CAAAA,CACA3C,CAAAA,EAAa,CAACuC,GAAa,CAACV,CAAAA,CACxBgB,GAAAA,CACA,MAAA,CACJ1C,CAAAA,CAAY,CAAE,UAAWsC,CAAY,CAAA,CAAI,MAC3C,CAAA,CACF,CACExD,CAAAA,CACAtE,IACAwF,CAAAA,CACAH,CAAAA,CACAuC,CAAAA,CACAV,CAAAA,CACAY,CAAAA,CACAE,CACF,CACF,CAAA,CAGMG,CAAAA,CAAgB5H,OAAAA,CACpB,IACEC,CAAAA,CACE,CACE,aAAc,KAAA,CACd,eAAA,CAAiB,sBAAA,CACjB,UAAA,CAAYuF,CAAAA,CAAY,MAAA,CACxB,QAAS6B,CAAAA,CAAY,CAAA,CAAI,EACzB,SAAA,CAAWA,CAAAA,CAAY,WAAa,UACtC,CAAA,CACAb,EAAAA,CAASzC,CAAI,CACf,CAAA,CACF,CAACA,CAAAA,CAAMsD,CAAS,CAClB,CAAA,CAGMQ,CAAAA,CAAe7H,OAAAA,CACnB,IACEC,CAAAA,CAAYkG,EAAAA,CAAetH,CAAAA,CAAWS,GAAO,CAAA,CAAGI,GAAK,EACvD,CAACJ,GAAAA,CAASI,GAAK,CACjB,CAAA,CAEA,OACEwB,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO2G,CAAAA,CACV,QAAA,CAAA,CAAA3G,IAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,QAAA,CAAU,UAAW,CAAA,CACjC,QAAA,CAAA,CAAAhB,IAAC,OAAA,CAAA,CACC,IAAA,CAAK,OAAA,CACL,EAAA,CAAI+G,CAAAA,CACJ,KAAA,CAAOf,GACP,GAAA,CAAKtG,CAAAA,CACL,eAAcyH,CAAAA,CACd,cAAA,CAAcjH,EACd,YAAA,CAAakB,CAAAA,CAA8B,MAAA,CAAtB3B,CAAAA,CAAM,YAAY,CAAA,CACvC,kBAAiB2B,CAAAA,CAAQ4F,CAAAA,CAAU,MAAA,CACnC,kBAAA,CAAkBC,CAAAA,CAClB,IAAA,CAAK,QACL,QAAA,CAAUR,CAAAA,CACV,QAAA,CAAUW,CAAAA,EAAiB3H,CAAAA,CAAM,QAAA,CACjC,QAAUG,CAAAA,EAAM,CACdoF,CAAAA,CAAa,IAAI,CAAA,CACjB0B,CAAAA,EAAA,MAAAA,CAAAA,CAAU9G,CAAAA,EACZ,CAAA,CACA,MAAA,CAASA,CAAAA,EAAM,CACboF,EAAa,KAAK,CAAA,CAClB2B,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAS/G,CAAAA,EACX,EACC,GAAGH,CAAAA,CACN,CAAA,CACAO,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOwH,EACP,YAAA,CAAc,IAAM3C,EAAa,IAAI,CAAA,CACrC,aAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CAEtC,QAAA,CAAA7E,GAAAA,CAAC,OAAI,KAAA,CAAO0H,CAAAA,CAAe,CAAA,CAC7B,CAAA,CAAA,CACF,CAAA,CAAA,CACEtG,CAAAA,EAASC,IACTL,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOkF,EAAAA,CACT,QAAA,CAAA,CAAA9E,CAAAA,EACCpB,IAAC,OAAA,CAAA,CACC,OAAA,CAAS+G,EACT,EAAA,CAAIC,CAAAA,CACJ,MACEP,CAAAA,CACI,CAAE,GAAGN,EAAAA,CAAa,MAAA,CAAQ,aAAA,CAAe,QAAS,EAAI,CAAA,CACtDA,EAAAA,CAGL,QAAA,CAAA/E,CAAAA,CACH,CAAA,CAEDC,GACCrB,GAAAA,CAAC,GAAA,CAAA,CAAE,EAAA,CAAIiH,CAAAA,CAAe,KAAA,CAAOb,EAAAA,CAC1B,SAAA/E,CAAAA,CACH,CAAA,CAAA,CAEJ,GAEJ,CAEJ,CACF,EACAmF,EAAAA,CAAM,WAAA,CAAc,OAAA,KCjQdoB,EAAAA,CAA0C,CAC9C,EAAA,CAAI,CAAA,CACJ,EAAA,CAAI,CAAA,CACJ,GAAI,EACN,CAAA,CAIMC,EAAAA,CAAqC,CACzC,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EACN,CAAA,CAIMC,EAAAA,CAAmC,CACvC,QAAS,sCAAA,CACT,OAAA,CACE,6EAAA,CACF,OAAA,CACE,8EAAA,CACF,OAAA,CACE,+EACF,MAAA,CACE,+EACJ,CAAA,CAIMC,EAAAA,CAAmC,CACvC,OAAA,CAAS,kDACT,OAAA,CAAS,wCAAA,CACT,QAAS,yCAAA,CACT,OAAA,CAAS,0CACT,MAAA,CAAQ,0CACV,CAAA,CAEMC,EAAAA,CAAkC,CACtC,OAAA,CAAS,kDACT,OAAA,CAAS,wCAAA,CACT,OAAA,CAAS,yCAAA,CACT,OAAA,CAAS,yCAAA,CACT,OAAQ,0CACV,CAAA,CAwCMC,EAAAA,CAAS9I,CAAAA,CAAM,UAAA,CACnB,CACE,CACE,GAAA,CAAKC,GAAAA,CACL,MAAAI,CAAAA,CACA,OAAA,CAAAD,EAAU,SAAA,CACV,IAAA,CAAAsE,CAAAA,CAAO,IAAA,CACP,SAAA,CAAAqE,CAAAA,CAAY,MACZ,SAAA,CAAAC,CAAAA,CAAY,KAAA,CACZ,KAAA,CAAA/G,CAAAA,CACA,GAAA,CAAAsB,EAAM,CAAA,CACN,GAAA,CAAAC,GAAAA,CAAM,GAAA,CACN,IAAA,CAAAyF,CAAAA,CAAO,EACP,KAAA,CAAA9F,CAAAA,CAAQ,EACR,aAAA,CAAA+F,CAAAA,CACA,YAAAC,CAAAA,CAAc,YAAA,CACd,QAAA,CAAA7B,CAAAA,CAAW,KAAA,CACX,GAAGhH,CACL,CAAA,CACAC,CAAAA,GACG,CACH,IAAM6I,CAAAA,CAAU,KAAA,CAAM,QAAQjG,CAAK,CAAA,CAC7BkG,CAAAA,CAAeD,CAAAA,CAAUjG,CAAAA,CAAQ,CAACA,CAAK,CAAA,CAEvCmG,CAAAA,CAAgB7I,CAAAA,EAA2C,CAC/D,IAAM8I,CAAAA,CAAW,WAAW9I,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC1C,GAAIyI,CAAAA,CACF,GAAIE,CAAAA,CAAS,CACX,IAAMI,CAAAA,CAAQ,QAAA,CAAS/I,CAAAA,CAAE,OAAO,OAAA,CAAQ,KAAA,EAAS,GAAG,CAAA,CAC9CgJ,CAAAA,CAAW,CAAC,GAAGJ,CAAY,CAAA,CACjCI,EAASD,CAAK,CAAA,CAAID,EAClBL,CAAAA,CAAcO,CAAQ,EACxB,CAAA,KACEP,CAAAA,CAAcK,CAAQ,EAG5B,CAAA,CAEMG,CAAAA,CAAiBjB,EAAAA,CAAgB/D,CAAI,CAAA,CACrCiF,CAAAA,CAAYjB,GAAWhE,CAAI,CAAA,CAC3BkF,CAAAA,CAAUjB,EAAAA,CAASvI,CAAO,CAAA,CAC1ByJ,EAAUjB,EAAAA,CAASxI,CAAO,EAC1B0J,CAAAA,CAASjB,EAAAA,CAAQzI,CAAO,CAAA,CAExB2J,CAAAA,CAAaZ,CAAAA,GAAgB,UAAA,CAG7BX,CAAAA,CAAe7H,OAAAA,CACnB,IACEC,CAAAA,CACE,CACE,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAGpB,CAAAA,CAAW,OAAO,CAAA,CACrB,aAAA,CAAeuK,CAAAA,CAAa,QAAA,CAAW,MACvC,KAAA,CAAOA,CAAAA,CAAa,OAAY,MAAA,CAChC,MAAA,CAAQA,EAAa,MAAA,CAAS,MAChC,CAAA,CACAvK,CAAAA,CAAWS,GAAO,CAAA,CAClBI,CACF,CAAA,CACF,CAAC0J,CAAAA,CAAY9J,GAAAA,CAASI,CAAK,CAC7B,EAGM2J,CAAAA,CAAarJ,OAAAA,CAAQ,IAA2B,CACpD,IAAMuF,CAAAA,CAA4B,CAChC,QAAA,CAAU,UAAA,CACV,YAAA,CAAc,QAAA,CACd,eAAA,CAAiB0D,CACnB,EACA,OAAIG,CAAAA,CACK,CACL,GAAG7D,CAAAA,CACH,KAAA,CAAOwD,EACP,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAA,CACN,SAAA,CAAW,kBACb,EAEK,CACL,GAAGxD,CAAAA,CACH,MAAA,CAAQwD,CAAAA,CACR,KAAA,CAAO,MACT,CACF,CAAA,CAAG,CAACK,CAAAA,CAAYL,CAAAA,CAAgBE,CAAO,CAAC,CAAA,CAGlCK,CAAAA,CAAiB,CACrBC,CAAAA,CACAC,CAAAA,GACwB,CACxB,IAAMjE,CAAAA,CAA4B,CAChC,QAAA,CAAU,UAAA,CACV,YAAA,CAAc,SACd,eAAA,CAAiB4D,CACnB,CAAA,CACA,OAAIC,CAAAA,CACK,CACL,GAAG7D,CAAAA,CACH,KAAA,CAAOwD,EACP,IAAA,CAAM,KAAA,CACN,UAAW,kBAAA,CACX,MAAA,CAAQ,CAAA,EAAGQ,CAAQ,CAAA,CAAA,CAAA,CACnB,MAAA,CAAQ,GAAGC,CAAO,CAAA,CAAA,CACpB,CAAA,CAEK,CACL,GAAGjE,CAAAA,CACH,OAAQwD,CAAAA,CACR,IAAA,CAAM,CAAA,EAAGQ,CAAQ,CAAA,CAAA,CAAA,CACjB,KAAA,CAAO,GAAGC,CAAO,CAAA,CAAA,CACnB,CACF,CAAA,CAGMC,CAAAA,CAAmBC,GAA6C,CACpE,IAAMnE,CAAAA,CAA4B,CAChC,QAAA,CAAU,UAAA,CACV,MAAOyD,CAAAA,CACP,MAAA,CAAQA,CAAAA,CACR,YAAA,CAAc,QAAA,CACd,MAAA,CAAQ,kBACR,SAAA,CACE,gEAAA,CACF,UAAA,CAAY,6BAAA,CACZ,eAAA,CAAiBE,CACnB,EAKA,OAJIvC,CAAAA,GACFpB,CAAAA,CAAK,MAAA,CAAS,aAAA,CACdA,CAAAA,CAAK,QAAU,EAAA,CAAA,CAEb6D,CAAAA,CACK,CACL,GAAG7D,CAAAA,CACH,IAAA,CAAM,MACN,SAAA,CAAW,kBAAA,CACX,MAAA,CAAQ,CAAA,EAAGmE,CAAW,CAAA,CAAA,CACxB,EAEK,CACL,GAAGnE,CAAAA,CACH,GAAA,CAAK,KAAA,CACL,SAAA,CAAW,mBACX,IAAA,CAAM,CAAA,EAAGmE,CAAW,CAAA,CAAA,CACtB,CACF,EAGMC,CAAAA,CAAwC,CAC5C,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,CAAA,CACP,QAAS,CAAA,CACT,MAAA,CAAQhD,CAAAA,CAAW,aAAA,CAAgB,SAAA,CACnC,KAAA,CAAO,OACP,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,CACV,CAAA,CAEMiD,CAAAA,CAAc,CAACf,CAAAA,CAAgB,CAAA,GACnC3I,IAAC,OAAA,CAAA,CAEC,GAAA,CAAK2I,IAAU,CAAA,CAAIjJ,CAAAA,CAAM,MAAA,CACzB,IAAA,CAAK,OAAA,CACL,GAAA,CAAKgD,EACL,GAAA,CAAKC,GAAAA,CACL,IAAA,CAAMyF,CAAAA,CACN,KAAA,CAAOI,CAAAA,CAAaG,CAAK,CAAA,CACzB,QAAA,CAAUF,CAAAA,CACV,YAAA,CAAYE,CAAAA,CACZ,QAAA,CAAUlC,EACV,KAAA,CAAO,CACL,GAAGgD,CAAAA,CACH,GAAIP,GAAc,CAChB,WAAA,CAAa,aAAA,CACb,gBAAA,CAAkB,iBACpB,CACF,EACC,GAAGzJ,CAAAA,CAAAA,CAjBCkJ,CAkBP,CAAA,CAGIgB,CAAAA,CAAc,IAAM,CACxB,GAAI,CAACzB,CAAAA,CAAW,OAAO,IAAA,CAEvB,IAAM0B,EAAsC,CAC1C,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,WAAA,CACZ,KAAA,CAAO,iDACT,CAAA,CAEA,OAAIrB,CAAAA,CAEAvI,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,GAAGrB,CAAAA,CAAW,OAAO,CAAA,CACrB,SAAU,UAAA,CACV,KAAA,CAAO,iDACT,CAAA,CAEC,QAAA,CAAA6J,CAAAA,CAAa,IAAI,CAACqB,CAAAA,CAAKlB,IACtB3I,GAAAA,CAAC,MAAA,CAAA,CAAiB,MAAO4J,CAAAA,CACtB,QAAA,CAAAC,CAAAA,CAAAA,CADQlB,CAEX,CACD,CAAA,CACH,EAIG3I,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO4J,CAAAA,CAAiB,QAAA,CAAApB,CAAAA,CAAa,CAAC,CAAA,CAAE,CACvD,CAAA,CAEMsB,CAAAA,CAAkC,CACtC,QAAA,CAAU,WACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,2CAAA,CACP,QAAA,CAAU,CACZ,EAGMC,CAAAA,CAA2Cb,CAAAA,CAC7C,CAAE,QAAA,CAAU,UAAA,CAAY,MAAA,CAAQ,MAAO,CAAA,CACvC,CACE,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,MAAA,CACP,GAAGvK,CAAAA,CAAW,KAAK,CAAA,CACnB,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QACd,CAAA,CAEEqL,CAAAA,CAAezB,GACfC,CAAAA,CAAa,CAAC,EAAI9F,CAAAA,GAAQC,GAAAA,CAAMD,CAAAA,CAAAA,CAAQ,GAAA,CAC1C,CAAA,CACEuH,CAAAA,CAAc1B,GACdC,CAAAA,CAAa,CAAC,CAAA,CAAIA,CAAAA,CAAa,CAAC,CAAA,GAAM7F,IAAMD,CAAAA,CAAAA,CAAQ,GAAA,CAAA,CACpD8F,CAAAA,CAAa,CAAC,CAAA,CAAI9F,CAAAA,GAAQC,IAAMD,CAAAA,CAAAA,CAAQ,GAAA,CAE9C,OACE1B,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO2G,EACT,QAAA,CAAA,CAAAQ,CAAAA,EAAa/G,CAAAA,EAASpB,GAAAA,CAAC,OAAA,CAAA,CAAM,KAAA,CAAO8J,EAAa,QAAA,CAAA1I,CAAAA,CAAM,CAAA,CAExDJ,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,IAAA,CAAM,CAAA,CACN,QAAA,CAAU,UAAA,CACV,GAAIkI,CAAAA,CAAa,CAAE,MAAA,CAAQ,MAAO,EAAI,CAAE,KAAA,CAAO,MAAO,CACxD,CAAA,CAEA,QAAA,CAAA,CAAAlI,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO+I,EAEV,QAAA,CAAA,CAAA/J,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOmJ,CAAAA,CAAY,CAAA,CAGxBnJ,IAAC,KAAA,CAAA,CAAI,KAAA,CAAOoJ,CAAAA,CAAeY,CAAAA,CAAcC,CAAW,CAAA,CAAG,EAGtD1B,CAAAA,CACCC,CAAAA,CAAa,IAAI,CAAC0B,CAAAA,CAAGvB,IACnB3I,GAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAOuJ,CAAAA,CAAAA,CACHf,CAAAA,CAAaG,CAAK,EAAIjG,CAAAA,GAAQC,GAAAA,CAAMD,CAAAA,CAAAA,CAAQ,GAChD,CAAA,CAAA,CAHKiG,CAIP,CACD,CAAA,CAED3I,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOuJ,CAAAA,CAAAA,CACHf,CAAAA,CAAa,CAAC,CAAA,CAAI9F,CAAAA,GAAQC,IAAMD,CAAAA,CAAAA,CAAQ,GAC5C,EACF,CAAA,CAAA,CAEJ,CAAA,CAGA1C,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,SAAU,UAAA,CAAY,KAAA,CAAO,CAAA,CAAG,OAAA,CAAS,CAAE,CAAA,CACtD,SAAAuI,CAAAA,CACGC,CAAAA,CAAa,GAAA,CAAI,CAAC0B,CAAAA,CAAGvB,CAAAA,GAAUe,EAAYf,CAAK,CAAC,CAAA,CACjDe,CAAAA,EAAY,CAClB,CAAA,CAAA,CACF,EAECC,CAAAA,EAAY,CAAA,CACf,CAEJ,CACF,EACA1B,EAAAA,CAAO,YAAc,QAAA,CChXrB,IAAMkC,EAAAA,CAAkD,CACtD,EAAA,CAAI,CAAE,OAAQ,MAAA,CAAQ,QAAA,CAAU,UAAA,CAAY,OAAA,CAAS,WAAY,CAAA,CACjE,GAAI,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,UAAA,CAAY,OAAA,CAAS,QAAS,CAAA,CAChE,EAAA,CAAI,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,OAAQ,OAAA,CAAS,WAAY,CAC/D,CAAA,CAEMC,EAAAA,CAAa,CACjBC,CAAAA,CACAC,CAAAA,CAAiB,YAAA,CACjBC,CAAAA,CAAkB,OAAA,GACP,CACX,GAAI,CAACF,CAAAA,CAAM,OAAO,EAAA,CAElB,IAAMG,CAAAA,CAAOH,EAAK,WAAA,EAAY,CACxBI,CAAAA,CAAQ,MAAA,CAAOJ,CAAAA,CAAK,QAAA,GAAa,CAAC,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,EACnDK,CAAAA,CAAM,MAAA,CAAOL,CAAAA,CAAK,OAAA,EAAS,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAAA,CAElD,OAAOC,CAAAA,CACJ,OAAA,CAAQ,OAAQ,MAAA,CAAOE,CAAI,CAAC,CAAA,CAC5B,OAAA,CAAQ,IAAA,CAAMC,CAAK,CAAA,CACnB,OAAA,CAAQ,IAAA,CAAMC,CAAG,CACtB,CAAA,CAEMC,GAAiB,CAACH,CAAAA,CAAcC,CAAAA,GAC7B,IAAI,IAAA,CAAKD,CAAAA,CAAMC,EAAQ,CAAA,CAAG,CAAC,CAAA,CAAE,OAAA,EAAQ,CAGxCG,EAAAA,CAAqB,CAACJ,CAAAA,CAAcC,CAAAA,GACjC,IAAI,IAAA,CAAKD,CAAAA,CAAMC,CAAAA,CAAO,CAAC,CAAA,CAAE,MAAA,GAiCrBI,EAAAA,CAAa1L,CAAAA,CAAM,WAC9B,CACE,CACE,KAAA,CAAAmD,GAAAA,CACA,QAAA,CAAAwI,CAAAA,CACA,QAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,WAAA,CAAAhH,CAAAA,CAAc,mDAAA,CACd,SAAAyC,CAAAA,CAAW,KAAA,CACX,KAAA,CAAAvG,CAAAA,CAAQ,KAAA,CACR,UAAA,CAAA+K,EAAa,YAAA,CACb,MAAA,CAAAC,IAAS,OAAA,CACT,IAAA,CAAArH,EAAO,IAAA,CACP,WAAA,CAAAsH,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,GAAA,CAAKhM,IACL,KAAA,CAAAI,CAAAA,CACA,SAAA,CAAA6L,CAAAA,CACA,GAAG5L,CACL,EACAC,CAAAA,GACG,CACH,IAAM4L,CAAAA,CAAgBhH,KAAAA,EAAM,CACtBiH,EAAiBF,CAAAA,EAAaC,CAAAA,CAE9B,CAACE,CAAAA,CAAQC,CAAS,EAAItM,CAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAC1C,CAACuM,CAAAA,CAAcC,CAAe,CAAA,CAAIxM,CAAAA,CAAM,QAAA,CAC5CmD,GAAAA,CAAQ,IAAI,IAAA,CAAKA,IAAM,WAAA,EAAY,CAAGA,GAAAA,CAAM,QAAA,EAAU,CAAA,CAAI,IAAI,IAChE,CAAA,CACM,CAACsJ,CAAAA,CAAaC,CAAc,CAAA,CAAI1M,EAAM,QAAA,CAAsB,IAAI,CAAA,CAChE,CAAC2M,CAAAA,CAAUC,CAAW,EAAI5M,CAAAA,CAAM,QAAA,CACpC,MACF,CAAA,CAEM6M,CAAAA,CAAc1J,GAAAA,CAAQ8H,GAAW9H,GAAAA,CAAO2I,CAAAA,CAAYC,GAAM,CAAA,CAAI,EAAA,CAE9De,CAAAA,CAAoB5B,GAAe,CACnCU,CAAAA,EAAWV,EAAOU,CAAAA,EAClBC,CAAAA,EAAWX,EAAOW,CAAAA,GACtBF,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWT,CAAAA,CAAAA,CACXoB,CAAAA,CAAU,KAAK,CAAA,EACjB,CAAA,CAEMS,CAAAA,CAAkB,IAAM,CAC5BP,CAAAA,CACE,IAAI,IAAA,CAAKD,CAAAA,CAAa,WAAA,EAAY,CAAGA,CAAAA,CAAa,QAAA,GAAa,CAAC,CAClE,EACF,CAAA,CAEMS,CAAAA,CAAkB,IAAM,CAC5BR,CAAAA,CACE,IAAI,IAAA,CAAKD,CAAAA,CAAa,WAAA,EAAY,CAAGA,EAAa,QAAA,EAAS,CAAI,CAAC,CAClE,EACF,CAAA,CAEMU,EAAc,IAAM,CACxB,IAAMC,CAAAA,CAAQ,IAAI,IAAA,CAClBA,EAAM,QAAA,CAAS,CAAA,CAAG,EAAG,CAAA,CAAG,CAAC,EACzBJ,CAAAA,CAAiBI,CAAK,EACxB,CAAA,CAEMC,CAAAA,CAAqBC,CAAAA,EAAuB,CAChDZ,CAAAA,CAAgB,IAAI,IAAA,CAAKD,CAAAA,CAAa,WAAA,EAAY,CAAGa,CAAU,CAAC,CAAA,CAChER,CAAAA,CAAY,MAAM,EACpB,CAAA,CAEMS,EAAoBC,CAAAA,EAAyB,CACjDd,CAAAA,CAAgB,IAAI,IAAA,CAAKc,CAAAA,CAAcf,EAAa,QAAA,EAAU,CAAC,CAAA,CAC/DK,CAAAA,CAAY,QAAQ,EACtB,CAAA,CAEMW,CAAAA,CAAoB,IAAM,CACLX,CAAAA,CAArBD,CAAAA,GAAa,OAAoB,QAAA,CAC5BA,CAAAA,GAAa,QAAA,CAAsB,OAAA,CAC3B,QAF4B,EAG/C,EAEMtB,CAAAA,CAAOkB,CAAAA,CAAa,aAAY,CAChCjB,CAAAA,CAAQiB,EAAa,QAAA,EAAS,CAC9BiB,CAAAA,CAAchC,EAAAA,CAAeH,CAAAA,CAAMC,CAAK,EACxCmC,CAAAA,CAAWhC,EAAAA,CAAmBJ,CAAAA,CAAMC,CAAK,CAAA,CAGzCoC,CAAAA,CAAwC,CAC5C,OAAA,CAAS,CAAC,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,SAAK,QAAA,CAAK,QAAG,EAC3C,EAAA,CAAI,CAAC,SAAK,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,QAAG,EACtC,OAAA,CAAS,CAAC,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,QAAA,CAAK,SAAK,QAAA,CAAK,QAAG,CAAA,CAC3C,EAAA,CAAI,CAAC,QAAA,CAAK,SAAK,QAAA,CAAK,QAAA,CAAK,SAAK,QAAA,CAAK,QAAG,EACtC,OAAA,CAAS,CAAC,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,MAAO,KAAA,CAAO,KAAK,CAAA,CACzD,EAAA,CAAI,CAAC,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,CACtD,EACMC,EAAAA,CAAWD,CAAAA,CAAY3B,GAAM,CAAA,EAAK2B,CAAAA,CAAY,EAAA,CAG9CE,GAAc,CAACvC,CAAAA,CAAcC,CAAAA,CAAeuC,CAAAA,GAC5CA,CAAAA,GAAQ,OAAA,EAAWA,IAAQ,IAAA,CACtB,CAAA,EAAGxC,CAAI,CAAA,OAAA,EAAKC,CAAAA,CAAQ,CAAC,SACnBuC,CAAAA,GAAQ,OAAA,EAAWA,CAAAA,GAAQ,IAAA,CAC7B,CAAA,EAAGxC,CAAI,UAAKC,CAAAA,CAAQ,CAAC,SAgBrB,CAAA,EAdY,CACjB,UACA,UAAA,CACA,OAAA,CACA,OAAA,CACA,KAAA,CACA,MAAA,CACA,MAAA,CACA,SACA,WAAA,CACA,SAAA,CACA,UAAA,CACA,UACF,CAAA,CACqBA,CAAK,CAAC,CAAA,CAAA,EAAID,CAAI,CAAA,CAAA,CAajCyC,EAAAA,CARuC,CAC3C,OAAA,CAAS,eACT,EAAA,CAAI,cAAA,CACJ,QAAS,cAAA,CACT,EAAA,CAAI,eACJ,OAAA,CAAS,OAAA,CACT,EAAA,CAAI,OACN,CAAA,CAC+B/B,GAAM,GAAK,OAAA,CAGpCgC,EAAAA,CAA2C,CAC/C,OAAA,CAAS,CACP,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,UAAA,CACA,UAAA,CACA,UACF,CAAA,CACA,EAAA,CAAI,CACF,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,UACF,CAAA,CACA,QAAS,CACP,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,UACF,EACA,EAAA,CAAI,CACF,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,UACF,CAAA,CACA,OAAA,CAAS,CACP,KAAA,CACA,KAAA,CACA,KAAA,CACA,MACA,KAAA,CACA,KAAA,CACA,MACA,KAAA,CACA,KAAA,CACA,MACA,KAAA,CACA,KACF,CAAA,CACA,EAAA,CAAI,CACF,KAAA,CACA,MACA,KAAA,CACA,KAAA,CACA,KAAA,CACA,KAAA,CACA,KAAA,CACA,KAAA,CACA,MACA,KAAA,CACA,KAAA,CACA,KACF,CACF,CAAA,CACMC,EAAAA,CAAcD,GAAehC,GAAM,CAAA,EAAKgC,GAAe,EAAA,CAGvDE,EAAAA,CAAa,CACjB,SAAA,CAAWlC,GAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAC7B,qBAAA,CACAA,IAAO,UAAA,CAAW,IAAI,CAAA,CACpB,cAAA,CACA,gBAAA,CACN,SAAA,CAAWA,IAAO,UAAA,CAAW,IAAI,CAAA,CAC7B,qBAAA,CACAA,GAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACpB,cAAA,CACA,aACN,QAAA,CAAUA,GAAAA,CAAO,WAAW,IAAI,CAAA,CAC5B,2BAAA,CACAA,GAAAA,CAAO,UAAA,CAAW,IAAI,EACpB,cAAA,CACA,eAAA,CACN,QAAA,CAAUA,GAAAA,CAAO,UAAA,CAAW,IAAI,EAC5B,2BAAA,CACAA,GAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACpB,cAAA,CACA,YACN,YAAA,CAAcA,GAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAChC,uBAAA,CACAA,IAAO,UAAA,CAAW,IAAI,CAAA,CACpB,sBAAA,CACA,mBAAA,CACN,YAAA,CAAcA,IAAO,UAAA,CAAW,IAAI,CAAA,CAChC,uBAAA,CACAA,GAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACpB,sBAAA,CACA,eAAA,CACN,eAAA,CAAiBA,GAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACnC,kCAAA,CACAA,IAAO,UAAA,CAAW,IAAI,EACpB,2BAAA,CACA,mBACR,CAAA,CAGMmC,EAAAA,CAAsB,CAAChD,CAAAA,CAAY2C,IACnCA,CAAAA,CAAI,UAAA,CAAW,IAAI,CAAA,CACd,CAAA,EAAG3C,CAAAA,CAAK,aAAa,CAAA,OAAA,EAAKA,CAAAA,CAAK,QAAA,EAAS,CAAI,CAAC,UAAKA,CAAAA,CAAK,OAAA,EAAS,CAAA,MAAA,CAAA,CAC9D2C,CAAAA,CAAI,UAAA,CAAW,IAAI,CAAA,CACrB,CAAA,EAAG3C,CAAAA,CAAK,WAAA,EAAa,CAAA,MAAA,EAAIA,EAAK,QAAA,EAAS,CAAI,CAAC,CAAA,MAAA,EAAIA,CAAAA,CAAK,OAAA,EAAS,CAAA,MAAA,CAAA,CAE9DA,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,IAAA,CAAM,UACN,KAAA,CAAO,MAAA,CACP,IAAK,SACP,CAAC,EAICiD,EAAAA,CAAkBjD,CAAAA,EAClB,CAAA,EAAAU,CAAAA,EAAWV,CAAAA,CAAOU,CAAAA,EAClBC,GAAWX,CAAAA,CAAOW,CAAAA,CAAAA,CAIlBuC,EAAAA,CAAkBlD,CAAAA,EACjB/H,GAAAA,CAEH+H,CAAAA,CAAK,aAAY,GAAM/H,GAAAA,CAAM,WAAA,EAAY,EACzC+H,CAAAA,CAAK,QAAA,KAAe/H,GAAAA,CAAM,QAAA,EAAS,EACnC+H,CAAAA,CAAK,OAAA,EAAQ,GAAM/H,IAAM,OAAA,EAAQ,CAJhB,KAAA,CAQfkL,EAAAA,CAAWnD,CAAAA,EAAwB,CACvC,IAAMgC,CAAAA,CAAQ,IAAI,IAAA,CAClB,OACEhC,CAAAA,CAAK,WAAA,KAAkBgC,CAAAA,CAAM,WAAA,EAAY,EACzChC,CAAAA,CAAK,QAAA,EAAS,GAAMgC,EAAM,QAAA,EAAS,EACnChC,EAAK,OAAA,EAAQ,GAAMgC,EAAM,OAAA,EAE7B,CAAA,CAEMoB,EAAAA,CAAapD,CAAAA,EAAuB,CACxC,IAAMqD,CAAAA,CAAIrD,CAAAA,CAAK,WAAA,EAAY,CACrBsD,CAAAA,CAAI,MAAA,CAAOtD,EAAK,QAAA,EAAS,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAC/CuD,CAAAA,CAAI,OAAOvD,CAAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAChD,OAAO,GAAGqD,CAAC,CAAA,CAAA,EAAIC,CAAC,CAAA,CAAA,EAAIC,CAAC,CAAA,CACvB,EAEMC,EAAAA,CAAe1O,CAAAA,CAAM,OAAA,CACzB,IAAOiM,CAAAA,CAAiB,IAAI,IAAIA,CAAc,CAAA,CAAI,KAClD,CAACA,CAAc,CACjB,CAAA,CAEM0C,EAAAA,CAAgBzD,CAAAA,EAChBwD,EAAAA,CACKA,EAAAA,CAAa,GAAA,CAAIJ,GAAUpD,CAAI,CAAC,CAAA,CAEpCc,CAAAA,CACEA,CAAAA,CAAY,IAAA,CAChB4C,GACCA,CAAAA,CAAO,WAAA,EAAY,GAAM1D,CAAAA,CAAK,WAAA,EAAY,EAC1C0D,EAAO,QAAA,EAAS,GAAM1D,CAAAA,CAAK,QAAA,EAAS,EACpC0D,CAAAA,CAAO,SAAQ,GAAM1D,CAAAA,CAAK,OAAA,EAC9B,CAAA,CANyB,KAAA,CASrB2D,GAAgC,EAAC,CAGvC,IAAA,IAASC,CAAAA,CAAIrB,CAAAA,CAAW,CAAA,CAAGqB,GAAK,CAAA,CAAGA,CAAAA,EAAAA,CAAK,CACtC,IAAM5D,CAAAA,CAAO,IAAI,KAAKG,CAAAA,CAAMC,CAAAA,CAAO,CAACwD,CAAC,CAAA,CACrCD,GAAa,IAAA,CAAK3D,CAAI,EACxB,CAGA,IAAA,IAASK,CAAAA,CAAM,EAAGA,CAAAA,EAAOiC,CAAAA,CAAajC,CAAAA,EAAAA,CACpCsD,EAAAA,CAAa,IAAA,CAAK,IAAI,KAAKxD,CAAAA,CAAMC,CAAAA,CAAOC,CAAG,CAAC,CAAA,CAM9C,IAAMwD,GAFY,IAAA,CAAK,IAAA,CAAKF,GAAa,MAAA,CAAS,CAAC,EACpB,CAAA,CACIA,EAAAA,CAAa,MAAA,CAChD,IAAA,IAAStD,CAAAA,CAAM,CAAA,CAAGA,GAAOwD,EAAAA,CAAexD,CAAAA,EAAAA,CACtCsD,EAAAA,CAAa,IAAA,CAAK,IAAI,IAAA,CAAKxD,EAAMC,CAAAA,CAAQ,CAAA,CAAGC,CAAG,CAAC,CAAA,CAGlD,IAAMyD,GAA0CpO,CAAAA,CAC9CpB,CAAAA,CAAW,YAAY,CAAA,CACvB,CACE,QAAS,MAAA,CACT,KAAA,CAAO,MAAA,CACP,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,gBAChB,MAAA,CAAQuB,CAAAA,CACJ,oCAAA,CACA,8BAAA,CACJ,eAAA,CAAiB,yBAAA,CACjB,UAAW,MAAA,CACX,QAAA,CAAUiK,EAAAA,CAAWtG,CAAI,CAAA,CAAE,QAAA,CAC3B,OAAQsG,EAAAA,CAAWtG,CAAI,CAAA,CAAE,MAAA,CACzB,OAAA,CAASsG,EAAAA,CAAWtG,CAAI,CAAA,CAAE,OAAA,CAC1B,UAAA,CAAY,WAAA,CACZ,MAAA,CAAQ4C,CAAAA,CAAW,cAAgB,SAAA,CACnC,OAAA,CAASA,CAAAA,CAAW,EAAA,CAAM,CAC5B,CACF,EAEM2H,EAAAA,CACJpN,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,EAAA,CAAIuK,EACJ,QAAA,CAAU9E,CAAAA,CACV,MAAO0H,EAAAA,CACP,YAAA,CAAYnC,GAAehI,CAAAA,CAE3B,QAAA,CAAA,CAAAhE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAM,CAAA,CACN,KAAA,CAAOgM,CAAAA,CACH,yBAAA,CACA,+BACN,CAAA,CAEC,SAAAA,CAAAA,EAAehI,CAAAA,CAClB,CAAA,CACAhE,GAAAA,CAACqO,CAAAA,CAAA,CAAK,KAAK,UAAA,CAAW,GAAA,CAAI,eAAe,CAAA,CAAA,CAC3C,CAAA,CAGF,OACErO,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CACL,KAAA,CAAOK,CAAAA,CAAYpB,EAAW,UAAU,CAAA,CAAGA,CAAAA,CAAWS,GAAO,CAAA,CAAGI,CAAK,EACpE,GAAGC,CAAAA,CAEJ,QAAA,CAAAO,GAAAA,CAACsO,GAAAA,CAAA,CACC,KAAM9C,CAAAA,CACN,YAAA,CAAe+C,GAAS,CACtB9C,CAAAA,CAAU8C,CAAI,CAAA,CACVA,CAAAA,EAAMxC,CAAAA,CAAY,MAAM,EAC9B,CAAA,CACA,QAASqC,EAAAA,CACT,QAAA,CAAS,QAAA,CACT,KAAA,CAAM,OAAA,CACN,SAAA,CAAS,KACT,YAAA,CAAc,CAAE,OAAA,CAAS,CAAE,CAAA,CAE3B,QAAA,CAAApO,IAAC,KAAA,CAAA,CACC,KAAA,CAAOD,CAAAA,CAAYpB,CAAAA,CAAW,YAAY,CAAA,CAAG,CAC3C,eAAA,CAAiB,sBACnB,CAAC,CAAA,CAED,QAAA,CAAAqC,IAAAA,CAAC,OAAI,KAAA,CAAOrC,CAAAA,CAAW,KAAK,CAAA,CAE1B,QAAA,CAAA,CAAAqC,IAAAA,CAAC,OACC,KAAA,CAAOjB,CAAAA,CAAYpB,CAAAA,CAAW,MAAM,CAAA,CAAG,CACrC,QAAS,MAAA,CACT,UAAA,CAAY,SACZ,cAAA,CAAgB,eAClB,CAAC,CAAA,CAED,QAAA,CAAA,CAAAqB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM,CACT8L,CAAAA,GAAa,MAAA,CAAQI,CAAAA,EAAgB,CAEvCP,EADOG,CAAAA,GAAa,OAAA,CAElB,IAAI,IAAA,CACFJ,CAAAA,CAAa,WAAA,GAAgB,EAAA,CAC7BA,CAAAA,CAAa,UACf,CAAA,CAIA,IAAI,IAAA,CACFA,CAAAA,CAAa,WAAA,EAAY,CAAI,CAAA,CAC7BA,CAAAA,CAAa,UACf,CANF,EAQJ,CAAA,CACA,KAAA,CAAO3L,CAAAA,CAAYpB,EAAW,gBAAgB,CAAA,CAAG,CAC/C,eAAA,CAAiB,aAAA,CACjB,MAAA,CAAQ,OACR,MAAA,CAAQ,SAAA,CACR,WAAY,wBAAA,CACZ,QAAA,CAAU,UACV,SAAA,CAAW,SAAA,CACX,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,eAAgB,QAClB,CAAC,CAAA,CACD,YAAA,CAAeiB,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAA8B,KAAA,CAAM,eAAA,CACrC,qBACJ,CAAA,CACA,YAAA,CAAeA,GAAM,CAClBA,CAAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,eAAA,CACrC,cACJ,EACA,YAAA,CACEkM,CAAAA,GAAa,MAAA,CACTsB,EAAAA,CAAW,SAAA,CACXtB,CAAAA,GAAa,QACXsB,EAAAA,CAAW,YAAA,CACXA,EAAAA,CAAW,QAAA,CAGnB,QAAA,CAAApN,GAAAA,CAACqO,EAAA,CAAK,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,CAAA,CACzC,EACArO,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS0M,EACT,KAAA,CAAO3M,CAAAA,CAAYpB,CAAAA,CAAW,sBAAsB,CAAA,CAAG,CACrD,SAAU,UAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,yBAAA,CACP,eAAA,CAAiB,cACjB,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,wBACd,CAAC,CAAA,CACD,YAAA,CAAeiB,GAAM,CAClBA,CAAAA,CAAE,cAA8B,KAAA,CAAM,eAAA,CACrC,qBACJ,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,eAAA,CACrC,cACJ,CAAA,CACA,aAAYwN,EAAAA,CAAW,eAAA,CAEtB,QAAA,CAAAtB,CAAAA,GAAa,OAAA,CACV,CAAA,EAAGtB,EAAO,CAAC,CAAA,MAAA,EAAIA,EAAO,CAAC,CAAA,CAAA,CACvBsB,IAAa,QAAA,CACX,CAAA,EAAGtB,CAAI,CAAA,CAAA,CACPuC,EAAAA,CAAYvC,CAAAA,CAAMC,EAAOS,GAAM,CAAA,CACvC,CAAA,CACAlL,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAM,CACT8L,CAAAA,GAAa,MAAA,CAAQK,CAAAA,GAEvBR,CAAAA,CADOG,CAAAA,GAAa,OAAA,CAElB,IAAI,IAAA,CACFJ,CAAAA,CAAa,aAAY,CAAI,EAAA,CAC7BA,CAAAA,CAAa,QAAA,EACf,CAAA,CAIA,IAAI,IAAA,CACFA,CAAAA,CAAa,WAAA,EAAY,CAAI,CAAA,CAC7BA,CAAAA,CAAa,UACf,CANF,EAQJ,CAAA,CACA,KAAA,CAAO3L,CAAAA,CAAYpB,EAAW,gBAAgB,CAAA,CAAG,CAC/C,eAAA,CAAiB,aAAA,CACjB,OAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,wBAAA,CACZ,QAAA,CAAU,UACV,SAAA,CAAW,SAAA,CACX,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,eAAgB,QAClB,CAAC,CAAA,CACD,YAAA,CAAeiB,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAA8B,KAAA,CAAM,gBACrC,qBACJ,CAAA,CACA,aAAeA,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,eAAA,CACrC,cACJ,CAAA,CACA,YAAA,CACEkM,CAAAA,GAAa,MAAA,CACTsB,EAAAA,CAAW,SAAA,CACXtB,IAAa,OAAA,CACXsB,EAAAA,CAAW,YAAA,CACXA,EAAAA,CAAW,QAAA,CAGnB,QAAA,CAAApN,IAACqO,CAAAA,CAAA,CAAK,KAAK,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA,CAC1C,CAAA,CAAA,CACF,CAAA,CAECvC,CAAAA,GAAa,MAAA,EACZ9K,IAAAA,CAAAwN,SAAA,CAEE,QAAA,CAAA,CAAAxO,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOD,CAAAA,CAAYpB,EAAW,YAAY,CAAA,CAAG,CAC3C,OAAA,CAAS,MAAA,CACT,mBAAA,CAAqB,gBACvB,CAAC,CAAA,CAEA,QAAA,CAAAmO,EAAAA,CAAS,GAAA,CAAI,CAACpC,EAAK/B,CAAAA,GAClB3I,GAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,SAAA,CAAW,SACX,QAAA,CAAU,SAAA,CACV,UAAA,CAAY,GAAA,CACZ,OAAA,CAAS,UAAA,CACT,MACE2I,CAAAA,GAAU,CAAA,CACN,0BAAA,CACAA,CAAAA,GAAU,CAAA,CACR,sBAAA,CACA,yBACV,CAAA,CAEC,QAAA,CAAA+B,GAdI/B,CAeP,CACD,EACH,CAAA,CAGA3I,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOD,CAAAA,CAAYpB,CAAAA,CAAW,OAAO,CAAA,CAAG,CACtC,OAAA,CAAS,MAAA,CACT,mBAAA,CAAqB,gBACvB,CAAC,CAAA,CAEA,QAAA,CAAAqP,EAAAA,CAAa,GAAA,CAAI,CAAC3D,CAAAA,CAAM1B,IAAU,CACjC,GAAI,CAAC0B,CAAAA,CAAM,OAAOrK,IAAC,KAAA,CAAA,EAAA,CAAS2I,CAAO,CAAA,CAEnC,IAAM8F,CAAAA,CAAiBpE,CAAAA,CAAK,UAAS,GAAMI,CAAAA,CACrCxF,CAAAA,CAAaqI,EAAAA,CAAejD,CAAI,CAAA,CAChCqE,GAAanB,EAAAA,CAAelD,CAAI,CAAA,CAChCsE,EAAAA,CAAcnB,EAAAA,CAAQnD,CAAI,EAC1BuE,EAAAA,CAAWd,EAAAA,CAAazD,CAAI,CAAA,CAC5BzF,EAAAA,CACJgH,GACAvB,CAAAA,CAAK,WAAA,EAAY,GAAMuB,CAAAA,CAAY,WAAA,EAAY,EAC/CvB,EAAK,QAAA,EAAS,GAAMuB,CAAAA,CAAY,QAAA,EAAS,EACzCvB,CAAAA,CAAK,SAAQ,GAAMuB,CAAAA,CAAY,OAAA,EAAQ,CAEnCiD,EAAAA,CAAmC9O,CAAAA,CACvCpB,EAAW,YAAY,CAAA,CACvB,CACE,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,OACT,aAAA,CAAe,QAAA,CACf,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,OAAQ,SAAA,CACR,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,IACZ,UAAA,CAAY,WAAA,CACZ,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQsG,CAAAA,CAAa,cAAgB,SAAA,CACrC,OAAA,CAAS,OACT,eAAA,CAAiB,aAAA,CACjB,GAAI,CAACwJ,CAAAA,EAAkB,CAACC,EAAAA,CACpB,CAAE,OAAA,CAAS,EAAI,CAAA,CACf,EAAC,CACL,GAAIA,EAAAA,CACA,CACE,gBAAiB,sBAAA,CACjB,KAAA,CAAO,MACT,CAAA,CACA,EAAC,CACL,GAAIC,EAAAA,EAAe,CAACD,EAAAA,CAChB,CACE,SAAA,CACE,sCAAA,CACF,WAAY,GACd,CAAA,CACA,EAAC,CACL,GAAI9J,EAAAA,EAAa,CAAC8J,EAAAA,CACd,CACE,eAAA,CACE,2DACJ,CAAA,CACA,EACN,CACF,CAAA,CAEA,OACE1N,IAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,SACL,QAAA,CAAUiE,CAAAA,CACV,QAAS,IAAMgH,CAAAA,CAAiB5B,CAAI,CAAA,CACpC,YAAA,CAAc,IAAMwB,CAAAA,CAAexB,CAAI,CAAA,CACvC,aAAc,IAAMwB,CAAAA,CAAe,IAAI,CAAA,CACvC,KAAA,CAAOgD,EAAAA,CACP,aAAYxB,EAAAA,CAAoBhD,CAAAA,CAAMa,GAAM,CAAA,CAE5C,QAAA,CAAA,CAAAlL,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,EAAA,CACR,WAAY,CACd,CAAA,CAEC,QAAA,CAAAqK,CAAAA,CAAK,OAAA,EAAQ,CAChB,EACCuE,EAAAA,EACC5O,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,WACV,MAAA,CAAQ,KAAA,CACR,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,aAAc,QAAA,CACd,eAAA,CAAiB0O,GACb,MAAA,CACA,sBACN,EACF,CAAA,CAAA,CAAA,CA9BG/F,CAgCP,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CACF,EAGDmD,CAAAA,GAAa,QAAA,EACZ9L,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOD,CAAAA,CAAYpB,EAAW,OAAO,CAAA,CAAG,CACtC,OAAA,CAAS,MAAA,CACT,mBAAA,CAAqB,gBACvB,CAAC,CAAA,CAEA,SAAAwO,EAAAA,CAAY,GAAA,CAAI,CAAC2B,CAAAA,CAAWnG,CAAAA,GAAU,CACrC,IAAMoG,CAAAA,CAAyBtE,CAAAA,GAAU9B,EACnCqG,CAAAA,CAAiCjP,CAAAA,CACrCpB,CAAAA,CAAW,sBAAsB,CAAA,CACjC,CACE,OAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,UAAA,CACV,UAAA,CAAYoQ,EAAyB,GAAA,CAAM,GAAA,CAC3C,gBAAiBA,CAAAA,CACb,sBAAA,CACA,cACJ,KAAA,CAAOA,CAAAA,CACH,MAAA,CACA,yBAAA,CACJ,UAAA,CAAY,WACd,CACF,CAAA,CACA,OACE/O,GAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMsM,CAAAA,CAAkB3D,CAAK,CAAA,CACtC,YAAA,CAAe/I,EAAAA,EAAM,CACdmP,CAAAA,GAEDnP,EAAAA,CAAE,aAAA,CACF,KAAA,CAAM,eAAA,CAAkB,oBAAA,EAC9B,EACA,YAAA,CAAeA,EAAAA,EAAM,CACdmP,CAAAA,GAEDnP,EAAAA,CAAE,aAAA,CACF,MAAM,eAAA,CAAkB,aAAA,EAC9B,CAAA,CACA,KAAA,CAAOoP,CAAAA,CACP,YAAA,CAAY,GAAGF,CAAS,CAAA,CAAA,EAAItE,CAAI,CAAA,CAAA,CAE/B,QAAA,CAAAsE,CAAAA,CAAAA,CAlBInG,CAmBP,CAEJ,CAAC,EACH,CAAA,CAGDmD,CAAAA,GAAa,SACZ9L,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOD,CAAAA,CAAYpB,CAAAA,CAAW,OAAO,EAAG,CACtC,OAAA,CAAS,MAAA,CACT,mBAAA,CAAqB,gBACvB,CAAC,EAEA,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,EAAG,CAAA,CAAG,CAACuL,CAAAA,CAAG+D,CAAAA,GAAMzD,EAAO,CAAA,CAAIyD,CAAC,EAAE,GAAA,CACjDP,CAAAA,EAAM,CACL,IAAMuB,CAAAA,CAAgBzE,CAAAA,GAASkD,EACzBsB,CAAAA,CAAiCjP,CAAAA,CACrCpB,CAAAA,CAAW,sBAAsB,CAAA,CACjC,CACE,OAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,UAAA,CACV,UAAA,CAAYsQ,EAAgB,GAAA,CAAM,GAAA,CAClC,gBAAiBA,CAAAA,CACb,sBAAA,CACA,cACJ,KAAA,CAAOA,CAAAA,CACH,MAAA,CACA,yBAAA,CACJ,UAAA,CAAY,WACd,CACF,CAAA,CACA,OACEjP,GAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMwM,CAAAA,CAAiBkB,CAAC,CAAA,CACjC,YAAA,CAAe9N,CAAAA,EAAM,CACdqP,CAAAA,GAEDrP,CAAAA,CAAE,aAAA,CACF,KAAA,CAAM,eAAA,CAAkB,oBAAA,EAC9B,EACA,YAAA,CAAeA,CAAAA,EAAM,CACdqP,CAAAA,GAEDrP,CAAAA,CAAE,aAAA,CACF,MAAM,eAAA,CAAkB,aAAA,EAC9B,CAAA,CACA,KAAA,CAAOoP,CAAAA,CACP,YAAA,CAAY,OAAOtB,CAAC,CAAA,CAEnB,QAAA,CAAAA,CAAAA,CAAAA,CAlBIA,CAmBP,CAEJ,CACF,CAAA,CACF,CAAA,CAIF1N,IAAC,KAAA,CAAA,CACC,KAAA,CAAOD,EAAYpB,CAAAA,CAAW,WAAW,CAAA,CAAG,CAC1C,SAAA,CAAW,+BACb,CAAC,CAAA,CAED,QAAA,CAAAqB,GAAAA,CAACkP,GAAAA,CAAA,CACC,OAAA,CAAQ,UACR,IAAA,CAAK,IAAA,CACL,OAAA,CAAS,IAAM,CACb,IAAMC,EAAM,IAAI,IAAA,CAChBpD,EAAY,MAAM,CAAA,CAClBJ,EACE,IAAI,IAAA,CAAKwD,CAAAA,CAAI,WAAA,EAAY,CAAGA,CAAAA,CAAI,UAAU,CAC5C,CAAA,CACA/C,CAAAA,GACF,CAAA,CACA,IAAI,QAAA,CAEH,QAAA,CAAAa,EAAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,EACF,CAAA,CACF,CAEJ,CACF,EAEApC,EAAAA,CAAW,YAAc,YAAA,CCx1BzB,IAAMuE,EAAAA,CAAkBC,CAAAA,EAA0B,CAChD,GAAIA,CAAAA,GAAU,EAAG,OAAO,SAAA,CACxB,IAAMC,CAAAA,CAAI,IAAA,CACJC,CAAAA,CAAQ,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAI,CAAA,CAClCtB,CAAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAIoB,CAAK,CAAA,CAAI,IAAA,CAAK,IAAIC,CAAC,CAAC,CAAA,CAClD,OAAO,IAAA,CAAK,KAAA,CAAOD,EAAQ,IAAA,CAAK,GAAA,CAAIC,EAAGrB,CAAC,CAAA,CAAK,GAAG,CAAA,CAAI,GAAA,CAAM,GAAA,CAAMsB,CAAAA,CAAMtB,CAAC,CACzE,EAEMuB,EAAAA,CAAejN,CAAAA,EACfA,CAAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAU,QAClCA,CAAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAU,OAAA,CAClCA,CAAAA,CAAK,SAAS,KAAK,CAAA,EACnBA,CAAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAKA,EAAK,QAAA,CAAS,UAAU,CAAA,EACjDA,CAAAA,CAAK,QAAA,CAAS,OAAO,GAAKA,CAAAA,CAAK,QAAA,CAAS,aAAa,CAAA,CAAU,UAAA,CAC5D,MAAA,CAIHkN,GAAgE,CACpE,EAAA,CAAI9Q,CAAAA,CAAW,KAAK,CAAA,CACpB,EAAA,CAAIA,EAAW,KAAK,CAAA,CACpB,GAAIA,CAAAA,CAAW,KAAK,CACtB,CAAA,CAgCa+Q,EAAAA,CAASvQ,CAAAA,CAAM,UAAA,CAC1B,CACE,CACE,MAAAwQ,GAAAA,CAAQ,EAAC,CACT,QAAA,CAAA7E,CAAAA,CACA,QAAA,CAAA8E,EACA,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAvJ,CAAAA,CAAW,KAAA,CACX,QAAA,CAAAwJ,IAAW,IAAA,CACX,WAAA,CAAAjM,CAAAA,CAAc,2GAAA,CACd,IAAA,CAAAH,CAAAA,CAAO,KACP,GAAA,CAAKzE,CAAAA,CACL,KAAA,CAAAI,GAAAA,CACA,GAAGC,CACL,EACAC,CAAAA,GACG,CACH,IAAMwQ,CAAAA,CAAe/Q,CAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA,CAClD,CAACgR,EAAYC,CAAa,CAAA,CAAIjR,EAAM,QAAA,CAAS,KAAK,CAAA,CAClD,CAACkR,CAAAA,CAAiBC,CAAkB,EAAInR,CAAAA,CAAM,QAAA,CAClD,IACF,CAAA,CAEMoR,CAAAA,CAAoBC,CAAAA,EAAmC,CAC3D,GAAI,CAACA,CAAAA,EAAiBA,CAAAA,CAAc,MAAA,GAAW,CAAA,CAAG,OAElD,IAAMC,CAAAA,CAAY,MAAM,IAAA,CAAKD,CAAa,EAG1C,GAAIR,CAAAA,EAAYL,GAAAA,CAAM,MAAA,CAASc,CAAAA,CAAU,MAAA,CAAST,EAAU,CAC1D,KAAA,CAAM,CAAA,aAAA,EAAMA,CAAQ,CAAA,yFAAA,CAAqB,CAAA,CACzC,MACF,CAGA,IAAMU,CAAAA,CAAaD,CAAAA,CAAU,MAAA,CAAQE,CAAAA,EAC/BZ,GAAWY,CAAAA,CAAK,IAAA,CAAOZ,GACzB,KAAA,CACE,CAAA,gCAAA,EAAUX,GAAeW,CAAO,CAAC,CAAA,2DAAA,EAAiBY,CAAAA,CAAK,IAAI,CAAA,CAC7D,EACO,KAAA,EAEF,IACR,CAAA,CAEGD,CAAAA,CAAW,MAAA,CAAS,CAAA,GACtB5F,GAAA,IAAA,EAAAA,CAAAA,CAAW4F,CAAAA,CAAAA,EAEf,CAAA,CAEME,CAAAA,CAAc,IAAM,CA/K9B,IAAAxM,CAAAA,CAgLWqC,CAAAA,EAAAA,CACHrC,CAAAA,CAAA8L,CAAAA,CAAa,OAAA,GAAb,MAAA9L,CAAAA,CAAsB,KAAA,GAE1B,CAAA,CAEMyM,CAAAA,CAAkBjR,CAAAA,EAAuB,CAC7CA,EAAE,cAAA,EAAe,CACb,CAAC6G,CAAAA,EAAYwJ,GAAAA,EACfG,CAAAA,CAAc,IAAI,EAEtB,CAAA,CAEMU,CAAAA,CAAmBlR,CAAAA,EAAuB,CAC9CA,CAAAA,CAAE,gBAAe,CACjBwQ,CAAAA,CAAc,KAAK,EACrB,CAAA,CAEMW,EAAcnR,CAAAA,EAAuB,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjBwQ,CAAAA,CAAc,KAAK,CAAA,CACf,CAAC3J,CAAAA,EAAYwJ,GAAAA,EACfM,CAAAA,CAAiB3Q,CAAAA,CAAE,aAAa,KAAK,EAEzC,CAAA,CAEMoR,CAAAA,CAAgBL,CAAAA,EAAuB,CAC3Cf,GAAA,IAAA,EAAAA,CAAAA,CAAWe,GACb,CAAA,CAGMM,CAAAA,CAAiBnR,QACrB,IAAMC,CAAAA,CAAY,CAAE,KAAA,CAAO,MAAO,CAAA,CAAGpB,EAAWS,CAAO,CAAA,CAAGI,GAAK,CAAA,CAC/D,CAACJ,CAAAA,CAASI,GAAK,CACjB,CAAA,CAGM0R,CAAAA,CAAgBpR,OAAAA,CACpB,KAA4B,CAC1B,SAAU,UAAA,CACV,MAAA,CAAQ,cAAcqQ,CAAAA,CAAa,oCAAA,CAAuC,+BAA+B,CAAA,CAAA,CACzG,YAAA,CAAc,MAAA,CACd,UAAA,CAAY,uBAAA,CACZ,MAAA,CAAQ1J,EAAW,aAAA,CAAgB,SAAA,CACnC,eAAA,CAAiB0J,CAAAA,CACb,gCAAA,CACA,2BAAA,CACJ,QAAS1J,CAAAA,CAAW,EAAA,CAAM,CAAA,CAC1B,GAAGgJ,EAAAA,CAAa5L,CAAI,CACtB,CAAA,CAAA,CACA,CAACsM,CAAAA,CAAY1J,CAAAA,CAAU5C,CAAI,CAC7B,EAGMsN,CAAAA,CAAkC,CACtC,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,WAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,SAAA,CAAW,QACb,CAAA,CAGMC,EAAgBtR,OAAAA,CACpB,KAA4B,CAC1B,YAAA,CAAc,KAAA,CACd,eAAA,CAAiBqQ,EACb,iCAAA,CACA,4BAAA,CACJ,GAAGxR,CAAAA,CAAW,KAAK,EACnB,GAAGA,CAAAA,CAAW,MAAM,CAAA,CACpB,UAAA,CAAY,oCACd,GACA,CAACwR,CAAU,CACb,CAAA,CAGMkB,CAAAA,CAAwC,CAC5C,SAAU,UAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,yBAAA,CACP,GAAG1S,EAAW,MAAM,CACtB,EAGM2S,CAAAA,CAAqC,CACzC,SAAU,SAAA,CACV,KAAA,CAAO,+BACT,CAAA,CAGMC,CAAAA,CAAqC,CACzC,GAAG5S,CAAAA,CAAW,MAAM,CAAA,CACpB,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,SACf,GAAGA,CAAAA,CAAW,OAAO,CACvB,CAAA,CAEA,OACEqC,KAAC,KAAA,CAAA,CAAI,GAAA,CAAKtB,EAAK,KAAA,CAAOuR,CAAAA,CAAiB,GAAGxR,CAAAA,CAExC,QAAA,CAAA,CAAAuB,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAS4P,CAAAA,CACT,WAAYC,CAAAA,CACZ,WAAA,CAAaC,CAAAA,CACb,MAAA,CAAQC,CAAAA,CACR,eAAA,CAAeZ,EAAa,MAAA,CAAS,MAAA,CACrC,eAAA,CAAe1J,CAAAA,CAAW,MAAA,CAAS,MAAA,CACnC,uBAAqB,MAAA,CACrB,KAAA,CAAOyK,CAAAA,CAEP,QAAA,CAAA,CAAAlR,GAAAA,CAAC,OAAA,CAAA,CACC,IAAKkQ,CAAAA,CACL,IAAA,CAAK,MAAA,CACL,QAAA,CAAUL,CAAAA,CACV,MAAA,CAAQC,EACR,QAAA,CAAUrJ,CAAAA,CACV,QAAA,CAAW7G,CAAAA,EAAM2Q,CAAAA,CAAiB3Q,CAAAA,CAAE,OAAO,KAAK,CAAA,CAChD,KAAA,CAAO,CAAE,OAAA,CAAS,MAAO,EACzB,YAAA,CAAW,2BAAA,CACb,EAEAoB,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAOmQ,CAAAA,CACV,QAAA,CAAA,CAAAnR,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOoR,CAAAA,CACV,SAAApR,GAAAA,CAACqO,CAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,IAAA,CAAM,GACN,OAAA,CAAQ,SAAA,CACR,GAAA,CAAK8B,CAAAA,CAAa,6BAAA,CAAgC,MAAA,CACpD,EACF,CAAA,CACAnQ,GAAAA,CAAC,GAAA,CAAA,CAAE,KAAA,CAAOqR,CAAAA,CAAmB,QAAA,CAAArN,EAAY,CAAA,CACzChD,IAAAA,CAAC,GAAA,CAAA,CAAE,KAAA,CAAOsQ,CAAAA,CACP,QAAA,CAAA,CAAAxB,GAAU,CAAA,2BAAA,EAAUA,CAAM,CAAA,CAAA,CAC1BC,CAAAA,EAAW,CAAA,mCAAA,EAAaX,EAAAA,CAAeW,CAAO,CAAC,CAAA,CAAA,CAC/CC,CAAAA,EAAY,CAAA,qBAAA,EAASA,CAAQ,CAAA,MAAA,CAAA,CAAA,CAChC,GACF,CAAA,CAAA,CACF,CAAA,CAGCL,IAAM,MAAA,CAAS,CAAA,EACd3P,IAAC,KAAA,CAAA,CAAI,KAAA,CAAOuR,CAAAA,CACT,QAAA,CAAA5B,GAAAA,CAAM,GAAA,CAAKgB,GAAS,CACnB,IAAMa,CAAAA,CAAUb,CAAAA,CAAK,MAAA,GAAW,OAAA,CAC1Bc,EAAoC,CACxC,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAG9S,EAAW,OAAO,CAAA,CACrB,GAAGA,CAAAA,CAAW,KAAK,CAAA,CACnB,aAAc,KAAA,CACd,MAAA,CAAQ,CAAA,UAAA,EAAa6S,CAAAA,CAAU,iCAAA,CAAoC,2BAA2B,GAC9F,eAAA,CAAiBA,CAAAA,CACb,6BAAA,CACA,uBACN,CAAA,CAEME,CAAAA,CAAyC,CAC7C,UAAA,CAAY,CAAA,CACZ,YAAA,CAAc,KAAA,CACd,eAAA,CAAiB,4BAAA,CACjB,GAAG/S,CAAAA,CAAW,KAAK,CACrB,CAAA,CAEMgT,CAAAA,CAAqC,CACzC,IAAA,CAAM,CAAA,CACN,QAAA,CAAU,CACZ,CAAA,CAEMC,CAAAA,CAAqC,CACzC,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,yBAAA,CACP,SAAU,QAAA,CACV,YAAA,CAAc,UAAA,CACd,UAAA,CAAY,QACd,CAAA,CAEMC,EAAgC,CACpC,OAAA,CAAS,OACT,UAAA,CAAY,QAAA,CACZ,GAAGlT,CAAAA,CAAW,OAAO,CAAA,CACrB,GAAGA,CAAAA,CAAW,MAAM,CACtB,CAAA,CAEMmT,EAAAA,CAAqC,CACzC,QAAA,CAAU,SAAA,CACV,KAAA,CAAO,+BACT,CAAA,CAEMC,EAAAA,CAAyC,CAC7C,UAAA,CAAY,CAAA,CACZ,YAAA,CAAc,MACd,GAAGpT,CAAAA,CAAW,OAAO,CAAA,CACrB,MAAA,CAAQ,OACR,MAAA,CAAQ,SAAA,CACR,eAAA,CACE0R,CAAAA,GAAoBM,CAAAA,CAAK,EAAA,CACrB,gCACA,aAAA,CACN,UAAA,CAAY,oCACd,CAAA,CAEA,OACE3P,IAAAA,CAAC,OAAkB,KAAA,CAAOyQ,CAAAA,CACxB,QAAA,CAAA,CAAAzR,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO0R,EACV,QAAA,CAAA1R,GAAAA,CAACqO,CAAAA,CAAA,CACC,IAAA,CAAMmB,EAAAA,CAAYmB,EAAK,IAAI,CAAA,CAC3B,IAAA,CAAM,EAAA,CACN,OAAA,CAAQ,OAAA,CACV,EACF,CAAA,CAEA3P,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO2Q,CAAAA,CACV,QAAA,CAAA,CAAA3R,IAAC,GAAA,CAAA,CAAE,KAAA,CAAO4R,CAAAA,CAAgB,QAAA,CAAAjB,CAAAA,CAAK,IAAA,CAAK,EACpC3P,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO6Q,CAAAA,CACV,QAAA,CAAA,CAAA7R,IAAC,GAAA,CAAA,CAAE,KAAA,CAAO8R,EAAAA,CAAgB,QAAA,CAAA1C,EAAAA,CAAeuB,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CACnDA,CAAAA,CAAK,MAAA,GAAW,WAAA,EACfA,CAAAA,CAAK,WAAa,MAAA,EAChB3P,IAAAA,CAAAwN,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAxO,GAAAA,CAAC,OACC,KAAA,CAAO,CACL,KAAM,CAAA,CACN,MAAA,CAAQ,MACR,eAAA,CAAiB,oBAAA,CACjB,YAAA,CAAc,QAAA,CACd,QAAA,CAAU,QACZ,EAEA,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAA,CAAQ,OACR,eAAA,CAAiB,sBAAA,CACjB,YAAA,CAAc,QAAA,CACd,KAAA,CAAO,CAAA,EAAG2Q,EAAK,QAAQ,CAAA,CAAA,CAAA,CACvB,WAAY,sBACd,CAAA,CACF,EACF,CAAA,CACA3P,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO8Q,EAAAA,CAAgB,QAAA,CAAA,CAAAnB,EAAK,QAAA,CAAS,GAAA,CAAA,CAAC,CAAA,CAAA,CAC9C,CAAA,CAEHA,CAAAA,CAAK,MAAA,GAAW,WACf3P,IAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,SAAA,CACV,MAAO,yBAAA,CACP,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAGrC,EAAW,OAAO,CACvB,CAAA,CAEA,QAAA,CAAA,CAAAqB,GAAAA,CAACqO,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,OAAA,CAAQ,SAAA,CAAU,EAAE,cAAA,CAAA,CAEnD,CAAA,CAEDsC,CAAAA,CAAK,MAAA,GAAW,OAAA,EACf3Q,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,SAAU,SAAA,CACV,KAAA,CAAO,0BACT,CAAA,CAEC,QAAA,CAAA2Q,CAAAA,CAAK,KAAA,EAAS,iCAAA,CACjB,CAAA,CAAA,CAEJ,GACF,CAAA,CAECf,CAAAA,EACC5P,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMgR,CAAAA,CAAaL,CAAI,CAAA,CAChC,YAAA,CAAc,IAAML,EAAmBK,CAAAA,CAAK,EAAE,EAC9C,YAAA,CAAc,IAAML,EAAmB,IAAI,CAAA,CAC3C,KAAA,CAAOyB,EAAAA,CACP,YAAA,CAAW,2BAAA,CAEX,SAAA/R,GAAAA,CAACqO,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAM,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAC/C,CAAA,CAAA,CAAA,CA3EMsC,CAAAA,CAAK,EA6Ef,CAEJ,CAAC,CAAA,CACH,GAEJ,CAEJ,CACF,EAEAjB,EAAAA,CAAO,WAAA,CAAc,QAAA,CC/YrB,IAAMsC,GAAc,CAClB,EAAA,CAAI,aAAA,CACJ,EAAA,CAAI,cAAA,CACJ,EAAA,CAAI,gBACN,CAAA,CAoCaC,EAAAA,CAAe9S,CAAAA,CAAM,UAAA,CAChC,CACE,CACE,QAAA+S,GAAAA,CACA,KAAA,CAAA5P,CAAAA,CACA,QAAA,CAAAwI,CAAAA,CACA,WAAA,CAAA9G,EAAc,+DAAA,CACd,QAAA,CAAAyC,CAAAA,CAAW,KAAA,CACX,KAAA,CAAAvG,CAAAA,CAAQ,MACR,OAAA,CAAAiS,CAAAA,CAAU,KAAA,CACV,SAAA,CAAAC,CAAAA,CAAY,GAAA,CACZ,UAAAC,GAAAA,CAAY,IAAA,CACZ,WAAAC,CAAAA,CAAa,IAAA,CACb,SAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,6CAAA,CACZ,IAAA,CAAA3O,GAAAA,CAAO,KACP,GAAA,CAAKzE,CAAAA,CACL,KAAA,CAAAI,CAAAA,CACA,GAAGC,CACL,EACAC,CAAAA,GACG,CACH,GAAM,CAAC8L,CAAAA,CAAQC,CAAS,EAAItM,CAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAC1C,CAACsT,CAAAA,CAAYC,CAAa,CAAA,CAAIvT,CAAAA,CAAM,QAAA,CAAS,EAAE,CAAA,CAC/C,CAACwT,EAAiBC,CAAkB,CAAA,CACxCzT,CAAAA,CAAM,QAAA,CAA+B+S,GAAO,CAAA,CACxC,CAACW,CAAAA,CAAeC,CAAgB,CAAA,CAAI3T,CAAAA,CAAM,QAAA,CAAS,EAAE,EACrD,CAAC4T,CAAAA,CAAaC,CAAc,CAAA,CAAI7T,CAAAA,CAAM,SAAS,KAAK,CAAA,CAEpD8T,CAAAA,CAAW9T,CAAAA,CAAM,MAAA,CAAyB,IAAI,EAC9C+T,CAAAA,CAAc/T,CAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA,CAE/CgU,CAAAA,CAAiBhU,EAAM,OAAA,CAAQ,IAC5B+S,GAAAA,CAAQ,IAAA,CAAMkB,CAAAA,EAAQA,CAAAA,CAAI,QAAU9Q,CAAK,CAAA,CAC/C,CAAC4P,GAAAA,CAAS5P,CAAK,CAAC,EAGnBnD,CAAAA,CAAM,SAAA,CAAU,IAAM,CAChBgU,CAAAA,CACFT,CAAAA,CAAcS,EAAe,KAAK,CAAA,CACxB7Q,CAAAA,EACVoQ,CAAAA,CAAc,EAAE,EAEpB,EAAG,CAACS,CAAAA,CAAgB7Q,CAAK,CAAC,CAAA,CAG1BnD,CAAAA,CAAM,UAAU,IAAM,CACpB,GAAIoT,CAAAA,CAAU,CACZS,EAAe,IAAI,CAAA,CACnB,IAAMK,CAAAA,CAASd,CAAAA,CAASE,CAAU,EAC9BY,CAAAA,YAAkB,OAAA,CACpBA,CAAAA,CAAO,IAAA,CAAMC,CAAAA,EAAa,CACxBV,EAAmBU,CAAQ,CAAA,CAC3BN,CAAAA,CAAe,KAAK,EACtB,CAAC,GAEDJ,CAAAA,CAAmBS,CAAM,EACzBL,CAAAA,CAAe,KAAK,GAExB,CAAA,KAAA,GAAWV,CAAAA,CACT,GAAI,CAACG,CAAAA,CAAW,IAAA,GACdG,CAAAA,CAAmBV,GAAO,CAAA,CAAA,KACrB,CACL,IAAMoB,CAAAA,CAAWpB,IAAQ,MAAA,CACtBqB,CAAAA,EAAQ,CA3KrB,IAAAnP,CAAAA,CA4Kc,OAAAmP,EAAO,KAAA,CAAM,WAAA,GAAc,QAAA,CAASd,CAAAA,CAAW,aAAa,CAAA,EAC5Dc,CAAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,SAASd,CAAAA,CAAW,WAAA,EAAa,CAAA,GAAA,CAC5DrO,CAAAA,CAAAmP,CAAAA,CAAO,cAAP,IAAA,CAAA,MAAA,CAAAnP,CAAAA,CACI,WAAA,EAAA,CACD,QAAA,CAASqO,CAAAA,CAAW,WAAA,KAC3B,CAAA,CACAG,CAAAA,CAAmBU,CAAQ,EAC7B,CAAA,KAEAV,CAAAA,CAAmBV,GAAO,EAE9B,CAAA,CAAG,CAACO,CAAAA,CAAYP,GAAAA,CAASI,CAAAA,CAAYC,CAAQ,CAAC,CAAA,CAE9C,IAAMiB,CAAAA,CAAqB5T,CAAAA,EAA2C,CACpE,IAAM8I,CAAAA,CAAW9I,CAAAA,CAAE,MAAA,CAAO,KAAA,CAC1B8S,CAAAA,CAAchK,CAAQ,EACtB+C,CAAAA,CAAU,IAAI,EACdqH,CAAAA,CAAiB,EAAE,EAEf,CAACpK,CAAAA,EAAY2J,GAAAA,GACfvH,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAW,KAEf,CAAA,CAEM2I,CAAAA,CAAmB,IAAM,CAC7BhI,CAAAA,CAAU,IAAI,EAChB,CAAA,CAEMiI,CAAAA,CAAmB9T,CAAAA,EAAwB,CAxMrD,IAAAwE,CAAAA,CAAAA,CA0MUA,EAAA8O,CAAAA,CAAY,OAAA,GAAZ,MAAA9O,CAAAA,CAAqB,QAAA,CAASxE,EAAE,aAAA,CAAA,GAGpC6L,CAAAA,CAAU,KAAK,CAAA,CACfqH,CAAAA,CAAiB,EAAE,EAGfK,CAAAA,EACFT,CAAAA,CAAcS,CAAAA,CAAe,KAAK,CAAA,EAEtC,CAAA,CAEMQ,EAAsBJ,CAAAA,EAA+B,CAtN/D,IAAAnP,CAAAA,CAuNMsO,CAAAA,CAAca,CAAAA,CAAO,KAAK,CAAA,CAC1BzI,CAAAA,EAAA,MAAAA,CAAAA,CAAWyI,CAAAA,CAAO,MAAOA,CAAAA,CAAAA,CACzB9H,CAAAA,CAAU,KAAK,CAAA,CAAA,CACfrH,CAAAA,CAAA6O,CAAAA,CAAS,UAAT,IAAA,EAAA7O,CAAAA,CAAkB,IAAA,GACpB,CAAA,CAEMwP,CAAAA,CAAc,IAAM,CA7N9B,IAAAxP,CAAAA,CA8NMsO,CAAAA,CAAc,EAAE,CAAA,CAChB5H,CAAAA,EAAA,MAAAA,CAAAA,CAAW,EAAA,CAAA,CAAA,CACX1G,CAAAA,CAAA6O,CAAAA,CAAS,OAAA,GAAT,IAAA,EAAA7O,EAAkB,KAAA,GACpB,CAAA,CAEMyP,CAAAA,CAAiBjU,CAAAA,EAA6C,CAnOxE,IAAAwE,EAoOM,GAAI,CAACoH,CAAAA,EAAUmH,CAAAA,CAAgB,MAAA,GAAW,CAAA,CAAG,CACvC/S,CAAAA,CAAE,GAAA,GAAQ,WAAA,EACZ6L,CAAAA,CAAU,IAAI,CAAA,CAEhB,MACF,CAEA,OAAQ7L,EAAE,GAAA,EACR,KAAK,WAAA,CACHA,CAAAA,CAAE,cAAA,EAAe,CACjBkT,CAAAA,CAAkB3P,CAAAA,EAChBA,EAAOwP,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAAIxP,CAAAA,CAAO,CAAA,CAAIA,CACjD,EACA,MACF,KAAK,SAAA,CACHvD,CAAAA,CAAE,cAAA,EAAe,CACjBkT,EAAkB3P,CAAAA,EAAUA,CAAAA,CAAO,EAAIA,CAAAA,CAAO,CAAA,CAAI,EAAG,CAAA,CACrD,MACF,KAAK,OAAA,CACHvD,CAAAA,CAAE,cAAA,GACEiT,CAAAA,EAAiB,CAAA,EAAKF,CAAAA,CAAgBE,CAAa,CAAA,EACrDc,CAAAA,CAAmBhB,EAAgBE,CAAa,CAAC,CAAA,CAEnD,MACF,KAAK,QAAA,CACHpH,EAAU,KAAK,CAAA,CAAA,CACfrH,EAAA6O,CAAAA,CAAS,OAAA,GAAT,MAAA7O,CAAAA,CAAkB,IAAA,EAAA,CAClB,KACJ,CACF,CAAA,CAEA,OACEpD,KAAC,KAAA,CAAA,CACC,GAAA,CAAKtB,CAAAA,CACL,KAAA,CAAOK,CAAAA,CACLpB,CAAAA,CAAW,iBAAiB,CAAA,CAC5BA,CAAAA,CAAWS,CAAO,CAAA,CAClBI,CACF,CAAA,CACC,GAAGC,CAAAA,CAEJ,QAAA,CAAA,CAAAuB,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOrC,CAAAA,CAAW,UAAU,CAAA,CAC/B,QAAA,CAAA,CAAAqB,GAAAA,CAAC8T,CAAAA,CAAA,CACC,GAAA,CAAKb,EACL,IAAA,CAAK,MAAA,CACL,KAAA,CAAOR,CAAAA,CACP,QAAA,CAAUe,CAAAA,CACV,QAASC,CAAAA,CACT,MAAA,CAAQC,CAAAA,CACR,SAAA,CAAWG,CAAAA,CACX,WAAA,CAAa7P,EACb,QAAA,CAAUyC,CAAAA,CACV,eAAcvG,CAAAA,CACd,mBAAA,CAAkB,OAClB,eAAA,CAAesL,CAAAA,CACf,eAAA,CAAc,mBAAA,CACd,GAAA,CAAK,CAAA,EAAGwG,GAAYnO,GAAI,CAAC,CAAA,MAAA,CAAA,CAC3B,CAAA,CAEA7D,GAAAA,CAAC,KAAA,CAAA,CACC,MAAOD,CAAAA,CAAYpB,CAAAA,CAAW,gBAAgB,CAAA,CAAG,CAC/C,KAAA,CAAO,UACP,GAAA,CAAK,KAAA,CACL,SAAA,CAAW,kBAAA,CACX,OAAA,CAAS,MAAA,CACT,WAAY,QACd,CAAC,CAAA,CAEA,QAAA,CAAAwT,CAAAA,EAAWY,CAAAA,CACV/S,IAACqO,CAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,GAAA,CAAI,4CAAA,CACN,EACEgE,GAAAA,EAAaI,CAAAA,CACfzS,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS4T,CAAAA,CACT,KAAA,CAAOjV,EAAW,aAAa,CAAA,CAC/B,aAAeiB,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,eAAA,CACrC,qBACJ,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAA8B,MAAM,eAAA,CAAkB,GAC3D,CAAA,CACA,YAAA,CAAW,oBAAA,CAEX,QAAA,CAAAI,IAACqO,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,+BAAA,CAAgC,EACzD,CAAA,CAEArO,GAAAA,CAACqO,CAAAA,CAAA,CAAK,IAAA,CAAK,aAAA,CAAc,IAAI,+BAAA,CAAgC,CAAA,CAEjE,CAAA,CAAA,CACF,CAAA,CAGC7C,CAAAA,EACCxL,GAAAA,CAAC,OACC,GAAA,CAAKkT,CAAAA,CACL,EAAA,CAAG,mBAAA,CACH,IAAA,CAAK,SAAA,CACL,MAAOnT,CAAAA,CACLpB,CAAAA,CACE,6DACF,CAAA,CACA,CACE,gBAAiB,sBAAA,CACjB,KAAA,CAAO,iCAAA,CACP,WAAA,CAAa,qBAAA,CACb,SAAA,CACE,mEACF,SAAA,CAAW,CAAA,EAAGyT,CAAS,CAAA,EAAA,CACzB,CACF,CAAA,CAEA,SAAApS,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,SAAA,CAAW,MAAA,CAAQ,UAAW,CAAA,EAAGoS,CAAS,IAAK,CAAA,CAC1D,QAAA,CAAAO,EAAgB,MAAA,GAAW,CAAA,CAC1B3S,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOD,CAAAA,CACLpB,EAAW,+BAA+B,CAAA,CAC1C,CAAE,KAAA,CAAO,+BAAgC,CAC3C,EAEC,QAAA,CAAA6T,CAAAA,CACH,CAAA,CAEAG,CAAAA,CAAgB,GAAA,CAAI,CAACY,EAAQ5K,CAAAA,GAAU,CACrC,IAAM+F,CAAAA,CAAamE,CAAAA,GAAkBlK,EAC/BoL,CAAAA,CAAkBzR,CAAAA,GAAUiR,CAAAA,CAAO,KAAA,CAEzC,OACEvT,GAAAA,CAAC,OAEC,IAAA,CAAK,QAAA,CACL,eAAA,CAAe+T,CAAAA,CACf,OAAA,CAAS,IAAMJ,EAAmBJ,CAAM,CAAA,CACxC,YAAA,CAAc,IAAMT,CAAAA,CAAiBnK,CAAK,EAC1C,KAAA,CAAO5I,CAAAA,CACLpB,CAAAA,CAAW,0BAA0B,CAAA,CACrC+P,CAAAA,CACI,CACE,eAAA,CACE,2DACJ,CAAA,CACA,MAAA,CACJqF,CAAAA,CACI,CACE,gBACE,2DACJ,CAAA,CACA,MACN,CAAA,CAEA,QAAA,CAAA/S,IAAAA,CAAC,OAAI,KAAA,CAAOrC,CAAAA,CAAW,yBAAyB,CAAA,CAC7C,QAAA,CAAA,CAAA4U,CAAAA,CAAO,MACNvT,GAAAA,CAAC,KAAA,CAAA,CACC,MAAOD,CAAAA,CAAYpB,CAAAA,CAAW,eAAe,CAAA,CAAG,CAC9C,KAAA,CAAO,+BACT,CAAC,CAAA,CAEA,SAAA4U,CAAAA,CAAO,IAAA,CACV,CAAA,CAEFvS,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOrC,EAAW,gBAAgB,CAAA,CACrC,QAAA,CAAA,CAAAqC,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOrC,EAAW,yBAAyB,CAAA,CAC9C,UAAAqB,GAAAA,CAAC,GAAA,CAAA,CACC,MAAOD,CAAAA,CACLpB,CAAAA,CAAW,qBAAqB,CAAA,CAChC,CAAE,KAAA,CAAO,yBAA0B,CACrC,CAAA,CAEC,QAAA,CAAA4U,CAAAA,CAAO,KAAA,CACV,CAAA,CACCQ,GACC/T,GAAAA,CAACqO,CAAAA,CAAA,CACC,IAAA,CAAK,OAAA,CACL,GAAA,CAAI,qCACN,CAAA,CAAA,CAEJ,CAAA,CACCkF,EAAO,WAAA,EACNvT,GAAAA,CAAC,KACC,KAAA,CAAOD,CAAAA,CAAYpB,CAAAA,CAAW,gBAAgB,CAAA,CAAG,CAC/C,MAAO,+BACT,CAAC,CAAA,CAEA,QAAA,CAAA4U,CAAAA,CAAO,WAAA,CACV,GAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CA1DKA,CAAAA,CAAO,KA2Dd,CAEJ,CAAC,EAEL,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAtB,EAAAA,CAAa,YAAc,cAAA,CC7Y3B,IAAM+B,EAAAA,CAAmB,CACvB,KAAM,CACJ,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,IAAK,CACH,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,MAAA,CAAQ,CACN,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,KAAA,CAAO,CACL,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,MAAA,CAAQ,CACN,UACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,IAAA,CAAM,CACJ,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SACF,CAAA,CACA,KAAA,CAAO,CACL,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SACF,CAAA,CACA,OAAA,CAAS,CACP,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,IAAA,CAAM,CACJ,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,IAAA,CAAM,CACJ,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,EACA,GAAA,CAAK,CACH,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,KAAM,CACJ,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CACA,MAAA,CAAQ,CACN,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SA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","file":"form.mjs","sourcesContent":["\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\n\n// ---------------------------------------------------------------------------\n// Base style constants\n// ---------------------------------------------------------------------------\n\nconst FORM_BASE: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n ...resolveDot(\"gap-6\"),\n};\n\nconst FORM_GLASS: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n ...resolveDot(\"gap-6 rounded-xl p-6\"),\n ...createGlassStyle(\"light\"),\n backgroundColor: \"var(--form-glass-bg)\",\n border: \"1px solid var(--form-glass-border)\",\n boxShadow: \"var(--form-glass-shadow)\",\n};\n\nconst FORM_FIELD_BASE: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n ...resolveDot(\"gap-2\"),\n};\n\nconst FORM_GROUP_STACK: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n ...resolveDot(\"gap-4\"),\n};\n\nconst FORM_GROUP_INLINE: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n ...resolveDot(\"gap-4\"),\n};\n\nconst FORM_ERROR: React.CSSProperties = {\n fontSize: \"0.875rem\",\n lineHeight: \"1.25rem\",\n color: \"var(--form-error-text)\",\n};\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\n/**\n * Form component props\n */\nexport interface FormProps extends Omit<\n React.FormHTMLAttributes<HTMLFormElement>,\n \"className\"\n> {\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n variant?: \"default\" | \"glass\";\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * FormField component props\n */\nexport interface FormFieldProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n error?: string;\n required?: boolean;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * FormGroup component props\n */\nexport interface FormGroupProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n inline?: boolean;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n// ---------------------------------------------------------------------------\n// Form\n// ---------------------------------------------------------------------------\n\n/**\n * Form container component.\n * Used with FormField and FormGroup to create structured forms.\n *\n * @example\n * <Form onSubmit={(e) => { e.preventDefault(); console.log('submit') }}>\n * <FormField>\n * <Label>Name</Label>\n * <Input />\n * </FormField>\n * </Form>\n *\n * @example\n * // Glass variant\n * <Form variant=\"glass\" onSubmit={handleSubmit}>\n * <FormGroup>\n * <FormField>\n * <Label>Email</Label>\n * <Input type=\"email\" />\n * </FormField>\n * </FormGroup>\n * </Form>\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n (\n { dot: dotProp, children, onSubmit, variant = \"default\", style, ...props },\n ref,\n ) => {\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n onSubmit?.(e);\n };\n\n const computedStyle = useMemo(() => {\n const base = variant === \"glass\" ? FORM_GLASS : FORM_BASE;\n return mergeStyles(base, resolveDot(dotProp), style);\n }, [variant, dotProp, style]);\n\n return (\n <form ref={ref} onSubmit={handleSubmit} style={computedStyle} {...props}>\n {children}\n </form>\n );\n },\n);\nForm.displayName = \"Form\";\n\n// ---------------------------------------------------------------------------\n// FormField\n// ---------------------------------------------------------------------------\n\n/**\n * Container that wraps a form field.\n * Displays error messages and supports required field indication.\n *\n * @example\n * <FormField error=\"This field is required\" required>\n * <Label>Name</Label>\n * <Input />\n * </FormField>\n */\nconst FormField = React.forwardRef<HTMLDivElement, FormFieldProps>(\n ({ dot: dotProp, children, error, required, style, ...props }, ref) => {\n const errorId = React.useId();\n\n // Connect aria-describedby and aria-invalid to child form elements\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n const childType = child.type;\n\n // Check for hua-ui Input, Select, Textarea components\n let isFormComponent = false;\n if (typeof childType === \"object\" && childType !== null) {\n const typeObj = childType as Record<string, unknown>;\n const displayName = typeObj.displayName as string | undefined;\n const name = typeObj.name as string | undefined;\n isFormComponent =\n displayName === \"Input\" ||\n displayName === \"Select\" ||\n displayName === \"Textarea\" ||\n name === \"Input\" ||\n name === \"Select\" ||\n name === \"Textarea\";\n }\n\n // Check for native HTML elements\n const isNativeFormElement =\n typeof childType === \"string\" &&\n [\"input\", \"select\", \"textarea\"].includes(childType.toLowerCase());\n\n if (isFormComponent || isNativeFormElement) {\n const existingAriaDescribedBy = childProps[\"aria-describedby\"] as\n | string\n | undefined;\n const ariaDescribedBy = error\n ? existingAriaDescribedBy\n ? `${existingAriaDescribedBy} ${errorId}`\n : errorId\n : existingAriaDescribedBy;\n\n return React.cloneElement(child, {\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": error ? true : childProps[\"aria-invalid\"],\n required: required || childProps.required,\n } as Record<string, unknown>);\n }\n }\n return child;\n });\n\n const computedStyle = useMemo(() => {\n return mergeStyles(FORM_FIELD_BASE, resolveDot(dotProp), style);\n }, [dotProp, style]);\n\n return (\n <div ref={ref} style={computedStyle} {...props}>\n {enhancedChildren}\n {error && (\n <p id={errorId} style={FORM_ERROR} role=\"alert\" aria-live=\"polite\">\n {error}\n </p>\n )}\n </div>\n );\n },\n);\nFormField.displayName = \"FormField\";\n\n// ---------------------------------------------------------------------------\n// FormGroup\n// ---------------------------------------------------------------------------\n\n/**\n * Container that groups multiple form fields.\n *\n * @example\n * <FormGroup inline>\n * <FormField>\n * <Label>First Name</Label>\n * <Input />\n * </FormField>\n * <FormField>\n * <Label>Last Name</Label>\n * <Input />\n * </FormField>\n * </FormGroup>\n */\nconst FormGroup = React.forwardRef<HTMLDivElement, FormGroupProps>(\n ({ dot: dotProp, children, inline = false, style, ...props }, ref) => {\n const computedStyle = useMemo(() => {\n const base = inline ? FORM_GROUP_INLINE : FORM_GROUP_STACK;\n return mergeStyles(base, resolveDot(dotProp), style);\n }, [inline, dotProp, style]);\n\n return (\n <div ref={ref} style={computedStyle} {...props}>\n {children}\n </div>\n );\n },\n);\nFormGroup.displayName = \"FormGroup\";\n\nexport { Form, FormField, FormGroup };\n","\"use client\";\n\nimport React from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\n\n/**\n * FormControl 컴포넌트의 props / FormControl component props\n * @typedef {Object} FormControlProps\n * @property {string} [label] - 필드 레이블 / Field label\n * @property {string} [description] - 필드 설명 / Field description\n * @property {string} [error] - 에러 메시지 / Error message\n * @property {boolean} [required=false] - 필수 필드 표시 / Required field indicator\n * @property {string} [htmlFor] - 레이블의 for 속성 / Label's for attribute\n * @property {boolean} [showErrorIcon=true] - 에러 아이콘 표시 / Show error icon\n * @property {boolean} [suppressBrowserValidation=true] - 브라우저 유효성 검사 UI 숨기기 / Hide browser validation UI\n * @property {React.ReactNode} children - 폼 입력 요소 / Form input element\n */\nexport interface FormControlProps {\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n htmlFor?: string;\n showErrorIcon?: boolean;\n suppressBrowserValidation?: boolean;\n dot?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/**\n * FormControl 컴포넌트 / FormControl component\n *\n * 폼 입력 요소를 감싸서 레이블, 설명, 에러 메시지를 표시합니다.\n * 브라우저 기본 유효성 검사 팝업 대신 커스텀 에러 메시지를 사용합니다.\n *\n * Wraps form input elements with label, description, and error messages.\n * Uses custom error messages instead of browser default validation popups.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FormControl label=\"Email\" required error={errors.email}>\n * <Input type=\"email\" />\n * </FormControl>\n *\n * @example\n * // 설명 포함 / With description\n * <FormControl\n * label=\"Password\"\n * description=\"Must be at least 8 characters\"\n * error={errors.password}\n * >\n * <Input type=\"password\" />\n * </FormControl>\n */\nfunction FormControl({\n label,\n description,\n error,\n required = false,\n htmlFor,\n showErrorIcon = true,\n suppressBrowserValidation = true,\n dot: dotProp,\n style,\n children,\n}: FormControlProps) {\n const hasError = !!error;\n\n // Clone children to add aria-invalid and suppress browser validation\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps: Record<string, unknown> = {\n \"aria-invalid\": hasError || undefined,\n \"aria-describedby\": hasError ? `${htmlFor}-error` : undefined,\n };\n\n // Suppress browser validation tooltip by handling onInvalid\n if (suppressBrowserValidation) {\n childProps.onInvalid = (e: React.FormEvent) => {\n e.preventDefault();\n // Call original onInvalid if exists\n const originalOnInvalid = (child.props as Record<string, unknown>).onInvalid;\n if (typeof originalOnInvalid === \"function\") {\n originalOnInvalid(e);\n }\n };\n }\n\n return React.cloneElement(child, childProps);\n }\n return child;\n });\n\n return (\n <div style={mergeStyles(resolveDot(\"space-y-2\"), resolveDot(dotProp), style)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={htmlFor}\n style={mergeStyles(\n resolveDot(\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"),\n hasError ? resolveDot(\"text-destructive\") : undefined\n )}\n >\n {label}\n {required && (\n <span style={resolveDot(\"text-destructive ml-1\")} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n {/* Description */}\n {description && !hasError && (\n <p style={resolveDot(\"text-sm text-muted-foreground\")}>{description}</p>\n )}\n\n {/* Input - with :invalid styling support */}\n <div style={resolveDot(\"relative [&_input:invalid]:border-destructive/50 [&_select:invalid]:border-destructive/50 [&_textarea:invalid]:border-destructive/50\")}>\n {enhancedChildren}\n </div>\n\n {/* Error Message */}\n {hasError && (\n <div\n id={htmlFor ? `${htmlFor}-error` : undefined}\n style={resolveDot(\"flex items-start gap-2 text-sm text-destructive\")}\n role=\"alert\"\n aria-live=\"polite\"\n >\n {showErrorIcon && <ErrorIcon style={resolveDot(\"w-4 h-4 mt-0.5 flex-shrink-0\")} />}\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useFormValidation 훅 / useFormValidation hook\n *\n * 폼 유효성 검사를 위한 훅입니다.\n * 브라우저 기본 유효성 검사를 비활성화하고 커스텀 에러 메시지를 사용합니다.\n *\n * Hook for form validation.\n * Disables browser default validation and uses custom error messages.\n *\n * @example\n * const { errors, validate, clearError } = useFormValidation();\n *\n * const handleSubmit = (e) => {\n * e.preventDefault();\n * const isValid = validate({\n * email: { value: email, required: true, pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/ },\n * password: { value: password, required: true, minLength: 8 },\n * });\n * if (isValid) { ... }\n * };\n */\n/**\n * Validation preset types for common field formats\n */\ntype ValidationPreset = \"email\" | \"phone\" | \"url\" | \"alphanumeric\" | \"password\";\n\n/**\n * Preset validation patterns and error messages\n */\nconst VALIDATION_PRESETS: Record<ValidationPreset, { pattern: RegExp; message: string }> = {\n email: {\n pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Invalid email format\",\n },\n phone: {\n pattern: /^[\\d\\s\\-+()]{10,}$/,\n message: \"Invalid phone number format\",\n },\n url: {\n pattern: /^https?:\\/\\/.+\\..+/,\n message: \"Invalid URL format (must start with http:// or https://)\",\n },\n alphanumeric: {\n pattern: /^[a-zA-Z0-9]+$/,\n message: \"Only letters and numbers are allowed\",\n },\n password: {\n pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/,\n message: \"Must contain at least 8 characters with uppercase, lowercase, and number\",\n },\n};\n\ninterface ValidationRule {\n value: string | number | boolean;\n type?: ValidationPreset;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n pattern?: RegExp;\n custom?: (value: string | number | boolean) => string | undefined;\n messages?: {\n required?: string;\n type?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n };\n}\n\ntype ValidationRules = Record<string, ValidationRule>;\ntype ValidationErrors = Record<string, string>;\n\nfunction useFormValidation(initialErrors: ValidationErrors = {}) {\n const [errors, setErrors] = React.useState<ValidationErrors>(initialErrors);\n\n const validate = React.useCallback((rules: ValidationRules): boolean => {\n const newErrors: ValidationErrors = {};\n\n for (const [field, rule] of Object.entries(rules)) {\n const { value, type, required, minLength, maxLength, min, max, pattern, custom, messages = {} } = rule;\n const stringValue = String(value);\n\n // Required check\n if (required && (!value || stringValue.trim() === \"\")) {\n newErrors[field] = messages.required || \"This field is required\";\n continue;\n }\n\n // Skip other validations if empty and not required\n if (!value || stringValue.trim() === \"\") continue;\n\n // Type preset check (email, phone, url, alphanumeric, password)\n if (type) {\n const preset = VALIDATION_PRESETS[type];\n if (preset && !preset.pattern.test(stringValue)) {\n newErrors[field] = messages.type || preset.message;\n continue;\n }\n }\n\n // MinLength check\n if (minLength !== undefined && stringValue.length < minLength) {\n newErrors[field] = messages.minLength || `Must be at least ${minLength} characters`;\n continue;\n }\n\n // MaxLength check\n if (maxLength !== undefined && stringValue.length > maxLength) {\n newErrors[field] = messages.maxLength || `Must be at most ${maxLength} characters`;\n continue;\n }\n\n // Min check (for numbers)\n if (min !== undefined && typeof value === \"number\" && value < min) {\n newErrors[field] = messages.min || `Must be at least ${min}`;\n continue;\n }\n\n // Max check (for numbers)\n if (max !== undefined && typeof value === \"number\" && value > max) {\n newErrors[field] = messages.max || `Must be at most ${max}`;\n continue;\n }\n\n // Pattern check (for custom patterns, overrides type preset)\n if (pattern && !pattern.test(stringValue)) {\n newErrors[field] = messages.pattern || \"Invalid format\";\n continue;\n }\n\n // Custom validation\n if (custom) {\n const customError = custom(value);\n if (customError) {\n newErrors[field] = customError;\n }\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, []);\n\n const clearError = React.useCallback((field: string) => {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n\n const clearAllErrors = React.useCallback(() => {\n setErrors({});\n }, []);\n\n return { errors, validate, clearError, clearAllErrors, setErrors };\n}\n\n// Error icon component\nfunction ErrorIcon({ style }: { style?: React.CSSProperties }) {\n return (\n <svg\n style={style}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n );\n}\n\nexport { FormControl, useFormValidation, VALIDATION_PRESETS };\nexport type { ValidationRule, ValidationRules, ValidationErrors, ValidationPreset };\n","\"use client\";\n\nimport React, { useState, useMemo, useCallback, useId } from \"react\";\nimport { dotVariants, dot as dotFn } from \"@hua-labs/dot\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport type { CSSProperties } from \"react\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\nimport {\n FORM_FOCUS_BASE,\n FORM_FOCUS_ERROR,\n FORM_FOCUS_SUCCESS,\n FORM_BORDER_ERROR,\n FORM_BORDER_SUCCESS,\n FORM_DISABLED,\n} from \"../lib/styles/focus\";\nimport { FORM_HOVER } from \"../lib/styles/hover\";\nimport { TRANSITIONS } from \"../lib/styles/transition\";\n\nconst s = (input: string) => dotFn(input) as CSSProperties;\n\nexport const selectVariantStyles = dotVariants({\n base: \"flex w-full rounded-md border\",\n variants: {\n variant: {\n default:\n \"border-[var(--color-input)] bg-[var(--color-background)] text-[var(--color-foreground)]\",\n outline:\n \"border-2 border-[var(--color-input)] bg-transparent text-[var(--color-foreground)]\",\n filled:\n \"border-transparent bg-[var(--color-secondary)]/50 text-[var(--color-foreground)]\",\n ghost: \"border-transparent bg-transparent text-[var(--color-foreground)]\",\n glass: \"\",\n },\n size: {\n sm: \"h-8 pl-2 text-sm\",\n md: \"h-10 pl-3 text-sm\",\n lg: \"h-12 pl-4 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\n/** Extra base styles per variant (can't be expressed as dot utilities) */\nconst VARIANT_EXTRAS: Record<string, CSSProperties> = {\n glass: {\n ...createGlassStyle(\"light\"),\n borderColor: \"rgba(255, 255, 255, 0.3)\",\n color: \"white\",\n },\n};\n\n/** Focus styles per variant (ghost/filled/glass have unique overrides) */\nconst VARIANT_FOCUS: Record<string, CSSProperties> = {\n default: FORM_FOCUS_BASE,\n outline: FORM_FOCUS_BASE,\n filled: {\n ...FORM_FOCUS_BASE,\n backgroundColor: \"var(--color-background)\",\n },\n ghost: {\n outline: \"none\",\n boxShadow:\n \"0 0 0 1px color-mix(in srgb, var(--color-muted-foreground) 40%, transparent)\",\n backgroundColor: \"var(--color-muted)\",\n borderColor: \"var(--color-border)\",\n },\n glass: {\n outline: \"none\",\n boxShadow:\n \"0 0 0 1px color-mix(in srgb, var(--color-ring) 20%, transparent)\",\n borderColor: \"color-mix(in srgb, var(--color-ring) 50%, transparent)\",\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n },\n};\n\n/**\n * Select 컴포넌트의 props / Select component props\n */\nexport interface SelectProps extends Omit<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n \"className\" | \"size\"\n> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n success?: boolean;\n leftIcon?: React.ReactNode;\n placeholder?: string;\n dot?: string;\n style?: CSSProperties;\n}\n\n/**\n * SelectOption 컴포넌트의 props / SelectOption component props\n * @typedef {Object} SelectOptionProps\n * @property {string} value - 옵션 값 / Option value\n * @property {React.ReactNode} children - 옵션 표시 텍스트 / Option display text\n * @extends {React.OptionHTMLAttributes<HTMLOptionElement>}\n */\nexport interface SelectOptionProps extends React.OptionHTMLAttributes<HTMLOptionElement> {\n value: string;\n children: React.ReactNode;\n}\n\n/**\n * Select 컴포넌트 / Select component\n *\n * 드롭다운 선택 메뉴를 제공하는 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n *\n * Dropdown selection menu component.\n * Supports various style variants and sizes, includes accessibility attributes.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Select>\n * <option value=\"option1\">옵션 1</option>\n * <option value=\"option2\">옵션 2</option>\n * </Select>\n *\n * @example\n * // 에러 상태와 아이콘 / Error state with icon\n * <Select\n * error\n * leftIcon={<Icon name=\"alert\" />}\n * aria-label=\"국가 선택\"\n * >\n * <option value=\"\">국가를 선택하세요</option>\n * <option value=\"kr\">한국</option>\n * <option value=\"us\">미국</option>\n * </Select>\n *\n * @example\n * // 다양한 변형 / Various variants\n * <Select variant=\"outline\" size=\"lg\">\n * <option value=\"1\">항목 1</option>\n * </Select>\n *\n * @param {SelectProps} props - Select 컴포넌트의 props / Select component props\n * @param {React.Ref<HTMLSelectElement>} ref - select 요소 ref / select element ref\n * @returns {JSX.Element} Select 컴포넌트 / Select component\n */\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n dot: dotProp,\n style: styleProp,\n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n leftIcon,\n placeholder,\n children,\n \"aria-label\": ariaLabel,\n \"aria-invalid\": ariaInvalid,\n id: idProp,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const id = idProp || autoId;\n\n const selectRef = React.useRef<HTMLSelectElement>(null);\n const combinedRef = useCallback(\n (node: HTMLSelectElement | null) => {\n selectRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLSelectElement | null>).current =\n node;\n }\n },\n [ref],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const isDisabled = props.disabled ?? false;\n const isInvalid =\n error || (ariaInvalid !== undefined ? Boolean(ariaInvalid) : false);\n\n const chevronRight = size === \"sm\" ? 8 : size === \"lg\" ? 14 : 12;\n const paddingRight = size === \"sm\" ? 32 : size === \"lg\" ? 44 : 40;\n\n const computedStyle = useMemo(() => {\n const base = mergeStyles(\n { transition: TRANSITIONS.normal, appearance: \"none\" as const },\n selectVariantStyles({ variant, size }) as CSSProperties,\n VARIANT_EXTRAS[variant],\n leftIcon ? { paddingLeft: \"40px\" } : undefined,\n { paddingRight: `${paddingRight}px` },\n );\n\n if (isDisabled) {\n return mergeStyles(base, FORM_DISABLED, resolveDot(dotProp), styleProp);\n }\n\n let stateStyles: CSSProperties = {};\n\n if (isHovered && !isFocused) {\n stateStyles = FORM_HOVER;\n }\n\n if (isFocused) {\n if (isInvalid) {\n stateStyles = FORM_FOCUS_ERROR;\n } else if (success) {\n stateStyles = FORM_FOCUS_SUCCESS;\n } else {\n stateStyles = VARIANT_FOCUS[variant] ?? VARIANT_FOCUS.default;\n }\n }\n\n // Error/success border (non-focus)\n if (!isFocused) {\n if (isInvalid) {\n stateStyles = mergeStyles(stateStyles, FORM_BORDER_ERROR);\n } else if (success) {\n stateStyles = mergeStyles(stateStyles, FORM_BORDER_SUCCESS);\n }\n }\n\n return mergeStyles(base, stateStyles, resolveDot(dotProp), styleProp);\n }, [\n variant,\n size,\n isHovered,\n isFocused,\n isDisabled,\n isInvalid,\n success,\n leftIcon,\n paddingRight,\n dotProp,\n styleProp,\n ]);\n\n const chevronStyle = useMemo(\n (): CSSProperties => ({\n position: \"absolute\",\n right: `${chevronRight}px`,\n top: \"50%\",\n transform: isFocused\n ? \"translateY(-50%) rotate(180deg)\"\n : \"translateY(-50%)\",\n pointerEvents: \"none\",\n transition: TRANSITIONS.transform,\n }),\n [isFocused, chevronRight],\n );\n\n return (\n <div style={{ position: \"relative\" }}>\n {leftIcon && (\n <div\n style={{\n position: \"absolute\",\n left: \"12px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n color: \"var(--color-muted-foreground)\",\n pointerEvents: \"none\",\n zIndex: 10,\n }}\n >\n {leftIcon}\n </div>\n )}\n <select\n ref={combinedRef}\n id={id}\n style={computedStyle}\n aria-label={ariaLabel || (placeholder ? undefined : \"선택\")}\n aria-invalid={\n ariaInvalid !== undefined ? ariaInvalid : error || undefined\n }\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocus={(e) => {\n setIsFocused(true);\n props.onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n props.onBlur?.(e);\n }}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n <div style={chevronStyle}>\n <svg\n style={{\n width: \"16px\",\n height: \"16px\",\n color: \"var(--color-muted-foreground)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </div>\n </div>\n );\n },\n);\nSelect.displayName = \"Select\";\n\nconst SelectOption = React.forwardRef<HTMLOptionElement, SelectOptionProps>(\n ({ ...props }, ref) => <option ref={ref} {...props} />,\n);\nSelectOption.displayName = \"SelectOption\";\n\nexport { Select, SelectOption };\n","\"use client\";\n\nimport React, { useState, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\nimport { RADIO_FOCUS_SHADOW } from \"../lib/styles/focus\";\nimport { CONTROL_HOVER_BORDER } from \"../lib/styles/hover\";\nimport { TRANSITIONS } from \"../lib/styles/transition\";\n\n// --- Static style constants ---\n\nconst SR_ONLY_STYLE: React.CSSProperties = {\n position: \"absolute\",\n width: 1,\n height: 1,\n overflow: \"hidden\",\n clip: \"rect(0,0,0,0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n};\n\nconst WRAPPER_STYLE: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n ...resolveDot(\"gap-3\"),\n};\n\nconst LABEL_COL_STYLE: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n};\n\nconst LABEL_STYLE: React.CSSProperties = {\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"var(--color-foreground)\",\n cursor: \"pointer\",\n};\n\nconst DESCRIPTION_STYLE: React.CSSProperties = {\n fontSize: \"0.875rem\",\n color: \"var(--color-muted-foreground)\",\n};\n\n// --- Size maps ---\n\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nconst CIRCLE_SIZE: Record<Size, React.CSSProperties> = {\n sm: { width: \"1rem\", height: \"1rem\" },\n md: { width: \"1.25rem\", height: \"1.25rem\" },\n lg: { width: \"1.5rem\", height: \"1.5rem\" },\n};\n\nconst DOT_SIZE: Record<Size, React.CSSProperties> = {\n sm: { width: \"0.375rem\", height: \"0.375rem\" },\n md: { width: \"0.5rem\", height: \"0.5rem\" },\n lg: { width: \"0.625rem\", height: \"0.625rem\" },\n};\n\n// --- Variant base styles ---\n\ntype Variant = \"default\" | \"outline\" | \"filled\" | \"glass\";\n\nconst VARIANT_BASE: Record<Variant, React.CSSProperties> = {\n default: {\n borderColor: \"var(--color-input)\",\n backgroundColor: \"var(--color-background)\",\n color: \"var(--color-primary)\",\n },\n outline: {\n borderWidth: 2,\n borderStyle: \"solid\",\n borderColor: \"var(--color-input)\",\n backgroundColor: \"transparent\",\n color: \"var(--color-primary)\",\n },\n filled: {\n borderColor: \"transparent\",\n backgroundColor: \"var(--color-muted)\",\n color: \"var(--color-primary)\",\n },\n glass: {\n ...createGlassStyle(\"light\"),\n borderColor: \"rgba(255,255,255,0.3)\",\n color: \"#fff\",\n },\n};\n\n// Focus ring — imported from shared focus.ts\n\n/**\n * Radio component props\n *\n * @typedef {Object} RadioProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Radio style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Radio size\n * @property {boolean} [error=false] - Error state\n * @property {boolean} [success=false] - Success state\n * @property {string} [label] - Radio button label text\n * @property {string} [description] - Radio button description text\n * @property {string} [dot] - Dot utility string for additional styles on the wrapper\n * @property {React.CSSProperties} [style] - Inline styles for the wrapper\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'className'>}\n */\nexport interface RadioProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"className\"\n> {\n variant?: Variant;\n size?: Size;\n error?: boolean;\n success?: boolean;\n label?: string;\n description?: string;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Radio component\n *\n * A radio button input field. Multiple Radio components with the same name attribute\n * work as a group. Automatically sets ARIA attributes for accessibility.\n *\n * @component\n * @example\n * // Basic usage (group)\n * <Radio name=\"option\" value=\"1\" label=\"Option 1\" />\n * <Radio name=\"option\" value=\"2\" label=\"Option 2\" />\n *\n * @example\n * // Error state\n * <Radio name=\"gender\" value=\"male\" label=\"Male\" error />\n *\n * @param {RadioProps} props - Radio component props\n * @param {React.Ref<HTMLInputElement>} ref - input element ref\n * @returns {JSX.Element} Radio component\n */\nconst Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n dot: dotProp,\n style,\n disabled,\n onFocus,\n onBlur,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const radioId = id || generatedId;\n const labelId = label ? `${radioId}-label` : undefined;\n const descriptionId = description ? `${radioId}-description` : undefined;\n\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n // Resolve which focus shadow to use\n const focusShadowKey = error ? \"error\" : success ? \"success\" : variant;\n const focusShadow =\n RADIO_FOCUS_SHADOW[focusShadowKey] ?? RADIO_FOCUS_SHADOW[\"default\"];\n\n // State border color overrides\n const stateBorderColor: React.CSSProperties | undefined = error\n ? { borderColor: \"var(--color-destructive)\" }\n : success\n ? { borderColor: \"var(--color-success)\" }\n : isChecked\n ? { borderColor: \"var(--color-primary)\" }\n : undefined;\n\n // Computed circle (outer) style\n const circleStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(\n {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"50%\",\n border: \"1px solid\",\n transition: TRANSITIONS.normal,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n outline: \"none\",\n },\n CIRCLE_SIZE[size],\n VARIANT_BASE[variant],\n stateBorderColor,\n isHovered && !isChecked && !disabled\n ? CONTROL_HOVER_BORDER\n : undefined,\n isFocused ? { boxShadow: focusShadow } : undefined,\n ),\n [\n size,\n variant,\n isFocused,\n isHovered,\n isChecked,\n disabled,\n focusShadow,\n stateBorderColor,\n ],\n );\n\n // Computed inner dot style\n const innerDotStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(\n {\n borderRadius: \"50%\",\n backgroundColor: \"var(--color-primary)\",\n transition: TRANSITIONS.normal,\n opacity: isChecked ? 1 : 0,\n transform: isChecked ? \"scale(1)\" : \"scale(0)\",\n },\n DOT_SIZE[size],\n ),\n [size, isChecked],\n );\n\n // Computed wrapper style (supports dot prop + style override)\n const wrapperStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(WRAPPER_STYLE, resolveDot(dotProp), style),\n [dotProp, style],\n );\n\n return (\n <div style={wrapperStyle}>\n <div style={{ position: \"relative\" }}>\n <input\n type=\"radio\"\n id={radioId}\n style={SR_ONLY_STYLE}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props[\"aria-label\"] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"radio\"\n disabled={disabled}\n readOnly={needsReadOnly || props.readOnly}\n onFocus={(e) => {\n setIsFocused(true);\n onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n onBlur?.(e);\n }}\n {...props}\n />\n <div\n style={circleStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div style={innerDotStyle} />\n </div>\n </div>\n {(label || description) && (\n <div style={LABEL_COL_STYLE}>\n {label && (\n <label\n htmlFor={radioId}\n id={labelId}\n style={\n disabled\n ? { ...LABEL_STYLE, cursor: \"not-allowed\", opacity: 0.5 }\n : LABEL_STYLE\n }\n >\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} style={DESCRIPTION_STYLE}>\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nRadio.displayName = \"Radio\";\n\nexport { Radio };\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\n\n/**\n * Slider 컴포넌트의 props\n * @typedef {Object} SliderProps\n * @property {\"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"} [variant=\"default\"] - Slider 스타일 변형\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Slider 크기\n * @property {boolean} [showValue=false] - 현재 값 표시 여부\n * @property {boolean} [showLabel=false] - 라벨 표시 여부\n * @property {string} [label] - 라벨 텍스트\n * @property {number} [min=0] - 최소값\n * @property {number} [max=100] - 최대값\n * @property {number} [step=1] - 단계값\n * @property {number | number[]} [value=0] - 현재 값 (배열이면 범위 슬라이더)\n * @property {(value: number | number[]) => void} [onValueChange] - 값 변경 콜백\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - Slider 방향\n * @property {boolean} [disabled=false] - 비활성화 여부\n * @property {string} [dot] - dot 유틸리티 스타일\n * @property {React.CSSProperties} [style] - 인라인 스타일\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size' | 'className'>}\n */\nexport interface SliderProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"size\" | \"className\"\n> {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\";\n size?: \"sm\" | \"md\" | \"lg\";\n showValue?: boolean;\n showLabel?: boolean;\n label?: string;\n min?: number;\n max?: number;\n step?: number;\n value?: number | number[];\n onValueChange?: (value: number | number[]) => void;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Track thickness per size ───────────────────────────────────────────────\n\nconst TRACK_THICKNESS: Record<string, number> = {\n sm: 4,\n md: 8,\n lg: 12,\n};\n\n// ─── Thumb size per size ─────────────────────────────────────────────────────\n\nconst THUMB_SIZE: Record<string, number> = {\n sm: 12,\n md: 16,\n lg: 24,\n};\n\n// ─── Track background colors (CSS vars) ─────────────────────────────────────\n\nconst TRACK_BG: Record<string, string> = {\n default: \"var(--color-muted, hsl(210 15% 94%))\",\n primary:\n \"color-mix(in sRGB, var(--color-primary, hsl(166 78% 30%)) 20%, transparent)\",\n success:\n \"color-mix(in sRGB, var(--progress-success, rgb(34,197,94)) 20%, transparent)\",\n warning:\n \"color-mix(in sRGB, var(--progress-warning, rgb(234,179,8)) 20%, transparent)\",\n danger:\n \"color-mix(in sRGB, var(--color-destructive, hsl(0 84% 60%)) 20%, transparent)\",\n};\n\n// ─── Thumb / fill colors (CSS vars) ─────────────────────────────────────────\n\nconst THUMB_BG: Record<string, string> = {\n default: \"var(--color-muted-foreground, hsl(210 10% 40%))\",\n primary: \"var(--color-primary, hsl(166 78% 30%))\",\n success: \"var(--progress-success, rgb(34,197,94))\",\n warning: \"var(--progress-warning, rgb(234,179,8))\",\n danger: \"var(--color-destructive, hsl(0 84% 60%))\",\n};\n\nconst FILL_BG: Record<string, string> = {\n default: \"var(--color-muted-foreground, hsl(210 10% 40%))\",\n primary: \"var(--color-primary, hsl(166 78% 30%))\",\n success: \"var(--progress-success, rgb(34,197,94))\",\n warning: \"var(--progress-warning, rgb(234,179,8))\",\n danger: \"var(--color-destructive, hsl(0 84% 60%))\",\n};\n\n/**\n * Slider 컴포넌트 / Slider component\n *\n * 숫자 값을 선택하는 슬라이더 컴포넌트입니다.\n * 단일 값 또는 범위 값을 선택할 수 있습니다.\n *\n * Slider component for selecting numeric values.\n * Supports single value or range value selection.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [value, setValue] = useState(50)\n * <Slider value={value} onValueChange={setValue} />\n *\n * @example\n * // 범위 슬라이더 / Range slider\n * const [range, setRange] = useState([20, 80])\n * <Slider\n * value={range}\n * onValueChange={setRange}\n * showValue\n * label=\"가격 범위\"\n * />\n *\n * @example\n * // 세로 슬라이더 / Vertical slider\n * <Slider\n * orientation=\"vertical\"\n * variant=\"primary\"\n * size=\"lg\"\n * style={{ height: '16rem' }}\n * />\n *\n * @param {SliderProps} props - Slider 컴포넌트의 props / Slider component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Slider 컴포넌트 / Slider component\n */\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n (\n {\n dot: dotProp,\n style,\n variant = \"default\",\n size = \"md\",\n showValue = false,\n showLabel = false,\n label,\n min = 0,\n max = 100,\n step = 1,\n value = 0,\n onValueChange,\n orientation = \"horizontal\",\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const isRange = Array.isArray(value);\n const currentValue = isRange ? value : [value];\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value);\n if (onValueChange) {\n if (isRange) {\n const index = parseInt(e.target.dataset.index || \"0\");\n const newRange = [...currentValue];\n newRange[index] = newValue;\n onValueChange(newRange);\n } else {\n onValueChange(newValue);\n }\n }\n };\n\n const trackThickness = TRACK_THICKNESS[size];\n const thumbSize = THUMB_SIZE[size];\n const trackBg = TRACK_BG[variant];\n const thumbBg = THUMB_BG[variant];\n const fillBg = FILL_BG[variant];\n\n const isVertical = orientation === \"vertical\";\n\n // ── Outer wrapper style ─────────────────────────────────────────────────\n const wrapperStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(\n {\n display: \"flex\",\n alignItems: \"center\",\n ...resolveDot(\"gap-4\"),\n flexDirection: isVertical ? \"column\" : \"row\",\n width: isVertical ? undefined : \"100%\",\n height: isVertical ? \"100%\" : undefined,\n },\n resolveDot(dotProp),\n style,\n ),\n [isVertical, dotProp, style],\n );\n\n // ── Track background style ──────────────────────────────────────────────\n const trackStyle = useMemo((): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n borderRadius: \"9999px\",\n backgroundColor: trackBg,\n };\n if (isVertical) {\n return {\n ...base,\n width: trackThickness,\n height: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n }\n return {\n ...base,\n height: trackThickness,\n width: \"100%\",\n };\n }, [isVertical, trackThickness, trackBg]);\n\n // ── Fill style factory ──────────────────────────────────────────────────\n const buildFillStyle = (\n startPct: number,\n sizePct: number,\n ): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n borderRadius: \"9999px\",\n backgroundColor: fillBg,\n };\n if (isVertical) {\n return {\n ...base,\n width: trackThickness,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n bottom: `${startPct}%`,\n height: `${sizePct}%`,\n };\n }\n return {\n ...base,\n height: trackThickness,\n left: `${startPct}%`,\n width: `${sizePct}%`,\n };\n };\n\n // ── Thumb style factory ─────────────────────────────────────────────────\n const buildThumbStyle = (positionPct: number): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: thumbSize,\n height: thumbSize,\n borderRadius: \"9999px\",\n border: \"2px solid white\",\n boxShadow:\n \"0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)\",\n transition: \"transform 200ms ease-in-out\",\n backgroundColor: thumbBg,\n };\n if (disabled) {\n base.cursor = \"not-allowed\";\n base.opacity = 0.5;\n }\n if (isVertical) {\n return {\n ...base,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n bottom: `${positionPct}%`,\n };\n }\n return {\n ...base,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n left: `${positionPct}%`,\n };\n };\n\n // ── Hidden input style ──────────────────────────────────────────────────\n const hiddenInputStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n width: \"100%\",\n height: \"100%\",\n margin: 0,\n };\n\n const renderInput = (index: number = 0) => (\n <input\n key={index}\n ref={index === 0 ? ref : undefined}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue[index]}\n onChange={handleChange}\n data-index={index}\n disabled={disabled}\n style={{\n ...hiddenInputStyle,\n ...(isVertical && {\n writingMode: \"vertical-rl\" as const,\n WebkitAppearance: \"slider-vertical\",\n }),\n }}\n {...props}\n />\n );\n\n const renderValue = () => {\n if (!showValue) return null;\n\n const valueTextStyle: React.CSSProperties = {\n fontSize: \"0.875rem\",\n fontFamily: \"monospace\",\n color: \"var(--color-muted-foreground, hsl(210 10% 40%))\",\n };\n\n if (isRange) {\n return (\n <div\n style={{\n display: \"flex\",\n ...resolveDot(\"gap-2\"),\n fontSize: \"0.875rem\",\n color: \"var(--color-muted-foreground, hsl(210 10% 40%))\",\n }}\n >\n {currentValue.map((val, index) => (\n <span key={index} style={valueTextStyle}>\n {val}\n </span>\n ))}\n </div>\n );\n }\n\n return <span style={valueTextStyle}>{currentValue[0]}</span>;\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"var(--color-foreground, hsl(210 10% 10%))\",\n minWidth: 0,\n };\n\n // Outer track container — holds track bg, fill, thumb, hidden inputs\n const trackContainerStyle: React.CSSProperties = isVertical\n ? { position: \"relative\", height: \"100%\" }\n : {\n position: \"relative\",\n width: \"100%\",\n ...resolveDot(\"h-4\"),\n display: \"flex\",\n alignItems: \"center\",\n };\n\n const fillStartPct = isRange\n ? ((currentValue[0] - min) / (max - min)) * 100\n : 0;\n const fillSizePct = isRange\n ? ((currentValue[1] - currentValue[0]) / (max - min)) * 100\n : ((currentValue[0] - min) / (max - min)) * 100;\n\n return (\n <div style={wrapperStyle}>\n {showLabel && label && <label style={labelStyle}>{label}</label>}\n\n <div\n style={{\n flex: 1,\n position: \"relative\",\n ...(isVertical ? { height: \"100%\" } : { width: \"100%\" }),\n }}\n >\n <div style={trackContainerStyle}>\n {/* Background track */}\n <div style={trackStyle} />\n\n {/* Fill track */}\n <div style={buildFillStyle(fillStartPct, fillSizePct)} />\n\n {/* Thumb(s) */}\n {isRange ? (\n currentValue.map((_, index) => (\n <div\n key={index}\n style={buildThumbStyle(\n ((currentValue[index] - min) / (max - min)) * 100,\n )}\n />\n ))\n ) : (\n <div\n style={buildThumbStyle(\n ((currentValue[0] - min) / (max - min)) * 100,\n )}\n />\n )}\n </div>\n\n {/* Hidden native inputs */}\n <div style={{ position: \"absolute\", inset: 0, opacity: 0 }}>\n {isRange\n ? currentValue.map((_, index) => renderInput(index))\n : renderInput()}\n </div>\n </div>\n\n {renderValue()}\n </div>\n );\n },\n);\nSlider.displayName = \"Slider\";\n\nexport { Slider };\n","\"use client\";\n\nimport React, { useId } from \"react\";\nimport { Icon } from \"./Icon\";\nimport { Popover } from \"./Popover\";\nimport { Button } from \"./Button\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\n\n/**\n * DatePicker 컴포넌트의 props / DatePicker component props\n * @typedef {Object} DatePickerProps\n * @property {Date | null} [value] - 선택된 날짜 / Selected date\n * @property {(date: Date | null) => void} [onChange] - 날짜 변경 핸들러 / Date change handler\n * @property {Date} [minDate] - 최소 날짜 / Minimum date\n * @property {Date} [maxDate] - 최대 날짜 / Maximum date\n * @property {string} [placeholder=\"날짜를 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {string} [dateFormat=\"YYYY-MM-DD\"] - 날짜 포맷 / Date format\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'className'>}\n */\nexport interface DatePickerProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"className\"\n> {\n value?: Date | null;\n onChange?: (date: Date | null) => void;\n minDate?: Date;\n maxDate?: Date;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n dateFormat?: string;\n locale?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n /** 표시할 날짜 배열 (점으로 표시) / Dates to mark with a dot\n * @deprecated markedDateKeys 사용 권장 (타임존 안전) */\n markedDates?: Date[];\n /** 표시할 날짜 키 배열 (YYYY-MM-DD 형식, 타임존 안전) / Date keys to mark with a dot */\n markedDateKeys?: string[];\n /** dot 유틸리티 스트링 (인라인 스타일로 변환) / dot utility string (converted to inline style) */\n dot?: string;\n /** 추가 인라인 스타일 / Additional inline style */\n style?: React.CSSProperties;\n /** trigger 버튼의 id (label htmlFor 연결용) / id for the trigger button (for label htmlFor linking) */\n triggerId?: string;\n}\n\nconst sizeStyles: Record<string, React.CSSProperties> = {\n sm: { height: \"2rem\", fontSize: \"0.875rem\", padding: \"0 0.75rem\" },\n md: { height: \"2.5rem\", fontSize: \"0.875rem\", padding: \"0 1rem\" },\n lg: { height: \"3rem\", fontSize: \"1rem\", padding: \"0 1.25rem\" },\n};\n\nconst formatDate = (\n date: Date | null,\n format: string = \"YYYY-MM-DD\",\n _locale: string = \"ko-KR\",\n): string => {\n if (!date) return \"\";\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n\n return format\n .replace(\"YYYY\", String(year))\n .replace(\"MM\", month)\n .replace(\"DD\", day);\n};\n\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n/**\n * DatePicker 컴포넌트 / DatePicker component\n *\n * 날짜를 선택할 수 있는 컴포넌트입니다.\n * 캘린더 팝오버를 통해 직관적으로 날짜를 선택할 수 있습니다.\n *\n * Component for selecting dates.\n * Allows intuitive date selection through a calendar popover.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DatePicker\n * value={selectedDate}\n * onChange={setSelectedDate}\n * />\n *\n * @example\n * // 날짜 범위 제한 / Date range restriction\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * minDate={new Date(\"2024-01-01\")}\n * maxDate={new Date(\"2024-12-31\")}\n * placeholder=\"날짜 선택\"\n * />\n *\n * @param {DatePickerProps} props - DatePicker 컴포넌트의 props / DatePicker component props\n * @returns {JSX.Element} DatePicker 컴포넌트 / DatePicker component\n */\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n minDate,\n maxDate,\n placeholder = \"날짜를 선택하세요\",\n disabled = false,\n error = false,\n dateFormat = \"YYYY-MM-DD\",\n locale = \"ko-KR\",\n size = \"md\",\n markedDates,\n markedDateKeys,\n dot: dotProp,\n style,\n triggerId,\n ...props\n },\n ref,\n ) => {\n const autoTriggerId = useId();\n const finalTriggerId = triggerId || autoTriggerId;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [currentMonth, setCurrentMonth] = React.useState(\n value ? new Date(value.getFullYear(), value.getMonth()) : new Date(),\n );\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null);\n const [viewMode, setViewMode] = React.useState<\"days\" | \"months\" | \"years\">(\n \"days\",\n );\n\n const displayDate = value ? formatDate(value, dateFormat, locale) : \"\";\n\n const handleDateSelect = (date: Date) => {\n if (minDate && date < minDate) return;\n if (maxDate && date > maxDate) return;\n onChange?.(date);\n setIsOpen(false);\n };\n\n const handlePrevMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const handleNextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const handleToday = () => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n handleDateSelect(today);\n };\n\n const handleMonthSelect = (monthIndex: number) => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), monthIndex));\n setViewMode(\"days\");\n };\n\n const handleYearSelect = (selectedYear: number) => {\n setCurrentMonth(new Date(selectedYear, currentMonth.getMonth()));\n setViewMode(\"months\");\n };\n\n const handleHeaderClick = () => {\n if (viewMode === \"days\") setViewMode(\"months\");\n else if (viewMode === \"months\") setViewMode(\"years\");\n else setViewMode(\"months\");\n };\n\n const year = currentMonth.getFullYear();\n const month = currentMonth.getMonth();\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = getFirstDayOfMonth(year, month);\n\n // 로케일별 요일 텍스트\n const weekDaysMap: Record<string, string[]> = {\n \"ko-KR\": [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n ko: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n \"ja-JP\": [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n ja: [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n \"en-US\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n en: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n };\n const weekDays = weekDaysMap[locale] || weekDaysMap[\"en\"];\n\n // 로케일별 월 포맷\n const formatMonth = (year: number, month: number, loc: string): string => {\n if (loc === \"ko-KR\" || loc === \"ko\") {\n return `${year}년 ${month + 1}월`;\n } else if (loc === \"ja-JP\" || loc === \"ja\") {\n return `${year}年 ${month + 1}月`;\n } else {\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n return `${monthNames[month]} ${year}`;\n }\n };\n\n // 로케일별 \"오늘\" 텍스트\n const todayTextMap: Record<string, string> = {\n \"ko-KR\": \"오늘\",\n ko: \"오늘\",\n \"ja-JP\": \"今日\",\n ja: \"今日\",\n \"en-US\": \"Today\",\n en: \"Today\",\n };\n const todayText = todayTextMap[locale] || \"Today\";\n\n // 로케일별 짧은 월 이름\n const shortMonthsMap: Record<string, string[]> = {\n \"ko-KR\": [\n \"1월\",\n \"2월\",\n \"3월\",\n \"4월\",\n \"5월\",\n \"6월\",\n \"7월\",\n \"8월\",\n \"9월\",\n \"10월\",\n \"11월\",\n \"12월\",\n ],\n ko: [\n \"1월\",\n \"2월\",\n \"3월\",\n \"4월\",\n \"5월\",\n \"6월\",\n \"7월\",\n \"8월\",\n \"9월\",\n \"10월\",\n \"11월\",\n \"12월\",\n ],\n \"ja-JP\": [\n \"1月\",\n \"2月\",\n \"3月\",\n \"4月\",\n \"5月\",\n \"6月\",\n \"7月\",\n \"8月\",\n \"9月\",\n \"10月\",\n \"11月\",\n \"12月\",\n ],\n ja: [\n \"1月\",\n \"2月\",\n \"3月\",\n \"4月\",\n \"5月\",\n \"6月\",\n \"7月\",\n \"8月\",\n \"9月\",\n \"10月\",\n \"11月\",\n \"12月\",\n ],\n \"en-US\": [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n en: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n };\n const shortMonths = shortMonthsMap[locale] || shortMonthsMap[\"en\"];\n\n // 로케일별 aria-label 텍스트\n const ariaLabels = {\n prevMonth: locale.startsWith(\"ko\")\n ? \"이전 달\"\n : locale.startsWith(\"ja\")\n ? \"前月\"\n : \"Previous month\",\n nextMonth: locale.startsWith(\"ko\")\n ? \"다음 달\"\n : locale.startsWith(\"ja\")\n ? \"翌月\"\n : \"Next month\",\n prevYear: locale.startsWith(\"ko\")\n ? \"이전 연도\"\n : locale.startsWith(\"ja\")\n ? \"前年\"\n : \"Previous year\",\n nextYear: locale.startsWith(\"ko\")\n ? \"다음 연도\"\n : locale.startsWith(\"ja\")\n ? \"翌年\"\n : \"Next year\",\n prevYearPage: locale.startsWith(\"ko\")\n ? \"이전 12년\"\n : locale.startsWith(\"ja\")\n ? \"前の12年\"\n : \"Previous 12 years\",\n nextYearPage: locale.startsWith(\"ko\")\n ? \"다음 12년\"\n : locale.startsWith(\"ja\")\n ? \"次の12年\"\n : \"Next 12 years\",\n selectMonthYear: locale.startsWith(\"ko\")\n ? \"월/연도 선택\"\n : locale.startsWith(\"ja\")\n ? \"月/年選択\"\n : \"Select month/year\",\n };\n\n // 날짜 aria-label 포맷\n const formatDateAriaLabel = (date: Date, loc: string): string => {\n if (loc.startsWith(\"ko\")) {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`;\n } else if (loc.startsWith(\"ja\")) {\n return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;\n } else {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n }\n };\n\n const isDateDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const isDateSelected = (date: Date): boolean => {\n if (!value) return false;\n return (\n date.getFullYear() === value.getFullYear() &&\n date.getMonth() === value.getMonth() &&\n date.getDate() === value.getDate()\n );\n };\n\n const isToday = (date: Date): boolean => {\n const today = new Date();\n return (\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate()\n );\n };\n\n const toDateKey = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n };\n\n const markedKeySet = React.useMemo(\n () => (markedDateKeys ? new Set(markedDateKeys) : null),\n [markedDateKeys],\n );\n\n const isMarkedDate = (date: Date): boolean => {\n if (markedKeySet) {\n return markedKeySet.has(toDateKey(date));\n }\n if (!markedDates) return false;\n return markedDates.some(\n (marked) =>\n marked.getFullYear() === date.getFullYear() &&\n marked.getMonth() === date.getMonth() &&\n marked.getDate() === date.getDate(),\n );\n };\n\n const calendarDays: (Date | null)[] = [];\n\n // 이전 달의 마지막 날들\n for (let i = firstDay - 1; i >= 0; i--) {\n const date = new Date(year, month, -i);\n calendarDays.push(date);\n }\n\n // 현재 달의 날들\n for (let day = 1; day <= daysInMonth; day++) {\n calendarDays.push(new Date(year, month, day));\n }\n\n // 다음 달의 첫 날들 (현재 행만 채우기 - 불필요한 추가 행 방지)\n const totalRows = Math.ceil(calendarDays.length / 7);\n const totalSlots = totalRows * 7;\n const remainingDays = totalSlots - calendarDays.length;\n for (let day = 1; day <= remainingDays; day++) {\n calendarDays.push(new Date(year, month + 1, day));\n }\n\n const triggerButtonStyle: React.CSSProperties = mergeStyles(\n resolveDot(\"rounded-lg\"),\n {\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n border: error\n ? \"1px solid var(--color-destructive)\"\n : \"1px solid var(--color-input)\",\n backgroundColor: \"var(--color-background)\",\n textAlign: \"left\",\n fontSize: sizeStyles[size].fontSize,\n height: sizeStyles[size].height,\n padding: sizeStyles[size].padding,\n transition: \"all 150ms\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n },\n );\n\n const triggerButton = (\n <button\n type=\"button\"\n id={finalTriggerId}\n disabled={disabled}\n style={triggerButtonStyle}\n aria-label={displayDate || placeholder}\n >\n <span\n style={{\n flex: 1,\n color: displayDate\n ? \"var(--color-foreground)\"\n : \"var(--color-muted-foreground)\",\n }}\n >\n {displayDate || placeholder}\n </span>\n <Icon name=\"calendar\" dot=\"ml-2 h-4 w-4\" />\n </button>\n );\n\n return (\n <div\n ref={ref}\n style={mergeStyles(resolveDot(\"relative\"), resolveDot(dotProp), style)}\n {...props}\n >\n <Popover\n open={isOpen}\n onOpenChange={(open) => {\n setIsOpen(open);\n if (open) setViewMode(\"days\");\n }}\n trigger={triggerButton}\n position=\"bottom\"\n align=\"start\"\n fullWidth\n contentStyle={{ padding: 0 }}\n >\n <div\n style={mergeStyles(resolveDot(\"rounded-lg\"), {\n backgroundColor: \"var(--color-popover)\",\n })}\n >\n <div style={resolveDot(\"p-4\")}>\n {/* 헤더 */}\n <div\n style={mergeStyles(resolveDot(\"mb-4\"), {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n })}\n >\n <button\n type=\"button\"\n onClick={() => {\n if (viewMode === \"days\") handlePrevMonth();\n else if (viewMode === \"years\")\n setCurrentMonth(\n new Date(\n currentMonth.getFullYear() - 12,\n currentMonth.getMonth(),\n ),\n );\n else\n setCurrentMonth(\n new Date(\n currentMonth.getFullYear() - 1,\n currentMonth.getMonth(),\n ),\n );\n }}\n style={mergeStyles(resolveDot(\"rounded-lg p-2\"), {\n backgroundColor: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"background-color 150ms\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n })}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"var(--color-muted)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"transparent\";\n }}\n aria-label={\n viewMode === \"days\"\n ? ariaLabels.prevMonth\n : viewMode === \"years\"\n ? ariaLabels.prevYearPage\n : ariaLabels.prevYear\n }\n >\n <Icon name=\"chevronLeft\" dot=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={handleHeaderClick}\n style={mergeStyles(resolveDot(\"rounded-md py-1 px-3\"), {\n fontSize: \"1.125rem\",\n fontWeight: 600,\n color: \"var(--color-foreground)\",\n backgroundColor: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"background-color 150ms\",\n })}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"var(--color-muted)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"transparent\";\n }}\n aria-label={ariaLabels.selectMonthYear}\n >\n {viewMode === \"years\"\n ? `${year - 5}–${year + 6}`\n : viewMode === \"months\"\n ? `${year}`\n : formatMonth(year, month, locale)}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n if (viewMode === \"days\") handleNextMonth();\n else if (viewMode === \"years\")\n setCurrentMonth(\n new Date(\n currentMonth.getFullYear() + 12,\n currentMonth.getMonth(),\n ),\n );\n else\n setCurrentMonth(\n new Date(\n currentMonth.getFullYear() + 1,\n currentMonth.getMonth(),\n ),\n );\n }}\n style={mergeStyles(resolveDot(\"rounded-lg p-2\"), {\n backgroundColor: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"background-color 150ms\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n })}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"var(--color-muted)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"transparent\";\n }}\n aria-label={\n viewMode === \"days\"\n ? ariaLabels.nextMonth\n : viewMode === \"years\"\n ? ariaLabels.nextYearPage\n : ariaLabels.nextYear\n }\n >\n <Icon name=\"chevronRight\" dot=\"h-4 w-4\" />\n </button>\n </div>\n\n {viewMode === \"days\" && (\n <>\n {/* 요일 헤더 */}\n <div\n style={mergeStyles(resolveDot(\"gap-1 mb-2\"), {\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n })}\n >\n {weekDays.map((day, index) => (\n <div\n key={index}\n style={{\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n padding: \"0.5rem 0\",\n color:\n index === 0\n ? \"var(--color-destructive)\"\n : index === 6\n ? \"var(--color-primary)\"\n : \"var(--color-foreground)\",\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 캘린더 그리드 */}\n <div\n style={mergeStyles(resolveDot(\"gap-1\"), {\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n })}\n >\n {calendarDays.map((date, index) => {\n if (!date) return <div key={index} />;\n\n const isCurrentMonth = date.getMonth() === month;\n const isDisabled = isDateDisabled(date);\n const isSelected = isDateSelected(date);\n const isTodayDate = isToday(date);\n const isMarked = isMarkedDate(date);\n const isHovered =\n hoveredDate &&\n date.getFullYear() === hoveredDate.getFullYear() &&\n date.getMonth() === hoveredDate.getMonth() &&\n date.getDate() === hoveredDate.getDate();\n\n const buttonStyle: React.CSSProperties = mergeStyles(\n resolveDot(\"rounded-lg\"),\n {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"2.25rem\",\n width: \"2.25rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n transition: \"all 150ms\",\n border: \"none\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n outline: \"none\",\n backgroundColor: \"transparent\",\n ...(!isCurrentMonth && !isSelected\n ? { opacity: 0.3 }\n : {}),\n ...(isSelected\n ? {\n backgroundColor: \"var(--color-primary)\",\n color: \"#fff\",\n }\n : {}),\n ...(isTodayDate && !isSelected\n ? {\n boxShadow:\n \"inset 0 0 0 2px var(--color-primary)\",\n fontWeight: 700,\n }\n : {}),\n ...(isHovered && !isSelected\n ? {\n backgroundColor:\n \"color-mix(in srgb, var(--color-primary) 15%, transparent)\",\n }\n : {}),\n },\n );\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleDateSelect(date)}\n onMouseEnter={() => setHoveredDate(date)}\n onMouseLeave={() => setHoveredDate(null)}\n style={buttonStyle}\n aria-label={formatDateAriaLabel(date, locale)}\n >\n <span\n style={{\n position: \"relative\",\n zIndex: 10,\n lineHeight: 1,\n }}\n >\n {date.getDate()}\n </span>\n {isMarked && (\n <span\n style={{\n position: \"absolute\",\n bottom: \"1px\",\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"9999px\",\n backgroundColor: isSelected\n ? \"#fff\"\n : \"var(--color-primary)\",\n }}\n />\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n\n {viewMode === \"months\" && (\n <div\n style={mergeStyles(resolveDot(\"gap-2\"), {\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n })}\n >\n {shortMonths.map((monthName, index) => {\n const isCurrentMonthSelected = month === index;\n const cellStyle: React.CSSProperties = mergeStyles(\n resolveDot(\"rounded-lg py-3 px-2\"),\n {\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"0.875rem\",\n fontWeight: isCurrentMonthSelected ? 600 : 400,\n backgroundColor: isCurrentMonthSelected\n ? \"var(--color-primary)\"\n : \"transparent\",\n color: isCurrentMonthSelected\n ? \"#fff\"\n : \"var(--color-foreground)\",\n transition: \"all 150ms\",\n },\n );\n return (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleMonthSelect(index)}\n onMouseEnter={(e) => {\n if (!isCurrentMonthSelected)\n (\n e.currentTarget as HTMLElement\n ).style.backgroundColor = \"var(--color-muted)\";\n }}\n onMouseLeave={(e) => {\n if (!isCurrentMonthSelected)\n (\n e.currentTarget as HTMLElement\n ).style.backgroundColor = \"transparent\";\n }}\n style={cellStyle}\n aria-label={`${monthName} ${year}`}\n >\n {monthName}\n </button>\n );\n })}\n </div>\n )}\n\n {viewMode === \"years\" && (\n <div\n style={mergeStyles(resolveDot(\"gap-2\"), {\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n })}\n >\n {Array.from({ length: 12 }, (_, i) => year - 5 + i).map(\n (y) => {\n const isCurrentYear = year === y;\n const cellStyle: React.CSSProperties = mergeStyles(\n resolveDot(\"rounded-lg py-3 px-2\"),\n {\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"0.875rem\",\n fontWeight: isCurrentYear ? 600 : 400,\n backgroundColor: isCurrentYear\n ? \"var(--color-primary)\"\n : \"transparent\",\n color: isCurrentYear\n ? \"#fff\"\n : \"var(--color-foreground)\",\n transition: \"all 150ms\",\n },\n );\n return (\n <button\n key={y}\n type=\"button\"\n onClick={() => handleYearSelect(y)}\n onMouseEnter={(e) => {\n if (!isCurrentYear)\n (\n e.currentTarget as HTMLElement\n ).style.backgroundColor = \"var(--color-muted)\";\n }}\n onMouseLeave={(e) => {\n if (!isCurrentYear)\n (\n e.currentTarget as HTMLElement\n ).style.backgroundColor = \"transparent\";\n }}\n style={cellStyle}\n aria-label={String(y)}\n >\n {y}\n </button>\n );\n },\n )}\n </div>\n )}\n\n {/* 오늘 버튼 */}\n <div\n style={mergeStyles(resolveDot(\"mt-4 pt-4\"), {\n borderTop: \"1px solid var(--color-border)\",\n })}\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n const now = new Date();\n setViewMode(\"days\");\n setCurrentMonth(\n new Date(now.getFullYear(), now.getMonth()),\n );\n handleToday();\n }}\n dot=\"w-full\"\n >\n {todayText}\n </Button>\n </div>\n </div>\n </div>\n </Popover>\n </div>\n );\n },\n);\n\nDatePicker.displayName = \"DatePicker\";\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { Icon } from \"./Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n/**\n * 업로드된 파일 정보 인터페이스 / Uploaded file information interface\n * @typedef {Object} UploadedFile\n * @property {string} id - 파일 고유 ID / File unique ID\n * @property {File} file - 파일 객체 / File object\n * @property {string} name - 파일 이름 / File name\n * @property {number} size - 파일 크기 (bytes) / File size in bytes\n * @property {string} type - 파일 타입 / File type\n * @property {number} [progress] - 업로드 진행률 (0-100) / Upload progress (0-100)\n * @property {\"pending\" | \"uploading\" | \"success\" | \"error\"} [status] - 업로드 상태 / Upload status\n * @property {string} [url] - 업로드된 파일 URL / Uploaded file URL\n * @property {string} [error] - 에러 메시지 / Error message\n */\nexport interface UploadedFile {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n progress?: number;\n status?: \"pending\" | \"uploading\" | \"success\" | \"error\";\n url?: string;\n error?: string;\n}\n\n/**\n * Upload 컴포넌트의 props / Upload component props\n * @typedef {Object} UploadProps\n * @property {UploadedFile[]} [files] - 업로드된 파일 목록 / Uploaded files list\n * @property {(files: File[]) => void} [onChange] - 파일 선택 핸들러 / File selection handler\n * @property {(file: UploadedFile) => void} [onRemove] - 파일 제거 핸들러 / File removal handler\n * @property {boolean} [multiple=false] - 다중 파일 선택 허용 / Allow multiple file selection\n * @property {string} [accept] - 허용할 파일 타입 (예: \"image/*\", \".pdf\") / Accepted file types\n * @property {number} [maxSize] - 최대 파일 크기 (bytes) / Maximum file size in bytes\n * @property {number} [maxFiles] - 최대 파일 개수 / Maximum number of files\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [dragDrop=true] - 드래그 앤 드롭 활성화 / Enable drag and drop\n * @property {string} [placeholder=\"파일을 선택하거나 여기에 드래그하세요\"] - 플레이스홀더 / Placeholder\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [dot] - dot 스타일 유틸리티 문자열 / Dot style utility string\n * @property {React.CSSProperties} [style] - 인라인 스타일 / Inline style\n */\nexport interface UploadProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\" | \"onChange\"\n> {\n files?: UploadedFile[];\n onChange?: (files: File[]) => void;\n onRemove?: (file: UploadedFile) => void;\n multiple?: boolean;\n accept?: string;\n maxSize?: number;\n maxFiles?: number;\n disabled?: boolean;\n dragDrop?: boolean;\n placeholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n dot?: string;\n style?: React.CSSProperties;\n}\n\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + \" \" + sizes[i];\n};\n\nconst getFileIcon = (type: string): IconName => {\n if (type.startsWith(\"image/\")) return \"image\";\n if (type.startsWith(\"video/\")) return \"video\";\n if (type.includes(\"pdf\")) return \"fileText\";\n if (type.includes(\"word\") || type.includes(\"document\")) return \"fileText\";\n if (type.includes(\"excel\") || type.includes(\"spreadsheet\")) return \"fileText\";\n return \"file\";\n};\n\n/** Padding by size */\nconst SIZE_PADDING: Record<\"sm\" | \"md\" | \"lg\", React.CSSProperties> = {\n sm: resolveDot(\"p-4\"),\n md: resolveDot(\"p-6\"),\n lg: resolveDot(\"p-8\"),\n};\n\n/**\n * Upload 컴포넌트 / Upload component\n *\n * 파일을 업로드할 수 있는 컴포넌트입니다.\n * 드래그 앤 드롭, 다중 파일 선택, 파일 크기 제한 등을 지원합니다.\n *\n * Component for uploading files.\n * Supports drag and drop, multiple file selection, file size limits, and more.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Upload\n * onChange={(files) => console.log(files)}\n * />\n *\n * @example\n * // 이미지만, 다중 선택 / Images only, multiple selection\n * <Upload\n * accept=\"image/*\"\n * multiple\n * maxSize={5 * 1024 * 1024} // 5MB\n * maxFiles={5}\n * files={uploadedFiles}\n * onRemove={(file) => handleRemove(file)}\n * />\n *\n * @param {UploadProps} props - Upload 컴포넌트의 props / Upload component props\n * @returns {JSX.Element} Upload 컴포넌트 / Upload component\n */\nexport const Upload = React.forwardRef<HTMLDivElement, UploadProps>(\n (\n {\n files = [],\n onChange,\n onRemove,\n multiple = false,\n accept,\n maxSize,\n maxFiles,\n disabled = false,\n dragDrop = true,\n placeholder = \"파일을 선택하거나 여기에 드래그하세요\",\n size = \"md\",\n dot: dotProp,\n style,\n ...props\n },\n ref,\n ) => {\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = React.useState(false);\n const [isRemoveHovered, setIsRemoveHovered] = React.useState<string | null>(\n null,\n );\n\n const handleFileSelect = (selectedFiles: FileList | null) => {\n if (!selectedFiles || selectedFiles.length === 0) return;\n\n const fileArray = Array.from(selectedFiles);\n\n // 파일 개수 체크\n if (maxFiles && files.length + fileArray.length > maxFiles) {\n alert(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`);\n return;\n }\n\n // 파일 크기 체크\n const validFiles = fileArray.filter((file) => {\n if (maxSize && file.size > maxSize) {\n alert(\n `파일 크기는 ${formatFileSize(maxSize)}를 초과할 수 없습니다: ${file.name}`,\n );\n return false;\n }\n return true;\n });\n\n if (validFiles.length > 0) {\n onChange?.(validFiles);\n }\n };\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n if (!disabled && dragDrop) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled && dragDrop) {\n handleFileSelect(e.dataTransfer.files);\n }\n };\n\n const handleRemove = (file: UploadedFile) => {\n onRemove?.(file);\n };\n\n // Container style\n const containerStyle = useMemo(\n () => mergeStyles({ width: \"100%\" }, resolveDot(dotProp), style),\n [dotProp, style],\n );\n\n // Drop zone style\n const dropZoneStyle = useMemo(\n (): React.CSSProperties => ({\n position: \"relative\",\n border: `2px dashed ${isDragging ? \"var(--upload-dropzone-drag-border)\" : \"var(--upload-dropzone-border)\"}`,\n borderRadius: \"12px\",\n transition: \"all 200ms ease-in-out\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n backgroundColor: isDragging\n ? \"var(--upload-dropzone-drag-bg)\"\n : \"var(--upload-dropzone-bg)\",\n opacity: disabled ? 0.5 : 1,\n ...SIZE_PADDING[size],\n }),\n [isDragging, disabled, size],\n );\n\n // Inner layout style\n const innerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n };\n\n // Icon wrapper style\n const iconWrapStyle = useMemo(\n (): React.CSSProperties => ({\n borderRadius: \"50%\",\n backgroundColor: isDragging\n ? \"var(--upload-icon-wrap-drag-bg)\"\n : \"var(--upload-icon-wrap-bg)\",\n ...resolveDot(\"p-4\"),\n ...resolveDot(\"mb-4\"),\n transition: \"background-color 200ms ease-in-out\",\n }),\n [isDragging],\n );\n\n // Primary text style\n const primaryTextStyle: React.CSSProperties = {\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"var(--color-foreground)\",\n ...resolveDot(\"mb-1\"),\n };\n\n // Hint text style\n const hintTextStyle: React.CSSProperties = {\n fontSize: \"0.75rem\",\n color: \"var(--color-muted-foreground)\",\n };\n\n // File list container style\n const fileListStyle: React.CSSProperties = {\n ...resolveDot(\"mt-4\"),\n display: \"flex\",\n flexDirection: \"column\",\n ...resolveDot(\"gap-2\"),\n };\n\n return (\n <div ref={ref} style={containerStyle} {...props}>\n {/* 업로드 영역 */}\n <div\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n data-dragging={isDragging ? \"true\" : undefined}\n data-disabled={disabled ? \"true\" : undefined}\n data-upload-dropzone=\"true\"\n style={dropZoneStyle}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={(e) => handleFileSelect(e.target.files)}\n style={{ display: \"none\" }}\n aria-label=\"파일 선택\"\n />\n\n <div style={innerStyle}>\n <div style={iconWrapStyle}>\n <Icon\n name=\"upload\"\n size={32}\n variant=\"primary\"\n dot={isDragging ? \"transition-all duration-200\" : undefined}\n />\n </div>\n <p style={primaryTextStyle}>{placeholder}</p>\n <p style={hintTextStyle}>\n {accept && `지원 형식: ${accept}`}\n {maxSize && ` • 최대 크기: ${formatFileSize(maxSize)}`}\n {maxFiles && ` • 최대 ${maxFiles}개`}\n </p>\n </div>\n </div>\n\n {/* 파일 목록 */}\n {files.length > 0 && (\n <div style={fileListStyle}>\n {files.map((file) => {\n const isError = file.status === \"error\";\n const fileRowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n ...resolveDot(\"gap-3\"),\n ...resolveDot(\"p-3\"),\n borderRadius: \"8px\",\n border: `1px solid ${isError ? \"var(--upload-file-error-border)\" : \"var(--upload-file-border)\"}`,\n backgroundColor: isError\n ? \"var(--upload-file-error-bg)\"\n : \"var(--upload-file-bg)\",\n };\n\n const fileIconWrapStyle: React.CSSProperties = {\n flexShrink: 0,\n borderRadius: \"8px\",\n backgroundColor: \"var(--upload-file-icon-bg)\",\n ...resolveDot(\"p-2\"),\n };\n\n const fileInfoStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0,\n };\n\n const fileNameStyle: React.CSSProperties = {\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"var(--color-foreground)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n };\n\n const fileMeta: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n ...resolveDot(\"gap-2\"),\n ...resolveDot(\"mt-1\"),\n };\n\n const fileSizeStyle: React.CSSProperties = {\n fontSize: \"0.75rem\",\n color: \"var(--color-muted-foreground)\",\n };\n\n const removeButtonStyle: React.CSSProperties = {\n flexShrink: 0,\n borderRadius: \"8px\",\n ...resolveDot(\"p-1.5\"),\n border: \"none\",\n cursor: \"pointer\",\n backgroundColor:\n isRemoveHovered === file.id\n ? \"var(--upload-remove-hover-bg)\"\n : \"transparent\",\n transition: \"background-color 150ms ease-in-out\",\n };\n\n return (\n <div key={file.id} style={fileRowStyle}>\n <div style={fileIconWrapStyle}>\n <Icon\n name={getFileIcon(file.type)}\n size={20}\n variant=\"muted\"\n />\n </div>\n\n <div style={fileInfoStyle}>\n <p style={fileNameStyle}>{file.name}</p>\n <div style={fileMeta}>\n <p style={fileSizeStyle}>{formatFileSize(file.size)}</p>\n {file.status === \"uploading\" &&\n file.progress !== undefined && (\n <>\n <div\n style={{\n flex: 1,\n height: \"6px\",\n backgroundColor: \"var(--color-muted)\",\n borderRadius: \"9999px\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n backgroundColor: \"var(--color-primary)\",\n borderRadius: \"9999px\",\n width: `${file.progress}%`,\n transition: \"width 300ms ease-out\",\n }}\n />\n </div>\n <span style={fileSizeStyle}>{file.progress}%</span>\n </>\n )}\n {file.status === \"success\" && (\n <span\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--progress-success)\",\n display: \"flex\",\n alignItems: \"center\",\n ...resolveDot(\"gap-1\"),\n }}\n >\n <Icon name=\"check\" size={12} variant=\"success\" />\n 완료\n </span>\n )}\n {file.status === \"error\" && (\n <span\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-destructive)\",\n }}\n >\n {file.error || \"업로드 실패\"}\n </span>\n )}\n </div>\n </div>\n\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => handleRemove(file)}\n onMouseEnter={() => setIsRemoveHovered(file.id)}\n onMouseLeave={() => setIsRemoveHovered(null)}\n style={removeButtonStyle}\n aria-label=\"파일 제거\"\n >\n <Icon name=\"close\" size={16} variant=\"muted\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n);\n\nUpload.displayName = \"Upload\";\n","\"use client\";\n\nimport React from \"react\";\nimport { Icon } from \"./Icon\";\nimport { Input } from \"./Input\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\n\n/**\n * Autocomplete 옵션 인터페이스 / Autocomplete option interface\n * @typedef {Object} AutocompleteOption\n * @property {string} value - 옵션 값 / Option value\n * @property {string} label - 옵션 라벨 / Option label\n * @property {string} [description] - 옵션 설명 / Option description\n * @property {React.ReactNode} [icon] - 옵션 아이콘 / Option icon\n * @property {Record<string, unknown>} [data] - 추가 데이터 / Additional data\n */\nexport interface AutocompleteOption {\n value: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n data?: Record<string, unknown>;\n}\n\n/**\n * Autocomplete 컴포넌트의 props / Autocomplete component props\n * @typedef {Object} AutocompleteProps\n * @property {AutocompleteOption[]} options - 옵션 목록 / Options list\n * @property {string} [value] - 선택된 값 / Selected value\n * @property {(value: string, option?: AutocompleteOption) => void} [onChange] - 값 변경 핸들러 / Value change handler\n * @property {string} [placeholder=\"검색하거나 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {number} [maxHeight=300] - 드롭다운 최대 높이 (px) / Dropdown max height in px\n * @property {boolean} [clearable=true] - 지우기 버튼 표시 / Show clear button\n * @property {boolean} [filterable=true] - 필터링 활성화 / Enable filtering\n * @property {(query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>} [onSearch] - 검색 핸들러 (비동기 지원) / Search handler (async support)\n * @property {React.ReactNode} [emptyText=\"결과가 없습니다\"] - 빈 결과 텍스트 / Empty result text\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'className'>}\n */\nexport interface AutocompleteProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"className\"\n> {\n options: AutocompleteOption[];\n value?: string;\n onChange?: (value: string, option?: AutocompleteOption) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n loading?: boolean;\n maxHeight?: number;\n clearable?: boolean;\n filterable?: boolean;\n onSearch?: (\n query: string,\n ) => AutocompleteOption[] | Promise<AutocompleteOption[]>;\n emptyText?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n /** dot 유틸리티 스트링 (인라인 스타일로 변환) / dot utility string (converted to inline style) */\n dot?: string;\n /** 추가 인라인 스타일 / Additional inline style */\n style?: React.CSSProperties;\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n};\n\n/**\n * Autocomplete 컴포넌트 / Autocomplete component\n *\n * 자동완성 입력 컴포넌트입니다.\n * 입력하면서 옵션을 필터링하고 선택할 수 있습니다.\n *\n * Autocomplete input component.\n * Filters and selects options as you type.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Autocomplete\n * options={[\n * { value: \"1\", label: \"옵션 1\" },\n * { value: \"2\", label: \"옵션 2\" }\n * ]}\n * onChange={(value) => console.log(value)}\n * />\n *\n * @example\n * // 비동기 검색 / Async search\n * <Autocomplete\n * options={options}\n * onSearch={async (query) => {\n * const results = await searchAPI(query)\n * return results\n * }}\n * loading={isLoading}\n * />\n *\n * @param {AutocompleteProps} props - Autocomplete 컴포넌트의 props / Autocomplete component props\n * @returns {JSX.Element} Autocomplete 컴포넌트 / Autocomplete component\n */\nexport const Autocomplete = React.forwardRef<HTMLDivElement, AutocompleteProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = \"검색하거나 선택하세요\",\n disabled = false,\n error = false,\n loading = false,\n maxHeight = 300,\n clearable = true,\n filterable = true,\n onSearch,\n emptyText = \"결과가 없습니다\",\n size = \"md\",\n dot: dotProp,\n style,\n ...props\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [filteredOptions, setFilteredOptions] =\n React.useState<AutocompleteOption[]>(options);\n const [selectedIndex, setSelectedIndex] = React.useState(-1);\n const [isSearching, setIsSearching] = React.useState(false);\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n const dropdownRef = React.useRef<HTMLDivElement>(null);\n\n const selectedOption = React.useMemo(() => {\n return options.find((opt) => opt.value === value);\n }, [options, value]);\n\n // 초기 입력값 설정\n React.useEffect(() => {\n if (selectedOption) {\n setInputValue(selectedOption.label);\n } else if (!value) {\n setInputValue(\"\");\n }\n }, [selectedOption, value]);\n\n // 옵션 필터링\n React.useEffect(() => {\n if (onSearch) {\n setIsSearching(true);\n const result = onSearch(inputValue);\n if (result instanceof Promise) {\n result.then((filtered) => {\n setFilteredOptions(filtered);\n setIsSearching(false);\n });\n } else {\n setFilteredOptions(result);\n setIsSearching(false);\n }\n } else if (filterable) {\n if (!inputValue.trim()) {\n setFilteredOptions(options);\n } else {\n const filtered = options.filter(\n (option) =>\n option.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.value.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.description\n ?.toLowerCase()\n .includes(inputValue.toLowerCase()),\n );\n setFilteredOptions(filtered);\n }\n } else {\n setFilteredOptions(options);\n }\n }, [inputValue, options, filterable, onSearch]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setIsOpen(true);\n setSelectedIndex(-1);\n\n if (!newValue && clearable) {\n onChange?.(\"\");\n }\n };\n\n const handleInputFocus = () => {\n setIsOpen(true);\n };\n\n const handleInputBlur = (e: React.FocusEvent) => {\n // 드롭다운 클릭 시에는 닫지 않음\n if (dropdownRef.current?.contains(e.relatedTarget as Node)) {\n return;\n }\n setIsOpen(false);\n setSelectedIndex(-1);\n\n // 선택된 옵션이 있으면 그 라벨로 복원\n if (selectedOption) {\n setInputValue(selectedOption.label);\n }\n };\n\n const handleOptionSelect = (option: AutocompleteOption) => {\n setInputValue(option.label);\n onChange?.(option.value, option);\n setIsOpen(false);\n inputRef.current?.blur();\n };\n\n const handleClear = () => {\n setInputValue(\"\");\n onChange?.(\"\");\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || filteredOptions.length === 0) {\n if (e.key === \"ArrowDown\") {\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev,\n );\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1));\n break;\n case \"Enter\":\n e.preventDefault();\n if (selectedIndex >= 0 && filteredOptions[selectedIndex]) {\n handleOptionSelect(filteredOptions[selectedIndex]);\n }\n break;\n case \"Escape\":\n setIsOpen(false);\n inputRef.current?.blur();\n break;\n }\n };\n\n return (\n <div\n ref={ref}\n style={mergeStyles(\n resolveDot(\"relative w-full\"),\n resolveDot(dotProp),\n style,\n )}\n {...props}\n >\n <div style={resolveDot(\"relative\")}>\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error}\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls=\"autocomplete-list\"\n dot={`${sizeClasses[size]} pr-10`}\n />\n\n <div\n style={mergeStyles(resolveDot(\"absolute gap-1\"), {\n right: \"0.75rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n display: \"flex\",\n alignItems: \"center\",\n })}\n >\n {loading || isSearching ? (\n <Icon\n name=\"loader\"\n dot=\"h-4 w-4 animate-spin text-muted-foreground\"\n />\n ) : clearable && inputValue ? (\n <button\n type=\"button\"\n onClick={handleClear}\n style={resolveDot(\"rounded p-1\")}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor =\n \"var(--color-muted)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor = \"\";\n }}\n aria-label=\"지우기\"\n >\n <Icon name=\"close\" dot=\"h-4 w-4 text-muted-foreground\" />\n </button>\n ) : (\n <Icon name=\"chevronDown\" dot=\"h-4 w-4 text-muted-foreground\" />\n )}\n </div>\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n id=\"autocomplete-list\"\n role=\"listbox\"\n style={mergeStyles(\n resolveDot(\n \"absolute z-50 w-full mt-1 rounded-lg border overflow-hidden\",\n ),\n {\n backgroundColor: \"var(--color-popover)\",\n color: \"var(--color-popover-foreground)\",\n borderColor: \"var(--color-border)\",\n boxShadow:\n \"0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)\",\n maxHeight: `${maxHeight}px`,\n },\n )}\n >\n <div style={{ overflowY: \"auto\", maxHeight: `${maxHeight}px` }}>\n {filteredOptions.length === 0 ? (\n <div\n style={mergeStyles(\n resolveDot(\"px-4 py-8 text-center text-sm\"),\n { color: \"var(--color-muted-foreground)\" },\n )}\n >\n {emptyText}\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = selectedIndex === index;\n const isValueSelected = value === option.value;\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isValueSelected}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setSelectedIndex(index)}\n style={mergeStyles(\n resolveDot(\"px-4 py-3 cursor-pointer\"),\n isSelected\n ? {\n backgroundColor:\n \"color-mix(in srgb, var(--color-primary) 10%, transparent)\",\n }\n : undefined,\n isValueSelected\n ? {\n backgroundColor:\n \"color-mix(in srgb, var(--color-primary) 15%, transparent)\",\n }\n : undefined,\n )}\n >\n <div style={resolveDot(\"flex items-center gap-3\")}>\n {option.icon && (\n <div\n style={mergeStyles(resolveDot(\"flex-shrink-0\"), {\n color: \"var(--color-muted-foreground)\",\n })}\n >\n {option.icon}\n </div>\n )}\n <div style={resolveDot(\"flex-1 min-w-0\")}>\n <div style={resolveDot(\"flex items-center gap-2\")}>\n <p\n style={mergeStyles(\n resolveDot(\"text-sm font-medium\"),\n { color: \"var(--color-foreground)\" },\n )}\n >\n {option.label}\n </p>\n {isValueSelected && (\n <Icon\n name=\"check\"\n dot=\"h-4 w-4 flex-shrink-0 text-primary\"\n />\n )}\n </div>\n {option.description && (\n <p\n style={mergeStyles(resolveDot(\"text-xs mt-0.5\"), {\n color: \"var(--color-muted-foreground)\",\n })}\n >\n {option.description}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nAutocomplete.displayName = \"Autocomplete\";\n","\"use client\";\n\n/**\n * ColorPicker 컴포넌트\n *\n * 탭 기반 컬러 피커 (의존성 없음)\n * - Tailwind 탭: Tailwind CSS 프리셋 팔레트\n * - Custom 탭: HSL 슬라이더 + HEX 입력\n *\n * @example\n * ```tsx\n * <ColorPicker value=\"#3b82f6\" onChange={(color) => console.log(color)} />\n * ```\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\n\nexport interface ColorPickerProps {\n /** 현재 색상 값 (HEX 또는 'transparent') */\n value: string;\n /** 색상 변경 콜백 */\n onChange: (color: string) => void;\n /** dot 유틸리티 스타일 */\n dot?: string;\n /** 추가 인라인 스타일 */\n style?: React.CSSProperties;\n /** 비활성화 여부 */\n disabled?: boolean;\n}\n\ntype TabType = \"tailwind\" | \"custom\";\n\n// Tailwind 팔레트 프리셋\nconst TAILWIND_PALETTE = {\n gray: [\n \"#f9fafb\",\n \"#f3f4f6\",\n \"#e5e7eb\",\n \"#d1d5db\",\n \"#9ca3af\",\n \"#6b7280\",\n \"#4b5563\",\n \"#374151\",\n \"#1f2937\",\n \"#111827\",\n ],\n red: [\n \"#fef2f2\",\n \"#fee2e2\",\n \"#fecaca\",\n \"#fca5a5\",\n \"#f87171\",\n \"#ef4444\",\n \"#dc2626\",\n \"#b91c1c\",\n \"#991b1b\",\n \"#7f1d1d\",\n ],\n orange: [\n \"#fff7ed\",\n \"#ffedd5\",\n \"#fed7aa\",\n \"#fdba74\",\n \"#fb923c\",\n \"#f97316\",\n \"#ea580c\",\n \"#c2410c\",\n \"#9a3412\",\n \"#7c2d12\",\n ],\n amber: [\n \"#fffbeb\",\n \"#fef3c7\",\n \"#fde68a\",\n \"#fcd34d\",\n \"#fbbf24\",\n \"#f59e0b\",\n \"#d97706\",\n \"#b45309\",\n \"#92400e\",\n \"#78350f\",\n ],\n yellow: [\n \"#fefce8\",\n \"#fef9c3\",\n \"#fef08a\",\n \"#fde047\",\n \"#facc15\",\n \"#eab308\",\n \"#ca8a04\",\n \"#a16207\",\n \"#854d0e\",\n \"#713f12\",\n ],\n lime: [\n \"#f7fee7\",\n \"#ecfccb\",\n \"#d9f99d\",\n \"#bef264\",\n \"#a3e635\",\n \"#84cc16\",\n \"#65a30d\",\n \"#4d7c0f\",\n \"#3f6212\",\n \"#365314\",\n ],\n green: [\n \"#f0fdf4\",\n \"#dcfce7\",\n \"#bbf7d0\",\n \"#86efac\",\n \"#4ade80\",\n \"#22c55e\",\n \"#16a34a\",\n \"#15803d\",\n \"#166534\",\n \"#14532d\",\n ],\n emerald: [\n \"#ecfdf5\",\n \"#d1fae5\",\n \"#a7f3d0\",\n \"#6ee7b7\",\n \"#34d399\",\n \"#10b981\",\n \"#059669\",\n \"#047857\",\n \"#065f46\",\n \"#064e3b\",\n ],\n teal: [\n \"#f0fdfa\",\n \"#ccfbf1\",\n \"#99f6e4\",\n \"#5eead4\",\n \"#2dd4bf\",\n \"#14b8a6\",\n \"#0d9488\",\n \"#0f766e\",\n \"#115e59\",\n \"#134e4a\",\n ],\n cyan: [\n \"#ecfeff\",\n \"#cffafe\",\n \"#a5f3fc\",\n \"#67e8f9\",\n \"#22d3ee\",\n \"#06b6d4\",\n \"#0891b2\",\n \"#0e7490\",\n \"#155e75\",\n \"#164e63\",\n ],\n sky: [\n \"#f0f9ff\",\n \"#e0f2fe\",\n \"#bae6fd\",\n \"#7dd3fc\",\n \"#38bdf8\",\n \"#0ea5e9\",\n \"#0284c7\",\n \"#0369a1\",\n \"#075985\",\n \"#0c4a6e\",\n ],\n blue: [\n \"#eff6ff\",\n \"#dbeafe\",\n \"#bfdbfe\",\n \"#93c5fd\",\n \"#60a5fa\",\n \"#3b82f6\",\n \"#2563eb\",\n \"#1d4ed8\",\n \"#1e40af\",\n \"#1e3a8a\",\n ],\n indigo: [\n \"#eef2ff\",\n \"#e0e7ff\",\n \"#c7d2fe\",\n \"#a5b4fc\",\n \"#818cf8\",\n \"#6366f1\",\n \"#4f46e5\",\n \"#4338ca\",\n \"#3730a3\",\n \"#312e81\",\n ],\n violet: [\n \"#f5f3ff\",\n \"#ede9fe\",\n \"#ddd6fe\",\n \"#c4b5fd\",\n \"#a78bfa\",\n \"#8b5cf6\",\n \"#7c3aed\",\n \"#6d28d9\",\n \"#5b21b6\",\n \"#4c1d95\",\n ],\n purple: [\n \"#faf5ff\",\n \"#f3e8ff\",\n \"#e9d5ff\",\n \"#d8b4fe\",\n \"#c084fc\",\n \"#a855f7\",\n \"#9333ea\",\n \"#7e22ce\",\n \"#6b21a8\",\n \"#581c87\",\n ],\n fuchsia: [\n \"#fdf4ff\",\n \"#fae8ff\",\n \"#f5d0fe\",\n \"#f0abfc\",\n \"#e879f9\",\n \"#d946ef\",\n \"#c026d3\",\n \"#a21caf\",\n \"#86198f\",\n \"#701a75\",\n ],\n pink: [\n \"#fdf2f8\",\n \"#fce7f3\",\n \"#fbcfe8\",\n \"#f9a8d4\",\n \"#f472b6\",\n \"#ec4899\",\n \"#db2777\",\n \"#be185d\",\n \"#9d174d\",\n \"#831843\",\n ],\n rose: [\n \"#fff1f2\",\n \"#ffe4e6\",\n \"#fecdd3\",\n \"#fda4af\",\n \"#fb7185\",\n \"#f43f5e\",\n \"#e11d48\",\n \"#be123c\",\n \"#9f1239\",\n \"#881337\",\n ],\n};\n\nconst SPECIAL_COLORS = [\"#000000\", \"#ffffff\", \"transparent\"];\n\n// HEX to HSL\nfunction hexToHsl(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [0, 100, 50];\n\n const r = parseInt(result[1], 16) / 255;\n const g = parseInt(result[2], 16) / 255;\n const b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)];\n}\n\n// HSL to HEX\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n// 유효한 색상인지 체크\nfunction isValidColor(color: string): boolean {\n return /^#[0-9A-Fa-f]{6}$/.test(color) || color === \"transparent\";\n}\n\n/**\n * Saturation-Lightness 2D 박스\n */\nfunction SaturationLightnessPicker({\n hue,\n saturation,\n lightness,\n onChange,\n disabled,\n}: {\n hue: number;\n saturation: number;\n lightness: number;\n onChange: (s: number, l: number) => void;\n disabled?: boolean;\n}) {\n const boxRef = useRef<HTMLDivElement>(null);\n const isDragging = useRef(false);\n\n const handleChange = useCallback(\n (clientX: number, clientY: number) => {\n if (!boxRef.current || disabled) return;\n const rect = boxRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (clientY - rect.top) / rect.height));\n const newS = Math.round(x * 100);\n const newL = Math.round((1 - y) * 100);\n onChange(newS, newL);\n },\n [onChange, disabled],\n );\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (disabled) return;\n isDragging.current = true;\n handleChange(e.clientX, e.clientY);\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) handleChange(e.clientX, e.clientY);\n };\n const handleMouseUp = () => {\n isDragging.current = false;\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [handleChange]);\n\n const cursorX = saturation;\n const cursorY = 100 - lightness;\n\n return (\n <div\n ref={boxRef}\n style={mergeStyles(resolveDot(\"rounded-md\"), {\n position: \"relative\",\n width: \"100%\",\n height: \"7rem\",\n overflow: \"hidden\",\n cursor: disabled ? \"not-allowed\" : \"crosshair\",\n opacity: disabled ? 0.5 : 1,\n background: `\n linear-gradient(to top, #000, transparent),\n linear-gradient(to right, #fff, hsl(${hue}, 100%, 50%))\n `,\n })}\n onMouseDown={handleMouseDown}\n >\n <div\n style={{\n position: \"absolute\",\n width: \"1rem\",\n height: \"1rem\",\n transform: \"translate(-50%, -50%)\",\n borderRadius: \"9999px\",\n border: \"2px solid white\",\n boxShadow: \"0 4px 6px -1px rgba(0,0,0,0.1)\",\n pointerEvents: \"none\",\n left: `${cursorX}%`,\n top: `${cursorY}%`,\n background: hslToHex(hue, saturation, lightness),\n }}\n />\n </div>\n );\n}\n\n/**\n * Hue 슬라이더\n */\nfunction HueSlider({\n hue,\n onChange,\n disabled,\n}: {\n hue: number;\n onChange: (h: number) => void;\n disabled?: boolean;\n}) {\n return (\n <div style={{ position: \"relative\" }}>\n {/* Injected style for pseudo-element thumb selectors that cannot be expressed as inline styles */}\n <style\n dangerouslySetInnerHTML={{\n __html: `\n .hua-hue-slider { width: 100%; height: 0.75rem; border-radius: 0.375rem; appearance: none; cursor: pointer; }\n .hua-hue-slider::-webkit-slider-thumb { appearance: none; width: 0.875rem; height: 0.875rem; border-radius: 9999px; background: white; border: 2px solid currentColor; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); cursor: pointer; }\n .hua-hue-slider::-moz-range-thumb { width: 0.875rem; height: 0.875rem; border-radius: 9999px; background: white; border: 2px solid currentColor; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); cursor: pointer; }\n .hua-hue-slider:disabled { opacity: 0.5; cursor: not-allowed; }\n `,\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max=\"360\"\n value={hue}\n disabled={disabled}\n onChange={(e) => onChange(Number(e.target.value))}\n className=\"hua-hue-slider\"\n style={{\n background: `linear-gradient(to right,\n hsl(0, 100%, 50%), hsl(60, 100%, 50%), hsl(120, 100%, 50%),\n hsl(180, 100%, 50%), hsl(240, 100%, 50%), hsl(300, 100%, 50%), hsl(360, 100%, 50%)\n )`,\n color: `hsl(${hue}, 100%, 50%)`,\n }}\n />\n </div>\n );\n}\n\n/**\n * Tailwind 프리셋 탭\n */\nfunction TailwindTab({\n currentColor,\n onColorSelect,\n disabled,\n}: {\n currentColor: string;\n onColorSelect: (color: string) => void;\n disabled?: boolean;\n}) {\n return (\n <div\n style={mergeStyles(resolveDot(\"gap-2\"), {\n display: \"flex\",\n flexDirection: \"column\",\n })}\n >\n {/* 팔레트 그리드 */}\n <div\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.125rem\" }}\n >\n {Object.entries(TAILWIND_PALETTE).map(([colorName, shades]) => (\n <div key={colorName} style={{ display: \"flex\", gap: \"0.125rem\" }}>\n {shades.map((color, idx) => (\n <button\n key={`${colorName}-${idx}`}\n type=\"button\"\n disabled={disabled}\n style={{\n flex: 1,\n aspectRatio: \"1\",\n borderRadius: \"2px\",\n border:\n currentColor.toLowerCase() === color.toLowerCase()\n ? \"1px solid var(--color-ring)\"\n : \"none\",\n background: color,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n outline:\n currentColor.toLowerCase() === color.toLowerCase()\n ? \"1px solid var(--color-ring)\"\n : \"none\",\n outlineOffset:\n currentColor.toLowerCase() === color.toLowerCase()\n ? \"1px\"\n : \"0\",\n transition: \"transform 150ms\",\n }}\n onClick={() => onColorSelect(color)}\n title={`${colorName}-${(idx + 1) * 100}`}\n />\n ))}\n </div>\n ))}\n </div>\n\n {/* 특수 색상 */}\n <div\n style={mergeStyles(resolveDot(\"gap-1 pt-1\"), {\n display: \"flex\",\n borderTop: \"1px solid var(--color-border)\",\n })}\n >\n {SPECIAL_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n disabled={disabled}\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"0.125rem\",\n border:\n \"1px solid color-mix(in srgb, var(--color-border) 50%, transparent)\",\n outline:\n currentColor === color ? \"1px solid var(--color-ring)\" : \"none\",\n outlineOffset: currentColor === color ? \"1px\" : \"0\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n transition: \"transform 150ms\",\n background:\n color === \"transparent\"\n ? \"repeating-conic-gradient(#ccc 0% 25%, transparent 0% 50%) 50% / 8px 8px\"\n : color,\n }}\n onClick={() => onColorSelect(color)}\n title={color}\n />\n ))}\n <span\n style={{\n flex: 1,\n fontSize: \"0.625rem\",\n color: \"var(--color-muted-foreground)\",\n alignSelf: \"center\",\n textAlign: \"right\",\n }}\n >\n Black / White / Transparent\n </span>\n </div>\n </div>\n );\n}\n\n/**\n * Custom 탭 (HSL + HEX)\n */\nfunction CustomTab({\n h,\n s,\n l,\n hexInput,\n onHslChange,\n onHexInputChange,\n disabled,\n}: {\n h: number;\n s: number;\n l: number;\n hexInput: string;\n onHslChange: (h: number, s: number, l: number) => void;\n onHexInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n disabled?: boolean;\n}) {\n const currentColor = hslToHex(h, s, l);\n const isInvalid = !isValidColor(hexInput);\n\n return (\n <div\n style={mergeStyles(resolveDot(\"gap-3\"), {\n display: \"flex\",\n flexDirection: \"column\",\n })}\n >\n {/* Saturation/Lightness 박스 */}\n <SaturationLightnessPicker\n hue={h}\n saturation={s}\n lightness={l}\n onChange={(newS, newL) => onHslChange(h, newS, newL)}\n disabled={disabled}\n />\n\n {/* Hue 슬라이더 */}\n <HueSlider\n hue={h}\n onChange={(newH) => onHslChange(newH, s, l)}\n disabled={disabled}\n />\n\n {/* 프리뷰 + HEX 입력 */}\n <div\n style={mergeStyles(resolveDot(\"gap-2\"), {\n display: \"flex\",\n alignItems: \"center\",\n })}\n >\n <div\n style={mergeStyles(resolveDot(\"rounded-md\"), {\n width: \"2.5rem\",\n height: \"2.5rem\",\n border: \"1px solid var(--color-border)\",\n boxShadow: \"inset 0 2px 4px 0 rgba(0,0,0,0.06)\",\n flexShrink: 0,\n background: currentColor,\n })}\n />\n <input\n type=\"text\"\n value={hexInput}\n onChange={onHexInputChange}\n disabled={disabled}\n style={mergeStyles(resolveDot(\"rounded-md py-2 px-3\"), {\n flex: 1,\n fontSize: \"0.875rem\",\n border: isInvalid\n ? \"1px solid var(--color-destructive)\"\n : \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-background)\",\n fontFamily: \"monospace\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n cursor: disabled ? \"not-allowed\" : \"text\",\n })}\n placeholder=\"#000000\"\n maxLength={7}\n />\n </div>\n\n {/* HSL 값 표시 */}\n <div\n style={mergeStyles(resolveDot(\"gap-2\"), {\n display: \"flex\",\n fontSize: \"0.625rem\",\n color: \"var(--color-muted-foreground)\",\n })}\n >\n <span>H: {h}°</span>\n <span>S: {s}%</span>\n <span>L: {l}%</span>\n </div>\n </div>\n );\n}\n\n/**\n * ColorPicker 컴포넌트\n *\n * 탭 기반 컬러 피커로 Tailwind CSS 프리셋과 커스텀 HSL 피커를 제공합니다.\n */\nexport const ColorPicker = React.forwardRef<HTMLDivElement, ColorPickerProps>(\n ({ value, onChange, dot: dotProp, style, disabled = false }, ref) => {\n const dotStyle = dotProp ? resolveDot(dotProp) : undefined;\n const [activeTab, setActiveTab] = useState<TabType>(\"tailwind\");\n\n // HSL 상태\n const [hue, saturation, lightness] = hexToHsl(value || \"#3b82f6\");\n const [h, setH] = useState(hue);\n const [s, setS] = useState(saturation);\n const [l, setL] = useState(lightness);\n const [hexInput, setHexInput] = useState(value || \"#3b82f6\");\n\n // 외부 value 변경 시 동기화\n useEffect(() => {\n if (isValidColor(value)) {\n const [newH, newS, newL] = hexToHsl(value);\n setH(newH);\n setS(newS);\n setL(newL);\n setHexInput(value);\n }\n }, [value]);\n\n // HSL 변경 핸들러\n const handleHslChange = useCallback(\n (newH: number, newS: number, newL: number) => {\n setH(newH);\n setS(newS);\n setL(newL);\n const hex = hslToHex(newH, newS, newL);\n setHexInput(hex);\n onChange(hex);\n },\n [onChange],\n );\n\n // HEX 입력 핸들러\n const handleHexInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n let hex = e.target.value;\n if (!hex.startsWith(\"#\")) hex = \"#\" + hex;\n setHexInput(hex);\n if (isValidColor(hex)) {\n const [newH, newS, newL] = hexToHsl(hex);\n setH(newH);\n setS(newS);\n setL(newL);\n onChange(hex);\n }\n };\n\n // 프리셋 색상 선택\n const handleColorSelect = (color: string) => {\n if (disabled) return;\n if (color === \"transparent\") {\n setHexInput(\"transparent\");\n onChange(\"transparent\");\n return;\n }\n const [newH, newS, newL] = hexToHsl(color);\n setH(newH);\n setS(newS);\n setL(newL);\n setHexInput(color);\n onChange(color);\n };\n\n const currentColor = hslToHex(h, s, l);\n\n return (\n <div\n ref={ref}\n style={mergeStyles(\n resolveDot(\"gap-2\"),\n { display: \"flex\", flexDirection: \"column\" },\n dotStyle,\n style,\n )}\n >\n {/* 탭 헤더 */}\n <div\n style={mergeStyles(resolveDot(\"gap-1 rounded-md\"), {\n display: \"flex\",\n padding: \"0.125rem\",\n backgroundColor:\n \"color-mix(in srgb, var(--color-muted) 50%, transparent)\",\n })}\n >\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setActiveTab(\"tailwind\")}\n style={mergeStyles(resolveDot(\"py-1 px-2\"), {\n flex: 1,\n fontSize: \"0.75rem\",\n fontWeight: 500,\n borderRadius: \"0.25rem\",\n border: \"none\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n transition: \"colors 150ms\",\n backgroundColor:\n activeTab === \"tailwind\"\n ? \"var(--color-background)\"\n : \"transparent\",\n color:\n activeTab === \"tailwind\"\n ? \"var(--color-foreground)\"\n : \"var(--color-muted-foreground)\",\n boxShadow:\n activeTab === \"tailwind\"\n ? \"0 1px 2px 0 rgba(0,0,0,0.05)\"\n : \"none\",\n opacity: disabled ? 0.5 : 1,\n })}\n >\n Tailwind\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setActiveTab(\"custom\")}\n style={mergeStyles(resolveDot(\"py-1 px-2\"), {\n flex: 1,\n fontSize: \"0.75rem\",\n fontWeight: 500,\n borderRadius: \"0.25rem\",\n border: \"none\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n transition: \"colors 150ms\",\n backgroundColor:\n activeTab === \"custom\"\n ? \"var(--color-background)\"\n : \"transparent\",\n color:\n activeTab === \"custom\"\n ? \"var(--color-foreground)\"\n : \"var(--color-muted-foreground)\",\n boxShadow:\n activeTab === \"custom\"\n ? \"0 1px 2px 0 rgba(0,0,0,0.05)\"\n : \"none\",\n opacity: disabled ? 0.5 : 1,\n })}\n >\n Custom\n </button>\n </div>\n\n {/* 현재 색상 미리보기 */}\n <div\n style={mergeStyles(resolveDot(\"gap-2\"), {\n display: \"flex\",\n alignItems: \"center\",\n padding: \"0 0.25rem\",\n })}\n >\n <div\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"0.25rem\",\n border: \"1px solid var(--color-border)\",\n boxShadow: \"inset 0 2px 4px 0 rgba(0,0,0,0.06)\",\n flexShrink: 0,\n background:\n hexInput === \"transparent\"\n ? \"repeating-conic-gradient(#ccc 0% 25%, transparent 0% 50%) 50% / 8px 8px\"\n : currentColor,\n }}\n />\n <span\n style={{\n fontSize: \"0.75rem\",\n fontFamily: \"monospace\",\n color: \"var(--color-muted-foreground)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {hexInput === \"transparent\" ? \"transparent\" : currentColor}\n </span>\n </div>\n\n {/* 탭 콘텐츠 */}\n {activeTab === \"tailwind\" ? (\n <TailwindTab\n currentColor={hexInput}\n onColorSelect={handleColorSelect}\n disabled={disabled}\n />\n ) : (\n <CustomTab\n h={h}\n s={s}\n l={l}\n hexInput={hexInput}\n onHslChange={handleHslChange}\n onHexInputChange={handleHexInputChange}\n disabled={disabled}\n />\n )}\n </div>\n );\n },\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\nexport default ColorPicker;\n"]}