@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
package/CHANGELOG.md CHANGED
@@ -11,6 +11,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [6.12.0] - 2026-11-07
15
+
16
+ ### Changed
17
+
18
+ - **Secondary grey text follows the `--fancy-text-*` theme tokens across the kit.** 6.11.1 fixed FileUpload; the audit that followed found the same bare `text-zinc-400/500/600` on 83 lines in 44 files, which an app that maps the tokens could not reach. 80 of them now read a token, with the same fallbacks as the rest of the kit, chosen by role:
19
+ - `--fancy-text-muted` (zinc-500 / zinc-400) for secondary text, placeholders and the glyph of an icon-only control: Autocomplete loading and empty states, Select "No results found" and its chevron, Command group headings and input placeholder, chart tooltip labels and totals, HorizontalBar values, Calendar weekday headers and days outside the month, EmojiSelect, InputTag and PromptInput picker headers, MoodMeter quadrant labels, Pagination ellipsis, Table "Page x of y", boolean TimeGrid headers, ReasonTag author and "sources", FileBrowser's New folder / Cancel, and every placeholder the audit found (Command, Composer, Editor, FileBrowser filter / path / new folder, InlinePasteEditor, Pillbox, PromptInput).
20
+ - `--fancy-text-subtle` (zinc-600 / zinc-400) where muted fails AA on a tinted surface: Carousel step numbers and the MagicWand action tag (muted is 4.39:1 on zinc-100), the PromptInput attachment size (zinc-100 chip) and the command hint and mention kind on the picker's violet-100 active row (muted is about 4.1:1 there). ReasonTag's unlinked source label also uses it.
21
+ - `--fancy-text-soft` (zinc-700 / zinc-300) for hover colours, and for the Avatar initials, ChatDrawer tab numbers and ReasonTag's pinned reason, which sit on a zinc-200 / zinc-700 fill where subtle's dark value is too light.
22
+ - `--fancy-text-faint` (zinc-400 / zinc-500) for decorative glyphs and lines: Breadcrumbs and FileBrowser path separators, chart tick marks and the hover rule, the Command and FileBrowser search icons, FileBrowser's folder and spinner glyphs, the PromptInput paperclip, the TimePicker colon and the Toast default icon colour. Separators, the colon and the paperclip are now `aria-hidden`.
23
+ - VideoViewer's error message sits on a black frame in both modes, so it reads `--fancy-text-muted-dark` in both.
24
+ - The three opt-in `color="zinc"` entries in `Button.colors.ts`, `Callout.colors.ts` and `Progress.colors.ts` are a named palette and stay zinc. No token's default value changed.
25
+ - **Look different by default:** the out-of-month days in Calendar (zinc-300 / zinc-600, now muted) and the chart tick marks (zinc-300 / zinc-600, now faint) are noticeably darker in light mode and lighter in dark mode. Light-mode icon buttons (Modal, Drawer, Toast, MobileMenu close; Sidebar, ChatDrawer toggles; Calendar and TimePicker steppers; FileBrowser, Pillbox, Composer removers; the Input password reveal) step from zinc-400 to zinc-500, and placeholders listed above from zinc-400 to zinc-500. Hover colours that were zinc-600 are now zinc-700. Elsewhere the change is within one palette step.
26
+ - **Consumer action:** none, unless your app relied on these greys staying fixed while it themed `--fancy-text-*`: they now follow your tokens like the rest of the kit.
27
+
28
+ ### Fixed
29
+
30
+ - **Contrast of that text against its real surface**, for an app that sets no `--fancy-*` variable. Readable text and placeholders now reach AA (4.5:1) in light and dark, and icon-only controls 3:1 at rest (WCAG 1.4.11). Before: 2.62:1 for most `zinc-400` text and icon buttons in light mode, 3.67:1 for `zinc-500` text in dark mode (it had no `dark:` colour), 4.12:1 for the picker headers on zinc-950, 2.39:1 for the Pillbox remove button on its zinc-100 pill, and 1.48:1 for Calendar's out-of-month days. After: at least 4.62:1 for text (on the zinc-50 strips) and 4.39:1 for a control (on a zinc-100 pill). The muted token itself is unchanged, so text on a plain surface stays at 4.83:1 light / 6.75:1 dark, AA but not AAA. **Consumer action:** none.
31
+ - **The Input password reveal reaches 3:1 at rest.** It rested on the faint token (2.62:1 in light, 3.44:1 in dark); it now rests on muted and hovers to soft. **Consumer action:** none.
32
+ - A permanent test fails the build on any new bare `text-zinc-400/500/600` in `src/components` outside a token fallback or the named palettes.
33
+
14
34
  ## [6.11.1] - 2026-11-07
15
35
 
16
36
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkQMZK7SRS_cjs = require('./chunk-QMZK7SRS.cjs');
3
+ var chunkVWZCUKV5_cjs = require('./chunk-VWZCUKV5.cjs');
4
4
  require('./chunk-SNHU2AI4.cjs');
5
5
  require('./chunk-ZU5Q77OT.cjs');
6
6
 
@@ -8,27 +8,27 @@ require('./chunk-ZU5Q77OT.cjs');
8
8
 
9
9
  Object.defineProperty(exports, "AccordionPanel", {
10
10
  enumerable: true,
11
- get: function () { return chunkQMZK7SRS_cjs.AccordionPanel; }
11
+ get: function () { return chunkVWZCUKV5_cjs.AccordionPanel; }
12
12
  });
13
13
  Object.defineProperty(exports, "AccordionPanelContent", {
14
14
  enumerable: true,
15
- get: function () { return chunkQMZK7SRS_cjs.AccordionPanelContent; }
15
+ get: function () { return chunkVWZCUKV5_cjs.AccordionPanelContent; }
16
16
  });
17
17
  Object.defineProperty(exports, "AccordionPanelSection", {
18
18
  enumerable: true,
19
- get: function () { return chunkQMZK7SRS_cjs.AccordionPanelSection; }
19
+ get: function () { return chunkVWZCUKV5_cjs.AccordionPanelSection; }
20
20
  });
21
21
  Object.defineProperty(exports, "AccordionPanelTrigger", {
22
22
  enumerable: true,
23
- get: function () { return chunkQMZK7SRS_cjs.AccordionPanelTrigger; }
23
+ get: function () { return chunkVWZCUKV5_cjs.AccordionPanelTrigger; }
24
24
  });
25
25
  Object.defineProperty(exports, "useAccordionPanel", {
26
26
  enumerable: true,
27
- get: function () { return chunkQMZK7SRS_cjs.useAccordionPanel; }
27
+ get: function () { return chunkVWZCUKV5_cjs.useAccordionPanel; }
28
28
  });
29
29
  Object.defineProperty(exports, "useAccordionSection", {
30
30
  enumerable: true,
31
- get: function () { return chunkQMZK7SRS_cjs.useAccordionSection; }
31
+ get: function () { return chunkVWZCUKV5_cjs.useAccordionSection; }
32
32
  });
33
33
  //# sourceMappingURL=accordion-panel.cjs.map
34
34
  //# sourceMappingURL=accordion-panel.cjs.map
@@ -1,4 +1,4 @@
1
- export { AccordionPanel, AccordionPanelContent, AccordionPanelSection, AccordionPanelTrigger, useAccordionPanel, useAccordionSection } from './chunk-AXW55PQG.js';
1
+ export { AccordionPanel, AccordionPanelContent, AccordionPanelSection, AccordionPanelTrigger, useAccordionPanel, useAccordionSection } from './chunk-M5EKV5PK.js';
2
2
  import './chunk-EDYAXGUM.js';
3
3
  import './chunk-MMW2JGKZ.js';
4
4
  //# sourceMappingURL=accordion-panel.js.map
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunk6EPM5JG7_cjs = require('./chunk-6EPM5JG7.cjs');
3
+ var chunkQLFV2KUQ_cjs = require('./chunk-QLFV2KUQ.cjs');
4
4
  require('./chunk-ZU5Q77OT.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Accordion", {
9
9
  enumerable: true,
10
- get: function () { return chunk6EPM5JG7_cjs.Accordion; }
10
+ get: function () { return chunkQLFV2KUQ_cjs.Accordion; }
11
11
  });
12
12
  Object.defineProperty(exports, "useAccordion", {
13
13
  enumerable: true,
14
- get: function () { return chunk6EPM5JG7_cjs.useAccordion; }
14
+ get: function () { return chunkQLFV2KUQ_cjs.useAccordion; }
15
15
  });
16
16
  //# sourceMappingURL=accordion.cjs.map
17
17
  //# sourceMappingURL=accordion.cjs.map
package/dist/accordion.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Accordion, useAccordion } from './chunk-5FA6V7JF.js';
1
+ export { Accordion, useAccordion } from './chunk-B4NXPUOF.js';
2
2
  import './chunk-MMW2JGKZ.js';
3
3
  //# sourceMappingURL=accordion.js.map
4
4
  //# sourceMappingURL=accordion.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkFSLEFL4U_cjs = require('./chunk-FSLEFL4U.cjs');
3
+ var chunkRKDQ7RRL_cjs = require('./chunk-RKDQ7RRL.cjs');
4
4
  require('./chunk-6V44RRSB.cjs');
5
5
  require('./chunk-MKHYENKR.cjs');
6
6
  require('./chunk-QQKWI7QP.cjs');
@@ -17,7 +17,7 @@ require('./chunk-ZU5Q77OT.cjs');
17
17
 
18
18
  Object.defineProperty(exports, "Autocomplete", {
19
19
  enumerable: true,
20
- get: function () { return chunkFSLEFL4U_cjs.Autocomplete; }
20
+ get: function () { return chunkRKDQ7RRL_cjs.Autocomplete; }
21
21
  });
22
22
  //# sourceMappingURL=autocomplete.cjs.map
23
23
  //# sourceMappingURL=autocomplete.cjs.map
@@ -1,4 +1,4 @@
1
- export { Autocomplete } from './chunk-C2VGO375.js';
1
+ export { Autocomplete } from './chunk-EVFWX2HA.js';
2
2
  import './chunk-S42OGG43.js';
3
3
  import './chunk-5VMILVWD.js';
4
4
  import './chunk-RUEDMYBF.js';
package/dist/avatar.cjs CHANGED
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkFY2WDVKF_cjs = require('./chunk-FY2WDVKF.cjs');
3
+ var chunkND2T3PMH_cjs = require('./chunk-ND2T3PMH.cjs');
4
4
  require('./chunk-ZU5Q77OT.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Avatar", {
9
9
  enumerable: true,
10
- get: function () { return chunkFY2WDVKF_cjs.Avatar; }
10
+ get: function () { return chunkND2T3PMH_cjs.Avatar; }
11
11
  });
12
12
  //# sourceMappingURL=avatar.cjs.map
13
13
  //# sourceMappingURL=avatar.cjs.map
package/dist/avatar.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Avatar } from './chunk-LXEOBSEZ.js';
1
+ export { Avatar } from './chunk-32542ZE6.js';
2
2
  import './chunk-MMW2JGKZ.js';
3
3
  //# sourceMappingURL=avatar.js.map
4
4
  //# sourceMappingURL=avatar.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkFZQWFDUV_cjs = require('./chunk-FZQWFDUV.cjs');
3
+ var chunkBDYIKGV5_cjs = require('./chunk-BDYIKGV5.cjs');
4
4
  require('./chunk-57FQGQJK.cjs');
5
5
  require('./chunk-OUYC6EIL.cjs');
6
6
  require('./chunk-ZU5Q77OT.cjs');
@@ -9,7 +9,7 @@ require('./chunk-ZU5Q77OT.cjs');
9
9
 
10
10
  Object.defineProperty(exports, "Breadcrumbs", {
11
11
  enumerable: true,
12
- get: function () { return chunkFZQWFDUV_cjs.Breadcrumbs; }
12
+ get: function () { return chunkBDYIKGV5_cjs.Breadcrumbs; }
13
13
  });
14
14
  //# sourceMappingURL=breadcrumbs.cjs.map
15
15
  //# sourceMappingURL=breadcrumbs.cjs.map
@@ -1,4 +1,4 @@
1
- export { Breadcrumbs } from './chunk-CO2NEUFK.js';
1
+ export { Breadcrumbs } from './chunk-JUQGTTED.js';
2
2
  import './chunk-RGANGU7X.js';
3
3
  import './chunk-YX6FTJ6N.js';
4
4
  import './chunk-MMW2JGKZ.js';
package/dist/calendar.cjs CHANGED
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunk5SVZX6WF_cjs = require('./chunk-5SVZX6WF.cjs');
3
+ var chunkOLIYEZ4C_cjs = require('./chunk-OLIYEZ4C.cjs');
4
4
  require('./chunk-ZU5Q77OT.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Calendar", {
9
9
  enumerable: true,
10
- get: function () { return chunk5SVZX6WF_cjs.Calendar; }
10
+ get: function () { return chunkOLIYEZ4C_cjs.Calendar; }
11
11
  });
12
12
  //# sourceMappingURL=calendar.cjs.map
13
13
  //# sourceMappingURL=calendar.cjs.map
package/dist/calendar.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Calendar } from './chunk-I65KXHYL.js';
1
+ export { Calendar } from './chunk-F6IRLWBS.js';
2
2
  import './chunk-MMW2JGKZ.js';
3
3
  //# sourceMappingURL=calendar.js.map
4
4
  //# sourceMappingURL=calendar.js.map
package/dist/carousel.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkVOAC5OKY_cjs = require('./chunk-VOAC5OKY.cjs');
3
+ var chunkBEKJQHOX_cjs = require('./chunk-BEKJQHOX.cjs');
4
4
  require('./chunk-SNHU2AI4.cjs');
5
5
  require('./chunk-ZU5Q77OT.cjs');
6
6
 
@@ -8,27 +8,27 @@ require('./chunk-ZU5Q77OT.cjs');
8
8
 
9
9
  Object.defineProperty(exports, "Carousel", {
10
10
  enumerable: true,
11
- get: function () { return chunkVOAC5OKY_cjs.Carousel; }
11
+ get: function () { return chunkBEKJQHOX_cjs.Carousel; }
12
12
  });
13
13
  Object.defineProperty(exports, "CarouselControls", {
14
14
  enumerable: true,
15
- get: function () { return chunkVOAC5OKY_cjs.CarouselControls; }
15
+ get: function () { return chunkBEKJQHOX_cjs.CarouselControls; }
16
16
  });
17
17
  Object.defineProperty(exports, "CarouselPanels", {
18
18
  enumerable: true,
19
- get: function () { return chunkVOAC5OKY_cjs.CarouselPanels; }
19
+ get: function () { return chunkBEKJQHOX_cjs.CarouselPanels; }
20
20
  });
21
21
  Object.defineProperty(exports, "CarouselSlide", {
22
22
  enumerable: true,
23
- get: function () { return chunkVOAC5OKY_cjs.CarouselSlide; }
23
+ get: function () { return chunkBEKJQHOX_cjs.CarouselSlide; }
24
24
  });
25
25
  Object.defineProperty(exports, "CarouselSteps", {
26
26
  enumerable: true,
27
- get: function () { return chunkVOAC5OKY_cjs.CarouselSteps; }
27
+ get: function () { return chunkBEKJQHOX_cjs.CarouselSteps; }
28
28
  });
29
29
  Object.defineProperty(exports, "useCarousel", {
30
30
  enumerable: true,
31
- get: function () { return chunkVOAC5OKY_cjs.useCarousel; }
31
+ get: function () { return chunkBEKJQHOX_cjs.useCarousel; }
32
32
  });
33
33
  //# sourceMappingURL=carousel.cjs.map
34
34
  //# sourceMappingURL=carousel.cjs.map
package/dist/carousel.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Carousel, CarouselControls, CarouselPanels, CarouselSlide, CarouselSteps, useCarousel } from './chunk-KDRBUF5S.js';
1
+ export { Carousel, CarouselControls, CarouselPanels, CarouselSlide, CarouselSteps, useCarousel } from './chunk-LCBMI4WO.js';
2
2
  import './chunk-EDYAXGUM.js';
3
3
  import './chunk-MMW2JGKZ.js';
4
4
  //# sourceMappingURL=carousel.js.map
package/dist/chart.cjs CHANGED
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunk6B2GMKE4_cjs = require('./chunk-6B2GMKE4.cjs');
3
+ var chunkIJIP6MWS_cjs = require('./chunk-IJIP6MWS.cjs');
4
4
  require('./chunk-ZU5Q77OT.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Chart", {
9
9
  enumerable: true,
10
- get: function () { return chunk6B2GMKE4_cjs.Chart; }
10
+ get: function () { return chunkIJIP6MWS_cjs.Chart; }
11
11
  });
12
12
  //# sourceMappingURL=chart.cjs.map
13
13
  //# sourceMappingURL=chart.cjs.map
package/dist/chart.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Chart } from './chunk-YPYZZLZ5.js';
1
+ export { Chart } from './chunk-YMDFLW47.js';
2
2
  import './chunk-MMW2JGKZ.js';
3
3
  //# sourceMappingURL=chart.js.map
4
4
  //# sourceMappingURL=chart.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkNWP5EGSR_cjs = require('./chunk-NWP5EGSR.cjs');
3
+ var chunk2U2VQ2QF_cjs = require('./chunk-2U2VQ2QF.cjs');
4
4
  require('./chunk-AIA5UNQ5.cjs');
5
5
  require('./chunk-MXWR3T3N.cjs');
6
6
  require('./chunk-ZU5Q77OT.cjs');
@@ -9,7 +9,7 @@ require('./chunk-ZU5Q77OT.cjs');
9
9
 
10
10
  Object.defineProperty(exports, "ChatDrawer", {
11
11
  enumerable: true,
12
- get: function () { return chunkNWP5EGSR_cjs.ChatDrawer; }
12
+ get: function () { return chunk2U2VQ2QF_cjs.ChatDrawer; }
13
13
  });
14
14
  //# sourceMappingURL=chat-drawer.cjs.map
15
15
  //# sourceMappingURL=chat-drawer.cjs.map
@@ -1,4 +1,4 @@
1
- export { ChatDrawer } from './chunk-MKDTXMCE.js';
1
+ export { ChatDrawer } from './chunk-YFFW4E77.js';
2
2
  import './chunk-TJ66S5K6.js';
3
3
  import './chunk-J3A4Z2P7.js';
4
4
  import './chunk-MMW2JGKZ.js';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkRVBA4LEB_cjs = require('./chunk-RVBA4LEB.cjs');
3
+ var chunk2SO4WS2E_cjs = require('./chunk-2SO4WS2E.cjs');
4
4
  require('./chunk-S3TRSECD.cjs');
5
5
  require('./chunk-U4KUW3RK.cjs');
6
6
  require('./chunk-WOURDD4U.cjs');
7
7
  require('./chunk-2C64OVOZ.cjs');
8
- require('./chunk-FY2WDVKF.cjs');
8
+ require('./chunk-ND2T3PMH.cjs');
9
9
  require('./chunk-VBWRH4UW.cjs');
10
10
  require('./chunk-OCHUZ7J3.cjs');
11
11
  require('./chunk-X6LGRB4H.cjs');
@@ -19,11 +19,11 @@ require('./chunk-ZU5Q77OT.cjs');
19
19
 
20
20
  Object.defineProperty(exports, "ChatMessage", {
21
21
  enumerable: true,
22
- get: function () { return chunkRVBA4LEB_cjs.ChatMessage; }
22
+ get: function () { return chunk2SO4WS2E_cjs.ChatMessage; }
23
23
  });
24
24
  Object.defineProperty(exports, "ChatThread", {
25
25
  enumerable: true,
26
- get: function () { return chunkRVBA4LEB_cjs.ChatThread; }
26
+ get: function () { return chunk2SO4WS2E_cjs.ChatThread; }
27
27
  });
28
28
  //# sourceMappingURL=chat-thread.cjs.map
29
29
  //# sourceMappingURL=chat-thread.cjs.map
@@ -1,9 +1,9 @@
1
- export { ChatMessage, ChatThread } from './chunk-5NJF7SQX.js';
1
+ export { ChatMessage, ChatThread } from './chunk-D4K666OI.js';
2
2
  import './chunk-AUTW5O4W.js';
3
3
  import './chunk-ZL5QVNKG.js';
4
4
  import './chunk-7GRIO5AZ.js';
5
5
  import './chunk-I3LAFKJU.js';
6
- import './chunk-LXEOBSEZ.js';
6
+ import './chunk-32542ZE6.js';
7
7
  import './chunk-IQ4KQJAO.js';
8
8
  import './chunk-OZ4QFJ7N.js';
9
9
  import './chunk-S53A6JIE.js';
@@ -35,7 +35,7 @@ function ModalHeader({ children, className, closeLabel = "Close" }) {
35
35
  type: "button",
36
36
  onClick: close,
37
37
  "data-react-fancy-modal-close": "",
38
- 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",
38
+ 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))]",
39
39
  "aria-label": closeLabel,
40
40
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 20 })
41
41
  }
@@ -148,5 +148,5 @@ var Modal = Object.assign(ModalRoot, {
148
148
 
149
149
  exports.Modal = Modal;
150
150
  exports.useModal = useModal;
151
- //# sourceMappingURL=chunk-GB2EGMVQ.cjs.map
152
- //# sourceMappingURL=chunk-GB2EGMVQ.cjs.map
151
+ //# sourceMappingURL=chunk-2JNOPH3B.cjs.map
152
+ //# sourceMappingURL=chunk-2JNOPH3B.cjs.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":["createContext","useContext","jsxs","cn","jsx","X","useCallback","useEscapeKey","useEffect","useAnimation","useDialogFocusTrap","useMemo","Portal"],"mappings":"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","file":"chunk-2JNOPH3B.cjs","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"]}
@@ -89,7 +89,7 @@ function EmojiSelect({ value, defaultValue, onChange, placeholder = "Search emoj
89
89
  type: "button",
90
90
  className: "flex items-center gap-2 rounded-lg border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] px-3 py-2 text-sm transition-[border-color,box-shadow] duration-150 dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-input-dark,#1e1e24)]",
91
91
  onClick: () => setOpen((v) => !v),
92
- children: selected ? /* @__PURE__ */ jsx("span", { className: "text-xl", children: selected }) : /* @__PURE__ */ jsx("span", { className: "text-zinc-400", children: "Pick emoji" })
92
+ children: selected ? /* @__PURE__ */ jsx("span", { className: "text-xl", children: selected }) : /* @__PURE__ */ jsx("span", { className: "text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]", children: "Pick emoji" })
93
93
  }
94
94
  ),
95
95
  open && /* @__PURE__ */ jsxs("div", { className: "absolute z-50 mt-1 w-80 rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-white p-2 shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-800 fancy-fade-in", children: [
@@ -129,7 +129,7 @@ function EmojiSelect({ value, defaultValue, onChange, placeholder = "Search emoj
129
129
  onPick: pick
130
130
  }
131
131
  ) : /* @__PURE__ */ jsxs("div", { children: [
132
- /* @__PURE__ */ jsx("div", { className: "px-1 py-1 text-xs font-semibold uppercase text-zinc-500", children: EMOJI_DATA[activeCategory].label }),
132
+ /* @__PURE__ */ jsx("div", { className: "px-1 py-1 text-xs font-semibold uppercase text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]", children: EMOJI_DATA[activeCategory].label }),
133
133
  /* @__PURE__ */ jsx(
134
134
  EmojiGrid,
135
135
  {
@@ -286,5 +286,5 @@ function TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeav
286
286
  }
287
287
 
288
288
  export { EmojiSelect };
289
- //# sourceMappingURL=chunk-R3PCZSBQ.js.map
290
- //# sourceMappingURL=chunk-R3PCZSBQ.js.map
289
+ //# sourceMappingURL=chunk-2OCWIAGS.js.map
290
+ //# sourceMappingURL=chunk-2OCWIAGS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/EmojiSelect/EmojiSelect.tsx"],"names":[],"mappings":"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","file":"chunk-2OCWIAGS.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { EMOJI_CATEGORY_ORDER, EMOJI_DATA, type EmojiCategoryKey, type EmojiEntry } from \"../../data/emoji-data\";\nimport { applyTone, SKIN_TONES, type SkinTone } from \"../../data/emoji-utils\";\nimport type { EmojiSelectProps } from \"./EmojiSelect.types\";\n\nconst TONE_STORAGE_KEY = \"fancy:emoji-tone\";\nconst LONG_PRESS_MS = 400;\nconst HOVER_INTENT_MS = 120;\nconst HOVER_LEAVE_GRACE_MS = 220;\n\ntype ToneTarget = {\n emoji: EmojiEntry;\n rect: { left: number; top: number; width: number };\n};\n\n// Deliberately no hover-capability gate. We use `pointerType` on pointer events so touch\n// inputs never trigger the hover path (they go through long-press instead), and mouse/pen\n// inputs always work regardless of what `(hover: hover)` resolves to in the current env.\n\nfunction readStoredTone(): SkinTone | null {\n if (typeof window === \"undefined\") return null;\n try {\n const v = window.localStorage?.getItem(TONE_STORAGE_KEY);\n return (SKIN_TONES as readonly string[]).includes(v ?? \"\") ? (v as SkinTone) : null;\n } catch {\n return null;\n }\n}\n\nexport function EmojiSelect({ value, defaultValue, onChange, placeholder = \"Search emojis...\", className }: EmojiSelectProps) {\n const [selected, setSelected] = useControllableState(value, defaultValue ?? \"\", onChange);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<EmojiCategoryKey>(\"smileys\");\n const [tone, setToneState] = useState<SkinTone | null>(() => readStoredTone());\n const [toneTarget, setToneTarget] = useState<ToneTarget | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setTone = useCallback((t: SkinTone | null) => {\n setToneState(t);\n if (typeof window === \"undefined\") return;\n try {\n if (t) window.localStorage?.setItem(TONE_STORAGE_KEY, t);\n else window.localStorage?.removeItem(TONE_STORAGE_KEY);\n } catch {}\n }, []);\n\n const filtered = useMemo(() => {\n if (!query) return null;\n const lower = query.toLowerCase();\n const hits: EmojiEntry[] = [];\n for (const group of Object.values(EMOJI_DATA)) {\n for (const e of group.emojis) {\n if (e.name.includes(lower)) hits.push(e);\n }\n }\n return hits;\n }, [query]);\n\n const closePicker = useCallback(() => setToneTarget(null), []);\n\n const openPicker = useCallback((target: ToneTarget) => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n setToneTarget(target);\n }, []);\n\n const scheduleClose = useCallback(() => {\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\n leaveTimer.current = setTimeout(closePicker, HOVER_LEAVE_GRACE_MS);\n }, [closePicker]);\n\n const cancelClose = useCallback(() => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n }, []);\n\n const pick = (emoji: EmojiEntry) => {\n const char = emoji.skinTones && tone ? applyTone(emoji.char, tone) : emoji.char;\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n const pickTone = (emoji: EmojiEntry, t: SkinTone) => {\n setTone(t);\n const char = applyTone(emoji.char, t);\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n useEffect(() => {\n if (!open) closePicker();\n }, [open, closePicker]);\n\n return (\n <div className={cn(\"relative inline-block\", className)} data-react-fancy-emoji-select=\"\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] px-3 py-2 text-sm transition-[border-color,box-shadow] duration-150 dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-input-dark,#1e1e24)]\"\n onClick={() => setOpen((v) => !v)}\n >\n {selected ? <span className=\"text-xl\">{selected}</span> : <span className=\"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\">Pick emoji</span>}\n </button>\n\n {open && (\n <div className=\"absolute z-50 mt-1 w-80 rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-white p-2 shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-800 fancy-fade-in\">\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"mb-2 w-full rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1 text-sm transition-[border-color,box-shadow] duration-150 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-input-dark,#1e1e24)] dark:text-zinc-100\"\n autoFocus\n />\n\n {!query && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto border-b border-zinc-100 pb-2 dark:border-zinc-700\">\n {EMOJI_CATEGORY_ORDER.map((key) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveCategory(key)}\n className={cn(\n \"shrink-0 rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\",\n activeCategory === key && \"bg-zinc-100 dark:bg-zinc-700\",\n )}\n aria-label={EMOJI_DATA[key].label}\n >\n {EMOJI_DATA[key].icon}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto\">\n {query ? (\n <EmojiGrid\n emojis={filtered ?? []}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n ) : (\n <div>\n <div className=\"px-1 py-1 text-xs font-semibold uppercase text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\">\n {EMOJI_DATA[activeCategory].label}\n </div>\n <EmojiGrid\n emojis={EMOJI_DATA[activeCategory].emojis}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {toneTarget && typeof document !== \"undefined\" &&\n createPortal(\n <TonePopover\n target={toneTarget}\n onPickBase={() => pick(toneTarget.emoji)}\n onPickTone={(t) => pickTone(toneTarget.emoji, t)}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype GridProps = {\n emojis: EmojiEntry[];\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: (emoji: EmojiEntry) => void;\n};\n\nfunction EmojiGrid({ emojis, tone, openPicker, scheduleClose, cancelClose, onPick }: GridProps) {\n return (\n <div className=\"grid grid-cols-8 gap-0.5\">\n {emojis.map((emoji) => (\n <EmojiCell\n key={emoji.char}\n emoji={emoji}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={() => onPick(emoji)}\n />\n ))}\n </div>\n );\n}\n\ntype CellProps = {\n emoji: EmojiEntry;\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: () => void;\n};\n\nfunction EmojiCell({ emoji, tone, openPicker, scheduleClose, cancelClose, onPick }: CellProps) {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressed = useRef(false);\n\n const tonable = !!emoji.skinTones;\n const displayChar = tonable && tone ? applyTone(emoji.char, tone) : emoji.char;\n\n useEffect(() => () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n }, []);\n\n const triggerOpen = () => {\n const node = buttonRef.current;\n if (!node) return;\n const r = node.getBoundingClientRect();\n openPicker({ emoji, rect: { left: r.left, top: r.top, width: r.width } });\n };\n\n const handlePointerEnter = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType === \"touch\") return;\n cancelClose();\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(triggerOpen, HOVER_INTENT_MS);\n };\n\n const handlePointerLeave = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (tonable) scheduleClose();\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType !== \"touch\") return;\n longPressed.current = false;\n longPressTimer.current = setTimeout(() => {\n longPressed.current = true;\n triggerOpen();\n }, LONG_PRESS_MS);\n };\n const handlePointerUp = () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n };\n\n const handleClick = () => {\n if (longPressed.current) {\n longPressed.current = false;\n return;\n }\n onPick();\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n className=\"relative rounded p-1 text-xl hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={emoji.name}\n title={emoji.name}\n >\n {displayChar}\n {tonable && (\n <span className=\"absolute end-0.5 bottom-0.5 h-1 w-1 rounded-full bg-amber-400\" aria-hidden />\n )}\n </button>\n );\n}\n\ntype PopoverProps = {\n target: ToneTarget;\n onPickBase: () => void;\n onPickTone: (tone: SkinTone) => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n};\n\nfunction TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeave }: PopoverProps) {\n const { emoji, rect } = target;\n if (!emoji.skinTones) return null;\n\n const centerX = rect.left + rect.width / 2;\n const top = rect.top;\n const POPOVER_HEIGHT_APPROX = 44;\n const flipDown = top < POPOVER_HEIGHT_APPROX + 8;\n\n const style: React.CSSProperties = flipDown\n ? { position: \"fixed\", left: centerX, top: top + 32, transform: \"translateX(-50%)\" }\n : { position: \"fixed\", left: centerX, top: top - 4, transform: \"translate(-50%, -100%)\" };\n\n return (\n <div\n style={{ ...style, zIndex: 9999 }}\n className=\"flex gap-0.5 rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-white p-1 shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-800\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <button\n type=\"button\"\n onClick={onPickBase}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} (no tone)`}\n >\n {emoji.char}\n </button>\n {SKIN_TONES.map((t, i) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => onPickTone(t)}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} ${t} skin tone`}\n >\n {emoji.skinTones![i]}\n </button>\n ))}\n </div>\n );\n}\n"]}
@@ -159,7 +159,7 @@ function TablePagination({
159
159
  const totalPages = Math.ceil(total / pageSize);
160
160
  if (totalPages <= 1) return null;
161
161
  return /* @__PURE__ */ jsxs("div", { "data-react-fancy-table-pagination": "", className: cn("flex items-center justify-between px-4 py-3 text-sm", className), children: [
162
- /* @__PURE__ */ jsxs("span", { className: "text-zinc-500", children: [
162
+ /* @__PURE__ */ jsxs("span", { className: "text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]", children: [
163
163
  "Page ",
164
164
  page + 1,
165
165
  " of ",
@@ -297,5 +297,5 @@ var Table = Object.assign(TableRoot, {
297
297
  });
298
298
 
299
299
  export { Table, TableBody, TableCell, TableColumn, TableHead, TablePagination, TableRow, TableRowTray, TableSearch, TableTray };
300
- //# sourceMappingURL=chunk-KRECSPD3.js.map
301
- //# sourceMappingURL=chunk-KRECSPD3.js.map
300
+ //# sourceMappingURL=chunk-2PNQTEXK.js.map
301
+ //# sourceMappingURL=chunk-2PNQTEXK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Table/Table.context.ts","../src/components/Table/TableHead.tsx","../src/components/Table/TableBody.tsx","../src/components/Table/TableRow.tsx","../src/components/Table/TableCell.tsx","../src/components/Table/TableColumn.tsx","../src/components/Table/TablePagination.tsx","../src/components/Table/TableSearch.tsx","../src/components/Table/TableTray.tsx","../src/components/Table/TableRowTray.tsx","../src/components/Table/Table.tsx"],"names":["jsx","jsxs","Fragment"],"mappings":"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","file":"chunk-2PNQTEXK.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { TableContextValue } from \"./Table.types\";\n\nexport const TableContext = createContext<TableContextValue | null>(null);\n\nexport function useTable(): TableContextValue {\n const ctx = useContext(TableContext);\n if (!ctx) {\n throw new Error(\"Table compound components must be used within <Table>\");\n }\n return ctx;\n}\n","import { cn } from \"../../utils/cn\";\nimport type { TableHeadProps } from \"./Table.types\";\n\nexport function TableHead({ children, className, ...rest }: TableHeadProps) {\n return (\n <thead\n {...rest}\n data-react-fancy-table-head=\"\"\n className={cn(\"border-b border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\", className)}\n >\n {children}\n </thead>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport type { TableBodyProps } from \"./Table.types\";\n\nexport function TableBody({ children, className, ...rest }: TableBodyProps) {\n return (\n <tbody\n {...rest}\n data-react-fancy-table-body=\"\"\n className={cn(\"divide-y divide-zinc-100 dark:divide-zinc-800\", className)}\n >\n {children}\n </tbody>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport type { TableRowProps } from \"./Table.types\";\n\nexport function TableRow({\n children,\n className,\n onClick,\n tray,\n trayTriggerPosition = \"end\",\n expanded: controlledExpanded,\n defaultExpanded = false,\n onExpandedChange,\n ...rest\n}: TableRowProps) {\n const [expanded, setExpanded] = useControllableState(\n controlledExpanded,\n defaultExpanded,\n onExpandedChange,\n );\n\n const hasTray = tray != null;\n const showTrigger = hasTray && trayTriggerPosition !== \"hidden\";\n\n const triggerCell = showTrigger ? (\n <td className=\"w-8 px-2\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }}\n className=\"inline-flex items-center justify-center rounded p-1 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\"\n aria-label={expanded ? \"Collapse row\" : \"Expand row\"}\n >\n <svg\n className={cn(\n \"h-4 w-4 transition-transform duration-200\",\n expanded && \"rotate-90\",\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </td>\n ) : null;\n\n return (\n <>\n <tr\n {...rest}\n data-react-fancy-table-row=\"\"\n className={cn(\n \"transition-colors hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))]\",\n onClick && \"cursor-pointer\",\n className,\n )}\n onClick={onClick}\n >\n {trayTriggerPosition === \"start\" && triggerCell}\n {children}\n {trayTriggerPosition === \"end\" && triggerCell}\n </tr>\n {hasTray && expanded && (\n <tr className=\"bg-zinc-50/50 dark:bg-zinc-800/30\">\n <td colSpan={999}>\n {tray}\n </td>\n </tr>\n )}\n </>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport type { TableCellProps } from \"./Table.types\";\n\nexport function TableCell({ children, className, header, ...rest }: TableCellProps) {\n const Tag = header ? \"th\" : \"td\";\n return (\n <Tag\n data-react-fancy-table-cell=\"\"\n className={cn(\n \"px-4 py-3 text-sm\",\n header && \"text-start font-medium text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\",\n className,\n )}\n {...rest}\n >\n {children}\n </Tag>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport { useTable } from \"./Table.context\";\nimport type { TableColumnProps } from \"./Table.types\";\n\nexport function TableColumn({\n label,\n sortKey,\n className,\n \"aria-sort\": ariaSortProp,\n onClick,\n ...rest\n}: TableColumnProps) {\n const { sortKey: currentSort, sortDir, toggleSort } = useTable();\n const isSorted = sortKey != null && currentSort === sortKey;\n\n /**\n * Announce the sort state to anyone who cannot see the arrow.\n *\n * The component already computed `isSorted` and `sortDir` and spent both on a\n * ▲/▼ glyph, so a sortable table sounded exactly like a static one and\n * activating a header produced no feedback at all.\n *\n * `\"none\"` is deliberate and is not the same as omitting the attribute: it\n * says \"this column sorts, but is not the current key\". A non-sortable header\n * gets nothing, because claiming otherwise invites someone to activate an\n * inert control.\n *\n * An explicit `aria-sort` from the caller wins — a server-sorted table knows\n * its own state and this component does not.\n */\n const ariaSort =\n ariaSortProp ?? (sortKey == null ? undefined : isSorted ? (sortDir === \"asc\" ? \"ascending\" : \"descending\") : \"none\");\n\n return (\n <th\n {...rest}\n data-react-fancy-table-column=\"\"\n aria-sort={ariaSort}\n className={cn(\n \"px-4 py-3 text-start text-sm font-medium text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\",\n sortKey && \"cursor-pointer select-none\",\n className,\n )}\n onClick={\n sortKey || onClick\n ? (event) => {\n // Both, in this order. Dropping the caller's handler because the\n // column happens to sort would be the same silent-prop-loss bug\n // this file just fixed one attribute over.\n onClick?.(event);\n if (sortKey) {\n toggleSort(sortKey);\n }\n }\n : undefined\n }\n >\n <span className=\"inline-flex items-center gap-1\">\n {label}\n {isSorted && (\n <span aria-hidden=\"true\" className=\"text-xs\">\n {sortDir === \"asc\" ? \"▲\" : \"▼\"}\n </span>\n )}\n </span>\n </th>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport { useTable } from \"./Table.context\";\nimport type { TablePaginationProps } from \"./Table.types\";\n\nexport function TablePagination({\n className,\n total,\n pageSize = 10,\n}: TablePaginationProps) {\n const { page, setPage } = useTable();\n const totalPages = Math.ceil(total / pageSize);\n\n if (totalPages <= 1) return null;\n\n return (\n <div data-react-fancy-table-pagination=\"\" className={cn(\"flex items-center justify-between px-4 py-3 text-sm\", className)}>\n <span className=\"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n disabled={page === 0}\n onClick={() => setPage(page - 1)}\n className=\"rounded border px-2 py-1 disabled:opacity-50 dark:border-zinc-600\"\n >\n Prev\n </button>\n <button\n type=\"button\"\n disabled={page >= totalPages - 1}\n onClick={() => setPage(page + 1)}\n className=\"rounded border px-2 py-1 disabled:opacity-50 dark:border-zinc-600\"\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport { useTable } from \"./Table.context\";\nimport type { TableSearchProps } from \"./Table.types\";\n\nexport function TableSearch({\n className,\n placeholder = \"Search...\",\n}: TableSearchProps) {\n const { searchQuery, setSearchQuery } = useTable();\n\n return (\n <input\n data-react-fancy-table-search=\"\"\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"rounded-lg border border-zinc-200 px-3 py-2 text-sm dark:border-zinc-600 dark:bg-zinc-800\",\n className,\n )}\n />\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport type { TableTrayProps } from \"./Table.types\";\n\nexport function TableTray({ children, className }: TableTrayProps) {\n return (\n <div data-react-fancy-table-tray=\"\" className={cn(\"flex items-center justify-between px-4 py-3\", className)}>\n {children}\n </div>\n );\n}\n","import { cn } from \"../../utils/cn\";\nimport type { TableRowTrayProps } from \"./Table.types\";\n\nexport function TableRowTray({ children, className }: TableRowTrayProps) {\n return (\n <div\n data-react-fancy-table-row-tray=\"\"\n className={cn(\n \"border-t border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 py-3 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { Children, isValidElement, useCallback, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { TableContext } from \"./Table.context\";\nimport { TableHead } from \"./TableHead\";\nimport { TableBody } from \"./TableBody\";\nimport { TableRow } from \"./TableRow\";\nimport { TableCell } from \"./TableCell\";\nimport { TableColumn } from \"./TableColumn\";\nimport { TablePagination } from \"./TablePagination\";\nimport { TableSearch } from \"./TableSearch\";\nimport { TableTray } from \"./TableTray\";\nimport { TableRowTray } from \"./TableRowTray\";\nimport type { TableProps, TableContextValue } from \"./Table.types\";\n\nfunction TableRoot({ children, className, ...rest }: TableProps) {\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDir, setSortDir] = useState<\"asc\" | \"desc\">(\"asc\");\n const [page, setPage] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const toggleSort = useCallback(\n (key: string) => {\n if (sortKey === key) {\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n } else {\n setSortKey(key);\n setSortDir(\"asc\");\n }\n },\n [sortKey],\n );\n\n const ctx = useMemo<TableContextValue>(\n () => ({\n sortKey,\n sortDir,\n toggleSort,\n page,\n setPage,\n pageSize: 10,\n totalRows: 0,\n searchQuery,\n setSearchQuery,\n }),\n [sortKey, sortDir, toggleSort, page, searchQuery],\n );\n\n return (\n <TableContext.Provider value={ctx}>\n <div\n {...rest}\n data-react-fancy-table=\"\"\n className={cn(\"overflow-hidden rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\", className)}\n >\n {splitTableChildren(children)}\n </div>\n </TableContext.Provider>\n );\n}\n\nfunction splitTableChildren(children: ReactNode): ReactNode {\n const before: ReactNode[] = [];\n const inside: ReactNode[] = [];\n const after: ReactNode[] = [];\n let seenTableContent = false;\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && (child.type === TableHead || child.type === TableBody)) {\n inside.push(child);\n seenTableContent = true;\n return;\n }\n (seenTableContent ? after : before).push(child);\n });\n\n return (\n <>\n {before}\n {inside.length > 0 && <table className=\"w-full border-collapse\">{inside}</table>}\n {after}\n </>\n );\n}\n\nexport const Table = Object.assign(TableRoot, {\n Head: TableHead,\n Body: TableBody,\n Row: TableRow,\n Cell: TableCell,\n Column: TableColumn,\n Pagination: TablePagination,\n Search: TableSearch,\n Tray: TableTray,\n RowTray: TableRowTray,\n});\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkU4KUW3RK_cjs = require('./chunk-U4KUW3RK.cjs');
4
- var chunkFY2WDVKF_cjs = require('./chunk-FY2WDVKF.cjs');
4
+ var chunkND2T3PMH_cjs = require('./chunk-ND2T3PMH.cjs');
5
5
  var chunkOCHUZ7J3_cjs = require('./chunk-OCHUZ7J3.cjs');
6
6
  var chunkXEI5JG7C_cjs = require('./chunk-XEI5JG7C.cjs');
7
7
  var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
@@ -311,7 +311,7 @@ function ChatMessage({
311
311
  classNames?.message
312
312
  ),
313
313
  children: [
314
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 shrink-0", "aria-hidden": grouped || void 0, children: !grouped && /* @__PURE__ */ jsxRuntime.jsx(chunkFY2WDVKF_cjs.Avatar, { size: "sm", src: message.author?.avatar, alt: "", fallback: initials(name) }) }),
314
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 shrink-0", "aria-hidden": grouped || void 0, children: !grouped && /* @__PURE__ */ jsxRuntime.jsx(chunkND2T3PMH_cjs.Avatar, { size: "sm", src: message.author?.avatar, alt: "", fallback: initials(name) }) }),
315
315
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkZU5Q77OT_cjs.cn("flex min-w-0 max-w-[85%] flex-col", own ? "items-end" : "items-start"), children: [
316
316
  !grouped && /* @__PURE__ */ jsxRuntime.jsxs(
317
317
  "div",
@@ -619,5 +619,5 @@ ChatThread.displayName = "ChatThread";
619
619
 
620
620
  exports.ChatMessage = ChatMessage;
621
621
  exports.ChatThread = ChatThread;
622
- //# sourceMappingURL=chunk-RVBA4LEB.cjs.map
623
- //# sourceMappingURL=chunk-RVBA4LEB.cjs.map
622
+ //# sourceMappingURL=chunk-2SO4WS2E.cjs.map
623
+ //# sourceMappingURL=chunk-2SO4WS2E.cjs.map