asterui 0.12.30 → 0.12.31

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 (326) hide show
  1. package/dist/chart.d.ts +2 -0
  2. package/dist/chart.js +5 -0
  3. package/dist/chart.js.map +1 -0
  4. package/dist/{index2.js → components/Affix.js} +1 -1
  5. package/dist/components/Affix.js.map +1 -0
  6. package/dist/{index4.js → components/Alert.js} +1 -1
  7. package/dist/components/Alert.js.map +1 -0
  8. package/dist/{index3.js → components/Anchor.js} +1 -1
  9. package/dist/components/Anchor.js.map +1 -0
  10. package/dist/{index5.js → components/Autocomplete.js} +1 -1
  11. package/dist/components/Autocomplete.js.map +1 -0
  12. package/dist/{index6.js → components/Avatar.js} +1 -1
  13. package/dist/components/Avatar.js.map +1 -0
  14. package/dist/{index7.js → components/Badge.js} +1 -1
  15. package/dist/components/Badge.js.map +1 -0
  16. package/dist/components/Breadcrumb.js +38 -0
  17. package/dist/components/Breadcrumb.js.map +1 -0
  18. package/dist/{index53.js → components/Browser.js} +1 -1
  19. package/dist/components/Browser.js.map +1 -0
  20. package/dist/{index9.js → components/Button.js} +1 -1
  21. package/dist/components/Button.js.map +1 -0
  22. package/dist/{index14.js → components/Card.js} +22 -22
  23. package/dist/{index14.js.map → components/Card.js.map} +1 -1
  24. package/dist/{index17.js → components/Carousel.js} +1 -1
  25. package/dist/components/Carousel.js.map +1 -0
  26. package/dist/{index15.js → components/Cascader.js} +1 -1
  27. package/dist/components/Cascader.js.map +1 -0
  28. package/dist/{index16.js → components/Chart.js} +1 -1
  29. package/dist/components/Chart.js.map +1 -0
  30. package/dist/{index12.js → components/Chat.js} +1 -1
  31. package/dist/{index12.js.map → components/Chat.js.map} +1 -1
  32. package/dist/{index11.js → components/Checkbox.js} +15 -15
  33. package/dist/components/Checkbox.js.map +1 -0
  34. package/dist/{index54.js → components/Code.js} +5 -5
  35. package/dist/{index54.js.map → components/Code.js.map} +1 -1
  36. package/dist/{index18.js → components/Collapse.js} +1 -1
  37. package/dist/components/Collapse.js.map +1 -0
  38. package/dist/{index13.js → components/ColorPicker.js} +1 -1
  39. package/dist/components/ColorPicker.js.map +1 -0
  40. package/dist/{index19.js → components/Container.js} +1 -1
  41. package/dist/components/Container.js.map +1 -0
  42. package/dist/{index20.js → components/ContextMenu.js} +9 -9
  43. package/dist/components/ContextMenu.js.map +1 -0
  44. package/dist/{index10.js → components/CopyButton.js} +2 -2
  45. package/dist/components/CopyButton.js.map +1 -0
  46. package/dist/{index21.js → components/Countdown.js} +1 -1
  47. package/dist/components/Countdown.js.map +1 -0
  48. package/dist/{index22.js → components/DatePicker.js} +2 -2
  49. package/dist/components/DatePicker.js.map +1 -0
  50. package/dist/{index23.js → components/Descriptions.js} +23 -23
  51. package/dist/components/Descriptions.js.map +1 -0
  52. package/dist/{index24.js → components/Diff.js} +1 -1
  53. package/dist/{index24.js.map → components/Diff.js.map} +1 -1
  54. package/dist/{index26.js → components/Divider.js} +1 -1
  55. package/dist/components/Divider.js.map +1 -0
  56. package/dist/{index25.js → components/Dock.js} +1 -1
  57. package/dist/{index25.js.map → components/Dock.js.map} +1 -1
  58. package/dist/{index27.js → components/Drawer.js} +1 -1
  59. package/dist/components/Drawer.js.map +1 -0
  60. package/dist/{index40.js → components/Dropdown.js} +31 -31
  61. package/dist/components/Dropdown.js.map +1 -0
  62. package/dist/{index41.js → components/Empty.js} +1 -1
  63. package/dist/components/Empty.js.map +1 -0
  64. package/dist/{index29.js → components/Fieldset.js} +1 -1
  65. package/dist/components/Fieldset.js.map +1 -0
  66. package/dist/{index30.js → components/FileInput.js} +1 -1
  67. package/dist/components/FileInput.js.map +1 -0
  68. package/dist/{index31.js → components/Filter.js} +1 -1
  69. package/dist/components/Filter.js.map +1 -0
  70. package/dist/{index32.js → components/Flex.js} +1 -1
  71. package/dist/{index32.js.map → components/Flex.js.map} +1 -1
  72. package/dist/{index33.js → components/FloatButton.js} +1 -1
  73. package/dist/components/FloatButton.js.map +1 -0
  74. package/dist/{index34.js → components/Footer.js} +1 -1
  75. package/dist/components/Footer.js.map +1 -0
  76. package/dist/{index35.js → components/Form.js} +1 -1
  77. package/dist/{index35.js.map → components/Form.js.map} +1 -1
  78. package/dist/{index36.js → components/Grid.js} +6 -6
  79. package/dist/{index36.js.map → components/Grid.js.map} +1 -1
  80. package/dist/{index37.js → components/Hero.js} +1 -1
  81. package/dist/{index37.js.map → components/Hero.js.map} +1 -1
  82. package/dist/{index38.js → components/HoverGallery.js} +1 -1
  83. package/dist/components/HoverGallery.js.map +1 -0
  84. package/dist/{index39.js → components/Image.js} +1 -1
  85. package/dist/components/Image.js.map +1 -0
  86. package/dist/{index42.js → components/Input.js} +1 -1
  87. package/dist/components/Input.js.map +1 -0
  88. package/dist/{index43.js → components/InputNumber.js} +1 -1
  89. package/dist/components/InputNumber.js.map +1 -0
  90. package/dist/components/Join.js +18 -0
  91. package/dist/{index44.js.map → components/Join.js.map} +1 -1
  92. package/dist/{index45.js → components/Kbd.js} +1 -1
  93. package/dist/components/Kbd.js.map +1 -0
  94. package/dist/{index46.js → components/Layout.js} +16 -16
  95. package/dist/components/Layout.js.map +1 -0
  96. package/dist/{index47.js → components/List.js} +17 -17
  97. package/dist/{index47.js.map → components/List.js.map} +1 -1
  98. package/dist/{index48.js → components/Loading.js} +1 -1
  99. package/dist/components/Loading.js.map +1 -0
  100. package/dist/{index49.js → components/Mask.js} +1 -1
  101. package/dist/{index49.js.map → components/Mask.js.map} +1 -1
  102. package/dist/{index50.js → components/Masonry.js} +19 -19
  103. package/dist/components/Masonry.js.map +1 -0
  104. package/dist/{index51.js → components/Mention.js} +1 -1
  105. package/dist/components/Mention.js.map +1 -0
  106. package/dist/{index52.js → components/Menu.js} +1 -1
  107. package/dist/{index52.js.map → components/Menu.js.map} +1 -1
  108. package/dist/{index57.js → components/Modal.js} +23 -23
  109. package/dist/components/Modal.js.map +1 -0
  110. package/dist/{index58.js → components/Navbar.js} +1 -1
  111. package/dist/components/Navbar.js.map +1 -0
  112. package/dist/{index59.js → components/Notification.js} +1 -1
  113. package/dist/components/Notification.js.map +1 -0
  114. package/dist/{index60.js → components/OTPInput.js} +1 -1
  115. package/dist/components/OTPInput.js.map +1 -0
  116. package/dist/{index62.js → components/PageLayout.js} +1 -1
  117. package/dist/components/PageLayout.js.map +1 -0
  118. package/dist/{index61.js → components/Pagination.js} +18 -18
  119. package/dist/components/Pagination.js.map +1 -0
  120. package/dist/{index55.js → components/Phone.js} +1 -1
  121. package/dist/components/Phone.js.map +1 -0
  122. package/dist/{index63.js → components/Popconfirm.js} +14 -14
  123. package/dist/components/Popconfirm.js.map +1 -0
  124. package/dist/{index64.js → components/Popover.js} +1 -1
  125. package/dist/components/Popover.js.map +1 -0
  126. package/dist/{index65.js → components/Progress.js} +1 -1
  127. package/dist/components/Progress.js.map +1 -0
  128. package/dist/{index66.js → components/QRCode.js} +1 -1
  129. package/dist/components/QRCode.js.map +1 -0
  130. package/dist/{index68.js → components/RadialProgress.js} +1 -1
  131. package/dist/components/RadialProgress.js.map +1 -0
  132. package/dist/{index67.js → components/Radio.js} +13 -13
  133. package/dist/components/Radio.js.map +1 -0
  134. package/dist/{index69.js → components/Range.js} +1 -1
  135. package/dist/components/Range.js.map +1 -0
  136. package/dist/{index70.js → components/Rating.js} +20 -20
  137. package/dist/components/Rating.js.map +1 -0
  138. package/dist/{index98.js → components/Responsive.js} +2 -2
  139. package/dist/components/Responsive.js.map +1 -0
  140. package/dist/{index71.js → components/Result.js} +1 -1
  141. package/dist/components/Result.js.map +1 -0
  142. package/dist/{index73.js → components/Segmented.js} +1 -1
  143. package/dist/components/Segmented.js.map +1 -0
  144. package/dist/{index72.js → components/Select.js} +1 -1
  145. package/dist/components/Select.js.map +1 -0
  146. package/dist/{index28.js → components/SidebarDrawer.js} +3 -3
  147. package/dist/components/SidebarDrawer.js.map +1 -0
  148. package/dist/{index74.js → components/Skeleton.js} +1 -1
  149. package/dist/components/Skeleton.js.map +1 -0
  150. package/dist/{index75.js → components/Space.js} +10 -10
  151. package/dist/components/Space.js.map +1 -0
  152. package/dist/{index76.js → components/Splitter.js} +22 -22
  153. package/dist/components/Splitter.js.map +1 -0
  154. package/dist/{index77.js → components/Stat.js} +1 -1
  155. package/dist/{index77.js.map → components/Stat.js.map} +1 -1
  156. package/dist/{index78.js → components/Status.js} +1 -1
  157. package/dist/components/Status.js.map +1 -0
  158. package/dist/{index79.js → components/Steps.js} +14 -14
  159. package/dist/components/Steps.js.map +1 -0
  160. package/dist/{index80.js → components/Table.js} +92 -92
  161. package/dist/components/Table.js.map +1 -0
  162. package/dist/components/Tabs.js +83 -0
  163. package/dist/{index81.js.map → components/Tabs.js.map} +1 -1
  164. package/dist/{index84.js → components/Tag.js} +1 -1
  165. package/dist/components/Tag.js.map +1 -0
  166. package/dist/{index83.js → components/TextRotate.js} +1 -1
  167. package/dist/components/TextRotate.js.map +1 -0
  168. package/dist/{index82.js → components/Textarea.js} +1 -1
  169. package/dist/components/Textarea.js.map +1 -0
  170. package/dist/{index85.js → components/ThemeController.js} +1 -1
  171. package/dist/components/ThemeController.js.map +1 -0
  172. package/dist/{index86.js → components/TimePicker.js} +2 -2
  173. package/dist/components/TimePicker.js.map +1 -0
  174. package/dist/{index87.js → components/Timeline.js} +13 -13
  175. package/dist/components/Timeline.js.map +1 -0
  176. package/dist/{index88.js → components/Toggle.js} +1 -1
  177. package/dist/components/Toggle.js.map +1 -0
  178. package/dist/{index90.js → components/Tooltip.js} +1 -1
  179. package/dist/components/Tooltip.js.map +1 -0
  180. package/dist/{index89.js → components/Tour.js} +1 -1
  181. package/dist/{index89.js.map → components/Tour.js.map} +1 -1
  182. package/dist/{index91.js → components/Transfer.js} +1 -1
  183. package/dist/components/Transfer.js.map +1 -0
  184. package/dist/{index92.js → components/Tree.js} +1 -1
  185. package/dist/{index92.js.map → components/Tree.js.map} +1 -1
  186. package/dist/{index93.js → components/TreeSelect.js} +44 -44
  187. package/dist/components/TreeSelect.js.map +1 -0
  188. package/dist/{index94.js → components/Typography.js} +1 -1
  189. package/dist/components/Typography.js.map +1 -0
  190. package/dist/{index95.js → components/Upload.js} +1 -1
  191. package/dist/components/Upload.js.map +1 -0
  192. package/dist/{index96.js → components/VirtualList.js} +2 -2
  193. package/dist/components/VirtualList.js.map +1 -0
  194. package/dist/{index97.js → components/Watermark.js} +1 -1
  195. package/dist/components/Watermark.js.map +1 -0
  196. package/dist/{index56.js → components/Window.js} +1 -1
  197. package/dist/components/Window.js.map +1 -0
  198. package/dist/{index99.js → hooks/useBreakpoint.js} +1 -1
  199. package/dist/hooks/useBreakpoint.js.map +1 -0
  200. package/dist/{index104.js → hooks/useClickOutside.js} +1 -1
  201. package/dist/hooks/useClickOutside.js.map +1 -0
  202. package/dist/{index101.js → hooks/useClipboard.js} +1 -1
  203. package/dist/hooks/useClipboard.js.map +1 -0
  204. package/dist/{index103.js → hooks/useDebounce.js} +1 -1
  205. package/dist/hooks/useDebounce.js.map +1 -0
  206. package/dist/{index100.js → hooks/useDisclosure.js} +1 -1
  207. package/dist/hooks/useDisclosure.js.map +1 -0
  208. package/dist/{index106.js → hooks/useHover.js} +1 -1
  209. package/dist/hooks/useHover.js.map +1 -0
  210. package/dist/{index107.js → hooks/useKeyPress.js} +1 -1
  211. package/dist/hooks/useKeyPress.js.map +1 -0
  212. package/dist/{index102.js → hooks/useLocalStorage.js} +1 -1
  213. package/dist/hooks/useLocalStorage.js.map +1 -0
  214. package/dist/{index105.js → hooks/usePrevious.js} +1 -1
  215. package/dist/hooks/usePrevious.js.map +1 -0
  216. package/dist/{index108.js → hooks/useWindowSize.js} +1 -1
  217. package/dist/hooks/useWindowSize.js.map +1 -0
  218. package/dist/index.d.ts +0 -6
  219. package/dist/index.js +204 -210
  220. package/dist/index.js.map +1 -1
  221. package/dist/qrcode.d.ts +2 -0
  222. package/dist/qrcode.js +5 -0
  223. package/dist/qrcode.js.map +1 -0
  224. package/dist/virtuallist.d.ts +2 -0
  225. package/dist/virtuallist.js +5 -0
  226. package/dist/virtuallist.js.map +1 -0
  227. package/package.json +13 -1
  228. package/dist/index10.js.map +0 -1
  229. package/dist/index100.js.map +0 -1
  230. package/dist/index101.js.map +0 -1
  231. package/dist/index102.js.map +0 -1
  232. package/dist/index103.js.map +0 -1
  233. package/dist/index104.js.map +0 -1
  234. package/dist/index105.js.map +0 -1
  235. package/dist/index106.js.map +0 -1
  236. package/dist/index107.js.map +0 -1
  237. package/dist/index108.js.map +0 -1
  238. package/dist/index109.js +0 -36
  239. package/dist/index109.js.map +0 -1
  240. package/dist/index11.js.map +0 -1
  241. package/dist/index110.js +0 -523
  242. package/dist/index110.js.map +0 -1
  243. package/dist/index111.js +0 -53
  244. package/dist/index111.js.map +0 -1
  245. package/dist/index13.js.map +0 -1
  246. package/dist/index15.js.map +0 -1
  247. package/dist/index16.js.map +0 -1
  248. package/dist/index17.js.map +0 -1
  249. package/dist/index18.js.map +0 -1
  250. package/dist/index19.js.map +0 -1
  251. package/dist/index2.js.map +0 -1
  252. package/dist/index20.js.map +0 -1
  253. package/dist/index21.js.map +0 -1
  254. package/dist/index22.js.map +0 -1
  255. package/dist/index23.js.map +0 -1
  256. package/dist/index26.js.map +0 -1
  257. package/dist/index27.js.map +0 -1
  258. package/dist/index28.js.map +0 -1
  259. package/dist/index29.js.map +0 -1
  260. package/dist/index3.js.map +0 -1
  261. package/dist/index30.js.map +0 -1
  262. package/dist/index31.js.map +0 -1
  263. package/dist/index33.js.map +0 -1
  264. package/dist/index34.js.map +0 -1
  265. package/dist/index38.js.map +0 -1
  266. package/dist/index39.js.map +0 -1
  267. package/dist/index4.js.map +0 -1
  268. package/dist/index40.js.map +0 -1
  269. package/dist/index41.js.map +0 -1
  270. package/dist/index42.js.map +0 -1
  271. package/dist/index43.js.map +0 -1
  272. package/dist/index44.js +0 -18
  273. package/dist/index45.js.map +0 -1
  274. package/dist/index46.js.map +0 -1
  275. package/dist/index48.js.map +0 -1
  276. package/dist/index5.js.map +0 -1
  277. package/dist/index50.js.map +0 -1
  278. package/dist/index51.js.map +0 -1
  279. package/dist/index53.js.map +0 -1
  280. package/dist/index55.js.map +0 -1
  281. package/dist/index56.js.map +0 -1
  282. package/dist/index57.js.map +0 -1
  283. package/dist/index58.js.map +0 -1
  284. package/dist/index59.js.map +0 -1
  285. package/dist/index6.js.map +0 -1
  286. package/dist/index60.js.map +0 -1
  287. package/dist/index61.js.map +0 -1
  288. package/dist/index62.js.map +0 -1
  289. package/dist/index63.js.map +0 -1
  290. package/dist/index64.js.map +0 -1
  291. package/dist/index65.js.map +0 -1
  292. package/dist/index66.js.map +0 -1
  293. package/dist/index67.js.map +0 -1
  294. package/dist/index68.js.map +0 -1
  295. package/dist/index69.js.map +0 -1
  296. package/dist/index7.js.map +0 -1
  297. package/dist/index70.js.map +0 -1
  298. package/dist/index71.js.map +0 -1
  299. package/dist/index72.js.map +0 -1
  300. package/dist/index73.js.map +0 -1
  301. package/dist/index74.js.map +0 -1
  302. package/dist/index75.js.map +0 -1
  303. package/dist/index76.js.map +0 -1
  304. package/dist/index78.js.map +0 -1
  305. package/dist/index79.js.map +0 -1
  306. package/dist/index8.js +0 -38
  307. package/dist/index8.js.map +0 -1
  308. package/dist/index80.js.map +0 -1
  309. package/dist/index81.js +0 -83
  310. package/dist/index82.js.map +0 -1
  311. package/dist/index83.js.map +0 -1
  312. package/dist/index84.js.map +0 -1
  313. package/dist/index85.js.map +0 -1
  314. package/dist/index86.js.map +0 -1
  315. package/dist/index87.js.map +0 -1
  316. package/dist/index88.js.map +0 -1
  317. package/dist/index9.js.map +0 -1
  318. package/dist/index90.js.map +0 -1
  319. package/dist/index91.js.map +0 -1
  320. package/dist/index93.js.map +0 -1
  321. package/dist/index94.js.map +0 -1
  322. package/dist/index95.js.map +0 -1
  323. package/dist/index96.js.map +0 -1
  324. package/dist/index97.js.map +0 -1
  325. package/dist/index98.js.map +0 -1
  326. package/dist/index99.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cascader.js","sources":["../../src/components/Cascader.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, useId, forwardRef, useMemo } from 'react'\n\nexport interface CascaderOption {\n value: string\n label: React.ReactNode\n disabled?: boolean\n children?: CascaderOption[]\n isLeaf?: boolean\n}\n\nexport type CascaderColor = 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\nexport type CascaderSize = 'xs' | 'sm' | 'md' | 'lg'\n\nexport interface CascaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Hierarchical options data */\n options: CascaderOption[]\n /** Controlled selected value path */\n value?: string[]\n /** Default selected value path (uncontrolled) */\n defaultValue?: string[]\n /** Callback when selection changes */\n onChange?: (value: string[], selectedOptions: CascaderOption[]) => void\n /** Placeholder text */\n placeholder?: string\n /** Disable the cascader */\n disabled?: boolean\n /** Show clear button */\n allowClear?: boolean\n /** How to expand sub-menus */\n expandTrigger?: 'click' | 'hover'\n /** Allow selection of any level, not just leaf nodes */\n changeOnSelect?: boolean\n /** Custom display render function */\n displayRender?: (labels: React.ReactNode[], selectedOptions: CascaderOption[]) => React.ReactNode\n /** Input size */\n size?: CascaderSize\n /** Focus ring color */\n color?: CascaderColor\n /** Validation status */\n status?: 'error' | 'warning'\n /** Enable search/filter functionality */\n showSearch?: boolean | {\n filter?: (inputValue: string, path: CascaderOption[]) => boolean\n render?: (inputValue: string, path: CascaderOption[]) => React.ReactNode\n matchInputWidth?: boolean\n }\n /** Content when no results found */\n notFoundContent?: React.ReactNode\n /** Async data loading function */\n loadData?: (selectedOptions: CascaderOption[]) => Promise<void>\n /** Custom field names for data mapping */\n fieldNames?: {\n label?: string\n value?: string\n children?: string\n }\n /** Controlled open state */\n open?: boolean\n /** Callback when dropdown visibility changes */\n onDropdownVisibleChange?: (open: boolean) => void\n /** Class name for dropdown */\n popupClassName?: string\n /** Custom dropdown render wrapper */\n dropdownRender?: (menu: React.ReactNode) => React.ReactNode\n /** Multiple selection mode */\n multiple?: boolean\n /** Max tags to show in multiple mode */\n maxTagCount?: number | 'responsive'\n /** Accessible label */\n 'aria-label'?: string\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\n// Helper to get nested value using field names\nfunction getFieldValue<T>(option: Record<string, unknown>, field: string, fallback: string): T {\n return (option[field] ?? option[fallback]) as T\n}\n\nexport const Cascader = forwardRef<HTMLDivElement, CascaderProps>(({\n options,\n value,\n defaultValue,\n onChange,\n placeholder = 'Please select',\n disabled = false,\n allowClear = true,\n expandTrigger = 'click',\n changeOnSelect = false,\n displayRender,\n size = 'md',\n color,\n status,\n showSearch = false,\n notFoundContent = 'No results found',\n loadData,\n fieldNames,\n open: controlledOpen,\n onDropdownVisibleChange,\n popupClassName = '',\n dropdownRender,\n multiple = false,\n maxTagCount,\n className = '',\n 'aria-label': ariaLabel,\n 'data-testid': testId,\n ...rest\n}, ref) => {\n const baseTestId = testId ?? 'cascader'\n const isControlledOpen = controlledOpen !== undefined\n const [internalOpen, setInternalOpen] = useState(false)\n const isOpen = isControlledOpen ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean) => {\n if (!isControlledOpen) {\n setInternalOpen(open)\n }\n onDropdownVisibleChange?.(open)\n }, [isControlledOpen, onDropdownVisibleChange])\n\n const [selectedPath, setSelectedPath] = useState<string[]>(value ?? defaultValue ?? [])\n const [selectedPaths, setSelectedPaths] = useState<string[][]>(\n value ? [value] : defaultValue ? [defaultValue] : []\n )\n const [hoveredPath, setHoveredPath] = useState<string[]>([])\n const [focusedIndex, setFocusedIndex] = useState<{ column: number; row: number }>({ column: 0, row: 0 })\n const [searchValue, setSearchValue] = useState('')\n const [loadingKeys, setLoadingKeys] = useState<Set<string>>(new Set())\n\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Field name mapping\n const labelField = fieldNames?.label ?? 'label'\n const valueField = fieldNames?.value ?? 'value'\n const childrenField = fieldNames?.children ?? 'children'\n\n // Normalize options with field names\n const normalizeOption = useCallback((opt: Record<string, unknown>): CascaderOption => ({\n value: getFieldValue<string>(opt, valueField, 'value'),\n label: getFieldValue<React.ReactNode>(opt, labelField, 'label'),\n disabled: opt.disabled as boolean | undefined,\n isLeaf: opt.isLeaf as boolean | undefined,\n children: opt[childrenField]\n ? (opt[childrenField] as Record<string, unknown>[]).map(normalizeOption)\n : undefined,\n }), [labelField, valueField, childrenField])\n\n const normalizedOptions = useMemo(() =>\n options.map(opt => normalizeOption(opt as unknown as Record<string, unknown>)),\n [options, normalizeOption]\n )\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setSelectedPath(value)\n if (multiple) {\n setSelectedPaths([value])\n }\n }\n }, [value, multiple])\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n setHoveredPath([])\n setSearchValue('')\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Get options at each level based on path\n const getOptionsAtLevel = useCallback((level: number, path: string[]): CascaderOption[] => {\n if (level === 0) return normalizedOptions\n\n let currentOptions = normalizedOptions\n for (let i = 0; i < level; i++) {\n const selected = currentOptions.find(opt => opt.value === path[i])\n if (!selected?.children) return []\n currentOptions = selected.children\n }\n return currentOptions\n }, [normalizedOptions])\n\n // Get selected options objects from path\n const getSelectedOptions = useCallback((path: string[]): CascaderOption[] => {\n const result: CascaderOption[] = []\n let currentOptions = normalizedOptions\n\n for (const val of path) {\n const found = currentOptions.find(opt => opt.value === val)\n if (!found) break\n result.push(found)\n currentOptions = found.children || []\n }\n\n return result\n }, [normalizedOptions])\n\n // Get all paths for search\n const getAllPaths = useCallback((): { path: CascaderOption[]; values: string[] }[] => {\n const paths: { path: CascaderOption[]; values: string[] }[] = []\n\n const traverse = (opts: CascaderOption[], currentPath: CascaderOption[], currentValues: string[]) => {\n for (const opt of opts) {\n const newPath = [...currentPath, opt]\n const newValues = [...currentValues, opt.value]\n\n if (!opt.children || opt.children.length === 0) {\n paths.push({ path: newPath, values: newValues })\n } else {\n if (changeOnSelect) {\n paths.push({ path: newPath, values: newValues })\n }\n traverse(opt.children, newPath, newValues)\n }\n }\n }\n\n traverse(normalizedOptions, [], [])\n return paths\n }, [normalizedOptions, changeOnSelect])\n\n // Filter paths for search\n const filteredPaths = useMemo(() => {\n if (!showSearch || !searchValue.trim()) return null\n\n const allPaths = getAllPaths()\n const searchLower = searchValue.toLowerCase()\n\n const filterFn = typeof showSearch === 'object' && showSearch.filter\n ? showSearch.filter\n : (inputValue: string, path: CascaderOption[]) =>\n path.some(opt =>\n String(opt.label).toLowerCase().includes(inputValue.toLowerCase())\n )\n\n return allPaths.filter(({ path }) => filterFn(searchLower, path))\n }, [showSearch, searchValue, getAllPaths])\n\n // Determine which path to use for displaying columns\n const activePath = isOpen ? (hoveredPath.length > 0 ? hoveredPath : selectedPath) : selectedPath\n\n // Build columns to display (only when not searching)\n const columns: CascaderOption[][] = useMemo(() => {\n if (filteredPaths) return []\n\n const cols: CascaderOption[][] = []\n cols.push(normalizedOptions)\n\n for (let i = 0; i < activePath.length; i++) {\n const nextOptions = getOptionsAtLevel(i + 1, activePath)\n if (nextOptions.length > 0) {\n cols.push(nextOptions)\n }\n }\n return cols\n }, [filteredPaths, normalizedOptions, activePath, getOptionsAtLevel])\n\n const handleOptionClick = async (option: CascaderOption, level: number) => {\n if (option.disabled) return\n\n const newPath = [...activePath.slice(0, level), option.value]\n const selectedOpts = getSelectedOptions(newPath)\n\n // Handle async loading\n if (loadData && !option.children && !option.isLeaf) {\n const key = option.value\n if (!loadingKeys.has(key)) {\n setLoadingKeys(prev => new Set(prev).add(key))\n try {\n await loadData(selectedOpts)\n } finally {\n setLoadingKeys(prev => {\n const next = new Set(prev)\n next.delete(key)\n return next\n })\n }\n }\n setHoveredPath(newPath)\n return\n }\n\n if (option.children && option.children.length > 0) {\n // Has children - expand\n setHoveredPath(newPath)\n\n if (changeOnSelect) {\n // In changeOnSelect mode, also select this node\n setSelectedPath(newPath)\n onChange?.(newPath, selectedOpts)\n }\n } else {\n // Leaf node - select and close\n if (multiple) {\n const pathStr = newPath.join('/')\n const isSelected = selectedPaths.some(p => p.join('/') === pathStr)\n let newPaths: string[][]\n if (isSelected) {\n newPaths = selectedPaths.filter(p => p.join('/') !== pathStr)\n } else {\n newPaths = [...selectedPaths, newPath]\n }\n setSelectedPaths(newPaths)\n // Don't close in multiple mode\n } else {\n setSelectedPath(newPath)\n setIsOpen(false)\n setHoveredPath([])\n setSearchValue('')\n onChange?.(newPath, selectedOpts)\n }\n }\n }\n\n const handleSearchResultClick = (values: string[], path: CascaderOption[]) => {\n if (multiple) {\n const pathStr = values.join('/')\n const isSelected = selectedPaths.some(p => p.join('/') === pathStr)\n let newPaths: string[][]\n if (isSelected) {\n newPaths = selectedPaths.filter(p => p.join('/') !== pathStr)\n } else {\n newPaths = [...selectedPaths, values]\n }\n setSelectedPaths(newPaths)\n } else {\n setSelectedPath(values)\n setIsOpen(false)\n setSearchValue('')\n onChange?.(values, path)\n }\n }\n\n const handleOptionHover = (option: CascaderOption, level: number) => {\n if (expandTrigger !== 'hover' || option.disabled) return\n\n const newPath = [...activePath.slice(0, level), option.value]\n setHoveredPath(newPath)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (multiple) {\n setSelectedPaths([])\n onChange?.([], [])\n } else {\n setSelectedPath([])\n onChange?.([], [])\n }\n }\n\n const handleRemoveTag = (pathToRemove: string[], e: React.MouseEvent) => {\n e.stopPropagation()\n const pathStr = pathToRemove.join('/')\n const newPaths = selectedPaths.filter(p => p.join('/') !== pathStr)\n setSelectedPaths(newPaths)\n if (newPaths.length > 0) {\n onChange?.(newPaths[newPaths.length - 1], getSelectedOptions(newPaths[newPaths.length - 1]))\n } else {\n onChange?.([], [])\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault()\n if (!isOpen) {\n setIsOpen(true)\n } else if (filteredPaths && filteredPaths.length > 0) {\n const { values, path } = filteredPaths[focusedIndex.row] || {}\n if (values) {\n handleSearchResultClick(values, path)\n }\n } else {\n const currentColumn = columns[focusedIndex.column]\n if (currentColumn) {\n const option = currentColumn[focusedIndex.row]\n if (option) {\n handleOptionClick(option, focusedIndex.column)\n }\n }\n }\n break\n case ' ':\n if (!showSearch) {\n e.preventDefault()\n setIsOpen(!isOpen)\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n setHoveredPath([])\n setSearchValue('')\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!isOpen) {\n setIsOpen(true)\n } else if (filteredPaths) {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.min(prev.row + 1, filteredPaths.length - 1)\n }))\n } else {\n const currentColumn = columns[focusedIndex.column]\n if (currentColumn) {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.min(prev.row + 1, currentColumn.length - 1)\n }))\n }\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (filteredPaths) {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.max(prev.row - 1, 0)\n }))\n } else {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.max(prev.row - 1, 0)\n }))\n }\n break\n case 'ArrowRight':\n e.preventDefault()\n if (!filteredPaths && focusedIndex.column < columns.length - 1) {\n setFocusedIndex(prev => ({\n column: prev.column + 1,\n row: 0\n }))\n }\n break\n case 'ArrowLeft':\n e.preventDefault()\n if (!filteredPaths && focusedIndex.column > 0) {\n setFocusedIndex(prev => ({\n column: prev.column - 1,\n row: 0\n }))\n }\n break\n case 'Home':\n e.preventDefault()\n setFocusedIndex(prev => ({ ...prev, row: 0 }))\n break\n case 'End':\n e.preventDefault()\n if (filteredPaths) {\n setFocusedIndex(prev => ({ ...prev, row: filteredPaths.length - 1 }))\n } else {\n const currentColumn = columns[focusedIndex.column]\n if (currentColumn) {\n setFocusedIndex(prev => ({ ...prev, row: currentColumn.length - 1 }))\n }\n }\n break\n }\n }\n\n // Reset focus when dropdown opens/closes\n useEffect(() => {\n if (isOpen) {\n setFocusedIndex({ column: 0, row: 0 })\n }\n }, [isOpen])\n\n // Display value\n const selectedOptions = getSelectedOptions(selectedPath)\n const labels = selectedOptions.map(opt => opt.label)\n const displayValue = displayRender\n ? displayRender(labels, selectedOptions)\n : labels.join(' / ')\n\n // Size classes\n const sizeClasses: Record<CascaderSize, string> = {\n xs: 'input-xs text-xs min-h-6',\n sm: 'input-sm text-sm min-h-8',\n md: 'input-md min-h-10',\n lg: 'input-lg text-lg min-h-12',\n }\n\n const dropdownSizeClasses: Record<CascaderSize, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n }\n\n // Color and status classes\n const colorClasses: Record<CascaderColor, string> = {\n primary: 'border-primary focus:border-primary',\n secondary: 'border-secondary focus:border-secondary',\n accent: 'border-accent focus:border-accent',\n info: 'border-info focus:border-info',\n success: 'border-success focus:border-success',\n warning: 'border-warning focus:border-warning',\n error: 'border-error focus:border-error',\n }\n\n const getColorClass = () => {\n if (status === 'error') return 'input-error'\n if (status === 'warning') return 'input-warning'\n if (color && isOpen) return colorClasses[color]\n if (isOpen) return 'input-primary'\n return ''\n }\n\n const getOptionId = (colIndex: number, optIndex: number) =>\n `${baseId}-option-${colIndex}-${optIndex}`\n\n const getSearchOptionId = (index: number) =>\n `${baseId}-search-option-${index}`\n\n // Render tags for multiple mode\n const renderTags = () => {\n const paths = selectedPaths\n const displayPaths = maxTagCount === 'responsive' || typeof maxTagCount === 'number'\n ? paths.slice(0, typeof maxTagCount === 'number' ? maxTagCount : 3)\n : paths\n const hiddenCount = paths.length - displayPaths.length\n\n return (\n <div className=\"flex flex-wrap gap-1 flex-1\">\n {displayPaths.map((path) => {\n const opts = getSelectedOptions(path)\n const label = opts.map(o => o.label).join(' / ')\n return (\n <span\n key={path.join('/')}\n className=\"badge badge-sm gap-1\"\n >\n {label}\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-circle w-3 h-3 min-h-0\"\n onClick={(e) => handleRemoveTag(path, e)}\n aria-label={`Remove ${label}`}\n >\n <svg className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n )\n })}\n {hiddenCount > 0 && (\n <span className=\"badge badge-sm\">+{hiddenCount}</span>\n )}\n </div>\n )\n }\n\n // Render search results\n const renderSearchResults = () => {\n if (!filteredPaths) return null\n\n if (filteredPaths.length === 0) {\n return (\n <div className=\"p-4 text-center text-base-content/50\">\n {notFoundContent}\n </div>\n )\n }\n\n const renderFn = typeof showSearch === 'object' && showSearch.render\n ? showSearch.render\n : null\n\n return (\n <ul role=\"listbox\" className=\"max-h-[200px] overflow-y-auto py-1\">\n {filteredPaths.map(({ path, values }, index) => {\n const isSelected = multiple\n ? selectedPaths.some(p => p.join('/') === values.join('/'))\n : selectedPath.join('/') === values.join('/')\n const isFocused = focusedIndex.row === index\n\n return (\n <li\n key={values.join('/')}\n id={getSearchOptionId(index)}\n role=\"option\"\n aria-selected={isSelected}\n data-testid={`${baseTestId}-search-option-${values.join('-')}`}\n data-state={isSelected ? 'selected' : undefined}\n className={`px-3 py-2 cursor-pointer ${\n isSelected\n ? 'bg-primary text-primary-content'\n : isFocused\n ? 'bg-base-200'\n : 'hover:bg-base-200'\n }`}\n onClick={() => handleSearchResultClick(values, path)}\n >\n {renderFn\n ? renderFn(searchValue, path)\n : path.map(opt => opt.label).join(' / ')\n }\n </li>\n )\n })}\n </ul>\n )\n }\n\n // Render dropdown content\n const renderDropdownContent = () => {\n const content = filteredPaths ? renderSearchResults() : (\n <div className=\"flex\">\n {columns.map((columnOptions, colIndex) => (\n <ul\n key={colIndex}\n role=\"listbox\"\n aria-label={`Level ${colIndex + 1} options`}\n className={`min-w-[120px] max-h-[200px] overflow-y-auto py-1 ${\n colIndex > 0 ? 'border-l border-base-300' : ''\n }`}\n >\n {columnOptions.map((option, optIndex) => {\n const isSelected = selectedPath[colIndex] === option.value\n const isHovered = activePath[colIndex] === option.value\n const hasChildren = option.children && option.children.length > 0\n const isLoading = loadingKeys.has(option.value)\n const isFocused = focusedIndex.column === colIndex && focusedIndex.row === optIndex\n const optionId = getOptionId(colIndex, optIndex)\n\n return (\n <li\n key={option.value}\n id={optionId}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-testid={`${baseTestId}-option-${option.value}`}\n data-state={isSelected ? 'selected' : isHovered ? 'hovered' : undefined}\n data-value={option.value}\n className={`px-3 py-2 cursor-pointer flex items-center justify-between gap-2 ${\n option.disabled\n ? 'text-base-content/30 cursor-not-allowed'\n : isSelected\n ? 'bg-primary text-primary-content'\n : isFocused\n ? 'bg-base-200'\n : isHovered\n ? 'bg-base-200'\n : 'hover:bg-base-200'\n }`}\n onClick={() => handleOptionClick(option, colIndex)}\n onMouseEnter={() => handleOptionHover(option, colIndex)}\n >\n <span>{option.label}</span>\n {isLoading ? (\n <span className=\"loading loading-spinner loading-xs\" />\n ) : hasChildren ? (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n ) : null}\n </li>\n )\n })}\n </ul>\n ))}\n </div>\n )\n\n return dropdownRender ? dropdownRender(content) : content\n }\n\n // Get active descendant ID\n const getActiveDescendant = () => {\n if (!isOpen) return undefined\n if (filteredPaths) {\n return getSearchOptionId(focusedIndex.row)\n }\n return getOptionId(focusedIndex.column, focusedIndex.row)\n }\n\n const hasValue = multiple ? selectedPaths.length > 0 : selectedPath.length > 0\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={`relative inline-block w-full ${className}`}\n data-testid={baseTestId}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n {/* Input/Trigger */}\n <div\n id={inputId}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-activedescendant={getActiveDescendant()}\n aria-label={ariaLabel}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n className={`input w-full flex items-center justify-between cursor-pointer gap-1 ${sizeClasses[size]} ${\n disabled ? 'input-disabled cursor-not-allowed' : ''\n } ${getColorClass()}`}\n onClick={() => {\n if (!disabled) {\n setIsOpen(!isOpen)\n if (showSearch && !isOpen) {\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n }\n }}\n onKeyDown={handleKeyDown}\n >\n {multiple && selectedPaths.length > 0 ? (\n renderTags()\n ) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"flex-1 bg-transparent outline-none min-w-[50px]\"\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n placeholder={hasValue ? String(displayValue) : placeholder}\n aria-label=\"Search options\"\n />\n ) : (\n <span className={`flex-1 truncate ${!hasValue ? 'text-base-content/50' : ''}`}>\n {hasValue ? displayValue : placeholder}\n </span>\n )}\n <div className=\"flex items-center gap-1 shrink-0\">\n {allowClear && hasValue && !disabled && (\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-circle\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n data-testid={`${baseTestId}-clear`}\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n <svg\n className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n ref={dropdownRef}\n id={listboxId}\n className={`absolute z-50 mt-1 bg-base-100 border border-base-300 rounded-lg shadow-lg ${dropdownSizeClasses[size]} ${popupClassName}`}\n data-testid={`${baseTestId}-dropdown`}\n >\n {renderDropdownContent()}\n </div>\n )}\n </div>\n )\n})\n\nCascader.displayName = 'Cascader'\n"],"names":["getFieldValue","option","field","fallback","Cascader","forwardRef","options","value","defaultValue","onChange","placeholder","disabled","allowClear","expandTrigger","changeOnSelect","displayRender","size","color","status","showSearch","notFoundContent","loadData","fieldNames","controlledOpen","onDropdownVisibleChange","popupClassName","dropdownRender","multiple","maxTagCount","className","ariaLabel","testId","rest","ref","baseTestId","isControlledOpen","internalOpen","setInternalOpen","useState","isOpen","setIsOpen","useCallback","open","selectedPath","setSelectedPath","selectedPaths","setSelectedPaths","hoveredPath","setHoveredPath","focusedIndex","setFocusedIndex","searchValue","setSearchValue","loadingKeys","setLoadingKeys","containerRef","useRef","inputRef","dropdownRef","baseId","useId","inputId","listboxId","labelField","valueField","childrenField","normalizeOption","opt","normalizedOptions","useMemo","useEffect","handleClickOutside","e","getOptionsAtLevel","level","path","currentOptions","i","selected","getSelectedOptions","result","val","found","getAllPaths","paths","traverse","opts","currentPath","currentValues","newPath","newValues","filteredPaths","allPaths","searchLower","filterFn","inputValue","activePath","columns","cols","nextOptions","handleOptionClick","selectedOpts","key","prev","next","pathStr","isSelected","p","newPaths","handleSearchResultClick","values","handleOptionHover","handleClear","handleRemoveTag","pathToRemove","handleKeyDown","currentColumn","selectedOptions","labels","displayValue","sizeClasses","dropdownSizeClasses","colorClasses","getColorClass","getOptionId","colIndex","optIndex","getSearchOptionId","index","renderTags","displayPaths","hiddenCount","jsxs","label","o","jsx","renderSearchResults","renderFn","isFocused","renderDropdownContent","content","columnOptions","isHovered","hasChildren","isLoading","optionId","getActiveDescendant","hasValue","node"],"mappings":";;AA2EA,SAASA,GAAiBC,GAAiCC,GAAeC,GAAqB;AAC7F,SAAQF,EAAOC,CAAK,KAAKD,EAAOE,CAAQ;AAC1C;AAEO,MAAMC,KAAWC,GAA0C,CAAC;AAAA,EACjE,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,UAAAC,IAAW;AAAA,EACX,YAAAC,KAAa;AAAA,EACb,eAAAC,KAAgB;AAAA,EAChB,gBAAAC,IAAiB;AAAA,EACjB,eAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,iBAAAC,KAAkB;AAAA,EAClB,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,MAAMC;AAAA,EACN,yBAAAC;AAAA,EACA,gBAAAC,KAAiB;AAAA,EACjB,gBAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC;AAAA,EACA,WAAAC,KAAY;AAAA,EACZ,cAAcC;AAAA,EACd,eAAeC;AAAA,EACf,GAAGC;AACL,GAAGC,MAAQ;AACT,QAAMC,IAAaH,MAAU,YACvBI,IAAmBZ,OAAmB,QACtC,CAACa,IAAcC,EAAe,IAAIC,EAAS,EAAK,GAChDC,IAASJ,IAAmBZ,KAAiBa,IAE7CI,IAAYC,EAAY,CAACC,MAAkB;AAC/C,IAAKP,KACHE,GAAgBK,CAAI,GAEtBlB,KAA0BkB,CAAI;AAAA,EAChC,GAAG,CAACP,GAAkBX,EAAuB,CAAC,GAExC,CAACmB,GAAcC,CAAe,IAAIN,EAAmB/B,KAASC,KAAgB,EAAE,GAChF,CAACqC,GAAeC,CAAgB,IAAIR;AAAA,IACxC/B,IAAQ,CAACA,CAAK,IAAIC,IAAe,CAACA,CAAY,IAAI,CAAA;AAAA,EAAC,GAE/C,CAACuC,IAAaC,CAAc,IAAIV,EAAmB,CAAA,CAAE,GACrD,CAACW,GAAcC,CAAe,IAAIZ,EAA0C,EAAE,QAAQ,GAAG,KAAK,GAAG,GACjG,CAACa,GAAaC,CAAc,IAAId,EAAS,EAAE,GAC3C,CAACe,IAAaC,EAAc,IAAIhB,EAAsB,oBAAI,KAAK,GAE/DiB,IAAeC,EAAuB,IAAI,GAC1CC,KAAWD,EAAyB,IAAI,GACxCE,KAAcF,EAAuB,IAAI,GACzCG,IAASC,GAAA,GACTC,KAAU,GAAGF,CAAM,UACnBG,KAAY,GAAGH,CAAM,YAGrBI,KAAazC,GAAY,SAAS,SAClC0C,KAAa1C,GAAY,SAAS,SAClC2C,IAAgB3C,GAAY,YAAY,YAGxC4C,IAAkBzB,EAAY,CAAC0B,OAAkD;AAAA,IACrF,OAAOnE,GAAsBmE,GAAKH,IAAY,OAAO;AAAA,IACrD,OAAOhE,GAA+BmE,GAAKJ,IAAY,OAAO;AAAA,IAC9D,UAAUI,EAAI;AAAA,IACd,QAAQA,EAAI;AAAA,IACZ,UAAUA,EAAIF,CAAa,IACtBE,EAAIF,CAAa,EAAgC,IAAIC,CAAe,IACrE;AAAA,EAAA,IACF,CAACH,IAAYC,IAAYC,CAAa,CAAC,GAErCG,IAAoBC;AAAA,IAAQ,MAChC/D,EAAQ,IAAI,CAAA6D,MAAOD,EAAgBC,CAAyC,CAAC;AAAA,IAC7E,CAAC7D,GAAS4D,CAAe;AAAA,EAAA;AAI3B,EAAAI,EAAU,MAAM;AACd,IAAI/D,MAAU,WACZqC,EAAgBrC,CAAK,GACjBoB,KACFmB,EAAiB,CAACvC,CAAK,CAAC;AAAA,EAG9B,GAAG,CAACA,GAAOoB,CAAQ,CAAC,GAGpB2C,EAAU,MAAM;AACd,UAAMC,IAAqB,CAACC,MAAkB;AAC5C,MAAIjB,EAAa,WAAW,CAACA,EAAa,QAAQ,SAASiB,EAAE,MAAc,MACzEhC,EAAU,EAAK,GACfQ,EAAe,CAAA,CAAE,GACjBI,EAAe,EAAE;AAAA,IAErB;AAEA,QAAIb;AACF,sBAAS,iBAAiB,aAAagC,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAE7E,GAAG,CAAChC,GAAQC,CAAS,CAAC;AAGtB,QAAMiC,KAAoBhC,EAAY,CAACiC,GAAeC,MAAqC;AACzF,QAAID,MAAU,EAAG,QAAON;AAExB,QAAIQ,IAAiBR;AACrB,aAASS,IAAI,GAAGA,IAAIH,GAAOG,KAAK;AAC9B,YAAMC,IAAWF,EAAe,KAAK,CAAAT,MAAOA,EAAI,UAAUQ,EAAKE,CAAC,CAAC;AACjE,UAAI,CAACC,GAAU,SAAU,QAAO,CAAA;AAChC,MAAAF,IAAiBE,EAAS;AAAA,IAC5B;AACA,WAAOF;AAAA,EACT,GAAG,CAACR,CAAiB,CAAC,GAGhBW,IAAqBtC,EAAY,CAACkC,MAAqC;AAC3E,UAAMK,IAA2B,CAAA;AACjC,QAAIJ,IAAiBR;AAErB,eAAWa,KAAON,GAAM;AACtB,YAAMO,IAAQN,EAAe,KAAK,CAAAT,MAAOA,EAAI,UAAUc,CAAG;AAC1D,UAAI,CAACC,EAAO;AACZ,MAAAF,EAAO,KAAKE,CAAK,GACjBN,IAAiBM,EAAM,YAAY,CAAA;AAAA,IACrC;AAEA,WAAOF;AAAA,EACT,GAAG,CAACZ,CAAiB,CAAC,GAGhBe,KAAc1C,EAAY,MAAsD;AACpF,UAAM2C,IAAwD,CAAA,GAExDC,IAAW,CAACC,GAAwBC,GAA+BC,MAA4B;AACnG,iBAAWrB,KAAOmB,GAAM;AACtB,cAAMG,IAAU,CAAC,GAAGF,GAAapB,CAAG,GAC9BuB,IAAY,CAAC,GAAGF,GAAerB,EAAI,KAAK;AAE9C,QAAI,CAACA,EAAI,YAAYA,EAAI,SAAS,WAAW,IAC3CiB,EAAM,KAAK,EAAE,MAAMK,GAAS,QAAQC,GAAW,KAE3C5E,KACFsE,EAAM,KAAK,EAAE,MAAMK,GAAS,QAAQC,GAAW,GAEjDL,EAASlB,EAAI,UAAUsB,GAASC,CAAS;AAAA,MAE7C;AAAA,IACF;AAEA,WAAAL,EAASjB,GAAmB,CAAA,GAAI,EAAE,GAC3BgB;AAAA,EACT,GAAG,CAAChB,GAAmBtD,CAAc,CAAC,GAGhC6E,IAAgBtB,EAAQ,MAAM;AAClC,QAAI,CAAClD,KAAc,CAACgC,EAAY,KAAA,EAAQ,QAAO;AAE/C,UAAMyC,IAAWT,GAAA,GACXU,IAAc1C,EAAY,YAAA,GAE1B2C,IAAW,OAAO3E,KAAe,YAAYA,EAAW,SAC1DA,EAAW,SACX,CAAC4E,GAAoBpB,MACnBA,EAAK;AAAA,MAAK,CAAAR,MACR,OAAOA,EAAI,KAAK,EAAE,cAAc,SAAS4B,EAAW,YAAA,CAAa;AAAA,IAAA;AAGzE,WAAOH,EAAS,OAAO,CAAC,EAAE,MAAAjB,QAAWmB,EAASD,GAAalB,CAAI,CAAC;AAAA,EAClE,GAAG,CAACxD,GAAYgC,GAAagC,EAAW,CAAC,GAGnCa,IAAazD,KAAUQ,GAAY,SAAS,IAAIA,KAA8BJ,GAG9EsD,IAA8B5B,EAAQ,MAAM;AAChD,QAAIsB,UAAsB,CAAA;AAE1B,UAAMO,IAA2B,CAAA;AACjC,IAAAA,EAAK,KAAK9B,CAAiB;AAE3B,aAASS,IAAI,GAAGA,IAAImB,EAAW,QAAQnB,KAAK;AAC1C,YAAMsB,IAAc1B,GAAkBI,IAAI,GAAGmB,CAAU;AACvD,MAAIG,EAAY,SAAS,KACvBD,EAAK,KAAKC,CAAW;AAAA,IAEzB;AACA,WAAOD;AAAA,EACT,GAAG,CAACP,GAAevB,GAAmB4B,GAAYvB,EAAiB,CAAC,GAE9D2B,KAAoB,OAAOnG,GAAwByE,MAAkB;AACzE,QAAIzE,EAAO,SAAU;AAErB,UAAMwF,IAAU,CAAC,GAAGO,EAAW,MAAM,GAAGtB,CAAK,GAAGzE,EAAO,KAAK,GACtDoG,IAAetB,EAAmBU,CAAO;AAG/C,QAAIpE,MAAY,CAACpB,EAAO,YAAY,CAACA,EAAO,QAAQ;AAClD,YAAMqG,IAAMrG,EAAO;AACnB,UAAI,CAACoD,GAAY,IAAIiD,CAAG,GAAG;AACzB,QAAAhD,GAAe,OAAQ,IAAI,IAAIiD,CAAI,EAAE,IAAID,CAAG,CAAC;AAC7C,YAAI;AACF,gBAAMjF,GAASgF,CAAY;AAAA,QAC7B,UAAA;AACE,UAAA/C,GAAe,CAAAiD,MAAQ;AACrB,kBAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,mBAAAC,EAAK,OAAOF,CAAG,GACRE;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AACA,MAAAxD,EAAeyC,CAAO;AACtB;AAAA,IACF;AAEA,QAAIxF,EAAO,YAAYA,EAAO,SAAS,SAAS;AAE9C,MAAA+C,EAAeyC,CAAO,GAElB3E,MAEF8B,EAAgB6C,CAAO,GACvBhF,IAAWgF,GAASY,CAAY;AAAA,aAI9B1E,GAAU;AACZ,YAAM8E,IAAUhB,EAAQ,KAAK,GAAG,GAC1BiB,IAAa7D,EAAc,KAAK,CAAA8D,MAAKA,EAAE,KAAK,GAAG,MAAMF,CAAO;AAClE,UAAIG;AACJ,MAAIF,IACFE,IAAW/D,EAAc,OAAO,CAAA8D,MAAKA,EAAE,KAAK,GAAG,MAAMF,CAAO,IAE5DG,IAAW,CAAC,GAAG/D,GAAe4C,CAAO,GAEvC3C,EAAiB8D,CAAQ;AAAA,IAE3B;AACE,MAAAhE,EAAgB6C,CAAO,GACvBjD,EAAU,EAAK,GACfQ,EAAe,CAAA,CAAE,GACjBI,EAAe,EAAE,GACjB3C,IAAWgF,GAASY,CAAY;AAAA,EAGtC,GAEMQ,KAA0B,CAACC,GAAkBnC,MAA2B;AAC5E,QAAIhD,GAAU;AACZ,YAAM8E,IAAUK,EAAO,KAAK,GAAG,GACzBJ,IAAa7D,EAAc,KAAK,CAAA8D,MAAKA,EAAE,KAAK,GAAG,MAAMF,CAAO;AAClE,UAAIG;AACJ,MAAIF,IACFE,IAAW/D,EAAc,OAAO,CAAA8D,MAAKA,EAAE,KAAK,GAAG,MAAMF,CAAO,IAE5DG,IAAW,CAAC,GAAG/D,GAAeiE,CAAM,GAEtChE,EAAiB8D,CAAQ;AAAA,IAC3B;AACE,MAAAhE,EAAgBkE,CAAM,GACtBtE,EAAU,EAAK,GACfY,EAAe,EAAE,GACjB3C,IAAWqG,GAAQnC,CAAI;AAAA,EAE3B,GAEMoC,KAAoB,CAAC9G,GAAwByE,MAAkB;AACnE,QAAI7D,OAAkB,WAAWZ,EAAO,SAAU;AAElD,UAAMwF,IAAU,CAAC,GAAGO,EAAW,MAAM,GAAGtB,CAAK,GAAGzE,EAAO,KAAK;AAC5D,IAAA+C,EAAeyC,CAAO;AAAA,EACxB,GAEMuB,KAAc,CAAC,MAAwB;AAC3C,MAAE,gBAAA,GACErF,KACFmB,EAAiB,CAAA,CAAE,GACnBrC,IAAW,CAAA,GAAI,EAAE,MAEjBmC,EAAgB,CAAA,CAAE,GAClBnC,IAAW,CAAA,GAAI,EAAE;AAAA,EAErB,GAEMwG,KAAkB,CAACC,GAAwB1C,MAAwB;AACvE,IAAAA,EAAE,gBAAA;AACF,UAAMiC,IAAUS,EAAa,KAAK,GAAG,GAC/BN,IAAW/D,EAAc,OAAO,CAAA8D,MAAKA,EAAE,KAAK,GAAG,MAAMF,CAAO;AAClE,IAAA3D,EAAiB8D,CAAQ,GACrBA,EAAS,SAAS,IACpBnG,IAAWmG,EAASA,EAAS,SAAS,CAAC,GAAG7B,EAAmB6B,EAASA,EAAS,SAAS,CAAC,CAAC,CAAC,IAE3FnG,IAAW,CAAA,GAAI,EAAE;AAAA,EAErB,GAEM0G,KAAgB,CAAC,MAA2B;AAChD,QAAI,CAAAxG;AAEJ,cAAQ,EAAE,KAAA;AAAA,QACR,KAAK;AAEH,cADA,EAAE,eAAA,GACE,CAAC4B;AACH,YAAAC,EAAU,EAAI;AAAA,mBACLmD,KAAiBA,EAAc,SAAS,GAAG;AACpD,kBAAM,EAAE,QAAAmB,GAAQ,MAAAnC,EAAA,IAASgB,EAAc1C,EAAa,GAAG,KAAK,CAAA;AAC5D,YAAI6D,KACFD,GAAwBC,GAAQnC,CAAI;AAAA,UAExC,OAAO;AACL,kBAAMyC,IAAgBnB,EAAQhD,EAAa,MAAM;AACjD,gBAAImE,GAAe;AACjB,oBAAMnH,IAASmH,EAAcnE,EAAa,GAAG;AAC7C,cAAIhD,KACFmG,GAAkBnG,GAAQgD,EAAa,MAAM;AAAA,YAEjD;AAAA,UACF;AACA;AAAA,QACF,KAAK;AACH,UAAK9B,MACH,EAAE,eAAA,GACFqB,EAAU,CAACD,CAAM;AAEnB;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACFC,EAAU,EAAK,GACfQ,EAAe,CAAA,CAAE,GACjBI,EAAe,EAAE;AACjB;AAAA,QACF,KAAK;AAEH,cADA,EAAE,eAAA,GACE,CAACb;AACH,YAAAC,EAAU,EAAI;AAAA,mBACLmD;AACT,YAAAzC,EAAgB,CAAAqD,OAAS;AAAA,cACvB,GAAGA;AAAA,cACH,KAAK,KAAK,IAAIA,EAAK,MAAM,GAAGZ,EAAc,SAAS,CAAC;AAAA,YAAA,EACpD;AAAA,eACG;AACL,kBAAMyB,IAAgBnB,EAAQhD,EAAa,MAAM;AACjD,YAAImE,KACFlE,EAAgB,CAAAqD,OAAS;AAAA,cACvB,GAAGA;AAAA,cACH,KAAK,KAAK,IAAIA,EAAK,MAAM,GAAGa,EAAc,SAAS,CAAC;AAAA,YAAA,EACpD;AAAA,UAEN;AACA;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GAEAlE,EADEyC,IACc,CAAAY,OAAS;AAAA,YACvB,GAAGA;AAAA,YACH,KAAK,KAAK,IAAIA,EAAK,MAAM,GAAG,CAAC;AAAA,UAAA,KAGf,CAAAA,OAAS;AAAA,YACvB,GAAGA;AAAA,YACH,KAAK,KAAK,IAAIA,EAAK,MAAM,GAAG,CAAC;AAAA,UAAA,EAJ7B;AAOJ;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACE,CAACZ,KAAiB1C,EAAa,SAASgD,EAAQ,SAAS,KAC3D/C,EAAgB,CAAAqD,OAAS;AAAA,YACvB,QAAQA,EAAK,SAAS;AAAA,YACtB,KAAK;AAAA,UAAA,EACL;AAEJ;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACE,CAACZ,KAAiB1C,EAAa,SAAS,KAC1CC,EAAgB,CAAAqD,OAAS;AAAA,YACvB,QAAQA,EAAK,SAAS;AAAA,YACtB,KAAK;AAAA,UAAA,EACL;AAEJ;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACFrD,EAAgB,QAAS,EAAE,GAAGqD,GAAM,KAAK,IAAI;AAC7C;AAAA,QACF,KAAK;AAEH,cADA,EAAE,eAAA,GACEZ;AACF,YAAAzC,EAAgB,CAAAqD,OAAS,EAAE,GAAGA,GAAM,KAAKZ,EAAc,SAAS,IAAI;AAAA,eAC/D;AACL,kBAAMyB,IAAgBnB,EAAQhD,EAAa,MAAM;AACjD,YAAImE,KACFlE,EAAgB,CAAAqD,OAAS,EAAE,GAAGA,GAAM,KAAKa,EAAc,SAAS,IAAI;AAAA,UAExE;AACA;AAAA,MAAA;AAAA,EAEN;AAGA,EAAA9C,EAAU,MAAM;AACd,IAAI/B,KACFW,EAAgB,EAAE,QAAQ,GAAG,KAAK,GAAG;AAAA,EAEzC,GAAG,CAACX,CAAM,CAAC;AAGX,QAAM8E,KAAkBtC,EAAmBpC,CAAY,GACjD2E,KAASD,GAAgB,IAAI,CAAAlD,MAAOA,EAAI,KAAK,GAC7CoD,KAAexG,IACjBA,EAAcuG,IAAQD,EAAe,IACrCC,GAAO,KAAK,KAAK,GAGfE,KAA4C;AAAA,IAChD,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,KAAoD;AAAA,IACxD,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAIAC,KAA8C;AAAA,IAClD,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,GAGHC,KAAgB,MAChBzG,MAAW,UAAgB,gBAC3BA,MAAW,YAAkB,kBAC7BD,KAASsB,IAAemF,GAAazG,CAAK,IAC1CsB,IAAe,kBACZ,IAGHqF,KAAc,CAACC,GAAkBC,MACrC,GAAGnE,CAAM,WAAWkE,CAAQ,IAAIC,CAAQ,IAEpCC,KAAoB,CAACC,MACzB,GAAGrE,CAAM,kBAAkBqE,CAAK,IAG5BC,KAAa,MAAM;AACvB,UAAM7C,IAAQvC,GACRqF,IAAetG,MAAgB,gBAAgB,OAAOA,KAAgB,WACxEwD,EAAM,MAAM,GAAG,OAAOxD,KAAgB,WAAWA,IAAc,CAAC,IAChEwD,GACE+C,IAAc/C,EAAM,SAAS8C,EAAa;AAEhD,WACE,gBAAAE,EAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,MAAAF,EAAa,IAAI,CAACvD,MAAS;AAE1B,cAAM0D,IADOtD,EAAmBJ,CAAI,EACjB,IAAI,CAAA2D,MAAKA,EAAE,KAAK,EAAE,KAAK,KAAK;AAC/C,eACE,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YAET,UAAA;AAAA,cAAAC;AAAA,cACD,gBAAAE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,CAAC/D,MAAMyC,GAAgBtC,GAAMH,CAAC;AAAA,kBACvC,cAAY,UAAU6D,CAAK;AAAA,kBAE3B,UAAA,gBAAAE,EAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D,4BAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wBAAuB,EAAA,CAC9F;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAbK5D,EAAK,KAAK,GAAG;AAAA,QAAA;AAAA,MAgBxB,CAAC;AAAA,MACAwD,IAAc,KACb,gBAAAC,EAAC,QAAA,EAAK,WAAU,kBAAiB,UAAA;AAAA,QAAA;AAAA,QAAED;AAAA,MAAA,EAAA,CAAY;AAAA,IAAA,GAEnD;AAAA,EAEJ,GAGMK,KAAsB,MAAM;AAChC,QAAI,CAAC7C,EAAe,QAAO;AAE3B,QAAIA,EAAc,WAAW;AAC3B,aACE,gBAAA4C,EAAC,OAAA,EAAI,WAAU,wCACZ,UAAAnH,IACH;AAIJ,UAAMqH,IAAW,OAAOtH,KAAe,YAAYA,EAAW,SAC1DA,EAAW,SACX;AAEJ,WACE,gBAAAoH,EAAC,MAAA,EAAG,MAAK,WAAU,WAAU,sCAC1B,UAAA5C,EAAc,IAAI,CAAC,EAAE,MAAAhB,GAAM,QAAAmC,EAAA,GAAUkB,MAAU;AAC9C,YAAMtB,IAAa/E,IACfkB,EAAc,KAAK,OAAK8D,EAAE,KAAK,GAAG,MAAMG,EAAO,KAAK,GAAG,CAAC,IACxDnE,EAAa,KAAK,GAAG,MAAMmE,EAAO,KAAK,GAAG,GACxC4B,IAAYzF,EAAa,QAAQ+E;AAEvC,aACE,gBAAAO;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,IAAIR,GAAkBC,CAAK;AAAA,UAC3B,MAAK;AAAA,UACL,iBAAetB;AAAA,UACf,eAAa,GAAGxE,CAAU,kBAAkB4E,EAAO,KAAK,GAAG,CAAC;AAAA,UAC5D,cAAYJ,IAAa,aAAa;AAAA,UACtC,WAAW,4BACTA,IACI,oCACAgC,IACA,gBACA,mBACN;AAAA,UACA,SAAS,MAAM7B,GAAwBC,GAAQnC,CAAI;AAAA,UAElD,UAAA8D,IACGA,EAAStF,GAAawB,CAAI,IAC1BA,EAAK,IAAI,CAAAR,MAAOA,EAAI,KAAK,EAAE,KAAK,KAAK;AAAA,QAAA;AAAA,QAjBpC2C,EAAO,KAAK,GAAG;AAAA,MAAA;AAAA,IAqB1B,CAAC,EAAA,CACH;AAAA,EAEJ,GAGM6B,KAAwB,MAAM;AAClC,UAAMC,IAAUjD,IAAgB6C,GAAA,IAC9B,gBAAAD,EAAC,OAAA,EAAI,WAAU,QACZ,UAAAtC,EAAQ,IAAI,CAAC4C,GAAehB,MAC3B,gBAAAU;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,cAAY,SAASV,IAAW,CAAC;AAAA,QACjC,WAAW,oDACTA,IAAW,IAAI,6BAA6B,EAC9C;AAAA,QAEC,UAAAgB,EAAc,IAAI,CAAC5I,GAAQ6H,MAAa;AACvC,gBAAMpB,IAAa/D,EAAakF,CAAQ,MAAM5H,EAAO,OAC/C6I,IAAY9C,EAAW6B,CAAQ,MAAM5H,EAAO,OAC5C8I,IAAc9I,EAAO,YAAYA,EAAO,SAAS,SAAS,GAC1D+I,KAAY3F,GAAY,IAAIpD,EAAO,KAAK,GACxCyI,KAAYzF,EAAa,WAAW4E,KAAY5E,EAAa,QAAQ6E,GACrEmB,KAAWrB,GAAYC,GAAUC,CAAQ;AAE/C,iBACE,gBAAAM;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,IAAIa;AAAA,cACJ,MAAK;AAAA,cACL,iBAAevC;AAAA,cACf,iBAAezG,EAAO;AAAA,cACtB,eAAa,GAAGiC,CAAU,WAAWjC,EAAO,KAAK;AAAA,cACjD,cAAYyG,IAAa,aAAaoC,IAAY,YAAY;AAAA,cAC9D,cAAY7I,EAAO;AAAA,cACnB,WAAW,oEACTA,EAAO,WACH,4CACAyG,IACA,oCACAgC,MAEAI,IADA,gBAGA,mBACN;AAAA,cACA,SAAS,MAAM1C,GAAkBnG,GAAQ4H,CAAQ;AAAA,cACjD,cAAc,MAAMd,GAAkB9G,GAAQ4H,CAAQ;AAAA,cAEtD,UAAA;AAAA,gBAAA,gBAAAU,EAAC,QAAA,EAAM,YAAO,MAAA,CAAM;AAAA,gBACnBS,KACC,gBAAAT,EAAC,QAAA,EAAK,WAAU,qCAAA,CAAqC,IACnDQ,IACF,gBAAAR,EAAC,OAAA,EAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D,UAAA,gBAAAA,EAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,eAAA,CAAe,EAAA,CACtF,IACE;AAAA,cAAA;AAAA,YAAA;AAAA,YA7BCtI,EAAO;AAAA,UAAA;AAAA,QAgClB,CAAC;AAAA,MAAA;AAAA,MAjDI4H;AAAA,IAAA,CAmDR,GACH;AAGF,WAAOnG,KAAiBA,GAAekH,CAAO,IAAIA;AAAA,EACpD,GAGMM,KAAsB,MAAM;AAChC,QAAK3G;AACL,aAAIoD,IACKoC,GAAkB9E,EAAa,GAAG,IAEpC2E,GAAY3E,EAAa,QAAQA,EAAa,GAAG;AAAA,EAC1D,GAEMkG,IAAWxH,IAAWkB,EAAc,SAAS,IAAIF,EAAa,SAAS;AAE7E,SACE,gBAAAyF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,CAACgB,MAAS;AACb,QAAA7F,EAAa,UAAU6F,GACnB,OAAOnH,KAAQ,aAAYA,EAAImH,CAAI,IAC9BnH,QAAS,UAAUmH;AAAA,MAC9B;AAAA,MACA,WAAW,gCAAgCvH,EAAS;AAAA,MACpD,eAAaK;AAAA,MACb,cAAYK,IAAS,SAAS;AAAA,MAC7B,GAAGP;AAAA,MAGJ,UAAA;AAAA,QAAA,gBAAAoG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAIvE;AAAA,YACJ,MAAK;AAAA,YACL,iBAAetB;AAAA,YACf,iBAAc;AAAA,YACd,iBAAeuB;AAAA,YACf,yBAAuBoF,GAAA;AAAA,YACvB,cAAYpH;AAAA,YACZ,iBAAenB;AAAA,YACf,UAAUA,IAAW,KAAK;AAAA,YAC1B,WAAW,uEAAuE6G,GAAYxG,CAAI,CAAC,IACjGL,IAAW,sCAAsC,EACnD,IAAIgH,GAAA,CAAe;AAAA,YACnB,SAAS,MAAM;AACb,cAAKhH,MACH6B,EAAU,CAACD,CAAM,GACbpB,KAAc,CAACoB,KACjB,WAAW,MAAMkB,GAAS,SAAS,MAAA,GAAS,CAAC;AAAA,YAGnD;AAAA,YACA,WAAW0D;AAAA,YAEV,UAAA;AAAA,cAAAxF,KAAYkB,EAAc,SAAS,IAClCoF,OACE9G,KAAcoB,IAChB,gBAAAgG;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK9E;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAON;AAAA,kBACP,UAAU,CAAC,MAAMC,EAAe,EAAE,OAAO,KAAK;AAAA,kBAC9C,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,kBAClB,aAAa+F,IAAW,OAAO5B,EAAY,IAAI7G;AAAA,kBAC/C,cAAW;AAAA,gBAAA;AAAA,cAAA,IAGb,gBAAA6H,EAAC,QAAA,EAAK,WAAW,mBAAoBY,IAAoC,KAAzB,sBAA2B,IACxE,UAAAA,IAAW5B,KAAe7G,EAAA,CAC7B;AAAA,cAEF,gBAAA0H,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,gBAAAxH,MAAcuI,KAAY,CAACxI,KAC1B,gBAAA4H;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAASvB;AAAA,oBACT,cAAW;AAAA,oBACX,eAAa,GAAG9E,CAAU;AAAA,oBAE1B,UAAA,gBAAAqG,EAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D,4BAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wBAAuB,EAAA,CAC9F;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGJ,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,gCAAgChG,IAAS,eAAe,EAAE;AAAA,oBACrE,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,QAAO;AAAA,oBACP,eAAY;AAAA,oBAEZ,UAAA,gBAAAgG,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,iBAAA,CAAiB;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACxF,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAIDhG,KACC,gBAAAgG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK7E;AAAA,YACL,IAAII;AAAA,YACJ,WAAW,8EAA8E2D,GAAoBzG,CAAI,CAAC,IAAIS,EAAc;AAAA,YACpI,eAAa,GAAGS,CAAU;AAAA,YAEzB,UAAAyG,GAAA;AAAA,UAAsB;AAAA,QAAA;AAAA,MACzB;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;AAEDvI,GAAS,cAAc;"}
@@ -150,4 +150,4 @@ const $ = ({
150
150
  export {
151
151
  $ as Chart
152
152
  };
153
- //# sourceMappingURL=index16.js.map
153
+ //# sourceMappingURL=Chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chart.js","sources":["../../src/components/Chart.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport ApexCharts from 'apexcharts'\nimport type { ApexOptions } from 'apexcharts'\n\nexport interface ChartProps {\n /** Chart type */\n type: 'line' | 'area' | 'bar' | 'pie' | 'donut' | 'radialBar' | 'scatter' | 'bubble' | 'heatmap' | 'candlestick' | 'boxPlot' | 'radar' | 'polarArea' | 'rangeBar' | 'rangeArea' | 'treemap'\n /** Chart series data */\n series: ApexAxisChartSeries | ApexNonAxisChartSeries\n /** Chart width */\n width?: string | number\n /** Chart height */\n height?: string | number\n /** ApexCharts options (merged with theme defaults) */\n options?: ApexOptions\n /** Use daisyUI theme colors */\n themed?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\n// Get CSS variable value from root\nfunction getCssVar(varName: string): string {\n if (typeof document === 'undefined') return ''\n return getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n}\n\n// Convert oklch to hex (approximate)\nfunction oklchToHex(oklch: string): string {\n // Parse oklch(L C H) format\n const match = oklch.match(/oklch\\(\\s*([\\d.]+)%?\\s+([\\d.]+)\\s+([\\d.]+)/)\n if (!match) return ''\n\n const l = parseFloat(match[1]) / 100 // Lightness 0-1\n const c = parseFloat(match[2]) // Chroma\n const h = parseFloat(match[3]) // Hue in degrees\n\n // Simplified oklch to sRGB conversion\n // This is an approximation - full conversion is complex\n const hRad = (h * Math.PI) / 180\n const a = c * Math.cos(hRad)\n const b = c * Math.sin(hRad)\n\n // Approximate conversion to linear RGB\n const l_ = l + 0.3963377774 * a + 0.2158037573 * b\n const m_ = l - 0.1055613458 * a - 0.0638541728 * b\n const s_ = l - 0.0894841775 * a - 1.2914855480 * b\n\n const l3 = l_ * l_ * l_\n const m3 = m_ * m_ * m_\n const s3 = s_ * s_ * s_\n\n let r = 4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3\n let g = -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3\n let bl = -0.0041960863 * l3 - 0.7034186147 * m3 + 1.7076147010 * s3\n\n // Clamp and convert to sRGB\n const toSrgb = (x: number) => {\n x = Math.max(0, Math.min(1, x))\n return x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1/2.4) - 0.055\n }\n\n r = Math.round(toSrgb(r) * 255)\n g = Math.round(toSrgb(g) * 255)\n bl = Math.round(toSrgb(bl) * 255)\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${bl.toString(16).padStart(2, '0')}`\n}\n\n// Get daisyUI theme colors from CSS variables\nfunction getThemeColors(): string[] {\n if (typeof document === 'undefined') return []\n\n const colorVars = [\n '--color-primary',\n '--color-secondary',\n '--color-accent',\n '--color-info',\n '--color-success',\n '--color-warning',\n '--color-error',\n ]\n\n return colorVars\n .map(varName => {\n const value = getCssVar(varName)\n if (value.includes('oklch')) {\n return oklchToHex(value)\n }\n return value\n })\n .filter(Boolean)\n}\n\n// Get theme-aware chart options\nfunction getThemedOptions(): Partial<ApexOptions> {\n const colors = getThemeColors()\n\n // Get text color from CSS variable\n const baseContentVar = getCssVar('--color-base-content')\n const textColor = baseContentVar.includes('oklch')\n ? oklchToHex(baseContentVar)\n : (baseContentVar || '#888888')\n\n // Get grid color from CSS variable\n const base300Var = getCssVar('--color-base-300')\n const gridColor = base300Var.includes('oklch')\n ? oklchToHex(base300Var)\n : (base300Var || '#e0e0e0')\n\n // Determine if dark theme by checking luminance of text color\n // If text is light, we're on dark theme\n const textMatch = textColor.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)\n const isDark = textMatch\n ? (parseInt(textMatch[1], 16) + parseInt(textMatch[2], 16) + parseInt(textMatch[3], 16)) / 3 > 128\n : false\n\n return {\n colors: colors.length > 0 ? colors : undefined,\n theme: {\n mode: isDark ? 'dark' : 'light',\n },\n chart: {\n background: 'transparent',\n foreColor: textColor,\n },\n grid: {\n borderColor: gridColor,\n },\n xaxis: {\n labels: {\n style: {\n colors: textColor,\n },\n },\n axisBorder: {\n color: gridColor,\n },\n axisTicks: {\n color: gridColor,\n },\n },\n yaxis: {\n labels: {\n style: {\n colors: textColor,\n },\n },\n },\n legend: {\n labels: {\n colors: textColor,\n },\n },\n tooltip: {\n theme: isDark ? 'dark' : 'light',\n style: {\n fontSize: '12px',\n },\n x: {\n show: true,\n },\n marker: {\n show: true,\n },\n },\n dataLabels: {\n style: {\n colors: [textColor, textColor, textColor, textColor, textColor, textColor, textColor],\n },\n background: {\n enabled: false,\n },\n dropShadow: {\n enabled: false,\n },\n },\n }\n}\n\n// Deep merge objects\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target }\n\n for (const key in source) {\n if (source[key] !== undefined) {\n if (\n typeof source[key] === 'object' &&\n source[key] !== null &&\n !Array.isArray(source[key]) &&\n typeof target[key] === 'object' &&\n target[key] !== null &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, unknown>,\n source[key] as Record<string, unknown>\n ) as T[Extract<keyof T, string>]\n } else {\n result[key] = source[key] as T[Extract<keyof T, string>]\n }\n }\n }\n\n return result\n}\n\nexport const Chart: React.FC<ChartProps> = ({\n type,\n series,\n width = '100%',\n height = 350,\n options = {},\n themed = true,\n className = '',\n}) => {\n const chartRef = useRef<HTMLDivElement>(null)\n const chartInstance = useRef<ApexCharts | null>(null)\n const [, setMounted] = useState(false)\n\n // Build final options\n const buildOptions = (): ApexOptions => {\n const baseOptions: ApexOptions = {\n chart: {\n type,\n width,\n height,\n },\n series,\n }\n\n if (themed) {\n const themedOpts = getThemedOptions()\n return deepMerge(deepMerge(baseOptions as unknown as Record<string, unknown>, themedOpts as unknown as Record<string, unknown>), options as unknown as Record<string, unknown>) as ApexOptions\n }\n\n return deepMerge(baseOptions as unknown as Record<string, unknown>, options as unknown as Record<string, unknown>) as ApexOptions\n }\n\n // Initialize chart\n useEffect(() => {\n if (!chartRef.current) return\n\n const opts = buildOptions()\n chartInstance.current = new ApexCharts(chartRef.current, opts)\n chartInstance.current.render()\n setMounted(true)\n\n return () => {\n if (chartInstance.current) {\n chartInstance.current.destroy()\n chartInstance.current = null\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update chart when props change\n useEffect(() => {\n if (!chartInstance.current) return\n\n const opts = buildOptions()\n chartInstance.current.updateOptions(opts, true, true)\n }, [type, series, width, height, options, themed]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Listen for theme changes\n useEffect(() => {\n if (!themed || typeof window === 'undefined') return\n\n const observer = new MutationObserver(() => {\n if (chartInstance.current) {\n const opts = buildOptions()\n chartInstance.current.updateOptions(opts, true, true)\n }\n })\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class'],\n })\n\n return () => observer.disconnect()\n }, [themed]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return <div ref={chartRef} className={className} />\n}\n"],"names":["getCssVar","varName","oklchToHex","oklch","match","l","c","hRad","a","b","l_","m_","s_","l3","m3","s3","r","g","bl","toSrgb","x","getThemeColors","value","getThemedOptions","colors","baseContentVar","textColor","base300Var","gridColor","textMatch","isDark","deepMerge","target","source","result","key","Chart","type","series","width","height","options","themed","className","chartRef","useRef","chartInstance","setMounted","useState","buildOptions","baseOptions","themedOpts","useEffect","opts","ApexCharts","observer","jsx"],"mappings":"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"}
@@ -30,4 +30,4 @@ const p = ({
30
30
  export {
31
31
  p as Chat
32
32
  };
33
- //# sourceMappingURL=index12.js.map
33
+ //# sourceMappingURL=Chat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index12.js","sources":["../src/components/Chat.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement> {\n message: React.ReactNode\n position?: 'start' | 'end'\n avatar?: string\n avatarAlt?: string\n header?: React.ReactNode\n footer?: React.ReactNode\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error'\n}\n\nexport const Chat: React.FC<ChatProps> = ({\n message,\n position = 'start',\n avatar,\n avatarAlt = '',\n header,\n footer,\n color,\n className = '',\n ...rest\n}) => {\n const positionClass = position === 'start' ? 'chat-start' : 'chat-end'\n\n const colorClasses: Record<string, string> = {\n primary: 'chat-bubble-primary',\n secondary: 'chat-bubble-secondary',\n accent: 'chat-bubble-accent',\n neutral: 'chat-bubble-neutral',\n info: 'chat-bubble-info',\n success: 'chat-bubble-success',\n warning: 'chat-bubble-warning',\n error: 'chat-bubble-error',\n }\n\n const bubbleClasses = ['chat-bubble']\n if (color && colorClasses[color]) {\n bubbleClasses.push(colorClasses[color])\n }\n\n return (\n <div className={`chat ${positionClass} ${className}`} {...rest}>\n {avatar && (\n <div className=\"chat-image avatar\">\n <div className=\"w-10 rounded-full\">\n <img alt={avatarAlt} src={avatar} />\n </div>\n </div>\n )}\n {header && <div className=\"chat-header\">{header}</div>}\n <div className={bubbleClasses.join(' ')}>{message}</div>\n {footer && <div className=\"chat-footer\">{footer}</div>}\n </div>\n )\n}\n"],"names":["Chat","message","position","avatar","avatarAlt","header","footer","color","className","rest","positionClass","colorClasses","bubbleClasses","jsxs","jsx"],"mappings":";AAYO,MAAMA,IAA4B,CAAC;AAAA,EACxC,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAgBR,MAAa,UAAU,eAAe,YAEtDS,IAAuC;AAAA,IAC3C,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,GAGHC,IAAgB,CAAC,aAAa;AACpC,SAAIL,KAASI,EAAaJ,CAAK,KAC7BK,EAAc,KAAKD,EAAaJ,CAAK,CAAC,GAItC,gBAAAM,EAAC,SAAI,WAAW,QAAQH,CAAa,IAAIF,CAAS,IAAK,GAAGC,GACvD,UAAA;AAAA,IAAAN,KACC,gBAAAW,EAAC,OAAA,EAAI,WAAU,qBACb,4BAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA,EAAC,SAAI,KAAKV,GAAW,KAAKD,EAAA,CAAQ,GACpC,GACF;AAAA,IAEDE,KAAU,gBAAAS,EAAC,OAAA,EAAI,WAAU,eAAe,UAAAT,GAAO;AAAA,sBAC/C,OAAA,EAAI,WAAWO,EAAc,KAAK,GAAG,GAAI,UAAAX,GAAQ;AAAA,IACjDK,KAAU,gBAAAQ,EAAC,OAAA,EAAI,WAAU,eAAe,UAAAR,EAAA,CAAO;AAAA,EAAA,GAClD;AAEJ;"}
1
+ {"version":3,"file":"Chat.js","sources":["../../src/components/Chat.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement> {\n message: React.ReactNode\n position?: 'start' | 'end'\n avatar?: string\n avatarAlt?: string\n header?: React.ReactNode\n footer?: React.ReactNode\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error'\n}\n\nexport const Chat: React.FC<ChatProps> = ({\n message,\n position = 'start',\n avatar,\n avatarAlt = '',\n header,\n footer,\n color,\n className = '',\n ...rest\n}) => {\n const positionClass = position === 'start' ? 'chat-start' : 'chat-end'\n\n const colorClasses: Record<string, string> = {\n primary: 'chat-bubble-primary',\n secondary: 'chat-bubble-secondary',\n accent: 'chat-bubble-accent',\n neutral: 'chat-bubble-neutral',\n info: 'chat-bubble-info',\n success: 'chat-bubble-success',\n warning: 'chat-bubble-warning',\n error: 'chat-bubble-error',\n }\n\n const bubbleClasses = ['chat-bubble']\n if (color && colorClasses[color]) {\n bubbleClasses.push(colorClasses[color])\n }\n\n return (\n <div className={`chat ${positionClass} ${className}`} {...rest}>\n {avatar && (\n <div className=\"chat-image avatar\">\n <div className=\"w-10 rounded-full\">\n <img alt={avatarAlt} src={avatar} />\n </div>\n </div>\n )}\n {header && <div className=\"chat-header\">{header}</div>}\n <div className={bubbleClasses.join(' ')}>{message}</div>\n {footer && <div className=\"chat-footer\">{footer}</div>}\n </div>\n )\n}\n"],"names":["Chat","message","position","avatar","avatarAlt","header","footer","color","className","rest","positionClass","colorClasses","bubbleClasses","jsxs","jsx"],"mappings":";AAYO,MAAMA,IAA4B,CAAC;AAAA,EACxC,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAgBR,MAAa,UAAU,eAAe,YAEtDS,IAAuC;AAAA,IAC3C,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,GAGHC,IAAgB,CAAC,aAAa;AACpC,SAAIL,KAASI,EAAaJ,CAAK,KAC7BK,EAAc,KAAKD,EAAaJ,CAAK,CAAC,GAItC,gBAAAM,EAAC,SAAI,WAAW,QAAQH,CAAa,IAAIF,CAAS,IAAK,GAAGC,GACvD,UAAA;AAAA,IAAAN,KACC,gBAAAW,EAAC,OAAA,EAAI,WAAU,qBACb,4BAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA,EAAC,SAAI,KAAKV,GAAW,KAAKD,EAAA,CAAQ,GACpC,GACF;AAAA,IAEDE,KAAU,gBAAAS,EAAC,OAAA,EAAI,WAAU,eAAe,UAAAT,GAAO;AAAA,sBAC/C,OAAA,EAAI,WAAWO,EAAc,KAAK,GAAG,GAAI,UAAAX,GAAQ;AAAA,IACjDK,KAAU,gBAAAQ,EAAC,OAAA,EAAI,WAAU,eAAe,UAAAR,EAAA,CAAO;AAAA,EAAA,GAClD;AAEJ;"}
@@ -5,9 +5,9 @@ function I({
5
5
  children: x,
6
6
  value: r,
7
7
  defaultValue: b,
8
- onChange: d,
8
+ onChange: h,
9
9
  disabled: a = !1,
10
- options: h,
10
+ options: d,
11
11
  direction: s = "vertical",
12
12
  className: u = ""
13
13
  }) {
@@ -15,13 +15,13 @@ function I({
15
15
  value: l,
16
16
  onChange: (i, e) => {
17
17
  const k = e ? [...l, i] : l.filter((f) => f !== i);
18
- r === void 0 && g(k), d?.(k);
18
+ r === void 0 && g(k), h?.(k);
19
19
  },
20
20
  disabled: a
21
21
  };
22
- if (h) {
22
+ if (d) {
23
23
  const i = s === "horizontal" ? "flex flex-row flex-wrap gap-4" : "flex flex-col";
24
- return /* @__PURE__ */ c(y.Provider, { value: t, children: /* @__PURE__ */ c("div", { className: `${i} ${u}`.trim(), children: h.map((e) => typeof e == "string" || typeof e == "number" ? /* @__PURE__ */ p("label", { className: "flex items-center cursor-pointer gap-2", children: [
24
+ return /* @__PURE__ */ c(y.Provider, { value: t, children: /* @__PURE__ */ c("div", { className: `${i} ${u}`.trim(), children: d.map((e) => typeof e == "string" || typeof e == "number" ? /* @__PURE__ */ p("label", { className: "flex items-center cursor-pointer gap-2", children: [
25
25
  /* @__PURE__ */ c(m, { value: e }),
26
26
  /* @__PURE__ */ c("span", { children: e })
27
27
  ] }, e) : /* @__PURE__ */ p("label", { className: "flex items-center cursor-pointer gap-2", children: [
@@ -36,9 +36,9 @@ const m = G(
36
36
  children: x,
37
37
  size: r,
38
38
  color: b,
39
- indeterminate: d = !1,
39
+ indeterminate: h = !1,
40
40
  swap: a,
41
- className: h = "",
41
+ className: d = "",
42
42
  value: s,
43
43
  checked: u,
44
44
  onChange: C,
@@ -68,16 +68,16 @@ const m = G(
68
68
  t && s !== void 0 && (typeof s == "string" || typeof s == "number") && t.onChange?.(s, n.target.checked), C?.(n);
69
69
  }, V = R.useCallback(
70
70
  (n) => {
71
- n && (n.indeterminate = d), typeof o == "function" ? o(n) : o && (o.current = n);
71
+ n && (n.indeterminate = h), typeof o == "function" ? o(n) : o && (o.current = n);
72
72
  },
73
- [d, o]
74
- ), N = d ? "indeterminate" : f ? "checked" : "unchecked";
73
+ [h, o]
74
+ ), N = h ? "indeterminate" : f ? "checked" : "unchecked";
75
75
  if (a) {
76
76
  const n = [
77
77
  "swap",
78
78
  a.effect === "rotate" && "swap-rotate",
79
79
  a.effect === "flip" && "swap-flip",
80
- h
80
+ d
81
81
  ].filter(Boolean).join(" ");
82
82
  return /* @__PURE__ */ p("label", { className: n, children: [
83
83
  /* @__PURE__ */ c(
@@ -110,17 +110,17 @@ const m = G(
110
110
  ...l
111
111
  }
112
112
  );
113
- return x ? /* @__PURE__ */ p("label", { className: `flex items-center cursor-pointer gap-2 ${h}`, children: [
113
+ return x ? /* @__PURE__ */ p("label", { className: `flex items-center cursor-pointer gap-2 ${d}`, children: [
114
114
  j,
115
115
  /* @__PURE__ */ c("span", { children: x })
116
116
  ] }) : j;
117
117
  }
118
118
  );
119
119
  m.displayName = "Checkbox";
120
- const _ = Object.assign(m, {
120
+ const z = Object.assign(m, {
121
121
  Group: I
122
122
  });
123
123
  export {
124
- _ as Checkbox
124
+ z as Checkbox
125
125
  };
126
- //# sourceMappingURL=index11.js.map
126
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sources":["../../src/components/Checkbox.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\n\nexport interface CheckboxSwapConfig {\n /** Content shown when checked */\n on: React.ReactNode\n /** Content shown when unchecked */\n off: React.ReactNode\n /** Animation effect for the swap transition */\n effect?: 'rotate' | 'flip'\n}\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n children?: React.ReactNode\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n indeterminate?: boolean\n /** Swap mode: toggle between two visual states instead of showing a checkbox */\n swap?: CheckboxSwapConfig\n className?: string\n}\n\nexport interface CheckboxOptionType {\n label: React.ReactNode\n value: string | number\n disabled?: boolean\n}\n\nexport interface CheckboxGroupProps {\n children?: React.ReactNode\n value?: (string | number)[]\n defaultValue?: (string | number)[]\n onChange?: (values: (string | number)[]) => void\n disabled?: boolean\n options?: (string | number | CheckboxOptionType)[]\n /** Layout direction for options */\n direction?: 'horizontal' | 'vertical'\n className?: string\n}\n\ninterface CheckboxGroupContextValue {\n value?: (string | number)[]\n onChange?: (checkedValue: string | number, checked: boolean) => void\n disabled?: boolean\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null)\n\nfunction CheckboxGroup({\n children,\n value,\n defaultValue,\n onChange,\n disabled = false,\n options,\n direction = 'vertical',\n className = ''\n}: CheckboxGroupProps) {\n const [internalValue, setInternalValue] = React.useState<(string | number)[]>(defaultValue || [])\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (checkedValue: string | number, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, checkedValue]\n : currentValue.filter((v) => v !== checkedValue)\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const contextValue: CheckboxGroupContextValue = {\n value: currentValue,\n onChange: handleChange,\n disabled,\n }\n\n // If options are provided, render checkboxes automatically\n if (options) {\n const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col'\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={`${directionClasses} ${className}`.trim()}>\n {options.map((option) => {\n if (typeof option === 'string' || typeof option === 'number') {\n return (\n <label key={option} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option} />\n <span>{option}</span>\n </label>\n )\n } else {\n return (\n <label key={option.value} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option.value} disabled={option.disabled} />\n <span>{option.label}</span>\n </label>\n )\n }\n })}\n </div>\n </CheckboxGroupContext.Provider>\n )\n }\n\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={className}>{children}</div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nconst CheckboxRoot = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n children,\n size,\n color,\n indeterminate = false,\n swap,\n className = '',\n value,\n checked,\n onChange,\n disabled: disabledProp,\n ...props\n },\n ref\n ) => {\n const groupContext = useContext(CheckboxGroupContext)\n\n const sizeClasses = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: 'checkbox-md',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n }\n\n const colorClasses = {\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n neutral: 'checkbox-neutral',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n info: 'checkbox-info',\n error: 'checkbox-error',\n }\n\n const checkboxClasses = [\n 'checkbox',\n size && sizeClasses[size],\n color && colorClasses[color],\n ]\n .filter(Boolean)\n .join(' ')\n\n // If in a group, use group's value to determine checked state\n const isChecked = groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')\n ? groupContext.value?.includes(value) ?? false\n : checked\n\n const isDisabled = groupContext?.disabled || disabledProp\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')) {\n groupContext.onChange?.(value, e.target.checked)\n }\n onChange?.(e)\n }\n\n // Handle indeterminate state\n const checkboxRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.indeterminate = indeterminate\n }\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [indeterminate, ref]\n )\n\n const dataState = indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'\n\n // Swap mode: render as a swap toggle instead of checkbox\n if (swap) {\n const swapClasses = [\n 'swap',\n swap.effect === 'rotate' && 'swap-rotate',\n swap.effect === 'flip' && 'swap-flip',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={swapClasses}>\n <input\n ref={ref}\n type=\"checkbox\"\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n data-state={dataState}\n {...props}\n />\n <div className=\"swap-on\">{swap.on}</div>\n <div className=\"swap-off\">{swap.off}</div>\n </label>\n )\n }\n\n const checkboxInput = (\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={checkboxClasses}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n data-state={dataState}\n {...props}\n />\n )\n\n // If children provided, wrap in label\n if (children) {\n return (\n <label className={`flex items-center cursor-pointer gap-2 ${className}`}>\n {checkboxInput}\n <span>{children}</span>\n </label>\n )\n }\n\n return checkboxInput\n }\n)\n\nCheckboxRoot.displayName = 'Checkbox'\n\nexport const Checkbox = Object.assign(CheckboxRoot, {\n Group: CheckboxGroup,\n})\n"],"names":["CheckboxGroupContext","createContext","CheckboxGroup","children","value","defaultValue","onChange","disabled","options","direction","className","internalValue","setInternalValue","React","currentValue","contextValue","checkedValue","checked","newValue","v","directionClasses","option","jsxs","jsx","CheckboxRoot","forwardRef","size","color","indeterminate","swap","disabledProp","props","ref","groupContext","useContext","sizeClasses","colorClasses","checkboxClasses","isChecked","isDisabled","handleChange","e","checkboxRef","node","dataState","swapClasses","checkboxInput","Checkbox"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as l, jsx as r } from "react/jsx-runtime";
2
2
  import p from "react";
3
- import { CopyButton as a } from "./index10.js";
4
- const c = ({
3
+ import { CopyButton as c } from "./CopyButton.js";
4
+ const a = ({
5
5
  children: e,
6
6
  prefix: o = "$",
7
7
  highlight: t = !1,
@@ -41,7 +41,7 @@ const c = ({
41
41
  children: [
42
42
  e,
43
43
  s !== null && /* @__PURE__ */ r("div", { style: { position: "absolute", top: 8, right: 8 }, children: /* @__PURE__ */ r(
44
- a,
44
+ c,
45
45
  {
46
46
  text: s,
47
47
  size: "xs",
@@ -53,8 +53,8 @@ const c = ({
53
53
  }
54
54
  );
55
55
  };
56
- f.Line = c;
56
+ f.Line = a;
57
57
  export {
58
58
  f as Code
59
59
  };
60
- //# sourceMappingURL=index54.js.map
60
+ //# sourceMappingURL=Code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index54.js","sources":["../src/components/Code.tsx"],"sourcesContent":["import React from 'react'\nimport { CopyButton } from './CopyButton'\n\nexport interface CodeLineProps extends React.HTMLAttributes<HTMLPreElement> {\n children: React.ReactNode\n prefix?: string\n highlight?: boolean\n}\n\nconst Line: React.FC<CodeLineProps> = ({\n children,\n prefix = '$',\n highlight = false,\n className = '',\n ...rest\n}) => {\n return (\n <pre\n data-prefix={prefix}\n className={`${highlight ? 'bg-warning text-warning-content' : ''} ${className}`}\n {...rest}\n >\n <code>{children}</code>\n </pre>\n )\n}\n\nexport interface CodeProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /** Show copy button. Pass true to auto-extract text, or a string to specify custom copy text */\n copyable?: boolean | string\n}\n\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n const lines: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement<{ children?: React.ReactNode }>(child) && child.props?.children) {\n const text = typeof child.props.children === 'string'\n ? child.props.children\n : ''\n if (text) lines.push(text)\n }\n })\n return lines.join('\\n')\n}\n\nexport const Code: React.FC<CodeProps> & { Line: typeof Line } = ({\n children,\n className = '',\n copyable,\n style,\n ...rest\n}) => {\n const copyText = typeof copyable === 'string'\n ? copyable\n : copyable\n ? extractTextFromChildren(children)\n : null\n\n return (\n <div\n className={`mockup-code ${className}`}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n {...rest}\n >\n {children}\n {copyText !== null && (\n <div style={{ position: 'absolute', top: 8, right: 8 }}>\n <CopyButton\n text={copyText}\n size=\"xs\"\n variant=\"ghost\"\n showTooltip\n />\n </div>\n )}\n </div>\n )\n}\n\nCode.Line = Line\n"],"names":["Line","children","prefix","highlight","className","rest","jsx","extractTextFromChildren","lines","React","child","text","Code","copyable","style","copyText","jsxs","CopyButton"],"mappings":";;;AASA,MAAMA,IAAgC,CAAC;AAAA,EACrC,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAaJ;AAAA,IACb,WAAW,GAAGC,IAAY,oCAAoC,EAAE,IAAIC,CAAS;AAAA,IAC5E,GAAGC;AAAA,IAEJ,UAAA,gBAAAC,EAAC,UAAM,UAAAL,EAAA,CAAS;AAAA,EAAA;AAAA,GAWhBM,IAA0B,CAACN,MAAsC;AACrE,QAAMO,IAAkB,CAAA;AACxBC,SAAAA,EAAM,SAAS,QAAQR,GAAU,CAACS,MAAU;AAC1C,QAAID,EAAM,eAA+CC,CAAK,KAAKA,EAAM,OAAO,UAAU;AACxF,YAAMC,IAAO,OAAOD,EAAM,MAAM,YAAa,WACzCA,EAAM,MAAM,WACZ;AACJ,MAAIC,KAAMH,EAAM,KAAKG,CAAI;AAAA,IAC3B;AAAA,EACF,CAAC,GACMH,EAAM,KAAK;AAAA,CAAI;AACxB,GAEaI,IAAoD,CAAC;AAAA,EAChE,UAAAX;AAAA,EACA,WAAAG,IAAY;AAAA,EACZ,UAAAS;AAAA,EACA,OAAAC;AAAA,EACA,GAAGT;AACL,MAAM;AACJ,QAAMU,IAAW,OAAOF,KAAa,WACjCA,IACAA,IACEN,EAAwBN,CAAQ,IAChC;AAEN,SACE,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,eAAeZ,CAAS;AAAA,MACnC,OAAO,EAAE,UAAU,YAAY,UAAU,UAAU,GAAGU,EAAA;AAAA,MACrD,GAAGT;AAAA,MAEH,UAAA;AAAA,QAAAJ;AAAA,QACAc,MAAa,QACZ,gBAAAT,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,KAAK,GAAG,OAAO,EAAA,GACjD,UAAA,gBAAAA;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,MAAMF;AAAA,YACN,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,aAAW;AAAA,UAAA;AAAA,QAAA,EACb,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAH,EAAK,OAAOZ;"}
1
+ {"version":3,"file":"Code.js","sources":["../../src/components/Code.tsx"],"sourcesContent":["import React from 'react'\nimport { CopyButton } from './CopyButton'\n\nexport interface CodeLineProps extends React.HTMLAttributes<HTMLPreElement> {\n children: React.ReactNode\n prefix?: string\n highlight?: boolean\n}\n\nconst Line: React.FC<CodeLineProps> = ({\n children,\n prefix = '$',\n highlight = false,\n className = '',\n ...rest\n}) => {\n return (\n <pre\n data-prefix={prefix}\n className={`${highlight ? 'bg-warning text-warning-content' : ''} ${className}`}\n {...rest}\n >\n <code>{children}</code>\n </pre>\n )\n}\n\nexport interface CodeProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /** Show copy button. Pass true to auto-extract text, or a string to specify custom copy text */\n copyable?: boolean | string\n}\n\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n const lines: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement<{ children?: React.ReactNode }>(child) && child.props?.children) {\n const text = typeof child.props.children === 'string'\n ? child.props.children\n : ''\n if (text) lines.push(text)\n }\n })\n return lines.join('\\n')\n}\n\nexport const Code: React.FC<CodeProps> & { Line: typeof Line } = ({\n children,\n className = '',\n copyable,\n style,\n ...rest\n}) => {\n const copyText = typeof copyable === 'string'\n ? copyable\n : copyable\n ? extractTextFromChildren(children)\n : null\n\n return (\n <div\n className={`mockup-code ${className}`}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n {...rest}\n >\n {children}\n {copyText !== null && (\n <div style={{ position: 'absolute', top: 8, right: 8 }}>\n <CopyButton\n text={copyText}\n size=\"xs\"\n variant=\"ghost\"\n showTooltip\n />\n </div>\n )}\n </div>\n )\n}\n\nCode.Line = Line\n"],"names":["Line","children","prefix","highlight","className","rest","jsx","extractTextFromChildren","lines","React","child","text","Code","copyable","style","copyText","jsxs","CopyButton"],"mappings":";;;AASA,MAAMA,IAAgC,CAAC;AAAA,EACrC,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAaJ;AAAA,IACb,WAAW,GAAGC,IAAY,oCAAoC,EAAE,IAAIC,CAAS;AAAA,IAC5E,GAAGC;AAAA,IAEJ,UAAA,gBAAAC,EAAC,UAAM,UAAAL,EAAA,CAAS;AAAA,EAAA;AAAA,GAWhBM,IAA0B,CAACN,MAAsC;AACrE,QAAMO,IAAkB,CAAA;AACxB,SAAAC,EAAM,SAAS,QAAQR,GAAU,CAACS,MAAU;AAC1C,QAAID,EAAM,eAA+CC,CAAK,KAAKA,EAAM,OAAO,UAAU;AACxF,YAAMC,IAAO,OAAOD,EAAM,MAAM,YAAa,WACzCA,EAAM,MAAM,WACZ;AACJ,MAAIC,KAAMH,EAAM,KAAKG,CAAI;AAAA,IAC3B;AAAA,EACF,CAAC,GACMH,EAAM,KAAK;AAAA,CAAI;AACxB,GAEaI,IAAoD,CAAC;AAAA,EAChE,UAAAX;AAAA,EACA,WAAAG,IAAY;AAAA,EACZ,UAAAS;AAAA,EACA,OAAAC;AAAA,EACA,GAAGT;AACL,MAAM;AACJ,QAAMU,IAAW,OAAOF,KAAa,WACjCA,IACAA,IACEN,EAAwBN,CAAQ,IAChC;AAEN,SACE,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,eAAeZ,CAAS;AAAA,MACnC,OAAO,EAAE,UAAU,YAAY,UAAU,UAAU,GAAGU,EAAA;AAAA,MACrD,GAAGT;AAAA,MAEH,UAAA;AAAA,QAAAJ;AAAA,QACAc,MAAa,QACZ,gBAAAT,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,KAAK,GAAG,OAAO,EAAA,GACjD,UAAA,gBAAAA;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,MAAMF;AAAA,YACN,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,aAAW;AAAA,UAAA;AAAA,QAAA,EACb,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAH,EAAK,OAAOZ;"}
@@ -112,4 +112,4 @@ P.displayName = "Collapse";
112
112
  export {
113
113
  P as Collapse
114
114
  };
115
- //# sourceMappingURL=index18.js.map
115
+ //# sourceMappingURL=Collapse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collapse.js","sources":["../../src/components/Collapse.tsx"],"sourcesContent":["import React, { forwardRef, useState } from 'react'\n\nexport type CollapseSize = 'sm' | 'md' | 'lg'\nexport type CollapseIconPosition = 'start' | 'end'\nexport type CollapseCollapsible = 'header' | 'icon' | 'disabled'\n\nexport interface CollapseItemType {\n /** Unique key for the panel */\n key: string | number\n /** Panel header/label */\n label: React.ReactNode\n /** Panel content */\n children: React.ReactNode\n /** Extra element in the corner */\n extra?: React.ReactNode\n /** Whether to show the arrow icon */\n showArrow?: boolean\n /** Collapsible mode for this panel */\n collapsible?: CollapseCollapsible\n /** Custom class name for this panel */\n className?: string\n}\n\nexport interface CollapseProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Collapse items */\n items?: CollapseItemType[]\n /** Currently active panel keys (controlled) */\n activeKey?: string | number | (string | number)[]\n /** Default active panel keys (uncontrolled) */\n defaultActiveKey?: string | number | (string | number)[]\n /** Accordion mode - only one panel open at a time */\n accordion?: boolean\n /** Show border around panels */\n bordered?: boolean\n /** Ghost mode - transparent background */\n ghost?: boolean\n /** Size variant */\n size?: CollapseSize\n /** Icon type */\n icon?: 'arrow' | 'plus' | 'none'\n /** Icon placement */\n expandIconPlacement?: CollapseIconPosition\n /** Callback when panels change */\n onChange?: (activeKey: (string | number)[]) => void\n /** Test ID */\n 'data-testid'?: string\n}\n\nconst sizeClasses: Record<CollapseSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n}\n\nconst CollapsePanel = forwardRef<\n HTMLDivElement,\n {\n item: CollapseItemType\n isOpen: boolean\n onToggle: () => void\n icon: 'arrow' | 'plus' | 'none'\n expandIconPlacement: CollapseIconPosition\n bordered: boolean\n ghost: boolean\n size: CollapseSize\n testId?: string\n }\n>(({ item, isOpen, onToggle, icon, expandIconPlacement, bordered, ghost, size, testId }, ref) => {\n const isDisabled = item.collapsible === 'disabled'\n\n const iconClasses = {\n arrow: 'collapse-arrow',\n plus: 'collapse-plus',\n none: '',\n }\n\n const panelClasses = [\n 'collapse',\n iconClasses[icon],\n isOpen ? 'collapse-open' : 'collapse-close',\n !ghost && 'bg-base-200',\n ghost && 'bg-transparent',\n bordered && 'border border-base-300',\n expandIconPlacement === 'end' && icon !== 'none' && 'collapse-arrow-end',\n sizeClasses[size],\n isDisabled && 'opacity-50 cursor-not-allowed',\n item.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleClick = () => {\n if (!isDisabled) {\n onToggle()\n }\n }\n\n return (\n <div\n ref={ref}\n className={panelClasses}\n data-testid={testId ? `${testId}-panel-${item.key}` : undefined}\n data-state={isOpen ? 'open' : 'closed'}\n >\n <div\n className=\"collapse-title font-medium flex items-center justify-between cursor-pointer\"\n onClick={handleClick}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-expanded={isOpen}\n aria-disabled={isDisabled}\n >\n <span>{item.label}</span>\n {item.extra && <span className=\"ml-auto mr-6\">{item.extra}</span>}\n </div>\n <div className=\"collapse-content\">\n {item.children}\n </div>\n </div>\n )\n})\n\nCollapsePanel.displayName = 'CollapsePanel'\n\nexport const Collapse = forwardRef<HTMLDivElement, CollapseProps>(\n (\n {\n items = [],\n activeKey,\n defaultActiveKey,\n accordion = false,\n bordered = true,\n ghost = false,\n size = 'md',\n icon = 'arrow',\n expandIconPlacement = 'start',\n onChange,\n className = '',\n 'data-testid': testId = 'collapse',\n ...rest\n },\n ref\n ) => {\n // Normalize keys to array\n const normalizeKeys = (keys: string | number | (string | number)[] | undefined): (string | number)[] => {\n if (keys === undefined) return []\n if (Array.isArray(keys)) return keys\n return [keys]\n }\n\n const [internalActiveKeys, setInternalActiveKeys] = useState<(string | number)[]>(\n () => normalizeKeys(defaultActiveKey)\n )\n\n const isControlled = activeKey !== undefined\n const currentActiveKeys = isControlled ? normalizeKeys(activeKey) : internalActiveKeys\n\n const handleToggle = (key: string | number) => {\n let newActiveKeys: (string | number)[]\n\n if (accordion) {\n // In accordion mode, only one can be open\n newActiveKeys = currentActiveKeys.includes(key) ? [] : [key]\n } else {\n // Toggle the key\n if (currentActiveKeys.includes(key)) {\n newActiveKeys = currentActiveKeys.filter((k) => k !== key)\n } else {\n newActiveKeys = [...currentActiveKeys, key]\n }\n }\n\n if (!isControlled) {\n setInternalActiveKeys(newActiveKeys)\n }\n onChange?.(newActiveKeys)\n }\n\n const containerClasses = [\n 'flex flex-col',\n bordered && !ghost && 'divide-y divide-base-300',\n bordered && 'border border-base-300 rounded-lg overflow-hidden',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n ref={ref}\n className={containerClasses}\n data-testid={testId}\n {...rest}\n >\n {items.map((item) => (\n <CollapsePanel\n key={item.key}\n item={item}\n isOpen={currentActiveKeys.includes(item.key)}\n onToggle={() => handleToggle(item.key)}\n icon={item.showArrow === false ? 'none' : icon}\n expandIconPlacement={expandIconPlacement}\n bordered={false}\n ghost={ghost}\n size={size}\n testId={testId}\n />\n ))}\n </div>\n )\n }\n)\n\nCollapse.displayName = 'Collapse'\n"],"names":["sizeClasses","CollapsePanel","forwardRef","item","isOpen","onToggle","icon","expandIconPlacement","bordered","ghost","size","testId","ref","isDisabled","panelClasses","handleClick","jsxs","e","jsx","Collapse","items","activeKey","defaultActiveKey","accordion","onChange","className","rest","normalizeKeys","keys","internalActiveKeys","setInternalActiveKeys","useState","isControlled","currentActiveKeys","handleToggle","key","newActiveKeys","k","containerClasses"],"mappings":"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"}
@@ -363,4 +363,4 @@ he.displayName = "ColorPicker";
363
363
  export {
364
364
  he as ColorPicker
365
365
  };
366
- //# sourceMappingURL=index13.js.map
366
+ //# sourceMappingURL=ColorPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPicker.js","sources":["../../src/components/ColorPicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, forwardRef } from 'react'\n\nexport interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: string\n defaultValue?: string\n onChange?: (color: string) => void\n mode?: 'swatches' | 'picker' | 'both'\n presets?: string[]\n size?: 'xs' | 'sm' | 'md' | 'lg'\n disabled?: boolean\n showText?: boolean\n allowClear?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n 'data-testid'?: string\n}\n\nconst DEFAULT_PRESETS = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#efefef', '#f3f3f3', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff',\n '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc',\n '#dd7e6b', '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#a4c2f4', '#9fc5e8', '#b4a7d6', '#d5a6bd',\n '#cc4125', '#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0',\n '#a61c00', '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3c78d8', '#3d85c6', '#674ea7', '#a64d79',\n '#85200c', '#990000', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#1155cc', '#0b5394', '#351c75', '#741b47',\n '#5b0f00', '#660000', '#783f04', '#7f6000', '#274e13', '#0c343d', '#1c4587', '#073763', '#20124d', '#4c1130',\n]\n\n// Convert 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// Convert Hex to HSL\nfunction hexToHsl(hex: string): { h: number; s: number; l: number } {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n if (!result) return { h: 0, s: 100, l: 50 }\n\n let r = parseInt(result[1], 16) / 255\n let g = parseInt(result[2], 16) / 255\n let 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 { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) }\n}\n\n// Validate hex color\nfunction isValidHex(hex: string): boolean {\n return /^#[0-9A-Fa-f]{6}$/.test(hex)\n}\n\n// Normalize hex (add # if missing, uppercase)\nfunction normalizeHex(hex: string): string {\n let normalized = hex.trim()\n if (!normalized.startsWith('#')) {\n normalized = '#' + normalized\n }\n return normalized.toLowerCase()\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(({\n value,\n defaultValue = '#000000',\n onChange,\n mode = 'both',\n presets = DEFAULT_PRESETS,\n size = 'md',\n disabled = false,\n showText = false,\n allowClear = false,\n open: controlledOpen,\n onOpenChange,\n className,\n 'data-testid': testId,\n ...rest\n}, ref) => {\n const initialValue = value !== undefined ? value : defaultValue\n const [internalValue, setInternalValue] = useState(initialValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [hsl, setHsl] = useState(() => hexToHsl(currentValue))\n const [hexInput, setHexInput] = useState(currentValue)\n const baseTestId = testId || 'colorpicker'\n const [isDraggingSL, setIsDraggingSL] = useState(false)\n const [isDraggingHue, setIsDraggingHue] = useState(false)\n const slPanelRef = useRef<HTMLDivElement>(null)\n const hueSliderRef = useRef<HTMLDivElement>(null)\n\n // Sync internal state when value prop changes\n useEffect(() => {\n if (value !== undefined && isValidHex(value)) {\n setHsl(hexToHsl(value))\n setHexInput(value)\n }\n }, [value])\n\n // Keyboard navigation state\n const [focusedPanel, setFocusedPanel] = useState<'sl' | 'hue' | null>(null)\n\n const updateColor = useCallback((newHsl: { h: number; s: number; l: number }) => {\n setHsl(newHsl)\n const hex = hslToHex(newHsl.h, newHsl.s, newHsl.l)\n setHexInput(hex)\n if (value === undefined) {\n setInternalValue(hex)\n }\n onChange?.(hex)\n }, [onChange, value])\n\n // Keyboard navigation for panels\n const handleKeyDown = useCallback((e: React.KeyboardEvent, panel: 'sl' | 'hue') => {\n if (disabled) return\n const step = e.shiftKey ? 10 : 1\n\n if (panel === 'sl') {\n let newS = hsl.s\n let newL = hsl.l\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n newS = Math.max(0, hsl.s - step)\n break\n case 'ArrowRight':\n e.preventDefault()\n newS = Math.min(100, hsl.s + step)\n break\n case 'ArrowUp':\n e.preventDefault()\n newL = Math.min(100, hsl.l + step)\n break\n case 'ArrowDown':\n e.preventDefault()\n newL = Math.max(0, hsl.l - step)\n break\n default:\n return\n }\n updateColor({ ...hsl, s: newS, l: newL })\n } else if (panel === 'hue') {\n let newH = hsl.h\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n newH = (hsl.h - step + 360) % 360\n break\n case 'ArrowRight':\n e.preventDefault()\n newH = (hsl.h + step) % 360\n break\n default:\n return\n }\n updateColor({ ...hsl, h: newH })\n }\n }, [disabled, hsl, updateColor])\n\n // Saturation/Lightness panel handlers\n const handleSLChange = useCallback((clientX: number, clientY: number) => {\n if (!slPanelRef.current || disabled) return\n const rect = slPanelRef.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\n // Convert x,y to saturation and lightness\n // x = saturation (0-100), y = lightness (100-0)\n const s = Math.round(x * 100)\n const l = Math.round((1 - y) * 100)\n updateColor({ ...hsl, s, l })\n }, [hsl, updateColor, disabled])\n\n const handleSLMouseDown = (e: React.MouseEvent) => {\n if (disabled) return\n setIsDraggingSL(true)\n handleSLChange(e.clientX, e.clientY)\n }\n\n // Hue slider handlers\n const handleHueChange = useCallback((clientX: number) => {\n if (!hueSliderRef.current || disabled) return\n const rect = hueSliderRef.current.getBoundingClientRect()\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const h = Math.round(x * 360)\n updateColor({ ...hsl, h })\n }, [hsl, updateColor, disabled])\n\n const handleHueMouseDown = (e: React.MouseEvent) => {\n if (disabled) return\n setIsDraggingHue(true)\n handleHueChange(e.clientX)\n }\n\n // Global mouse handlers for dragging\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingSL) {\n handleSLChange(e.clientX, e.clientY)\n } else if (isDraggingHue) {\n handleHueChange(e.clientX)\n }\n }\n\n const handleMouseUp = () => {\n setIsDraggingSL(false)\n setIsDraggingHue(false)\n }\n\n if (isDraggingSL || isDraggingHue) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n }\n }, [isDraggingSL, isDraggingHue, handleSLChange, handleHueChange])\n\n // Hex input handler\n const handleHexChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setHexInput(newValue)\n const normalized = normalizeHex(newValue)\n if (isValidHex(normalized)) {\n setHsl(hexToHsl(normalized))\n if (value === undefined) {\n setInternalValue(normalized)\n }\n onChange?.(normalized)\n }\n }\n\n // Preset click handler\n const handlePresetClick = (color: string) => {\n if (disabled) return\n const normalized = normalizeHex(color)\n setHsl(hexToHsl(normalized))\n setHexInput(normalized)\n if (value === undefined) {\n setInternalValue(normalized)\n }\n onChange?.(normalized)\n }\n\n // Clear handler\n const handleClear = useCallback(() => {\n if (disabled) return\n const cleared = defaultValue\n setHsl(hexToHsl(cleared))\n setHexInput(cleared)\n if (value === undefined) {\n setInternalValue(cleared)\n }\n onChange?.(cleared)\n }, [disabled, defaultValue, value, onChange])\n\n // Size configurations\n const sizeConfig = {\n xs: { panel: 'w-32 h-32', hue: 'h-3', swatch: 'w-4 h-4', input: 'input-xs' },\n sm: { panel: 'w-40 h-40', hue: 'h-4', swatch: 'w-5 h-5', input: 'input-sm' },\n md: { panel: 'w-48 h-48', hue: 'h-5', swatch: 'w-6 h-6', input: 'input-md' },\n lg: { panel: 'w-56 h-56', hue: 'h-6', swatch: 'w-7 h-7', input: 'input-lg' },\n }\n\n const config = sizeConfig[size]\n const showPicker = mode === 'picker' || mode === 'both'\n const showSwatches = mode === 'swatches' || mode === 'both'\n\n // Calculate picker position\n const slX = hsl.s / 100\n const slY = 1 - hsl.l / 100\n const hueX = hsl.h / 360\n\n return (\n <div\n ref={ref}\n className={['inline-flex flex-col gap-3', disabled ? 'opacity-50 pointer-events-none' : '', className].filter(Boolean).join(' ')}\n data-testid={baseTestId}\n {...rest}\n >\n {showPicker && (\n <>\n {/* Saturation/Lightness Panel */}\n <div\n ref={slPanelRef}\n className={[config.panel, 'relative rounded cursor-crosshair select-none', focusedPanel === 'sl' ? 'ring-2 ring-primary' : ''].filter(Boolean).join(' ')}\n style={{\n background: `\n linear-gradient(to top, #000, transparent),\n linear-gradient(to right, #fff, hsl(${hsl.h}, 100%, 50%))\n `,\n }}\n onMouseDown={handleSLMouseDown}\n onKeyDown={(e) => handleKeyDown(e, 'sl')}\n onFocus={() => setFocusedPanel('sl')}\n onBlur={() => setFocusedPanel(null)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Color saturation and lightness\"\n aria-valuetext={`Saturation ${hsl.s}%, Lightness ${hsl.l}%`}\n data-testid={`${baseTestId}-sl-panel`}\n >\n {/* Picker indicator */}\n <div\n className=\"absolute w-4 h-4 border-2 border-white rounded-full shadow-md pointer-events-none\"\n style={{\n left: `calc(${slX * 100}% - 8px)`,\n top: `calc(${slY * 100}% - 8px)`,\n boxShadow: '0 0 0 1px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3)',\n }}\n />\n </div>\n\n {/* Hue Slider */}\n <div\n ref={hueSliderRef}\n className={[config.hue, 'w-full relative rounded cursor-pointer select-none', focusedPanel === 'hue' ? 'ring-2 ring-primary' : ''].filter(Boolean).join(' ')}\n style={{\n background: 'linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)',\n }}\n onMouseDown={handleHueMouseDown}\n onKeyDown={(e) => handleKeyDown(e, 'hue')}\n onFocus={() => setFocusedPanel('hue')}\n onBlur={() => setFocusedPanel(null)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Color hue\"\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={hsl.h}\n aria-valuetext={`Hue ${hsl.h} degrees`}\n data-testid={`${baseTestId}-hue-slider`}\n >\n {/* Hue indicator */}\n <div\n className=\"absolute top-1/2 w-3 h-full border-2 border-white rounded-sm shadow-md pointer-events-none\"\n style={{\n left: `calc(${hueX * 100}% - 6px)`,\n transform: 'translateY(-50%)',\n boxShadow: '0 0 0 1px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3)',\n }}\n />\n </div>\n\n {/* Hex Input and Preview */}\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-8 h-8 rounded border border-base-300 flex-shrink-0\"\n style={{ backgroundColor: isValidHex(normalizeHex(hexInput)) ? normalizeHex(hexInput) : currentValue }}\n data-testid={`${baseTestId}-preview`}\n aria-label={`Color preview: ${hexInput}`}\n />\n <input\n type=\"text\"\n value={hexInput}\n onChange={handleHexChange}\n className={['input', config.input, 'w-full font-mono uppercase'].join(' ')}\n placeholder=\"#000000\"\n maxLength={7}\n disabled={disabled}\n aria-label=\"Hex color value\"\n data-testid={`${baseTestId}-input`}\n />\n {allowClear && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"btn btn-ghost btn-xs btn-circle\"\n aria-label=\"Clear color\"\n data-testid={`${baseTestId}-clear`}\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Show text display */}\n {showText && (\n <div className=\"text-sm font-mono text-base-content/70\" data-testid={`${baseTestId}-text`}>\n {hexInput.toUpperCase()}\n </div>\n )}\n </>\n )}\n\n {showSwatches && (\n <div className=\"grid grid-cols-10 gap-1\" role=\"listbox\" aria-label=\"Color presets\" data-testid={`${baseTestId}-swatches`}>\n {presets.map((color, index) => (\n <button\n key={`${color}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={currentValue.toLowerCase() === color.toLowerCase()}\n className={[\n config.swatch,\n 'rounded border border-base-300 cursor-pointer hover:scale-110 transition-transform',\n currentValue.toLowerCase() === color.toLowerCase() ? 'ring-2 ring-primary ring-offset-1' : ''\n ].filter(Boolean).join(' ')}\n style={{ backgroundColor: color }}\n onClick={() => handlePresetClick(color)}\n disabled={disabled}\n aria-label={`Select color ${color}`}\n data-testid={`${baseTestId}-swatch-${index}`}\n />\n ))}\n </div>\n )}\n </div>\n )\n})\n\nColorPicker.displayName = 'ColorPicker'\n"],"names":["DEFAULT_PRESETS","hslToHex","h","s","l","a","f","n","k","color","hexToHsl","hex","result","r","g","b","max","min","d","isValidHex","normalizeHex","normalized","ColorPicker","forwardRef","value","defaultValue","onChange","mode","presets","size","disabled","showText","allowClear","controlledOpen","onOpenChange","className","testId","rest","ref","initialValue","internalValue","setInternalValue","useState","currentValue","hsl","setHsl","hexInput","setHexInput","baseTestId","isDraggingSL","setIsDraggingSL","isDraggingHue","setIsDraggingHue","slPanelRef","useRef","hueSliderRef","useEffect","focusedPanel","setFocusedPanel","updateColor","useCallback","newHsl","handleKeyDown","panel","step","newS","newL","newH","handleSLChange","clientX","clientY","rect","x","y","handleSLMouseDown","handleHueChange","handleHueMouseDown","handleMouseMove","e","handleMouseUp","handleHexChange","newValue","handlePresetClick","handleClear","cleared","config","showPicker","showSwatches","slX","slY","hueX","jsxs","Fragment","jsx","index"],"mappings":"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"}
@@ -25,4 +25,4 @@ const o = {
25
25
  export {
26
26
  c as Container
27
27
  };
28
- //# sourceMappingURL=index19.js.map
28
+ //# sourceMappingURL=Container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Container.js","sources":["../../src/components/Container.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Container content */\n children: React.ReactNode\n /** Max width size */\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\n /** Center container horizontally */\n centered?: boolean\n /** Add horizontal padding */\n padding?: boolean\n}\n\nconst sizeClasses: Record<string, string> = {\n sm: 'max-w-screen-sm',\n md: 'max-w-screen-md',\n lg: 'max-w-screen-lg',\n xl: 'max-w-screen-xl',\n '2xl': 'max-w-screen-2xl',\n full: 'max-w-full',\n}\n\nexport const Container: React.FC<ContainerProps> = ({\n children,\n size = 'xl',\n centered = true,\n padding = true,\n className = '',\n ...rest\n}) => {\n const classes = [\n sizeClasses[size],\n centered && 'mx-auto',\n padding && 'px-4 sm:px-6 lg:px-8',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <div className={classes} {...rest}>{children}</div>\n}\n"],"names":["sizeClasses","Container","children","size","centered","padding","className","rest","classes"],"mappings":";AAaA,MAAMA,IAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AACR,GAEaC,IAAsC,CAAC;AAAA,EAClD,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAU;AAAA,IACdR,EAAYG,CAAI;AAAA,IAChBC,KAAY;AAAA,IACZC,KAAW;AAAA,IACXC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BAAQ,OAAA,EAAI,WAAWE,GAAU,GAAGD,GAAO,UAAAL,GAAS;AACtD;"}
@@ -6,7 +6,7 @@ const E = W(null), I = () => {
6
6
  if (!e)
7
7
  throw new Error("ContextMenu compound components must be used within a ContextMenu");
8
8
  return e;
9
- }, _ = ({
9
+ }, A = ({
10
10
  itemKey: e,
11
11
  children: u,
12
12
  icon: l,
@@ -33,7 +33,7 @@ const E = W(null), I = () => {
33
33
  ]
34
34
  }
35
35
  ) });
36
- }, A = ({ className: e = "" }) => /* @__PURE__ */ n("li", { className: `divider my-1 ${e}` }), H = ({
36
+ }, H = ({ className: e = "" }) => /* @__PURE__ */ n("li", { className: `divider my-1 ${e}` }), K = ({
37
37
  itemKey: e,
38
38
  label: u,
39
39
  icon: l,
@@ -127,7 +127,7 @@ const E = W(null), I = () => {
127
127
  ]
128
128
  }
129
129
  );
130
- }, K = ({
130
+ }, O = ({
131
131
  children: e,
132
132
  items: u,
133
133
  onSelect: l,
@@ -188,12 +188,12 @@ const E = W(null), I = () => {
188
188
  document.body
189
189
  )
190
190
  ] });
191
- }, X = Object.assign(K, {
192
- Item: _,
193
- Divider: A,
194
- SubMenu: H
191
+ }, Y = Object.assign(O, {
192
+ Item: A,
193
+ Divider: H,
194
+ SubMenu: K
195
195
  });
196
196
  export {
197
- X as ContextMenu
197
+ Y as ContextMenu
198
198
  };
199
- //# sourceMappingURL=index20.js.map
199
+ //# sourceMappingURL=ContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.js","sources":["../../src/components/ContextMenu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, createContext, useContext } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface ContextMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n children?: ContextMenuItem[]\n}\n\nexport interface ContextMenuProps {\n /** Element that triggers the context menu on right-click */\n children: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: ContextMenuItem[]\n /** Callback when an item is selected */\n onSelect?: (key: string) => void\n /** Whether the context menu is disabled */\n disabled?: boolean\n /** Additional CSS classes for the menu */\n className?: string\n}\n\nexport interface ContextMenuItemProps {\n /** Unique key for the item */\n itemKey: string\n /** Item content */\n children: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Whether the item is disabled */\n disabled?: boolean\n /** Show as danger/destructive action */\n danger?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface ContextMenuDividerProps {\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface ContextMenuSubMenuProps {\n /** Unique key for the submenu */\n itemKey: string\n /** Submenu label */\n label: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Whether the submenu is disabled */\n disabled?: boolean\n /** Submenu items */\n children: React.ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\ninterface ContextMenuContextValue {\n onSelect: (key: string) => void\n onClose: () => void\n}\n\ninterface MenuPosition {\n x: number\n y: number\n}\n\nconst ContextMenuContext = createContext<ContextMenuContextValue | null>(null)\n\nconst useContextMenuContext = () => {\n const context = useContext(ContextMenuContext)\n if (!context) {\n throw new Error('ContextMenu compound components must be used within a ContextMenu')\n }\n return context\n}\n\n// Compound pattern components\nconst ContextMenuItemComponent: React.FC<ContextMenuItemProps> = ({\n itemKey,\n children,\n icon,\n disabled = false,\n danger = false,\n className = '',\n}) => {\n const { onSelect, onClose } = useContextMenuContext()\n\n const handleClick = () => {\n if (disabled) return\n onSelect(itemKey)\n onClose()\n }\n\n return (\n <li className={className}>\n <button\n onClick={handleClick}\n disabled={disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {icon && <span className=\"w-4 h-4\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n </button>\n </li>\n )\n}\n\nconst ContextMenuDividerComponent: React.FC<ContextMenuDividerProps> = ({ className = '' }) => {\n return <li className={`divider my-1 ${className}`}></li>\n}\n\nconst ContextMenuSubMenuComponent: React.FC<ContextMenuSubMenuProps> = ({\n itemKey: _itemKey,\n label,\n icon,\n disabled = false,\n children,\n className = '',\n}) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleMouseEnter = () => {\n if (disabled) return\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setShowSubmenu(true)\n }\n\n const handleMouseLeave = () => {\n timeoutRef.current = setTimeout(() => setShowSubmenu(false), 100)\n }\n\n return (\n <li\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`relative ${className}`}\n >\n <button\n disabled={disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {icon && <span className=\"w-4 h-4\">{icon}</span>}\n <span className=\"flex-1\">{label}</span>\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n {showSubmenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </ul>\n )}\n </li>\n )\n}\n\n// Data-driven pattern internal component\nconst MenuItem: React.FC<{\n item: ContextMenuItem\n onSelect: (key: string) => void\n onClose: () => void\n}> = ({ item, onSelect, onClose }) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n if (item.divider) {\n return <li className=\"divider my-1\"></li>\n }\n\n const handleClick = () => {\n if (item.disabled) return\n if (item.children && item.children.length > 0) return\n onSelect(item.key)\n onClose()\n }\n\n const hasSubmenu = item.children && item.children.length > 0\n\n const handleMouseEnter = () => {\n if (!hasSubmenu) return\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setShowSubmenu(true)\n }\n\n const handleMouseLeave = () => {\n if (!hasSubmenu) return\n timeoutRef.current = setTimeout(() => setShowSubmenu(false), 100)\n }\n\n return (\n <li\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className=\"relative\"\n >\n <button\n onClick={handleClick}\n disabled={item.disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${item.danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n {hasSubmenu && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n {hasSubmenu && showSubmenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {item.children!.map((child) => (\n <MenuItem key={child.key} item={child} onSelect={onSelect} onClose={onClose} />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nconst ContextMenuRoot: React.FC<ContextMenuProps> = ({\n children,\n items,\n onSelect,\n disabled = false,\n className = '',\n}) => {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 })\n const menuRef = useRef<HTMLUListElement>(null)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return\n e.preventDefault()\n e.stopPropagation()\n\n // Calculate position, ensuring menu stays within viewport\n let x = e.clientX\n let y = e.clientY\n\n // We'll adjust after render when we know menu dimensions\n setPosition({ x, y })\n setVisible(true)\n },\n [disabled]\n )\n\n const handleClose = useCallback(() => {\n setVisible(false)\n }, [])\n\n const handleSelect = useCallback(\n (key: string) => {\n onSelect?.(key)\n },\n [onSelect]\n )\n\n // Adjust position after menu renders to keep it in viewport\n useEffect(() => {\n if (visible && menuRef.current) {\n const menu = menuRef.current\n const rect = menu.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let { x, y } = position\n\n if (x + rect.width > viewportWidth) {\n x = viewportWidth - rect.width - 8\n }\n if (y + rect.height > viewportHeight) {\n y = viewportHeight - rect.height - 8\n }\n\n if (x !== position.x || y !== position.y) {\n setPosition({ x, y })\n }\n }\n }, [visible, position])\n\n // Close on click outside or escape\n useEffect(() => {\n if (!visible) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n handleClose()\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose()\n }\n }\n\n const handleScroll = () => {\n handleClose()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n document.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }, [visible, handleClose])\n\n // Determine if using data-driven or compound pattern\n // Find menu content children (not the trigger element)\n const childArray = React.Children.toArray(children)\n const triggerChild = childArray[0]\n const menuChildren = childArray.slice(1)\n const useDataDriven = items && items.length > 0\n\n const contextValue: ContextMenuContextValue = {\n onSelect: handleSelect,\n onClose: handleClose,\n }\n\n return (\n <>\n <div ref={triggerRef} onContextMenu={handleContextMenu} className=\"inline-block\">\n {triggerChild}\n </div>\n {visible &&\n createPortal(\n <ContextMenuContext.Provider value={contextValue}>\n <ul\n ref={menuRef}\n className={`menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${className}`}\n style={{ left: position.x, top: position.y }}\n >\n {useDataDriven\n ? items!.map((item) => (\n <MenuItem key={item.key} item={item} onSelect={handleSelect} onClose={handleClose} />\n ))\n : menuChildren}\n </ul>\n </ContextMenuContext.Provider>,\n document.body\n )}\n </>\n )\n}\n\n// Assign compound components\nexport const ContextMenu = Object.assign(ContextMenuRoot, {\n Item: ContextMenuItemComponent,\n Divider: ContextMenuDividerComponent,\n SubMenu: ContextMenuSubMenuComponent,\n})\n"],"names":["ContextMenuContext","createContext","useContextMenuContext","context","useContext","ContextMenuItemComponent","itemKey","children","icon","disabled","danger","className","onSelect","onClose","jsx","jsxs","ContextMenuDividerComponent","ContextMenuSubMenuComponent","_itemKey","label","showSubmenu","setShowSubmenu","useState","timeoutRef","useRef","handleMouseEnter","handleMouseLeave","MenuItem","item","handleClick","hasSubmenu","child","ContextMenuRoot","items","visible","setVisible","position","setPosition","menuRef","triggerRef","handleContextMenu","useCallback","e","x","y","handleClose","handleSelect","key","useEffect","rect","viewportWidth","viewportHeight","handleClickOutside","handleEscape","handleScroll","childArray","React","triggerChild","menuChildren","useDataDriven","contextValue","Fragment","createPortal","ContextMenu"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as n } from "react/jsx-runtime";
2
- import { useClipboard as z } from "./index101.js";
2
+ import { useClipboard as z } from "../hooks/useClipboard.js";
3
3
  const W = () => /* @__PURE__ */ n(
4
4
  "svg",
5
5
  {
@@ -93,4 +93,4 @@ F.displayName = "CopyButton";
93
93
  export {
94
94
  F as CopyButton
95
95
  };
96
- //# sourceMappingURL=index10.js.map
96
+ //# sourceMappingURL=CopyButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyButton.js","sources":["../../src/components/CopyButton.tsx"],"sourcesContent":["import React from 'react'\nimport { useClipboard } from '../hooks/useClipboard'\n\nexport interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onError'> {\n /** Text to copy to clipboard */\n text: string\n /** Duration in ms to show copied state */\n timeout?: number\n /** Button color */\n color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'\n /** Button style variant */\n variant?: 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Button shape */\n shape?: 'square' | 'circle'\n /** Custom icon for default state */\n icon?: React.ReactNode\n /** Custom icon for copied state */\n copiedIcon?: React.ReactNode\n /** Custom content for default state (overrides icon) */\n children?: React.ReactNode\n /** Custom content for copied state */\n copiedChildren?: React.ReactNode\n /** Callback when copy succeeds */\n onCopy?: () => void\n /** Callback when copy fails */\n onError?: (error: Error) => void\n /** Show tooltip with copy status */\n showTooltip?: boolean\n /** Tooltip text for default state */\n tooltipText?: string\n /** Tooltip text for copied state */\n copiedTooltipText?: string\n}\n\nconst CopyIcon: React.FC = () => (\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n)\n\nconst CheckIcon: React.FC = () => (\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"m4.5 12.75 6 6 9-13.5\" />\n </svg>\n)\n\nexport const CopyButton: React.FC<CopyButtonProps> = ({\n text,\n timeout = 2000,\n color,\n variant,\n size = 'md',\n shape,\n icon,\n copiedIcon,\n children,\n copiedChildren,\n onCopy,\n onError,\n showTooltip = false,\n tooltipText = 'Copy',\n copiedTooltipText = 'Copied!',\n className = '',\n disabled,\n onClick,\n ...rest\n}) => {\n const { copy, copied } = useClipboard(timeout)\n\n const handleClick = async (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (disabled) return\n\n const success = await copy(text)\n if (success) {\n onCopy?.()\n } else {\n onError?.(new Error('Failed to copy to clipboard'))\n }\n }\n\n const colorClasses = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n info: 'btn-info',\n success: 'btn-success',\n warning: 'btn-warning',\n error: 'btn-error',\n neutral: 'btn-neutral',\n }\n\n const variantClasses = {\n solid: '',\n outline: 'btn-outline',\n dash: 'btn-dash',\n soft: 'btn-soft',\n ghost: 'btn-ghost',\n link: 'btn-link',\n }\n\n const sizeClasses = {\n xs: 'btn-xs',\n sm: 'btn-sm',\n md: '',\n lg: 'btn-lg',\n xl: 'btn-xl',\n }\n\n const shapeClasses = {\n square: 'btn-square',\n circle: 'btn-circle',\n }\n\n const classes = [\n 'btn',\n color && colorClasses[color],\n copied && 'btn-success',\n variant && variantClasses[variant],\n sizeClasses[size],\n shape && shapeClasses[shape],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const defaultIcon = icon ?? <CopyIcon />\n const successIcon = copiedIcon ?? <CheckIcon />\n\n const content = copied\n ? (copiedChildren ?? successIcon)\n : (children ?? defaultIcon)\n\n const button = (\n <button\n type=\"button\"\n className={classes}\n onClick={handleClick}\n disabled={disabled}\n aria-label={copied ? copiedTooltipText : tooltipText}\n {...rest}\n >\n {content}\n </button>\n )\n\n if (showTooltip) {\n return (\n <div className=\"tooltip\" data-tip={copied ? copiedTooltipText : tooltipText}>\n {button}\n </div>\n )\n }\n\n return button\n}\n\nCopyButton.displayName = 'CopyButton'\n"],"names":["CopyIcon","jsx","CheckIcon","CopyButton","text","timeout","color","variant","size","shape","icon","copiedIcon","children","copiedChildren","onCopy","onError","showTooltip","tooltipText","copiedTooltipText","className","disabled","onClick","rest","copy","copied","useClipboard","handleClick","e","colorClasses","variantClasses","sizeClasses","shapeClasses","classes","button"],"mappings":";;AAoCA,MAAMA,IAAqB,MACzB,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IAEP,UAAA,gBAAAA,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAY,KAAI,GAAE,wHAAA,CAAwH;AAAA,EAAA;AAC/L,GAGIC,IAAsB,MAC1B,gBAAAD;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IAEP,UAAA,gBAAAA,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAY,KAAI,GAAE,wBAAA,CAAwB;AAAA,EAAA;AAC/F,GAGWE,IAAwC,CAAC;AAAA,EACpD,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,aAAAC,IAAc;AAAA,EACd,mBAAAC,IAAoB;AAAA,EACpB,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,MAAAC,GAAM,QAAAC,MAAWC,EAAapB,CAAO,GAEvCqB,IAAc,OAAOC,MAA2C;AAEpE,QADAN,IAAUM,CAAC,GACPP,EAAU;AAGd,IADgB,MAAMG,EAAKnB,CAAI,IAE7BU,IAAA,IAEAC,IAAU,IAAI,MAAM,6BAA6B,CAAC;AAAA,EAEtD,GAEMa,IAAe;AAAA,IACnB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,GAGLC,IAAiB;AAAA,IACrB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EAAA,GAGFC,IAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAAe;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,GAGJC,IAAU;AAAA,IACd;AAAA,IACA1B,KAASsB,EAAatB,CAAK;AAAA,IAC3BkB,KAAU;AAAA,IACVjB,KAAWsB,EAAetB,CAAO;AAAA,IACjCuB,EAAYtB,CAAI;AAAA,IAChBC,KAASsB,EAAatB,CAAK;AAAA,IAC3BU;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GASLc,IACJ,gBAAAhC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW+B;AAAA,MACX,SAASN;AAAA,MACT,UAAAN;AAAA,MACA,cAAYI,IAASN,IAAoBD;AAAA,MACxC,GAAGK;AAAA,MAEH,UAbWE,IACXX,MAHeF,KAAc,gBAAAV,EAACC,GAAA,CAAA,CAAU,KAIxCU,MALeF,KAAQ,gBAAAT,EAACD,GAAA,CAAA,CAAS;AAAA,IAgBjC;AAAA,EAAA;AAIL,SAAIgB,IAEA,gBAAAf,EAAC,SAAI,WAAU,WAAU,YAAUuB,IAASN,IAAoBD,GAC7D,UAAAgB,EAAA,CACH,IAIGA;AACT;AAEA9B,EAAW,cAAc;"}