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
@@ -35,4 +35,4 @@ m.displayName = "Toggle";
35
35
  export {
36
36
  m as Toggle
37
37
  };
38
- //# sourceMappingURL=index88.js.map
38
+ //# sourceMappingURL=Toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toggle.js","sources":["../../src/components/Toggle.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nexport interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n className?: string\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n (\n {\n size,\n color,\n className = '',\n ...props\n },\n ref\n ) => {\n const sizeClasses = {\n xs: 'toggle-xs',\n sm: 'toggle-sm',\n md: 'toggle-md',\n lg: 'toggle-lg',\n xl: 'toggle-xl',\n }\n\n const colorClasses = {\n primary: 'toggle-primary',\n secondary: 'toggle-secondary',\n accent: 'toggle-accent',\n neutral: 'toggle-neutral',\n success: 'toggle-success',\n warning: 'toggle-warning',\n info: 'toggle-info',\n error: 'toggle-error',\n }\n\n const toggleClasses = [\n 'toggle',\n size && sizeClasses[size],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const dataState = props.checked ? 'checked' : 'unchecked'\n return <input ref={ref} type=\"checkbox\" className={toggleClasses} data-state={dataState} {...props} />\n }\n)\n\nToggle.displayName = 'Toggle'\n"],"names":["Toggle","forwardRef","size","color","className","props","ref","sizeClasses","colorClasses","toggleClasses","dataState","jsx"],"mappings":";;AAQO,MAAMA,IAASC;AAAA,EACpB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAc;AAAA,MAClB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAGAC,IAAe;AAAA,MACnB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,IAAA,GAGHC,IAAgB;AAAA,MACpB;AAAA,MACAP,KAAQK,EAAYL,CAAI;AAAA,MACxBC,KAASK,EAAaL,CAAK;AAAA,MAC3BC;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELM,IAAYL,EAAM,UAAU,YAAY;AAC9C,WAAO,gBAAAM,EAAC,SAAA,EAAM,KAAAL,GAAU,MAAK,YAAW,WAAWG,GAAe,cAAYC,GAAY,GAAGL,EAAA,CAAO;AAAA,EACtG;AACF;AAEAL,EAAO,cAAc;"}
@@ -34,4 +34,4 @@ const f = ({
34
34
  export {
35
35
  f as Tooltip
36
36
  };
37
- //# sourceMappingURL=index90.js.map
37
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","sources":["../../src/components/Tooltip.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n tip: string\n position?: 'top' | 'bottom' | 'left' | 'right'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n open?: boolean\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n children,\n tip,\n className = '',\n position = 'top',\n color,\n open = false,\n ...rest\n}) => {\n const positionClasses = {\n top: 'tooltip-top',\n bottom: 'tooltip-bottom',\n left: 'tooltip-left',\n right: 'tooltip-right',\n }\n\n const colorClasses = color\n ? {\n neutral: 'tooltip-neutral',\n primary: 'tooltip-primary',\n secondary: 'tooltip-secondary',\n accent: 'tooltip-accent',\n info: 'tooltip-info',\n success: 'tooltip-success',\n warning: 'tooltip-warning',\n error: 'tooltip-error',\n }[color]\n : undefined\n\n const classes = [\n 'tooltip',\n positionClasses[position],\n colorClasses,\n open && 'tooltip-open',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={classes} data-tip={tip} data-state={open ? 'open' : 'closed'} {...rest}>\n {children}\n </div>\n )\n}\n"],"names":["Tooltip","children","tip","className","position","color","open","rest","positionClasses","colorClasses","classes","jsx"],"mappings":";AAUO,MAAMA,IAAkC,CAAC;AAAA,EAC9C,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAkB;AAAA,IACtB,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,GAGHC,IAAeJ,IACjB;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,EACPA,CAAK,IACP,QAEEK,IAAU;AAAA,IACd;AAAA,IACAF,EAAgBJ,CAAQ;AAAA,IACxBK;AAAA,IACAH,KAAQ;AAAA,IACRH;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAQ,EAAC,OAAA,EAAI,WAAWD,GAAS,YAAUR,GAAK,cAAYI,IAAO,SAAS,UAAW,GAAGC,GAC/E,UAAAN,EAAA,CACH;AAEJ;"}
@@ -234,4 +234,4 @@ const j = (t) => t ? typeof t == "function" ? t() : t.current : null, R = (t, f,
234
234
  export {
235
235
  nt as Tour
236
236
  };
237
- //# sourceMappingURL=index89.js.map
237
+ //# sourceMappingURL=Tour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index89.js","sources":["../src/components/Tour.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport type TourPlacement =\n | 'top'\n | 'topLeft'\n | 'topRight'\n | 'bottom'\n | 'bottomLeft'\n | 'bottomRight'\n | 'left'\n | 'leftTop'\n | 'leftBottom'\n | 'right'\n | 'rightTop'\n | 'rightBottom'\n | 'center'\n\nexport interface TourStepProps {\n /** Target element ref or function returning element */\n target?: React.RefObject<HTMLElement | null> | (() => HTMLElement | null) | null\n /** Step title */\n title: React.ReactNode\n /** Step description */\n description?: React.ReactNode\n /** Cover image or content above title */\n cover?: React.ReactNode\n /** Placement of popover relative to target */\n placement?: TourPlacement\n /** Custom class for this step's popover */\n className?: string\n /** Called when this step becomes active */\n onOpen?: () => void\n /** Called when leaving this step */\n onClose?: () => void\n}\n\nexport interface TourProps {\n /** Whether tour is visible */\n open?: boolean\n /** Callback when tour closes */\n onClose?: () => void\n /** Callback when tour finishes (last step completed) */\n onFinish?: () => void\n /** Tour steps */\n steps: TourStepProps[]\n /** Current step (controlled) */\n current?: number\n /** Callback when step changes */\n onChange?: (current: number) => void\n /** Show mask overlay */\n mask?: boolean\n /** Type affects styling */\n type?: 'default' | 'primary'\n /** Gap between highlight and target [radius, offset] or single number */\n gap?: number | [number, number]\n /** Text for prev button */\n prevButtonText?: React.ReactNode\n /** Text for next button */\n nextButtonText?: React.ReactNode\n /** Text for finish button */\n finishButtonText?: React.ReactNode\n /** Text for skip button */\n skipButtonText?: React.ReactNode\n /** Show skip button */\n showSkip?: boolean\n /** Show step indicators */\n showIndicators?: boolean\n /** Close on mask click */\n closeOnMaskClick?: boolean\n /** Close on escape key */\n closeOnEscape?: boolean\n /** Scroll target into view */\n scrollIntoView?: boolean\n /** Z-index for tour overlay */\n zIndex?: number\n}\n\nconst getTargetElement = (\n target: TourStepProps['target']\n): HTMLElement | null => {\n if (!target) return null\n if (typeof target === 'function') return target()\n return target.current\n}\n\nconst getPopoverPosition = (\n targetRect: DOMRect | null,\n placement: TourPlacement,\n popoverRect: DOMRect,\n gap: number\n): { top: number; left: number } => {\n if (!targetRect || placement === 'center') {\n return {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n }\n }\n\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n\n const positions: Record<TourPlacement, { top: number; left: number }> = {\n top: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n topLeft: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX,\n },\n topRight: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n bottom: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n bottomLeft: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX,\n },\n bottomRight: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n left: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftTop: {\n top: targetRect.top + scrollY,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n right: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.right + scrollX + gap,\n },\n rightTop: {\n top: targetRect.top + scrollY,\n left: targetRect.right + scrollX + gap,\n },\n rightBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.right + scrollX + gap,\n },\n center: {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n },\n }\n\n return positions[placement]\n}\n\nexport const Tour: React.FC<TourProps> = ({\n open = false,\n onClose,\n onFinish,\n steps,\n current: controlledCurrent,\n onChange,\n mask = true,\n type = 'default',\n gap = 8,\n prevButtonText = 'Previous',\n nextButtonText = 'Next',\n finishButtonText = 'Finish',\n skipButtonText = 'Skip',\n showSkip = true,\n showIndicators = true,\n closeOnMaskClick = true,\n closeOnEscape = true,\n scrollIntoView = true,\n zIndex = 1000,\n}) => {\n const [internalCurrent, setInternalCurrent] = useState(0)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [popoverPosition, setPopoverPosition] = useState({ top: 0, left: 0 })\n const popoverRef = useRef<HTMLDivElement>(null)\n\n const isControlled = controlledCurrent !== undefined\n const currentStep = isControlled ? controlledCurrent : internalCurrent\n const step = steps[currentStep]\n\n const gapRadius = Array.isArray(gap) ? gap[0] : gap\n const gapOffset = Array.isArray(gap) ? gap[1] : gap\n\n const updatePosition = useCallback(() => {\n if (!step) return\n\n const target = getTargetElement(step.target)\n const rect = target?.getBoundingClientRect() ?? null\n setTargetRect(rect)\n\n if (popoverRef.current) {\n const popoverRect = popoverRef.current.getBoundingClientRect()\n const placement = step.placement ?? 'bottom'\n const pos = getPopoverPosition(rect, placement, popoverRect, gapOffset + gapRadius)\n setPopoverPosition(pos)\n }\n }, [step, gapOffset, gapRadius])\n\n const goToStep = useCallback(\n (stepIndex: number) => {\n if (stepIndex < 0 || stepIndex >= steps.length) return\n\n // Call onClose for current step\n steps[currentStep]?.onClose?.()\n\n if (!isControlled) {\n setInternalCurrent(stepIndex)\n }\n onChange?.(stepIndex)\n\n // Call onOpen for new step\n steps[stepIndex]?.onOpen?.()\n },\n [steps, currentStep, isControlled, onChange]\n )\n\n const handlePrev = useCallback(() => {\n goToStep(currentStep - 1)\n }, [currentStep, goToStep])\n\n const handleNext = useCallback(() => {\n if (currentStep === steps.length - 1) {\n onFinish?.()\n onClose?.()\n } else {\n goToStep(currentStep + 1)\n }\n }, [currentStep, steps.length, goToStep, onFinish, onClose])\n\n const handleSkip = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handleMaskClick = useCallback(() => {\n if (closeOnMaskClick) {\n onClose?.()\n }\n }, [closeOnMaskClick, onClose])\n\n // Reset to first step when opening\n useEffect(() => {\n if (open && !isControlled) {\n setInternalCurrent(0)\n }\n }, [open, isControlled])\n\n // Update position on step change or open\n useEffect(() => {\n if (!open) return\n\n updatePosition()\n\n // Scroll target into view\n if (scrollIntoView && step?.target) {\n const target = getTargetElement(step.target)\n target?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n\n // Call onOpen for first step\n if (currentStep === 0) {\n step?.onOpen?.()\n }\n }, [open, currentStep, step, scrollIntoView, updatePosition])\n\n // Update position on resize/scroll\n useEffect(() => {\n if (!open) return\n\n const handleUpdate = () => updatePosition()\n window.addEventListener('resize', handleUpdate)\n window.addEventListener('scroll', handleUpdate, true)\n\n // Initial position after popover renders\n requestAnimationFrame(updatePosition)\n\n return () => {\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('scroll', handleUpdate, true)\n }\n }, [open, updatePosition])\n\n // Keyboard handling\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.()\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n handleNext()\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n handlePrev()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose, handleNext, handlePrev])\n\n if (!open || !step) return null\n\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === steps.length - 1\n\n const content = (\n <div\n className=\"fixed inset-0\"\n style={{ zIndex }}\n data-testid=\"tour\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Mask overlay with spotlight cutout */}\n {mask && (\n <svg\n className=\"absolute inset-0 w-full h-full pointer-events-auto\"\n onClick={handleMaskClick}\n style={{ zIndex }}\n >\n <defs>\n <mask id=\"tour-mask\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {targetRect && (\n <rect\n x={targetRect.left - gapRadius}\n y={targetRect.top - gapRadius}\n width={targetRect.width + gapRadius * 2}\n height={targetRect.height + gapRadius * 2}\n rx={gapRadius}\n fill=\"black\"\n />\n )}\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0, 0, 0, 0.5)\"\n mask=\"url(#tour-mask)\"\n />\n </svg>\n )}\n\n {/* Popover */}\n <div\n ref={popoverRef}\n className={`absolute bg-base-100 rounded-lg shadow-xl border border-base-300 max-w-sm ${step.className ?? ''}`}\n style={{\n top: popoverPosition.top,\n left: popoverPosition.left,\n zIndex: zIndex + 1,\n }}\n onClick={(e) => e.stopPropagation()}\n data-testid=\"tour-popover\"\n >\n {/* Cover */}\n {step.cover && (\n <div className=\"rounded-t-lg overflow-hidden\">{step.cover}</div>\n )}\n\n {/* Content */}\n <div className=\"p-4\">\n <h3 className=\"font-semibold text-lg mb-1\">{step.title}</h3>\n {step.description && (\n <p className=\"text-base-content/70 text-sm mb-4\">{step.description}</p>\n )}\n\n {/* Indicators */}\n {showIndicators && steps.length > 1 && (\n <div className=\"flex gap-1 mb-4\">\n {steps.map((_, index) => (\n <button\n key={index}\n className={`w-2 h-2 rounded-full transition-colors ${\n index === currentStep\n ? 'bg-primary'\n : 'bg-base-300 hover:bg-base-content/30'\n }`}\n onClick={() => goToStep(index)}\n aria-label={`Go to step ${index + 1}`}\n />\n ))}\n </div>\n )}\n\n {/* Navigation */}\n <div className=\"flex items-center justify-between gap-2\">\n <div>\n {showSkip && !isLastStep && (\n <button\n className=\"btn btn-ghost btn-sm\"\n onClick={handleSkip}\n data-testid=\"tour-skip\"\n >\n {skipButtonText}\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n {!isFirstStep && (\n <button\n className=\"btn btn-ghost btn-sm\"\n onClick={handlePrev}\n data-testid=\"tour-prev\"\n >\n {prevButtonText}\n </button>\n )}\n <button\n className={`btn btn-sm ${type === 'primary' ? 'btn-primary' : ''}`}\n onClick={handleNext}\n data-testid=\"tour-next\"\n >\n {isLastStep ? finishButtonText : nextButtonText}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n"],"names":["getTargetElement","target","getPopoverPosition","targetRect","placement","popoverRect","gap","scrollY","scrollX","Tour","open","onClose","onFinish","steps","controlledCurrent","onChange","mask","type","prevButtonText","nextButtonText","finishButtonText","skipButtonText","showSkip","showIndicators","closeOnMaskClick","closeOnEscape","scrollIntoView","zIndex","internalCurrent","setInternalCurrent","useState","setTargetRect","popoverPosition","setPopoverPosition","popoverRef","useRef","isControlled","currentStep","step","gapRadius","gapOffset","updatePosition","useCallback","rect","pos","goToStep","stepIndex","handlePrev","handleNext","handleSkip","handleMaskClick","useEffect","handleUpdate","handleKeyDown","e","isFirstStep","isLastStep","content","jsxs","jsx","_","index","createPortal"],"mappings":"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"}
1
+ {"version":3,"file":"Tour.js","sources":["../../src/components/Tour.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport type TourPlacement =\n | 'top'\n | 'topLeft'\n | 'topRight'\n | 'bottom'\n | 'bottomLeft'\n | 'bottomRight'\n | 'left'\n | 'leftTop'\n | 'leftBottom'\n | 'right'\n | 'rightTop'\n | 'rightBottom'\n | 'center'\n\nexport interface TourStepProps {\n /** Target element ref or function returning element */\n target?: React.RefObject<HTMLElement | null> | (() => HTMLElement | null) | null\n /** Step title */\n title: React.ReactNode\n /** Step description */\n description?: React.ReactNode\n /** Cover image or content above title */\n cover?: React.ReactNode\n /** Placement of popover relative to target */\n placement?: TourPlacement\n /** Custom class for this step's popover */\n className?: string\n /** Called when this step becomes active */\n onOpen?: () => void\n /** Called when leaving this step */\n onClose?: () => void\n}\n\nexport interface TourProps {\n /** Whether tour is visible */\n open?: boolean\n /** Callback when tour closes */\n onClose?: () => void\n /** Callback when tour finishes (last step completed) */\n onFinish?: () => void\n /** Tour steps */\n steps: TourStepProps[]\n /** Current step (controlled) */\n current?: number\n /** Callback when step changes */\n onChange?: (current: number) => void\n /** Show mask overlay */\n mask?: boolean\n /** Type affects styling */\n type?: 'default' | 'primary'\n /** Gap between highlight and target [radius, offset] or single number */\n gap?: number | [number, number]\n /** Text for prev button */\n prevButtonText?: React.ReactNode\n /** Text for next button */\n nextButtonText?: React.ReactNode\n /** Text for finish button */\n finishButtonText?: React.ReactNode\n /** Text for skip button */\n skipButtonText?: React.ReactNode\n /** Show skip button */\n showSkip?: boolean\n /** Show step indicators */\n showIndicators?: boolean\n /** Close on mask click */\n closeOnMaskClick?: boolean\n /** Close on escape key */\n closeOnEscape?: boolean\n /** Scroll target into view */\n scrollIntoView?: boolean\n /** Z-index for tour overlay */\n zIndex?: number\n}\n\nconst getTargetElement = (\n target: TourStepProps['target']\n): HTMLElement | null => {\n if (!target) return null\n if (typeof target === 'function') return target()\n return target.current\n}\n\nconst getPopoverPosition = (\n targetRect: DOMRect | null,\n placement: TourPlacement,\n popoverRect: DOMRect,\n gap: number\n): { top: number; left: number } => {\n if (!targetRect || placement === 'center') {\n return {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n }\n }\n\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n\n const positions: Record<TourPlacement, { top: number; left: number }> = {\n top: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n topLeft: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX,\n },\n topRight: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n bottom: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n bottomLeft: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX,\n },\n bottomRight: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n left: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftTop: {\n top: targetRect.top + scrollY,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n right: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.right + scrollX + gap,\n },\n rightTop: {\n top: targetRect.top + scrollY,\n left: targetRect.right + scrollX + gap,\n },\n rightBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.right + scrollX + gap,\n },\n center: {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n },\n }\n\n return positions[placement]\n}\n\nexport const Tour: React.FC<TourProps> = ({\n open = false,\n onClose,\n onFinish,\n steps,\n current: controlledCurrent,\n onChange,\n mask = true,\n type = 'default',\n gap = 8,\n prevButtonText = 'Previous',\n nextButtonText = 'Next',\n finishButtonText = 'Finish',\n skipButtonText = 'Skip',\n showSkip = true,\n showIndicators = true,\n closeOnMaskClick = true,\n closeOnEscape = true,\n scrollIntoView = true,\n zIndex = 1000,\n}) => {\n const [internalCurrent, setInternalCurrent] = useState(0)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [popoverPosition, setPopoverPosition] = useState({ top: 0, left: 0 })\n const popoverRef = useRef<HTMLDivElement>(null)\n\n const isControlled = controlledCurrent !== undefined\n const currentStep = isControlled ? controlledCurrent : internalCurrent\n const step = steps[currentStep]\n\n const gapRadius = Array.isArray(gap) ? gap[0] : gap\n const gapOffset = Array.isArray(gap) ? gap[1] : gap\n\n const updatePosition = useCallback(() => {\n if (!step) return\n\n const target = getTargetElement(step.target)\n const rect = target?.getBoundingClientRect() ?? null\n setTargetRect(rect)\n\n if (popoverRef.current) {\n const popoverRect = popoverRef.current.getBoundingClientRect()\n const placement = step.placement ?? 'bottom'\n const pos = getPopoverPosition(rect, placement, popoverRect, gapOffset + gapRadius)\n setPopoverPosition(pos)\n }\n }, [step, gapOffset, gapRadius])\n\n const goToStep = useCallback(\n (stepIndex: number) => {\n if (stepIndex < 0 || stepIndex >= steps.length) return\n\n // Call onClose for current step\n steps[currentStep]?.onClose?.()\n\n if (!isControlled) {\n setInternalCurrent(stepIndex)\n }\n onChange?.(stepIndex)\n\n // Call onOpen for new step\n steps[stepIndex]?.onOpen?.()\n },\n [steps, currentStep, isControlled, onChange]\n )\n\n const handlePrev = useCallback(() => {\n goToStep(currentStep - 1)\n }, [currentStep, goToStep])\n\n const handleNext = useCallback(() => {\n if (currentStep === steps.length - 1) {\n onFinish?.()\n onClose?.()\n } else {\n goToStep(currentStep + 1)\n }\n }, [currentStep, steps.length, goToStep, onFinish, onClose])\n\n const handleSkip = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handleMaskClick = useCallback(() => {\n if (closeOnMaskClick) {\n onClose?.()\n }\n }, [closeOnMaskClick, onClose])\n\n // Reset to first step when opening\n useEffect(() => {\n if (open && !isControlled) {\n setInternalCurrent(0)\n }\n }, [open, isControlled])\n\n // Update position on step change or open\n useEffect(() => {\n if (!open) return\n\n updatePosition()\n\n // Scroll target into view\n if (scrollIntoView && step?.target) {\n const target = getTargetElement(step.target)\n target?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n\n // Call onOpen for first step\n if (currentStep === 0) {\n step?.onOpen?.()\n }\n }, [open, currentStep, step, scrollIntoView, updatePosition])\n\n // Update position on resize/scroll\n useEffect(() => {\n if (!open) return\n\n const handleUpdate = () => updatePosition()\n window.addEventListener('resize', handleUpdate)\n window.addEventListener('scroll', handleUpdate, true)\n\n // Initial position after popover renders\n requestAnimationFrame(updatePosition)\n\n return () => {\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('scroll', handleUpdate, true)\n }\n }, [open, updatePosition])\n\n // Keyboard handling\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.()\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n handleNext()\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n handlePrev()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose, handleNext, handlePrev])\n\n if (!open || !step) return null\n\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === steps.length - 1\n\n const content = (\n <div\n className=\"fixed inset-0\"\n style={{ zIndex }}\n data-testid=\"tour\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Mask overlay with spotlight cutout */}\n {mask && (\n <svg\n className=\"absolute inset-0 w-full h-full pointer-events-auto\"\n onClick={handleMaskClick}\n style={{ zIndex }}\n >\n <defs>\n <mask id=\"tour-mask\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {targetRect && (\n <rect\n x={targetRect.left - gapRadius}\n y={targetRect.top - gapRadius}\n width={targetRect.width + gapRadius * 2}\n height={targetRect.height + gapRadius * 2}\n rx={gapRadius}\n fill=\"black\"\n />\n )}\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0, 0, 0, 0.5)\"\n mask=\"url(#tour-mask)\"\n />\n </svg>\n )}\n\n {/* Popover */}\n <div\n ref={popoverRef}\n className={`absolute bg-base-100 rounded-lg shadow-xl border border-base-300 max-w-sm ${step.className ?? ''}`}\n style={{\n top: popoverPosition.top,\n left: popoverPosition.left,\n zIndex: zIndex + 1,\n }}\n onClick={(e) => e.stopPropagation()}\n data-testid=\"tour-popover\"\n >\n {/* Cover */}\n {step.cover && (\n <div className=\"rounded-t-lg overflow-hidden\">{step.cover}</div>\n )}\n\n {/* Content */}\n <div className=\"p-4\">\n <h3 className=\"font-semibold text-lg mb-1\">{step.title}</h3>\n {step.description && (\n <p className=\"text-base-content/70 text-sm mb-4\">{step.description}</p>\n )}\n\n {/* Indicators */}\n {showIndicators && steps.length > 1 && (\n <div className=\"flex gap-1 mb-4\">\n {steps.map((_, index) => (\n <button\n key={index}\n className={`w-2 h-2 rounded-full transition-colors ${\n index === currentStep\n ? 'bg-primary'\n : 'bg-base-300 hover:bg-base-content/30'\n }`}\n onClick={() => goToStep(index)}\n aria-label={`Go to step ${index + 1}`}\n />\n ))}\n </div>\n )}\n\n {/* Navigation */}\n <div className=\"flex items-center justify-between gap-2\">\n <div>\n {showSkip && !isLastStep && (\n <button\n className=\"btn btn-ghost btn-sm\"\n onClick={handleSkip}\n data-testid=\"tour-skip\"\n >\n {skipButtonText}\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n {!isFirstStep && (\n <button\n className=\"btn btn-ghost btn-sm\"\n onClick={handlePrev}\n data-testid=\"tour-prev\"\n >\n {prevButtonText}\n </button>\n )}\n <button\n className={`btn btn-sm ${type === 'primary' ? 'btn-primary' : ''}`}\n onClick={handleNext}\n data-testid=\"tour-next\"\n >\n {isLastStep ? finishButtonText : nextButtonText}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n"],"names":["getTargetElement","target","getPopoverPosition","targetRect","placement","popoverRect","gap","scrollY","scrollX","Tour","open","onClose","onFinish","steps","controlledCurrent","onChange","mask","type","prevButtonText","nextButtonText","finishButtonText","skipButtonText","showSkip","showIndicators","closeOnMaskClick","closeOnEscape","scrollIntoView","zIndex","internalCurrent","setInternalCurrent","useState","setTargetRect","popoverPosition","setPopoverPosition","popoverRef","useRef","isControlled","currentStep","step","gapRadius","gapOffset","updatePosition","useCallback","rect","pos","goToStep","stepIndex","handlePrev","handleNext","handleSkip","handleMaskClick","useEffect","handleUpdate","handleKeyDown","e","isFirstStep","isLastStep","content","jsxs","jsx","_","index","createPortal"],"mappings":"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"}
@@ -210,4 +210,4 @@ function G({
210
210
  export {
211
211
  G as Transfer
212
212
  };
213
- //# sourceMappingURL=index91.js.map
213
+ //# sourceMappingURL=Transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transfer.js","sources":["../../src/components/Transfer.tsx"],"sourcesContent":["import React, { useState, useCallback, useMemo } from 'react'\n\nexport interface TransferItem {\n key: string\n title: React.ReactNode\n description?: React.ReactNode\n disabled?: boolean\n}\n\nexport interface TransferProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n dataSource: TransferItem[]\n targetKeys?: string[]\n defaultTargetKeys?: string[]\n onChange?: (targetKeys: string[], direction: 'left' | 'right', moveKeys: string[]) => void\n onSelectChange?: (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => void\n titles?: [React.ReactNode, React.ReactNode]\n render?: (item: TransferItem) => React.ReactNode\n showSearch?: boolean\n filterOption?: (inputValue: string, item: TransferItem) => boolean\n showSelectAll?: boolean\n disabled?: boolean\n listStyle?: React.CSSProperties\n}\n\ninterface TransferListProps {\n items: TransferItem[]\n selectedKeys: string[]\n onSelectChange: (keys: string[]) => void\n title: React.ReactNode\n showSearch: boolean\n filterOption: (inputValue: string, item: TransferItem) => boolean\n render: (item: TransferItem) => React.ReactNode\n showSelectAll: boolean\n disabled: boolean\n listStyle?: React.CSSProperties\n direction: 'left' | 'right'\n}\n\nfunction TransferList({\n items,\n selectedKeys,\n onSelectChange,\n title,\n showSearch,\n filterOption,\n render,\n showSelectAll,\n disabled,\n listStyle,\n}: TransferListProps) {\n const [searchValue, setSearchValue] = useState('')\n\n const filteredItems = useMemo(() => {\n if (!searchValue) return items\n return items.filter((item) => filterOption(searchValue, item))\n }, [items, searchValue, filterOption])\n\n const enabledItems = filteredItems.filter((item) => !item.disabled)\n const allSelected = enabledItems.length > 0 && enabledItems.every((item) => selectedKeys.includes(item.key))\n const someSelected = enabledItems.some((item) => selectedKeys.includes(item.key))\n\n const handleSelectAll = () => {\n if (disabled) return\n\n if (allSelected) {\n // Deselect all enabled items\n onSelectChange(selectedKeys.filter((key) => !enabledItems.some((item) => item.key === key)))\n } else {\n // Select all enabled items\n const enabledKeys = enabledItems.map((item) => item.key)\n const newKeys = [...new Set([...selectedKeys, ...enabledKeys])]\n onSelectChange(newKeys)\n }\n }\n\n const handleSelectItem = (key: string, itemDisabled: boolean) => {\n if (disabled || itemDisabled) return\n\n if (selectedKeys.includes(key)) {\n onSelectChange(selectedKeys.filter((k) => k !== key))\n } else {\n onSelectChange([...selectedKeys, key])\n }\n }\n\n return (\n <div\n className=\"flex flex-col border border-base-300 rounded-lg bg-base-100 overflow-hidden\"\n style={{ width: 200, height: 300, ...listStyle }}\n >\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-base-300 bg-base-200\">\n {showSelectAll && (\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm checkbox-primary\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected && !allSelected\n }}\n onChange={handleSelectAll}\n disabled={disabled || enabledItems.length === 0}\n />\n )}\n <span className=\"flex-1 font-medium text-sm truncate\">{title}</span>\n <span className=\"text-xs text-base-content/50\">\n {selectedKeys.filter((k) => filteredItems.some((item) => item.key === k)).length}/\n {filteredItems.length}\n </span>\n </div>\n\n {/* Search */}\n {showSearch && (\n <div className=\"px-2 py-2 border-b border-base-300\">\n <input\n type=\"text\"\n className=\"input input-sm w-full\"\n placeholder=\"Search...\"\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n disabled={disabled}\n />\n </div>\n )}\n\n {/* List */}\n <div className=\"flex-1 overflow-auto\">\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => (\n <div\n key={item.key}\n className={[\n 'flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-base-200 transition-colors',\n selectedKeys.includes(item.key) && 'bg-primary/10',\n (disabled || item.disabled) && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleSelectItem(item.key, !!item.disabled)}\n >\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm checkbox-primary\"\n checked={selectedKeys.includes(item.key)}\n disabled={disabled || item.disabled}\n onChange={() => {}}\n />\n <span className=\"flex-1 truncate text-sm\">{render(item)}</span>\n </div>\n ))\n ) : (\n <div className=\"flex items-center justify-center h-full text-base-content/50 text-sm\">\n No data\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport function Transfer({\n dataSource,\n targetKeys: controlledTargetKeys,\n defaultTargetKeys = [],\n onChange,\n onSelectChange,\n titles = ['Source', 'Target'],\n render = (item) => item.title,\n showSearch = false,\n filterOption = (inputValue, item) => {\n const title = typeof item.title === 'string' ? item.title : String(item.title)\n return title.toLowerCase().includes(inputValue.toLowerCase())\n },\n showSelectAll = true,\n disabled = false,\n listStyle,\n className = '',\n ...rest\n}: TransferProps) {\n const [internalTargetKeys, setInternalTargetKeys] = useState<string[]>(defaultTargetKeys)\n const [sourceSelectedKeys, setSourceSelectedKeys] = useState<string[]>([])\n const [targetSelectedKeys, setTargetSelectedKeys] = useState<string[]>([])\n\n const targetKeys = controlledTargetKeys ?? internalTargetKeys\n\n // Split items into source and target\n const sourceItems = useMemo(\n () => dataSource.filter((item) => !targetKeys.includes(item.key)),\n [dataSource, targetKeys]\n )\n\n const targetItems = useMemo(\n () => dataSource.filter((item) => targetKeys.includes(item.key)),\n [dataSource, targetKeys]\n )\n\n const handleSourceSelectChange = useCallback(\n (keys: string[]) => {\n setSourceSelectedKeys(keys)\n onSelectChange?.(keys, targetSelectedKeys)\n },\n [targetSelectedKeys, onSelectChange]\n )\n\n const handleTargetSelectChange = useCallback(\n (keys: string[]) => {\n setTargetSelectedKeys(keys)\n onSelectChange?.(sourceSelectedKeys, keys)\n },\n [sourceSelectedKeys, onSelectChange]\n )\n\n const moveToTarget = useCallback(() => {\n if (disabled || sourceSelectedKeys.length === 0) return\n\n // Filter out disabled items\n const movableKeys = sourceSelectedKeys.filter((key) => {\n const item = dataSource.find((i) => i.key === key)\n return item && !item.disabled\n })\n\n if (movableKeys.length === 0) return\n\n const newTargetKeys = [...targetKeys, ...movableKeys]\n\n if (controlledTargetKeys === undefined) {\n setInternalTargetKeys(newTargetKeys)\n }\n\n setSourceSelectedKeys([])\n onChange?.(newTargetKeys, 'right', movableKeys)\n }, [disabled, sourceSelectedKeys, targetKeys, controlledTargetKeys, onChange, dataSource])\n\n const moveToSource = useCallback(() => {\n if (disabled || targetSelectedKeys.length === 0) return\n\n // Filter out disabled items\n const movableKeys = targetSelectedKeys.filter((key) => {\n const item = dataSource.find((i) => i.key === key)\n return item && !item.disabled\n })\n\n if (movableKeys.length === 0) return\n\n const newTargetKeys = targetKeys.filter((key) => !movableKeys.includes(key))\n\n if (controlledTargetKeys === undefined) {\n setInternalTargetKeys(newTargetKeys)\n }\n\n setTargetSelectedKeys([])\n onChange?.(newTargetKeys, 'left', movableKeys)\n }, [disabled, targetSelectedKeys, targetKeys, controlledTargetKeys, onChange, dataSource])\n\n const canMoveToTarget = sourceSelectedKeys.some((key) => {\n const item = dataSource.find((i) => i.key === key)\n return item && !item.disabled\n })\n\n const canMoveToSource = targetSelectedKeys.some((key) => {\n const item = dataSource.find((i) => i.key === key)\n return item && !item.disabled\n })\n\n return (\n <div className={`flex items-center gap-4 ${className}`} {...rest}>\n {/* Source list */}\n <TransferList\n items={sourceItems}\n selectedKeys={sourceSelectedKeys}\n onSelectChange={handleSourceSelectChange}\n title={titles[0]}\n showSearch={showSearch}\n filterOption={filterOption}\n render={render}\n showSelectAll={showSelectAll}\n disabled={disabled}\n listStyle={listStyle}\n direction=\"left\"\n />\n\n {/* Actions */}\n <div className=\"flex flex-col gap-2\">\n <button\n type=\"button\"\n className=\"btn btn-sm btn-outline\"\n onClick={moveToTarget}\n disabled={disabled || !canMoveToTarget}\n aria-label=\"Move to target\"\n >\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 <button\n type=\"button\"\n className=\"btn btn-sm btn-outline\"\n onClick={moveToSource}\n disabled={disabled || !canMoveToSource}\n aria-label=\"Move to source\"\n >\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=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Target list */}\n <TransferList\n items={targetItems}\n selectedKeys={targetSelectedKeys}\n onSelectChange={handleTargetSelectChange}\n title={titles[1]}\n showSearch={showSearch}\n filterOption={filterOption}\n render={render}\n showSelectAll={showSelectAll}\n disabled={disabled}\n listStyle={listStyle}\n direction=\"right\"\n />\n </div>\n )\n}\n"],"names":["TransferList","items","selectedKeys","onSelectChange","title","showSearch","filterOption","render","showSelectAll","disabled","listStyle","searchValue","setSearchValue","useState","filteredItems","useMemo","item","enabledItems","allSelected","someSelected","handleSelectAll","key","enabledKeys","newKeys","handleSelectItem","itemDisabled","k","jsxs","jsx","el","Transfer","dataSource","controlledTargetKeys","defaultTargetKeys","onChange","titles","inputValue","className","rest","internalTargetKeys","setInternalTargetKeys","sourceSelectedKeys","setSourceSelectedKeys","targetSelectedKeys","setTargetSelectedKeys","targetKeys","sourceItems","targetItems","handleSourceSelectChange","useCallback","keys","handleTargetSelectChange","moveToTarget","movableKeys","i","newTargetKeys","moveToSource","canMoveToTarget","canMoveToSource"],"mappings":"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"}
@@ -441,4 +441,4 @@ const _e = Object.assign(
441
441
  export {
442
442
  _e as Tree
443
443
  };
444
- //# sourceMappingURL=index92.js.map
444
+ //# sourceMappingURL=Tree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index92.js","sources":["../src/components/Tree.tsx"],"sourcesContent":["import React, {\n useState,\n useCallback,\n useMemo,\n useRef,\n useContext,\n createContext,\n forwardRef,\n useEffect,\n} from 'react'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TreeColor =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n\nexport type TreeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface TreeDataNode {\n key: string\n title: React.ReactNode\n children?: TreeDataNode[]\n disabled?: boolean\n disableCheckbox?: boolean\n selectable?: boolean\n checkable?: boolean\n icon?: React.ReactNode\n isLeaf?: boolean\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Tree data structure (alternative to compound pattern) */\n treeData?: TreeDataNode[] | undefined\n /** Children for compound pattern */\n children?: React.ReactNode\n /** Show checkbox for each node */\n checkable?: boolean\n /** Checkbox color (DaisyUI) */\n checkboxColor?: TreeColor\n /** Checkbox size (DaisyUI) */\n checkboxSize?: TreeSize\n /** Enable node selection */\n selectable?: boolean\n /** Allow multiple selection */\n multiple?: boolean\n /** Expand all nodes by default */\n defaultExpandAll?: boolean\n /** Default expanded keys */\n defaultExpandedKeys?: string[]\n /** Controlled expanded keys */\n expandedKeys?: string[]\n /** Default selected keys */\n defaultSelectedKeys?: string[]\n /** Controlled selected keys */\n selectedKeys?: string[]\n /** Default checked keys */\n defaultCheckedKeys?: string[]\n /** Controlled checked keys */\n checkedKeys?: string[]\n /** Callback when node is expanded */\n onExpand?: (expandedKeys: string[], info: { node: TreeDataNode; expanded: boolean }) => void\n /** Callback when node is selected */\n onSelect?: (selectedKeys: string[], info: { node: TreeDataNode; selected: boolean }) => void\n /** Callback when node is checked */\n onCheck?: (checkedKeys: string[], info: { node: TreeDataNode; checked: boolean }) => void\n /** Show connecting lines */\n showLine?: boolean\n /** Show node icons */\n showIcon?: boolean\n /** Decouple parent-child checkbox relationship */\n checkStrictly?: boolean\n /** Auto expand parent nodes when expandedKeys change */\n autoExpandParent?: boolean\n /** Make node fill remaining horizontal space */\n blockNode?: boolean\n /** Custom expand/collapse icon */\n switcherIcon?: React.ReactNode | ((expanded: boolean) => React.ReactNode)\n /** Custom title render function */\n titleRender?: (node: TreeDataNode) => React.ReactNode\n /** Filter function for highlighting nodes */\n filterTreeNode?: (node: TreeDataNode) => boolean\n /** Async data loading */\n loadData?: (node: TreeDataNode) => Promise<void>\n /** Right click handler */\n onRightClick?: (info: { event: React.MouseEvent; node: TreeDataNode }) => void\n /** Custom field names for data mapping */\n fieldNames?: { key?: string; title?: string; children?: string }\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface TreeContextValue {\n checkable: boolean\n checkboxColor: TreeColor\n checkboxSize: TreeSize\n selectable: boolean\n multiple: boolean\n showLine: boolean\n showIcon: boolean\n blockNode: boolean\n checkStrictly: boolean\n expandedKeys: string[]\n selectedKeys: string[]\n checkedKeys: string[]\n loadingKeys: string[]\n switcherIcon?: React.ReactNode | ((expanded: boolean) => React.ReactNode)\n titleRender?: (node: TreeDataNode) => React.ReactNode\n filterTreeNode?: (node: TreeDataNode) => boolean\n onToggle: (key: string, node: TreeDataNode) => void\n onSelect: (key: string, node: TreeDataNode) => void\n onCheck: (key: string, node: TreeDataNode) => void\n onRightClick?: (info: { event: React.MouseEvent; node: TreeDataNode }) => void\n getCheckedState: (node: TreeDataNode) => { checked: boolean; indeterminate: boolean }\n focusedKey: string | null\n setFocusedKey: (key: string | null) => void\n flattenedNodes: TreeDataNode[]\n registerNode: (key: string, node: TreeDataNode, level: number) => void\n baseTestId: string\n}\n\nconst TreeContext = createContext<TreeContextValue | null>(null)\n\nfunction useTreeContext() {\n const context = useContext(TreeContext)\n if (!context) {\n throw new Error('Tree components must be used within a Tree')\n }\n return context\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction getAllKeys(data: TreeDataNode[]): string[] {\n const keys: string[] = []\n const traverse = (nodes: TreeDataNode[]) => {\n nodes.forEach((node) => {\n keys.push(node.key)\n if (node.children) {\n traverse(node.children)\n }\n })\n }\n traverse(data)\n return keys\n}\n\nfunction getDescendantKeys(node: TreeDataNode): string[] {\n const keys: string[] = []\n const traverse = (n: TreeDataNode) => {\n if (n.children) {\n n.children.forEach((child) => {\n keys.push(child.key)\n traverse(child)\n })\n }\n }\n traverse(node)\n return keys\n}\n\nfunction getParentMap(data: TreeDataNode[]): Map<string, string | null> {\n const map = new Map<string, string | null>()\n const traverse = (nodes: TreeDataNode[], parentKey: string | null) => {\n nodes.forEach((node) => {\n map.set(node.key, parentKey)\n if (node.children) {\n traverse(node.children, node.key)\n }\n })\n }\n traverse(data, null)\n return map\n}\n\nfunction findNode(data: TreeDataNode[], key: string): TreeDataNode | null {\n for (const node of data) {\n if (node.key === key) return node\n if (node.children) {\n const found = findNode(node.children, key)\n if (found) return found\n }\n }\n return null\n}\n\nfunction flattenTree(data: TreeDataNode[], expandedKeys: string[]): TreeDataNode[] {\n const result: TreeDataNode[] = []\n const traverse = (nodes: TreeDataNode[]) => {\n nodes.forEach((node) => {\n result.push(node)\n if (node.children && expandedKeys.includes(node.key)) {\n traverse(node.children)\n }\n })\n }\n traverse(data)\n return result\n}\n\nfunction getAncestorKeys(data: TreeDataNode[], key: string): string[] {\n const parentMap = getParentMap(data)\n const ancestors: string[] = []\n let currentKey: string | null | undefined = parentMap.get(key)\n while (currentKey) {\n ancestors.push(currentKey)\n currentKey = parentMap.get(currentKey)\n }\n return ancestors\n}\n\n// ============================================================================\n// TreeNode Component\n// ============================================================================\n\ninterface TreeNodeInternalProps {\n node: TreeDataNode\n level: number\n}\n\nfunction TreeNodeInternal({ node, level }: TreeNodeInternalProps) {\n const {\n checkable,\n checkboxColor,\n checkboxSize,\n selectable,\n showLine,\n showIcon,\n blockNode,\n expandedKeys,\n selectedKeys,\n loadingKeys,\n switcherIcon,\n titleRender,\n filterTreeNode,\n onToggle,\n onSelect,\n onCheck,\n onRightClick,\n getCheckedState,\n focusedKey,\n setFocusedKey,\n flattenedNodes,\n baseTestId,\n } = useTreeContext()\n\n const nodeRef = useRef<HTMLDivElement>(null)\n const hasChildren = node.children && node.children.length > 0\n const isLeaf = node.isLeaf ?? !hasChildren\n const isExpanded = expandedKeys.includes(node.key)\n const isSelected = selectedKeys.includes(node.key)\n const isLoading = loadingKeys.includes(node.key)\n const isFocused = focusedKey === node.key\n const { checked, indeterminate } = getCheckedState(node)\n const isFiltered = filterTreeNode ? filterTreeNode(node) : false\n const isDisabled = node.disabled\n\n // Focus management\n useEffect(() => {\n if (isFocused && nodeRef.current) {\n nodeRef.current.focus()\n }\n }, [isFocused])\n\n const handleToggle = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation()\n if (!isLeaf && !isDisabled) {\n onToggle(node.key, node)\n }\n }\n\n const handleSelect = (_e: React.MouseEvent | React.KeyboardEvent) => {\n if (selectable && node.selectable !== false && !isDisabled) {\n onSelect(node.key, node)\n }\n }\n\n const handleCheck = (e: React.MouseEvent | React.ChangeEvent) => {\n e.stopPropagation()\n if (!isDisabled && !node.disableCheckbox) {\n onCheck(node.key, node)\n }\n }\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (onRightClick) {\n e.preventDefault()\n onRightClick({ event: e, node })\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const currentIndex = flattenedNodes.findIndex((n) => n.key === node.key)\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const nextNode = flattenedNodes[currentIndex + 1]\n if (nextNode) {\n setFocusedKey(nextNode.key)\n }\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const prevNode = flattenedNodes[currentIndex - 1]\n if (prevNode) {\n setFocusedKey(prevNode.key)\n }\n break\n }\n case 'ArrowRight': {\n e.preventDefault()\n if (!isLeaf && !isExpanded) {\n onToggle(node.key, node)\n } else if (hasChildren && isExpanded) {\n const firstChild = node.children![0]\n setFocusedKey(firstChild.key)\n }\n break\n }\n case 'ArrowLeft': {\n e.preventDefault()\n if (!isLeaf && isExpanded) {\n onToggle(node.key, node)\n }\n break\n }\n case 'Enter':\n case ' ': {\n e.preventDefault()\n if (checkable && node.checkable !== false) {\n onCheck(node.key, node)\n } else if (selectable && node.selectable !== false) {\n onSelect(node.key, node)\n } else if (!isLeaf) {\n onToggle(node.key, node)\n }\n break\n }\n case 'Home': {\n e.preventDefault()\n const firstNode = flattenedNodes[0]\n if (firstNode) {\n setFocusedKey(firstNode.key)\n }\n break\n }\n case 'End': {\n e.preventDefault()\n const lastNode = flattenedNodes[flattenedNodes.length - 1]\n if (lastNode) {\n setFocusedKey(lastNode.key)\n }\n break\n }\n }\n }\n\n // Checkbox classes - must use static strings for Tailwind JIT\n const checkboxSizeClasses: Record<TreeSize, string> = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: '',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n }\n const checkboxColorClasses: Record<TreeColor, string> = {\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n neutral: 'checkbox-neutral',\n info: 'checkbox-info',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n error: 'checkbox-error',\n }\n const checkboxSizeClass = checkboxSizeClasses[checkboxSize]\n const checkboxColorClass = checkboxColorClasses[checkboxColor]\n\n // Render switcher icon\n const renderSwitcher = () => {\n if (isLoading) {\n return <span className=\"loading loading-spinner loading-xs\" />\n }\n\n if (isLeaf) {\n return <span className=\"w-4 h-4\" />\n }\n\n if (switcherIcon) {\n return typeof switcherIcon === 'function' ? switcherIcon(isExpanded) : switcherIcon\n }\n\n return (\n <svg\n className={`w-4 h-4 transition-transform duration-200 ${isExpanded ? 'rotate-90' : ''}`}\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=\"M9 5l7 7-7 7\" />\n </svg>\n )\n }\n\n // Render title\n const renderTitle = () => {\n if (titleRender) {\n return titleRender(node)\n }\n return node.title\n }\n\n const nodeState = isSelected ? 'selected' : isExpanded ? 'expanded' : 'collapsed'\n\n return (\n <div\n className=\"tree-node\"\n role=\"treeitem\"\n aria-expanded={!isLeaf ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-checked={checkable ? (indeterminate ? 'mixed' : checked) : undefined}\n aria-disabled={isDisabled}\n aria-level={level + 1}\n data-testid={`${baseTestId}-node-${node.key}`}\n data-state={nodeState}\n data-key={node.key}\n >\n <div\n ref={nodeRef}\n className={[\n 'flex items-center py-1 px-1 rounded transition-colors outline-none',\n 'focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1',\n selectable && !isDisabled && 'cursor-pointer hover:bg-base-200',\n isSelected && 'bg-primary/10 text-primary',\n isDisabled && 'opacity-50 cursor-not-allowed',\n isFiltered && 'bg-warning/20',\n blockNode && 'w-full',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ paddingLeft: `${level * 20}px` }}\n tabIndex={isFocused ? 0 : -1}\n onClick={handleSelect}\n onContextMenu={handleContextMenu}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocusedKey(node.key)}\n >\n {/* Expand/Collapse icon */}\n <span\n className={[\n 'w-5 h-5 flex items-center justify-center flex-shrink-0',\n !isLeaf && !isDisabled && 'cursor-pointer hover:bg-base-300 rounded',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleToggle}\n aria-hidden=\"true\"\n >\n {renderSwitcher()}\n </span>\n\n {/* Checkbox */}\n {checkable && node.checkable !== false && (\n <span className=\"mr-1 flex-shrink-0\" onClick={handleCheck}>\n <input\n type=\"checkbox\"\n className={`checkbox ${checkboxSizeClass} ${checkboxColorClass}`}\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate\n }}\n disabled={isDisabled || node.disableCheckbox}\n onChange={handleCheck}\n tabIndex={-1}\n aria-hidden=\"true\"\n data-state={indeterminate ? 'indeterminate' : checked ? 'checked' : 'unchecked'}\n />\n </span>\n )}\n\n {/* Custom icon */}\n {showIcon && node.icon && (\n <span className=\"mr-1 flex-shrink-0\" aria-hidden=\"true\">\n {node.icon}\n </span>\n )}\n\n {/* Title */}\n <span className=\"flex-1 truncate select-none\">{renderTitle()}</span>\n </div>\n\n {/* Children */}\n {hasChildren && isExpanded && (\n <div\n className={showLine ? 'border-l border-base-300 ml-2.5' : ''}\n role=\"group\"\n aria-label={`${node.title} children`}\n >\n {node.children!.map((child) => (\n <TreeNodeInternal key={child.key} node={child} level={level + 1} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// Tree.Node Component (Compound Pattern)\n// ============================================================================\n\nexport interface TreeNodeProps {\n /** Unique key for the node (uses React's key prop) */\n key: string\n /** Display title */\n title: React.ReactNode\n /** Custom icon */\n icon?: React.ReactNode\n /** Disable the node */\n disabled?: boolean\n /** Disable checkbox for this node */\n disableCheckbox?: boolean\n /** Whether node can be selected */\n selectable?: boolean\n /** Whether node shows checkbox */\n checkable?: boolean\n /** Force node to be a leaf */\n isLeaf?: boolean\n /** Child nodes */\n children?: React.ReactNode\n}\n\nfunction TreeNode(_props: TreeNodeProps): null {\n // The actual rendering is handled by the Tree component via buildTree\n return null\n}\n\n// Mark the component for identification after bundling\nTreeNode.displayName = 'Tree.Node'\n\nfunction isTreeNode(element: React.ReactElement): boolean {\n return (\n element.type === TreeNode ||\n (typeof element.type === 'function' &&\n (element.type as { displayName?: string }).displayName === 'Tree.Node')\n )\n}\n\n// ============================================================================\n// Main Tree Component\n// ============================================================================\n\nexport const Tree = Object.assign(\n forwardRef<HTMLDivElement, TreeProps>(function Tree(\n {\n treeData: treeDataProp,\n children,\n checkable = false,\n checkboxColor = 'primary',\n checkboxSize = 'sm',\n selectable = true,\n multiple = false,\n defaultExpandAll = false,\n defaultExpandedKeys = [],\n expandedKeys: controlledExpandedKeys,\n defaultSelectedKeys = [],\n selectedKeys: controlledSelectedKeys,\n defaultCheckedKeys = [],\n checkedKeys: controlledCheckedKeys,\n onExpand,\n onSelect,\n onCheck,\n showLine = false,\n showIcon = false,\n checkStrictly = false,\n autoExpandParent = true,\n blockNode = false,\n switcherIcon,\n titleRender,\n filterTreeNode,\n loadData,\n onRightClick,\n fieldNames,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) {\n const baseTestId = testId ?? 'tree'\n // Handle compound pattern: collect nodes from children\n const registerNode = useCallback((_key: string, _node: TreeDataNode, _level: number) => {\n // Registration is handled by the buildTree function parsing children\n }, [])\n\n // Build tree data from compound children or use treeData prop\n const treeData = useMemo(() => {\n if (treeDataProp) {\n // Apply fieldNames mapping if provided\n if (fieldNames) {\n const mapNode = (node: Record<string, unknown>): TreeDataNode => {\n const key = fieldNames.key ? (node[fieldNames.key] as string) : (node.key as string)\n const title = fieldNames.title ? node[fieldNames.title] : node.title\n const children = fieldNames.children ? node[fieldNames.children] : node.children\n\n return {\n ...node,\n key,\n title: title as React.ReactNode,\n children: Array.isArray(children)\n ? children.map((child) => mapNode(child as Record<string, unknown>))\n : undefined,\n } as TreeDataNode\n }\n return (treeDataProp as unknown as Record<string, unknown>[]).map(mapNode)\n }\n return treeDataProp\n }\n\n // Build from compound pattern\n const buildTree = (nodes: React.ReactNode): TreeDataNode[] => {\n const result: TreeDataNode[] = []\n React.Children.forEach(nodes, (child) => {\n if (React.isValidElement(child) && isTreeNode(child)) {\n const props = child.props as Omit<TreeNodeProps, 'key'>\n // React's key is accessed via child.key, not child.props.key\n const key = child.key as string\n if (!key) {\n console.warn('Tree.Node requires a key prop')\n return\n }\n const node: TreeDataNode = {\n key,\n title: props.title,\n icon: props.icon,\n disabled: props.disabled,\n disableCheckbox: props.disableCheckbox,\n selectable: props.selectable,\n checkable: props.checkable,\n isLeaf: props.isLeaf,\n children: props.children ? buildTree(props.children) : undefined,\n }\n result.push(node)\n }\n })\n return result\n }\n\n return buildTree(children)\n }, [treeDataProp, children, fieldNames])\n\n // Loading state for async data\n const [loadingKeys, setLoadingKeys] = useState<string[]>([])\n\n // Initialize expanded keys\n const initialExpandedKeys = useMemo(() => {\n if (defaultExpandAll) {\n return getAllKeys(treeData)\n }\n if (autoExpandParent && defaultExpandedKeys.length > 0) {\n const allKeys = new Set(defaultExpandedKeys)\n defaultExpandedKeys.forEach((key) => {\n getAncestorKeys(treeData, key).forEach((k) => allKeys.add(k))\n })\n return Array.from(allKeys)\n }\n return defaultExpandedKeys\n }, [])\n\n const [internalExpandedKeys, setInternalExpandedKeys] = useState<string[]>(initialExpandedKeys)\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys)\n const [internalCheckedKeys, setInternalCheckedKeys] = useState<string[]>(defaultCheckedKeys)\n const [focusedKey, setFocusedKey] = useState<string | null>(null)\n\n const expandedKeys = controlledExpandedKeys ?? internalExpandedKeys\n const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys\n const checkedKeys = controlledCheckedKeys ?? internalCheckedKeys\n\n const parentMap = useMemo(() => getParentMap(treeData), [treeData])\n\n // Flatten visible nodes for keyboard navigation\n const flattenedNodes = useMemo(() => flattenTree(treeData, expandedKeys), [treeData, expandedKeys])\n\n // Calculate checked state for each node\n const getCheckedState = useCallback(\n (node: TreeDataNode): { checked: boolean; indeterminate: boolean } => {\n if (checkStrictly) {\n return { checked: checkedKeys.includes(node.key), indeterminate: false }\n }\n\n if (!node.children || node.children.length === 0) {\n return { checked: checkedKeys.includes(node.key), indeterminate: false }\n }\n\n const descendantKeys = getDescendantKeys(node)\n const checkedDescendants = descendantKeys.filter((k) => checkedKeys.includes(k))\n\n if (checkedDescendants.length === 0) {\n return { checked: checkedKeys.includes(node.key), indeterminate: false }\n }\n\n if (checkedDescendants.length === descendantKeys.length) {\n return { checked: true, indeterminate: false }\n }\n\n return { checked: false, indeterminate: true }\n },\n [checkedKeys, checkStrictly]\n )\n\n const handleToggle = useCallback(\n async (key: string, node: TreeDataNode) => {\n const isExpanded = expandedKeys.includes(key)\n\n // Handle async loading\n if (loadData && !isExpanded && !node.isLeaf && (!node.children || node.children.length === 0)) {\n setLoadingKeys((prev) => [...prev, key])\n try {\n await loadData(node)\n } finally {\n setLoadingKeys((prev) => prev.filter((k) => k !== key))\n }\n }\n\n const newExpandedKeys = isExpanded\n ? expandedKeys.filter((k) => k !== key)\n : [...expandedKeys, key]\n\n if (controlledExpandedKeys === undefined) {\n setInternalExpandedKeys(newExpandedKeys)\n }\n\n onExpand?.(newExpandedKeys, { node, expanded: !isExpanded })\n },\n [expandedKeys, controlledExpandedKeys, onExpand, loadData]\n )\n\n const handleSelect = useCallback(\n (key: string, node: TreeDataNode) => {\n let newSelectedKeys: string[]\n\n if (multiple) {\n if (selectedKeys.includes(key)) {\n newSelectedKeys = selectedKeys.filter((k) => k !== key)\n } else {\n newSelectedKeys = [...selectedKeys, key]\n }\n } else {\n newSelectedKeys = selectedKeys.includes(key) ? [] : [key]\n }\n\n if (controlledSelectedKeys === undefined) {\n setInternalSelectedKeys(newSelectedKeys)\n }\n\n onSelect?.(newSelectedKeys, { node, selected: newSelectedKeys.includes(key) })\n },\n [selectedKeys, multiple, controlledSelectedKeys, onSelect]\n )\n\n const handleCheck = useCallback(\n (key: string, node: TreeDataNode) => {\n const isChecked = checkedKeys.includes(key)\n let newCheckedKeys = [...checkedKeys]\n\n if (checkStrictly) {\n // Simple toggle without parent-child relationship\n if (isChecked) {\n newCheckedKeys = newCheckedKeys.filter((k) => k !== key)\n } else {\n newCheckedKeys.push(key)\n }\n } else {\n // Get all descendant keys\n const descendantKeys = getDescendantKeys(node)\n\n if (isChecked) {\n // Uncheck this node and all descendants\n newCheckedKeys = newCheckedKeys.filter((k) => k !== key && !descendantKeys.includes(k))\n } else {\n // Check this node and all descendants\n newCheckedKeys.push(key)\n descendantKeys.forEach((dk) => {\n if (!newCheckedKeys.includes(dk)) {\n newCheckedKeys.push(dk)\n }\n })\n }\n\n // Update parent states\n let currentKey: string | null = parentMap.get(key) ?? null\n while (currentKey) {\n const parentNode = findNode(treeData, currentKey)\n if (parentNode && parentNode.children) {\n const allChildrenChecked = parentNode.children.every(\n (child) =>\n newCheckedKeys.includes(child.key) ||\n getDescendantKeys(child).every((dk) => newCheckedKeys.includes(dk))\n )\n\n if (allChildrenChecked) {\n if (!newCheckedKeys.includes(currentKey)) {\n newCheckedKeys.push(currentKey)\n }\n } else {\n newCheckedKeys = newCheckedKeys.filter((k) => k !== currentKey)\n }\n }\n currentKey = parentMap.get(currentKey) ?? null\n }\n }\n\n if (controlledCheckedKeys === undefined) {\n setInternalCheckedKeys(newCheckedKeys)\n }\n\n onCheck?.(newCheckedKeys, { node, checked: !isChecked })\n },\n [checkedKeys, controlledCheckedKeys, onCheck, parentMap, treeData, checkStrictly]\n )\n\n // Handle initial focus\n const handleTreeFocus = useCallback(() => {\n if (!focusedKey && flattenedNodes.length > 0) {\n setFocusedKey(flattenedNodes[0].key)\n }\n }, [focusedKey, flattenedNodes])\n\n const contextValue: TreeContextValue = {\n checkable,\n checkboxColor,\n checkboxSize,\n selectable,\n multiple,\n showLine,\n showIcon,\n blockNode,\n checkStrictly,\n expandedKeys,\n selectedKeys,\n checkedKeys,\n loadingKeys,\n switcherIcon,\n titleRender,\n filterTreeNode,\n onToggle: handleToggle,\n onSelect: handleSelect,\n onCheck: handleCheck,\n onRightClick,\n getCheckedState,\n focusedKey,\n setFocusedKey,\n flattenedNodes,\n registerNode,\n baseTestId,\n }\n\n return (\n <TreeContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={`tree ${className}`}\n role=\"tree\"\n aria-multiselectable={multiple}\n data-testid={baseTestId}\n onFocus={handleTreeFocus}\n {...rest}\n >\n {treeData.map((node) => (\n <TreeNodeInternal key={node.key} node={node} level={0} />\n ))}\n </div>\n </TreeContext.Provider>\n )\n }),\n {\n Node: TreeNode,\n }\n)\n"],"names":["TreeContext","createContext","useTreeContext","context","useContext","getAllKeys","data","keys","traverse","nodes","node","getDescendantKeys","n","child","getParentMap","map","parentKey","findNode","key","found","flattenTree","expandedKeys","result","getAncestorKeys","parentMap","ancestors","currentKey","TreeNodeInternal","level","checkable","checkboxColor","checkboxSize","selectable","showLine","showIcon","blockNode","selectedKeys","loadingKeys","switcherIcon","titleRender","filterTreeNode","onToggle","onSelect","onCheck","onRightClick","getCheckedState","focusedKey","setFocusedKey","flattenedNodes","baseTestId","nodeRef","useRef","hasChildren","isLeaf","isExpanded","isSelected","isLoading","isFocused","checked","indeterminate","isFiltered","isDisabled","useEffect","handleToggle","e","handleSelect","_e","handleCheck","handleContextMenu","handleKeyDown","currentIndex","nextNode","prevNode","firstChild","firstNode","lastNode","checkboxSizeClasses","checkboxColorClasses","checkboxSizeClass","checkboxColorClass","renderSwitcher","jsx","renderTitle","nodeState","jsxs","el","TreeNode","_props","isTreeNode","element","Tree","forwardRef","treeDataProp","children","multiple","defaultExpandAll","defaultExpandedKeys","controlledExpandedKeys","defaultSelectedKeys","controlledSelectedKeys","defaultCheckedKeys","controlledCheckedKeys","onExpand","checkStrictly","autoExpandParent","loadData","fieldNames","className","testId","rest","ref","registerNode","useCallback","_key","_node","_level","treeData","useMemo","mapNode","title","buildTree","React","props","setLoadingKeys","useState","initialExpandedKeys","allKeys","k","internalExpandedKeys","setInternalExpandedKeys","internalSelectedKeys","setInternalSelectedKeys","internalCheckedKeys","setInternalCheckedKeys","checkedKeys","descendantKeys","checkedDescendants","prev","newExpandedKeys","newSelectedKeys","isChecked","newCheckedKeys","dk","parentNode","handleTreeFocus","contextValue"],"mappings":"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"}
1
+ {"version":3,"file":"Tree.js","sources":["../../src/components/Tree.tsx"],"sourcesContent":["import React, {\n useState,\n useCallback,\n useMemo,\n useRef,\n useContext,\n createContext,\n forwardRef,\n useEffect,\n} from 'react'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TreeColor =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n\nexport type TreeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface TreeDataNode {\n key: string\n title: React.ReactNode\n children?: TreeDataNode[]\n disabled?: boolean\n disableCheckbox?: boolean\n selectable?: boolean\n checkable?: boolean\n icon?: React.ReactNode\n isLeaf?: boolean\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Tree data structure (alternative to compound pattern) */\n treeData?: TreeDataNode[] | undefined\n /** Children for compound pattern */\n children?: React.ReactNode\n /** Show checkbox for each node */\n checkable?: boolean\n /** Checkbox color (DaisyUI) */\n checkboxColor?: TreeColor\n /** Checkbox size (DaisyUI) */\n checkboxSize?: TreeSize\n /** Enable node selection */\n selectable?: boolean\n /** Allow multiple selection */\n multiple?: boolean\n /** Expand all nodes by default */\n defaultExpandAll?: boolean\n /** Default expanded keys */\n defaultExpandedKeys?: string[]\n /** Controlled expanded keys */\n expandedKeys?: string[]\n /** Default selected keys */\n defaultSelectedKeys?: string[]\n /** Controlled selected keys */\n selectedKeys?: string[]\n /** Default checked keys */\n defaultCheckedKeys?: string[]\n /** Controlled checked keys */\n checkedKeys?: string[]\n /** Callback when node is expanded */\n onExpand?: (expandedKeys: string[], info: { node: TreeDataNode; expanded: boolean }) => void\n /** Callback when node is selected */\n onSelect?: (selectedKeys: string[], info: { node: TreeDataNode; selected: boolean }) => void\n /** Callback when node is checked */\n onCheck?: (checkedKeys: string[], info: { node: TreeDataNode; checked: boolean }) => void\n /** Show connecting lines */\n showLine?: boolean\n /** Show node icons */\n showIcon?: boolean\n /** Decouple parent-child checkbox relationship */\n checkStrictly?: boolean\n /** Auto expand parent nodes when expandedKeys change */\n autoExpandParent?: boolean\n /** Make node fill remaining horizontal space */\n blockNode?: boolean\n /** Custom expand/collapse icon */\n switcherIcon?: React.ReactNode | ((expanded: boolean) => React.ReactNode)\n /** Custom title render function */\n titleRender?: (node: TreeDataNode) => React.ReactNode\n /** Filter function for highlighting nodes */\n filterTreeNode?: (node: TreeDataNode) => boolean\n /** Async data loading */\n loadData?: (node: TreeDataNode) => Promise<void>\n /** Right click handler */\n onRightClick?: (info: { event: React.MouseEvent; node: TreeDataNode }) => void\n /** Custom field names for data mapping */\n fieldNames?: { key?: string; title?: string; children?: string }\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface TreeContextValue {\n checkable: boolean\n checkboxColor: TreeColor\n checkboxSize: TreeSize\n selectable: boolean\n multiple: boolean\n showLine: boolean\n showIcon: boolean\n blockNode: boolean\n checkStrictly: boolean\n expandedKeys: string[]\n selectedKeys: string[]\n checkedKeys: string[]\n loadingKeys: string[]\n switcherIcon?: React.ReactNode | ((expanded: boolean) => React.ReactNode)\n titleRender?: (node: TreeDataNode) => React.ReactNode\n filterTreeNode?: (node: TreeDataNode) => boolean\n onToggle: (key: string, node: TreeDataNode) => void\n onSelect: (key: string, node: TreeDataNode) => void\n onCheck: (key: string, node: TreeDataNode) => void\n onRightClick?: (info: { event: React.MouseEvent; node: TreeDataNode }) => void\n getCheckedState: (node: TreeDataNode) => { checked: boolean; indeterminate: boolean }\n focusedKey: string | null\n setFocusedKey: (key: string | null) => void\n flattenedNodes: TreeDataNode[]\n registerNode: (key: string, node: TreeDataNode, level: number) => void\n baseTestId: string\n}\n\nconst TreeContext = createContext<TreeContextValue | null>(null)\n\nfunction useTreeContext() {\n const context = useContext(TreeContext)\n if (!context) {\n throw new Error('Tree components must be used within a Tree')\n }\n return context\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction getAllKeys(data: TreeDataNode[]): string[] {\n const keys: string[] = []\n const traverse = (nodes: TreeDataNode[]) => {\n nodes.forEach((node) => {\n keys.push(node.key)\n if (node.children) {\n traverse(node.children)\n }\n })\n }\n traverse(data)\n return keys\n}\n\nfunction getDescendantKeys(node: TreeDataNode): string[] {\n const keys: string[] = []\n const traverse = (n: TreeDataNode) => {\n if (n.children) {\n n.children.forEach((child) => {\n keys.push(child.key)\n traverse(child)\n })\n }\n }\n traverse(node)\n return keys\n}\n\nfunction getParentMap(data: TreeDataNode[]): Map<string, string | null> {\n const map = new Map<string, string | null>()\n const traverse = (nodes: TreeDataNode[], parentKey: string | null) => {\n nodes.forEach((node) => {\n map.set(node.key, parentKey)\n if (node.children) {\n traverse(node.children, node.key)\n }\n })\n }\n traverse(data, null)\n return map\n}\n\nfunction findNode(data: TreeDataNode[], key: string): TreeDataNode | null {\n for (const node of data) {\n if (node.key === key) return node\n if (node.children) {\n const found = findNode(node.children, key)\n if (found) return found\n }\n }\n return null\n}\n\nfunction flattenTree(data: TreeDataNode[], expandedKeys: string[]): TreeDataNode[] {\n const result: TreeDataNode[] = []\n const traverse = (nodes: TreeDataNode[]) => {\n nodes.forEach((node) => {\n result.push(node)\n if (node.children && expandedKeys.includes(node.key)) {\n traverse(node.children)\n }\n })\n }\n traverse(data)\n return result\n}\n\nfunction getAncestorKeys(data: TreeDataNode[], key: string): string[] {\n const parentMap = getParentMap(data)\n const ancestors: string[] = []\n let currentKey: string | null | undefined = parentMap.get(key)\n while (currentKey) {\n ancestors.push(currentKey)\n currentKey = parentMap.get(currentKey)\n }\n return ancestors\n}\n\n// ============================================================================\n// TreeNode Component\n// ============================================================================\n\ninterface TreeNodeInternalProps {\n node: TreeDataNode\n level: number\n}\n\nfunction TreeNodeInternal({ node, level }: TreeNodeInternalProps) {\n const {\n checkable,\n checkboxColor,\n checkboxSize,\n selectable,\n showLine,\n showIcon,\n blockNode,\n expandedKeys,\n selectedKeys,\n loadingKeys,\n switcherIcon,\n titleRender,\n filterTreeNode,\n onToggle,\n onSelect,\n onCheck,\n onRightClick,\n getCheckedState,\n focusedKey,\n setFocusedKey,\n flattenedNodes,\n baseTestId,\n } = useTreeContext()\n\n const nodeRef = useRef<HTMLDivElement>(null)\n const hasChildren = node.children && node.children.length > 0\n const isLeaf = node.isLeaf ?? !hasChildren\n const isExpanded = expandedKeys.includes(node.key)\n const isSelected = selectedKeys.includes(node.key)\n const isLoading = loadingKeys.includes(node.key)\n const isFocused = focusedKey === node.key\n const { checked, indeterminate } = getCheckedState(node)\n const isFiltered = filterTreeNode ? filterTreeNode(node) : false\n const isDisabled = node.disabled\n\n // Focus management\n useEffect(() => {\n if (isFocused && nodeRef.current) {\n nodeRef.current.focus()\n }\n }, [isFocused])\n\n const handleToggle = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation()\n if (!isLeaf && !isDisabled) {\n onToggle(node.key, node)\n }\n }\n\n const handleSelect = (_e: React.MouseEvent | React.KeyboardEvent) => {\n if (selectable && node.selectable !== false && !isDisabled) {\n onSelect(node.key, node)\n }\n }\n\n const handleCheck = (e: React.MouseEvent | React.ChangeEvent) => {\n e.stopPropagation()\n if (!isDisabled && !node.disableCheckbox) {\n onCheck(node.key, node)\n }\n }\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (onRightClick) {\n e.preventDefault()\n onRightClick({ event: e, node })\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const currentIndex = flattenedNodes.findIndex((n) => n.key === node.key)\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const nextNode = flattenedNodes[currentIndex + 1]\n if (nextNode) {\n setFocusedKey(nextNode.key)\n }\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const prevNode = flattenedNodes[currentIndex - 1]\n if (prevNode) {\n setFocusedKey(prevNode.key)\n }\n break\n }\n case 'ArrowRight': {\n e.preventDefault()\n if (!isLeaf && !isExpanded) {\n onToggle(node.key, node)\n } else if (hasChildren && isExpanded) {\n const firstChild = node.children![0]\n setFocusedKey(firstChild.key)\n }\n break\n }\n case 'ArrowLeft': {\n e.preventDefault()\n if (!isLeaf && isExpanded) {\n onToggle(node.key, node)\n }\n break\n }\n case 'Enter':\n case ' ': {\n e.preventDefault()\n if (checkable && node.checkable !== false) {\n onCheck(node.key, node)\n } else if (selectable && node.selectable !== false) {\n onSelect(node.key, node)\n } else if (!isLeaf) {\n onToggle(node.key, node)\n }\n break\n }\n case 'Home': {\n e.preventDefault()\n const firstNode = flattenedNodes[0]\n if (firstNode) {\n setFocusedKey(firstNode.key)\n }\n break\n }\n case 'End': {\n e.preventDefault()\n const lastNode = flattenedNodes[flattenedNodes.length - 1]\n if (lastNode) {\n setFocusedKey(lastNode.key)\n }\n break\n }\n }\n }\n\n // Checkbox classes - must use static strings for Tailwind JIT\n const checkboxSizeClasses: Record<TreeSize, string> = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: '',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n }\n const checkboxColorClasses: Record<TreeColor, string> = {\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n neutral: 'checkbox-neutral',\n info: 'checkbox-info',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n error: 'checkbox-error',\n }\n const checkboxSizeClass = checkboxSizeClasses[checkboxSize]\n const checkboxColorClass = checkboxColorClasses[checkboxColor]\n\n // Render switcher icon\n const renderSwitcher = () => {\n if (isLoading) {\n return <span className=\"loading loading-spinner loading-xs\" />\n }\n\n if (isLeaf) {\n return <span className=\"w-4 h-4\" />\n }\n\n if (switcherIcon) {\n return typeof switcherIcon === 'function' ? switcherIcon(isExpanded) : switcherIcon\n }\n\n return (\n <svg\n className={`w-4 h-4 transition-transform duration-200 ${isExpanded ? 'rotate-90' : ''}`}\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=\"M9 5l7 7-7 7\" />\n </svg>\n )\n }\n\n // Render title\n const renderTitle = () => {\n if (titleRender) {\n return titleRender(node)\n }\n return node.title\n }\n\n const nodeState = isSelected ? 'selected' : isExpanded ? 'expanded' : 'collapsed'\n\n return (\n <div\n className=\"tree-node\"\n role=\"treeitem\"\n aria-expanded={!isLeaf ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-checked={checkable ? (indeterminate ? 'mixed' : checked) : undefined}\n aria-disabled={isDisabled}\n aria-level={level + 1}\n data-testid={`${baseTestId}-node-${node.key}`}\n data-state={nodeState}\n data-key={node.key}\n >\n <div\n ref={nodeRef}\n className={[\n 'flex items-center py-1 px-1 rounded transition-colors outline-none',\n 'focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1',\n selectable && !isDisabled && 'cursor-pointer hover:bg-base-200',\n isSelected && 'bg-primary/10 text-primary',\n isDisabled && 'opacity-50 cursor-not-allowed',\n isFiltered && 'bg-warning/20',\n blockNode && 'w-full',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ paddingLeft: `${level * 20}px` }}\n tabIndex={isFocused ? 0 : -1}\n onClick={handleSelect}\n onContextMenu={handleContextMenu}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocusedKey(node.key)}\n >\n {/* Expand/Collapse icon */}\n <span\n className={[\n 'w-5 h-5 flex items-center justify-center flex-shrink-0',\n !isLeaf && !isDisabled && 'cursor-pointer hover:bg-base-300 rounded',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleToggle}\n aria-hidden=\"true\"\n >\n {renderSwitcher()}\n </span>\n\n {/* Checkbox */}\n {checkable && node.checkable !== false && (\n <span className=\"mr-1 flex-shrink-0\" onClick={handleCheck}>\n <input\n type=\"checkbox\"\n className={`checkbox ${checkboxSizeClass} ${checkboxColorClass}`}\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate\n }}\n disabled={isDisabled || node.disableCheckbox}\n onChange={handleCheck}\n tabIndex={-1}\n aria-hidden=\"true\"\n data-state={indeterminate ? 'indeterminate' : checked ? 'checked' : 'unchecked'}\n />\n </span>\n )}\n\n {/* Custom icon */}\n {showIcon && node.icon && (\n <span className=\"mr-1 flex-shrink-0\" aria-hidden=\"true\">\n {node.icon}\n </span>\n )}\n\n {/* Title */}\n <span className=\"flex-1 truncate select-none\">{renderTitle()}</span>\n </div>\n\n {/* Children */}\n {hasChildren && isExpanded && (\n <div\n className={showLine ? 'border-l border-base-300 ml-2.5' : ''}\n role=\"group\"\n aria-label={`${node.title} children`}\n >\n {node.children!.map((child) => (\n <TreeNodeInternal key={child.key} node={child} level={level + 1} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// Tree.Node Component (Compound Pattern)\n// ============================================================================\n\nexport interface TreeNodeProps {\n /** Unique key for the node (uses React's key prop) */\n key: string\n /** Display title */\n title: React.ReactNode\n /** Custom icon */\n icon?: React.ReactNode\n /** Disable the node */\n disabled?: boolean\n /** Disable checkbox for this node */\n disableCheckbox?: boolean\n /** Whether node can be selected */\n selectable?: boolean\n /** Whether node shows checkbox */\n checkable?: boolean\n /** Force node to be a leaf */\n isLeaf?: boolean\n /** Child nodes */\n children?: React.ReactNode\n}\n\nfunction TreeNode(_props: TreeNodeProps): null {\n // The actual rendering is handled by the Tree component via buildTree\n return null\n}\n\n// Mark the component for identification after bundling\nTreeNode.displayName = 'Tree.Node'\n\nfunction isTreeNode(element: React.ReactElement): boolean {\n return (\n element.type === TreeNode ||\n (typeof element.type === 'function' &&\n (element.type as { displayName?: string }).displayName === 'Tree.Node')\n )\n}\n\n// ============================================================================\n// Main Tree Component\n// ============================================================================\n\nexport const Tree = Object.assign(\n forwardRef<HTMLDivElement, TreeProps>(function Tree(\n {\n treeData: treeDataProp,\n children,\n checkable = false,\n checkboxColor = 'primary',\n checkboxSize = 'sm',\n selectable = true,\n multiple = false,\n defaultExpandAll = false,\n defaultExpandedKeys = [],\n expandedKeys: controlledExpandedKeys,\n defaultSelectedKeys = [],\n selectedKeys: controlledSelectedKeys,\n defaultCheckedKeys = [],\n checkedKeys: controlledCheckedKeys,\n onExpand,\n onSelect,\n onCheck,\n showLine = false,\n showIcon = false,\n checkStrictly = false,\n autoExpandParent = true,\n blockNode = false,\n switcherIcon,\n titleRender,\n filterTreeNode,\n loadData,\n onRightClick,\n fieldNames,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) {\n const baseTestId = testId ?? 'tree'\n // Handle compound pattern: collect nodes from children\n const registerNode = useCallback((_key: string, _node: TreeDataNode, _level: number) => {\n // Registration is handled by the buildTree function parsing children\n }, [])\n\n // Build tree data from compound children or use treeData prop\n const treeData = useMemo(() => {\n if (treeDataProp) {\n // Apply fieldNames mapping if provided\n if (fieldNames) {\n const mapNode = (node: Record<string, unknown>): TreeDataNode => {\n const key = fieldNames.key ? (node[fieldNames.key] as string) : (node.key as string)\n const title = fieldNames.title ? node[fieldNames.title] : node.title\n const children = fieldNames.children ? node[fieldNames.children] : node.children\n\n return {\n ...node,\n key,\n title: title as React.ReactNode,\n children: Array.isArray(children)\n ? children.map((child) => mapNode(child as Record<string, unknown>))\n : undefined,\n } as TreeDataNode\n }\n return (treeDataProp as unknown as Record<string, unknown>[]).map(mapNode)\n }\n return treeDataProp\n }\n\n // Build from compound pattern\n const buildTree = (nodes: React.ReactNode): TreeDataNode[] => {\n const result: TreeDataNode[] = []\n React.Children.forEach(nodes, (child) => {\n if (React.isValidElement(child) && isTreeNode(child)) {\n const props = child.props as Omit<TreeNodeProps, 'key'>\n // React's key is accessed via child.key, not child.props.key\n const key = child.key as string\n if (!key) {\n console.warn('Tree.Node requires a key prop')\n return\n }\n const node: TreeDataNode = {\n key,\n title: props.title,\n icon: props.icon,\n disabled: props.disabled,\n disableCheckbox: props.disableCheckbox,\n selectable: props.selectable,\n checkable: props.checkable,\n isLeaf: props.isLeaf,\n children: props.children ? buildTree(props.children) : undefined,\n }\n result.push(node)\n }\n })\n return result\n }\n\n return buildTree(children)\n }, [treeDataProp, children, fieldNames])\n\n // Loading state for async data\n const [loadingKeys, setLoadingKeys] = useState<string[]>([])\n\n // Initialize expanded keys\n const initialExpandedKeys = useMemo(() => {\n if (defaultExpandAll) {\n return getAllKeys(treeData)\n }\n if (autoExpandParent && defaultExpandedKeys.length > 0) {\n const allKeys = new Set(defaultExpandedKeys)\n defaultExpandedKeys.forEach((key) => {\n getAncestorKeys(treeData, key).forEach((k) => allKeys.add(k))\n })\n return Array.from(allKeys)\n }\n return defaultExpandedKeys\n }, [])\n\n const [internalExpandedKeys, setInternalExpandedKeys] = useState<string[]>(initialExpandedKeys)\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys)\n const [internalCheckedKeys, setInternalCheckedKeys] = useState<string[]>(defaultCheckedKeys)\n const [focusedKey, setFocusedKey] = useState<string | null>(null)\n\n const expandedKeys = controlledExpandedKeys ?? internalExpandedKeys\n const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys\n const checkedKeys = controlledCheckedKeys ?? internalCheckedKeys\n\n const parentMap = useMemo(() => getParentMap(treeData), [treeData])\n\n // Flatten visible nodes for keyboard navigation\n const flattenedNodes = useMemo(() => flattenTree(treeData, expandedKeys), [treeData, expandedKeys])\n\n // Calculate checked state for each node\n const getCheckedState = useCallback(\n (node: TreeDataNode): { checked: boolean; indeterminate: boolean } => {\n if (checkStrictly) {\n return { checked: checkedKeys.includes(node.key), indeterminate: false }\n }\n\n if (!node.children || node.children.length === 0) {\n return { checked: checkedKeys.includes(node.key), indeterminate: false }\n }\n\n const descendantKeys = getDescendantKeys(node)\n const checkedDescendants = descendantKeys.filter((k) => checkedKeys.includes(k))\n\n if (checkedDescendants.length === 0) {\n return { checked: checkedKeys.includes(node.key), indeterminate: false }\n }\n\n if (checkedDescendants.length === descendantKeys.length) {\n return { checked: true, indeterminate: false }\n }\n\n return { checked: false, indeterminate: true }\n },\n [checkedKeys, checkStrictly]\n )\n\n const handleToggle = useCallback(\n async (key: string, node: TreeDataNode) => {\n const isExpanded = expandedKeys.includes(key)\n\n // Handle async loading\n if (loadData && !isExpanded && !node.isLeaf && (!node.children || node.children.length === 0)) {\n setLoadingKeys((prev) => [...prev, key])\n try {\n await loadData(node)\n } finally {\n setLoadingKeys((prev) => prev.filter((k) => k !== key))\n }\n }\n\n const newExpandedKeys = isExpanded\n ? expandedKeys.filter((k) => k !== key)\n : [...expandedKeys, key]\n\n if (controlledExpandedKeys === undefined) {\n setInternalExpandedKeys(newExpandedKeys)\n }\n\n onExpand?.(newExpandedKeys, { node, expanded: !isExpanded })\n },\n [expandedKeys, controlledExpandedKeys, onExpand, loadData]\n )\n\n const handleSelect = useCallback(\n (key: string, node: TreeDataNode) => {\n let newSelectedKeys: string[]\n\n if (multiple) {\n if (selectedKeys.includes(key)) {\n newSelectedKeys = selectedKeys.filter((k) => k !== key)\n } else {\n newSelectedKeys = [...selectedKeys, key]\n }\n } else {\n newSelectedKeys = selectedKeys.includes(key) ? [] : [key]\n }\n\n if (controlledSelectedKeys === undefined) {\n setInternalSelectedKeys(newSelectedKeys)\n }\n\n onSelect?.(newSelectedKeys, { node, selected: newSelectedKeys.includes(key) })\n },\n [selectedKeys, multiple, controlledSelectedKeys, onSelect]\n )\n\n const handleCheck = useCallback(\n (key: string, node: TreeDataNode) => {\n const isChecked = checkedKeys.includes(key)\n let newCheckedKeys = [...checkedKeys]\n\n if (checkStrictly) {\n // Simple toggle without parent-child relationship\n if (isChecked) {\n newCheckedKeys = newCheckedKeys.filter((k) => k !== key)\n } else {\n newCheckedKeys.push(key)\n }\n } else {\n // Get all descendant keys\n const descendantKeys = getDescendantKeys(node)\n\n if (isChecked) {\n // Uncheck this node and all descendants\n newCheckedKeys = newCheckedKeys.filter((k) => k !== key && !descendantKeys.includes(k))\n } else {\n // Check this node and all descendants\n newCheckedKeys.push(key)\n descendantKeys.forEach((dk) => {\n if (!newCheckedKeys.includes(dk)) {\n newCheckedKeys.push(dk)\n }\n })\n }\n\n // Update parent states\n let currentKey: string | null = parentMap.get(key) ?? null\n while (currentKey) {\n const parentNode = findNode(treeData, currentKey)\n if (parentNode && parentNode.children) {\n const allChildrenChecked = parentNode.children.every(\n (child) =>\n newCheckedKeys.includes(child.key) ||\n getDescendantKeys(child).every((dk) => newCheckedKeys.includes(dk))\n )\n\n if (allChildrenChecked) {\n if (!newCheckedKeys.includes(currentKey)) {\n newCheckedKeys.push(currentKey)\n }\n } else {\n newCheckedKeys = newCheckedKeys.filter((k) => k !== currentKey)\n }\n }\n currentKey = parentMap.get(currentKey) ?? null\n }\n }\n\n if (controlledCheckedKeys === undefined) {\n setInternalCheckedKeys(newCheckedKeys)\n }\n\n onCheck?.(newCheckedKeys, { node, checked: !isChecked })\n },\n [checkedKeys, controlledCheckedKeys, onCheck, parentMap, treeData, checkStrictly]\n )\n\n // Handle initial focus\n const handleTreeFocus = useCallback(() => {\n if (!focusedKey && flattenedNodes.length > 0) {\n setFocusedKey(flattenedNodes[0].key)\n }\n }, [focusedKey, flattenedNodes])\n\n const contextValue: TreeContextValue = {\n checkable,\n checkboxColor,\n checkboxSize,\n selectable,\n multiple,\n showLine,\n showIcon,\n blockNode,\n checkStrictly,\n expandedKeys,\n selectedKeys,\n checkedKeys,\n loadingKeys,\n switcherIcon,\n titleRender,\n filterTreeNode,\n onToggle: handleToggle,\n onSelect: handleSelect,\n onCheck: handleCheck,\n onRightClick,\n getCheckedState,\n focusedKey,\n setFocusedKey,\n flattenedNodes,\n registerNode,\n baseTestId,\n }\n\n return (\n <TreeContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={`tree ${className}`}\n role=\"tree\"\n aria-multiselectable={multiple}\n data-testid={baseTestId}\n onFocus={handleTreeFocus}\n {...rest}\n >\n {treeData.map((node) => (\n <TreeNodeInternal key={node.key} node={node} level={0} />\n ))}\n </div>\n </TreeContext.Provider>\n )\n }),\n {\n Node: TreeNode,\n }\n)\n"],"names":["TreeContext","createContext","useTreeContext","context","useContext","getAllKeys","data","keys","traverse","nodes","node","getDescendantKeys","n","child","getParentMap","map","parentKey","findNode","key","found","flattenTree","expandedKeys","result","getAncestorKeys","parentMap","ancestors","currentKey","TreeNodeInternal","level","checkable","checkboxColor","checkboxSize","selectable","showLine","showIcon","blockNode","selectedKeys","loadingKeys","switcherIcon","titleRender","filterTreeNode","onToggle","onSelect","onCheck","onRightClick","getCheckedState","focusedKey","setFocusedKey","flattenedNodes","baseTestId","nodeRef","useRef","hasChildren","isLeaf","isExpanded","isSelected","isLoading","isFocused","checked","indeterminate","isFiltered","isDisabled","useEffect","handleToggle","e","handleSelect","_e","handleCheck","handleContextMenu","handleKeyDown","currentIndex","nextNode","prevNode","firstChild","firstNode","lastNode","checkboxSizeClasses","checkboxColorClasses","checkboxSizeClass","checkboxColorClass","renderSwitcher","jsx","renderTitle","nodeState","jsxs","el","TreeNode","_props","isTreeNode","element","Tree","forwardRef","treeDataProp","children","multiple","defaultExpandAll","defaultExpandedKeys","controlledExpandedKeys","defaultSelectedKeys","controlledSelectedKeys","defaultCheckedKeys","controlledCheckedKeys","onExpand","checkStrictly","autoExpandParent","loadData","fieldNames","className","testId","rest","ref","registerNode","useCallback","_key","_node","_level","treeData","useMemo","mapNode","title","buildTree","React","props","setLoadingKeys","useState","initialExpandedKeys","allKeys","k","internalExpandedKeys","setInternalExpandedKeys","internalSelectedKeys","setInternalSelectedKeys","internalCheckedKeys","setInternalCheckedKeys","checkedKeys","descendantKeys","checkedDescendants","prev","newExpandedKeys","newSelectedKeys","isChecked","newCheckedKeys","dk","parentNode","handleTreeFocus","contextValue"],"mappings":"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"}