@particle-academy/react-fancy 5.51.1 → 5.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +43 -0
  3. package/dist/accordion-panel.cjs +7 -7
  4. package/dist/accordion-panel.js +1 -1
  5. package/dist/accordion.cjs +3 -3
  6. package/dist/accordion.js +1 -1
  7. package/dist/activity-light.cjs +2 -2
  8. package/dist/activity-light.js +1 -1
  9. package/dist/audio-viewer.cjs +2 -2
  10. package/dist/audio-viewer.js +1 -1
  11. package/dist/autocomplete.cjs +2 -2
  12. package/dist/autocomplete.js +1 -1
  13. package/dist/avatar.cjs +2 -2
  14. package/dist/avatar.js +1 -1
  15. package/dist/brand.cjs +3 -3
  16. package/dist/brand.js +1 -1
  17. package/dist/breadcrumbs.cjs +2 -2
  18. package/dist/breadcrumbs.js +1 -1
  19. package/dist/button.cjs +3 -3
  20. package/dist/button.js +1 -1
  21. package/dist/calendar.cjs +2 -2
  22. package/dist/calendar.js +1 -1
  23. package/dist/card.cjs +9 -9
  24. package/dist/card.js +3 -3
  25. package/dist/carousel.cjs +7 -7
  26. package/dist/carousel.js +1 -1
  27. package/dist/chart.cjs +2 -2
  28. package/dist/chart.js +1 -1
  29. package/dist/chat-drawer.cjs +2 -2
  30. package/dist/chat-drawer.js +1 -1
  31. package/dist/checkbox-group.cjs +5 -5
  32. package/dist/checkbox-group.js +4 -4
  33. package/dist/checkbox.cjs +3 -3
  34. package/dist/checkbox.js +2 -2
  35. package/dist/{chunk-KODD54GT.js → chunk-26JZ47BJ.js} +5 -5
  36. package/dist/{chunk-KODD54GT.js.map → chunk-26JZ47BJ.js.map} +1 -1
  37. package/dist/{chunk-VKXNCYLE.cjs → chunk-2GFM5WD4.cjs} +5 -5
  38. package/dist/chunk-2GFM5WD4.cjs.map +1 -0
  39. package/dist/{chunk-MGE5KOVA.js → chunk-2MUGEPRD.js} +10 -10
  40. package/dist/{chunk-MGE5KOVA.js.map → chunk-2MUGEPRD.js.map} +1 -1
  41. package/dist/{chunk-UIJR26YW.js → chunk-2OMA3O63.js} +4 -4
  42. package/dist/{chunk-UIJR26YW.js.map → chunk-2OMA3O63.js.map} +1 -1
  43. package/dist/{chunk-OC75GWX5.js → chunk-2UTN3EFK.js} +6 -6
  44. package/dist/{chunk-OC75GWX5.js.map → chunk-2UTN3EFK.js.map} +1 -1
  45. package/dist/{chunk-CF2U25LM.js → chunk-2XO6EYZ7.js} +9 -9
  46. package/dist/chunk-2XO6EYZ7.js.map +1 -0
  47. package/dist/{chunk-QSFTWIUH.cjs → chunk-36HG5JK6.cjs} +6 -6
  48. package/dist/chunk-36HG5JK6.cjs.map +1 -0
  49. package/dist/{chunk-TDDWWAM5.js → chunk-3AYRLFNO.js} +6 -6
  50. package/dist/chunk-3AYRLFNO.js.map +1 -0
  51. package/dist/{chunk-7JDVCQXD.js → chunk-3EWO5EBI.js} +14 -14
  52. package/dist/chunk-3EWO5EBI.js.map +1 -0
  53. package/dist/{chunk-Z3NSPDTW.cjs → chunk-3YA6FDVN.cjs} +8 -8
  54. package/dist/chunk-3YA6FDVN.cjs.map +1 -0
  55. package/dist/{chunk-SYVOGYJG.cjs → chunk-43ZRUYJC.cjs} +11 -11
  56. package/dist/{chunk-SYVOGYJG.cjs.map → chunk-43ZRUYJC.cjs.map} +1 -1
  57. package/dist/{chunk-NDUEPDNS.js → chunk-44VYWOCG.js} +4 -4
  58. package/dist/{chunk-NDUEPDNS.js.map → chunk-44VYWOCG.js.map} +1 -1
  59. package/dist/{chunk-LYHQ4VBR.js → chunk-45FDQ3R5.js} +3 -3
  60. package/dist/{chunk-LYHQ4VBR.js.map → chunk-45FDQ3R5.js.map} +1 -1
  61. package/dist/{chunk-LBU3T2LF.js → chunk-4FH2JHUY.js} +7 -7
  62. package/dist/{chunk-LBU3T2LF.js.map → chunk-4FH2JHUY.js.map} +1 -1
  63. package/dist/{chunk-5F6V5HHT.cjs → chunk-4JT2QANA.cjs} +11 -11
  64. package/dist/chunk-4JT2QANA.cjs.map +1 -0
  65. package/dist/{chunk-N6OZZAOT.js → chunk-4TVAHZ35.js} +9 -9
  66. package/dist/chunk-4TVAHZ35.js.map +1 -0
  67. package/dist/{chunk-XLFGWNW4.cjs → chunk-4XMBXG4K.cjs} +4 -4
  68. package/dist/{chunk-XLFGWNW4.cjs.map → chunk-4XMBXG4K.cjs.map} +1 -1
  69. package/dist/{chunk-N4VHOTMK.cjs → chunk-546K5LRX.cjs} +3 -3
  70. package/dist/{chunk-N4VHOTMK.cjs.map → chunk-546K5LRX.cjs.map} +1 -1
  71. package/dist/{chunk-P7Q2YIIS.js → chunk-5DG4CAWS.js} +8 -8
  72. package/dist/chunk-5DG4CAWS.js.map +1 -0
  73. package/dist/{chunk-GU5BYZTR.cjs → chunk-5H6IUCOD.cjs} +8 -8
  74. package/dist/chunk-5H6IUCOD.cjs.map +1 -0
  75. package/dist/{chunk-ZY4CVNNZ.js → chunk-5JA4ENMF.js} +6 -6
  76. package/dist/chunk-5JA4ENMF.js.map +1 -0
  77. package/dist/{chunk-R3UG6PVX.cjs → chunk-5JK2VDWY.cjs} +7 -7
  78. package/dist/{chunk-R3UG6PVX.cjs.map → chunk-5JK2VDWY.cjs.map} +1 -1
  79. package/dist/{chunk-5MU6X3KO.js → chunk-5WQ6FPSP.js} +4 -4
  80. package/dist/{chunk-5MU6X3KO.js.map → chunk-5WQ6FPSP.js.map} +1 -1
  81. package/dist/{chunk-TNYWQ6EQ.js → chunk-6HJF55U7.js} +8 -8
  82. package/dist/chunk-6HJF55U7.js.map +1 -0
  83. package/dist/{chunk-F7YCIII4.cjs → chunk-6MXFZ3B5.cjs} +3 -3
  84. package/dist/{chunk-F7YCIII4.cjs.map → chunk-6MXFZ3B5.cjs.map} +1 -1
  85. package/dist/{chunk-7Y2AENZD.cjs → chunk-7DDUMW4R.cjs} +4 -4
  86. package/dist/{chunk-7Y2AENZD.cjs.map → chunk-7DDUMW4R.cjs.map} +1 -1
  87. package/dist/{chunk-2KZINS6D.cjs → chunk-7QENPLOP.cjs} +9 -9
  88. package/dist/{chunk-2KZINS6D.cjs.map → chunk-7QENPLOP.cjs.map} +1 -1
  89. package/dist/{chunk-25UPDBI6.cjs → chunk-A5DN2XNM.cjs} +9 -9
  90. package/dist/chunk-A5DN2XNM.cjs.map +1 -0
  91. package/dist/{chunk-RA2VOQ46.js → chunk-A5RTALZJ.js} +6 -6
  92. package/dist/chunk-A5RTALZJ.js.map +1 -0
  93. package/dist/{chunk-WN45ZE37.cjs → chunk-AVEFCM6T.cjs} +3 -3
  94. package/dist/{chunk-WN45ZE37.cjs.map → chunk-AVEFCM6T.cjs.map} +1 -1
  95. package/dist/{chunk-TGNQ5Y6F.cjs → chunk-AYBKPAI2.cjs} +6 -6
  96. package/dist/{chunk-TGNQ5Y6F.cjs.map → chunk-AYBKPAI2.cjs.map} +1 -1
  97. package/dist/{chunk-OTCLBINT.js → chunk-AZQXPI5S.js} +7 -7
  98. package/dist/{chunk-OTCLBINT.js.map → chunk-AZQXPI5S.js.map} +1 -1
  99. package/dist/{chunk-RWOH2ADL.cjs → chunk-B4YV2V7G.cjs} +4 -4
  100. package/dist/{chunk-RWOH2ADL.cjs.map → chunk-B4YV2V7G.cjs.map} +1 -1
  101. package/dist/{chunk-AR3JOPGT.cjs → chunk-BDUL42VO.cjs} +31 -31
  102. package/dist/{chunk-AR3JOPGT.cjs.map → chunk-BDUL42VO.cjs.map} +1 -1
  103. package/dist/{chunk-5CXJ5Z4C.cjs → chunk-BJL3VDRK.cjs} +4 -4
  104. package/dist/{chunk-5CXJ5Z4C.cjs.map → chunk-BJL3VDRK.cjs.map} +1 -1
  105. package/dist/{chunk-WKAEAGMT.cjs → chunk-BK6XQQYG.cjs} +4 -4
  106. package/dist/{chunk-WKAEAGMT.cjs.map → chunk-BK6XQQYG.cjs.map} +1 -1
  107. package/dist/{chunk-UKUNWGL5.js → chunk-BLOX7MRO.js} +6 -6
  108. package/dist/{chunk-UKUNWGL5.js.map → chunk-BLOX7MRO.js.map} +1 -1
  109. package/dist/{chunk-Q7O5TLVU.js → chunk-BX7EDTL4.js} +3 -3
  110. package/dist/{chunk-Q7O5TLVU.js.map → chunk-BX7EDTL4.js.map} +1 -1
  111. package/dist/{chunk-SAPOYAGN.cjs → chunk-BYUJJXGY.cjs} +9 -9
  112. package/dist/{chunk-SAPOYAGN.cjs.map → chunk-BYUJJXGY.cjs.map} +1 -1
  113. package/dist/{chunk-FWA4PCW7.cjs → chunk-CAMQ5B3V.cjs} +5 -5
  114. package/dist/{chunk-FWA4PCW7.cjs.map → chunk-CAMQ5B3V.cjs.map} +1 -1
  115. package/dist/{chunk-I6L7OP7G.cjs → chunk-CG3RCQVL.cjs} +5 -5
  116. package/dist/chunk-CG3RCQVL.cjs.map +1 -0
  117. package/dist/{chunk-3Q4NSAEA.cjs → chunk-CQ54H7DZ.cjs} +8 -8
  118. package/dist/{chunk-3Q4NSAEA.cjs.map → chunk-CQ54H7DZ.cjs.map} +1 -1
  119. package/dist/{chunk-YOTCZUNW.js → chunk-D4QOV56U.js} +7 -7
  120. package/dist/{chunk-YOTCZUNW.js.map → chunk-D4QOV56U.js.map} +1 -1
  121. package/dist/{chunk-BZDXX6E3.cjs → chunk-DJB3N4G3.cjs} +11 -11
  122. package/dist/{chunk-BZDXX6E3.cjs.map → chunk-DJB3N4G3.cjs.map} +1 -1
  123. package/dist/{chunk-BMTTSBHF.js → chunk-DJYG7DXS.js} +4 -4
  124. package/dist/{chunk-BMTTSBHF.js.map → chunk-DJYG7DXS.js.map} +1 -1
  125. package/dist/{chunk-WBVWV2V7.cjs → chunk-DN244T6G.cjs} +6 -6
  126. package/dist/chunk-DN244T6G.cjs.map +1 -0
  127. package/dist/{chunk-NCXH5O4I.cjs → chunk-E4TRDGSU.cjs} +10 -10
  128. package/dist/{chunk-NCXH5O4I.cjs.map → chunk-E4TRDGSU.cjs.map} +1 -1
  129. package/dist/{chunk-FVG3YXXM.cjs → chunk-EEMNTO7L.cjs} +8 -8
  130. package/dist/{chunk-FVG3YXXM.cjs.map → chunk-EEMNTO7L.cjs.map} +1 -1
  131. package/dist/{chunk-IAUJKZAQ.js → chunk-ELBCK3V7.js} +13 -13
  132. package/dist/{chunk-IAUJKZAQ.js.map → chunk-ELBCK3V7.js.map} +1 -1
  133. package/dist/{chunk-Y4UPKJN5.js → chunk-EQ7G5F6K.js} +4 -4
  134. package/dist/{chunk-Y4UPKJN5.js.map → chunk-EQ7G5F6K.js.map} +1 -1
  135. package/dist/{chunk-U7PFHQBN.cjs → chunk-ETNQ4AEQ.cjs} +6 -6
  136. package/dist/{chunk-U7PFHQBN.cjs.map → chunk-ETNQ4AEQ.cjs.map} +1 -1
  137. package/dist/{chunk-23PAOCQQ.cjs → chunk-EXQ33MJR.cjs} +5 -5
  138. package/dist/{chunk-23PAOCQQ.cjs.map → chunk-EXQ33MJR.cjs.map} +1 -1
  139. package/dist/{chunk-HKRB2Z6R.cjs → chunk-FGI2EC32.cjs} +8 -8
  140. package/dist/chunk-FGI2EC32.cjs.map +1 -0
  141. package/dist/{chunk-AASQ6L6X.cjs → chunk-FNIHCNVD.cjs} +3 -3
  142. package/dist/{chunk-AASQ6L6X.cjs.map → chunk-FNIHCNVD.cjs.map} +1 -1
  143. package/dist/{chunk-PCTZNK2Z.js → chunk-FVDQNQKA.js} +9 -9
  144. package/dist/chunk-FVDQNQKA.js.map +1 -0
  145. package/dist/{chunk-O6GTY53I.cjs → chunk-FVQO75KY.cjs} +4 -4
  146. package/dist/{chunk-O6GTY53I.cjs.map → chunk-FVQO75KY.cjs.map} +1 -1
  147. package/dist/{chunk-FCSR2WVS.js → chunk-FWAVMWMP.js} +4 -4
  148. package/dist/{chunk-FCSR2WVS.js.map → chunk-FWAVMWMP.js.map} +1 -1
  149. package/dist/{chunk-FSRPZYZZ.js → chunk-G35XN5WV.js} +4 -4
  150. package/dist/chunk-G35XN5WV.js.map +1 -0
  151. package/dist/{chunk-HE3JJXIL.cjs → chunk-G4M3MCJO.cjs} +5 -5
  152. package/dist/{chunk-HE3JJXIL.cjs.map → chunk-G4M3MCJO.cjs.map} +1 -1
  153. package/dist/{chunk-T45XK5GN.cjs → chunk-G5DMYAWL.cjs} +19 -19
  154. package/dist/chunk-G5DMYAWL.cjs.map +1 -0
  155. package/dist/{chunk-7CN7IHES.js → chunk-GF23UBOT.js} +3 -3
  156. package/dist/{chunk-7CN7IHES.js.map → chunk-GF23UBOT.js.map} +1 -1
  157. package/dist/{chunk-BVRPDMB7.cjs → chunk-GKLETY7D.cjs} +4 -4
  158. package/dist/{chunk-BVRPDMB7.cjs.map → chunk-GKLETY7D.cjs.map} +1 -1
  159. package/dist/{chunk-KQQA7JBC.js → chunk-GOE36IXL.js} +5 -5
  160. package/dist/{chunk-KQQA7JBC.js.map → chunk-GOE36IXL.js.map} +1 -1
  161. package/dist/{chunk-XZUGREDI.js → chunk-GVMWJ4NI.js} +6 -6
  162. package/dist/{chunk-XZUGREDI.js.map → chunk-GVMWJ4NI.js.map} +1 -1
  163. package/dist/{chunk-FPZYPD3N.cjs → chunk-H7ELUIF6.cjs} +12 -12
  164. package/dist/{chunk-FPZYPD3N.cjs.map → chunk-H7ELUIF6.cjs.map} +1 -1
  165. package/dist/{chunk-VB3QJ6QE.js → chunk-HRH5BIYG.js} +4 -4
  166. package/dist/{chunk-VB3QJ6QE.js.map → chunk-HRH5BIYG.js.map} +1 -1
  167. package/dist/{chunk-NTMHP7FS.js → chunk-HVND2IIB.js} +6 -6
  168. package/dist/{chunk-NTMHP7FS.js.map → chunk-HVND2IIB.js.map} +1 -1
  169. package/dist/{chunk-ASS6EWNI.js → chunk-ICMLLZKZ.js} +8 -8
  170. package/dist/{chunk-ASS6EWNI.js.map → chunk-ICMLLZKZ.js.map} +1 -1
  171. package/dist/{chunk-FNEPZ33A.js → chunk-IU5WQUUC.js} +8 -8
  172. package/dist/{chunk-FNEPZ33A.js.map → chunk-IU5WQUUC.js.map} +1 -1
  173. package/dist/{chunk-ATANWEXA.cjs → chunk-JBHQQGG5.cjs} +50 -50
  174. package/dist/{chunk-ATANWEXA.cjs.map → chunk-JBHQQGG5.cjs.map} +1 -1
  175. package/dist/{chunk-7ZDJPHLJ.cjs → chunk-JRRYYW3Y.cjs} +24 -24
  176. package/dist/{chunk-7ZDJPHLJ.cjs.map → chunk-JRRYYW3Y.cjs.map} +1 -1
  177. package/dist/{chunk-ZLWCZV7R.js → chunk-JSD6IEBW.js} +7 -7
  178. package/dist/chunk-JSD6IEBW.js.map +1 -0
  179. package/dist/{chunk-QAFAPHAF.cjs → chunk-JUQZMNPR.cjs} +4 -4
  180. package/dist/chunk-JUQZMNPR.cjs.map +1 -0
  181. package/dist/{chunk-PFEFKLUV.cjs → chunk-K5MQZTDW.cjs} +6 -6
  182. package/dist/{chunk-PFEFKLUV.cjs.map → chunk-K5MQZTDW.cjs.map} +1 -1
  183. package/dist/{chunk-32AJIHBZ.js → chunk-K6Q542VL.js} +5 -5
  184. package/dist/chunk-K6Q542VL.js.map +1 -0
  185. package/dist/{chunk-OFHO5SXA.js → chunk-KC3PYCBO.js} +4 -4
  186. package/dist/{chunk-OFHO5SXA.js.map → chunk-KC3PYCBO.js.map} +1 -1
  187. package/dist/{chunk-QW66UHWO.cjs → chunk-KE4XURZD.cjs} +4 -4
  188. package/dist/{chunk-QW66UHWO.cjs.map → chunk-KE4XURZD.cjs.map} +1 -1
  189. package/dist/{chunk-JFOORUUD.cjs → chunk-KNKOSMOQ.cjs} +6 -6
  190. package/dist/chunk-KNKOSMOQ.cjs.map +1 -0
  191. package/dist/{chunk-LLA33GKC.cjs → chunk-KSU6RYWU.cjs} +4 -4
  192. package/dist/chunk-KSU6RYWU.cjs.map +1 -0
  193. package/dist/{chunk-PWEZCMIY.js → chunk-KXYMMNNV.js} +7 -7
  194. package/dist/chunk-KXYMMNNV.js.map +1 -0
  195. package/dist/{chunk-SUCBR6L5.cjs → chunk-L4JIBKFW.cjs} +3 -3
  196. package/dist/{chunk-SUCBR6L5.cjs.map → chunk-L4JIBKFW.cjs.map} +1 -1
  197. package/dist/{chunk-VGBZWDMM.cjs → chunk-LIVC3WUU.cjs} +4 -4
  198. package/dist/{chunk-VGBZWDMM.cjs.map → chunk-LIVC3WUU.cjs.map} +1 -1
  199. package/dist/{chunk-YF2EHBTV.js → chunk-LKN7FYW6.js} +3 -3
  200. package/dist/{chunk-YF2EHBTV.js.map → chunk-LKN7FYW6.js.map} +1 -1
  201. package/dist/{chunk-RPVCMW64.cjs → chunk-LX23ZJDM.cjs} +6 -6
  202. package/dist/chunk-LX23ZJDM.cjs.map +1 -0
  203. package/dist/{chunk-RU6ZTA4M.cjs → chunk-M5SEYDSS.cjs} +6 -6
  204. package/dist/{chunk-RU6ZTA4M.cjs.map → chunk-M5SEYDSS.cjs.map} +1 -1
  205. package/dist/{chunk-FYKOLKQZ.js → chunk-M6XBF2ZS.js} +4 -4
  206. package/dist/chunk-M6XBF2ZS.js.map +1 -0
  207. package/dist/{chunk-V6VFSX6V.cjs → chunk-MAZEX4EZ.cjs} +13 -13
  208. package/dist/{chunk-V6VFSX6V.cjs.map → chunk-MAZEX4EZ.cjs.map} +1 -1
  209. package/dist/{chunk-7EZBMGEE.cjs → chunk-MRZXTL46.cjs} +7 -7
  210. package/dist/chunk-MRZXTL46.cjs.map +1 -0
  211. package/dist/{chunk-M5ACSJJ4.js → chunk-MV6BK4WG.js} +13 -14
  212. package/dist/chunk-MV6BK4WG.js.map +1 -0
  213. package/dist/{chunk-GAB2QXHH.js → chunk-N2JESOCJ.js} +7 -7
  214. package/dist/{chunk-GAB2QXHH.js.map → chunk-N2JESOCJ.js.map} +1 -1
  215. package/dist/{chunk-K6EJLBBQ.js → chunk-N5XMBHX7.js} +3 -3
  216. package/dist/{chunk-K6EJLBBQ.js.map → chunk-N5XMBHX7.js.map} +1 -1
  217. package/dist/{chunk-MH4QS7OE.cjs → chunk-N7ABDCQ6.cjs} +16 -16
  218. package/dist/{chunk-MH4QS7OE.cjs.map → chunk-N7ABDCQ6.cjs.map} +1 -1
  219. package/dist/{chunk-G73TVXDQ.js → chunk-NVXTHTJI.js} +9 -9
  220. package/dist/{chunk-G73TVXDQ.js.map → chunk-NVXTHTJI.js.map} +1 -1
  221. package/dist/{chunk-YLGTDBB2.cjs → chunk-O3F6DYWR.cjs} +3 -3
  222. package/dist/{chunk-YLGTDBB2.cjs.map → chunk-O3F6DYWR.cjs.map} +1 -1
  223. package/dist/{chunk-IECPLOSZ.js → chunk-OFNA5HS5.js} +12 -12
  224. package/dist/{chunk-IECPLOSZ.js.map → chunk-OFNA5HS5.js.map} +1 -1
  225. package/dist/{chunk-4HRD4S25.js → chunk-OTM7RL2L.js} +5 -5
  226. package/dist/{chunk-4HRD4S25.js.map → chunk-OTM7RL2L.js.map} +1 -1
  227. package/dist/{chunk-TJJ63UJV.js → chunk-OTSVOPKP.js} +3 -3
  228. package/dist/{chunk-TJJ63UJV.js.map → chunk-OTSVOPKP.js.map} +1 -1
  229. package/dist/{chunk-PLNDZF2A.cjs → chunk-OWT5B3C2.cjs} +10 -10
  230. package/dist/chunk-OWT5B3C2.cjs.map +1 -0
  231. package/dist/{chunk-ZVXOL5H3.js → chunk-OYDJVGFS.js} +3 -3
  232. package/dist/{chunk-ZVXOL5H3.js.map → chunk-OYDJVGFS.js.map} +1 -1
  233. package/dist/{chunk-XKDW6B7X.cjs → chunk-P53432AK.cjs} +9 -9
  234. package/dist/{chunk-XKDW6B7X.cjs.map → chunk-P53432AK.cjs.map} +1 -1
  235. package/dist/{chunk-WNUU7T62.cjs → chunk-PBZHLHSA.cjs} +3 -3
  236. package/dist/{chunk-WNUU7T62.cjs.map → chunk-PBZHLHSA.cjs.map} +1 -1
  237. package/dist/{chunk-S5KUYX3Z.cjs → chunk-PCNJJVTF.cjs} +7 -7
  238. package/dist/{chunk-S5KUYX3Z.cjs.map → chunk-PCNJJVTF.cjs.map} +1 -1
  239. package/dist/{chunk-O6E2WC3J.js → chunk-PRP5N7NY.js} +4 -4
  240. package/dist/chunk-PRP5N7NY.js.map +1 -0
  241. package/dist/{chunk-MFQ5NBSV.cjs → chunk-QAKIG43N.cjs} +3 -3
  242. package/dist/{chunk-MFQ5NBSV.cjs.map → chunk-QAKIG43N.cjs.map} +1 -1
  243. package/dist/{chunk-BBOIFV27.cjs → chunk-QF7CD4JH.cjs} +5 -5
  244. package/dist/{chunk-BBOIFV27.cjs.map → chunk-QF7CD4JH.cjs.map} +1 -1
  245. package/dist/{chunk-ZI7JP3TN.js → chunk-QFC736WY.js} +5 -5
  246. package/dist/{chunk-ZI7JP3TN.js.map → chunk-QFC736WY.js.map} +1 -1
  247. package/dist/{chunk-ZUQUL53P.cjs → chunk-QHN63FRP.cjs} +10 -10
  248. package/dist/{chunk-ZUQUL53P.cjs.map → chunk-QHN63FRP.cjs.map} +1 -1
  249. package/dist/{chunk-CESGP5AF.js → chunk-QPM4CZ4G.js} +3 -3
  250. package/dist/{chunk-CESGP5AF.js.map → chunk-QPM4CZ4G.js.map} +1 -1
  251. package/dist/{chunk-LMPPAQKP.cjs → chunk-QUKUX5KU.cjs} +4 -4
  252. package/dist/{chunk-LMPPAQKP.cjs.map → chunk-QUKUX5KU.cjs.map} +1 -1
  253. package/dist/{chunk-RUSRAKKA.js → chunk-RANTYGKW.js} +7 -7
  254. package/dist/{chunk-RUSRAKKA.js.map → chunk-RANTYGKW.js.map} +1 -1
  255. package/dist/{chunk-M52IS5SO.cjs → chunk-RGMHRPHQ.cjs} +15 -15
  256. package/dist/chunk-RGMHRPHQ.cjs.map +1 -0
  257. package/dist/{chunk-Y52NXM73.cjs → chunk-RVBTDXPD.cjs} +5 -5
  258. package/dist/{chunk-Y52NXM73.cjs.map → chunk-RVBTDXPD.cjs.map} +1 -1
  259. package/dist/{chunk-RLMU3NHQ.cjs → chunk-S3V2C4DW.cjs} +14 -14
  260. package/dist/chunk-S3V2C4DW.cjs.map +1 -0
  261. package/dist/{chunk-6IBBAOQC.cjs → chunk-SONXLQPJ.cjs} +8 -8
  262. package/dist/chunk-SONXLQPJ.cjs.map +1 -0
  263. package/dist/{chunk-HIN6PHSE.cjs → chunk-SSCW67KA.cjs} +3 -3
  264. package/dist/{chunk-HIN6PHSE.cjs.map → chunk-SSCW67KA.cjs.map} +1 -1
  265. package/dist/{chunk-F2GAZZVS.js → chunk-SVSQXKFL.js} +4 -4
  266. package/dist/{chunk-F2GAZZVS.js.map → chunk-SVSQXKFL.js.map} +1 -1
  267. package/dist/{chunk-ZKFFHIEW.js → chunk-SXXDTW7S.js} +4 -4
  268. package/dist/{chunk-ZKFFHIEW.js.map → chunk-SXXDTW7S.js.map} +1 -1
  269. package/dist/{chunk-TT3K5D6J.js → chunk-T67FLC55.js} +8 -8
  270. package/dist/{chunk-TT3K5D6J.js.map → chunk-T67FLC55.js.map} +1 -1
  271. package/dist/{chunk-FNJDMGJ3.js → chunk-TAYJSIOP.js} +7 -7
  272. package/dist/{chunk-FNJDMGJ3.js.map → chunk-TAYJSIOP.js.map} +1 -1
  273. package/dist/{chunk-GCWIZNN2.cjs → chunk-TFKG5FSG.cjs} +8 -8
  274. package/dist/{chunk-GCWIZNN2.cjs.map → chunk-TFKG5FSG.cjs.map} +1 -1
  275. package/dist/{chunk-MFBUK4RV.cjs → chunk-TJTC4WNY.cjs} +8 -8
  276. package/dist/{chunk-MFBUK4RV.cjs.map → chunk-TJTC4WNY.cjs.map} +1 -1
  277. package/dist/{chunk-BZZDHDMK.cjs → chunk-TLRFXSPA.cjs} +14 -14
  278. package/dist/{chunk-BZZDHDMK.cjs.map → chunk-TLRFXSPA.cjs.map} +1 -1
  279. package/dist/{chunk-XDJSFGXW.js → chunk-TMQF2CRN.js} +4 -4
  280. package/dist/chunk-TMQF2CRN.js.map +1 -0
  281. package/dist/{chunk-65HKNZFG.cjs → chunk-TTZJ2KXK.cjs} +3 -3
  282. package/dist/{chunk-65HKNZFG.cjs.map → chunk-TTZJ2KXK.cjs.map} +1 -1
  283. package/dist/{chunk-P7PKK5BO.js → chunk-UE3QO7R3.js} +4 -4
  284. package/dist/{chunk-P7PKK5BO.js.map → chunk-UE3QO7R3.js.map} +1 -1
  285. package/dist/{chunk-QOGKO6JH.cjs → chunk-UET6D7B3.cjs} +6 -6
  286. package/dist/{chunk-QOGKO6JH.cjs.map → chunk-UET6D7B3.cjs.map} +1 -1
  287. package/dist/chunk-USWQAMI3.js +35 -0
  288. package/dist/{chunk-GFYSELJF.js.map → chunk-USWQAMI3.js.map} +1 -1
  289. package/dist/{chunk-YD4SXA6K.js → chunk-UVMIJCY3.js} +8 -8
  290. package/dist/chunk-UVMIJCY3.js.map +1 -0
  291. package/dist/{chunk-DEFGT75G.js → chunk-UVUBV4VZ.js} +6 -6
  292. package/dist/{chunk-DEFGT75G.js.map → chunk-UVUBV4VZ.js.map} +1 -1
  293. package/dist/{chunk-CRR3AMJ4.js → chunk-UZCR7DK5.js} +4 -4
  294. package/dist/{chunk-CRR3AMJ4.js.map → chunk-UZCR7DK5.js.map} +1 -1
  295. package/dist/{chunk-WKNVZUWZ.cjs → chunk-UZG6LO4Z.cjs} +3 -3
  296. package/dist/{chunk-WKNVZUWZ.cjs.map → chunk-UZG6LO4Z.cjs.map} +1 -1
  297. package/dist/{chunk-DCVR6NPP.js → chunk-V4235IZO.js} +3 -3
  298. package/dist/{chunk-DCVR6NPP.js.map → chunk-V4235IZO.js.map} +1 -1
  299. package/dist/{chunk-WIS4QRGK.cjs → chunk-V5JTTLJP.cjs} +6 -6
  300. package/dist/{chunk-WIS4QRGK.cjs.map → chunk-V5JTTLJP.cjs.map} +1 -1
  301. package/dist/{chunk-NBAHXZHJ.js → chunk-VQXXX6DK.js} +4 -4
  302. package/dist/{chunk-NBAHXZHJ.js.map → chunk-VQXXX6DK.js.map} +1 -1
  303. package/dist/{chunk-COH45MGW.cjs → chunk-WFHK2DKG.cjs} +3 -3
  304. package/dist/{chunk-COH45MGW.cjs.map → chunk-WFHK2DKG.cjs.map} +1 -1
  305. package/dist/{chunk-VYHZEQIG.js → chunk-WGRLNXNB.js} +6 -6
  306. package/dist/{chunk-VYHZEQIG.js.map → chunk-WGRLNXNB.js.map} +1 -1
  307. package/dist/{chunk-XK5WHQ3O.cjs → chunk-WMANILKC.cjs} +4 -4
  308. package/dist/chunk-WMANILKC.cjs.map +1 -0
  309. package/dist/{chunk-DHIUMQLP.cjs → chunk-WNUAGRQN.cjs} +4 -4
  310. package/dist/{chunk-DHIUMQLP.cjs.map → chunk-WNUAGRQN.cjs.map} +1 -1
  311. package/dist/{chunk-B6CQ4KK7.cjs → chunk-WONP337S.cjs} +13 -14
  312. package/dist/chunk-WONP337S.cjs.map +1 -0
  313. package/dist/{chunk-ENYHLZ2X.js → chunk-WW56U3RV.js} +5 -5
  314. package/dist/{chunk-ENYHLZ2X.js.map → chunk-WW56U3RV.js.map} +1 -1
  315. package/dist/{chunk-KKWNKBKR.js → chunk-WX5XYDVN.js} +8 -8
  316. package/dist/{chunk-KKWNKBKR.js.map → chunk-WX5XYDVN.js.map} +1 -1
  317. package/dist/{chunk-TB35HNBE.js → chunk-X7VIIM2P.js} +3 -3
  318. package/dist/{chunk-TB35HNBE.js.map → chunk-X7VIIM2P.js.map} +1 -1
  319. package/dist/{chunk-4NBM3LXN.js → chunk-XB3H2EEL.js} +5 -5
  320. package/dist/{chunk-4NBM3LXN.js.map → chunk-XB3H2EEL.js.map} +1 -1
  321. package/dist/{chunk-5RLP77KK.js → chunk-XM3V3RSU.js} +4 -4
  322. package/dist/{chunk-5RLP77KK.js.map → chunk-XM3V3RSU.js.map} +1 -1
  323. package/dist/{chunk-IYVV4RD3.cjs → chunk-XM3W5ETT.cjs} +5 -5
  324. package/dist/{chunk-IYVV4RD3.cjs.map → chunk-XM3W5ETT.cjs.map} +1 -1
  325. package/dist/{chunk-IWXP2YUP.js → chunk-XOYRJFMU.js} +6 -6
  326. package/dist/chunk-XOYRJFMU.js.map +1 -0
  327. package/dist/{chunk-XB6YHUKW.js → chunk-XQDGUXMS.js} +10 -10
  328. package/dist/{chunk-XB6YHUKW.js.map → chunk-XQDGUXMS.js.map} +1 -1
  329. package/dist/{chunk-2KAJ4L7C.js → chunk-XS3EIQFP.js} +19 -19
  330. package/dist/chunk-XS3EIQFP.js.map +1 -0
  331. package/dist/{chunk-6KXAFP2T.js → chunk-XYOT75HH.js} +3 -3
  332. package/dist/{chunk-6KXAFP2T.js.map → chunk-XYOT75HH.js.map} +1 -1
  333. package/dist/{chunk-UDEEPMQ4.js → chunk-Y6LL3B5P.js} +4 -4
  334. package/dist/{chunk-UDEEPMQ4.js.map → chunk-Y6LL3B5P.js.map} +1 -1
  335. package/dist/{chunk-OS2QC3NE.cjs → chunk-Y7RGUUTS.cjs} +7 -7
  336. package/dist/chunk-Y7RGUUTS.cjs.map +1 -0
  337. package/dist/{chunk-Z6RVBZQ4.js → chunk-Y7UE37QZ.js} +8 -8
  338. package/dist/{chunk-Z6RVBZQ4.js.map → chunk-Y7UE37QZ.js.map} +1 -1
  339. package/dist/{chunk-YMDYDUBH.cjs → chunk-YH75G6SP.cjs} +7 -7
  340. package/dist/{chunk-YMDYDUBH.cjs.map → chunk-YH75G6SP.cjs.map} +1 -1
  341. package/dist/{chunk-PHDIQ4VC.js → chunk-YQTKTEWS.js} +8 -8
  342. package/dist/chunk-YQTKTEWS.js.map +1 -0
  343. package/dist/{chunk-AOFDFBRV.js → chunk-Z4EPQWVC.js} +10 -10
  344. package/dist/chunk-Z4EPQWVC.js.map +1 -0
  345. package/dist/{chunk-FVTCPERB.cjs → chunk-Z4UXLQSK.cjs} +15 -15
  346. package/dist/{chunk-FVTCPERB.cjs.map → chunk-Z4UXLQSK.cjs.map} +1 -1
  347. package/dist/{chunk-W6RDAZJC.js → chunk-ZAX72LXL.js} +5 -5
  348. package/dist/chunk-ZAX72LXL.js.map +1 -0
  349. package/dist/{chunk-NE3Z4AWP.js → chunk-ZULMMW5W.js} +7 -7
  350. package/dist/{chunk-NE3Z4AWP.js.map → chunk-ZULMMW5W.js.map} +1 -1
  351. package/dist/color-picker.cjs +2 -2
  352. package/dist/color-picker.js +1 -1
  353. package/dist/command.cjs +3 -3
  354. package/dist/command.js +1 -1
  355. package/dist/composer.cjs +5 -5
  356. package/dist/composer.js +3 -3
  357. package/dist/content-renderer.cjs +4 -4
  358. package/dist/content-renderer.js +1 -1
  359. package/dist/context-menu.cjs +3 -3
  360. package/dist/context-menu.js +1 -1
  361. package/dist/date-picker.cjs +5 -5
  362. package/dist/date-picker.js +4 -4
  363. package/dist/drawer.cjs +3 -3
  364. package/dist/drawer.js +1 -1
  365. package/dist/dropdown.cjs +3 -3
  366. package/dist/dropdown.js +1 -1
  367. package/dist/editor.cjs +4 -4
  368. package/dist/editor.js +2 -2
  369. package/dist/emoji-select.cjs +2 -2
  370. package/dist/emoji-select.js +1 -1
  371. package/dist/eyebrow.cjs +2 -2
  372. package/dist/eyebrow.js +1 -1
  373. package/dist/faux-client.cjs +2 -2
  374. package/dist/faux-client.js +1 -1
  375. package/dist/field.cjs +3 -3
  376. package/dist/field.js +2 -2
  377. package/dist/file-browser.cjs +5 -5
  378. package/dist/file-browser.js +1 -1
  379. package/dist/file-upload.cjs +3 -3
  380. package/dist/file-upload.js +1 -1
  381. package/dist/heading.cjs +2 -2
  382. package/dist/heading.js +1 -1
  383. package/dist/image-viewer.cjs +3 -3
  384. package/dist/image-viewer.js +2 -2
  385. package/dist/index-list.cjs +2 -2
  386. package/dist/index-list.js +1 -1
  387. package/dist/index.cjs +285 -212
  388. package/dist/index.cjs.map +1 -1
  389. package/dist/index.d.cts +114 -1
  390. package/dist/index.d.ts +114 -1
  391. package/dist/index.js +155 -79
  392. package/dist/index.js.map +1 -1
  393. package/dist/input-tag.cjs +6 -6
  394. package/dist/input-tag.js +1 -1
  395. package/dist/input.cjs +8 -8
  396. package/dist/input.js +7 -7
  397. package/dist/inputs.cjs +28 -28
  398. package/dist/inputs.js +16 -16
  399. package/dist/json-editor.cjs +26 -26
  400. package/dist/json-editor.js +15 -15
  401. package/dist/kanban.cjs +3 -3
  402. package/dist/kanban.js +1 -1
  403. package/dist/kbd.cjs +2 -2
  404. package/dist/kbd.js +1 -1
  405. package/dist/magic-wand.cjs +8 -8
  406. package/dist/magic-wand.js +7 -7
  407. package/dist/media-viewer.cjs +6 -6
  408. package/dist/media-viewer.js +5 -5
  409. package/dist/menu.cjs +3 -3
  410. package/dist/menu.js +1 -1
  411. package/dist/mobile-menu.cjs +3 -3
  412. package/dist/mobile-menu.js +1 -1
  413. package/dist/modal.cjs +3 -3
  414. package/dist/modal.js +1 -1
  415. package/dist/mode.cjs +3 -3
  416. package/dist/mode.js +2 -2
  417. package/dist/mood-meter.cjs +2 -2
  418. package/dist/mood-meter.js +1 -1
  419. package/dist/multi-switch.cjs +5 -5
  420. package/dist/multi-switch.js +4 -4
  421. package/dist/navbar.cjs +3 -3
  422. package/dist/navbar.js +1 -1
  423. package/dist/otp-input.cjs +2 -2
  424. package/dist/otp-input.js +1 -1
  425. package/dist/pagination.cjs +2 -2
  426. package/dist/pagination.js +1 -1
  427. package/dist/paste-pills.cjs +15 -15
  428. package/dist/paste-pills.js +2 -2
  429. package/dist/pdf-viewer.cjs +3 -3
  430. package/dist/pdf-viewer.js +2 -2
  431. package/dist/pillbox.cjs +2 -2
  432. package/dist/pillbox.js +1 -1
  433. package/dist/popover.cjs +3 -3
  434. package/dist/popover.js +1 -1
  435. package/dist/profile.cjs +3 -3
  436. package/dist/profile.js +2 -2
  437. package/dist/progress.cjs +2 -2
  438. package/dist/progress.js +1 -1
  439. package/dist/prompt-input.cjs +5 -5
  440. package/dist/prompt-input.js +4 -4
  441. package/dist/pull-quote.cjs +2 -2
  442. package/dist/pull-quote.js +1 -1
  443. package/dist/radio-group.cjs +5 -5
  444. package/dist/radio-group.js +4 -4
  445. package/dist/reason-tag.cjs +4 -4
  446. package/dist/reason-tag.js +3 -3
  447. package/dist/select.cjs +6 -6
  448. package/dist/select.js +5 -5
  449. package/dist/separator.cjs +2 -2
  450. package/dist/separator.js +1 -1
  451. package/dist/sidebar.cjs +3 -3
  452. package/dist/sidebar.js +1 -1
  453. package/dist/skeleton.cjs +2 -2
  454. package/dist/skeleton.js +1 -1
  455. package/dist/slider.cjs +5 -5
  456. package/dist/slider.js +4 -4
  457. package/dist/stat-list.cjs +2 -2
  458. package/dist/stat-list.js +1 -1
  459. package/dist/stat.cjs +3 -3
  460. package/dist/stat.js +1 -1
  461. package/dist/styles.css +15 -15
  462. package/dist/styles.css.map +1 -1
  463. package/dist/switch.cjs +3 -3
  464. package/dist/switch.js +2 -2
  465. package/dist/table.cjs +11 -11
  466. package/dist/table.js +1 -1
  467. package/dist/tabs.cjs +3 -3
  468. package/dist/tabs.js +1 -1
  469. package/dist/text.cjs +2 -2
  470. package/dist/text.js +1 -1
  471. package/dist/textarea.cjs +6 -6
  472. package/dist/textarea.js +5 -5
  473. package/dist/time-grid.cjs +2 -2
  474. package/dist/time-grid.js +1 -1
  475. package/dist/time-picker.cjs +2 -2
  476. package/dist/time-picker.js +1 -1
  477. package/dist/timeline.cjs +4 -4
  478. package/dist/timeline.js +1 -1
  479. package/dist/toast.cjs +3 -3
  480. package/dist/toast.js +1 -1
  481. package/dist/tree-nav.cjs +3 -3
  482. package/dist/tree-nav.js +1 -1
  483. package/package.json +1 -1
  484. package/dist/chunk-25UPDBI6.cjs.map +0 -1
  485. package/dist/chunk-2KAJ4L7C.js.map +0 -1
  486. package/dist/chunk-32AJIHBZ.js.map +0 -1
  487. package/dist/chunk-5F6V5HHT.cjs.map +0 -1
  488. package/dist/chunk-6IBBAOQC.cjs.map +0 -1
  489. package/dist/chunk-7EZBMGEE.cjs.map +0 -1
  490. package/dist/chunk-7JDVCQXD.js.map +0 -1
  491. package/dist/chunk-AOFDFBRV.js.map +0 -1
  492. package/dist/chunk-B6CQ4KK7.cjs.map +0 -1
  493. package/dist/chunk-CF2U25LM.js.map +0 -1
  494. package/dist/chunk-FSRPZYZZ.js.map +0 -1
  495. package/dist/chunk-FYKOLKQZ.js.map +0 -1
  496. package/dist/chunk-GFYSELJF.js +0 -35
  497. package/dist/chunk-GU5BYZTR.cjs.map +0 -1
  498. package/dist/chunk-HKRB2Z6R.cjs.map +0 -1
  499. package/dist/chunk-I6L7OP7G.cjs.map +0 -1
  500. package/dist/chunk-IWXP2YUP.js.map +0 -1
  501. package/dist/chunk-JFOORUUD.cjs.map +0 -1
  502. package/dist/chunk-LLA33GKC.cjs.map +0 -1
  503. package/dist/chunk-M52IS5SO.cjs.map +0 -1
  504. package/dist/chunk-M5ACSJJ4.js.map +0 -1
  505. package/dist/chunk-N6OZZAOT.js.map +0 -1
  506. package/dist/chunk-O6E2WC3J.js.map +0 -1
  507. package/dist/chunk-OS2QC3NE.cjs.map +0 -1
  508. package/dist/chunk-P7Q2YIIS.js.map +0 -1
  509. package/dist/chunk-PCTZNK2Z.js.map +0 -1
  510. package/dist/chunk-PHDIQ4VC.js.map +0 -1
  511. package/dist/chunk-PLNDZF2A.cjs.map +0 -1
  512. package/dist/chunk-PWEZCMIY.js.map +0 -1
  513. package/dist/chunk-QAFAPHAF.cjs.map +0 -1
  514. package/dist/chunk-QSFTWIUH.cjs.map +0 -1
  515. package/dist/chunk-RA2VOQ46.js.map +0 -1
  516. package/dist/chunk-RLMU3NHQ.cjs.map +0 -1
  517. package/dist/chunk-RPVCMW64.cjs.map +0 -1
  518. package/dist/chunk-T45XK5GN.cjs.map +0 -1
  519. package/dist/chunk-TDDWWAM5.js.map +0 -1
  520. package/dist/chunk-TNYWQ6EQ.js.map +0 -1
  521. package/dist/chunk-VKXNCYLE.cjs.map +0 -1
  522. package/dist/chunk-W6RDAZJC.js.map +0 -1
  523. package/dist/chunk-WBVWV2V7.cjs.map +0 -1
  524. package/dist/chunk-XDJSFGXW.js.map +0 -1
  525. package/dist/chunk-XK5WHQ3O.cjs.map +0 -1
  526. package/dist/chunk-YD4SXA6K.js.map +0 -1
  527. package/dist/chunk-Z3NSPDTW.cjs.map +0 -1
  528. package/dist/chunk-ZLWCZV7R.js.map +0 -1
  529. package/dist/chunk-ZY4CVNNZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/TreeNav/TreeNav.context.ts","../src/components/TreeNav/tree-store.ts","../src/components/TreeNav/TreeNode.tsx","../src/components/TreeNav/TreeNav.tsx"],"names":["createContext","useContext","useRef","useCallback","jsx"],"mappings":";;;;;AAGO,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAErE,SAAS,UAAA,GAAkC;AAChD,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,GAAA;AACT;ACKO,SAAS,gBAAgB,OAAA,EAA+B;AAC7D,EAAA,IAAI,KAAA,GAAQ,OAAA;AACZ,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,EAAA,OAAO;AAAA,IACL,KAAK,MAAM,KAAA;AAAA,IACX,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,KAAA,MAAW,QAAA,IAAY,WAAW,QAAA,EAAS;AAAA,IAC7C,CAAA;AAAA,IACA,UAAU,QAAA,EAAU;AAClB,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,IACxC;AAAA,GACF;AACF;AA+BO,IAAM,oBAAA,GAAuBA,cAAoC,IAAI,CAAA;AAErE,SAAS,gBAAA,GAAkC;AAChD,EAAA,MAAM,SAAA,GAAYC,WAAW,oBAAoB,CAAA;AACjD,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,wDAAwD,CAAA;AACxF,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,aAAgB,MAAA,EAAoC;AAClE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,gBAAA,EAAiB;AACnC,EAAA,OAAO,oBAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,CAAA;AAAA,IACxB,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK;AAAA,GAC1B;AACF;ACxEA,IAAM,UAAA,GAAqC;AAAA,EACzC,EAAA,EAAI,SAAA;AAAA,EACJ,GAAA,EAAK,SAAA;AAAA,EACL,EAAA,EAAI,SAAA;AAAA,EACJ,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,EAAA,EAAI,SAAA;AAAA,EACJ,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,QAAA,CAAS,EAAE,GAAA,EAAI,EAAqB;AAC3C,EAAA,MAAM,QAAS,GAAA,IAAO,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,CAAA,IAAM,SAAA;AACxD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,UAAA,EACpE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAK,CAAA,EAAE,+DAAA,EAAgE,MAAA,EAAQ,KAAA,EAAO,aAAY,KAAA,EAAM,CAAA;AAAA,wBACxG,MAAA,EAAA,EAAK,CAAA,EAAE,YAAW,MAAA,EAAQ,KAAA,EAAO,aAAY,KAAA,EAAM;AAAA,GAAA,EACtD,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAK,EAAsB;AAC/C,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,UAAA,EACpE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0DAAA,EAA2D,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,0BACjF,MAAA,EAAA,EAAK,CAAA,EAAE,6BAA4B,IAAA,EAAK,SAAA,EAAU,SAAQ,KAAA,EAAM;AAAA,KAAA,EACnE,CAAA;AAAA,EAEJ;AACA,EAAA,2BACG,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,YACpE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,gFAAA,EAAiF,IAAA,EAAK,WAAU,CAAA,EAC1G,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAK,EAAsB;AAChD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,IAAA,IAAQ,WAAW,CAAA;AAAA,MAE/E,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB;AAAA;AAAA,GACpC;AAEJ;AAMA,SAAS,cAAA,CACP,KAAA,EACA,UAAA,EACA,QAAA,EACS;AACT,EAAA,SAAS,QAAA,CAAS,UAA0B,EAAA,EAAsC;AAChF,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,EAAA,EAAI,OAAO,CAAA;AACxB,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,EAAE,CAAA;AACrC,QAAA,IAAI,OAAO,OAAO,KAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,SAAS,aAAA,CAAc,MAAoB,EAAA,EAAqB;AAC9D,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAC3B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,IAAI,KAAA,CAAM,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAC5B,MAAA,IAAI,aAAA,CAAc,KAAA,EAAO,EAAE,CAAA,EAAG,OAAO,IAAA;AAAA,IACvC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,EAAO,UAAU,CAAA;AAC3C,EAAA,OAAO,QAAA,GAAW,aAAA,CAAc,QAAA,EAAU,QAAQ,CAAA,GAAI,KAAA;AACxD;AAEA,SAAS,mBAAA,CACP,GACA,QAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AACnD,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,GAAS,CAAA;AAE5B,EAAA,IAAI,OAAA,GAAU,OAAO,OAAO,QAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,KAAA,GAAQ,CAAA,EAAG,OAAO,OAAA;AAChC,EAAA,OAAO,WAAW,QAAA,GAAW,OAAA;AAC/B;AAgBA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,KAAA,EAAM,EAAkB;AACpD,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,UAAA;AAAA,IAAY,YAAA;AAAA,IAAc,WAAA;AAAA,IAAa,QAAA;AAAA,IAAU,YAAA;AAAA,IAC/E,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,mBAAA;AAAA,IAAqB;AAAA,MACjE,gBAAA,EAAiB;AAErB,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,KAAS,QAAA,IAAa,KAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AACpF,EAAA,MAAM,UAAA,GAAa,aAAa,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAC9D,EAAA,MAAM,aAAa,YAAA,CAAa,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,KAAK,EAAE,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,aAAa,CAAC,CAAA,KAAM,EAAE,SAAA,CAAU,aAAA,KAAkB,KAAK,EAAE,CAAA;AAC5E,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IAAa,CAAC,MACjC,CAAA,CAAE,SAAA,CAAU,iBAAiB,IAAA,CAAK,EAAA,GAAK,CAAA,CAAE,SAAA,CAAU,YAAA,GAAe;AAAA,GACpE;AACA,EAAA,MAAM,eAAe,YAAA,KAAiB,IAAA;AACtC,EAAA,MAAM,WAAA,GAAc,QAAQ,UAAA,GAAa,CAAA;AAGzC,EAAA,MAAM,eAAA,GAAkB,OAA6C,IAAI,CAAA;AAEzE,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM,eAAA,EAAiB,CAAC,eAAe,CAAC,CAAA;AAMlD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,IAChB;AACA,IAAA,MAAA,CAAO,IAAI,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAwB;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,GAAG,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,CAAA,KAAuB;AAC1D,IAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,IAAA,CAAK,EAAE,CAAA;AAC5C,IAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAE/B,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,YAAA,CAAa,EAAE,eAAe,IAAA,CAAK,EAAA,EAAI,cAAc,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,IACjF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,CAAK,EAAA,EAAI,YAAY,CAAC,CAAA;AAE1B,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,eAAA,EAAgB;AAChB,IAAA,YAAA,CAAa,EAAE,aAAA,EAAe,IAAA,EAAM,cAAc,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,EAC9E,CAAA,EAAG,CAAC,eAAA,EAAiB,YAAY,CAAC,CAAA;AAOlC,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,CAAA,KAAuB;AACzD,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,KAAA,CAAM,GAAA,EAAI;AAChC,IAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,CAAU,aAAA;AAClC,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,IAAI,CAAC,mBAAA,EAAqB;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,SAAA,CAAU,aAAA;AAC3B,MAAA,IAAI,QAAA,KAAa,KAAK,EAAA,EAAI;AAC1B,MAAA,IAAI,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,EAAE,CAAA,EAAG;AAAA,IAChD;AAEA,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,CAAA,CAAE,YAAA,CAAa,UAAA,GAAa,cAAA,GAAiB,MAAA,GAAS,MAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAA;AAGlD,IAAA,IAAI,QAAA,IAAY,CAAC,KAAA,CAAM,GAAA,EAAI,CAAE,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,QAAA,KAAa,QAAA,EAAU;AAC3E,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AACzC,UAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAClB,UAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,QAC5B,GAAG,GAAG,CAAA;AAAA,MACR;AAAA,IACF,CAAA,MAAO;AACL,MAAA,eAAA,EAAgB;AAAA,IAClB;AAEA,IAAA,IAAI,UAAU,YAAA,KAAiB,IAAA,CAAK,EAAA,IAAM,SAAA,CAAU,iBAAiB,QAAA,EAAU;AAC7E,MAAA,YAAA,CAAa,EAAE,eAAe,SAAA,CAAU,aAAA,EAAe,cAAc,IAAA,CAAK,EAAA,EAAI,YAAA,EAAc,QAAA,EAAU,CAAA;AAAA,IACxG;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,mBAAA,EAAqB,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,eAAe,CAAC,CAAA;AAEpG,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,CAAA,KAAuB;AAC1D,IAAA,IAAI,CAAC,CAAA,CAAE,aAAA,CAAc,QAAA,CAAS,CAAA,CAAE,aAAqB,CAAA,EAAG;AACtD,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,KAAA,CAAM,GAAA,EAAI;AAChC,MAAA,IAAI,SAAA,CAAU,YAAA,KAAiB,IAAA,CAAK,EAAA,EAAI;AACtC,QAAA,YAAA,CAAa,EAAE,GAAG,SAAA,EAAW,cAAc,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,MACvE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,KAAK,EAAA,EAAI,YAAA,EAAc,eAAe,CAAC,CAAA;AAElD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,CAAA,KAAuB;AACrD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,eAAA,EAAgB;AAEhB,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,KAAA,CAAM,GAAA,EAAI;AAChC,IAAA,MAAM,WAAW,SAAA,CAAU,aAAA;AAC3B,IAAA,MAAM,WAAW,SAAA,CAAU,YAAA,IAAgB,oBAAoB,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAA;AAE5E,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,QAAA,KAAa,KAAK,EAAA,EAAI;AAC1B,MAAA,IAAI,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,EAAE,CAAA,EAAG;AAC9C,MAAA,QAAA,GAAW,QAAA,EAAU,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AAAA,IACxC,WAAW,mBAAA,EAAqB;AAE9B,MAAA,YAAA,GAAe,CAAA,EAAG,MAAM,QAAQ,CAAA;AAAA,IAClC;AAEA,IAAA,YAAA,CAAa,EAAE,aAAA,EAAe,IAAA,EAAM,cAAc,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,EAC9E,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,mBAAA,EAAqB,YAAA,EAAc,YAAA,EAAc,eAAe,CAAC,CAAA;AAM7G,EAAA,MAAM,OAAA,GAAU,SAAA,IAAa,CAAC,IAAA,CAAK,QAAA;AACnC,EAAA,MAAM,cAAc,SAAA,IAAa,mBAAA;AAEjC,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,4BAAA,EAA2B,EAAA;AAAA,MAC3B,UAAA,EAAY,cAAc,cAAA,GAAiB,MAAA;AAAA,MAC3C,WAAA,EAAa,cAAc,eAAA,GAAkB,MAAA;AAAA,MAC7C,MAAA,EAAQ,cAAc,UAAA,GAAa,MAAA;AAAA,MAGlC,QAAA,EAAA;AAAA,QAAA,YAAA,IAAgB,iBAAiB,QAAA,oBAChC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,sCAAA,EAAqC,QAAA;AAAA,YACrC,SAAA,EAAU,oDAAA;AAAA,YACV,KAAA,EAAO,EAAE,UAAA,EAAY,WAAA;AAAY;AAAA,SACnC;AAAA,wBAGF,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,OAAA;AAAA,YACX,WAAA,EAAa,UAAU,eAAA,GAAkB,MAAA;AAAA,YACzC,SAAA,EAAW,UAAU,aAAA,GAAgB,MAAA;AAAA,YACrC,OAAA,EAAS,WAAA;AAAA,YACT,aAAA,EAAe,iBAAA;AAAA,YACf,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,SAAA,EAAW,EAAA;AAAA,cACT,0FAAA;AAAA,cACA,aACI,iDAAA,GACA,2EAAA;AAAA,cACJ,KAAK,QAAA,IAAY,gCAAA;AAAA,cACjB,UAAA,IAAc,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMd,OAAA,KACG,UAAA,KAAe,MAAA,GAAS,oCAAA,GAAuC,wBAAA,CAAA;AAAA,cAClE,YAAA,IAAgB,iBAAiB,QAAA,IAAY;AAAA,aAC/C;AAAA,YACA,KAAA,EAAO,EAAE,WAAA,EAAY;AAAA,YAEpB,QAAA,EAAA;AAAA,cAAA,QAAA,oBAAY,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,UAAA,EAAY,CAAA;AAAA,cAC3C,CAAC,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EAAiB,CAAA;AAAA,cAC9C,SAAA,KACC,KAAK,IAAA,KAAS,QAAA,uBACT,UAAA,EAAA,EAAW,IAAA,EAAM,YAAY,CAAA,mBAC9B,GAAA,CAAC,YAAS,GAAA,EAAK,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,KAAI,EAAG,CAAA,CAAA,CAAA;AAAA,8BAE9D,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,eAAK,KAAA,EAAM;AAAA;AAAA;AAAA,SACzC;AAAA,QAGC,YAAA,IAAgB,iBAAiB,OAAA,oBAChC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,sCAAA,EAAqC,OAAA;AAAA,YACrC,SAAA,EAAU,oDAAA;AAAA,YACV,KAAA,EAAO,EAAE,UAAA,EAAY,WAAA;AAAY;AAAA,SACnC;AAAA,QAID,CAAC,IAAA,IAAQ,QAAA,IAAY,UAAA,IAAc,IAAA,CAAK,4BACvC,GAAA,CAAC,KAAA,EAAA,EAAI,qCAAA,EAAoC,EAAA,EACtC,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,KAAA,qBAClB,GAAA,CAAC,QAAA,EAAA,EAAwB,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAA,EAAtC,KAAA,CAAM,EAAmC,CACzD,CAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEO,IAAM,QAAA,GAAW,KAAK,YAAY,CAAA;AAEzC,QAAA,CAAS,WAAA,GAAc,UAAA;AC/UvB,SAAS,iBAAiB,KAAA,EAAiC;AACzD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAE,CAAA;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,gBAAA,GAA8B;AAAA,EAClC,aAAA,EAAe,IAAA;AAAA,EACf,YAAA,EAAc,IAAA;AAAA,EACd,YAAA,EAAc;AAChB,CAAA;AASA,SAAS,cAAA,CAAe,OAAuB,QAAA,EAA0C;AACvF,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAsB,KAAA,KAAkB;AACpD,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,KAAK,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,KAAK,IAAA,KAAS,QAAA,IAAa,KAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AACpF,MAAA,IAAI,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAA;AAAA,IACvF;AAAA,EACF,CAAA;AACA,EAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AACb,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA;AAAA,EACA,mBAAA,GAAsB,KAAA;AAAA,EACtB,cAAA;AAAA,EACA,WAAA,EAAa,kBAAA;AAAA,EACb,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,UAAA,GAAa,EAAA;AAAA,EACb,SAAA,GAAY,IAAA;AAAA,EACZ,UAAA,GAAa,MAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EACb,MAAA,GAAS,GAAA;AAAA,EACT,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAmB,MAAM;AACvE,IAAA,IAAI,oBAAoB,OAAO,kBAAA;AAC/B,IAAA,IAAI,gBAAA,EAAkB,OAAO,gBAAA,CAAiB,KAAK,CAAA;AACnD,IAAA,OAAO,EAAC;AAAA,EACV,CAAC,CAAA;AAED,EAAA,MAAM,eAAe,kBAAA,KAAuB,MAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,eAAe,kBAAA,GAAqB,gBAAA;AAExD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM,IAAI,IAAI,WAAW,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAElE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAoB,gBAAgB,CAAA;AAOtE,EAAA,MAAM,MAAA,GAASC,MAAAA,CAAO,EAAE,WAAA,EAAa,YAAA,EAAc,kBAAkB,QAAA,EAAU,iBAAA,EAAmB,UAAA,EAAY,cAAA,EAAgB,CAAA;AAC9H,EAAA,MAAA,CAAO,OAAA,GAAU,EAAE,WAAA,EAAa,YAAA,EAAc,kBAAkB,QAAA,EAAU,iBAAA,EAAmB,YAAY,cAAA,EAAe;AAExH,EAAA,MAAM,WAAA,GAAcC,WAAAA,CAAY,CAAC,IAAA,KAAmB;AAClD,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,YAAA,sBAAkC,IAAI,CAAA;AAC1D,IAAA,MAAA,CAAO,OAAA,CAAQ,mBAAmB,IAAI,CAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,CAAC,EAAA,KAAe;AACd,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,WAAA;AAC/B,MAAA,WAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,GAAI,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAA,GAAI,CAAC,GAAG,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,IACvF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,EAAA,KAAe;AACd,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,WAAA;AAC/B,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,cAAe,CAAC,GAAG,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,MAAA,GAASA,WAAAA,CAAY,CAAC,IAAA,KAAuB,MAAA,CAAO,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA,EAAG,EAAE,CAAA;AAC/F,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,CAAA,EAAqB,IAAA,KAAuB,OAAO,OAAA,CAAQ,iBAAA,GAAoB,GAAG,IAAI,CAAA;AAAA,IACvF;AAAC,GACH;AACA,EAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,IACf,CAAC,UAAkB,QAAA,EAAkB,QAAA,KACnC,OAAO,OAAA,CAAQ,UAAA,GAAa,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC1D;AAAC,GACH;AACA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,OAAwB,MAAA,EAAsB,QAAA,KAC7C,OAAO,OAAA,CAAQ,cAAA,GAAiB,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACzD;AAAC,GACH;AAIA,EAAA,MAAM,CAAC,KAAK,CAAA,GAAI,QAAA,CAAS,MAAM,eAAA,CAAgB,EAAE,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,CAAC,CAAA;AACnF,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,EAAI;AAC1B,IAAA,IAAI,OAAA,CAAQ,eAAe,UAAA,IAAc,OAAA,CAAQ,aAAa,QAAA,IAAY,OAAA,CAAQ,cAAc,SAAA,EAAW;AACzG,MAAA,KAAA,CAAM,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,EAAU,WAAW,CAAA;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,SAAS,CAAC,CAAA;AAE3C,EAAA,MAAM,iBAAiB,iBAAA,KAAsB,MAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,OAAA;AAAA,IAChB,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA;AAAA,MAEA,WAAA,EAAa,iBAAiB,WAAA,GAAc,MAAA;AAAA,MAC5C,QAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACR,CAAA;AAAA,IACA;AAAA,MAAC,KAAA;AAAA,MAAO,KAAA;AAAA,MAAO,MAAA;AAAA,MAAQ,MAAA;AAAA,MAAQ,UAAA;AAAA,MAAY,cAAA;AAAA,MAAgB,WAAA;AAAA,MAAa,QAAA;AAAA,MAAU,YAAA;AAAA,MACjF,UAAA;AAAA,MAAY,SAAA;AAAA,MAAW,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,mBAAA;AAAA,MAAqB;AAAA;AAAU,GAChF;AAIA,EAAA,MAAM,GAAA,GAAM,OAAA;AAAA,IACV,OAAO;AAAA,MACL,UAAA;AAAA,MAAY,QAAA;AAAA,MAAU,iBAAA;AAAA,MAAmB,WAAA;AAAA,MAAa,MAAA;AAAA,MAAQ,UAAA;AAAA,MAAY,SAAA;AAAA,MAC1E,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,SAAA;AAAA,MAAW,YAAA;AAAA,MAAc,UAAA;AAAA,MAAY,mBAAA;AAAA,MAAqB,cAAA;AAAA,MAAgB,KAAA;AAAA,MAAO;AAAA,KAC1G,CAAA;AAAA,IACA;AAAA,MAAC,UAAA;AAAA,MAAY,QAAA;AAAA,MAAU,iBAAA;AAAA,MAAmB,WAAA;AAAA,MAAa,MAAA;AAAA,MAAQ,UAAA;AAAA,MAAY,SAAA;AAAA,MAC1E,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,mBAAA;AAAA,MAAqB,cAAA;AAAA,MAAgB,KAAA;AAAA,MAAO;AAAA;AAAU,GACvG;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA;AAAA,IACX,MAAO,UAAA,GAAa,cAAA,CAAe,KAAA,EAAO,QAAQ,IAAI,EAAC;AAAA,IACvD,CAAC,UAAA,EAAY,KAAA,EAAO,QAAQ;AAAA,GAC9B;AAEA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,YAAA,CAAa,gBAAgB,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAc,SAAA,IAAa,mBAAA;AAEjC,EAAA,uBACEC,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,GAAA,EAC9B,QAAA,kBAAAA,GAAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,KAAA,EAAO,WACpC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,2BAAA,EAA0B,EAAA;AAAA,MAC1B,mCAAA,EAAmC,aAAa,EAAA,GAAK,MAAA;AAAA,MACrD,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC7D,SAAA,EAAW,cAAc,aAAA,GAAgB,MAAA;AAAA,MAExC,uCACCA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,MAAA;AAAA,UACA,iBAAA,EAAmB,SAAA;AAAA,UACnB,SAAA,EAAW,CAAC,GAAA,qBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO;AAAA;AAAA,OAClE,GAEA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBAASA,GAAAA,CAAC,QAAA,EAAA,EAAuB,IAAA,EAAY,KAAA,EAAO,CAAA,EAAA,EAA5B,IAAA,CAAK,EAA0B,CAAE;AAAA;AAAA,KAG1E,CAAA,EACF,CAAA;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,SAAA;AAEnB,IAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AAAA,EAChD,IAAA,EAAM;AACR,CAAC","file":"chunk-ZVXOL5H3.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { TreeNavContextValue } from \"./TreeNav.types\";\n\nexport const TreeNavContext = createContext<TreeNavContextValue | null>(null);\n\nexport function useTreeNav(): TreeNavContextValue {\n const ctx = useContext(TreeNavContext);\n if (!ctx) {\n throw new Error(\"useTreeNav must be used within a <TreeNav> component\");\n }\n return ctx;\n}\n","import { createContext, useContext, useSyncExternalStore } from \"react\";\nimport type { DragState, DropPosition, TreeNodeData } from \"./TreeNav.types\";\n\n/** What changes as someone clicks, toggles and drags — the state rows subscribe to. */\nexport interface TreeState {\n selectedId?: string;\n expanded: ReadonlySet<string>;\n dragState: DragState;\n}\n\nexport interface TreeStore {\n get(): TreeState;\n set(next: TreeState): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createTreeStore(initial: TreeState): TreeStore {\n let state = initial;\n const listeners = new Set<() => void>();\n return {\n get: () => state,\n set(next) {\n state = next;\n for (const listener of listeners) listener();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\n/**\n * Everything a row needs that does NOT change on a click. Handlers are stable\n * (they read the latest props and state when called), so this value only changes\n * when the tree's data or configuration does.\n *\n * Kept apart from the public `TreeNavContext` on purpose: that one still carries\n * live `selectedId` / `expandedIds` for `useTreeNav()` callers, and any component\n * reading it re-renders on every click. Rows no longer read it — which is the\n * whole fix: a click used to re-render every row in the tree.\n */\nexport interface TreeInternals {\n store: TreeStore;\n nodes: TreeNodeData[];\n select: (node: TreeNodeData) => void;\n toggle: (id: string) => void;\n expandNode: (id: string) => void;\n setDragState: (state: DragState) => void;\n contextMenu?: (e: React.MouseEvent, node: TreeNodeData) => void;\n moveNode?: (sourceId: string, targetId: string, position: DropPosition) => void;\n externalDrop?: (event: React.DragEvent, target: TreeNodeData, position: DropPosition) => void;\n indentSize: number;\n showIcons: boolean;\n draggable: boolean;\n dragCursor: \"grab\" | \"none\";\n acceptExternalDrops: boolean;\n /** Rows are rendered flat by a virtual list, so a row never renders its children. */\n flat: boolean;\n}\n\nexport const TreeInternalsContext = createContext<TreeInternals | null>(null);\n\nexport function useTreeInternals(): TreeInternals {\n const internals = useContext(TreeInternalsContext);\n if (!internals) throw new Error(\"TreeNav.Node must be used within a <TreeNav> component\");\n return internals;\n}\n\n/** Subscribe to ONE derived value; the row re-renders only when that value changes. */\nexport function useTreeSlice<T>(select: (state: TreeState) => T): T {\n const { store } = useTreeInternals();\n return useSyncExternalStore(\n store.subscribe,\n () => select(store.get()),\n () => select(store.get()),\n );\n}\n","import { memo, useRef, useEffect, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTreeInternals, useTreeSlice } from \"./tree-store\";\nimport type { TreeNodeProps, TreeNodeData, DropPosition } from \"./TreeNav.types\";\n\nconst EXT_COLORS: Record<string, string> = {\n ts: \"#3178c6\",\n tsx: \"#3178c6\",\n js: \"#f7df1e\",\n jsx: \"#f7df1e\",\n php: \"#777bb4\",\n html: \"#e34c26\",\n htm: \"#e34c26\",\n css: \"#264de4\",\n json: \"#a1a1aa\",\n md: \"#71717a\",\n yaml: \"#cb171e\",\n yml: \"#cb171e\",\n};\n\nfunction FileIcon({ ext }: { ext?: string }) {\n const color = (ext && EXT_COLORS[ext.toLowerCase()]) || \"#71717a\";\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M4 1h5.5L13 4.5V14a1 1 0 01-1 1H4a1 1 0 01-1-1V2a1 1 0 011-1z\" stroke={color} strokeWidth=\"1.2\" />\n <path d=\"M9 1v4h4\" stroke={color} strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FolderIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3.5a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1V5H2.5V3.5z\" fill=\"#fbbf24\" />\n <path d=\"M1 6h13l-1.5 7.5H2.5L1 6z\" fill=\"#fbbf24\" opacity=\"0.7\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1v8a1 1 0 01-1 1H2.5a1 1 0 01-1-1V3z\" fill=\"#fbbf24\" />\n </svg>\n );\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\"shrink-0 transition-transform duration-150\", open && \"rotate-90\")}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction isDescendantOf(\n nodes: TreeNodeData[],\n ancestorId: string,\n targetId: string,\n): boolean {\n function findNode(haystack: TreeNodeData[], id: string): TreeNodeData | undefined {\n for (const n of haystack) {\n if (n.id === id) return n;\n if (n.children) {\n const found = findNode(n.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n function hasDescendant(node: TreeNodeData, id: string): boolean {\n if (!node.children) return false;\n for (const child of node.children) {\n if (child.id === id) return true;\n if (hasDescendant(child, id)) return true;\n }\n return false;\n }\n\n const ancestor = findNode(nodes, ancestorId);\n return ancestor ? hasDescendant(ancestor, targetId) : false;\n}\n\nfunction computeDropPosition(\n e: React.DragEvent,\n isFolder: boolean,\n): DropPosition {\n const rect = e.currentTarget.getBoundingClientRect();\n const offsetY = e.clientY - rect.top;\n const third = rect.height / 3;\n\n if (offsetY < third) return \"before\";\n if (offsetY > third * 2) return \"after\";\n return isFolder ? \"inside\" : \"after\";\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n\n/**\n * One row (and, when nested, its expanded children).\n *\n * Reads what changes on a click — selection, expansion, drag — as per-row slices\n * of a store, so a click re-renders only the rows whose slice changed. It used to\n * read one context holding all of it, so every click re-rendered every row:\n * 175-267 ms per click on a 5,000-node tree. `memo` keeps a parent's re-render\n * from reaching rows whose `node` and `depth` did not change.\n */\nfunction TreeNodeImpl({ node, depth }: TreeNodeProps) {\n const {\n store, nodes, select, toggle, expandNode, setDragState, contextMenu, moveNode, externalDrop,\n indentSize, showIcons, draggable, dragCursor, acceptExternalDrops, flat,\n } = useTreeInternals();\n\n const isFolder = node.type === \"folder\" || (node.children && node.children.length > 0);\n const isExpanded = useTreeSlice((s) => s.expanded.has(node.id));\n const isSelected = useTreeSlice((s) => s.selectedId === node.id);\n const isDragging = useTreeSlice((s) => s.dragState.draggedNodeId === node.id);\n const dropPosition = useTreeSlice((s) =>\n s.dragState.dropTargetId === node.id ? s.dragState.dropPosition : null,\n );\n const isDropTarget = dropPosition !== null;\n const paddingLeft = depth * indentSize + 4;\n\n // Auto-expand timer for folders during drag\n const autoExpandTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearAutoExpand = useCallback(() => {\n if (autoExpandTimer.current) {\n clearTimeout(autoExpandTimer.current);\n autoExpandTimer.current = null;\n }\n }, []);\n\n useEffect(() => clearAutoExpand, [clearAutoExpand]);\n\n // ---------------------------------------------------------------------------\n // Click handlers\n // ---------------------------------------------------------------------------\n\n const handleClick = () => {\n if (node.disabled) return;\n if (isFolder) {\n toggle(node.id);\n }\n select(node);\n };\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (contextMenu) {\n e.preventDefault();\n contextMenu(e, node);\n }\n };\n\n // ---------------------------------------------------------------------------\n // Drag source handlers\n // ---------------------------------------------------------------------------\n\n const handleDragStart = useCallback((e: React.DragEvent) => {\n e.dataTransfer.setData(\"text/plain\", node.id);\n e.dataTransfer.effectAllowed = \"move\";\n // Set state async so the browser captures the element for the drag ghost first\n requestAnimationFrame(() => {\n setDragState({ draggedNodeId: node.id, dropTargetId: null, dropPosition: null });\n });\n }, [node.id, setDragState]);\n\n const handleDragEnd = useCallback(() => {\n clearAutoExpand();\n setDragState({ draggedNodeId: null, dropTargetId: null, dropPosition: null });\n }, [clearAutoExpand, setDragState]);\n\n // ---------------------------------------------------------------------------\n // Drop target handlers (on outer div). Drag state is read from the store when\n // the event fires, so a row does not re-render as a drag moves elsewhere.\n // ---------------------------------------------------------------------------\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n const { dragState } = store.get();\n const isExternalDrag = !dragState.draggedNodeId;\n if (isExternalDrag) {\n // External drop accepted only when host opted in.\n if (!acceptExternalDrops) return;\n } else {\n const sourceId = dragState.draggedNodeId!;\n if (sourceId === node.id) return;\n if (isDescendantOf(nodes, sourceId, node.id)) return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = isExternalDrag ? \"copy\" : \"move\";\n\n const position = computeDropPosition(e, !!isFolder);\n\n // Auto-expand collapsed folders when hovering \"inside\"\n if (isFolder && !store.get().expanded.has(node.id) && position === \"inside\") {\n if (!autoExpandTimer.current) {\n autoExpandTimer.current = setTimeout(() => {\n expandNode(node.id);\n autoExpandTimer.current = null;\n }, 500);\n }\n } else {\n clearAutoExpand();\n }\n\n if (dragState.dropTargetId !== node.id || dragState.dropPosition !== position) {\n setDragState({ draggedNodeId: dragState.draggedNodeId, dropTargetId: node.id, dropPosition: position });\n }\n }, [store, acceptExternalDrops, node.id, isFolder, nodes, setDragState, expandNode, clearAutoExpand]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n clearAutoExpand();\n const { dragState } = store.get();\n if (dragState.dropTargetId === node.id) {\n setDragState({ ...dragState, dropTargetId: null, dropPosition: null });\n }\n }\n }, [store, node.id, setDragState, clearAutoExpand]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n clearAutoExpand();\n\n const { dragState } = store.get();\n const sourceId = dragState.draggedNodeId;\n const position = dragState.dropPosition ?? computeDropPosition(e, !!isFolder);\n\n if (sourceId) {\n // Internal node move.\n if (sourceId === node.id) return;\n if (isDescendantOf(nodes, sourceId, node.id)) return;\n moveNode?.(sourceId, node.id, position);\n } else if (acceptExternalDrops) {\n // External drop — files, items from other components, etc.\n externalDrop?.(e, node, position);\n }\n\n setDragState({ draggedNodeId: null, dropTargetId: null, dropPosition: null });\n }, [store, node, isFolder, nodes, moveNode, acceptExternalDrops, externalDrop, setDragState, clearAutoExpand]);\n\n // ---------------------------------------------------------------------------\n // Render\n // ---------------------------------------------------------------------------\n\n const canDrag = draggable && !node.disabled;\n const dropEnabled = draggable || acceptExternalDrops;\n\n return (\n <div\n data-react-fancy-tree-node=\"\"\n onDragOver={dropEnabled ? handleDragOver : undefined}\n onDragLeave={dropEnabled ? handleDragLeave : undefined}\n onDrop={dropEnabled ? handleDrop : undefined}\n >\n {/* Before drop indicator */}\n {isDropTarget && dropPosition === \"before\" && (\n <div\n data-react-fancy-tree-drop-indicator=\"before\"\n className=\"pointer-events-none h-0.5 rounded-full bg-blue-500\"\n style={{ marginLeft: paddingLeft }}\n />\n )}\n\n <button\n type=\"button\"\n draggable={canDrag}\n onDragStart={canDrag ? handleDragStart : undefined}\n onDragEnd={canDrag ? handleDragEnd : undefined}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n disabled={node.disabled}\n className={cn(\n \"flex w-full items-center gap-1 rounded-md py-0.5 text-left text-[13px] transition-colors\",\n isSelected\n ? \"bg-blue-500/15 text-blue-600 dark:text-blue-400\"\n : \"text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800\",\n node.disabled && \"pointer-events-none opacity-40\",\n isDragging && \"opacity-50\",\n // Grab affordance. By default (`dragCursor=\"none\"`) the row keeps its\n // normal click cursor on hover — no open-hand \"move me\" cursor before\n // any drag — and only shows the closed-hand `grabbing` cursor while a\n // drag is actually underway (mousedown/drag). `dragCursor=\"grab\"` opts\n // back into the always-on grab cursor for whole-row drag handles (#14).\n canDrag &&\n (dragCursor === \"grab\" ? \"cursor-grab active:cursor-grabbing\" : \"active:cursor-grabbing\"),\n isDropTarget && dropPosition === \"inside\" && \"bg-blue-500/10 ring-1 ring-blue-500/30 ring-inset\",\n )}\n style={{ paddingLeft }}\n >\n {isFolder && <ChevronIcon open={isExpanded} />}\n {!isFolder && <span className=\"w-3.5 shrink-0\" />}\n {showIcons && (\n node.icon ?? (isFolder\n ? <FolderIcon open={isExpanded} />\n : <FileIcon ext={node.ext ?? node.label.split(\".\").pop()} />)\n )}\n <span className=\"truncate\">{node.label}</span>\n </button>\n\n {/* After drop indicator */}\n {isDropTarget && dropPosition === \"after\" && (\n <div\n data-react-fancy-tree-drop-indicator=\"after\"\n className=\"pointer-events-none h-0.5 rounded-full bg-blue-500\"\n style={{ marginLeft: paddingLeft }}\n />\n )}\n\n {/* A virtual list renders rows flat, so a row never renders its own children there. */}\n {!flat && isFolder && isExpanded && node.children && (\n <div data-react-fancy-tree-node-children=\"\">\n {node.children.map((child) => (\n <TreeNode key={child.id} node={child} depth={depth + 1} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport const TreeNode = memo(TreeNodeImpl);\n\nTreeNode.displayName = \"TreeNode\";\n","import { useMemo, useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { VirtualList } from \"../VirtualList\";\nimport { TreeNavContext } from \"./TreeNav.context\";\nimport { TreeNode } from \"./TreeNode\";\nimport { createTreeStore, TreeInternalsContext, type TreeInternals } from \"./tree-store\";\nimport type { TreeNavProps, TreeNodeData, DragState } from \"./TreeNav.types\";\n\nfunction collectFolderIds(nodes: TreeNodeData[]): string[] {\n const ids: string[] = [];\n for (const node of nodes) {\n if (node.children && node.children.length > 0) {\n ids.push(node.id);\n ids.push(...collectFolderIds(node.children));\n }\n }\n return ids;\n}\n\nconst EMPTY_DRAG_STATE: DragState = {\n draggedNodeId: null,\n dropTargetId: null,\n dropPosition: null,\n};\n\ninterface FlatRow {\n id: string;\n node: TreeNodeData;\n depth: number;\n}\n\n/** The rows currently visible — every node, descending only into expanded folders. */\nfunction flattenVisible(nodes: TreeNodeData[], expanded: ReadonlySet<string>): FlatRow[] {\n const rows: FlatRow[] = [];\n const walk = (list: TreeNodeData[], depth: number) => {\n for (const node of list) {\n rows.push({ id: node.id, node, depth });\n const isFolder = node.type === \"folder\" || (node.children && node.children.length > 0);\n if (isFolder && node.children && expanded.has(node.id)) walk(node.children, depth + 1);\n }\n };\n walk(nodes, 0);\n return rows;\n}\n\nfunction TreeNavRoot({\n nodes,\n selectedId,\n onSelect,\n onNodeContextMenu,\n draggable = false,\n onNodeMove,\n acceptExternalDrops = false,\n onExternalDrop,\n expandedIds: controlledExpanded,\n defaultExpandedIds,\n onExpandedChange,\n defaultExpandAll = false,\n indentSize = 16,\n showIcons = true,\n dragCursor = \"none\",\n virtualize = false,\n height = 400,\n rowHeight = 26,\n className,\n}: TreeNavProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(() => {\n if (defaultExpandedIds) return defaultExpandedIds;\n if (defaultExpandAll) return collectFolderIds(nodes);\n return [];\n });\n\n const isControlled = controlledExpanded !== undefined;\n const expandedIds = isControlled ? controlledExpanded : internalExpanded;\n // One Set per change, so a row's \"am I expanded?\" is a lookup, not a scan.\n const expanded = useMemo(() => new Set(expandedIds), [expandedIds]);\n\n const [dragState, setDragState] = useState<DragState>(EMPTY_DRAG_STATE);\n\n /*\n * The latest props and state, for handlers that must stay STABLE. A handler\n * whose identity changes on every click would change the context rows read,\n * and re-render every row — the exact cost this component is avoiding.\n */\n const latest = useRef({ expandedIds, isControlled, onExpandedChange, onSelect, onNodeContextMenu, onNodeMove, onExternalDrop });\n latest.current = { expandedIds, isControlled, onExpandedChange, onSelect, onNodeContextMenu, onNodeMove, onExternalDrop };\n\n const setExpanded = useCallback((next: string[]) => {\n if (!latest.current.isControlled) setInternalExpanded(next);\n latest.current.onExpandedChange?.(next);\n }, []);\n\n const toggle = useCallback(\n (id: string) => {\n const current = latest.current.expandedIds;\n setExpanded(current.includes(id) ? current.filter((v) => v !== id) : [...current, id]);\n },\n [setExpanded],\n );\n\n const expandNode = useCallback(\n (id: string) => {\n const current = latest.current.expandedIds;\n if (!current.includes(id)) setExpanded([...current, id]);\n },\n [setExpanded],\n );\n\n const select = useCallback((node: TreeNodeData) => latest.current.onSelect?.(node.id, node), []);\n const contextMenu = useCallback(\n (e: React.MouseEvent, node: TreeNodeData) => latest.current.onNodeContextMenu?.(e, node),\n [],\n );\n const moveNode = useCallback(\n (sourceId: string, targetId: string, position: Parameters<NonNullable<TreeNavProps[\"onNodeMove\"]>>[2]) =>\n latest.current.onNodeMove?.(sourceId, targetId, position),\n [],\n );\n const externalDrop = useCallback(\n (event: React.DragEvent, target: TreeNodeData, position: Parameters<NonNullable<TreeNavProps[\"onExternalDrop\"]>>[2]) =>\n latest.current.onExternalDrop?.(event, target, position),\n [],\n );\n\n // What rows subscribe to. Seeded with this render's values so the first paint\n // is right; kept current after each render that changes them.\n const [store] = useState(() => createTreeStore({ selectedId, expanded, dragState }));\n useLayoutEffect(() => {\n const current = store.get();\n if (current.selectedId !== selectedId || current.expanded !== expanded || current.dragState !== dragState) {\n store.set({ selectedId, expanded, dragState });\n }\n }, [store, selectedId, expanded, dragState]);\n\n const hasContextMenu = onNodeContextMenu !== undefined;\n const internals = useMemo<TreeInternals>(\n () => ({\n store,\n nodes,\n select,\n toggle,\n expandNode,\n setDragState,\n // Present only when the host gave one: a row then claims the right-click.\n contextMenu: hasContextMenu ? contextMenu : undefined,\n moveNode,\n externalDrop,\n indentSize,\n showIcons,\n draggable,\n dragCursor,\n acceptExternalDrops,\n flat: virtualize,\n }),\n [store, nodes, select, toggle, expandNode, hasContextMenu, contextMenu, moveNode, externalDrop,\n indentSize, showIcons, draggable, dragCursor, acceptExternalDrops, virtualize],\n );\n\n // Unchanged public context, still live for `useTreeNav()` callers. Rows no\n // longer read it, so its changing on a click re-renders only those callers.\n const ctx = useMemo(\n () => ({\n selectedId, onSelect, onNodeContextMenu, expandedIds, toggle, indentSize, showIcons,\n draggable, dragCursor, dragState, setDragState, onNodeMove, acceptExternalDrops, onExternalDrop, nodes, expandNode,\n }),\n [selectedId, onSelect, onNodeContextMenu, expandedIds, toggle, indentSize, showIcons,\n draggable, dragCursor, dragState, onNodeMove, acceptExternalDrops, onExternalDrop, nodes, expandNode],\n );\n\n const rows = useMemo(\n () => (virtualize ? flattenVisible(nodes, expanded) : []),\n [virtualize, nodes, expanded],\n );\n\n const handleDragEnd = useCallback(() => {\n setDragState(EMPTY_DRAG_STATE);\n }, []);\n\n const dropEnabled = draggable || acceptExternalDrops;\n\n return (\n <TreeNavContext.Provider value={ctx}>\n <TreeInternalsContext.Provider value={internals}>\n <nav\n data-react-fancy-tree-nav=\"\"\n data-react-fancy-tree-nav-virtual={virtualize ? \"\" : undefined}\n className={cn(\"flex flex-col gap-0.5 py-1 text-sm\", className)}\n onDragEnd={dropEnabled ? handleDragEnd : undefined}\n >\n {virtualize ? (\n <VirtualList\n items={rows}\n height={height}\n estimateRowHeight={rowHeight}\n renderRow={(row) => <TreeNode node={row.node} depth={row.depth} />}\n />\n ) : (\n nodes.map((node) => <TreeNode key={node.id} node={node} depth={0} />)\n )}\n </nav>\n </TreeInternalsContext.Provider>\n </TreeNavContext.Provider>\n );\n}\n\nTreeNavRoot.displayName = \"TreeNav\";\n\nexport const TreeNav = Object.assign(TreeNavRoot, {\n Node: TreeNode,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/TreeNav/TreeNav.context.ts","../src/components/TreeNav/tree-store.ts","../src/components/TreeNav/TreeNode.tsx","../src/components/TreeNav/TreeNav.tsx"],"names":["createContext","useContext","useRef","useCallback","jsx"],"mappings":"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","file":"chunk-OYDJVGFS.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { TreeNavContextValue } from \"./TreeNav.types\";\n\nexport const TreeNavContext = createContext<TreeNavContextValue | null>(null);\n\nexport function useTreeNav(): TreeNavContextValue {\n const ctx = useContext(TreeNavContext);\n if (!ctx) {\n throw new Error(\"useTreeNav must be used within a <TreeNav> component\");\n }\n return ctx;\n}\n","import { createContext, useContext, useSyncExternalStore } from \"react\";\nimport type { DragState, DropPosition, TreeNodeData } from \"./TreeNav.types\";\n\n/** What changes as someone clicks, toggles and drags — the state rows subscribe to. */\nexport interface TreeState {\n selectedId?: string;\n expanded: ReadonlySet<string>;\n dragState: DragState;\n}\n\nexport interface TreeStore {\n get(): TreeState;\n set(next: TreeState): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createTreeStore(initial: TreeState): TreeStore {\n let state = initial;\n const listeners = new Set<() => void>();\n return {\n get: () => state,\n set(next) {\n state = next;\n for (const listener of listeners) listener();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\n/**\n * Everything a row needs that does NOT change on a click. Handlers are stable\n * (they read the latest props and state when called), so this value only changes\n * when the tree's data or configuration does.\n *\n * Kept apart from the public `TreeNavContext` on purpose: that one still carries\n * live `selectedId` / `expandedIds` for `useTreeNav()` callers, and any component\n * reading it re-renders on every click. Rows no longer read it — which is the\n * whole fix: a click used to re-render every row in the tree.\n */\nexport interface TreeInternals {\n store: TreeStore;\n nodes: TreeNodeData[];\n select: (node: TreeNodeData) => void;\n toggle: (id: string) => void;\n expandNode: (id: string) => void;\n setDragState: (state: DragState) => void;\n contextMenu?: (e: React.MouseEvent, node: TreeNodeData) => void;\n moveNode?: (sourceId: string, targetId: string, position: DropPosition) => void;\n externalDrop?: (event: React.DragEvent, target: TreeNodeData, position: DropPosition) => void;\n indentSize: number;\n showIcons: boolean;\n draggable: boolean;\n dragCursor: \"grab\" | \"none\";\n acceptExternalDrops: boolean;\n /** Rows are rendered flat by a virtual list, so a row never renders its children. */\n flat: boolean;\n}\n\nexport const TreeInternalsContext = createContext<TreeInternals | null>(null);\n\nexport function useTreeInternals(): TreeInternals {\n const internals = useContext(TreeInternalsContext);\n if (!internals) throw new Error(\"TreeNav.Node must be used within a <TreeNav> component\");\n return internals;\n}\n\n/** Subscribe to ONE derived value; the row re-renders only when that value changes. */\nexport function useTreeSlice<T>(select: (state: TreeState) => T): T {\n const { store } = useTreeInternals();\n return useSyncExternalStore(\n store.subscribe,\n () => select(store.get()),\n () => select(store.get()),\n );\n}\n","import { memo, useRef, useEffect, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTreeInternals, useTreeSlice } from \"./tree-store\";\nimport type { TreeNodeProps, TreeNodeData, DropPosition } from \"./TreeNav.types\";\n\nconst EXT_COLORS: Record<string, string> = {\n ts: \"#3178c6\",\n tsx: \"#3178c6\",\n js: \"#f7df1e\",\n jsx: \"#f7df1e\",\n php: \"#777bb4\",\n html: \"#e34c26\",\n htm: \"#e34c26\",\n css: \"#264de4\",\n json: \"#a1a1aa\",\n md: \"#71717a\",\n yaml: \"#cb171e\",\n yml: \"#cb171e\",\n};\n\nfunction FileIcon({ ext }: { ext?: string }) {\n const color = (ext && EXT_COLORS[ext.toLowerCase()]) || \"#71717a\";\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M4 1h5.5L13 4.5V14a1 1 0 01-1 1H4a1 1 0 01-1-1V2a1 1 0 011-1z\" stroke={color} strokeWidth=\"1.2\" />\n <path d=\"M9 1v4h4\" stroke={color} strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FolderIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3.5a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1V5H2.5V3.5z\" fill=\"#fbbf24\" />\n <path d=\"M1 6h13l-1.5 7.5H2.5L1 6z\" fill=\"#fbbf24\" opacity=\"0.7\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1v8a1 1 0 01-1 1H2.5a1 1 0 01-1-1V3z\" fill=\"#fbbf24\" />\n </svg>\n );\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\"shrink-0 transition-transform duration-150\", open && \"rotate-90\")}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction isDescendantOf(\n nodes: TreeNodeData[],\n ancestorId: string,\n targetId: string,\n): boolean {\n function findNode(haystack: TreeNodeData[], id: string): TreeNodeData | undefined {\n for (const n of haystack) {\n if (n.id === id) return n;\n if (n.children) {\n const found = findNode(n.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n function hasDescendant(node: TreeNodeData, id: string): boolean {\n if (!node.children) return false;\n for (const child of node.children) {\n if (child.id === id) return true;\n if (hasDescendant(child, id)) return true;\n }\n return false;\n }\n\n const ancestor = findNode(nodes, ancestorId);\n return ancestor ? hasDescendant(ancestor, targetId) : false;\n}\n\nfunction computeDropPosition(\n e: React.DragEvent,\n isFolder: boolean,\n): DropPosition {\n const rect = e.currentTarget.getBoundingClientRect();\n const offsetY = e.clientY - rect.top;\n const third = rect.height / 3;\n\n if (offsetY < third) return \"before\";\n if (offsetY > third * 2) return \"after\";\n return isFolder ? \"inside\" : \"after\";\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n\n/**\n * One row (and, when nested, its expanded children).\n *\n * Reads what changes on a click — selection, expansion, drag — as per-row slices\n * of a store, so a click re-renders only the rows whose slice changed. It used to\n * read one context holding all of it, so every click re-rendered every row:\n * 175-267 ms per click on a 5,000-node tree. `memo` keeps a parent's re-render\n * from reaching rows whose `node` and `depth` did not change.\n */\nfunction TreeNodeImpl({ node, depth }: TreeNodeProps) {\n const {\n store, nodes, select, toggle, expandNode, setDragState, contextMenu, moveNode, externalDrop,\n indentSize, showIcons, draggable, dragCursor, acceptExternalDrops, flat,\n } = useTreeInternals();\n\n const isFolder = node.type === \"folder\" || (node.children && node.children.length > 0);\n const isExpanded = useTreeSlice((s) => s.expanded.has(node.id));\n const isSelected = useTreeSlice((s) => s.selectedId === node.id);\n const isDragging = useTreeSlice((s) => s.dragState.draggedNodeId === node.id);\n const dropPosition = useTreeSlice((s) =>\n s.dragState.dropTargetId === node.id ? s.dragState.dropPosition : null,\n );\n const isDropTarget = dropPosition !== null;\n const paddingLeft = depth * indentSize + 4;\n\n // Auto-expand timer for folders during drag\n const autoExpandTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearAutoExpand = useCallback(() => {\n if (autoExpandTimer.current) {\n clearTimeout(autoExpandTimer.current);\n autoExpandTimer.current = null;\n }\n }, []);\n\n useEffect(() => clearAutoExpand, [clearAutoExpand]);\n\n // ---------------------------------------------------------------------------\n // Click handlers\n // ---------------------------------------------------------------------------\n\n const handleClick = () => {\n if (node.disabled) return;\n if (isFolder) {\n toggle(node.id);\n }\n select(node);\n };\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (contextMenu) {\n e.preventDefault();\n contextMenu(e, node);\n }\n };\n\n // ---------------------------------------------------------------------------\n // Drag source handlers\n // ---------------------------------------------------------------------------\n\n const handleDragStart = useCallback((e: React.DragEvent) => {\n e.dataTransfer.setData(\"text/plain\", node.id);\n e.dataTransfer.effectAllowed = \"move\";\n // Set state async so the browser captures the element for the drag ghost first\n requestAnimationFrame(() => {\n setDragState({ draggedNodeId: node.id, dropTargetId: null, dropPosition: null });\n });\n }, [node.id, setDragState]);\n\n const handleDragEnd = useCallback(() => {\n clearAutoExpand();\n setDragState({ draggedNodeId: null, dropTargetId: null, dropPosition: null });\n }, [clearAutoExpand, setDragState]);\n\n // ---------------------------------------------------------------------------\n // Drop target handlers (on outer div). Drag state is read from the store when\n // the event fires, so a row does not re-render as a drag moves elsewhere.\n // ---------------------------------------------------------------------------\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n const { dragState } = store.get();\n const isExternalDrag = !dragState.draggedNodeId;\n if (isExternalDrag) {\n // External drop accepted only when host opted in.\n if (!acceptExternalDrops) return;\n } else {\n const sourceId = dragState.draggedNodeId!;\n if (sourceId === node.id) return;\n if (isDescendantOf(nodes, sourceId, node.id)) return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = isExternalDrag ? \"copy\" : \"move\";\n\n const position = computeDropPosition(e, !!isFolder);\n\n // Auto-expand collapsed folders when hovering \"inside\"\n if (isFolder && !store.get().expanded.has(node.id) && position === \"inside\") {\n if (!autoExpandTimer.current) {\n autoExpandTimer.current = setTimeout(() => {\n expandNode(node.id);\n autoExpandTimer.current = null;\n }, 500);\n }\n } else {\n clearAutoExpand();\n }\n\n if (dragState.dropTargetId !== node.id || dragState.dropPosition !== position) {\n setDragState({ draggedNodeId: dragState.draggedNodeId, dropTargetId: node.id, dropPosition: position });\n }\n }, [store, acceptExternalDrops, node.id, isFolder, nodes, setDragState, expandNode, clearAutoExpand]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n clearAutoExpand();\n const { dragState } = store.get();\n if (dragState.dropTargetId === node.id) {\n setDragState({ ...dragState, dropTargetId: null, dropPosition: null });\n }\n }\n }, [store, node.id, setDragState, clearAutoExpand]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n clearAutoExpand();\n\n const { dragState } = store.get();\n const sourceId = dragState.draggedNodeId;\n const position = dragState.dropPosition ?? computeDropPosition(e, !!isFolder);\n\n if (sourceId) {\n // Internal node move.\n if (sourceId === node.id) return;\n if (isDescendantOf(nodes, sourceId, node.id)) return;\n moveNode?.(sourceId, node.id, position);\n } else if (acceptExternalDrops) {\n // External drop — files, items from other components, etc.\n externalDrop?.(e, node, position);\n }\n\n setDragState({ draggedNodeId: null, dropTargetId: null, dropPosition: null });\n }, [store, node, isFolder, nodes, moveNode, acceptExternalDrops, externalDrop, setDragState, clearAutoExpand]);\n\n // ---------------------------------------------------------------------------\n // Render\n // ---------------------------------------------------------------------------\n\n const canDrag = draggable && !node.disabled;\n const dropEnabled = draggable || acceptExternalDrops;\n\n return (\n <div\n data-react-fancy-tree-node=\"\"\n onDragOver={dropEnabled ? handleDragOver : undefined}\n onDragLeave={dropEnabled ? handleDragLeave : undefined}\n onDrop={dropEnabled ? handleDrop : undefined}\n >\n {/* Before drop indicator */}\n {isDropTarget && dropPosition === \"before\" && (\n <div\n data-react-fancy-tree-drop-indicator=\"before\"\n className=\"pointer-events-none h-0.5 rounded-full bg-blue-500\"\n style={{ marginLeft: paddingLeft }}\n />\n )}\n\n <button\n type=\"button\"\n draggable={canDrag}\n onDragStart={canDrag ? handleDragStart : undefined}\n onDragEnd={canDrag ? handleDragEnd : undefined}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n disabled={node.disabled}\n className={cn(\n \"flex w-full items-center gap-1 rounded-md py-0.5 text-left text-[13px] transition-colors\",\n isSelected\n ? \"bg-blue-500/15 text-blue-600 dark:text-blue-400\"\n : \"text-[color:var(--fancy-text-soft,var(--color-zinc-700))] hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n node.disabled && \"pointer-events-none opacity-40\",\n isDragging && \"opacity-50\",\n // Grab affordance. By default (`dragCursor=\"none\"`) the row keeps its\n // normal click cursor on hover — no open-hand \"move me\" cursor before\n // any drag — and only shows the closed-hand `grabbing` cursor while a\n // drag is actually underway (mousedown/drag). `dragCursor=\"grab\"` opts\n // back into the always-on grab cursor for whole-row drag handles (#14).\n canDrag &&\n (dragCursor === \"grab\" ? \"cursor-grab active:cursor-grabbing\" : \"active:cursor-grabbing\"),\n isDropTarget && dropPosition === \"inside\" && \"bg-blue-500/10 ring-1 ring-blue-500/30 ring-inset\",\n )}\n style={{ paddingLeft }}\n >\n {isFolder && <ChevronIcon open={isExpanded} />}\n {!isFolder && <span className=\"w-3.5 shrink-0\" />}\n {showIcons && (\n node.icon ?? (isFolder\n ? <FolderIcon open={isExpanded} />\n : <FileIcon ext={node.ext ?? node.label.split(\".\").pop()} />)\n )}\n <span className=\"truncate\">{node.label}</span>\n </button>\n\n {/* After drop indicator */}\n {isDropTarget && dropPosition === \"after\" && (\n <div\n data-react-fancy-tree-drop-indicator=\"after\"\n className=\"pointer-events-none h-0.5 rounded-full bg-blue-500\"\n style={{ marginLeft: paddingLeft }}\n />\n )}\n\n {/* A virtual list renders rows flat, so a row never renders its own children there. */}\n {!flat && isFolder && isExpanded && node.children && (\n <div data-react-fancy-tree-node-children=\"\">\n {node.children.map((child) => (\n <TreeNode key={child.id} node={child} depth={depth + 1} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport const TreeNode = memo(TreeNodeImpl);\n\nTreeNode.displayName = \"TreeNode\";\n","import { useMemo, useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { VirtualList } from \"../VirtualList\";\nimport { TreeNavContext } from \"./TreeNav.context\";\nimport { TreeNode } from \"./TreeNode\";\nimport { createTreeStore, TreeInternalsContext, type TreeInternals } from \"./tree-store\";\nimport type { TreeNavProps, TreeNodeData, DragState } from \"./TreeNav.types\";\n\nfunction collectFolderIds(nodes: TreeNodeData[]): string[] {\n const ids: string[] = [];\n for (const node of nodes) {\n if (node.children && node.children.length > 0) {\n ids.push(node.id);\n ids.push(...collectFolderIds(node.children));\n }\n }\n return ids;\n}\n\nconst EMPTY_DRAG_STATE: DragState = {\n draggedNodeId: null,\n dropTargetId: null,\n dropPosition: null,\n};\n\ninterface FlatRow {\n id: string;\n node: TreeNodeData;\n depth: number;\n}\n\n/** The rows currently visible — every node, descending only into expanded folders. */\nfunction flattenVisible(nodes: TreeNodeData[], expanded: ReadonlySet<string>): FlatRow[] {\n const rows: FlatRow[] = [];\n const walk = (list: TreeNodeData[], depth: number) => {\n for (const node of list) {\n rows.push({ id: node.id, node, depth });\n const isFolder = node.type === \"folder\" || (node.children && node.children.length > 0);\n if (isFolder && node.children && expanded.has(node.id)) walk(node.children, depth + 1);\n }\n };\n walk(nodes, 0);\n return rows;\n}\n\nfunction TreeNavRoot({\n nodes,\n selectedId,\n onSelect,\n onNodeContextMenu,\n draggable = false,\n onNodeMove,\n acceptExternalDrops = false,\n onExternalDrop,\n expandedIds: controlledExpanded,\n defaultExpandedIds,\n onExpandedChange,\n defaultExpandAll = false,\n indentSize = 16,\n showIcons = true,\n dragCursor = \"none\",\n virtualize = false,\n height = 400,\n rowHeight = 26,\n className,\n}: TreeNavProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(() => {\n if (defaultExpandedIds) return defaultExpandedIds;\n if (defaultExpandAll) return collectFolderIds(nodes);\n return [];\n });\n\n const isControlled = controlledExpanded !== undefined;\n const expandedIds = isControlled ? controlledExpanded : internalExpanded;\n // One Set per change, so a row's \"am I expanded?\" is a lookup, not a scan.\n const expanded = useMemo(() => new Set(expandedIds), [expandedIds]);\n\n const [dragState, setDragState] = useState<DragState>(EMPTY_DRAG_STATE);\n\n /*\n * The latest props and state, for handlers that must stay STABLE. A handler\n * whose identity changes on every click would change the context rows read,\n * and re-render every row — the exact cost this component is avoiding.\n */\n const latest = useRef({ expandedIds, isControlled, onExpandedChange, onSelect, onNodeContextMenu, onNodeMove, onExternalDrop });\n latest.current = { expandedIds, isControlled, onExpandedChange, onSelect, onNodeContextMenu, onNodeMove, onExternalDrop };\n\n const setExpanded = useCallback((next: string[]) => {\n if (!latest.current.isControlled) setInternalExpanded(next);\n latest.current.onExpandedChange?.(next);\n }, []);\n\n const toggle = useCallback(\n (id: string) => {\n const current = latest.current.expandedIds;\n setExpanded(current.includes(id) ? current.filter((v) => v !== id) : [...current, id]);\n },\n [setExpanded],\n );\n\n const expandNode = useCallback(\n (id: string) => {\n const current = latest.current.expandedIds;\n if (!current.includes(id)) setExpanded([...current, id]);\n },\n [setExpanded],\n );\n\n const select = useCallback((node: TreeNodeData) => latest.current.onSelect?.(node.id, node), []);\n const contextMenu = useCallback(\n (e: React.MouseEvent, node: TreeNodeData) => latest.current.onNodeContextMenu?.(e, node),\n [],\n );\n const moveNode = useCallback(\n (sourceId: string, targetId: string, position: Parameters<NonNullable<TreeNavProps[\"onNodeMove\"]>>[2]) =>\n latest.current.onNodeMove?.(sourceId, targetId, position),\n [],\n );\n const externalDrop = useCallback(\n (event: React.DragEvent, target: TreeNodeData, position: Parameters<NonNullable<TreeNavProps[\"onExternalDrop\"]>>[2]) =>\n latest.current.onExternalDrop?.(event, target, position),\n [],\n );\n\n // What rows subscribe to. Seeded with this render's values so the first paint\n // is right; kept current after each render that changes them.\n const [store] = useState(() => createTreeStore({ selectedId, expanded, dragState }));\n useLayoutEffect(() => {\n const current = store.get();\n if (current.selectedId !== selectedId || current.expanded !== expanded || current.dragState !== dragState) {\n store.set({ selectedId, expanded, dragState });\n }\n }, [store, selectedId, expanded, dragState]);\n\n const hasContextMenu = onNodeContextMenu !== undefined;\n const internals = useMemo<TreeInternals>(\n () => ({\n store,\n nodes,\n select,\n toggle,\n expandNode,\n setDragState,\n // Present only when the host gave one: a row then claims the right-click.\n contextMenu: hasContextMenu ? contextMenu : undefined,\n moveNode,\n externalDrop,\n indentSize,\n showIcons,\n draggable,\n dragCursor,\n acceptExternalDrops,\n flat: virtualize,\n }),\n [store, nodes, select, toggle, expandNode, hasContextMenu, contextMenu, moveNode, externalDrop,\n indentSize, showIcons, draggable, dragCursor, acceptExternalDrops, virtualize],\n );\n\n // Unchanged public context, still live for `useTreeNav()` callers. Rows no\n // longer read it, so its changing on a click re-renders only those callers.\n const ctx = useMemo(\n () => ({\n selectedId, onSelect, onNodeContextMenu, expandedIds, toggle, indentSize, showIcons,\n draggable, dragCursor, dragState, setDragState, onNodeMove, acceptExternalDrops, onExternalDrop, nodes, expandNode,\n }),\n [selectedId, onSelect, onNodeContextMenu, expandedIds, toggle, indentSize, showIcons,\n draggable, dragCursor, dragState, onNodeMove, acceptExternalDrops, onExternalDrop, nodes, expandNode],\n );\n\n const rows = useMemo(\n () => (virtualize ? flattenVisible(nodes, expanded) : []),\n [virtualize, nodes, expanded],\n );\n\n const handleDragEnd = useCallback(() => {\n setDragState(EMPTY_DRAG_STATE);\n }, []);\n\n const dropEnabled = draggable || acceptExternalDrops;\n\n return (\n <TreeNavContext.Provider value={ctx}>\n <TreeInternalsContext.Provider value={internals}>\n <nav\n data-react-fancy-tree-nav=\"\"\n data-react-fancy-tree-nav-virtual={virtualize ? \"\" : undefined}\n className={cn(\"flex flex-col gap-0.5 py-1 text-sm\", className)}\n onDragEnd={dropEnabled ? handleDragEnd : undefined}\n >\n {virtualize ? (\n <VirtualList\n items={rows}\n height={height}\n estimateRowHeight={rowHeight}\n renderRow={(row) => <TreeNode node={row.node} depth={row.depth} />}\n />\n ) : (\n nodes.map((node) => <TreeNode key={node.id} node={node} depth={0} />)\n )}\n </nav>\n </TreeInternalsContext.Provider>\n </TreeNavContext.Provider>\n );\n}\n\nTreeNavRoot.displayName = \"TreeNav\";\n\nexport const TreeNav = Object.assign(TreeNavRoot, {\n Node: TreeNode,\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkYLGTDBB2_cjs = require('./chunk-YLGTDBB2.cjs');
3
+ var chunkO3F6DYWR_cjs = require('./chunk-O3F6DYWR.cjs');
4
4
  var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
@@ -35,23 +35,23 @@ function DisplayValue({
35
35
  onClick: interactive ? onActivate : void 0,
36
36
  onKeyDown,
37
37
  className: chunkZU5Q77OT_cjs.cn(
38
- "flex w-full items-center gap-2 text-zinc-900 dark:text-zinc-100",
39
- chunkYLGTDBB2_cjs.inputSizeClasses[size],
38
+ "flex w-full items-center gap-2 text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
39
+ chunkO3F6DYWR_cjs.inputSizeClasses[size],
40
40
  // Strip the editable box look — keep only the size/padding rhythm.
41
41
  "border-0 bg-transparent px-0",
42
- interactive && "-mx-2 cursor-text rounded-md px-2 outline-none transition-colors hover:bg-zinc-100 focus-visible:ring-2 focus-visible:ring-blue-500/40 dark:hover:bg-zinc-800",
43
- empties && "text-zinc-400 dark:text-zinc-500",
42
+ interactive && "-mx-2 cursor-text rounded-md px-2 outline-none transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] focus-visible:ring-2 focus-visible:ring-blue-500/40 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
43
+ empties && "text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]",
44
44
  className
45
45
  ),
46
46
  children: [
47
- leading && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-zinc-400 dark:text-zinc-500", children: leading }),
47
+ leading && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]", children: leading }),
48
48
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: empties ? empty : children }),
49
- trailing && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-zinc-400 dark:text-zinc-500", children: trailing })
49
+ trailing && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]", children: trailing })
50
50
  ]
51
51
  }
52
52
  );
53
53
  }
54
54
 
55
55
  exports.DisplayValue = DisplayValue;
56
- //# sourceMappingURL=chunk-XKDW6B7X.cjs.map
57
- //# sourceMappingURL=chunk-XKDW6B7X.cjs.map
56
+ //# sourceMappingURL=chunk-P53432AK.cjs.map
57
+ //# sourceMappingURL=chunk-P53432AK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/inputs/mode/DisplayValue.tsx"],"names":["jsxs","cn","inputSizeClasses","jsx"],"mappings":";;;;;;AAsBA,SAAS,QAAQ,KAAA,EAA2B;AAC1C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA;AAC5D;AAgBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAY,WAAA,GACd,CAAC,CAAA,KAAqC;AACpC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,IAAa;AAAA,IACf;AAAA,EACF,CAAA,GACA,MAAA;AAEJ,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAAyB,EAAA;AAAA,MACzB,WAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,KAAA,EAAO,cAAc,eAAA,GAAkB,MAAA;AAAA,MACvC,OAAA,EAAS,cAAc,UAAA,GAAa,MAAA;AAAA,MACpC,SAAA;AAAA,MACA,SAAA,EAAWC,oBAAA;AAAA,QACT,iEAAA;AAAA,QACAC,mCAAiB,IAAI,CAAA;AAAA;AAAA,QAErB,8BAAA;AAAA,QACA,WAAA,IACE,+JAAA;AAAA,QACF,OAAA,IAAW,kCAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAWC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,uCACvE,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,OAAA,GAAU,QAAQ,QAAA,EAAS,CAAA;AAAA,QAC9D,QAAA,oBAAYA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAA,QAAA,EAAS;AAAA;AAAA;AAAA,GAC5E;AAEJ","file":"chunk-XKDW6B7X.cjs","sourcesContent":["import type { KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport type { Size } from \"../../../utils/types\";\nimport { inputSizeClasses } from \"../inputs.utils\";\n\nexport interface DisplayValueProps {\n /** The formatted value to show. Empty / null / undefined renders `empty`. */\n children?: ReactNode;\n size?: Size;\n /** Static adornment rendered before the value (mirrors an input's `leading`/`prefix`). */\n leading?: ReactNode;\n /** Static adornment rendered after the value (mirrors an input's `trailing`/`suffix`). */\n trailing?: ReactNode;\n /** Shown when the value is empty. Default `—`. */\n empty?: ReactNode;\n /** When true the value is clickable to enter edit mode (inline click-to-edit). */\n interactive?: boolean;\n /** Called when an interactive value is activated (click / Enter / Space). */\n onActivate?: () => void;\n className?: string;\n}\n\nfunction isEmpty(value: ReactNode): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\n/**\n * The read-only counterpart to an `<input>`. Renders a non-interactive value\n * with the same size rhythm as the editable control (reusing\n * {@link inputSizeClasses}) but without the border / background / focus ring.\n *\n * When `interactive` (inline click-to-edit), the value becomes a focusable,\n * hoverable target that calls `onActivate` on click / Enter / Space to swap in\n * the real control. Dropped into the SAME `Field` wrapper the editable control\n * uses, so label / description / error chrome stays byte-identical between the\n * display and the editor.\n *\n * Carries `data-react-fancy-display` / `data-mode=\"view\"` stable handles for\n * agents and tests (Human+ contract).\n */\nexport function DisplayValue({\n children,\n size = \"md\",\n leading,\n trailing,\n empty = \"—\",\n interactive,\n onActivate,\n className,\n}: DisplayValueProps) {\n const empties = isEmpty(children);\n\n const onKeyDown = interactive\n ? (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onActivate?.();\n }\n }\n : undefined;\n\n return (\n <div\n data-react-fancy-display=\"\"\n data-mode=\"view\"\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n title={interactive ? \"Click to edit\" : undefined}\n onClick={interactive ? onActivate : undefined}\n onKeyDown={onKeyDown}\n className={cn(\n \"flex w-full items-center gap-2 text-zinc-900 dark:text-zinc-100\",\n inputSizeClasses[size],\n // Strip the editable box look — keep only the size/padding rhythm.\n \"border-0 bg-transparent px-0\",\n interactive &&\n \"-mx-2 cursor-text rounded-md px-2 outline-none transition-colors hover:bg-zinc-100 focus-visible:ring-2 focus-visible:ring-blue-500/40 dark:hover:bg-zinc-800\",\n empties && \"text-zinc-400 dark:text-zinc-500\",\n className,\n )}\n >\n {leading && <span className=\"text-zinc-400 dark:text-zinc-500\">{leading}</span>}\n <span className=\"min-w-0 truncate\">{empties ? empty : children}</span>\n {trailing && <span className=\"text-zinc-400 dark:text-zinc-500\">{trailing}</span>}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/inputs/mode/DisplayValue.tsx"],"names":["jsxs","cn","inputSizeClasses","jsx"],"mappings":";;;;;;AAsBA,SAAS,QAAQ,KAAA,EAA2B;AAC1C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA;AAC5D;AAgBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAY,WAAA,GACd,CAAC,CAAA,KAAqC;AACpC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,IAAa;AAAA,IACf;AAAA,EACF,CAAA,GACA,MAAA;AAEJ,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAAyB,EAAA;AAAA,MACzB,WAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,KAAA,EAAO,cAAc,eAAA,GAAkB,MAAA;AAAA,MACvC,OAAA,EAAS,cAAc,UAAA,GAAa,MAAA;AAAA,MACpC,SAAA;AAAA,MACA,SAAA,EAAWC,oBAAA;AAAA,QACT,oJAAA;AAAA,QACAC,mCAAiB,IAAI,CAAA;AAAA;AAAA,QAErB,8BAAA;AAAA,QACA,WAAA,IACE,oQAAA;AAAA,QACF,OAAA,IAAW,iIAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAWC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iIAAA,EAAmI,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,uCACtK,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,OAAA,GAAU,QAAQ,QAAA,EAAS,CAAA;AAAA,QAC9D,QAAA,oBAAYA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mIAAmI,QAAA,EAAA,QAAA,EAAS;AAAA;AAAA;AAAA,GAC3K;AAEJ","file":"chunk-P53432AK.cjs","sourcesContent":["import type { KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport type { Size } from \"../../../utils/types\";\nimport { inputSizeClasses } from \"../inputs.utils\";\n\nexport interface DisplayValueProps {\n /** The formatted value to show. Empty / null / undefined renders `empty`. */\n children?: ReactNode;\n size?: Size;\n /** Static adornment rendered before the value (mirrors an input's `leading`/`prefix`). */\n leading?: ReactNode;\n /** Static adornment rendered after the value (mirrors an input's `trailing`/`suffix`). */\n trailing?: ReactNode;\n /** Shown when the value is empty. Default `—`. */\n empty?: ReactNode;\n /** When true the value is clickable to enter edit mode (inline click-to-edit). */\n interactive?: boolean;\n /** Called when an interactive value is activated (click / Enter / Space). */\n onActivate?: () => void;\n className?: string;\n}\n\nfunction isEmpty(value: ReactNode): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\n/**\n * The read-only counterpart to an `<input>`. Renders a non-interactive value\n * with the same size rhythm as the editable control (reusing\n * {@link inputSizeClasses}) but without the border / background / focus ring.\n *\n * When `interactive` (inline click-to-edit), the value becomes a focusable,\n * hoverable target that calls `onActivate` on click / Enter / Space to swap in\n * the real control. Dropped into the SAME `Field` wrapper the editable control\n * uses, so label / description / error chrome stays byte-identical between the\n * display and the editor.\n *\n * Carries `data-react-fancy-display` / `data-mode=\"view\"` stable handles for\n * agents and tests (Human+ contract).\n */\nexport function DisplayValue({\n children,\n size = \"md\",\n leading,\n trailing,\n empty = \"—\",\n interactive,\n onActivate,\n className,\n}: DisplayValueProps) {\n const empties = isEmpty(children);\n\n const onKeyDown = interactive\n ? (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onActivate?.();\n }\n }\n : undefined;\n\n return (\n <div\n data-react-fancy-display=\"\"\n data-mode=\"view\"\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n title={interactive ? \"Click to edit\" : undefined}\n onClick={interactive ? onActivate : undefined}\n onKeyDown={onKeyDown}\n className={cn(\n \"flex w-full items-center gap-2 text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n inputSizeClasses[size],\n // Strip the editable box look — keep only the size/padding rhythm.\n \"border-0 bg-transparent px-0\",\n interactive &&\n \"-mx-2 cursor-text rounded-md px-2 outline-none transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] focus-visible:ring-2 focus-visible:ring-blue-500/40 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n empties && \"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\",\n className,\n )}\n >\n {leading && <span className=\"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">{leading}</span>}\n <span className=\"min-w-0 truncate\">{empties ? empty : children}</span>\n {trailing && <span className=\"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">{trailing}</span>}\n </div>\n );\n}\n"]}
@@ -57,7 +57,7 @@ ActivityLight.displayName = "ActivityLight";
57
57
  var LEVEL_CLASS = {
58
58
  live: "text-emerald-500 dark:text-emerald-400",
59
59
  recent: "text-sky-500 dark:text-sky-400",
60
- quiet: "text-zinc-400 dark:text-zinc-500",
60
+ quiet: "text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]",
61
61
  unseen: "text-amber-500 dark:text-amber-400"
62
62
  };
63
63
  var DIRECTION_GLYPH = {
@@ -67,5 +67,5 @@ var DIRECTION_GLYPH = {
67
67
  };
68
68
 
69
69
  exports.ActivityLight = ActivityLight;
70
- //# sourceMappingURL=chunk-WNUU7T62.cjs.map
71
- //# sourceMappingURL=chunk-WNUU7T62.cjs.map
70
+ //# sourceMappingURL=chunk-PBZHLHSA.cjs.map
71
+ //# sourceMappingURL=chunk-PBZHLHSA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ActivityLight/ActivityLight.tsx"],"names":["forwardRef","jsxs","cn","jsx"],"mappings":";;;;;;AAkCO,IAAM,aAAA,GAAgBA,gBAAA;AAAA,EAC3B,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,GAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAEvE,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAE3B,IAAA,MAAM,UAAU,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AAElE,IAAA,uBACEC,eAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,iCAAA,EAAiC,KAAA;AAAA,QAChC,GAAI,SAAA,GAAY,EAAE,2CAAA,EAA6C,SAAA,KAAc,EAAC;AAAA,QAC/E,YAAA,EAAY,OAAA,GAAU,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,QACzE,IAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAWC,oBAAA;AAAA,UACT,6CAAA;AAAA,UACA,YAAY,KAAK,CAAA;AAAA,UACjB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,qCAAA,EAAoC,EAAA;AAAA,cACpC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAWD,oBAAA,CAAG,yCAAA,EAA2C,KAAA,KAAU,UAAU,eAAe;AAAA;AAAA,WAC9F;AAAA,UAEC,SAAA,oBACCC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,uCAAA,EAAsC,EAAA;AAAA,cACtC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAU,wCAAA;AAAA,cAET,0BAAgB,SAAS;AAAA;AAAA,WAC5B;AAAA,UAID,OAAA,oBACCA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,uCAAA,EAAsC,EAAA;AAAA,cACtC,SAAA,EAAU,6CAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AAM5B,IAAM,WAAA,GAA6C;AAAA,EACjD,IAAA,EAAM,wCAAA;AAAA,EACN,MAAA,EAAQ,gCAAA;AAAA,EACR,KAAA,EAAO,kCAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAwBA,IAAM,eAAA,GAAyD;AAAA,EAC7D,EAAA,EAAI,QAAA;AAAA,EACJ,GAAA,EAAK,QAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA","file":"chunk-WNUU7T62.cjs","sourcesContent":["import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ActivityLightProps, ActivityLevel } from \"./ActivityLight.types\";\n\n/**\n * Activity on an **edge** — a relationship between two parties — with a recency\n * ramp and an optional volume.\n *\n * Not a presence dot. `Avatar status` belongs to one party and says whether\n * *they* are online; this belongs to a pair and says when *the link between\n * them* last moved. Use it in a comms column, a collaborator lane, anywhere the\n * subject is the relationship rather than the participant.\n *\n * ## Two kinds of nothing, and they must not look alike\n *\n * - **`level: null`** — the edge is real, its recency is not observable. Renders\n * NOTHING: no dot, no dash, no placeholder. A grey dot would assert \"quiet\",\n * which is a claim we cannot make.\n * - **`count: null`** or omitted — the edge's recency is known but its volume is\n * not. Renders the light with no number.\n * - **`count: 0`** — measured, and none. Renders `0`, because that is a fact.\n * Suppressing it would be indistinguishable from not having looked.\n *\n * The distinction reads as pedantic until a count is wrong in the direction\n * that flatters: a `0` where the truth is \"unknown\" tells the reader an agent\n * works alone, and they believe it.\n *\n * @example\n * ```tsx\n * <ActivityLight level=\"live\" direction=\"both\" count={12} label=\"Genie and Tynn\" />\n * <ActivityLight level=\"quiet\" count={0} label=\"Genie and Weaver\" />\n * <ActivityLight level={null} label=\"Genie and an unknown peer\" />\n * ```\n */\nexport const ActivityLight = forwardRef<HTMLSpanElement, ActivityLightProps>(\n ({ level, direction, count = null, label, className, ...props }, ref) => {\n // The one early return in the component, and the most important line in it.\n if (level === null) return null;\n\n const counted = typeof count === \"number\" && Number.isFinite(count);\n\n return (\n <span\n ref={ref}\n data-react-fancy-activity-light={level}\n {...(direction ? { \"data-react-fancy-activity-light-direction\": direction } : {})}\n aria-label={counted ? `${label}: ${level}, ${count}` : `${label}: ${level}`}\n role=\"img\"\n className={cn(\n \"inline-flex items-center gap-1 align-middle\",\n LEVEL_CLASS[level],\n className,\n )}\n {...props}\n >\n <span\n data-react-fancy-activity-light-dot=\"\"\n aria-hidden=\"true\"\n className={cn(\"size-2 shrink-0 rounded-full bg-current\", level === \"live\" && \"animate-pulse\")}\n />\n\n {direction && (\n <span\n data-react-fancy-activity-light-arrow=\"\"\n aria-hidden=\"true\"\n className=\"font-mono text-[0.625rem] leading-none\"\n >\n {DIRECTION_GLYPH[direction]}\n </span>\n )}\n\n {/* `counted` is the gate, NOT `count` — `0` is falsy and would vanish. */}\n {counted && (\n <span\n data-react-fancy-activity-light-count=\"\"\n className=\"font-mono text-xs tabular-nums leading-none\"\n >\n {count}\n </span>\n )}\n </span>\n );\n },\n);\n\nActivityLight.displayName = \"ActivityLight\";\n\n/**\n * The ramp. Each level is visually distinct from every other — a test asserts\n * that, because two levels that look alike make the ramp a lie.\n */\nconst LEVEL_CLASS: Record<ActivityLevel, string> = {\n live: \"text-emerald-500 dark:text-emerald-400\",\n recent: \"text-sky-500 dark:text-sky-400\",\n quiet: \"text-zinc-400 dark:text-zinc-500\",\n unseen: \"text-amber-500 dark:text-amber-400\",\n};\n\n/**\n * The direction marks, CHOSEN FOR FONT COVERAGE as much as for meaning.\n *\n * `both` was U+21C4 (⇄), which has no coverage in the Liberation fonts — so in\n * a container carrying only those, `in` and `out` drew arrows and `both` drew a\n * tofu box. One of three states failing is worse than all three failing,\n * because the reader cannot tell a font gap from a state: they see two working\n * indicators and one they have no reason to distrust.\n *\n * U+2194 (↔) is in **WGL4**, the repertoire Liberation targets, and that is the\n * line these three sit on — U+2190–2195 are in it, U+21C4 and the whole\n * Dingbats block are not. MEASURED by `claude · tynn` in a Liberation-only\n * container (2026-10-10), rasterising each character and comparing it\n * pixel-for-pixel against a Private Use Area codepoint no font covers: `↔`\n * draws, and U+21C6 `⇆` — the near neighbour, included as a falsifier — does\n * not, which is what makes it evidence of the repertoire rather than of\n * \"Liberation covers arrows\".\n *\n * **So do not \"improve\" `both` back to a prettier arrow.** U+21C4, U+21C6 and\n * the Dingbats (`✓` `✕` `✦`) all need a font many lean images do not ship.\n * A test pins this set.\n */\nconst DIRECTION_GLYPH: Record<\"in\" | \"out\" | \"both\", string> = {\n in: \"←\",\n out: \"→\",\n both: \"↔\",\n};\n"]}
1
+ {"version":3,"sources":["../src/components/ActivityLight/ActivityLight.tsx"],"names":["forwardRef","jsxs","cn","jsx"],"mappings":";;;;;;AAkCO,IAAM,aAAA,GAAgBA,gBAAA;AAAA,EAC3B,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,GAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAEvE,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAE3B,IAAA,MAAM,UAAU,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AAElE,IAAA,uBACEC,eAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,iCAAA,EAAiC,KAAA;AAAA,QAChC,GAAI,SAAA,GAAY,EAAE,2CAAA,EAA6C,SAAA,KAAc,EAAC;AAAA,QAC/E,YAAA,EAAY,OAAA,GAAU,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,QACzE,IAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAWC,oBAAA;AAAA,UACT,6CAAA;AAAA,UACA,YAAY,KAAK,CAAA;AAAA,UACjB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,qCAAA,EAAoC,EAAA;AAAA,cACpC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAWD,oBAAA,CAAG,yCAAA,EAA2C,KAAA,KAAU,UAAU,eAAe;AAAA;AAAA,WAC9F;AAAA,UAEC,SAAA,oBACCC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,uCAAA,EAAsC,EAAA;AAAA,cACtC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAU,wCAAA;AAAA,cAET,0BAAgB,SAAS;AAAA;AAAA,WAC5B;AAAA,UAID,OAAA,oBACCA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,uCAAA,EAAsC,EAAA;AAAA,cACtC,SAAA,EAAU,6CAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AAM5B,IAAM,WAAA,GAA6C;AAAA,EACjD,IAAA,EAAM,wCAAA;AAAA,EACN,MAAA,EAAQ,gCAAA;AAAA,EACR,KAAA,EAAO,iIAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAwBA,IAAM,eAAA,GAAyD;AAAA,EAC7D,EAAA,EAAI,QAAA;AAAA,EACJ,GAAA,EAAK,QAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA","file":"chunk-PBZHLHSA.cjs","sourcesContent":["import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ActivityLightProps, ActivityLevel } from \"./ActivityLight.types\";\n\n/**\n * Activity on an **edge** — a relationship between two parties — with a recency\n * ramp and an optional volume.\n *\n * Not a presence dot. `Avatar status` belongs to one party and says whether\n * *they* are online; this belongs to a pair and says when *the link between\n * them* last moved. Use it in a comms column, a collaborator lane, anywhere the\n * subject is the relationship rather than the participant.\n *\n * ## Two kinds of nothing, and they must not look alike\n *\n * - **`level: null`** — the edge is real, its recency is not observable. Renders\n * NOTHING: no dot, no dash, no placeholder. A grey dot would assert \"quiet\",\n * which is a claim we cannot make.\n * - **`count: null`** or omitted — the edge's recency is known but its volume is\n * not. Renders the light with no number.\n * - **`count: 0`** — measured, and none. Renders `0`, because that is a fact.\n * Suppressing it would be indistinguishable from not having looked.\n *\n * The distinction reads as pedantic until a count is wrong in the direction\n * that flatters: a `0` where the truth is \"unknown\" tells the reader an agent\n * works alone, and they believe it.\n *\n * @example\n * ```tsx\n * <ActivityLight level=\"live\" direction=\"both\" count={12} label=\"Genie and Tynn\" />\n * <ActivityLight level=\"quiet\" count={0} label=\"Genie and Weaver\" />\n * <ActivityLight level={null} label=\"Genie and an unknown peer\" />\n * ```\n */\nexport const ActivityLight = forwardRef<HTMLSpanElement, ActivityLightProps>(\n ({ level, direction, count = null, label, className, ...props }, ref) => {\n // The one early return in the component, and the most important line in it.\n if (level === null) return null;\n\n const counted = typeof count === \"number\" && Number.isFinite(count);\n\n return (\n <span\n ref={ref}\n data-react-fancy-activity-light={level}\n {...(direction ? { \"data-react-fancy-activity-light-direction\": direction } : {})}\n aria-label={counted ? `${label}: ${level}, ${count}` : `${label}: ${level}`}\n role=\"img\"\n className={cn(\n \"inline-flex items-center gap-1 align-middle\",\n LEVEL_CLASS[level],\n className,\n )}\n {...props}\n >\n <span\n data-react-fancy-activity-light-dot=\"\"\n aria-hidden=\"true\"\n className={cn(\"size-2 shrink-0 rounded-full bg-current\", level === \"live\" && \"animate-pulse\")}\n />\n\n {direction && (\n <span\n data-react-fancy-activity-light-arrow=\"\"\n aria-hidden=\"true\"\n className=\"font-mono text-[0.625rem] leading-none\"\n >\n {DIRECTION_GLYPH[direction]}\n </span>\n )}\n\n {/* `counted` is the gate, NOT `count` — `0` is falsy and would vanish. */}\n {counted && (\n <span\n data-react-fancy-activity-light-count=\"\"\n className=\"font-mono text-xs tabular-nums leading-none\"\n >\n {count}\n </span>\n )}\n </span>\n );\n },\n);\n\nActivityLight.displayName = \"ActivityLight\";\n\n/**\n * The ramp. Each level is visually distinct from every other — a test asserts\n * that, because two levels that look alike make the ramp a lie.\n */\nconst LEVEL_CLASS: Record<ActivityLevel, string> = {\n live: \"text-emerald-500 dark:text-emerald-400\",\n recent: \"text-sky-500 dark:text-sky-400\",\n quiet: \"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\",\n unseen: \"text-amber-500 dark:text-amber-400\",\n};\n\n/**\n * The direction marks, CHOSEN FOR FONT COVERAGE as much as for meaning.\n *\n * `both` was U+21C4 (⇄), which has no coverage in the Liberation fonts — so in\n * a container carrying only those, `in` and `out` drew arrows and `both` drew a\n * tofu box. One of three states failing is worse than all three failing,\n * because the reader cannot tell a font gap from a state: they see two working\n * indicators and one they have no reason to distrust.\n *\n * U+2194 (↔) is in **WGL4**, the repertoire Liberation targets, and that is the\n * line these three sit on — U+2190–2195 are in it, U+21C4 and the whole\n * Dingbats block are not. MEASURED by `claude · tynn` in a Liberation-only\n * container (2026-10-10), rasterising each character and comparing it\n * pixel-for-pixel against a Private Use Area codepoint no font covers: `↔`\n * draws, and U+21C6 `⇆` — the near neighbour, included as a falsifier — does\n * not, which is what makes it evidence of the repertoire rather than of\n * \"Liberation covers arrows\".\n *\n * **So do not \"improve\" `both` back to a prettier arrow.** U+21C4, U+21C6 and\n * the Dingbats (`✓` `✕` `✦`) all need a font many lean images do not ship.\n * A test pins this set.\n */\nconst DIRECTION_GLYPH: Record<\"in\" | \"out\" | \"both\", string> = {\n in: \"←\",\n out: \"→\",\n both: \"↔\",\n};\n"]}
@@ -102,10 +102,10 @@ function AccordionPanelTrigger({
102
102
  className: chunkZU5Q77OT_cjs.cn(
103
103
  "group relative flex shrink-0 items-center justify-center cursor-pointer",
104
104
  "text-zinc-500 dark:text-zinc-500",
105
- "hover:text-zinc-900 dark:hover:text-zinc-100",
105
+ "hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
106
106
  // Wide hitbox + thin visible line (drawn via ::before).
107
107
  orientation === "horizontal" ? "w-3 self-stretch" : "h-3 self-stretch",
108
- "before:absolute before:bg-zinc-200 dark:before:bg-zinc-700",
108
+ "before:absolute before:bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:before:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]",
109
109
  "before:transition-colors group-hover:before:bg-zinc-400 dark:group-hover:before:bg-zinc-500",
110
110
  orientation === "horizontal" ? "before:top-0 before:bottom-0 before:w-px before:left-1/2 before:-translate-x-1/2" : "before:left-0 before:right-0 before:h-px before:top-1/2 before:-translate-y-1/2",
111
111
  "transition-colors",
@@ -133,9 +133,9 @@ function AccordionPanelTrigger({
133
133
  "data-orientation": orientation,
134
134
  className: chunkZU5Q77OT_cjs.cn(
135
135
  "flex shrink-0 items-center justify-center rounded-md",
136
- "text-zinc-400 dark:text-zinc-500",
137
- "hover:text-zinc-900 dark:hover:text-zinc-100",
138
- "hover:bg-zinc-100 dark:hover:bg-zinc-800",
136
+ "text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]",
137
+ "hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
138
+ "hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
139
139
  "transition-colors cursor-pointer",
140
140
  orientation === "horizontal" ? "h-8 w-6 mx-0.5" : "w-8 h-6 my-0.5",
141
141
  className
@@ -276,5 +276,5 @@ exports.AccordionPanelSection = AccordionPanelSection;
276
276
  exports.AccordionPanelTrigger = AccordionPanelTrigger;
277
277
  exports.useAccordionPanel = useAccordionPanel;
278
278
  exports.useAccordionSection = useAccordionSection;
279
- //# sourceMappingURL=chunk-S5KUYX3Z.cjs.map
280
- //# sourceMappingURL=chunk-S5KUYX3Z.cjs.map
279
+ //# sourceMappingURL=chunk-PCNJJVTF.cjs.map
280
+ //# sourceMappingURL=chunk-PCNJJVTF.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AccordionPanel/AccordionPanel.context.ts","../src/components/AccordionPanel/AccordionPanel.Section.tsx","../src/components/AccordionPanel/AccordionPanel.Trigger.tsx","../src/components/AccordionPanel/AccordionPanel.Content.tsx","../src/components/AccordionPanel/AccordionPanel.tsx"],"names":["createContext","useContext","useEffect","useMemo","jsx","cn","useControllableState","useCallback","useState","useRef"],"mappings":"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","file":"chunk-S5KUYX3Z.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AccordionOrientation } from \"./AccordionPanel.types\";\n\n// ── Panel-level context ─────────────────────────────────────────────────\n\nexport interface AccordionPanelContextValue {\n orientation: AccordionOrientation;\n isOpen: (id: string) => boolean;\n toggle: (id: string) => void;\n open: (id: string) => void;\n close: (id: string) => void;\n /** Ordered list of all section ids registered in this panel */\n sectionIds: string[];\n registerSection: (id: string) => () => void;\n}\n\nexport const AccordionPanelContext =\n createContext<AccordionPanelContextValue | null>(null);\n\nexport function useAccordionPanel(): AccordionPanelContextValue {\n const ctx = useContext(AccordionPanelContext);\n if (!ctx) {\n throw new Error(\n \"AccordionPanel components must be used inside <AccordionPanel>\",\n );\n }\n return ctx;\n}\n\n// ── Section-level context ───────────────────────────────────────────────\n\nexport interface AccordionSectionContextValue {\n id: string;\n open: boolean;\n pinned: boolean;\n orientation: AccordionOrientation;\n toggle: () => void;\n}\n\nexport const AccordionSectionContext =\n createContext<AccordionSectionContextValue | null>(null);\n\nexport function useAccordionSection(): AccordionSectionContextValue {\n const ctx = useContext(AccordionSectionContext);\n if (!ctx) {\n throw new Error(\n \"<AccordionPanel.Trigger> must be rendered inside <AccordionPanel.Section>\",\n );\n }\n return ctx;\n}\n","import { useEffect, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport {\n AccordionSectionContext,\n useAccordionPanel,\n} from \"./AccordionPanel.context\";\nimport type { AccordionPanelSectionProps } from \"./AccordionPanel.types\";\n\n/**\n * One collapsible section inside an AccordionPanel.\n *\n * Compose with `<AccordionPanel.Trigger>` and `<AccordionPanel.Content>`\n * children — Content renders only when open, Trigger always renders and\n * adapts its look by state. Children that are not Trigger/Content are\n * rendered as-is, regardless of state, so static decorations stay put.\n *\n * Pinned sections never collapse and don't need a Trigger.\n */\nexport function AccordionPanelSection({\n id,\n pinned = false,\n className,\n openClassName,\n closedClassName,\n unstyled,\n children,\n}: AccordionPanelSectionProps) {\n const panel = useAccordionPanel();\n const { orientation, isOpen, toggle, registerSection } = panel;\n\n useEffect(() => registerSection(id), [id, registerSection]);\n\n const open = pinned || isOpen(id);\n\n const sectionCtx = useMemo(\n () => ({\n id,\n open,\n pinned,\n orientation,\n toggle: () => toggle(id),\n }),\n [id, open, pinned, orientation, toggle],\n );\n\n return (\n <AccordionSectionContext.Provider value={sectionCtx}>\n <div\n data-react-fancy-accordion-section=\"\"\n data-state={open ? \"open\" : \"closed\"}\n data-pinned={pinned ? \"\" : undefined}\n data-orientation={orientation}\n className={cn(\n \"flex shrink-0\",\n !unstyled && \"items-center gap-1\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n open ? openClassName : closedClassName,\n )}\n >\n {children}\n </div>\n </AccordionSectionContext.Provider>\n );\n}\n\nAccordionPanelSection.displayName = \"AccordionPanelSection\";\n","import { cn } from \"../../utils/cn\";\nimport { useAccordionSection } from \"./AccordionPanel.context\";\nimport type {\n AccordionPanelTriggerProps,\n SectionRenderable,\n SectionRenderState,\n} from \"./AccordionPanel.types\";\n\nfunction renderSlot(slot: SectionRenderable, state: SectionRenderState) {\n return typeof slot === \"function\" ? slot(state) : slot;\n}\n\n/**\n * Trigger for an AccordionPanel.Section.\n *\n * Has two visual roles, picked automatically from section state:\n *\n * - When the section is OPEN: renders as a thin divider on the section's\n * trailing edge. Hovering reveals an inset chevron pointing toward the\n * section so the user knows clicking will collapse it.\n *\n * - When the section is CLOSED: renders as a standalone chevron button\n * in place of the section content. Clicking re-expands the section.\n *\n * Supply `children` (node or render-prop) to fully replace the default\n * rendering. The render-prop receives `{ open, toggle, orientation, id }`.\n */\nexport function AccordionPanelTrigger({\n children,\n className,\n \"aria-label\": ariaLabel,\n}: AccordionPanelTriggerProps) {\n const { id, open, orientation, toggle } = useAccordionSection();\n const state: SectionRenderState = { id, open, orientation, toggle };\n\n // Custom render path — caller is in charge of look & feel.\n if (children !== undefined) {\n return (\n <div\n data-react-fancy-accordion-trigger=\"\"\n data-state={open ? \"open\" : \"closed\"}\n data-orientation={orientation}\n className={className}\n >\n {renderSlot(children, state)}\n </div>\n );\n }\n\n // Default rendering ----------------------------------------------------\n\n if (open) {\n // Trailing-edge divider. The visible line is 1px (rendered via the\n // ::before pseudo-element so it stays narrow); the button's actual\n // hitbox is much wider (w-3 / h-3 = 12px) so users don't have to land\n // pixel-perfect on the line. Hovering the hitbox highlights the line\n // and reveals an inset chevron signalling \"click to collapse\".\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={ariaLabel ?? \"Collapse section\"}\n data-react-fancy-accordion-trigger=\"\"\n data-state=\"open\"\n data-orientation={orientation}\n className={cn(\n \"group relative flex shrink-0 items-center justify-center cursor-pointer\",\n \"text-zinc-500 dark:text-zinc-500\",\n \"hover:text-zinc-900 dark:hover:text-zinc-100\",\n // Wide hitbox + thin visible line (drawn via ::before).\n orientation === \"horizontal\"\n ? \"w-3 self-stretch\"\n : \"h-3 self-stretch\",\n \"before:absolute before:bg-zinc-200 dark:before:bg-zinc-700\",\n \"before:transition-colors group-hover:before:bg-zinc-400 dark:group-hover:before:bg-zinc-500\",\n orientation === \"horizontal\"\n ? \"before:top-0 before:bottom-0 before:w-px before:left-1/2 before:-translate-x-1/2\"\n : \"before:left-0 before:right-0 before:h-px before:top-1/2 before:-translate-y-1/2\",\n \"transition-colors\",\n className,\n )}\n >\n <ChevronIcon\n orientation={orientation}\n purpose=\"collapse\"\n className=\"relative opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n </button>\n );\n }\n\n // Closed: standalone chevron button. Click to re-expand.\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={ariaLabel ?? \"Expand section\"}\n data-react-fancy-accordion-trigger=\"\"\n data-state=\"closed\"\n data-orientation={orientation}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-md\",\n \"text-zinc-400 dark:text-zinc-500\",\n \"hover:text-zinc-900 dark:hover:text-zinc-100\",\n \"hover:bg-zinc-100 dark:hover:bg-zinc-800\",\n \"transition-colors cursor-pointer\",\n orientation === \"horizontal\" ? \"h-8 w-6 mx-0.5\" : \"w-8 h-6 my-0.5\",\n className,\n )}\n >\n <ChevronIcon orientation={orientation} purpose=\"expand\" />\n </button>\n );\n}\n\nAccordionPanelTrigger.displayName = \"AccordionPanelTrigger\";\n\n// ── Internal chevron ────────────────────────────────────────────────────\n\nfunction ChevronIcon({\n orientation,\n purpose,\n className,\n}: {\n orientation: \"horizontal\" | \"vertical\";\n /** \"expand\" → closed section, click to open. \"collapse\" → open section, click to close. */\n purpose: \"expand\" | \"collapse\";\n className?: string;\n}) {\n // For horizontal: both states use a left-pointing chevron (matches the\n // screenshot convention — closed sections show ❮, open dividers reveal\n // a ❮ on hover indicating the section will collapse leftward).\n //\n // For vertical: closed shows down ⌄ (click to expand below); open\n // divider on hover shows up ⌃ (click to collapse upward).\n const transform =\n orientation === \"horizontal\"\n ? \"rotate(180deg)\"\n : purpose === \"expand\"\n ? \"rotate(90deg)\"\n : \"rotate(270deg)\";\n\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transform }}\n className={className}\n aria-hidden=\"true\"\n >\n <polyline points=\"6 4 10 8 6 12\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useAccordionSection } from \"./AccordionPanel.context\";\n\nexport interface AccordionPanelContentProps {\n children: ReactNode;\n className?: string;\n /**\n * Skip the default flex-row/flex-col + items-center + gap classes so the\n * consumer can lay out the open-state content however they want (e.g. a\n * full-height chat panel with header/scroll/input rows). The\n * `data-react-fancy-accordion-content` attribute and conditional render\n * (only when the section is open) are kept.\n */\n unstyled?: boolean;\n}\n\n/**\n * Wrapper for the open-state content of a Section. Renders its children\n * only when the parent Section is open; returns `null` otherwise.\n *\n * Use this so siblings of `<AccordionPanel.Trigger>` inside a section can\n * cleanly toggle in/out of the DOM.\n *\n * The default styling assumes an inline cluster — flex row (horizontal\n * orientation) or column (vertical), centered, with a small gap. For panel\n * use cases where the content needs full-bleed layout (chat panes, canvas\n * surfaces, etc.), pass `unstyled` and supply your own className.\n */\nexport function AccordionPanelContent({\n children,\n className,\n unstyled,\n}: AccordionPanelContentProps) {\n const { open, orientation } = useAccordionSection();\n if (!open) return null;\n\n return (\n <div\n data-react-fancy-accordion-content=\"\"\n data-orientation={orientation}\n className={cn(\n !unstyled && \"flex items-center gap-1\",\n !unstyled && (orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\"),\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nAccordionPanelContent.displayName = \"AccordionPanelContent\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { AccordionPanelContext } from \"./AccordionPanel.context\";\nimport { AccordionPanelSection } from \"./AccordionPanel.Section\";\nimport { AccordionPanelTrigger } from \"./AccordionPanel.Trigger\";\nimport { AccordionPanelContent } from \"./AccordionPanel.Content\";\nimport type { AccordionPanelProps } from \"./AccordionPanel.types\";\n\n/**\n * Horizontal or vertical accordion of collapsible sections.\n *\n * Use the compound parts:\n * <AccordionPanel orientation=\"horizontal\" defaultValue={[\"wishlist\"]}>\n * <AccordionPanel.Section id=\"home\" pinned>\n * <Button icon=\"home\" />\n * </AccordionPanel.Section>\n * <AccordionPanel.Section id=\"wishlist\">\n * <Button icon=\"list\">Wishlist</Button>\n * </AccordionPanel.Section>\n * </AccordionPanel>\n *\n * Each non-pinned section renders a trigger (default chevron-divider) that\n * collapses/expands. Pass a custom `trigger` prop on a Section, or use the\n * exported `AccordionPanel.Trigger` directly to compose your own.\n */\nfunction AccordionPanelRoot({\n orientation = \"horizontal\",\n value: controlledValue,\n defaultValue,\n onValueChange,\n className,\n children,\n}: AccordionPanelProps) {\n const [openIds, setOpenIds] = useControllableState<string[]>(\n controlledValue,\n defaultValue ?? [],\n onValueChange,\n );\n\n const openSet = useMemo(() => new Set(openIds), [openIds]);\n\n const isOpen = useCallback((id: string) => openSet.has(id), [openSet]);\n\n const open = useCallback(\n (id: string) => {\n setOpenIds(openSet.has(id) ? (openIds ?? []) : [...(openIds ?? []), id]);\n },\n [openSet, openIds, setOpenIds],\n );\n\n const close = useCallback(\n (id: string) => {\n setOpenIds((openIds ?? []).filter((x) => x !== id));\n },\n [openIds, setOpenIds],\n );\n\n const toggle = useCallback(\n (id: string) => {\n setOpenIds(\n openSet.has(id)\n ? (openIds ?? []).filter((x) => x !== id)\n : [...(openIds ?? []), id],\n );\n },\n [openSet, openIds, setOpenIds],\n );\n\n // Track section order for downstream consumers (e.g. trigger direction\n // heuristics that need to know neighbors).\n const [sectionIds, setSectionIds] = useState<string[]>([]);\n const orderRef = useRef<string[]>([]);\n\n const registerSection = useCallback((id: string) => {\n if (!orderRef.current.includes(id)) {\n orderRef.current = [...orderRef.current, id];\n setSectionIds(orderRef.current);\n }\n return () => {\n orderRef.current = orderRef.current.filter((x) => x !== id);\n setSectionIds(orderRef.current);\n };\n }, []);\n\n const ctx = useMemo(\n () => ({\n orientation,\n isOpen,\n toggle,\n open,\n close,\n sectionIds,\n registerSection,\n }),\n [orientation, isOpen, toggle, open, close, sectionIds, registerSection],\n );\n\n return (\n <AccordionPanelContext.Provider value={ctx}>\n <div\n data-react-fancy-accordion-panel=\"\"\n data-orientation={orientation}\n className={cn(\n \"inline-flex items-stretch\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPanelContext.Provider>\n );\n}\n\nAccordionPanelRoot.displayName = \"AccordionPanel\";\n\n// ── Compound exports ────────────────────────────────────────────────────\n\ntype AccordionPanelType = typeof AccordionPanelRoot & {\n Section: typeof AccordionPanelSection;\n Trigger: typeof AccordionPanelTrigger;\n Content: typeof AccordionPanelContent;\n};\n\nexport const AccordionPanel = AccordionPanelRoot as AccordionPanelType;\nAccordionPanel.Section = AccordionPanelSection;\nAccordionPanel.Trigger = AccordionPanelTrigger;\nAccordionPanel.Content = AccordionPanelContent;\n"]}
1
+ {"version":3,"sources":["../src/components/AccordionPanel/AccordionPanel.context.ts","../src/components/AccordionPanel/AccordionPanel.Section.tsx","../src/components/AccordionPanel/AccordionPanel.Trigger.tsx","../src/components/AccordionPanel/AccordionPanel.Content.tsx","../src/components/AccordionPanel/AccordionPanel.tsx"],"names":["createContext","useContext","useEffect","useMemo","jsx","cn","useControllableState","useCallback","useState","useRef"],"mappings":"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","file":"chunk-PCNJJVTF.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AccordionOrientation } from \"./AccordionPanel.types\";\n\n// ── Panel-level context ─────────────────────────────────────────────────\n\nexport interface AccordionPanelContextValue {\n orientation: AccordionOrientation;\n isOpen: (id: string) => boolean;\n toggle: (id: string) => void;\n open: (id: string) => void;\n close: (id: string) => void;\n /** Ordered list of all section ids registered in this panel */\n sectionIds: string[];\n registerSection: (id: string) => () => void;\n}\n\nexport const AccordionPanelContext =\n createContext<AccordionPanelContextValue | null>(null);\n\nexport function useAccordionPanel(): AccordionPanelContextValue {\n const ctx = useContext(AccordionPanelContext);\n if (!ctx) {\n throw new Error(\n \"AccordionPanel components must be used inside <AccordionPanel>\",\n );\n }\n return ctx;\n}\n\n// ── Section-level context ───────────────────────────────────────────────\n\nexport interface AccordionSectionContextValue {\n id: string;\n open: boolean;\n pinned: boolean;\n orientation: AccordionOrientation;\n toggle: () => void;\n}\n\nexport const AccordionSectionContext =\n createContext<AccordionSectionContextValue | null>(null);\n\nexport function useAccordionSection(): AccordionSectionContextValue {\n const ctx = useContext(AccordionSectionContext);\n if (!ctx) {\n throw new Error(\n \"<AccordionPanel.Trigger> must be rendered inside <AccordionPanel.Section>\",\n );\n }\n return ctx;\n}\n","import { useEffect, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport {\n AccordionSectionContext,\n useAccordionPanel,\n} from \"./AccordionPanel.context\";\nimport type { AccordionPanelSectionProps } from \"./AccordionPanel.types\";\n\n/**\n * One collapsible section inside an AccordionPanel.\n *\n * Compose with `<AccordionPanel.Trigger>` and `<AccordionPanel.Content>`\n * children — Content renders only when open, Trigger always renders and\n * adapts its look by state. Children that are not Trigger/Content are\n * rendered as-is, regardless of state, so static decorations stay put.\n *\n * Pinned sections never collapse and don't need a Trigger.\n */\nexport function AccordionPanelSection({\n id,\n pinned = false,\n className,\n openClassName,\n closedClassName,\n unstyled,\n children,\n}: AccordionPanelSectionProps) {\n const panel = useAccordionPanel();\n const { orientation, isOpen, toggle, registerSection } = panel;\n\n useEffect(() => registerSection(id), [id, registerSection]);\n\n const open = pinned || isOpen(id);\n\n const sectionCtx = useMemo(\n () => ({\n id,\n open,\n pinned,\n orientation,\n toggle: () => toggle(id),\n }),\n [id, open, pinned, orientation, toggle],\n );\n\n return (\n <AccordionSectionContext.Provider value={sectionCtx}>\n <div\n data-react-fancy-accordion-section=\"\"\n data-state={open ? \"open\" : \"closed\"}\n data-pinned={pinned ? \"\" : undefined}\n data-orientation={orientation}\n className={cn(\n \"flex shrink-0\",\n !unstyled && \"items-center gap-1\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n open ? openClassName : closedClassName,\n )}\n >\n {children}\n </div>\n </AccordionSectionContext.Provider>\n );\n}\n\nAccordionPanelSection.displayName = \"AccordionPanelSection\";\n","import { cn } from \"../../utils/cn\";\nimport { useAccordionSection } from \"./AccordionPanel.context\";\nimport type {\n AccordionPanelTriggerProps,\n SectionRenderable,\n SectionRenderState,\n} from \"./AccordionPanel.types\";\n\nfunction renderSlot(slot: SectionRenderable, state: SectionRenderState) {\n return typeof slot === \"function\" ? slot(state) : slot;\n}\n\n/**\n * Trigger for an AccordionPanel.Section.\n *\n * Has two visual roles, picked automatically from section state:\n *\n * - When the section is OPEN: renders as a thin divider on the section's\n * trailing edge. Hovering reveals an inset chevron pointing toward the\n * section so the user knows clicking will collapse it.\n *\n * - When the section is CLOSED: renders as a standalone chevron button\n * in place of the section content. Clicking re-expands the section.\n *\n * Supply `children` (node or render-prop) to fully replace the default\n * rendering. The render-prop receives `{ open, toggle, orientation, id }`.\n */\nexport function AccordionPanelTrigger({\n children,\n className,\n \"aria-label\": ariaLabel,\n}: AccordionPanelTriggerProps) {\n const { id, open, orientation, toggle } = useAccordionSection();\n const state: SectionRenderState = { id, open, orientation, toggle };\n\n // Custom render path — caller is in charge of look & feel.\n if (children !== undefined) {\n return (\n <div\n data-react-fancy-accordion-trigger=\"\"\n data-state={open ? \"open\" : \"closed\"}\n data-orientation={orientation}\n className={className}\n >\n {renderSlot(children, state)}\n </div>\n );\n }\n\n // Default rendering ----------------------------------------------------\n\n if (open) {\n // Trailing-edge divider. The visible line is 1px (rendered via the\n // ::before pseudo-element so it stays narrow); the button's actual\n // hitbox is much wider (w-3 / h-3 = 12px) so users don't have to land\n // pixel-perfect on the line. Hovering the hitbox highlights the line\n // and reveals an inset chevron signalling \"click to collapse\".\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={ariaLabel ?? \"Collapse section\"}\n data-react-fancy-accordion-trigger=\"\"\n data-state=\"open\"\n data-orientation={orientation}\n className={cn(\n \"group relative flex shrink-0 items-center justify-center cursor-pointer\",\n \"text-zinc-500 dark:text-zinc-500\",\n \"hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n // Wide hitbox + thin visible line (drawn via ::before).\n orientation === \"horizontal\"\n ? \"w-3 self-stretch\"\n : \"h-3 self-stretch\",\n \"before:absolute before:bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:before:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n \"before:transition-colors group-hover:before:bg-zinc-400 dark:group-hover:before:bg-zinc-500\",\n orientation === \"horizontal\"\n ? \"before:top-0 before:bottom-0 before:w-px before:left-1/2 before:-translate-x-1/2\"\n : \"before:left-0 before:right-0 before:h-px before:top-1/2 before:-translate-y-1/2\",\n \"transition-colors\",\n className,\n )}\n >\n <ChevronIcon\n orientation={orientation}\n purpose=\"collapse\"\n className=\"relative opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n </button>\n );\n }\n\n // Closed: standalone chevron button. Click to re-expand.\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={ariaLabel ?? \"Expand section\"}\n data-react-fancy-accordion-trigger=\"\"\n data-state=\"closed\"\n data-orientation={orientation}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-md\",\n \"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\",\n \"hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n \"transition-colors cursor-pointer\",\n orientation === \"horizontal\" ? \"h-8 w-6 mx-0.5\" : \"w-8 h-6 my-0.5\",\n className,\n )}\n >\n <ChevronIcon orientation={orientation} purpose=\"expand\" />\n </button>\n );\n}\n\nAccordionPanelTrigger.displayName = \"AccordionPanelTrigger\";\n\n// ── Internal chevron ────────────────────────────────────────────────────\n\nfunction ChevronIcon({\n orientation,\n purpose,\n className,\n}: {\n orientation: \"horizontal\" | \"vertical\";\n /** \"expand\" → closed section, click to open. \"collapse\" → open section, click to close. */\n purpose: \"expand\" | \"collapse\";\n className?: string;\n}) {\n // For horizontal: both states use a left-pointing chevron (matches the\n // screenshot convention — closed sections show ❮, open dividers reveal\n // a ❮ on hover indicating the section will collapse leftward).\n //\n // For vertical: closed shows down ⌄ (click to expand below); open\n // divider on hover shows up ⌃ (click to collapse upward).\n const transform =\n orientation === \"horizontal\"\n ? \"rotate(180deg)\"\n : purpose === \"expand\"\n ? \"rotate(90deg)\"\n : \"rotate(270deg)\";\n\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transform }}\n className={className}\n aria-hidden=\"true\"\n >\n <polyline points=\"6 4 10 8 6 12\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useAccordionSection } from \"./AccordionPanel.context\";\n\nexport interface AccordionPanelContentProps {\n children: ReactNode;\n className?: string;\n /**\n * Skip the default flex-row/flex-col + items-center + gap classes so the\n * consumer can lay out the open-state content however they want (e.g. a\n * full-height chat panel with header/scroll/input rows). The\n * `data-react-fancy-accordion-content` attribute and conditional render\n * (only when the section is open) are kept.\n */\n unstyled?: boolean;\n}\n\n/**\n * Wrapper for the open-state content of a Section. Renders its children\n * only when the parent Section is open; returns `null` otherwise.\n *\n * Use this so siblings of `<AccordionPanel.Trigger>` inside a section can\n * cleanly toggle in/out of the DOM.\n *\n * The default styling assumes an inline cluster — flex row (horizontal\n * orientation) or column (vertical), centered, with a small gap. For panel\n * use cases where the content needs full-bleed layout (chat panes, canvas\n * surfaces, etc.), pass `unstyled` and supply your own className.\n */\nexport function AccordionPanelContent({\n children,\n className,\n unstyled,\n}: AccordionPanelContentProps) {\n const { open, orientation } = useAccordionSection();\n if (!open) return null;\n\n return (\n <div\n data-react-fancy-accordion-content=\"\"\n data-orientation={orientation}\n className={cn(\n !unstyled && \"flex items-center gap-1\",\n !unstyled && (orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\"),\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nAccordionPanelContent.displayName = \"AccordionPanelContent\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { AccordionPanelContext } from \"./AccordionPanel.context\";\nimport { AccordionPanelSection } from \"./AccordionPanel.Section\";\nimport { AccordionPanelTrigger } from \"./AccordionPanel.Trigger\";\nimport { AccordionPanelContent } from \"./AccordionPanel.Content\";\nimport type { AccordionPanelProps } from \"./AccordionPanel.types\";\n\n/**\n * Horizontal or vertical accordion of collapsible sections.\n *\n * Use the compound parts:\n * <AccordionPanel orientation=\"horizontal\" defaultValue={[\"wishlist\"]}>\n * <AccordionPanel.Section id=\"home\" pinned>\n * <Button icon=\"home\" />\n * </AccordionPanel.Section>\n * <AccordionPanel.Section id=\"wishlist\">\n * <Button icon=\"list\">Wishlist</Button>\n * </AccordionPanel.Section>\n * </AccordionPanel>\n *\n * Each non-pinned section renders a trigger (default chevron-divider) that\n * collapses/expands. Pass a custom `trigger` prop on a Section, or use the\n * exported `AccordionPanel.Trigger` directly to compose your own.\n */\nfunction AccordionPanelRoot({\n orientation = \"horizontal\",\n value: controlledValue,\n defaultValue,\n onValueChange,\n className,\n children,\n}: AccordionPanelProps) {\n const [openIds, setOpenIds] = useControllableState<string[]>(\n controlledValue,\n defaultValue ?? [],\n onValueChange,\n );\n\n const openSet = useMemo(() => new Set(openIds), [openIds]);\n\n const isOpen = useCallback((id: string) => openSet.has(id), [openSet]);\n\n const open = useCallback(\n (id: string) => {\n setOpenIds(openSet.has(id) ? (openIds ?? []) : [...(openIds ?? []), id]);\n },\n [openSet, openIds, setOpenIds],\n );\n\n const close = useCallback(\n (id: string) => {\n setOpenIds((openIds ?? []).filter((x) => x !== id));\n },\n [openIds, setOpenIds],\n );\n\n const toggle = useCallback(\n (id: string) => {\n setOpenIds(\n openSet.has(id)\n ? (openIds ?? []).filter((x) => x !== id)\n : [...(openIds ?? []), id],\n );\n },\n [openSet, openIds, setOpenIds],\n );\n\n // Track section order for downstream consumers (e.g. trigger direction\n // heuristics that need to know neighbors).\n const [sectionIds, setSectionIds] = useState<string[]>([]);\n const orderRef = useRef<string[]>([]);\n\n const registerSection = useCallback((id: string) => {\n if (!orderRef.current.includes(id)) {\n orderRef.current = [...orderRef.current, id];\n setSectionIds(orderRef.current);\n }\n return () => {\n orderRef.current = orderRef.current.filter((x) => x !== id);\n setSectionIds(orderRef.current);\n };\n }, []);\n\n const ctx = useMemo(\n () => ({\n orientation,\n isOpen,\n toggle,\n open,\n close,\n sectionIds,\n registerSection,\n }),\n [orientation, isOpen, toggle, open, close, sectionIds, registerSection],\n );\n\n return (\n <AccordionPanelContext.Provider value={ctx}>\n <div\n data-react-fancy-accordion-panel=\"\"\n data-orientation={orientation}\n className={cn(\n \"inline-flex items-stretch\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPanelContext.Provider>\n );\n}\n\nAccordionPanelRoot.displayName = \"AccordionPanel\";\n\n// ── Compound exports ────────────────────────────────────────────────────\n\ntype AccordionPanelType = typeof AccordionPanelRoot & {\n Section: typeof AccordionPanelSection;\n Trigger: typeof AccordionPanelTrigger;\n Content: typeof AccordionPanelContent;\n};\n\nexport const AccordionPanel = AccordionPanelRoot as AccordionPanelType;\nAccordionPanel.Section = AccordionPanelSection;\nAccordionPanel.Trigger = AccordionPanelTrigger;\nAccordionPanel.Content = AccordionPanelContent;\n"]}
@@ -14,7 +14,7 @@ var KanbanColumnContext = createContext("");
14
14
  function useKanbanColumn() {
15
15
  return useContext(KanbanColumnContext);
16
16
  }
17
- var DEFAULT_CARD_CLASSES = "rounded-lg border border-zinc-200 bg-white p-3 shadow-sm transition-shadow hover:shadow-md dark:border-zinc-700 dark:bg-zinc-900";
17
+ var DEFAULT_CARD_CLASSES = "rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] p-3 shadow-sm transition-shadow hover:shadow-md dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]";
18
18
  function KanbanCard({ children, id, className, unstyled }) {
19
19
  const { setDraggedCard, setDragSource } = useKanban();
20
20
  const columnId = useKanbanColumn();
@@ -200,7 +200,7 @@ function KanbanColumn({
200
200
  {
201
201
  className: cn(
202
202
  "rounded-full px-1.5 py-0.5 text-[10px] font-semibold",
203
- overWip ? "bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300" : "bg-zinc-200 text-zinc-700 dark:bg-zinc-700 dark:text-zinc-300"
203
+ overWip ? "bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300" : "bg-[color:var(--fancy-border,var(--color-zinc-200))] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
204
204
  ),
205
205
  children: [
206
206
  cardCount,
@@ -357,5 +357,5 @@ var Kanban = Object.assign(KanbanRoot, {
357
357
  });
358
358
 
359
359
  export { Kanban, useKanban };
360
- //# sourceMappingURL=chunk-O6E2WC3J.js.map
361
- //# sourceMappingURL=chunk-O6E2WC3J.js.map
360
+ //# sourceMappingURL=chunk-PRP5N7NY.js.map
361
+ //# sourceMappingURL=chunk-PRP5N7NY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Kanban/Kanban.context.ts","../src/components/Kanban/KanbanCard.tsx","../src/components/Kanban/KanbanColumn.tsx","../src/components/Kanban/KanbanColumnHandle.tsx","../src/components/Kanban/Kanban.tsx"],"names":["useCallback","jsx","useState","useRef"],"mappings":"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","file":"chunk-PRP5N7NY.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { KanbanContextValue } from \"./Kanban.types\";\n\nexport const KanbanContext = createContext<KanbanContextValue | null>(null);\n\nexport function useKanban(): KanbanContextValue {\n const ctx = useContext(KanbanContext);\n if (!ctx) {\n throw new Error(\"Kanban compound components must be used within <Kanban>\");\n }\n return ctx;\n}\n\nexport const KanbanColumnContext = createContext<string>(\"\");\n\nexport function useKanbanColumn(): string {\n return useContext(KanbanColumnContext);\n}\n","import { useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useKanban, useKanbanColumn } from \"./Kanban.context\";\nimport type { KanbanCardProps } from \"./Kanban.types\";\n\nconst DEFAULT_CARD_CLASSES =\n \"rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] p-3 shadow-sm transition-shadow hover:shadow-md dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\n\nexport function KanbanCard({ children, id, className, unstyled }: KanbanCardProps) {\n const { setDraggedCard, setDragSource } = useKanban();\n const columnId = useKanbanColumn();\n\n const handleDragStart = useCallback(() => {\n setDraggedCard(id);\n setDragSource(columnId);\n }, [id, columnId, setDraggedCard, setDragSource]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedCard(null);\n setDragSource(null);\n }, [setDraggedCard, setDragSource]);\n\n return (\n <div\n data-react-fancy-kanban-card=\"\"\n draggable\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n className={cn(\n // Drag affordance — kept even when unstyled so users still see grab cursors.\n \"cursor-grab active:cursor-grabbing\",\n !unstyled && DEFAULT_CARD_CLASSES,\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nKanbanCard.displayName = \"KanbanCard\";\n","import { Children, isValidElement, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { KanbanCard } from \"./KanbanCard\";\nimport { useKanban, KanbanColumnContext } from \"./Kanban.context\";\nimport type { KanbanColumnProps } from \"./Kanban.types\";\n\nconst DEFAULT_COLUMN_CLASSES =\n \"min-h-[200px] w-72 rounded-xl bg-zinc-50 p-3 dark:bg-zinc-800/50\";\n\n/**\n * Deep-recurse through the children tree counting Kanban.Card descendants\n * regardless of wrapping (Fragment, ContextMenu, motion.div, custom HOCs,\n * etc.). Used by `hideWhenEmpty` and the WIP-limit count chip.\n */\nfunction countCardChildren(children: React.ReactNode): number {\n let n = 0;\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n if (child.type === KanbanCard) {\n n += 1;\n return;\n }\n const inner = (child.props as { children?: React.ReactNode }).children;\n if (inner !== undefined) n += countCardChildren(inner);\n });\n return n;\n}\n\n/**\n * Find the document-order index of a Kanban.Card with the given id, deep-\n * recursing through wrappers. Used by same-column reorder to compute the\n * post-removal insert position.\n */\nfunction findCardIndex(children: React.ReactNode, cardId: string): number {\n let idx = -1;\n let i = 0;\n function walk(nodes: React.ReactNode): void {\n Children.forEach(nodes, (child) => {\n if (idx !== -1) return;\n if (!isValidElement(child)) return;\n if (child.type === KanbanCard) {\n if ((child.props as { id?: string }).id === cardId) idx = i;\n i += 1;\n return;\n }\n const inner = (child.props as { children?: React.ReactNode }).children;\n if (inner !== undefined) walk(inner);\n });\n }\n walk(children);\n return idx;\n}\n\nexport function KanbanColumn({\n children,\n id,\n title,\n className,\n unstyled,\n wipLimit,\n hideWhenEmpty,\n}: KanbanColumnProps) {\n const { onCardMove, draggedCard, dragSource, registerColumn } = useKanban();\n const [dragOver, setDragOver] = useState(false);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [dropY, setDropY] = useState<number | null>(null);\n const cardsRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => registerColumn(id), [id, registerColumn]);\n\n /**\n * Compute drop position from mouse Y. Walks the *DOM* (not the React\n * tree) and queries `[data-react-fancy-kanban-card]` so wrappers\n * (ContextMenu, custom Card surfaces, motion.div) don't break the\n * indicator placement.\n */\n const updateDrop = useCallback((clientY: number) => {\n const container = cardsRef.current;\n if (!container) {\n setDropIndex(null);\n setDropY(null);\n return;\n }\n\n // Limit to cards belonging to THIS column — important if a card\n // happens to nest a sub-board (rare, but cheap to defend).\n const all = Array.from(\n container.querySelectorAll<HTMLElement>(\n \"[data-react-fancy-kanban-card]\",\n ),\n );\n const cards = all.filter(\n (el) =>\n el.closest(\"[data-react-fancy-kanban-column]\") ===\n cardsRef.current?.closest(\"[data-react-fancy-kanban-column]\"),\n );\n\n const containerRect = container.getBoundingClientRect();\n\n if (cards.length === 0) {\n setDropIndex(0);\n setDropY(0);\n return;\n }\n\n let idx = cards.length;\n let yRel = 0;\n for (let i = 0; i < cards.length; i++) {\n const rect = cards[i]!.getBoundingClientRect();\n if (clientY < rect.top + rect.height / 2) {\n idx = i;\n yRel = rect.top - containerRect.top;\n break;\n }\n }\n if (idx === cards.length) {\n const last = cards[cards.length - 1]!.getBoundingClientRect();\n yRel = last.bottom - containerRect.top;\n }\n\n setDropIndex(idx);\n setDropY(yRel);\n }, []);\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n // Only react to card drags. Column drags are handled by the root.\n if (!draggedCard) return;\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n updateDrop(e.clientY);\n },\n [draggedCard, updateDrop],\n );\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n if (e.currentTarget.contains(e.relatedTarget as Node | null)) return;\n setDragOver(false);\n setDropIndex(null);\n setDropY(null);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n if (!draggedCard) return;\n e.preventDefault();\n e.stopPropagation();\n const target = dropIndex ?? 0;\n\n if (dragSource) {\n let finalIdx = target;\n if (dragSource === id) {\n const srcIdx = findCardIndex(children, draggedCard);\n if (srcIdx !== -1 && target > srcIdx) finalIdx = target - 1;\n if (srcIdx === finalIdx) {\n // No-op\n setDragOver(false);\n setDropIndex(null);\n setDropY(null);\n return;\n }\n }\n onCardMove?.(draggedCard, dragSource, id, finalIdx);\n }\n\n setDragOver(false);\n setDropIndex(null);\n setDropY(null);\n },\n [draggedCard, dragSource, dropIndex, id, onCardMove, children],\n );\n\n const cardCount = countCardChildren(children);\n if (hideWhenEmpty && cardCount === 0 && !draggedCard) return null;\n\n const showIndicator =\n draggedCard !== null &&\n dropIndex !== null &&\n dropY !== null &&\n dragOver;\n\n const overWip = wipLimit !== undefined && cardCount > wipLimit;\n\n return (\n <KanbanColumnContext.Provider value={id}>\n <div\n data-react-fancy-kanban-column=\"\"\n data-column-id={id}\n role=\"group\"\n aria-label={title}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n \"flex flex-col\",\n !unstyled && DEFAULT_COLUMN_CLASSES,\n dragOver && \"ring-2 ring-blue-400 ring-inset\",\n className,\n )}\n >\n {title && (\n <h3 className=\"mb-3 flex items-center gap-2 text-sm font-semibold text-zinc-600 dark:text-zinc-400\">\n <span className=\"flex-1\">{title}</span>\n <span\n className={cn(\n \"rounded-full px-1.5 py-0.5 text-[10px] font-semibold\",\n overWip\n ? \"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300\"\n : \"bg-[color:var(--fancy-border,var(--color-zinc-200))] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n )}\n >\n {cardCount}\n {wipLimit !== undefined ? `/${wipLimit}` : \"\"}\n </span>\n </h3>\n )}\n\n {/* Cards container — `relative` so the drop indicator overlay\n can position itself in the container's coordinate space.\n Children are rendered untouched so any wrapper hierarchy\n (ContextMenu, motion.div, etc.) keeps working. */}\n <div ref={cardsRef} className=\"relative flex flex-1 flex-col gap-2\">\n {children}\n\n {showIndicator && (\n <div\n data-react-fancy-kanban-drop-indicator=\"\"\n style={{ top: dropY }}\n className=\"pointer-events-none absolute left-0 right-0 h-0.5 -translate-y-1/2 rounded-full bg-blue-500/80 shadow-[0_0_0_3px_rgba(59,130,246,0.15)]\"\n />\n )}\n </div>\n </div>\n </KanbanColumnContext.Provider>\n );\n}\n\nKanbanColumn.displayName = \"KanbanColumn\";\n","import { useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useKanban, useKanbanColumn } from \"./Kanban.context\";\nimport type { KanbanColumnHandleProps } from \"./Kanban.types\";\n\n/**\n * Drag handle for column reordering.\n *\n * Mount inside a `Kanban.Column` to make that column draggable. The\n * column's parent `Kanban` listens for the drop and surfaces the new\n * position via `onColumnMove`. Without a handle, columns are static.\n *\n * Typically wrapped around the column header so users grab the title\n * to reorder; can also be a small grip icon.\n */\nexport function KanbanColumnHandle({\n children,\n className,\n}: KanbanColumnHandleProps) {\n const { setDraggedColumn } = useKanban();\n const columnId = useKanbanColumn();\n\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n // Set a dataTransfer payload so the browser permits the drag — some\n // browsers refuse if dataTransfer is empty.\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", columnId);\n e.stopPropagation();\n setDraggedColumn(columnId);\n },\n [columnId, setDraggedColumn],\n );\n\n const handleDragEnd = useCallback(() => {\n setDraggedColumn(null);\n }, [setDraggedColumn]);\n\n return (\n <div\n draggable\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n data-react-fancy-kanban-column-handle=\"\"\n className={cn(\n \"cursor-grab active:cursor-grabbing select-none\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nKanbanColumnHandle.displayName = \"KanbanColumnHandle\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { KanbanContext } from \"./Kanban.context\";\nimport { KanbanColumn } from \"./KanbanColumn\";\nimport { KanbanCard } from \"./KanbanCard\";\nimport { KanbanColumnHandle } from \"./KanbanColumnHandle\";\nimport type { KanbanProps } from \"./Kanban.types\";\n\n/**\n * Kanban board.\n *\n * Compound:\n * <Kanban onCardMove={...} onColumnMove={...}>\n * <Kanban.Column id=\"todo\" wipLimit={4}>\n * <Kanban.ColumnHandle>...header...</Kanban.ColumnHandle> // optional\n * <Kanban.Card id=\"...\">...</Kanban.Card>\n * </Kanban.Column>\n * </Kanban>\n *\n * Cards drag between columns AND within a column. Drop position is\n * computed from mouse Y at hover time and surfaced via the `toIndex`\n * argument on `onCardMove`.\n *\n * Columns drag horizontally to reorder when a `<Kanban.ColumnHandle>`\n * is mounted inside them. The root computes the drop index from\n * mouse X and surfaces it via `onColumnMove`.\n */\nfunction KanbanRoot({\n children,\n onCardMove,\n onColumnMove,\n className,\n}: KanbanProps) {\n const [draggedCard, setDraggedCard] = useState<string | null>(null);\n const [dragSource, setDragSource] = useState<string | null>(null);\n const [draggedColumn, setDraggedColumn] = useState<string | null>(null);\n\n const orderRef = useRef<string[]>([]);\n const [columnIds, setColumnIds] = useState<string[]>([]);\n\n const registerColumn = useCallback((id: string) => {\n if (!orderRef.current.includes(id)) {\n orderRef.current = [...orderRef.current, id];\n setColumnIds(orderRef.current);\n }\n return () => {\n orderRef.current = orderRef.current.filter((x) => x !== id);\n setColumnIds(orderRef.current);\n };\n }, []);\n\n const ctx = useMemo(\n () => ({\n draggedCard,\n setDraggedCard,\n dragSource,\n setDragSource,\n draggedColumn,\n setDraggedColumn,\n onCardMove,\n onColumnMove,\n columnIds,\n registerColumn,\n }),\n [\n draggedCard,\n dragSource,\n draggedColumn,\n onCardMove,\n onColumnMove,\n columnIds,\n registerColumn,\n ],\n );\n\n // ── Column-level drop handling ────────────────────────────────────────\n // Root listens only when a column is being dragged. Drop index is\n // computed from mouse X versus each column's horizontal midpoint.\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (!draggedColumn) return;\n e.preventDefault();\n },\n [draggedColumn],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n if (!draggedColumn || !containerRef.current) return;\n e.preventDefault();\n\n const cols = containerRef.current.querySelectorAll<HTMLElement>(\n '[data-react-fancy-kanban-column]',\n );\n const x = e.clientX;\n let dropIdx = cols.length;\n for (let i = 0; i < cols.length; i++) {\n const rect = cols[i]!.getBoundingClientRect();\n if (x < rect.left + rect.width / 2) {\n dropIdx = i;\n break;\n }\n }\n\n const sourceIdx = columnIds.indexOf(draggedColumn);\n // When moving rightward, dropping at index N visually means landing\n // at N - 1 after the source is removed.\n const finalIdx =\n sourceIdx >= 0 && dropIdx > sourceIdx ? dropIdx - 1 : dropIdx;\n\n if (finalIdx !== sourceIdx) {\n onColumnMove?.(draggedColumn, finalIdx);\n }\n setDraggedColumn(null);\n },\n [draggedColumn, columnIds, onColumnMove],\n );\n\n return (\n <KanbanContext.Provider value={ctx}>\n <div\n ref={containerRef}\n data-react-fancy-kanban=\"\"\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n role=\"application\"\n aria-roledescription=\"kanban board\"\n className={cn(\"flex gap-4 overflow-x-auto p-4\", className)}\n >\n {children}\n </div>\n </KanbanContext.Provider>\n );\n}\n\nexport const Kanban = Object.assign(KanbanRoot, {\n Column: KanbanColumn,\n Card: KanbanCard,\n ColumnHandle: KanbanColumnHandle,\n});\n"]}