@particle-academy/react-fancy 6.11.1 → 6.12.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 (272) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/accordion-panel.cjs +7 -7
  3. package/dist/accordion-panel.js +1 -1
  4. package/dist/accordion.cjs +3 -3
  5. package/dist/accordion.js +1 -1
  6. package/dist/autocomplete.cjs +2 -2
  7. package/dist/autocomplete.js +1 -1
  8. package/dist/avatar.cjs +2 -2
  9. package/dist/avatar.js +1 -1
  10. package/dist/breadcrumbs.cjs +2 -2
  11. package/dist/breadcrumbs.js +1 -1
  12. package/dist/calendar.cjs +2 -2
  13. package/dist/calendar.js +1 -1
  14. package/dist/carousel.cjs +7 -7
  15. package/dist/carousel.js +1 -1
  16. package/dist/chart.cjs +2 -2
  17. package/dist/chart.js +1 -1
  18. package/dist/chat-drawer.cjs +2 -2
  19. package/dist/chat-drawer.js +1 -1
  20. package/dist/chat-thread.cjs +4 -4
  21. package/dist/chat-thread.js +2 -2
  22. package/dist/{chunk-GB2EGMVQ.cjs → chunk-2JNOPH3B.cjs} +3 -3
  23. package/dist/chunk-2JNOPH3B.cjs.map +1 -0
  24. package/dist/{chunk-R3PCZSBQ.js → chunk-2OCWIAGS.js} +4 -4
  25. package/dist/chunk-2OCWIAGS.js.map +1 -0
  26. package/dist/{chunk-KRECSPD3.js → chunk-2PNQTEXK.js} +3 -3
  27. package/dist/chunk-2PNQTEXK.js.map +1 -0
  28. package/dist/{chunk-RVBA4LEB.cjs → chunk-2SO4WS2E.cjs} +4 -4
  29. package/dist/{chunk-RVBA4LEB.cjs.map → chunk-2SO4WS2E.cjs.map} +1 -1
  30. package/dist/{chunk-NWP5EGSR.cjs → chunk-2U2VQ2QF.cjs} +4 -4
  31. package/dist/{chunk-NWP5EGSR.cjs.map → chunk-2U2VQ2QF.cjs.map} +1 -1
  32. package/dist/{chunk-LXEOBSEZ.js → chunk-32542ZE6.js} +3 -3
  33. package/dist/{chunk-LXEOBSEZ.js.map → chunk-32542ZE6.js.map} +1 -1
  34. package/dist/{chunk-XQF4HCOV.cjs → chunk-3ISEBGRC.cjs} +14 -14
  35. package/dist/chunk-3ISEBGRC.cjs.map +1 -0
  36. package/dist/{chunk-J57JSHDC.js → chunk-5EOVD46D.js} +5 -5
  37. package/dist/{chunk-J57JSHDC.js.map → chunk-5EOVD46D.js.map} +1 -1
  38. package/dist/{chunk-NFUKNVB7.cjs → chunk-7J7RHUGH.cjs} +5 -5
  39. package/dist/chunk-7J7RHUGH.cjs.map +1 -0
  40. package/dist/{chunk-NW2LQRUP.js → chunk-7YUXEZXU.js} +3 -3
  41. package/dist/{chunk-NW2LQRUP.js.map → chunk-7YUXEZXU.js.map} +1 -1
  42. package/dist/{chunk-AR5DLM4K.js → chunk-AADPWMZV.js} +3 -3
  43. package/dist/{chunk-AR5DLM4K.js.map → chunk-AADPWMZV.js.map} +1 -1
  44. package/dist/{chunk-5FA6V7JF.js → chunk-B4NXPUOF.js} +3 -3
  45. package/dist/{chunk-5FA6V7JF.js.map → chunk-B4NXPUOF.js.map} +1 -1
  46. package/dist/{chunk-FZQWFDUV.cjs → chunk-BDYIKGV5.cjs} +4 -4
  47. package/dist/chunk-BDYIKGV5.cjs.map +1 -0
  48. package/dist/{chunk-VOAC5OKY.cjs → chunk-BEKJQHOX.cjs} +3 -3
  49. package/dist/{chunk-VOAC5OKY.cjs.map → chunk-BEKJQHOX.cjs.map} +1 -1
  50. package/dist/{chunk-TBLKVTJC.cjs → chunk-CR3AZMQE.cjs} +3 -3
  51. package/dist/{chunk-TBLKVTJC.cjs.map → chunk-CR3AZMQE.cjs.map} +1 -1
  52. package/dist/{chunk-7K2C744H.cjs → chunk-CXR54P5L.cjs} +4 -4
  53. package/dist/chunk-CXR54P5L.cjs.map +1 -0
  54. package/dist/{chunk-5NJF7SQX.js → chunk-D4K666OI.js} +3 -3
  55. package/dist/{chunk-5NJF7SQX.js.map → chunk-D4K666OI.js.map} +1 -1
  56. package/dist/{chunk-C2VGO375.js → chunk-EVFWX2HA.js} +3 -3
  57. package/dist/{chunk-C2VGO375.js.map → chunk-EVFWX2HA.js.map} +1 -1
  58. package/dist/{chunk-UBLMYH6C.js → chunk-EXD56OPP.js} +4 -4
  59. package/dist/chunk-EXD56OPP.js.map +1 -0
  60. package/dist/{chunk-I65KXHYL.js → chunk-F6IRLWBS.js} +6 -6
  61. package/dist/{chunk-I65KXHYL.js.map → chunk-F6IRLWBS.js.map} +1 -1
  62. package/dist/{chunk-C6EVRWXZ.cjs → chunk-FUBGTLKL.cjs} +3 -3
  63. package/dist/{chunk-C6EVRWXZ.cjs.map → chunk-FUBGTLKL.cjs.map} +1 -1
  64. package/dist/{chunk-7N7XVBH7.cjs → chunk-GOIZT7CW.cjs} +6 -6
  65. package/dist/{chunk-7N7XVBH7.cjs.map → chunk-GOIZT7CW.cjs.map} +1 -1
  66. package/dist/{chunk-R4SANV3G.cjs → chunk-IHCG3EHP.cjs} +15 -15
  67. package/dist/chunk-IHCG3EHP.cjs.map +1 -0
  68. package/dist/{chunk-6B2GMKE4.cjs → chunk-IJIP6MWS.cjs} +9 -9
  69. package/dist/chunk-IJIP6MWS.cjs.map +1 -0
  70. package/dist/{chunk-TKGMH5PA.js → chunk-J6YPMR7E.js} +3 -3
  71. package/dist/{chunk-TKGMH5PA.js.map → chunk-J6YPMR7E.js.map} +1 -1
  72. package/dist/{chunk-LG2O26CG.js → chunk-JI4AI3K4.js} +5 -5
  73. package/dist/chunk-JI4AI3K4.js.map +1 -0
  74. package/dist/{chunk-CO2NEUFK.js → chunk-JUQGTTED.js} +4 -4
  75. package/dist/chunk-JUQGTTED.js.map +1 -0
  76. package/dist/{chunk-CG3RCQVL.cjs → chunk-K3NIG7O4.cjs} +6 -6
  77. package/dist/{chunk-CG3RCQVL.cjs.map → chunk-K3NIG7O4.cjs.map} +1 -1
  78. package/dist/{chunk-LJCQI6ZS.js → chunk-KHHTTAKZ.js} +3 -3
  79. package/dist/{chunk-LJCQI6ZS.js.map → chunk-KHHTTAKZ.js.map} +1 -1
  80. package/dist/{chunk-EEFU5BVM.cjs → chunk-KJUUCMHH.cjs} +7 -7
  81. package/dist/{chunk-EEFU5BVM.cjs.map → chunk-KJUUCMHH.cjs.map} +1 -1
  82. package/dist/{chunk-LHHELLMT.cjs → chunk-KRQZGVN3.cjs} +4 -4
  83. package/dist/chunk-KRQZGVN3.cjs.map +1 -0
  84. package/dist/{chunk-KDRBUF5S.js → chunk-LCBMI4WO.js} +3 -3
  85. package/dist/{chunk-KDRBUF5S.js.map → chunk-LCBMI4WO.js.map} +1 -1
  86. package/dist/{chunk-AXW55PQG.js → chunk-M5EKV5PK.js} +3 -3
  87. package/dist/{chunk-AXW55PQG.js.map → chunk-M5EKV5PK.js.map} +1 -1
  88. package/dist/{chunk-D6NISIKV.js → chunk-MSLAK77J.js} +4 -4
  89. package/dist/chunk-MSLAK77J.js.map +1 -0
  90. package/dist/{chunk-26GRLVCQ.js → chunk-N2XFWVF7.js} +3 -3
  91. package/dist/chunk-N2XFWVF7.js.map +1 -0
  92. package/dist/{chunk-3O3ZWWLG.js → chunk-NBIRHOM6.js} +4 -4
  93. package/dist/{chunk-3O3ZWWLG.js.map → chunk-NBIRHOM6.js.map} +1 -1
  94. package/dist/{chunk-FY2WDVKF.cjs → chunk-ND2T3PMH.cjs} +3 -3
  95. package/dist/{chunk-FY2WDVKF.cjs.map → chunk-ND2T3PMH.cjs.map} +1 -1
  96. package/dist/{chunk-GE2ZGE3A.cjs → chunk-O23KGVXS.cjs} +6 -6
  97. package/dist/chunk-O23KGVXS.cjs.map +1 -0
  98. package/dist/{chunk-4EQ336PQ.js → chunk-OIX3DCKN.js} +3 -3
  99. package/dist/{chunk-4EQ336PQ.js.map → chunk-OIX3DCKN.js.map} +1 -1
  100. package/dist/{chunk-JJYMRV62.js → chunk-OIYZCYEY.js} +3 -3
  101. package/dist/chunk-OIYZCYEY.js.map +1 -0
  102. package/dist/{chunk-TH7VP4CL.cjs → chunk-OKHXAI75.cjs} +3 -3
  103. package/dist/{chunk-TH7VP4CL.cjs.map → chunk-OKHXAI75.cjs.map} +1 -1
  104. package/dist/{chunk-5SVZX6WF.cjs → chunk-OLIYEZ4C.cjs} +6 -6
  105. package/dist/{chunk-5SVZX6WF.cjs.map → chunk-OLIYEZ4C.cjs.map} +1 -1
  106. package/dist/{chunk-FX37P4KR.js → chunk-OSNDO2ZF.js} +4 -4
  107. package/dist/{chunk-FX37P4KR.js.map → chunk-OSNDO2ZF.js.map} +1 -1
  108. package/dist/{chunk-K6Q542VL.js → chunk-OUG3YE6E.js} +6 -6
  109. package/dist/{chunk-K6Q542VL.js.map → chunk-OUG3YE6E.js.map} +1 -1
  110. package/dist/{chunk-TXQT6S4D.cjs → chunk-OXR2FUEV.cjs} +3 -3
  111. package/dist/chunk-OXR2FUEV.cjs.map +1 -0
  112. package/dist/{chunk-SD6YAMDH.cjs → chunk-PDE63TMC.cjs} +3 -3
  113. package/dist/{chunk-SD6YAMDH.cjs.map → chunk-PDE63TMC.cjs.map} +1 -1
  114. package/dist/{chunk-HKLBCA5X.cjs → chunk-PIPF34XD.cjs} +4 -4
  115. package/dist/{chunk-HKLBCA5X.cjs.map → chunk-PIPF34XD.cjs.map} +1 -1
  116. package/dist/{chunk-CDW7MFPG.js → chunk-Q5P5WG6Q.js} +4 -4
  117. package/dist/{chunk-CDW7MFPG.js.map → chunk-Q5P5WG6Q.js.map} +1 -1
  118. package/dist/{chunk-ISAHWGMD.cjs → chunk-QJVQEGB7.cjs} +4 -4
  119. package/dist/{chunk-ISAHWGMD.cjs.map → chunk-QJVQEGB7.cjs.map} +1 -1
  120. package/dist/{chunk-6EPM5JG7.cjs → chunk-QLFV2KUQ.cjs} +3 -3
  121. package/dist/{chunk-6EPM5JG7.cjs.map → chunk-QLFV2KUQ.cjs.map} +1 -1
  122. package/dist/{chunk-GISORLGW.cjs → chunk-QMNDEIOJ.cjs} +3 -3
  123. package/dist/{chunk-GISORLGW.cjs.map → chunk-QMNDEIOJ.cjs.map} +1 -1
  124. package/dist/{chunk-OUPHLIXV.cjs → chunk-RBM5VYQG.cjs} +11 -11
  125. package/dist/{chunk-OUPHLIXV.cjs.map → chunk-RBM5VYQG.cjs.map} +1 -1
  126. package/dist/{chunk-24RWB7Q3.js → chunk-RC76D7FD.js} +5 -4
  127. package/dist/chunk-RC76D7FD.js.map +1 -0
  128. package/dist/{chunk-FSLEFL4U.cjs → chunk-RKDQ7RRL.cjs} +3 -3
  129. package/dist/{chunk-FSLEFL4U.cjs.map → chunk-RKDQ7RRL.cjs.map} +1 -1
  130. package/dist/{chunk-Z6M3UELD.js → chunk-S2I4QQBM.js} +3 -3
  131. package/dist/{chunk-Z6M3UELD.js.map → chunk-S2I4QQBM.js.map} +1 -1
  132. package/dist/{chunk-EW2N52FD.js → chunk-SUVSEI7N.js} +4 -4
  133. package/dist/{chunk-EW2N52FD.js.map → chunk-SUVSEI7N.js.map} +1 -1
  134. package/dist/{chunk-FR3V5IAJ.cjs → chunk-T6CBYOES.cjs} +5 -4
  135. package/dist/chunk-T6CBYOES.cjs.map +1 -0
  136. package/dist/{chunk-FECD3WKN.js → chunk-TDY5YPSU.js} +3 -3
  137. package/dist/{chunk-FECD3WKN.js.map → chunk-TDY5YPSU.js.map} +1 -1
  138. package/dist/{chunk-ZFXCZ2QO.cjs → chunk-TQIE25DE.cjs} +11 -11
  139. package/dist/{chunk-ZFXCZ2QO.cjs.map → chunk-TQIE25DE.cjs.map} +1 -1
  140. package/dist/{chunk-GE6TSA3M.cjs → chunk-TRXMF2NG.cjs} +3 -3
  141. package/dist/{chunk-GE6TSA3M.cjs.map → chunk-TRXMF2NG.cjs.map} +1 -1
  142. package/dist/{chunk-AF33UCTN.cjs → chunk-ULEJD5SQ.cjs} +3 -3
  143. package/dist/chunk-ULEJD5SQ.cjs.map +1 -0
  144. package/dist/{chunk-PIYQPXLT.js → chunk-VDD5SLBI.js} +3 -3
  145. package/dist/{chunk-PIYQPXLT.js.map → chunk-VDD5SLBI.js.map} +1 -1
  146. package/dist/{chunk-VOGI7GX3.js → chunk-VKNQ2BGO.js} +3 -3
  147. package/dist/{chunk-VOGI7GX3.js.map → chunk-VKNQ2BGO.js.map} +1 -1
  148. package/dist/{chunk-3BBEVHSP.cjs → chunk-VQHM3UUK.cjs} +3 -3
  149. package/dist/{chunk-3BBEVHSP.cjs.map → chunk-VQHM3UUK.cjs.map} +1 -1
  150. package/dist/{chunk-QMZK7SRS.cjs → chunk-VWZCUKV5.cjs} +3 -3
  151. package/dist/{chunk-QMZK7SRS.cjs.map → chunk-VWZCUKV5.cjs.map} +1 -1
  152. package/dist/{chunk-3W6BKQVZ.js → chunk-X4SUHI3G.js} +4 -4
  153. package/dist/{chunk-3W6BKQVZ.js.map → chunk-X4SUHI3G.js.map} +1 -1
  154. package/dist/{chunk-DQWAG7YY.cjs → chunk-X6XUEM2V.cjs} +4 -4
  155. package/dist/{chunk-DQWAG7YY.cjs.map → chunk-X6XUEM2V.cjs.map} +1 -1
  156. package/dist/{chunk-EDIB6V6Y.cjs → chunk-XIP2TPSX.cjs} +4 -4
  157. package/dist/{chunk-EDIB6V6Y.cjs.map → chunk-XIP2TPSX.cjs.map} +1 -1
  158. package/dist/{chunk-MD7HUHJB.js → chunk-XKUIPBJD.js} +10 -10
  159. package/dist/chunk-XKUIPBJD.js.map +1 -0
  160. package/dist/{chunk-SOIGBPK6.js → chunk-Y3CBLOD6.js} +6 -6
  161. package/dist/chunk-Y3CBLOD6.js.map +1 -0
  162. package/dist/{chunk-YZW7HQXH.js → chunk-YAZGTSKS.js} +14 -14
  163. package/dist/chunk-YAZGTSKS.js.map +1 -0
  164. package/dist/{chunk-MKDTXMCE.js → chunk-YFFW4E77.js} +4 -4
  165. package/dist/{chunk-MKDTXMCE.js.map → chunk-YFFW4E77.js.map} +1 -1
  166. package/dist/{chunk-YPYZZLZ5.js → chunk-YMDFLW47.js} +9 -9
  167. package/dist/chunk-YMDFLW47.js.map +1 -0
  168. package/dist/{chunk-LREJ7AV2.cjs → chunk-Z3IM25W7.cjs} +4 -4
  169. package/dist/{chunk-LREJ7AV2.cjs.map → chunk-Z3IM25W7.cjs.map} +1 -1
  170. package/dist/{chunk-AE6ICNJR.js → chunk-Z5DMAMVG.js} +3 -3
  171. package/dist/{chunk-AE6ICNJR.js.map → chunk-Z5DMAMVG.js.map} +1 -1
  172. package/dist/{chunk-JN5DHZ6I.js → chunk-ZC2H5GM2.js} +6 -6
  173. package/dist/{chunk-JN5DHZ6I.js.map → chunk-ZC2H5GM2.js.map} +1 -1
  174. package/dist/{chunk-DPPDZOMY.cjs → chunk-ZEQXMUXE.cjs} +4 -4
  175. package/dist/chunk-ZEQXMUXE.cjs.map +1 -0
  176. package/dist/{chunk-OP7A4SZZ.cjs → chunk-ZGSSUUK2.cjs} +4 -4
  177. package/dist/{chunk-OP7A4SZZ.cjs.map → chunk-ZGSSUUK2.cjs.map} +1 -1
  178. package/dist/{chunk-3T3LBIQA.cjs → chunk-ZQE2Q3R2.cjs} +4 -4
  179. package/dist/{chunk-3T3LBIQA.cjs.map → chunk-ZQE2Q3R2.cjs.map} +1 -1
  180. package/dist/{chunk-HCIEXBEB.js → chunk-ZRV5TRYW.js} +3 -3
  181. package/dist/{chunk-HCIEXBEB.js.map → chunk-ZRV5TRYW.js.map} +1 -1
  182. package/dist/command.cjs +3 -3
  183. package/dist/command.js +1 -1
  184. package/dist/composer.cjs +4 -4
  185. package/dist/composer.js +2 -2
  186. package/dist/drawer.cjs +3 -3
  187. package/dist/drawer.js +1 -1
  188. package/dist/editor.cjs +3 -3
  189. package/dist/editor.js +1 -1
  190. package/dist/emoji-select.cjs +2 -2
  191. package/dist/emoji-select.js +1 -1
  192. package/dist/file-browser.cjs +5 -5
  193. package/dist/file-browser.js +1 -1
  194. package/dist/index.cjs +126 -126
  195. package/dist/index.js +40 -40
  196. package/dist/input-tag.cjs +6 -6
  197. package/dist/input-tag.js +1 -1
  198. package/dist/input.cjs +3 -3
  199. package/dist/input.js +2 -2
  200. package/dist/inputs.cjs +7 -7
  201. package/dist/inputs.js +4 -4
  202. package/dist/json-editor.cjs +15 -15
  203. package/dist/json-editor.js +4 -4
  204. package/dist/magic-wand.cjs +2 -2
  205. package/dist/magic-wand.js +1 -1
  206. package/dist/media-viewer.cjs +3 -3
  207. package/dist/media-viewer.js +2 -2
  208. package/dist/mobile-menu.cjs +3 -3
  209. package/dist/mobile-menu.js +1 -1
  210. package/dist/modal.cjs +3 -3
  211. package/dist/modal.js +1 -1
  212. package/dist/mood-meter.cjs +2 -2
  213. package/dist/mood-meter.js +1 -1
  214. package/dist/navbar.cjs +3 -3
  215. package/dist/navbar.js +1 -1
  216. package/dist/number-field.cjs +4 -4
  217. package/dist/number-field.js +3 -3
  218. package/dist/pagination.cjs +2 -2
  219. package/dist/pagination.js +1 -1
  220. package/dist/paste-pills.cjs +14 -14
  221. package/dist/paste-pills.js +1 -1
  222. package/dist/phone-input.cjs +6 -6
  223. package/dist/phone-input.js +3 -3
  224. package/dist/pillbox.cjs +2 -2
  225. package/dist/pillbox.js +1 -1
  226. package/dist/profile.cjs +3 -3
  227. package/dist/profile.js +2 -2
  228. package/dist/prompt-input.cjs +5 -5
  229. package/dist/prompt-input.js +2 -2
  230. package/dist/reason-tag.cjs +2 -2
  231. package/dist/reason-tag.js +1 -1
  232. package/dist/select.cjs +2 -2
  233. package/dist/select.js +1 -1
  234. package/dist/sidebar.cjs +3 -3
  235. package/dist/sidebar.js +1 -1
  236. package/dist/table.cjs +11 -11
  237. package/dist/table.js +1 -1
  238. package/dist/time-grid.cjs +2 -2
  239. package/dist/time-grid.js +1 -1
  240. package/dist/time-picker.cjs +2 -2
  241. package/dist/time-picker.js +1 -1
  242. package/dist/toast.cjs +3 -3
  243. package/dist/toast.js +1 -1
  244. package/dist/video-viewer.cjs +2 -2
  245. package/dist/video-viewer.js +1 -1
  246. package/package.json +1 -1
  247. package/dist/chunk-24RWB7Q3.js.map +0 -1
  248. package/dist/chunk-26GRLVCQ.js.map +0 -1
  249. package/dist/chunk-6B2GMKE4.cjs.map +0 -1
  250. package/dist/chunk-7K2C744H.cjs.map +0 -1
  251. package/dist/chunk-AF33UCTN.cjs.map +0 -1
  252. package/dist/chunk-CO2NEUFK.js.map +0 -1
  253. package/dist/chunk-D6NISIKV.js.map +0 -1
  254. package/dist/chunk-DPPDZOMY.cjs.map +0 -1
  255. package/dist/chunk-FR3V5IAJ.cjs.map +0 -1
  256. package/dist/chunk-FZQWFDUV.cjs.map +0 -1
  257. package/dist/chunk-GB2EGMVQ.cjs.map +0 -1
  258. package/dist/chunk-GE2ZGE3A.cjs.map +0 -1
  259. package/dist/chunk-JJYMRV62.js.map +0 -1
  260. package/dist/chunk-KRECSPD3.js.map +0 -1
  261. package/dist/chunk-LG2O26CG.js.map +0 -1
  262. package/dist/chunk-LHHELLMT.cjs.map +0 -1
  263. package/dist/chunk-MD7HUHJB.js.map +0 -1
  264. package/dist/chunk-NFUKNVB7.cjs.map +0 -1
  265. package/dist/chunk-R3PCZSBQ.js.map +0 -1
  266. package/dist/chunk-R4SANV3G.cjs.map +0 -1
  267. package/dist/chunk-SOIGBPK6.js.map +0 -1
  268. package/dist/chunk-TXQT6S4D.cjs.map +0 -1
  269. package/dist/chunk-UBLMYH6C.js.map +0 -1
  270. package/dist/chunk-XQF4HCOV.cjs.map +0 -1
  271. package/dist/chunk-YPYZZLZ5.js.map +0 -1
  272. package/dist/chunk-YZW7HQXH.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Toast/Toast.context.ts","../src/components/Toast/ToastItem.tsx","../src/components/Toast/ToastStack.tsx","../src/components/Toast/Toast.tsx"],"names":["useEffect","jsx","jsxs","POSITION_STYLES","useRef"],"mappings":"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","file":"chunk-MSLAK77J.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ToastContextValue } from \"./Toast.types\";\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n throw new Error(\"useToast must be used within a <Toast.Provider>\");\n }\n return ctx;\n}\n","import { useEffect } from \"react\";\nimport { AlertTriangle, Check, Info, X, XCircle } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ToastItemProps } from \"./Toast.types\";\n\nconst VARIANT_STYLES = {\n default:\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n success:\n \"border-emerald-200 bg-emerald-50 dark:border-emerald-800 dark:bg-emerald-950\",\n error:\n \"border-red-200 bg-red-50 dark:border-red-800 dark:bg-red-950\",\n warning:\n \"border-amber-200 bg-amber-50 dark:border-amber-800 dark:bg-amber-950\",\n info: \"border-blue-200 bg-blue-50 dark:border-blue-800 dark:bg-blue-950\",\n} as const;\n\nconst VARIANT_ICON_COLORS = {\n default: \"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\",\n success: \"text-emerald-500\",\n error: \"text-red-500\",\n warning: \"text-amber-500\",\n info: \"text-blue-500\",\n} as const;\n\nexport function ToastItem({ data, onDismiss }: ToastItemProps) {\n const { id, title, description, variant = \"default\", action } = data;\n // An action toast does not expire by default.\n const duration = data.duration ?? (action ? 0 : 5000);\n\n useEffect(() => {\n if (duration <= 0) return;\n const timer = setTimeout(() => onDismiss(id), duration);\n return () => clearTimeout(timer);\n }, [id, duration, onDismiss]);\n\n return (\n <div\n data-react-fancy-toast-item=\"\"\n role=\"alert\"\n // Scoped to the toast rather than the document: a global Escape handler\n // would fight whatever modal or drawer is already listening.\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onDismiss(id);\n }}\n className={cn(\n \"fancy-toast-in pointer-events-auto w-80 rounded-xl border p-4 shadow-lg\",\n VARIANT_STYLES[variant],\n )}\n >\n <div className=\"flex items-start gap-3\">\n <div className={cn(\"mt-0.5 shrink-0\", VARIANT_ICON_COLORS[variant])}>\n {variant === \"success\" && <Check size={16} />}\n {variant === \"error\" && <XCircle size={16} />}\n {variant === \"warning\" && <AlertTriangle size={16} />}\n {variant === \"info\" && <Info size={16} />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\">{title}</p>\n {description && (\n <p className=\"mt-1 text-xs text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\">\n {description}\n </p>\n )}\n </div>\n {action && (\n <button\n type=\"button\"\n onClick={() => {\n action.onClick();\n // The offer is consumed; leaving it up invites undoing an\n // already-undone action.\n onDismiss(id);\n }}\n className=\"shrink-0 self-center rounded-md px-2 py-1 text-xs font-medium text-zinc-700 underline-offset-2 transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:underline dark:text-zinc-200 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\"\n >\n {action.label}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onDismiss(id)}\n className=\"shrink-0 rounded p-0.5 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\"\n aria-label=\"Dismiss\"\n >\n <X size={14} />\n </button>\n </div>\n </div>\n );\n}\n\nToastItem.displayName = \"ToastItem\";\n","import { useEffect, useRef, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { inlineStep } from \"../../utils/direction\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { Portal } from \"../Portal\";\nimport { Badge } from \"../Badge\";\nimport type { ToastPosition } from \"./Toast.types\";\n\nexport interface ToastStackProps<T> {\n /**\n * Everything to show — the stack is a VIEW of this list and owns none of it.\n * There is no limit and no timer: an item leaves only when you remove it.\n */\n items: readonly T[];\n /** One card's content, actions included. Only the front card is interactive. */\n renderItem: (item: T, state: { index: number; isFront: boolean }) => ReactNode;\n /** A stable key per item. Defaults to `item.id`, then the index. */\n getKey?: (item: T, index: number) => string;\n /** How many cards show behind the front one. Default 2. */\n depth?: number;\n /** How far each card behind peeks out above the one in front, in px. Default 8. */\n offset?: number;\n /** How much smaller each card behind is than the one in front. Default 0.05. */\n scaleStep?: number;\n /** Which item is in front, if you want to own it. Wraps; out-of-range values are clamped. */\n frontIndex?: number;\n defaultFrontIndex?: number;\n onFrontIndexChange?: (index: number) => void;\n /** A screen corner, or `\"inline\"` to render where it is placed. Default `\"bottom-end\"`: the right in LTR, the left in RTL. */\n position?: ToastPosition | \"inline\";\n /** The stack's accessible name. Default \"Notifications\". */\n label?: string;\n /** Classes for each card's shell, merged onto the defaults. */\n cardClassName?: string;\n className?: string;\n}\n\nconst POSITION_STYLES: Record<ToastPosition, string> = {\n \"top-start\": \"top-4 start-4\",\n \"top-end\": \"top-4 end-4\",\n \"bottom-start\": \"bottom-4 start-4\",\n \"bottom-end\": \"bottom-4 end-4\",\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n};\n\n/** Pixels of wheel travel that count as one step. A mouse notch is ~100; a trackpad sends many small ones. */\nconst WHEEL_STEP = 50;\n\nconst CARD =\n \"rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] p-4 shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\n\nfunction defaultKey(item: unknown, index: number): string {\n const id = (item as { id?: unknown } | null)?.id;\n return typeof id === \"string\" || typeof id === \"number\" ? String(id) : String(index);\n}\n\nfunction isTextField(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return (\n target.isContentEditable ||\n target.getAttribute(\"contenteditable\") === \"true\" ||\n /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName)\n );\n}\n\n/**\n * A controlled stack of actionable toasts — approval requests, say — that the\n * person walks through rather than races.\n *\n * Built for react-fancy#33. The owner's requirements were that requests stack\n * behind each other with a slight top offset, that scrolling over the stack\n * walks through them, and that a pending request NEVER expires or disappears.\n * The last is why this is a view of the caller's list rather than a queue it\n * keeps: there is nothing here that can drop an item, because nothing here owns\n * one. (The imperative provider's `maxToasts` silently drops the oldest.)\n */\nexport function ToastStack<T>({\n items,\n renderItem,\n getKey = defaultKey,\n depth = 2,\n offset = 8,\n scaleStep = 0.05,\n frontIndex: controlledFront,\n defaultFrontIndex = 0,\n onFrontIndexChange,\n position = \"bottom-end\",\n label = \"Notifications\",\n cardClassName,\n className,\n}: ToastStackProps<T>) {\n const [rawFront, setFront] = useControllableState(\n controlledFront,\n defaultFrontIndex,\n onFrontIndexChange,\n );\n const count = items.length;\n // Clamped for display rather than corrected through onChange: a list that\n // shrinks under a far-forward index must not make render report a change.\n const front = count === 0 ? 0 : ((rawFront % count) + count) % count;\n\n const stackRef = useRef<HTMLDivElement>(null);\n const wheelTravel = useRef(0);\n const live = useRef({ front, count });\n live.current = { front, count };\n\n const step = (by: number) => {\n const { front: current, count: n } = live.current;\n if (n < 2) return;\n setFront((((current + by) % n) + n) % n);\n };\n const stepRef = useRef(step);\n stepRef.current = step;\n\n /*\n * A native listener, because React's wheel listener is passive and cannot stop\n * the page scrolling underneath — and a stack that cycles AND scrolls the page\n * moves two things at once under the person's hand.\n */\n useEffect(() => {\n const el = stackRef.current;\n if (!el) return;\n\n const onWheel = (e: WheelEvent) => {\n if (live.current.count < 2 || e.deltaY === 0) return;\n e.preventDefault();\n\n // Line or page mode: every event is a notch.\n if (e.deltaMode !== 0) {\n wheelTravel.current = 0;\n stepRef.current(Math.sign(e.deltaY));\n return;\n }\n // A notch-sized event steps at once; small trackpad deltas add up first.\n if (Math.abs(e.deltaY) >= WHEEL_STEP) {\n wheelTravel.current = 0;\n stepRef.current(Math.sign(e.deltaY));\n return;\n }\n wheelTravel.current += e.deltaY;\n if (Math.abs(wheelTravel.current) >= WHEEL_STEP) {\n stepRef.current(Math.sign(wheelTravel.current));\n wheelTravel.current = 0;\n }\n };\n\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n // Re-bound when the element can change: it appears with the first item, and\n // moving between a corner and inline remounts it.\n }, [count > 0, position]);\n\n if (count === 0) return null;\n\n const visibleBehind = Math.min(Math.max(0, depth), count - 1);\n const hidden = count - 1 - visibleBehind;\n\n const card = (index: number, k: number) => {\n const item = items[index];\n const isFront = k === 0;\n return (\n <div\n key={getKey(item, index)}\n data-react-fancy-toast-stack-card={isFront ? \"front\" : \"behind\"}\n aria-hidden={isFront ? undefined : true}\n inert={isFront ? undefined : true}\n className={cn(\n CARD,\n \"origin-top transition-transform duration-200\",\n isFront ? \"relative\" : \"pointer-events-none absolute inset-0 overflow-hidden\",\n cardClassName,\n )}\n style={{\n zIndex: depth + 1 - k,\n transform: isFront ? undefined : `translateY(-${k * offset}px) scale(${1 - k * scaleStep})`,\n }}\n >\n {renderItem(item, { index, isFront })}\n </div>\n );\n };\n\n const stackEl = (\n <div\n ref={stackRef}\n data-react-fancy-toast-stack=\"\"\n role=\"region\"\n aria-label={label}\n tabIndex={0}\n onKeyDown={(e) => {\n if (isTextField(e.target)) return;\n // Left / right follow the reading direction: ArrowLeft is \"next\" in RTL.\n const inline = inlineStep(e.key, e.currentTarget);\n if (e.key === \"ArrowDown\" || inline === 1) {\n e.preventDefault();\n step(1);\n } else if (e.key === \"ArrowUp\" || inline === -1) {\n e.preventDefault();\n step(-1);\n }\n }}\n className={cn(\n \"pointer-events-auto relative w-80 rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-violet-500 focus-visible:ring-offset-2\",\n className,\n )}\n style={{ paddingTop: visibleBehind * offset }}\n >\n <div className=\"relative\">\n {/*\n * z-index decides what paints on top; the front card sizes the box.\n * The front card comes FIRST in the DOM, then the cards behind in walk\n * order: the ones behind are absolutely positioned against this box, so\n * their place in the source changes nothing visible -- but it is what\n * a DOM query, `textContent` and copy-paste read.\n */}\n {card(front, 0)}\n {Array.from({ length: visibleBehind }, (_, i) => i + 1).map((k) =>\n card((front + k) % count, k),\n )}\n </div>\n {hidden > 0 && (\n /*\n * Opaque in BOTH themes, because it sits over the cards peeking out\n * behind the front one -- often a light image header. The soft zinc\n * Badge is `dark:bg-zinc-900/30`, which let that image through and left\n * zinc-300 text on a light screenshot (fancy-app-update#1). The dark\n * pair is overridden here, not in Badge, so every other soft badge\n * keeps its look; the ring separates it from a zinc-900 card edge.\n */\n <Badge\n data-react-fancy-toast-stack-more=\"\"\n size=\"sm\"\n variant=\"soft\"\n color=\"zinc\"\n className=\"absolute -top-2 end-2 z-20 shadow-sm ring-1 ring-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-zinc-800 dark:text-zinc-100 dark:ring-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n >\n +{hidden}\n </Badge>\n )}\n <span data-react-fancy-toast-stack-status=\"\" aria-live=\"polite\" className=\"sr-only\">\n {count > 1 ? `${front + 1} of ${count}` : \"\"}\n </span>\n </div>\n );\n\n if (position === \"inline\") return stackEl;\n\n return (\n <Portal>\n <div\n data-react-fancy-toast-stack-position={position}\n className={cn(\"pointer-events-none fixed z-[100]\", POSITION_STYLES[position])}\n >\n {stackEl}\n </div>\n </Portal>\n );\n}\n\nToastStack.displayName = \"ToastStack\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Portal } from \"../Portal\";\nimport { ToastContext } from \"./Toast.context\";\nimport { ToastItem } from \"./ToastItem\";\nimport { ToastStack } from \"./ToastStack\";\nimport type { ToastData, ToastProviderProps } from \"./Toast.types\";\n\nconst POSITION_STYLES = {\n \"top-start\": \"top-4 start-4\",\n \"top-end\": \"top-4 end-4\",\n \"bottom-start\": \"bottom-4 start-4\",\n \"bottom-end\": \"bottom-4 end-4\",\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n} as const;\n\nfunction ToastProvider({\n children,\n position = \"bottom-end\",\n maxToasts = 5,\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n const idCounter = useRef(0);\n\n const toast = useCallback(\n (data: Omit<ToastData, \"id\">) => {\n const id = `toast-${++idCounter.current}`;\n setToasts((prev) => [...prev.slice(-(maxToasts - 1)), { ...data, id }]);\n return id;\n },\n [maxToasts],\n );\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const ctx = useMemo(() => ({ toasts, toast, dismiss }), [toasts, toast, dismiss]);\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n <Portal>\n <div\n data-react-fancy-toast=\"\"\n className={cn(\n \"fixed z-[100] flex flex-col gap-2 pointer-events-none\",\n POSITION_STYLES[position],\n )}\n >\n {toasts.map((t) => (\n <ToastItem key={t.id} data={t} onDismiss={dismiss} />\n ))}\n </div>\n </Portal>\n </ToastContext.Provider>\n );\n}\n\nexport const Toast = {\n Provider: ToastProvider,\n Stack: ToastStack,\n Item: ToastItem,\n};\n"]}
@@ -33,7 +33,7 @@ function ModalHeader({ children, className, closeLabel = "Close" }) {
33
33
  type: "button",
34
34
  onClick: close,
35
35
  "data-react-fancy-modal-close": "",
36
- className: "relative rounded-lg p-1 text-zinc-400 before:absolute before:-inset-2 before:content-[''] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300",
36
+ className: "relative rounded-lg p-1 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] before:absolute before:-inset-2 before:content-[''] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
37
37
  "aria-label": closeLabel,
38
38
  children: /* @__PURE__ */ jsx(X, { size: 20 })
39
39
  }
@@ -145,5 +145,5 @@ var Modal = Object.assign(ModalRoot, {
145
145
  });
146
146
 
147
147
  export { Modal, useModal };
148
- //# sourceMappingURL=chunk-26GRLVCQ.js.map
149
- //# sourceMappingURL=chunk-26GRLVCQ.js.map
148
+ //# sourceMappingURL=chunk-N2XFWVF7.js.map
149
+ //# sourceMappingURL=chunk-N2XFWVF7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Modal/Modal.context.ts","../src/components/Modal/ModalHeader.tsx","../src/components/Modal/ModalBody.tsx","../src/components/Modal/ModalFooter.tsx","../src/components/Modal/Modal.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-N2XFWVF7.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ModalContextValue } from \"./Modal.types\";\n\nexport const ModalContext = createContext<ModalContextValue | null>(null);\n\nexport function useModal(): ModalContextValue {\n const ctx = useContext(ModalContext);\n if (!ctx) {\n throw new Error(\"Modal compound components must be used within <Modal>\");\n }\n return ctx;\n}\n","import { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useModal } from \"./Modal.context\";\nimport type { ModalHeaderProps } from \"./Modal.types\";\n\n/**\n * The close button draws at 28px (20px icon + `p-1`) and HITS at 44px, the\n * WCAG 2.5.5 (AAA) target: a `::before` overhangs it by 8px on every side. A\n * pseudo-element is part of its button for hit-testing, so the look, the hover\n * fill and the header's height are all unchanged — the header's `py-4` already\n * has room for the overhang. A size option was the alternative; it would have\n * left every existing Modal at 28px unless someone opted in.\n */\nexport function ModalHeader({ children, className, closeLabel = \"Close\" }: ModalHeaderProps) {\n const { close } = useModal();\n\n return (\n <div\n data-react-fancy-modal-header=\"\"\n className={cn(\n \"flex items-center justify-between border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-6 py-4 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n <div className=\"text-lg font-semibold text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\">{children}</div>\n <button\n type=\"button\"\n onClick={close}\n data-react-fancy-modal-close=\"\"\n className=\"relative rounded-lg p-1 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] before:absolute before:-inset-2 before:content-[''] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover: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 aria-label={closeLabel}\n >\n <X size={20} />\n </button>\n </div>\n );\n}\n\nModalHeader.displayName = \"ModalHeader\";\n","import { cn } from \"../../utils/cn\";\nimport type { ModalBodyProps } from \"./Modal.types\";\n\nexport function ModalBody({ children, className }: ModalBodyProps) {\n return (\n // `min-h-0` is load-bearing, not decoration. A flex child defaults to\n // `min-height: auto`, which refuses to shrink below its content — so\n // `flex-1` alone would push the panel through its own max-height and the\n // scrollbar would never appear. This is what permits the overflow that\n // `overflow-y-auto` then handles.\n <div data-react-fancy-modal-body=\"\" className={cn(\"min-h-0 flex-1 overflow-y-auto px-6 py-4 text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\", className)}>\n {children}\n </div>\n );\n}\n\nModalBody.displayName = \"ModalBody\";\n","import { cn } from \"../../utils/cn\";\nimport type { ModalFooterProps } from \"./Modal.types\";\n\nexport function ModalFooter({ children, className }: ModalFooterProps) {\n return (\n <div\n data-react-fancy-modal-footer=\"\"\n className={cn(\n \"flex items-center justify-end gap-3 border-t border-[color:var(--fancy-border,var(--color-zinc-200))] px-6 py-4 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nModalFooter.displayName = \"ModalFooter\";\n","import { useCallback, useEffect, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Portal } from \"../Portal\";\nimport { ModalContext } from \"./Modal.context\";\nimport { ModalHeader } from \"./ModalHeader\";\nimport { ModalBody } from \"./ModalBody\";\nimport { ModalFooter } from \"./ModalFooter\";\nimport { useDialogFocusTrap } from \"../../hooks/use-dialog-focus-trap\";\nimport { useEscapeKey } from \"../../hooks/use-escape-key\";\nimport { useAnimation } from \"../../hooks/use-animation\";\nimport type { ModalProps } from \"./Modal.types\";\n\n/**\n * Every size is capped against the VIEWPORT, not just the width.\n *\n * Only `full` used to carry a max-height. The other four were width-constrained\n * and vertically unbounded, so a modal with long content simply grew past the\n * bottom of the screen and the rest became unreachable — no scrollbar, because\n * there was no overflow to scroll: the box got taller instead.\n *\n * `ModalBody` already had `flex-1 overflow-y-auto` and the panel already had\n * `overflow-hidden`. The scrolling machinery was complete and inert, waiting on\n * the one constraint that makes it engage.\n *\n * `dvh` over `vh` deliberately: on mobile browsers `100vh` is the tallest the\n * viewport ever gets, ignoring the address bar, so a `vh`-capped modal still\n * runs under the chrome on exactly the devices with least room. `dvh` tracks\n * the visible height. The `vh` fallback is listed first for any engine that\n * does not know `dvh` yet — an unknown unit drops the declaration, so ordering\n * is what keeps the old behaviour rather than none.\n */\nconst VIEWPORT_CAP = \"max-h-[calc(100vh-2rem)] max-h-[calc(100dvh-2rem)]\";\n\nconst SIZE_MAP = {\n sm: `max-w-sm ${VIEWPORT_CAP}`,\n md: `max-w-lg ${VIEWPORT_CAP}`,\n lg: `max-w-2xl ${VIEWPORT_CAP}`,\n xl: `max-w-4xl ${VIEWPORT_CAP}`,\n full: `max-w-[calc(100vw-2rem)] ${VIEWPORT_CAP}`,\n} as const;\n\nfunction ModalRoot({\n children,\n open,\n onClose,\n size = \"md\",\n className,\n ...rest\n}: ModalProps) {\n const close = useCallback(() => onClose(), [onClose]);\n useEscapeKey(close, open);\n\n // Body scroll lock\n useEffect(() => {\n if (open) {\n const original = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = original;\n };\n }\n }, [open]);\n\n const { mounted, className: animClass, ref: animRef } = useAnimation({\n open,\n enterClass: \"fancy-slide-up\",\n exitClass: \"fancy-fade-out\",\n });\n\n // The panel mounts renders after `open` flips; see useDialogFocusTrap.\n const attachTrap = useDialogFocusTrap(open);\n const attachPanel = useCallback(\n (node: HTMLDivElement | null) => {\n (animRef as React.MutableRefObject<HTMLElement | null>).current = node;\n attachTrap(node);\n },\n [animRef, attachTrap],\n );\n\n const ctx = useMemo(() => ({ open, close }), [open, close]);\n\n if (!mounted) return null;\n\n return (\n <ModalContext.Provider value={ctx}>\n <Portal>\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={close}\n aria-hidden=\"true\"\n />\n {/* Panel */}\n <div\n ref={attachPanel}\n data-react-fancy-modal=\"\"\n role=\"dialog\"\n aria-modal=\"true\"\n {...rest}\n className={cn(\n \"relative flex w-full flex-col overflow-hidden rounded-2xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-xl dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n SIZE_MAP[size],\n animClass,\n className,\n )}\n >\n {children}\n </div>\n </div>\n </Portal>\n </ModalContext.Provider>\n );\n}\n\nexport const Modal = Object.assign(ModalRoot, {\n Header: ModalHeader,\n Body: ModalBody,\n Footer: ModalFooter,\n});\n"]}
@@ -155,9 +155,9 @@ function InputTag({
155
155
  ].filter(Boolean).join(" "),
156
156
  style: { ...popStyle, ...style },
157
157
  children: [
158
- (cfg.label || active.query) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950", children: [
158
+ (cfg.label || active.query) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:border-zinc-800 dark:bg-zinc-950", children: [
159
159
  /* @__PURE__ */ jsx("span", { children: cfg.label ?? labelForChar(active.char) }),
160
- active.query && /* @__PURE__ */ jsxs("span", { className: "font-mono text-[10px] normal-case tracking-normal text-zinc-400", children: [
160
+ active.query && /* @__PURE__ */ jsxs("span", { className: "font-mono text-[10px] normal-case tracking-normal text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]", children: [
161
161
  active.char,
162
162
  active.query
163
163
  ] })
@@ -433,5 +433,5 @@ function controlledAdapter(opts) {
433
433
  }
434
434
 
435
435
  export { InputTag, contentEditableAdapter, controlledAdapter, inputAdapter, textareaAdapter };
436
- //# sourceMappingURL=chunk-3O3ZWWLG.js.map
437
- //# sourceMappingURL=chunk-3O3ZWWLG.js.map
436
+ //# sourceMappingURL=chunk-NBIRHOM6.js.map
437
+ //# sourceMappingURL=chunk-NBIRHOM6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/InputTag/InputTag.tsx","../src/components/InputTag/adapters.ts"],"names":["cfg","el"],"mappings":"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","file":"chunk-3O3ZWWLG.js","sourcesContent":["import {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { isRtl } from \"../../utils/direction\";\n\n/**\n * InputTag — attach a `/`-style or `@`-style autocomplete picker to *any*\n * text surface (a `<textarea>`, an `<input>`, a `contenteditable`, a code\n * editor, a sheet cell editor, a whiteboard sticky note…) via an adapter\n * that abstracts the surface's read/write/caret API.\n *\n * The component is \"headless\" in the sense that it has no input of its\n * own — it floats a small picker menu near the surface and writes back\n * through the adapter when the user picks an item.\n *\n * <textarea ref={ref} value={text} onChange={...} />\n * <InputTag\n * adapter={textareaAdapter(ref)}\n * triggers={{\n * \"/\": { items: commands, insert: (c) => `${c.name} ` },\n * \"@\": { items: mentions, insert: (m) => `@${m.name} ` },\n * }}\n * />\n *\n * For non-DOM surfaces, write a small adapter that conforms to\n * {@link InputTagAdapter}. Adapters typically run 20–40 lines.\n */\n\n/** What the surface tells the picker on every text/caret change. */\nexport type InputTagAdapterState = {\n text: string;\n caretIndex: number;\n};\n\n/**\n * The contract every input surface implements. The picker subscribes to\n * state changes, anchors itself using `getAnchorRect`, intercepts\n * navigation keys via `onKey`, and writes the selected item back through\n * `replaceRange`.\n */\nexport type InputTagAdapter = {\n /** Push current state whenever text or caret changes. Returns an unsubscribe. */\n subscribe: (fn: (state: InputTagAdapterState) => void) => () => void;\n /** Replace text in `[start, end)` with `replacement`. The adapter is\n * responsible for moving the caret to the end of the inserted text. */\n replaceRange: (start: number, end: number, replacement: string) => void;\n /** Screen-space rect to anchor the picker against. Usually the surface's\n * bounding rect; for editors that can compute caret-precise coordinates,\n * return a small rect there instead. */\n getAnchorRect: () => DOMRect | null;\n /** Subscribe to keydown events on the surface. The handler may return\n * `true` to consume the event (the adapter then calls\n * `preventDefault` / `stopPropagation`). Returns an unsubscribe. */\n onKey: (handler: (e: KeyboardEvent) => boolean) => () => void;\n};\n\n/**\n * Per-trigger configuration. `T` is the item shape — typically a\n * `{ id, name, ... }` object, but any shape works as long as `keyOf` /\n * `insert` know how to handle it.\n */\nexport type InputTagTrigger<T> = {\n /** The pool the picker filters against. */\n items: T[];\n /** Text inserted in place of `<triggerChar><query>`. */\n insert: (item: T, query: string) => string;\n /** Custom filter. Default: case-insensitive prefix match against\n * `String(keyOf(item))`. Pass `() => true` to disable filtering and\n * rely on `items` being pre-filtered (e.g. from an async source). */\n filter?: (item: T, query: string) => boolean;\n /** How to render each row. Default renders the result of `keyOf(item)`. */\n render?: (item: T, active: boolean) => ReactNode;\n /** How to derive a stable key + default label for each item. Default\n * reads `item.name` then `item.id` then `String(item)`. */\n keyOf?: (item: T) => string;\n /** Optional header label shown above the list. */\n label?: string;\n};\n\nexport type InputTagTriggers = Record<string, InputTagTrigger<any>>;\n\nexport interface InputTagProps {\n adapter: InputTagAdapter;\n triggers: InputTagTriggers;\n /** Max rows shown. Default 8. */\n maxItems?: number;\n /**\n * Where the picker anchors relative to the surface. `*-start` / `*-end`\n * follow the writing direction (`start` is the right edge in RTL);\n * `*-left` / `*-right` are physical. Default `\"bottom-start\"`.\n */\n placement?:\n | \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\"\n | \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n /** Custom class for the popover container. */\n className?: string;\n /** Inline style for the popover container. */\n style?: CSSProperties;\n /** Fires whenever an item is picked. */\n onPick?: (info: { triggerChar: string; query: string; item: unknown }) => void;\n};\n\ntype ActiveTrigger = {\n char: string;\n start: number;\n end: number;\n query: string;\n};\n\nfunction defaultKeyOf(item: unknown): string {\n if (item && typeof item === \"object\") {\n const r = item as Record<string, unknown>;\n if (typeof r.name === \"string\") return r.name;\n if (typeof r.id === \"string\") return r.id;\n }\n return String(item);\n}\n\nfunction defaultFilter(item: unknown, query: string): boolean {\n if (!query) return true;\n return defaultKeyOf(item).toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * Walk back from `caret` to detect an active trigger. A trigger is active\n * when one of the configured characters appears between `caret` and the\n * nearest preceding whitespace (or start-of-text), with no other\n * non-trigger-non-whitespace breaks. The \"query\" is everything after\n * the trigger up to the caret.\n */\nfunction detectTrigger(\n text: string,\n caret: number,\n triggerChars: Set<string>,\n): ActiveTrigger | null {\n for (let i = caret - 1; i >= 0; i--) {\n const ch = text[i];\n if (ch === undefined) break;\n if (triggerChars.has(ch)) {\n // Must be at a word boundary: start of text OR preceded by whitespace.\n if (i === 0 || /\\s/.test(text[i - 1])) {\n return {\n char: ch,\n start: i,\n end: caret,\n query: text.slice(i + 1, caret),\n };\n }\n return null;\n }\n if (/\\s/.test(ch)) return null;\n }\n return null;\n}\n\nexport function InputTag({\n adapter,\n triggers,\n maxItems = 8,\n placement = \"bottom-start\",\n className,\n style,\n onPick,\n}: InputTagProps) {\n const triggerChars = useMemo(() => new Set(Object.keys(triggers)), [triggers]);\n const [active, setActive] = useState<ActiveTrigger | null>(null);\n const [cursor, setCursor] = useState(0);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n // The picker's own resolved direction, read before paint: it renders in\n // place, so it inherits the surface's `dir`.\n const popRef = useRef<HTMLDivElement | null>(null);\n const [rtl, setRtl] = useState(false);\n\n // Latest state in refs so key handlers see fresh data without re-registering.\n const stateRef = useRef<InputTagAdapterState>({ text: \"\", caretIndex: 0 });\n const activeRef = useRef<ActiveTrigger | null>(null);\n const cursorRef = useRef(0);\n activeRef.current = active;\n cursorRef.current = cursor;\n\n // Filtered items for the active trigger.\n const items: unknown[] = useMemo(() => {\n if (!active) return [];\n const cfg = triggers[active.char];\n if (!cfg) return [];\n const filter = cfg.filter ?? defaultFilter;\n const out: unknown[] = [];\n for (const item of cfg.items) {\n if (filter(item, active.query)) out.push(item);\n if (out.length >= maxItems) break;\n }\n return out;\n }, [active, triggers, maxItems]);\n\n // Subscribe to text/caret changes.\n useEffect(() => {\n return adapter.subscribe((s) => {\n stateRef.current = s;\n const next = detectTrigger(s.text, s.caretIndex, triggerChars);\n setActive((prev) => {\n // Reset cursor when the trigger char or position changes.\n if (!prev || !next || prev.char !== next.char || prev.start !== next.start) {\n setCursor(0);\n }\n return next;\n });\n if (next) setAnchorRect(adapter.getAnchorRect());\n });\n }, [adapter, triggerChars]);\n\n // Refresh anchor rect on scroll/resize while picker is open.\n useLayoutEffect(() => {\n if (!active) return;\n const update = () => setAnchorRect(adapter.getAnchorRect());\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [active, adapter]);\n\n // Clamp cursor when the visible items shrink.\n useEffect(() => {\n if (cursor >= items.length) setCursor(Math.max(0, items.length - 1));\n }, [items.length, cursor]);\n\n const pickItem = useCallback(\n (item: unknown) => {\n const cur = activeRef.current;\n if (!cur) return;\n const cfg = triggers[cur.char];\n if (!cfg) return;\n const replacement = cfg.insert(item, cur.query);\n adapter.replaceRange(cur.start, cur.end, replacement);\n onPick?.({ triggerChar: cur.char, query: cur.query, item });\n setActive(null);\n },\n [adapter, triggers, onPick],\n );\n\n // Key handling.\n useEffect(() => {\n return adapter.onKey((e) => {\n const cur = activeRef.current;\n if (!cur) return false;\n const visible = items;\n switch (e.key) {\n case \"ArrowDown\":\n if (visible.length === 0) return false;\n setCursor((c) => (c + 1) % visible.length);\n return true;\n case \"ArrowUp\":\n if (visible.length === 0) return false;\n setCursor((c) => (c - 1 + visible.length) % visible.length);\n return true;\n case \"Enter\":\n case \"Tab\": {\n if (visible.length === 0) return false;\n // Confirming an IME composition is not a pick; let the editor have it.\n if (e.key === \"Enter\" && isImeComposing(e)) return false;\n const idx = Math.min(cursorRef.current, visible.length - 1);\n pickItem(visible[idx]);\n return true;\n }\n case \"Escape\":\n setActive(null);\n return true;\n default:\n return false;\n }\n });\n }, [adapter, items, pickItem]);\n\n useLayoutEffect(() => {\n if (popRef.current) setRtl(isRtl(popRef.current));\n });\n\n if (!active || !anchorRect || items.length === 0) return null;\n\n const cfg = triggers[active.char];\n if (!cfg) return null;\n\n const popStyle = computePopoverStyle(anchorRect, logicalToPhysical(placement, rtl));\n\n return (\n <div\n ref={popRef}\n role=\"listbox\"\n aria-label={cfg.label ?? `Pick a ${active.char === \"/\" ? \"command\" : \"mention\"}`}\n className={[\n \"fixed z-50 w-72 overflow-hidden rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ ...popStyle, ...style }}\n >\n {(cfg.label || active.query) && (\n <div className=\"flex items-center justify-between border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950\">\n <span>{cfg.label ?? labelForChar(active.char)}</span>\n {active.query && (\n <span className=\"font-mono text-[10px] normal-case tracking-normal text-zinc-400\">\n {active.char}\n {active.query}\n </span>\n )}\n </div>\n )}\n <ul className=\"max-h-60 overflow-y-auto\">\n {items.map((item, i) => {\n const renderer = cfg.render ?? ((it: unknown) => <span>{defaultKeyOf(it)}</span>);\n const active2 = i === cursor;\n const key = (cfg.keyOf ?? defaultKeyOf)(item);\n return (\n <li\n key={key}\n role=\"option\"\n aria-selected={active2}\n onMouseDown={(e) => {\n e.preventDefault();\n pickItem(item);\n }}\n onMouseEnter={() => setCursor(i)}\n className={[\n \"cursor-pointer px-2 py-1.5 text-[12px]\",\n active2\n ? \"bg-violet-100 dark:bg-violet-900/30\"\n : \"hover:bg-zinc-50 dark:hover:bg-zinc-800\",\n ].join(\" \")}\n >\n {renderer(item, active2)}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\nfunction labelForChar(ch: string): string {\n if (ch === \"/\") return \"Commands\";\n if (ch === \"@\") return \"Mentions\";\n if (ch === \"#\") return \"Tags\";\n if (ch === \":\") return \"Emoji\";\n return `Trigger ${ch}`;\n}\n\ntype PhysicalPlacement = \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n\n/** `start` is the left edge in LTR and the right edge in RTL. */\nfunction logicalToPhysical(\n placement: NonNullable<InputTagProps[\"placement\"]>,\n rtl: boolean,\n): PhysicalPlacement {\n const [block, inline] = placement.split(\"-\") as [\"top\" | \"bottom\", string];\n if (inline === \"start\") return `${block}-${rtl ? \"right\" : \"left\"}`;\n if (inline === \"end\") return `${block}-${rtl ? \"left\" : \"right\"}`;\n return placement as PhysicalPlacement;\n}\n\nfunction computePopoverStyle(\n anchor: DOMRect,\n placement: PhysicalPlacement,\n): CSSProperties {\n const offset = 4;\n switch (placement) {\n case \"bottom-right\":\n return { top: anchor.bottom + offset, right: window.innerWidth - anchor.right };\n case \"top-left\":\n return { bottom: window.innerHeight - anchor.top + offset, left: anchor.left };\n case \"top-right\":\n return { bottom: window.innerHeight - anchor.top + offset, right: window.innerWidth - anchor.right };\n case \"bottom-left\":\n default:\n return { top: anchor.bottom + offset, left: anchor.left };\n }\n}\n","import type { RefObject } from \"react\";\nimport type { InputTagAdapter } from \"./InputTag\";\n\n/**\n * Built-in DOM adapters. Each one wraps a familiar input element and\n * exposes the {@link InputTagAdapter} contract so `<InputTag>` can\n * attach to it. For non-DOM surfaces (code editor, sheet cell editor,\n * whiteboard sticky note), write your own — the contract is small.\n */\n\n/**\n * Get React's monkey-patched-aside native value setter on a DOM\n * element. Required when programmatically updating `value` on a\n * controlled input: React's intercepted setter would otherwise swallow\n * the change and the consumer's `onChange` would never fire.\n */\nfunction nativeValueSetter(el: HTMLInputElement | HTMLTextAreaElement): ((v: string) => void) | null {\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n const desc = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (!desc?.set) return null;\n return desc.set.bind(el);\n}\n\nfunction replaceInValueElement(\n el: HTMLInputElement | HTMLTextAreaElement,\n start: number,\n end: number,\n replacement: string,\n): void {\n const current = el.value;\n const next = current.slice(0, start) + replacement + current.slice(end);\n const setter = nativeValueSetter(el);\n if (setter) {\n setter(next);\n } else {\n el.value = next;\n }\n // Dispatch a native `input` event so any controlled-component\n // onChange handler upstream gets the new value.\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n // Place caret at the end of the inserted text.\n const caret = start + replacement.length;\n el.setSelectionRange(caret, caret);\n el.focus();\n}\n\nfunction valueElementAdapter(\n ref: RefObject<HTMLTextAreaElement | HTMLInputElement | null>,\n): InputTagAdapter {\n return {\n subscribe(fn) {\n const handler = () => {\n const el = ref.current;\n if (!el) return;\n fn({\n text: el.value,\n caretIndex: el.selectionStart ?? el.value.length,\n });\n };\n const el = ref.current;\n if (el) {\n el.addEventListener(\"input\", handler);\n el.addEventListener(\"click\", handler);\n el.addEventListener(\"keyup\", handler);\n el.addEventListener(\"focus\", handler);\n }\n return () => {\n const el2 = ref.current;\n if (el2) {\n el2.removeEventListener(\"input\", handler);\n el2.removeEventListener(\"click\", handler);\n el2.removeEventListener(\"keyup\", handler);\n el2.removeEventListener(\"focus\", handler);\n }\n };\n },\n replaceRange(start, end, replacement) {\n const el = ref.current;\n if (!el) return;\n replaceInValueElement(el, start, end, replacement);\n },\n getAnchorRect() {\n const el = ref.current;\n return el ? el.getBoundingClientRect() : null;\n },\n onKey(handler) {\n const fn = (e: KeyboardEvent) => {\n if (handler(e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n const el = ref.current;\n if (el) el.addEventListener(\"keydown\", fn as EventListener);\n return () => {\n const el2 = ref.current;\n if (el2) el2.removeEventListener(\"keydown\", fn as EventListener);\n };\n },\n };\n}\n\n/**\n * Adapter for a DOM `<textarea>`. Works whether the consumer manages\n * `value` via React state (controlled) or lets the DOM hold it\n * (uncontrolled) — `replaceRange` uses React's native value setter and\n * dispatches a native `input` event so the upstream onChange fires.\n */\nexport function textareaAdapter(\n ref: RefObject<HTMLTextAreaElement | null>,\n): InputTagAdapter {\n return valueElementAdapter(ref);\n}\n\n/** Adapter for a DOM `<input type=\"text|search|...\">`. */\nexport function inputAdapter(\n ref: RefObject<HTMLInputElement | null>,\n): InputTagAdapter {\n return valueElementAdapter(ref);\n}\n\n/**\n * Adapter for any `contenteditable` element. Operates on the element's\n * `textContent`; rich-text editors with their own internal model should\n * write a custom adapter that talks to that model instead.\n */\nexport function contentEditableAdapter(\n ref: RefObject<HTMLElement | null>,\n): InputTagAdapter {\n function caretIndex(el: HTMLElement): number {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return 0;\n const range = sel.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setEnd(sel.focusNode!, sel.focusOffset);\n return range.toString().length;\n }\n /**\n * Resolve an index into the element's visible text to a position inside the\n * text node that actually holds it. Returns null when the index is past the\n * end, or when there is no text node at all (an empty editable).\n *\n * This is the single walk that `setCaret` and `replaceRange` share. They used\n * to disagree: `setCaret` walked, `replaceRange` went through `textContent`.\n */\n function locate(\n el: HTMLElement,\n index: number,\n ): { node: Text; offset: number } | null {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n let remaining = index;\n let node = walker.nextNode() as Text | null;\n while (node) {\n const len = node.textContent?.length ?? 0;\n if (remaining <= len) return { node, offset: remaining };\n remaining -= len;\n node = walker.nextNode() as Text | null;\n }\n return null;\n }\n function setCaret(el: HTMLElement, index: number): void {\n const sel = window.getSelection();\n if (!sel) return;\n const at = locate(el, index);\n const range = document.createRange();\n if (at) {\n range.setStart(at.node, at.offset);\n range.collapse(true);\n } else {\n // Past end (or nothing to walk): place at end.\n range.selectNodeContents(el);\n range.collapse(false);\n }\n sel.removeAllRanges();\n sel.addRange(range);\n }\n return {\n subscribe(fn) {\n const handler = () => {\n const el = ref.current;\n if (!el) return;\n fn({ text: el.textContent ?? \"\", caretIndex: caretIndex(el) });\n };\n const el = ref.current;\n if (el) {\n el.addEventListener(\"input\", handler);\n el.addEventListener(\"click\", handler);\n el.addEventListener(\"keyup\", handler);\n el.addEventListener(\"focus\", handler);\n }\n return () => {\n const el2 = ref.current;\n if (el2) {\n el2.removeEventListener(\"input\", handler);\n el2.removeEventListener(\"click\", handler);\n el2.removeEventListener(\"keyup\", handler);\n el2.removeEventListener(\"focus\", handler);\n }\n };\n },\n replaceRange(start, end, replacement) {\n const el = ref.current;\n if (!el) return;\n\n // Edit through a Range rather than rewriting `textContent`. Assigning\n // `textContent` destroys EVERY element child, so a host that renders a\n // resolved tag as a pill could only ever insert one: the next insert\n // flattened the first away. A Range touches nothing outside itself.\n const from = locate(el, start);\n const to = locate(el, end);\n const inserted = document.createTextNode(replacement);\n\n if (from && to) {\n const range = document.createRange();\n range.setStart(from.node, from.offset);\n range.setEnd(to.node, to.offset);\n range.deleteContents();\n range.insertNode(inserted);\n } else {\n // Past the end, or an empty editable with no text node to address.\n el.append(inserted);\n }\n\n // Anchor the caret on the node just written instead of re-deriving an\n // index: the text offsets have moved, and the node has not.\n const sel = window.getSelection();\n if (sel) {\n const after = document.createRange();\n after.setStart(inserted, inserted.length);\n after.collapse(true);\n sel.removeAllRanges();\n sel.addRange(after);\n }\n\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.focus();\n },\n getAnchorRect() {\n const el = ref.current;\n return el ? el.getBoundingClientRect() : null;\n },\n onKey(handler) {\n const fn = (e: KeyboardEvent) => {\n if (handler(e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n const el = ref.current;\n if (el) el.addEventListener(\"keydown\", fn as EventListener);\n return () => {\n const el2 = ref.current;\n if (el2) el2.removeEventListener(\"keydown\", fn as EventListener);\n };\n },\n };\n}\n\n/**\n * Adapter for hosts that fully control the text state themselves. Use\n * this when you can't (or don't want to) let the DOM be the source of\n * truth — for code editors with internal state, sheet cell editors, or\n * any host that already has `value` + `onChange` and wants to reach the\n * picker programmatically.\n *\n * The host calls `notify({ text, caretIndex })` after every text or\n * caret change. `<InputTag>` calls `onReplaceRange` to write back.\n */\nexport type ControlledAdapterHandle = InputTagAdapter & {\n /** Push the latest text + caret to the picker. */\n notify: (state: { text: string; caretIndex: number }) => void;\n};\n\nexport function controlledAdapter(opts: {\n /** Element used as anchor + key target. Usually the visible input. */\n anchorRef: RefObject<HTMLElement | null>;\n /** Called when the picker writes back an insertion. */\n onReplaceRange: (start: number, end: number, replacement: string) => void;\n}): ControlledAdapterHandle {\n let listener: ((s: { text: string; caretIndex: number }) => void) | null = null;\n let keyHandler: ((e: KeyboardEvent) => boolean) | null = null;\n\n const installKey = () => {\n const el = opts.anchorRef.current;\n if (!el || !keyHandler) return () => {};\n const fn = (e: KeyboardEvent) => {\n if (keyHandler && keyHandler(e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n el.addEventListener(\"keydown\", fn);\n return () => el.removeEventListener(\"keydown\", fn);\n };\n\n return {\n notify(state) {\n listener?.(state);\n },\n subscribe(fn) {\n listener = fn;\n return () => {\n if (listener === fn) listener = null;\n };\n },\n replaceRange(start, end, replacement) {\n opts.onReplaceRange(start, end, replacement);\n },\n getAnchorRect() {\n const el = opts.anchorRef.current;\n return el ? el.getBoundingClientRect() : null;\n },\n onKey(handler) {\n keyHandler = handler;\n const uninstall = installKey();\n return () => {\n if (keyHandler === handler) keyHandler = null;\n uninstall();\n };\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/components/InputTag/InputTag.tsx","../src/components/InputTag/adapters.ts"],"names":["cfg","el"],"mappings":";;;;;AAqHA,SAAS,aAAa,IAAA,EAAuB;AAC3C,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,SAAiB,CAAA,CAAE,IAAA;AACzC,IAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,SAAiB,CAAA,CAAE,EAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;AAEA,SAAS,aAAA,CAAc,MAAe,KAAA,EAAwB;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,CAAE,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AACtE;AASA,SAAS,aAAA,CACP,IAAA,EACA,KAAA,EACA,YAAA,EACsB;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,OAAO,MAAA,EAAW;AACtB,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AAExB,MAAA,IAAI,CAAA,KAAM,KAAK,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AACrC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,CAAA;AAAA,UACP,GAAA,EAAK,KAAA;AAAA,UACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,KAAK;AAAA,SAChC;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,IAAA;AAAA,EAC5B;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,CAAA;AAAA,EACX,SAAA,GAAY,cAAA;AAAA,EACZ,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAM,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC7E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAA+B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,CAAC,CAAA;AACtC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAyB,IAAI,CAAA;AAGjE,EAAA,MAAM,MAAA,GAAS,OAA8B,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,KAAK,CAAA;AAGpC,EAAA,MAAM,WAAW,MAAA,CAA6B,EAAE,MAAM,EAAA,EAAI,UAAA,EAAY,GAAG,CAAA;AACzE,EAAA,MAAM,SAAA,GAAY,OAA6B,IAAI,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAGpB,EAAA,MAAM,KAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,MAAMA,IAAAA,GAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAChC,IAAA,IAAI,CAACA,IAAAA,EAAK,OAAO,EAAC;AAClB,IAAA,MAAM,MAAA,GAASA,KAAI,MAAA,IAAU,aAAA;AAC7B,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQA,KAAI,KAAA,EAAO;AAC5B,MAAA,IAAI,OAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,CAAA;AAC7C,MAAA,IAAI,GAAA,CAAI,UAAU,QAAA,EAAU;AAAA,IAC9B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAC,CAAA;AAG/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM;AAC9B,MAAA,QAAA,CAAS,OAAA,GAAU,CAAA;AACnB,MAAA,MAAM,OAAO,aAAA,CAAc,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,YAAY,YAAY,CAAA;AAC7D,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAElB,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAA,EAAO;AAC1E,UAAA,SAAA,CAAU,CAAC,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAI,IAAA,EAAM,aAAA,CAAc,OAAA,CAAQ,aAAA,EAAe,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,YAAY,CAAC,CAAA;AAG1B,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,OAAA,CAAQ,eAAe,CAAA;AAC1D,IAAA,MAAA,EAAO;AACP,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAC9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AACjD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAGpB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEzB,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,IAAA,KAAkB;AACjB,MAAA,MAAM,MAAM,SAAA,CAAU,OAAA;AACtB,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAMA,IAAAA,GAAM,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC7B,MAAA,IAAI,CAACA,IAAAA,EAAK;AACV,MAAA,MAAM,WAAA,GAAcA,IAAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAI,KAAK,CAAA;AAC9C,MAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,KAAK,WAAW,CAAA;AACpD,MAAA,MAAA,GAAS,EAAE,aAAa,GAAA,CAAI,IAAA,EAAM,OAAO,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAC1D,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,QAAA,EAAU,MAAM;AAAA,GAC5B;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,MAAM,SAAA,CAAU,OAAA;AACtB,MAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,MAAA,MAAM,OAAA,GAAU,KAAA;AAChB,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACjC,UAAA,SAAA,CAAU,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,QAAQ,MAAM,CAAA;AACzC,UAAA,OAAO,IAAA;AAAA,QACT,KAAK,SAAA;AACH,UAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACjC,UAAA,SAAA,CAAU,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,IAAI,OAAA,CAAQ,MAAA,IAAU,QAAQ,MAAM,CAAA;AAC1D,UAAA,OAAO,IAAA;AAAA,QACT,KAAK,OAAA;AAAA,QACL,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAEjC,UAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,IAAW,cAAA,CAAe,CAAC,GAAG,OAAO,KAAA;AACnD,UAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,UAAU,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC1D,UAAA,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAC,CAAA;AACrB,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,QACA,KAAK,QAAA;AACH,UAAA,SAAA,CAAU,IAAI,CAAA;AACd,UAAA,OAAO,IAAA;AAAA,QACT;AACE,UAAA,OAAO,KAAA;AAAA;AACX,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE7B,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,OAAO,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAClD,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,cAAc,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzD,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAChC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,MAAM,WAAW,mBAAA,CAAoB,UAAA,EAAY,iBAAA,CAAkB,SAAA,EAAW,GAAG,CAAC,CAAA;AAElF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,IAAI,KAAA,IAAS,CAAA,OAAA,EAAU,OAAO,IAAA,KAAS,GAAA,GAAM,YAAY,SAAS,CAAA,CAAA;AAAA,MAC9E,SAAA,EAAW;AAAA,QACT,4SAAA;AAAA,QACA,SAAA,IAAa;AAAA,OACf,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAAA,MACX,KAAA,EAAO,EAAE,GAAG,QAAA,EAAU,GAAG,KAAA,EAAM;AAAA,MAE7B,QAAA,EAAA;AAAA,QAAA,CAAA,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,qBACpB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0SAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAM,QAAA,EAAA,GAAA,CAAI,KAAA,IAAS,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,EAAE,CAAA;AAAA,UAC7C,MAAA,CAAO,KAAA,oBACN,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mLAAA,EACb,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,IAAA;AAAA,YACP,MAAA,CAAO;AAAA,WAAA,EACV;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEF,GAAA,CAAC,QAAG,SAAA,EAAU,0BAAA,EACX,gBAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACtB,UAAA,MAAM,QAAA,GAAW,IAAI,MAAA,KAAW,CAAC,uBAAgB,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,CAAa,EAAE,CAAA,EAAE,CAAA,CAAA;AACzE,UAAA,MAAM,UAAU,CAAA,KAAM,MAAA;AACtB,UAAA,MAAM,GAAA,GAAA,CAAO,GAAA,CAAI,KAAA,IAAS,YAAA,EAAc,IAAI,CAAA;AAC5C,UAAA,uBACE,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,eAAA,EAAe,OAAA;AAAA,cACf,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,YAAA,EAAc,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,cAC/B,SAAA,EAAW;AAAA,gBACT,wCAAA;AAAA,gBACA,UACI,qCAAA,GACA;AAAA,eACN,CAAE,KAAK,GAAG,CAAA;AAAA,cAET,QAAA,EAAA,QAAA,CAAS,MAAM,OAAO;AAAA,aAAA;AAAA,YAflB;AAAA,WAgBP;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,aAAa,EAAA,EAAoB;AACxC,EAAA,IAAI,EAAA,KAAO,KAAK,OAAO,UAAA;AACvB,EAAA,IAAI,EAAA,KAAO,KAAK,OAAO,UAAA;AACvB,EAAA,IAAI,EAAA,KAAO,KAAK,OAAO,MAAA;AACvB,EAAA,IAAI,EAAA,KAAO,KAAK,OAAO,OAAA;AACvB,EAAA,OAAO,WAAW,EAAE,CAAA,CAAA;AACtB;AAKA,SAAS,iBAAA,CACP,WACA,GAAA,EACmB;AACnB,EAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AAC3C,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAA,GAAM,UAAU,MAAM,CAAA,CAAA;AACjE,EAAA,IAAI,MAAA,KAAW,OAAO,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAA,GAAM,SAAS,OAAO,CAAA,CAAA;AAC/D,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,mBAAA,CACP,QACA,SAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,cAAA;AACH,MAAA,OAAO,EAAE,KAAK,MAAA,CAAO,MAAA,GAAS,QAAQ,KAAA,EAAO,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,KAAA,EAAM;AAAA,IAChF,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,QAAQ,MAAA,CAAO,WAAA,GAAc,OAAO,GAAA,GAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK;AAAA,IAC/E,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,GAAA,GAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,KAAA,EAAM;AAAA,IACrG,KAAK,aAAA;AAAA,IACL;AACE,MAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,SAAS,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA;AAE9D;;;AClXA,SAAS,kBAAkB,EAAA,EAA0E;AACnG,EAAA,MAAM,KAAA,GAAQ,EAAA,YAAc,mBAAA,GAAsB,mBAAA,CAAoB,YAAY,gBAAA,CAAiB,SAAA;AACnG,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,OAAO,CAAA;AAC3D,EAAA,IAAI,CAAC,IAAA,EAAM,GAAA,EAAK,OAAO,IAAA;AACvB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACzB;AAEA,SAAS,qBAAA,CACP,EAAA,EACA,KAAA,EACA,GAAA,EACA,WAAA,EACM;AACN,EAAA,MAAM,UAAU,EAAA,CAAG,KAAA;AACnB,EAAA,MAAM,IAAA,GAAO,QAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AACtE,EAAA,MAAM,MAAA,GAAS,kBAAkB,EAAE,CAAA;AACnC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,IAAI,CAAA;AAAA,EACb,CAAA,MAAO;AACL,IAAA,EAAA,CAAG,KAAA,GAAQ,IAAA;AAAA,EACb;AAGA,EAAA,EAAA,CAAG,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,CAAY,MAAA;AAClC,EAAA,EAAA,CAAG,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACjC,EAAA,EAAA,CAAG,KAAA,EAAM;AACX;AAEA,SAAS,oBACP,GAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,UAAU,EAAA,EAAI;AACZ,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,MAAMC,MAAK,GAAA,CAAI,OAAA;AACf,QAAA,IAAI,CAACA,GAAAA,EAAI;AACT,QAAA,EAAA,CAAG;AAAA,UACD,MAAMA,GAAAA,CAAG,KAAA;AAAA,UACT,UAAA,EAAYA,GAAAA,CAAG,cAAA,IAAkBA,GAAAA,CAAG,KAAA,CAAM;AAAA,SAC3C,CAAA;AAAA,MACH,CAAA;AACA,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxC,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxC,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxC,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,QAC1C;AAAA,MACF,CAAA;AAAA,IACF,CAAA;AAAA,IACA,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa;AACpC,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,qBAAA,CAAsB,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,WAAW,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,aAAA,GAAgB;AACd,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,OAAO,EAAA,GAAK,EAAA,CAAG,qBAAA,EAAsB,GAAI,IAAA;AAAA,IAC3C,CAAA;AAAA,IACA,MAAM,OAAA,EAAS;AACb,MAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAqB;AAC/B,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG;AACd,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,QACpB;AAAA,MACF,CAAA;AACA,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,EAAA,EAAI,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,EAAmB,CAAA;AAC1D,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,mBAAA,CAAoB,SAAA,EAAW,EAAmB,CAAA;AAAA,MACjE,CAAA;AAAA,IACF;AAAA,GACF;AACF;AAQO,SAAS,gBACd,GAAA,EACiB;AACjB,EAAA,OAAO,oBAAoB,GAAG,CAAA;AAChC;AAGO,SAAS,aACd,GAAA,EACiB;AACjB,EAAA,OAAO,oBAAoB,GAAG,CAAA;AAChC;AAOO,SAAS,uBACd,GAAA,EACiB;AACjB,EAAA,SAAS,WAAW,EAAA,EAAyB;AAC3C,IAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,UAAA,KAAe,GAAG,OAAO,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,CAAC,EAAE,UAAA,EAAW;AAC3C,IAAA,KAAA,CAAM,mBAAmB,EAAE,CAAA;AAC3B,IAAA,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,SAAA,EAAY,GAAA,CAAI,WAAW,CAAA;AAC5C,IAAA,OAAO,KAAA,CAAM,UAAS,CAAE,MAAA;AAAA,EAC1B;AASA,EAAA,SAAS,MAAA,CACP,IACA,KAAA,EACuC;AACvC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,gBAAA,CAAiB,EAAA,EAAI,WAAW,SAAS,CAAA;AACjE,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,IAAA,GAAO,OAAO,QAAA,EAAS;AAC3B,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,EAAa,MAAA,IAAU,CAAA;AACxC,MAAA,IAAI,aAAa,GAAA,EAAK,OAAO,EAAE,IAAA,EAAM,QAAQ,SAAA,EAAU;AACvD,MAAA,SAAA,IAAa,GAAA;AACb,MAAA,IAAA,GAAO,OAAO,QAAA,EAAS;AAAA,IACzB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAiBA,EAAA,OAAO;AAAA,IACL,UAAU,EAAA,EAAI;AACZ,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,MAAMA,MAAK,GAAA,CAAI,OAAA;AACf,QAAA,IAAI,CAACA,GAAAA,EAAI;AACT,QAAA,EAAA,CAAG,EAAE,MAAMA,GAAAA,CAAG,WAAA,IAAe,IAAI,UAAA,EAAY,UAAA,CAAWA,GAAE,CAAA,EAAG,CAAA;AAAA,MAC/D,CAAA;AACA,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxC,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxC,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxC,UAAA,GAAA,CAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,QAC1C;AAAA,MACF,CAAA;AAAA,IACF,CAAA;AAAA,IACA,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa;AACpC,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,CAAC,EAAA,EAAI;AAMT,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,EAAI,KAAK,CAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,EAAI,GAAG,CAAA;AACzB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,WAAW,CAAA;AAEpD,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,QAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACrC,QAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,MAAM,CAAA;AAC/B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,MAC3B,CAAA,MAAO;AAEL,QAAA,EAAA,CAAG,OAAO,QAAQ,CAAA;AAAA,MACpB;AAIA,MAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,QAAA,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AACxC,QAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,QAAA,GAAA,CAAI,eAAA,EAAgB;AACpB,QAAA,GAAA,CAAI,SAAS,KAAK,CAAA;AAAA,MACpB;AAEA,MAAA,EAAA,CAAG,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACtD,MAAA,EAAA,CAAG,KAAA,EAAM;AAAA,IACX,CAAA;AAAA,IACA,aAAA,GAAgB;AACd,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,OAAO,EAAA,GAAK,EAAA,CAAG,qBAAA,EAAsB,GAAI,IAAA;AAAA,IAC3C,CAAA;AAAA,IACA,MAAM,OAAA,EAAS;AACb,MAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAqB;AAC/B,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG;AACd,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,QACpB;AAAA,MACF,CAAA;AACA,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,EAAA,EAAI,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,EAAmB,CAAA;AAC1D,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,mBAAA,CAAoB,SAAA,EAAW,EAAmB,CAAA;AAAA,MACjE,CAAA;AAAA,IACF;AAAA,GACF;AACF;AAiBO,SAAS,kBAAkB,IAAA,EAKN;AAC1B,EAAA,IAAI,QAAA,GAAuE,IAAA;AAC3E,EAAA,IAAI,UAAA,GAAqD,IAAA;AAEzD,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,CAAU,OAAA;AAC1B,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,UAAA,SAAmB,MAAM;AAAA,IAAC,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAqB;AAC/B,MAAA,IAAI,UAAA,IAAc,UAAA,CAAW,CAAC,CAAA,EAAG;AAC/B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,EAAA,CAAG,gBAAA,CAAiB,WAAW,EAAE,CAAA;AACjC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,SAAA,EAAW,EAAE,CAAA;AAAA,EACnD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,EAAO;AACZ,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,UAAU,EAAA,EAAI;AACZ,MAAA,QAAA,GAAW,EAAA;AACX,MAAA,OAAO,MAAM;AACX,QAAA,IAAI,QAAA,KAAa,IAAI,QAAA,GAAW,IAAA;AAAA,MAClC,CAAA;AAAA,IACF,CAAA;AAAA,IACA,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa;AACpC,MAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,GAAA,EAAK,WAAW,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,aAAA,GAAgB;AACd,MAAA,MAAM,EAAA,GAAK,KAAK,SAAA,CAAU,OAAA;AAC1B,MAAA,OAAO,EAAA,GAAK,EAAA,CAAG,qBAAA,EAAsB,GAAI,IAAA;AAAA,IAC3C,CAAA;AAAA,IACA,MAAM,OAAA,EAAS;AACb,MAAA,UAAA,GAAa,OAAA;AACb,MAAA,MAAM,YAAY,UAAA,EAAW;AAC7B,MAAA,OAAO,MAAM;AACX,QAAA,IAAI,UAAA,KAAe,SAAS,UAAA,GAAa,IAAA;AACzC,QAAA,SAAA,EAAU;AAAA,MACZ,CAAA;AAAA,IACF;AAAA,GACF;AACF","file":"chunk-NBIRHOM6.js","sourcesContent":["import {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { isRtl } from \"../../utils/direction\";\n\n/**\n * InputTag — attach a `/`-style or `@`-style autocomplete picker to *any*\n * text surface (a `<textarea>`, an `<input>`, a `contenteditable`, a code\n * editor, a sheet cell editor, a whiteboard sticky note…) via an adapter\n * that abstracts the surface's read/write/caret API.\n *\n * The component is \"headless\" in the sense that it has no input of its\n * own — it floats a small picker menu near the surface and writes back\n * through the adapter when the user picks an item.\n *\n * <textarea ref={ref} value={text} onChange={...} />\n * <InputTag\n * adapter={textareaAdapter(ref)}\n * triggers={{\n * \"/\": { items: commands, insert: (c) => `${c.name} ` },\n * \"@\": { items: mentions, insert: (m) => `@${m.name} ` },\n * }}\n * />\n *\n * For non-DOM surfaces, write a small adapter that conforms to\n * {@link InputTagAdapter}. Adapters typically run 20–40 lines.\n */\n\n/** What the surface tells the picker on every text/caret change. */\nexport type InputTagAdapterState = {\n text: string;\n caretIndex: number;\n};\n\n/**\n * The contract every input surface implements. The picker subscribes to\n * state changes, anchors itself using `getAnchorRect`, intercepts\n * navigation keys via `onKey`, and writes the selected item back through\n * `replaceRange`.\n */\nexport type InputTagAdapter = {\n /** Push current state whenever text or caret changes. Returns an unsubscribe. */\n subscribe: (fn: (state: InputTagAdapterState) => void) => () => void;\n /** Replace text in `[start, end)` with `replacement`. The adapter is\n * responsible for moving the caret to the end of the inserted text. */\n replaceRange: (start: number, end: number, replacement: string) => void;\n /** Screen-space rect to anchor the picker against. Usually the surface's\n * bounding rect; for editors that can compute caret-precise coordinates,\n * return a small rect there instead. */\n getAnchorRect: () => DOMRect | null;\n /** Subscribe to keydown events on the surface. The handler may return\n * `true` to consume the event (the adapter then calls\n * `preventDefault` / `stopPropagation`). Returns an unsubscribe. */\n onKey: (handler: (e: KeyboardEvent) => boolean) => () => void;\n};\n\n/**\n * Per-trigger configuration. `T` is the item shape — typically a\n * `{ id, name, ... }` object, but any shape works as long as `keyOf` /\n * `insert` know how to handle it.\n */\nexport type InputTagTrigger<T> = {\n /** The pool the picker filters against. */\n items: T[];\n /** Text inserted in place of `<triggerChar><query>`. */\n insert: (item: T, query: string) => string;\n /** Custom filter. Default: case-insensitive prefix match against\n * `String(keyOf(item))`. Pass `() => true` to disable filtering and\n * rely on `items` being pre-filtered (e.g. from an async source). */\n filter?: (item: T, query: string) => boolean;\n /** How to render each row. Default renders the result of `keyOf(item)`. */\n render?: (item: T, active: boolean) => ReactNode;\n /** How to derive a stable key + default label for each item. Default\n * reads `item.name` then `item.id` then `String(item)`. */\n keyOf?: (item: T) => string;\n /** Optional header label shown above the list. */\n label?: string;\n};\n\nexport type InputTagTriggers = Record<string, InputTagTrigger<any>>;\n\nexport interface InputTagProps {\n adapter: InputTagAdapter;\n triggers: InputTagTriggers;\n /** Max rows shown. Default 8. */\n maxItems?: number;\n /**\n * Where the picker anchors relative to the surface. `*-start` / `*-end`\n * follow the writing direction (`start` is the right edge in RTL);\n * `*-left` / `*-right` are physical. Default `\"bottom-start\"`.\n */\n placement?:\n | \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\"\n | \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n /** Custom class for the popover container. */\n className?: string;\n /** Inline style for the popover container. */\n style?: CSSProperties;\n /** Fires whenever an item is picked. */\n onPick?: (info: { triggerChar: string; query: string; item: unknown }) => void;\n};\n\ntype ActiveTrigger = {\n char: string;\n start: number;\n end: number;\n query: string;\n};\n\nfunction defaultKeyOf(item: unknown): string {\n if (item && typeof item === \"object\") {\n const r = item as Record<string, unknown>;\n if (typeof r.name === \"string\") return r.name;\n if (typeof r.id === \"string\") return r.id;\n }\n return String(item);\n}\n\nfunction defaultFilter(item: unknown, query: string): boolean {\n if (!query) return true;\n return defaultKeyOf(item).toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * Walk back from `caret` to detect an active trigger. A trigger is active\n * when one of the configured characters appears between `caret` and the\n * nearest preceding whitespace (or start-of-text), with no other\n * non-trigger-non-whitespace breaks. The \"query\" is everything after\n * the trigger up to the caret.\n */\nfunction detectTrigger(\n text: string,\n caret: number,\n triggerChars: Set<string>,\n): ActiveTrigger | null {\n for (let i = caret - 1; i >= 0; i--) {\n const ch = text[i];\n if (ch === undefined) break;\n if (triggerChars.has(ch)) {\n // Must be at a word boundary: start of text OR preceded by whitespace.\n if (i === 0 || /\\s/.test(text[i - 1])) {\n return {\n char: ch,\n start: i,\n end: caret,\n query: text.slice(i + 1, caret),\n };\n }\n return null;\n }\n if (/\\s/.test(ch)) return null;\n }\n return null;\n}\n\nexport function InputTag({\n adapter,\n triggers,\n maxItems = 8,\n placement = \"bottom-start\",\n className,\n style,\n onPick,\n}: InputTagProps) {\n const triggerChars = useMemo(() => new Set(Object.keys(triggers)), [triggers]);\n const [active, setActive] = useState<ActiveTrigger | null>(null);\n const [cursor, setCursor] = useState(0);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n // The picker's own resolved direction, read before paint: it renders in\n // place, so it inherits the surface's `dir`.\n const popRef = useRef<HTMLDivElement | null>(null);\n const [rtl, setRtl] = useState(false);\n\n // Latest state in refs so key handlers see fresh data without re-registering.\n const stateRef = useRef<InputTagAdapterState>({ text: \"\", caretIndex: 0 });\n const activeRef = useRef<ActiveTrigger | null>(null);\n const cursorRef = useRef(0);\n activeRef.current = active;\n cursorRef.current = cursor;\n\n // Filtered items for the active trigger.\n const items: unknown[] = useMemo(() => {\n if (!active) return [];\n const cfg = triggers[active.char];\n if (!cfg) return [];\n const filter = cfg.filter ?? defaultFilter;\n const out: unknown[] = [];\n for (const item of cfg.items) {\n if (filter(item, active.query)) out.push(item);\n if (out.length >= maxItems) break;\n }\n return out;\n }, [active, triggers, maxItems]);\n\n // Subscribe to text/caret changes.\n useEffect(() => {\n return adapter.subscribe((s) => {\n stateRef.current = s;\n const next = detectTrigger(s.text, s.caretIndex, triggerChars);\n setActive((prev) => {\n // Reset cursor when the trigger char or position changes.\n if (!prev || !next || prev.char !== next.char || prev.start !== next.start) {\n setCursor(0);\n }\n return next;\n });\n if (next) setAnchorRect(adapter.getAnchorRect());\n });\n }, [adapter, triggerChars]);\n\n // Refresh anchor rect on scroll/resize while picker is open.\n useLayoutEffect(() => {\n if (!active) return;\n const update = () => setAnchorRect(adapter.getAnchorRect());\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [active, adapter]);\n\n // Clamp cursor when the visible items shrink.\n useEffect(() => {\n if (cursor >= items.length) setCursor(Math.max(0, items.length - 1));\n }, [items.length, cursor]);\n\n const pickItem = useCallback(\n (item: unknown) => {\n const cur = activeRef.current;\n if (!cur) return;\n const cfg = triggers[cur.char];\n if (!cfg) return;\n const replacement = cfg.insert(item, cur.query);\n adapter.replaceRange(cur.start, cur.end, replacement);\n onPick?.({ triggerChar: cur.char, query: cur.query, item });\n setActive(null);\n },\n [adapter, triggers, onPick],\n );\n\n // Key handling.\n useEffect(() => {\n return adapter.onKey((e) => {\n const cur = activeRef.current;\n if (!cur) return false;\n const visible = items;\n switch (e.key) {\n case \"ArrowDown\":\n if (visible.length === 0) return false;\n setCursor((c) => (c + 1) % visible.length);\n return true;\n case \"ArrowUp\":\n if (visible.length === 0) return false;\n setCursor((c) => (c - 1 + visible.length) % visible.length);\n return true;\n case \"Enter\":\n case \"Tab\": {\n if (visible.length === 0) return false;\n // Confirming an IME composition is not a pick; let the editor have it.\n if (e.key === \"Enter\" && isImeComposing(e)) return false;\n const idx = Math.min(cursorRef.current, visible.length - 1);\n pickItem(visible[idx]);\n return true;\n }\n case \"Escape\":\n setActive(null);\n return true;\n default:\n return false;\n }\n });\n }, [adapter, items, pickItem]);\n\n useLayoutEffect(() => {\n if (popRef.current) setRtl(isRtl(popRef.current));\n });\n\n if (!active || !anchorRect || items.length === 0) return null;\n\n const cfg = triggers[active.char];\n if (!cfg) return null;\n\n const popStyle = computePopoverStyle(anchorRect, logicalToPhysical(placement, rtl));\n\n return (\n <div\n ref={popRef}\n role=\"listbox\"\n aria-label={cfg.label ?? `Pick a ${active.char === \"/\" ? \"command\" : \"mention\"}`}\n className={[\n \"fixed z-50 w-72 overflow-hidden rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ ...popStyle, ...style }}\n >\n {(cfg.label || active.query) && (\n <div className=\"flex items-center justify-between border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:border-zinc-800 dark:bg-zinc-950\">\n <span>{cfg.label ?? labelForChar(active.char)}</span>\n {active.query && (\n <span className=\"font-mono text-[10px] normal-case tracking-normal text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\">\n {active.char}\n {active.query}\n </span>\n )}\n </div>\n )}\n <ul className=\"max-h-60 overflow-y-auto\">\n {items.map((item, i) => {\n const renderer = cfg.render ?? ((it: unknown) => <span>{defaultKeyOf(it)}</span>);\n const active2 = i === cursor;\n const key = (cfg.keyOf ?? defaultKeyOf)(item);\n return (\n <li\n key={key}\n role=\"option\"\n aria-selected={active2}\n onMouseDown={(e) => {\n e.preventDefault();\n pickItem(item);\n }}\n onMouseEnter={() => setCursor(i)}\n className={[\n \"cursor-pointer px-2 py-1.5 text-[12px]\",\n active2\n ? \"bg-violet-100 dark:bg-violet-900/30\"\n : \"hover:bg-zinc-50 dark:hover:bg-zinc-800\",\n ].join(\" \")}\n >\n {renderer(item, active2)}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\nfunction labelForChar(ch: string): string {\n if (ch === \"/\") return \"Commands\";\n if (ch === \"@\") return \"Mentions\";\n if (ch === \"#\") return \"Tags\";\n if (ch === \":\") return \"Emoji\";\n return `Trigger ${ch}`;\n}\n\ntype PhysicalPlacement = \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n\n/** `start` is the left edge in LTR and the right edge in RTL. */\nfunction logicalToPhysical(\n placement: NonNullable<InputTagProps[\"placement\"]>,\n rtl: boolean,\n): PhysicalPlacement {\n const [block, inline] = placement.split(\"-\") as [\"top\" | \"bottom\", string];\n if (inline === \"start\") return `${block}-${rtl ? \"right\" : \"left\"}`;\n if (inline === \"end\") return `${block}-${rtl ? \"left\" : \"right\"}`;\n return placement as PhysicalPlacement;\n}\n\nfunction computePopoverStyle(\n anchor: DOMRect,\n placement: PhysicalPlacement,\n): CSSProperties {\n const offset = 4;\n switch (placement) {\n case \"bottom-right\":\n return { top: anchor.bottom + offset, right: window.innerWidth - anchor.right };\n case \"top-left\":\n return { bottom: window.innerHeight - anchor.top + offset, left: anchor.left };\n case \"top-right\":\n return { bottom: window.innerHeight - anchor.top + offset, right: window.innerWidth - anchor.right };\n case \"bottom-left\":\n default:\n return { top: anchor.bottom + offset, left: anchor.left };\n }\n}\n","import type { RefObject } from \"react\";\nimport type { InputTagAdapter } from \"./InputTag\";\n\n/**\n * Built-in DOM adapters. Each one wraps a familiar input element and\n * exposes the {@link InputTagAdapter} contract so `<InputTag>` can\n * attach to it. For non-DOM surfaces (code editor, sheet cell editor,\n * whiteboard sticky note), write your own — the contract is small.\n */\n\n/**\n * Get React's monkey-patched-aside native value setter on a DOM\n * element. Required when programmatically updating `value` on a\n * controlled input: React's intercepted setter would otherwise swallow\n * the change and the consumer's `onChange` would never fire.\n */\nfunction nativeValueSetter(el: HTMLInputElement | HTMLTextAreaElement): ((v: string) => void) | null {\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n const desc = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (!desc?.set) return null;\n return desc.set.bind(el);\n}\n\nfunction replaceInValueElement(\n el: HTMLInputElement | HTMLTextAreaElement,\n start: number,\n end: number,\n replacement: string,\n): void {\n const current = el.value;\n const next = current.slice(0, start) + replacement + current.slice(end);\n const setter = nativeValueSetter(el);\n if (setter) {\n setter(next);\n } else {\n el.value = next;\n }\n // Dispatch a native `input` event so any controlled-component\n // onChange handler upstream gets the new value.\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n // Place caret at the end of the inserted text.\n const caret = start + replacement.length;\n el.setSelectionRange(caret, caret);\n el.focus();\n}\n\nfunction valueElementAdapter(\n ref: RefObject<HTMLTextAreaElement | HTMLInputElement | null>,\n): InputTagAdapter {\n return {\n subscribe(fn) {\n const handler = () => {\n const el = ref.current;\n if (!el) return;\n fn({\n text: el.value,\n caretIndex: el.selectionStart ?? el.value.length,\n });\n };\n const el = ref.current;\n if (el) {\n el.addEventListener(\"input\", handler);\n el.addEventListener(\"click\", handler);\n el.addEventListener(\"keyup\", handler);\n el.addEventListener(\"focus\", handler);\n }\n return () => {\n const el2 = ref.current;\n if (el2) {\n el2.removeEventListener(\"input\", handler);\n el2.removeEventListener(\"click\", handler);\n el2.removeEventListener(\"keyup\", handler);\n el2.removeEventListener(\"focus\", handler);\n }\n };\n },\n replaceRange(start, end, replacement) {\n const el = ref.current;\n if (!el) return;\n replaceInValueElement(el, start, end, replacement);\n },\n getAnchorRect() {\n const el = ref.current;\n return el ? el.getBoundingClientRect() : null;\n },\n onKey(handler) {\n const fn = (e: KeyboardEvent) => {\n if (handler(e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n const el = ref.current;\n if (el) el.addEventListener(\"keydown\", fn as EventListener);\n return () => {\n const el2 = ref.current;\n if (el2) el2.removeEventListener(\"keydown\", fn as EventListener);\n };\n },\n };\n}\n\n/**\n * Adapter for a DOM `<textarea>`. Works whether the consumer manages\n * `value` via React state (controlled) or lets the DOM hold it\n * (uncontrolled) — `replaceRange` uses React's native value setter and\n * dispatches a native `input` event so the upstream onChange fires.\n */\nexport function textareaAdapter(\n ref: RefObject<HTMLTextAreaElement | null>,\n): InputTagAdapter {\n return valueElementAdapter(ref);\n}\n\n/** Adapter for a DOM `<input type=\"text|search|...\">`. */\nexport function inputAdapter(\n ref: RefObject<HTMLInputElement | null>,\n): InputTagAdapter {\n return valueElementAdapter(ref);\n}\n\n/**\n * Adapter for any `contenteditable` element. Operates on the element's\n * `textContent`; rich-text editors with their own internal model should\n * write a custom adapter that talks to that model instead.\n */\nexport function contentEditableAdapter(\n ref: RefObject<HTMLElement | null>,\n): InputTagAdapter {\n function caretIndex(el: HTMLElement): number {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return 0;\n const range = sel.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setEnd(sel.focusNode!, sel.focusOffset);\n return range.toString().length;\n }\n /**\n * Resolve an index into the element's visible text to a position inside the\n * text node that actually holds it. Returns null when the index is past the\n * end, or when there is no text node at all (an empty editable).\n *\n * This is the single walk that `setCaret` and `replaceRange` share. They used\n * to disagree: `setCaret` walked, `replaceRange` went through `textContent`.\n */\n function locate(\n el: HTMLElement,\n index: number,\n ): { node: Text; offset: number } | null {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n let remaining = index;\n let node = walker.nextNode() as Text | null;\n while (node) {\n const len = node.textContent?.length ?? 0;\n if (remaining <= len) return { node, offset: remaining };\n remaining -= len;\n node = walker.nextNode() as Text | null;\n }\n return null;\n }\n function setCaret(el: HTMLElement, index: number): void {\n const sel = window.getSelection();\n if (!sel) return;\n const at = locate(el, index);\n const range = document.createRange();\n if (at) {\n range.setStart(at.node, at.offset);\n range.collapse(true);\n } else {\n // Past end (or nothing to walk): place at end.\n range.selectNodeContents(el);\n range.collapse(false);\n }\n sel.removeAllRanges();\n sel.addRange(range);\n }\n return {\n subscribe(fn) {\n const handler = () => {\n const el = ref.current;\n if (!el) return;\n fn({ text: el.textContent ?? \"\", caretIndex: caretIndex(el) });\n };\n const el = ref.current;\n if (el) {\n el.addEventListener(\"input\", handler);\n el.addEventListener(\"click\", handler);\n el.addEventListener(\"keyup\", handler);\n el.addEventListener(\"focus\", handler);\n }\n return () => {\n const el2 = ref.current;\n if (el2) {\n el2.removeEventListener(\"input\", handler);\n el2.removeEventListener(\"click\", handler);\n el2.removeEventListener(\"keyup\", handler);\n el2.removeEventListener(\"focus\", handler);\n }\n };\n },\n replaceRange(start, end, replacement) {\n const el = ref.current;\n if (!el) return;\n\n // Edit through a Range rather than rewriting `textContent`. Assigning\n // `textContent` destroys EVERY element child, so a host that renders a\n // resolved tag as a pill could only ever insert one: the next insert\n // flattened the first away. A Range touches nothing outside itself.\n const from = locate(el, start);\n const to = locate(el, end);\n const inserted = document.createTextNode(replacement);\n\n if (from && to) {\n const range = document.createRange();\n range.setStart(from.node, from.offset);\n range.setEnd(to.node, to.offset);\n range.deleteContents();\n range.insertNode(inserted);\n } else {\n // Past the end, or an empty editable with no text node to address.\n el.append(inserted);\n }\n\n // Anchor the caret on the node just written instead of re-deriving an\n // index: the text offsets have moved, and the node has not.\n const sel = window.getSelection();\n if (sel) {\n const after = document.createRange();\n after.setStart(inserted, inserted.length);\n after.collapse(true);\n sel.removeAllRanges();\n sel.addRange(after);\n }\n\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.focus();\n },\n getAnchorRect() {\n const el = ref.current;\n return el ? el.getBoundingClientRect() : null;\n },\n onKey(handler) {\n const fn = (e: KeyboardEvent) => {\n if (handler(e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n const el = ref.current;\n if (el) el.addEventListener(\"keydown\", fn as EventListener);\n return () => {\n const el2 = ref.current;\n if (el2) el2.removeEventListener(\"keydown\", fn as EventListener);\n };\n },\n };\n}\n\n/**\n * Adapter for hosts that fully control the text state themselves. Use\n * this when you can't (or don't want to) let the DOM be the source of\n * truth — for code editors with internal state, sheet cell editors, or\n * any host that already has `value` + `onChange` and wants to reach the\n * picker programmatically.\n *\n * The host calls `notify({ text, caretIndex })` after every text or\n * caret change. `<InputTag>` calls `onReplaceRange` to write back.\n */\nexport type ControlledAdapterHandle = InputTagAdapter & {\n /** Push the latest text + caret to the picker. */\n notify: (state: { text: string; caretIndex: number }) => void;\n};\n\nexport function controlledAdapter(opts: {\n /** Element used as anchor + key target. Usually the visible input. */\n anchorRef: RefObject<HTMLElement | null>;\n /** Called when the picker writes back an insertion. */\n onReplaceRange: (start: number, end: number, replacement: string) => void;\n}): ControlledAdapterHandle {\n let listener: ((s: { text: string; caretIndex: number }) => void) | null = null;\n let keyHandler: ((e: KeyboardEvent) => boolean) | null = null;\n\n const installKey = () => {\n const el = opts.anchorRef.current;\n if (!el || !keyHandler) return () => {};\n const fn = (e: KeyboardEvent) => {\n if (keyHandler && keyHandler(e)) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n el.addEventListener(\"keydown\", fn);\n return () => el.removeEventListener(\"keydown\", fn);\n };\n\n return {\n notify(state) {\n listener?.(state);\n },\n subscribe(fn) {\n listener = fn;\n return () => {\n if (listener === fn) listener = null;\n };\n },\n replaceRange(start, end, replacement) {\n opts.onReplaceRange(start, end, replacement);\n },\n getAnchorRect() {\n const el = opts.anchorRef.current;\n return el ? el.getBoundingClientRect() : null;\n },\n onKey(handler) {\n keyHandler = handler;\n const uninstall = installKey();\n return () => {\n if (keyHandler === handler) keyHandler = null;\n uninstall();\n };\n },\n };\n}\n"]}
@@ -82,7 +82,7 @@ var Avatar = react.forwardRef(
82
82
  "span",
83
83
  {
84
84
  className: chunkZU5Q77OT_cjs.cn(
85
- "font-medium text-zinc-600 dark:text-zinc-300 select-none",
85
+ "font-medium text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] select-none",
86
86
  fallbackTextSize[size]
87
87
  ),
88
88
  children: fallback
@@ -106,5 +106,5 @@ var Avatar = react.forwardRef(
106
106
  Avatar.displayName = "Avatar";
107
107
 
108
108
  exports.Avatar = Avatar;
109
- //# sourceMappingURL=chunk-FY2WDVKF.cjs.map
110
- //# sourceMappingURL=chunk-FY2WDVKF.cjs.map
109
+ //# sourceMappingURL=chunk-ND2T3PMH.cjs.map
110
+ //# sourceMappingURL=chunk-ND2T3PMH.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["forwardRef","jsxs","cn","jsx"],"mappings":";;;;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,WAAA,EAAa;AAAA;AACf,CAAA;AAKA,IAAM,oBAAA,GAAmD;AAAA,EACvD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,gBAAA,GAA+C;AAAA,EACnD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,kBAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,MAAA,GAASA,gBAAA;AAAA,EACpB,CACE;AAAA,IACE,GAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA,IAAQ,IAAA;AAC/C,IAAA,uBACEC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,yBAAA,EAAwB,EAAA;AAAA,QACxB,SAAA,EAAWC,oBAAA;AAAA,UACT,+DAAA;AAAA,UACA,qBAAqB,IAAI,CAAA;AAAA,UACzB,CAAC,GAAA,IAAO,qHAAA;AAAA,UACR;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,8BAAA,EAA8B,OAAA;AAAA,cAC9B,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,EAAE,cAAA,EAAgB,UAAA,CAAW,OAAO,CAAA;AAAE;AAAA,WAC/C;AAAA,UAED,GAAA,mBACCA,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,GAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ,mBAEAA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWD,oBAAA;AAAA,gBACT,0DAAA;AAAA,gBACA,iBAAiB,IAAI;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAED,MAAA,oBACCC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWD,oBAAA;AAAA,gBACT,oKAAA;AAAA,gBACA,kBAAkB,IAAI,CAAA;AAAA,gBACtB,mBAAmB,MAAM;AAAA;AAC3B;AAAA;AACF;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-FY2WDVKF.cjs","sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { AvatarProps } from \"./Avatar.types\";\n\nconst glowColors = {\n on: \"#a855f7\", // violet — neutral\n xp: \"#22c55e\", // green\n achievement: \"#f59e0b\", // amber\n} as const;\n\ntype AvatarSize = NonNullable<AvatarProps[\"size\"]>;\ntype AvatarStatus = NonNullable<AvatarProps[\"status\"]>;\n\nconst containerSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-6 w-6\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n\nconst fallbackTextSize: Record<AvatarSize, string> = {\n xs: \"text-xs\",\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n xl: \"text-lg\",\n};\n\nconst statusSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-1.5 w-1.5\",\n sm: \"h-2 w-2\",\n md: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n xl: \"h-4 w-4\",\n};\n\nconst statusColorClasses: Record<AvatarStatus, string> = {\n online: \"bg-green-500\",\n offline: \"bg-zinc-400\",\n busy: \"bg-red-500\",\n away: \"bg-amber-500\",\n};\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n src,\n alt = \"\",\n fallback,\n size = \"md\",\n status,\n glow,\n className,\n },\n ref,\n ) => {\n const glowKey = glow === true ? \"on\" : glow || null;\n return (\n <div\n ref={ref}\n data-react-fancy-avatar=\"\"\n className={cn(\n \"relative inline-flex items-center justify-center rounded-full\",\n containerSizeClasses[size],\n !src && \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {glowKey && (\n <span\n aria-hidden\n data-react-fancy-avatar-glow={glowKey}\n className=\"fancy-avatar-glow\"\n style={{ \"--fancy-glow\": glowColors[glowKey] } as CSSProperties}\n />\n )}\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n <span\n className={cn(\n \"font-medium text-zinc-600 dark:text-zinc-300 select-none\",\n fallbackTextSize[size],\n )}\n >\n {fallback}\n </span>\n )}\n {status && (\n <span\n className={cn(\n \"absolute bottom-0 end-0 rounded-full ring-2 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n statusSizeClasses[size],\n statusColorClasses[status],\n )}\n />\n )}\n </div>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n"]}
1
+ {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["forwardRef","jsxs","cn","jsx"],"mappings":";;;;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,WAAA,EAAa;AAAA;AACf,CAAA;AAKA,IAAM,oBAAA,GAAmD;AAAA,EACvD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,gBAAA,GAA+C;AAAA,EACnD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,kBAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,MAAA,GAASA,gBAAA;AAAA,EACpB,CACE;AAAA,IACE,GAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA,IAAQ,IAAA;AAC/C,IAAA,uBACEC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,yBAAA,EAAwB,EAAA;AAAA,QACxB,SAAA,EAAWC,oBAAA;AAAA,UACT,+DAAA;AAAA,UACA,qBAAqB,IAAI,CAAA;AAAA,UACzB,CAAC,GAAA,IAAO,qHAAA;AAAA,UACR;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,8BAAA,EAA8B,OAAA;AAAA,cAC9B,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,EAAE,cAAA,EAAgB,UAAA,CAAW,OAAO,CAAA;AAAE;AAAA,WAC/C;AAAA,UAED,GAAA,mBACCA,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,GAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ,mBAEAA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWD,oBAAA;AAAA,gBACT,uJAAA;AAAA,gBACA,iBAAiB,IAAI;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAED,MAAA,oBACCC,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWD,oBAAA;AAAA,gBACT,oKAAA;AAAA,gBACA,kBAAkB,IAAI,CAAA;AAAA,gBACtB,mBAAmB,MAAM;AAAA;AAC3B;AAAA;AACF;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-ND2T3PMH.cjs","sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { AvatarProps } from \"./Avatar.types\";\n\nconst glowColors = {\n on: \"#a855f7\", // violet — neutral\n xp: \"#22c55e\", // green\n achievement: \"#f59e0b\", // amber\n} as const;\n\ntype AvatarSize = NonNullable<AvatarProps[\"size\"]>;\ntype AvatarStatus = NonNullable<AvatarProps[\"status\"]>;\n\nconst containerSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-6 w-6\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n\nconst fallbackTextSize: Record<AvatarSize, string> = {\n xs: \"text-xs\",\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n xl: \"text-lg\",\n};\n\nconst statusSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-1.5 w-1.5\",\n sm: \"h-2 w-2\",\n md: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n xl: \"h-4 w-4\",\n};\n\nconst statusColorClasses: Record<AvatarStatus, string> = {\n online: \"bg-green-500\",\n offline: \"bg-zinc-400\",\n busy: \"bg-red-500\",\n away: \"bg-amber-500\",\n};\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n src,\n alt = \"\",\n fallback,\n size = \"md\",\n status,\n glow,\n className,\n },\n ref,\n ) => {\n const glowKey = glow === true ? \"on\" : glow || null;\n return (\n <div\n ref={ref}\n data-react-fancy-avatar=\"\"\n className={cn(\n \"relative inline-flex items-center justify-center rounded-full\",\n containerSizeClasses[size],\n !src && \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {glowKey && (\n <span\n aria-hidden\n data-react-fancy-avatar-glow={glowKey}\n className=\"fancy-avatar-glow\"\n style={{ \"--fancy-glow\": glowColors[glowKey] } as CSSProperties}\n />\n )}\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n <span\n className={cn(\n \"font-medium text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] select-none\",\n fallbackTextSize[size],\n )}\n >\n {fallback}\n </span>\n )}\n {status && (\n <span\n className={cn(\n \"absolute bottom-0 end-0 rounded-full ring-2 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n statusSizeClasses[size],\n statusColorClasses[status],\n )}\n />\n )}\n </div>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n"]}
@@ -811,8 +811,8 @@ var BooleanTimeGrid = react.forwardRef(
811
811
  style: { width: cellWidth },
812
812
  "data-react-fancy-timegrid-col": c,
813
813
  className: chunkZU5Q77OT_cjs.cn(
814
- "text-zinc-400",
815
- toggleStripsOnHeaderClick && "cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-200"
814
+ "text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]",
815
+ toggleStripsOnHeaderClick && "cursor-pointer hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
816
816
  ),
817
817
  children: sparseColLabels ? c % colStep === 0 ? label : "" : label
818
818
  },
@@ -826,8 +826,8 @@ var BooleanTimeGrid = react.forwardRef(
826
826
  onClick: () => toggleRow(r),
827
827
  "data-react-fancy-timegrid-row": r,
828
828
  className: chunkZU5Q77OT_cjs.cn(
829
- "pe-1 text-end font-medium text-zinc-500",
830
- toggleStripsOnHeaderClick && "cursor-pointer hover:text-zinc-800 dark:hover:text-zinc-200"
829
+ "pe-1 text-end font-medium text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]",
830
+ toggleStripsOnHeaderClick && "cursor-pointer hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
831
831
  ),
832
832
  children: label
833
833
  }
@@ -865,5 +865,5 @@ TimeGrid.displayName = "TimeGrid";
865
865
  BooleanTimeGrid.displayName = "BooleanTimeGrid";
866
866
 
867
867
  exports.TimeGrid = TimeGrid;
868
- //# sourceMappingURL=chunk-GE2ZGE3A.cjs.map
869
- //# sourceMappingURL=chunk-GE2ZGE3A.cjs.map
868
+ //# sourceMappingURL=chunk-O23KGVXS.cjs.map
869
+ //# sourceMappingURL=chunk-O23KGVXS.cjs.map