@modern-admin/web 0.4.2 → 0.5.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 (280) hide show
  1. package/dist/standalone/assets/action-component-host-QVowRL_F.js +2 -0
  2. package/dist/standalone/assets/action-component-host-QVowRL_F.js.br +0 -0
  3. package/dist/standalone/assets/action-component-host-QVowRL_F.js.gz +0 -0
  4. package/dist/standalone/assets/{action-component-host-P6HcuKj3.js.map → action-component-host-QVowRL_F.js.map} +1 -1
  5. package/dist/standalone/assets/action-page-CET1s1MA.js +2 -0
  6. package/dist/standalone/assets/action-page-CET1s1MA.js.br +0 -0
  7. package/dist/standalone/assets/action-page-CET1s1MA.js.gz +0 -0
  8. package/dist/standalone/assets/{action-page-kyqtK3oq.js.map → action-page-CET1s1MA.js.map} +1 -1
  9. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js +2 -0
  10. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.br +0 -0
  11. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.gz +0 -0
  12. package/dist/standalone/assets/{ai-assistant-widget-DGanix6u.js.map → ai-assistant-widget-pJHSP1PB.js.map} +1 -1
  13. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js +2 -0
  14. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.br +0 -0
  15. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.gz +0 -0
  16. package/dist/standalone/assets/{audit-log-page-DozriTiA.js.map → audit-log-page-DoZPtbGo.js.map} +1 -1
  17. package/dist/standalone/assets/badge-8oeWEs3P.js +2 -0
  18. package/dist/standalone/assets/{badge-lb2Nqx1b.js.map → badge-8oeWEs3P.js.map} +1 -1
  19. package/dist/standalone/assets/cache-page-CoKusfv-.js +2 -0
  20. package/dist/standalone/assets/cache-page-CoKusfv-.js.br +0 -0
  21. package/dist/standalone/assets/cache-page-CoKusfv-.js.gz +0 -0
  22. package/dist/standalone/assets/cache-page-CoKusfv-.js.map +1 -0
  23. package/dist/standalone/assets/calendar-DDv0Qalf.js +2 -0
  24. package/dist/standalone/assets/calendar-DDv0Qalf.js.br +0 -0
  25. package/dist/standalone/assets/{calendar-crtd4PEn.js.gz → calendar-DDv0Qalf.js.gz} +0 -0
  26. package/dist/standalone/assets/{calendar-crtd4PEn.js.map → calendar-DDv0Qalf.js.map} +1 -1
  27. package/dist/standalone/assets/card-MNH_XK0V.js +2 -0
  28. package/dist/standalone/assets/card-MNH_XK0V.js.br +0 -0
  29. package/dist/standalone/assets/card-MNH_XK0V.js.gz +0 -0
  30. package/dist/standalone/assets/{card-Dh44j2Nb.js.map → card-MNH_XK0V.js.map} +1 -1
  31. package/dist/standalone/assets/chart-widget-R2NG5T1y.js +2 -0
  32. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.br +0 -0
  33. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.gz +0 -0
  34. package/dist/standalone/assets/{chart-widget-B819aHsE.js.map → chart-widget-R2NG5T1y.js.map} +1 -1
  35. package/dist/standalone/assets/command-Cw-hTtpk.js +2 -0
  36. package/dist/standalone/assets/command-Cw-hTtpk.js.br +0 -0
  37. package/dist/standalone/assets/command-Cw-hTtpk.js.gz +0 -0
  38. package/dist/standalone/assets/{command-xJ-6Grpv.js.map → command-Cw-hTtpk.js.map} +1 -1
  39. package/dist/standalone/assets/date-picker-DQ4XOgO6.js +2 -0
  40. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.br +0 -0
  41. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.gz +0 -0
  42. package/dist/standalone/assets/{date-picker-D0dWQEox.js.map → date-picker-DQ4XOgO6.js.map} +1 -1
  43. package/dist/standalone/assets/dist-CmyV2PEd.js +2 -0
  44. package/dist/standalone/assets/dist-CmyV2PEd.js.br +0 -0
  45. package/dist/standalone/assets/dist-CmyV2PEd.js.gz +0 -0
  46. package/dist/standalone/assets/{dist-UsTgBPww.js.map → dist-CmyV2PEd.js.map} +1 -1
  47. package/dist/standalone/assets/dist-DI9XNddW.js +2 -0
  48. package/dist/standalone/assets/dist-DI9XNddW.js.br +0 -0
  49. package/dist/standalone/assets/dist-DI9XNddW.js.gz +0 -0
  50. package/dist/standalone/assets/{dist-CWGgVQiS.js.map → dist-DI9XNddW.js.map} +1 -1
  51. package/dist/standalone/assets/dist-jC1pK2zN.js +2 -0
  52. package/dist/standalone/assets/dist-jC1pK2zN.js.br +0 -0
  53. package/dist/standalone/assets/dist-jC1pK2zN.js.gz +0 -0
  54. package/dist/standalone/assets/{dist-qlnAsTo_.js.map → dist-jC1pK2zN.js.map} +1 -1
  55. package/dist/standalone/assets/edit-page-CVjik6T5.js +2 -0
  56. package/dist/standalone/assets/edit-page-CVjik6T5.js.br +0 -0
  57. package/dist/standalone/assets/edit-page-CVjik6T5.js.gz +0 -0
  58. package/dist/standalone/assets/{edit-page-CFPwq1_5.js.map → edit-page-CVjik6T5.js.map} +1 -1
  59. package/dist/standalone/assets/empty-DcETRWsu.js +2 -0
  60. package/dist/standalone/assets/empty-DcETRWsu.js.br +0 -0
  61. package/dist/standalone/assets/empty-DcETRWsu.js.gz +0 -0
  62. package/dist/standalone/assets/{empty-D9sUunOr.js.map → empty-DcETRWsu.js.map} +1 -1
  63. package/dist/standalone/assets/floating-layer-DJGCYMex.js +2 -0
  64. package/dist/standalone/assets/floating-layer-DJGCYMex.js.br +0 -0
  65. package/dist/standalone/assets/floating-layer-DJGCYMex.js.gz +0 -0
  66. package/dist/standalone/assets/floating-layer-DJGCYMex.js.map +1 -0
  67. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js +2 -0
  68. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.br +0 -0
  69. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.gz +0 -0
  70. package/dist/standalone/assets/{global-search-dialog-AfQmJSE7.js.map → global-search-dialog-CT30gcRv.js.map} +1 -1
  71. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js +181 -0
  72. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.br +0 -0
  73. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.gz +0 -0
  74. package/dist/standalone/assets/{heavy-fields-_zVIBnm1.js.map → heavy-fields-ByzRCqe0.js.map} +1 -1
  75. package/dist/standalone/assets/home-page-B3WVGerG.js +3 -0
  76. package/dist/standalone/assets/home-page-B3WVGerG.js.br +0 -0
  77. package/dist/standalone/assets/home-page-B3WVGerG.js.gz +0 -0
  78. package/dist/standalone/assets/home-page-B3WVGerG.js.map +1 -0
  79. package/dist/standalone/assets/hooks-DHDUQgzs.js +186 -0
  80. package/dist/standalone/assets/hooks-DHDUQgzs.js.br +0 -0
  81. package/dist/standalone/assets/hooks-DHDUQgzs.js.gz +0 -0
  82. package/dist/standalone/assets/hooks-DHDUQgzs.js.map +1 -0
  83. package/dist/standalone/assets/icon-registry-O7MDzgTi.js +2 -0
  84. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.br +0 -0
  85. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.gz +0 -0
  86. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.map +1 -0
  87. package/dist/standalone/assets/index-BvESJd1R.js +15 -0
  88. package/dist/standalone/assets/index-BvESJd1R.js.br +0 -0
  89. package/dist/standalone/assets/index-BvESJd1R.js.gz +0 -0
  90. package/dist/standalone/assets/index-BvESJd1R.js.map +1 -0
  91. package/dist/standalone/assets/index-DSYyF4Ah.css +2 -0
  92. package/dist/standalone/assets/index-DSYyF4Ah.css.br +0 -0
  93. package/dist/standalone/assets/index-DSYyF4Ah.css.gz +0 -0
  94. package/dist/standalone/assets/json-editor-DJ-yNmlx.js +2 -0
  95. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.br +0 -0
  96. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.gz +0 -0
  97. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.map +1 -0
  98. package/dist/standalone/assets/property-renderer-DeykD9hp.js +7 -0
  99. package/dist/standalone/assets/property-renderer-DeykD9hp.js.br +0 -0
  100. package/dist/standalone/assets/property-renderer-DeykD9hp.js.gz +0 -0
  101. package/dist/standalone/assets/property-renderer-DeykD9hp.js.map +1 -0
  102. package/dist/standalone/assets/reference-BDP1QYCg.js +2 -0
  103. package/dist/standalone/assets/reference-BDP1QYCg.js.br +0 -0
  104. package/dist/standalone/assets/reference-BDP1QYCg.js.gz +0 -0
  105. package/dist/standalone/assets/{reference-DWJEoGIf.js.map → reference-BDP1QYCg.js.map} +1 -1
  106. package/dist/standalone/assets/revisions-button-CI74_D14.js +2 -0
  107. package/dist/standalone/assets/revisions-button-CI74_D14.js.br +0 -0
  108. package/dist/standalone/assets/revisions-button-CI74_D14.js.gz +0 -0
  109. package/dist/standalone/assets/{revisions-button-DR0oW2wX.js.map → revisions-button-CI74_D14.js.map} +1 -1
  110. package/dist/standalone/assets/{richtext-render-VFCKGulc.js → richtext-render-BHGG3eKV.js} +3 -3
  111. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.br +0 -0
  112. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.gz +0 -0
  113. package/dist/standalone/assets/{richtext-render-VFCKGulc.js.map → richtext-render-BHGG3eKV.js.map} +1 -1
  114. package/dist/standalone/assets/select-BR1RMqsn.js +2 -0
  115. package/dist/standalone/assets/select-BR1RMqsn.js.br +0 -0
  116. package/dist/standalone/assets/select-BR1RMqsn.js.gz +0 -0
  117. package/dist/standalone/assets/select-BR1RMqsn.js.map +1 -0
  118. package/dist/standalone/assets/settings-page-CdIWVeh0.js +2 -0
  119. package/dist/standalone/assets/settings-page-CdIWVeh0.js.br +0 -0
  120. package/dist/standalone/assets/settings-page-CdIWVeh0.js.gz +0 -0
  121. package/dist/standalone/assets/{settings-page-DSWp2N6T.js.map → settings-page-CdIWVeh0.js.map} +1 -1
  122. package/dist/standalone/assets/show-page-Dgw-9Pmn.js +2 -0
  123. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.br +0 -0
  124. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.gz +0 -0
  125. package/dist/standalone/assets/{show-page-CGzUAZoO.js.map → show-page-Dgw-9Pmn.js.map} +1 -1
  126. package/dist/standalone/assets/table-DzBSPeVH.js +2 -0
  127. package/dist/standalone/assets/table-DzBSPeVH.js.br +0 -0
  128. package/dist/standalone/assets/table-DzBSPeVH.js.gz +0 -0
  129. package/dist/standalone/assets/table-DzBSPeVH.js.map +1 -0
  130. package/dist/standalone/assets/tabs-Dr7UA219.js +2 -0
  131. package/dist/standalone/assets/tabs-Dr7UA219.js.br +0 -0
  132. package/dist/standalone/assets/tabs-Dr7UA219.js.gz +0 -0
  133. package/dist/standalone/assets/{tabs-smdw70rV.js.map → tabs-Dr7UA219.js.map} +1 -1
  134. package/dist/standalone/assets/textarea-T25SXcrC.js +2 -0
  135. package/dist/standalone/assets/{textarea-DBVf3GGt.js.map → textarea-T25SXcrC.js.map} +1 -1
  136. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js +2 -0
  137. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.br +0 -0
  138. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.gz +0 -0
  139. package/dist/standalone/assets/{use-dashboard-charts-Cr3OUSL5.js.map → use-dashboard-charts-aymvhXUB.js.map} +1 -1
  140. package/dist/standalone/assets/useQueries-Dch5Ggjr.js +2 -0
  141. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.br +0 -0
  142. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.gz +0 -0
  143. package/dist/standalone/assets/{useQueries-Ba2PuYhZ.js.map → useQueries-Dch5Ggjr.js.map} +1 -1
  144. package/dist/standalone/assets/{user-directory-Df5X8VOe.js → user-directory-C33bGZdb.js} +3 -3
  145. package/dist/standalone/assets/user-directory-C33bGZdb.js.br +0 -0
  146. package/dist/standalone/assets/user-directory-C33bGZdb.js.gz +0 -0
  147. package/dist/standalone/assets/{user-directory-Df5X8VOe.js.map → user-directory-C33bGZdb.js.map} +1 -1
  148. package/dist/standalone/assets/{value-format-BUeGtfH4.js → value-format-CLzWct9Y.js} +16 -16
  149. package/dist/standalone/assets/value-format-CLzWct9Y.js.br +0 -0
  150. package/dist/standalone/assets/value-format-CLzWct9Y.js.gz +0 -0
  151. package/dist/standalone/assets/{value-format-BUeGtfH4.js.map → value-format-CLzWct9Y.js.map} +1 -1
  152. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js +2 -0
  153. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.br +0 -0
  154. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.gz +0 -0
  155. package/dist/standalone/assets/{wizard-create-page-B8IcszRF.js.map → wizard-create-page-BtfveXmP.js.map} +1 -1
  156. package/dist/standalone/assets/zod-N7mHo7BX.js +2 -0
  157. package/dist/standalone/assets/zod-N7mHo7BX.js.br +0 -0
  158. package/dist/standalone/assets/zod-N7mHo7BX.js.gz +0 -0
  159. package/dist/standalone/assets/{zod-mi61gVha.js.map → zod-N7mHo7BX.js.map} +1 -1
  160. package/dist/standalone/index.html +10 -10
  161. package/dist/standalone/index.html.br +0 -0
  162. package/dist/standalone/index.html.gz +0 -0
  163. package/package.json +5 -5
  164. package/dist/standalone/assets/action-component-host-P6HcuKj3.js +0 -2
  165. package/dist/standalone/assets/action-component-host-P6HcuKj3.js.br +0 -0
  166. package/dist/standalone/assets/action-component-host-P6HcuKj3.js.gz +0 -0
  167. package/dist/standalone/assets/action-page-kyqtK3oq.js +0 -2
  168. package/dist/standalone/assets/action-page-kyqtK3oq.js.br +0 -0
  169. package/dist/standalone/assets/action-page-kyqtK3oq.js.gz +0 -0
  170. package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js +0 -2
  171. package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js.br +0 -0
  172. package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js.gz +0 -0
  173. package/dist/standalone/assets/audit-log-page-DozriTiA.js +0 -2
  174. package/dist/standalone/assets/audit-log-page-DozriTiA.js.br +0 -0
  175. package/dist/standalone/assets/audit-log-page-DozriTiA.js.gz +0 -0
  176. package/dist/standalone/assets/badge-lb2Nqx1b.js +0 -2
  177. package/dist/standalone/assets/calendar-crtd4PEn.js +0 -2
  178. package/dist/standalone/assets/calendar-crtd4PEn.js.br +0 -0
  179. package/dist/standalone/assets/card-Dh44j2Nb.js +0 -2
  180. package/dist/standalone/assets/card-Dh44j2Nb.js.br +0 -0
  181. package/dist/standalone/assets/card-Dh44j2Nb.js.gz +0 -0
  182. package/dist/standalone/assets/chart-widget-B819aHsE.js +0 -2
  183. package/dist/standalone/assets/chart-widget-B819aHsE.js.br +0 -0
  184. package/dist/standalone/assets/chart-widget-B819aHsE.js.gz +0 -0
  185. package/dist/standalone/assets/command-xJ-6Grpv.js +0 -2
  186. package/dist/standalone/assets/command-xJ-6Grpv.js.br +0 -0
  187. package/dist/standalone/assets/command-xJ-6Grpv.js.gz +0 -0
  188. package/dist/standalone/assets/date-picker-D0dWQEox.js +0 -2
  189. package/dist/standalone/assets/date-picker-D0dWQEox.js.br +0 -0
  190. package/dist/standalone/assets/date-picker-D0dWQEox.js.gz +0 -0
  191. package/dist/standalone/assets/dist-CWGgVQiS.js +0 -2
  192. package/dist/standalone/assets/dist-CWGgVQiS.js.br +0 -0
  193. package/dist/standalone/assets/dist-CWGgVQiS.js.gz +0 -0
  194. package/dist/standalone/assets/dist-UsTgBPww.js +0 -2
  195. package/dist/standalone/assets/dist-UsTgBPww.js.br +0 -0
  196. package/dist/standalone/assets/dist-UsTgBPww.js.gz +0 -0
  197. package/dist/standalone/assets/dist-qlnAsTo_.js +0 -2
  198. package/dist/standalone/assets/dist-qlnAsTo_.js.br +0 -0
  199. package/dist/standalone/assets/dist-qlnAsTo_.js.gz +0 -0
  200. package/dist/standalone/assets/edit-page-CFPwq1_5.js +0 -2
  201. package/dist/standalone/assets/edit-page-CFPwq1_5.js.br +0 -0
  202. package/dist/standalone/assets/edit-page-CFPwq1_5.js.gz +0 -0
  203. package/dist/standalone/assets/empty-D9sUunOr.js +0 -2
  204. package/dist/standalone/assets/empty-D9sUunOr.js.br +0 -0
  205. package/dist/standalone/assets/empty-D9sUunOr.js.gz +0 -0
  206. package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js +0 -2
  207. package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js.br +0 -0
  208. package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js.gz +0 -0
  209. package/dist/standalone/assets/heavy-fields-_zVIBnm1.js +0 -181
  210. package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.br +0 -0
  211. package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.gz +0 -0
  212. package/dist/standalone/assets/home-page-BdTrAXqk.js +0 -3
  213. package/dist/standalone/assets/home-page-BdTrAXqk.js.br +0 -0
  214. package/dist/standalone/assets/home-page-BdTrAXqk.js.gz +0 -0
  215. package/dist/standalone/assets/home-page-BdTrAXqk.js.map +0 -1
  216. package/dist/standalone/assets/icon-registry-CcMm2Zh3.js +0 -2
  217. package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.br +0 -0
  218. package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.gz +0 -0
  219. package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.map +0 -1
  220. package/dist/standalone/assets/index-DHZwffoP.css +0 -2
  221. package/dist/standalone/assets/index-DHZwffoP.css.br +0 -0
  222. package/dist/standalone/assets/index-DHZwffoP.css.gz +0 -0
  223. package/dist/standalone/assets/index-uYpCUVT4.js +0 -15
  224. package/dist/standalone/assets/index-uYpCUVT4.js.br +0 -0
  225. package/dist/standalone/assets/index-uYpCUVT4.js.gz +0 -0
  226. package/dist/standalone/assets/index-uYpCUVT4.js.map +0 -1
  227. package/dist/standalone/assets/json-editor-yfO4TUB_.js +0 -2
  228. package/dist/standalone/assets/json-editor-yfO4TUB_.js.br +0 -0
  229. package/dist/standalone/assets/json-editor-yfO4TUB_.js.gz +0 -0
  230. package/dist/standalone/assets/json-editor-yfO4TUB_.js.map +0 -1
  231. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js +0 -7
  232. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.br +0 -0
  233. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.gz +0 -0
  234. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.map +0 -1
  235. package/dist/standalone/assets/reference-DWJEoGIf.js +0 -2
  236. package/dist/standalone/assets/reference-DWJEoGIf.js.br +0 -0
  237. package/dist/standalone/assets/reference-DWJEoGIf.js.gz +0 -0
  238. package/dist/standalone/assets/revisions-button-DR0oW2wX.js +0 -2
  239. package/dist/standalone/assets/revisions-button-DR0oW2wX.js.br +0 -0
  240. package/dist/standalone/assets/revisions-button-DR0oW2wX.js.gz +0 -0
  241. package/dist/standalone/assets/richtext-render-VFCKGulc.js.br +0 -0
  242. package/dist/standalone/assets/richtext-render-VFCKGulc.js.gz +0 -0
  243. package/dist/standalone/assets/router-BcZgB5cZ.js +0 -186
  244. package/dist/standalone/assets/router-BcZgB5cZ.js.br +0 -0
  245. package/dist/standalone/assets/router-BcZgB5cZ.js.gz +0 -0
  246. package/dist/standalone/assets/router-BcZgB5cZ.js.map +0 -1
  247. package/dist/standalone/assets/select-BiV9bunJ.js +0 -2
  248. package/dist/standalone/assets/select-BiV9bunJ.js.br +0 -0
  249. package/dist/standalone/assets/select-BiV9bunJ.js.gz +0 -0
  250. package/dist/standalone/assets/select-BiV9bunJ.js.map +0 -1
  251. package/dist/standalone/assets/settings-page-DSWp2N6T.js +0 -2
  252. package/dist/standalone/assets/settings-page-DSWp2N6T.js.br +0 -0
  253. package/dist/standalone/assets/settings-page-DSWp2N6T.js.gz +0 -0
  254. package/dist/standalone/assets/show-page-CGzUAZoO.js +0 -2
  255. package/dist/standalone/assets/show-page-CGzUAZoO.js.br +0 -0
  256. package/dist/standalone/assets/show-page-CGzUAZoO.js.gz +0 -0
  257. package/dist/standalone/assets/tabs-smdw70rV.js +0 -2
  258. package/dist/standalone/assets/tabs-smdw70rV.js.br +0 -0
  259. package/dist/standalone/assets/tabs-smdw70rV.js.gz +0 -0
  260. package/dist/standalone/assets/textarea-DBVf3GGt.js +0 -2
  261. package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js +0 -2
  262. package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.br +0 -0
  263. package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.gz +0 -0
  264. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js +0 -2
  265. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.br +0 -0
  266. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.gz +0 -0
  267. package/dist/standalone/assets/user-directory-Df5X8VOe.js.br +0 -0
  268. package/dist/standalone/assets/user-directory-Df5X8VOe.js.gz +0 -0
  269. package/dist/standalone/assets/value-format-BUeGtfH4.js.br +0 -0
  270. package/dist/standalone/assets/value-format-BUeGtfH4.js.gz +0 -0
  271. package/dist/standalone/assets/with-selector-id7qGzTH.js +0 -2
  272. package/dist/standalone/assets/with-selector-id7qGzTH.js.br +0 -0
  273. package/dist/standalone/assets/with-selector-id7qGzTH.js.gz +0 -0
  274. package/dist/standalone/assets/with-selector-id7qGzTH.js.map +0 -1
  275. package/dist/standalone/assets/wizard-create-page-B8IcszRF.js +0 -2
  276. package/dist/standalone/assets/wizard-create-page-B8IcszRF.js.br +0 -0
  277. package/dist/standalone/assets/wizard-create-page-B8IcszRF.js.gz +0 -0
  278. package/dist/standalone/assets/zod-mi61gVha.js +0 -2
  279. package/dist/standalone/assets/zod-mi61gVha.js.br +0 -0
  280. package/dist/standalone/assets/zod-mi61gVha.js.gz +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-DzBSPeVH.js","names":[],"sources":["../../../../ui/src/components/table.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport const Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n ),\n)\nTable.displayName = 'Table'\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b [&_tr]:border-border bg-muted/40', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/40 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nexport const TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className,\n )}\n {...props}\n />\n))\nTableRow.displayName = 'TableRow'\n\nexport const TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-3 text-left align-middle text-xs font-semibold uppercase tracking-wide text-muted-foreground border-r border-border last:border-r-0',\n className,\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nexport const TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn('px-3 py-2 align-middle border-r border-border last:border-r-0', className)}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('mt-4 text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n"],"mappings":"uIAGa,EAAA,EAAc,YACxB,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,0CACb,EAAA,EAAA,IAAA,CAAC,QAAD,CAAY,MAAK,UAAW,EAAG,gCAAiC,CAAS,EAAG,GAAI,CAAQ,CAAA,CACrF,CAAA,CAET,EACA,EAAM,YAAc,QAEpB,IAAa,EAAA,EAAoB,YAG9B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAY,MAAK,UAAW,EAAG,mDAAoD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAC5G,EACD,EAAY,YAAc,cAE1B,IAAa,EAAA,EAAkB,YAG5B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAY,MAAK,UAAW,EAAG,6BAA8B,CAAS,EAAG,GAAI,CAAQ,CAAA,CACtF,EACD,EAAU,YAAc,YAExB,IAAa,EAAA,EAAoB,YAG9B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,QAAD,CACO,MACL,UAAW,EAAG,0DAA2D,CAAS,EAClF,GAAI,CACL,CAAA,CACF,EACD,EAAY,YAAc,cAE1B,IAAa,EAAA,EAAiB,YAG3B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EACT,4FACA,CACF,EACA,GAAI,CACL,CAAA,CACF,EACD,EAAS,YAAc,WAEvB,IAAa,EAAA,EAAkB,YAG5B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EACT,8IACA,CACF,EACA,GAAI,CACL,CAAA,CACF,EACD,EAAU,YAAc,YAExB,IAAa,EAAA,EAAkB,YAG5B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EAAG,gEAAiE,CAAS,EACxF,GAAI,CACL,CAAA,CACF,EACD,EAAU,YAAc,YAExB,IAAa,EAAA,EAAqB,YAG/B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,UAAD,CACO,MACL,UAAW,EAAG,qCAAsC,CAAS,EAC7D,GAAI,CACL,CAAA,CACF,EACD,EAAa,YAAc"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{C as n,_ as r,d as i,f as a,h as o,l as s,p as c,w as l}from"./floating-layer-DJGCYMex.js";import{t as u}from"./dist-DI9XNddW.js";import{J as d,K as f,q as p}from"./index-BvESJd1R.js";var m=e(t(),1),h=l(),g=`Tabs`,[_,v]=n(g,[d]),y=d(),[b,x]=_(g),S=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,onValueChange:a,defaultValue:s,orientation:l=`horizontal`,dir:d,activationMode:f=`automatic`,...p}=e,m=u(d),[_,v]=o({prop:r,onChange:a,defaultProp:s??``,caller:g});return(0,h.jsx)(b,{scope:n,baseId:i(),value:_,onValueChange:v,orientation:l,dir:m,activationMode:f,children:(0,h.jsx)(c.div,{dir:m,"data-orientation":l,...p,ref:t})})});S.displayName=g;var C=`TabsList`,w=m.forwardRef((e,t)=>{let{__scopeTabs:n,loop:r=!0,...i}=e,a=x(C,n),o=y(n);return(0,h.jsx)(p,{asChild:!0,...o,orientation:a.orientation,dir:a.dir,loop:r,children:(0,h.jsx)(c.div,{role:`tablist`,"aria-orientation":a.orientation,...i,ref:t})})});w.displayName=C;var T=`TabsTrigger`,E=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:i,disabled:a=!1,...o}=e,s=x(T,n),l=y(n),u=k(s.baseId,i),d=A(s.baseId,i),p=i===s.value;return(0,h.jsx)(f,{asChild:!0,...l,focusable:!a,active:p,children:(0,h.jsx)(c.button,{type:`button`,role:`tab`,"aria-selected":p,"aria-controls":d,"data-state":p?`active`:`inactive`,"data-disabled":a?``:void 0,disabled:a,id:u,...o,ref:t,onMouseDown:r(e.onMouseDown,e=>{!a&&e.button===0&&e.ctrlKey===!1?s.onValueChange(i):e.preventDefault()}),onKeyDown:r(e.onKeyDown,e=>{a||e.target!==e.currentTarget||[` `,`Enter`].includes(e.key)&&s.onValueChange(i)}),onFocus:r(e.onFocus,()=>{let e=s.activationMode!==`manual`;!p&&!a&&e&&s.onValueChange(i)})})})});E.displayName=T;var D=`TabsContent`,O=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,forceMount:i,children:o,...s}=e,l=x(D,n),u=k(l.baseId,r),d=A(l.baseId,r),f=r===l.value,p=m.useRef(f);return m.useEffect(()=>{let e=requestAnimationFrame(()=>p.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,h.jsx)(a,{present:i||f,children:({present:n})=>(0,h.jsx)(c.div,{"data-state":f?`active`:`inactive`,"data-orientation":l.orientation,role:`tabpanel`,"aria-labelledby":u,hidden:!n,id:d,tabIndex:0,...s,ref:t,style:{...e.style,animationDuration:p.current?`0s`:void 0},children:n&&o})})});O.displayName=D;function k(e,t){return`${e}-trigger-${t}`}function A(e,t){return`${e}-content-${t}`}var j=S,M=w,N=E,P=O,F=j,I=m.forwardRef(({className:e,...t},n)=>(0,h.jsx)(M,{ref:n,className:s(`flex h-10 w-full items-center justify-start gap-1 overflow-x-auto border-b border-border text-muted-foreground`,e),...t}));I.displayName=M.displayName;var L=m.forwardRef(({className:e,...t},n)=>(0,h.jsx)(N,{ref:n,className:s(`relative -mb-px inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap border-b-2 border-transparent px-4 py-2 text-sm font-medium ring-offset-background transition-all`,`hover:text-foreground`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`,`data-[state=active]:border-primary data-[state=active]:text-foreground`,e),...t}));L.displayName=N.displayName;var R=m.forwardRef(({className:e,...t},n)=>(0,h.jsx)(P,{ref:n,className:s(`mt-3 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,e),...t}));R.displayName=P.displayName;export{L as i,R as n,I as r,F as t};
2
+ //# sourceMappingURL=tabs-Dr7UA219.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-smdw70rV.js","names":["Tabs","TabsList","RovingFocusGroup.Root","TabsTrigger","RovingFocusGroup.Item","TabsContent"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-tabs@1.1.17+ae2b4604ef263bc9/node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../../ui/src/components/tabs.tsx"],"sourcesContent":["\"use client\";\n\n// src/tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue ?? \"\",\n caller: TABS_NAME\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled || event.target !== event.currentTarget) {\n return;\n }\n if ([\" \", \"Enter\"].includes(event.key)) {\n context.onValueChange(value);\n }\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/utils.js'\n\nexport const Tabs = TabsPrimitive.Root\n\n// Underline-style tab strip — works visually even with a single tab because\n// the active item has a clearly drawn bottom indicator that anchors it to the\n// content below.\nexport const TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-start gap-1 overflow-x-auto border-b border-border text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'relative -mb-px inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap border-b-2 border-transparent px-4 py-2 text-sm font-medium ring-offset-background transition-all',\n 'hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'data-[state=active]:border-primary data-[state=active]:text-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nexport const TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-3 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className,\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"tabs-Dr7UA219.js","names":["Tabs","TabsList","RovingFocusGroup.Root","TabsTrigger","RovingFocusGroup.Item","TabsContent"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-tabs@1.1.17+ae2b4604ef263bc9/node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../../ui/src/components/tabs.tsx"],"sourcesContent":["\"use client\";\n\n// src/tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue ?? \"\",\n caller: TABS_NAME\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled || event.target !== event.currentTarget) {\n return;\n }\n if ([\" \", \"Enter\"].includes(event.key)) {\n context.onValueChange(value);\n }\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/utils.js'\n\nexport const Tabs = TabsPrimitive.Root\n\n// Underline-style tab strip — works visually even with a single tab because\n// the active item has a clearly drawn bottom indicator that anchors it to the\n// content below.\nexport const TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-start gap-1 overflow-x-auto border-b border-border text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'relative -mb-px inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap border-b-2 border-transparent px-4 py-2 text-sm font-medium ring-offset-background transition-all',\n 'hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'data-[state=active]:border-primary data-[state=active]:text-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nexport const TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-3 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className,\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{l as n,w as r}from"./floating-layer-DJGCYMex.js";var i=e(t(),1),a=r(),o=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`textarea`,{ref:r,className:n(`flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`,e),...t}));o.displayName=`Textarea`;export{o as t};
2
+ //# sourceMappingURL=textarea-T25SXcrC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"textarea-DBVf3GGt.js","names":[],"sources":["../../../../ui/src/components/textarea.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n ),\n)\nTextarea.displayName = 'Textarea'\n"],"mappings":"sIAKa,EAAA,EAAiB,YAC3B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,WAAD,CACO,MACL,UAAW,EACT,8PACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,EACA,EAAS,YAAc"}
1
+ {"version":3,"file":"textarea-T25SXcrC.js","names":[],"sources":["../../../../ui/src/components/textarea.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n ),\n)\nTextarea.displayName = 'Textarea'\n"],"mappings":"uIAKa,EAAA,EAAiB,YAC3B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,WAAD,CACO,MACL,UAAW,EACT,8PACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,EACA,EAAS,YAAc"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{t as n}from"./uuid-DLSnbsz2.js";import{_ as r,a as i,c as a,d as o,l as s,m as c,o as l,p as u,t as d,u as f,v as p,y as m}from"./schemas-twnCb1uT.js";var h=d([`kpi`,`line`,`area`,`bar`]),g=d([`count`,`sum`,`avg`,`min`,`max`]),_=d([`day`,`week`,`month`,`year`,`all`]);d([`7d`,`30d`,`90d`,`1y`,`all`,`custom`]);var v=d([`half`,`full`]),y=a(`preset`,[o({preset:d([`7d`,`30d`,`90d`,`1y`,`all`])}),o({preset:s(`custom`),from:p(),to:p()})]),b=o({op:d([`divide`,`multiply`,`add`,`subtract`]),value:f().finite()}),x=o({style:d([`number`,`currency`,`percent`]).default(`number`),currency:c().length(3).optional(),decimals:f().int().min(0).max(6).optional(),prefix:c().max(8).optional(),suffix:c().max(8).optional(),compact:l().optional()}),S=o({color:c().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/).optional()}),C=o({id:r(),title:c().max(120).default(``),resource:c().min(1),visualisation:h,dateField:c().min(1),step:_,metric:g,field:c().min(1).optional(),groupBy:c().min(1).optional(),topN:f().int().min(1).max(50).default(10),groupByLabelResource:c().min(1).optional(),width:v.default(`half`),filters:u(c(),c()).default({}),quickFilters:i(c()).default([]),timeRange:y,series:u(c(),S).optional(),transform:i(b).max(8).default([]),format:x.optional(),comparePrevious:l().default(!1),groupId:r().optional(),order:f().int().default(0),createdAt:m(),updatedAt:m()}).refine(e=>e.metric===`count`||!!e.field,{message:`field is required when metric is not count`,path:[`field`]}).refine(e=>e.visualisation!==`kpi`||e.step===`all`,{message:`KPI charts must use step 'all'`,path:[`step`]}).refine(e=>e.visualisation===`kpi`||e.step!==`all`,{message:`non-KPI charts cannot use step 'all'`,path:[`step`]}),w=o({id:r(),name:c().min(1).max(120),order:f().int().default(0),createdAt:m(),updatedAt:m()}),T=o({version:s(1),charts:i(C),groups:i(w).default([])}),E={version:1,charts:[],groups:[]},D=e(t(),1),O=`modern-admin:dashboard:v1:`,k=`__anon__`,A=new class{load(e){if(typeof window>`u`)return E;try{let t=window.localStorage.getItem(O+(e||k));if(!t)return E;let n=JSON.parse(t),r=T.safeParse(n);return r.success?r.data:E}catch{return E}}save(e,t){if(!(typeof window>`u`))try{window.localStorage.setItem(O+(e||k),JSON.stringify(t))}catch{}}},j=class{client;constructor(e){this.client=e}async load(e){try{return(await this.client.loadDashboard()).dashboard}catch{return E}}async save(e,t){try{await this.client.saveDashboard(t)}catch{}}};function M(e,t=new Date){if(e.preset===`custom`)return{from:e.from,to:e.to};let n=e.preset===`7d`?7:e.preset===`30d`?30:e.preset===`90d`?90:e.preset===`1y`?365:3650,r=new Date(t),i=new Date(t);return i.setDate(i.getDate()-n),{from:N(i),to:N(r)}}var N=e=>e.toISOString().slice(0,10),P=new Set;function F(){for(let e of P)try{e()}catch{}}function I(e){let{userId:t,store:r=A}=e,[i,a]=(0,D.useState)([]),[o,s]=(0,D.useState)([]),[c,l]=(0,D.useState)(!0),[u,d]=(0,D.useState)(0);(0,D.useEffect)(()=>{if(!t){a([]),l(!1);return}let e=!1;return l(!0),Promise.resolve(r.load(t)).then(t=>{e||(a(t.charts),s([...t.groups].sort(L)),l(!1))}),()=>{e=!0}},[t,r,u]),(0,D.useEffect)(()=>{let e=()=>d(e=>e+1);return P.add(e),()=>{P.delete(e)}},[]);let f=(0,D.useCallback)((e,n)=>{a(e),s([...n].sort(L)),t&&Promise.resolve(r.save(t,{version:1,charts:e,groups:n}))},[t,r]);return{charts:i,groups:o,isLoading:c,addChart:(0,D.useCallback)(e=>{let t=new Date().toISOString(),r=e.groupId??o[0]?.id,a={...e,id:n(),title:e.title??``,filters:e.filters??{},...r?{groupId:r}:{},createdAt:t,updatedAt:t};f([...i,a],o)},[i,o,f]),updateChart:(0,D.useCallback)((e,t)=>{f(i.map(n=>n.id===e?{...n,...t,id:e,title:t.title??``,filters:t.filters??{},createdAt:n.createdAt,updatedAt:new Date().toISOString()}:n),o)},[i,o,f]),removeChart:(0,D.useCallback)(e=>{f(i.filter(t=>t.id!==e),o)},[i,o,f]),addGroup:(0,D.useCallback)(e=>{let t=new Date().toISOString(),r=n(),a={id:r,name:e.name,order:e.order??o.length,createdAt:t,updatedAt:t},s=o.length===0?i.map(e=>e.groupId?e:{...e,groupId:r,updatedAt:t}):i;return f(s,[...o,a]),r},[i,o,f]),updateGroup:(0,D.useCallback)((e,t)=>{let n=new Date().toISOString();f(i,o.map(r=>r.id===e?{...r,...t.name===void 0?{}:{name:t.name},...t.order===void 0?{}:{order:t.order},updatedAt:n}:r))},[i,o,f]),removeGroup:(0,D.useCallback)(e=>{f(i.filter(t=>t.groupId!==e),o.filter(t=>t.id!==e))},[i,o,f])}}function L(e,t){return e.order===t.order?e.createdAt.localeCompare(t.createdAt):e.order-t.order}export{C as a,I as i,F as n,M as r,j as t};
2
+ //# sourceMappingURL=use-dashboard-charts-aymvhXUB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-dashboard-charts-Cr3OUSL5.js","names":[],"sources":["../../../../core/src/dashboard/store.ts","../../../../react/src/use-dashboard-charts.ts"],"sourcesContent":["// Dashboard / chart-builder schemas and storage port.\n//\n// Source of truth for the on-disk shape of saved dashboards. Both the\n// frontend (localStorage default) and any future server-side store\n// implement the same `IDashboardStore` interface, so the UI is agnostic\n// to where the data actually lives.\n\nimport { z } from 'zod'\n\n// Pie removed in Phase 10 — time-series first means category-only charts\n// don't fit the model.\nexport const chartVisualisationZ = z.enum(['kpi', 'line', 'area', 'bar'])\nexport type ChartVisualisation = z.infer<typeof chartVisualisationZ>\n\nexport const aggregationOpZ = z.enum(['count', 'sum', 'avg', 'min', 'max'])\nexport type AggregationOpName = z.infer<typeof aggregationOpZ>\n\n// `'all'` collapses the whole window into one bucket (KPI mode).\nexport const aggregationStepZ = z.enum(['day', 'week', 'month', 'year', 'all'])\nexport type AggregationStep = z.infer<typeof aggregationStepZ>\n\nexport const timeRangePresetZ = z.enum(['7d', '30d', '90d', '1y', 'all', 'custom'])\nexport type TimeRangePreset = z.infer<typeof timeRangePresetZ>\n\n/** Tile width on the dashboard grid. `'half'` = 1 of 2 columns at md+, `'full'` = full row. */\nexport const chartWidthZ = z.enum(['half', 'full'])\nexport type ChartWidth = z.infer<typeof chartWidthZ>\n\n/**\n * Time range stored on a chart. Presets resolve to concrete from/to at\n * render time so cards always reflect \"now\" without re-saving.\n */\nexport const timeRangeZ = z.discriminatedUnion('preset', [\n z.object({ preset: z.enum(['7d', '30d', '90d', '1y', 'all']) }),\n z.object({\n preset: z.literal('custom'),\n from: z.iso.date(),\n to: z.iso.date(),\n }),\n])\nexport type TimeRange = z.infer<typeof timeRangeZ>\n\n/**\n * One step of the presentation-only value pipeline applied client-side\n * before charting (so axis, tooltip and KPI values agree), e.g.\n * `{ op: 'divide', value: 100 }` to show cents as dollars.\n */\nexport const chartTransformStepZ = z.object({\n op: z.enum(['divide', 'multiply', 'add', 'subtract']),\n value: z.number().finite(),\n})\nexport type ChartTransformStep = z.infer<typeof chartTransformStepZ>\n\n/**\n * Display formatting applied at render time via `Intl.NumberFormat`.\n * Note: `percent` follows Intl semantics (0.42 → \"42%\"). `compact`\n * abbreviates large values (12.5k / 1.2M).\n */\nexport const chartFormatZ = z.object({\n style: z.enum(['number', 'currency', 'percent']).default('number'),\n /** ISO 4217 code; render layer falls back to 'USD' when absent. */\n currency: z.string().length(3).optional(),\n decimals: z.number().int().min(0).max(6).optional(),\n prefix: z.string().max(8).optional(),\n suffix: z.string().max(8).optional(),\n compact: z.boolean().optional(),\n})\nexport type ChartFormat = z.infer<typeof chartFormatZ>\n\n/**\n * Per-series style overrides, keyed by the stable series key\n * (`__total__`, a groupBy value, `__other__`, …) — never by display label.\n * Absent series fall back to the palette color for their index.\n */\nexport const seriesStyleZ = z.object({\n color: z\n .string()\n .regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/)\n .optional(),\n})\nexport type SeriesStyle = z.infer<typeof seriesStyleZ>\n\nexport const chartDefZ = z\n .object({\n id: z.uuid(),\n title: z.string().max(120).default(''),\n resource: z.string().min(1),\n visualisation: chartVisualisationZ,\n /** Property path of the date/datetime column used for X-axis bucketing. */\n dateField: z.string().min(1),\n /** Time bucket granularity. KPI charts always use `'all'`. */\n step: aggregationStepZ,\n metric: aggregationOpZ,\n /** Required for non-count metrics. */\n field: z.string().min(1).optional(),\n /** Optional secondary breakdown — produces one series per distinct value. */\n groupBy: z.string().min(1).optional(),\n /** Maximum series count for `groupBy`-charts; rest collapses to \"other\". */\n topN: z.number().int().min(1).max(50).default(10),\n /**\n * When `groupBy` produces FK ids (reference property), the analytics\n * endpoint resolves them to human-readable titles via `findMany` on this\n * resource id. Auto-set by the chart builder when it detects a reference\n * property in the `groupBy` selector.\n */\n groupByLabelResource: z.string().min(1).optional(),\n width: chartWidthZ.default('half'),\n filters: z.record(z.string(), z.string()).default({}),\n /**\n * Property paths exposed as \"quick filters\" above the chart on the\n * dashboard tile. Their values are taken from `filters` but the widget\n * lets the user tweak them inline and apply via a dedicated Apply button.\n */\n quickFilters: z.array(z.string()).default([]),\n timeRange: timeRangeZ,\n /** Per-series style overrides keyed by stable series key. */\n series: z.record(z.string(), seriesStyleZ).optional(),\n /** Presentation-only value pipeline, applied in order before charting. */\n transform: z.array(chartTransformStepZ).max(8).default([]),\n /** Display number format for axis / tooltip / KPI values. */\n format: chartFormatZ.optional(),\n /**\n * Overlay the equal-length preceding window as a dashed series and show\n * the period-over-period delta next to the title. Only honoured for\n * charts without `groupBy` (top-N keys are not stable across windows).\n */\n comparePrevious: z.boolean().default(false),\n /**\n * Optional group membership. `undefined` means the chart is not assigned\n * to any group yet — when at least one group exists, ungrouped charts\n * are bucketed into the first group (by `order`) at display time.\n */\n groupId: z.uuid().optional(),\n /** Sort key within a group; lower numbers come first. Defaults to 0. */\n order: z.number().int().default(0),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n })\n .refine((c) => c.metric === 'count' || !!c.field, {\n message: 'field is required when metric is not count',\n path: ['field'],\n })\n .refine((c) => c.visualisation !== 'kpi' || c.step === 'all', {\n message: \"KPI charts must use step 'all'\",\n path: ['step'],\n })\n .refine((c) => c.visualisation === 'kpi' || c.step !== 'all', {\n message: \"non-KPI charts cannot use step 'all'\",\n path: ['step'],\n })\n\nexport type ChartDef = z.infer<typeof chartDefZ>\nexport type ChartDefInput = z.input<typeof chartDefZ>\n\n/**\n * Group of charts on the dashboard. Groups are rendered as tabs above the\n * charts grid. When the user creates the very first group, all existing\n * (ungrouped) charts are auto-assigned to it.\n */\nexport const chartGroupZ = z.object({\n id: z.uuid(),\n name: z.string().min(1).max(120),\n /** Sort key for the tab strip; lower numbers come first. */\n order: z.number().int().default(0),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n})\nexport type ChartGroup = z.infer<typeof chartGroupZ>\nexport type ChartGroupInput = z.input<typeof chartGroupZ>\n\nexport const dashboardBlobZ = z.object({\n version: z.literal(1),\n charts: z.array(chartDefZ),\n /** Optional — legacy blobs without `groups` parse cleanly via `.default([])`. */\n groups: z.array(chartGroupZ).default([]),\n})\nexport type DashboardBlob = z.infer<typeof dashboardBlobZ>\n\nexport const EMPTY_DASHBOARD: DashboardBlob = { version: 1, charts: [], groups: [] }\n\n/**\n * Per-user dashboard storage port. Default implementation in\n * `@modern-admin/react` is browser-localStorage; a server-side store\n * implementing this same shape can be plugged in later without UI changes.\n */\nexport interface IDashboardStore {\n load(userId: string): Promise<DashboardBlob> | DashboardBlob\n\n save(userId: string, blob: DashboardBlob): Promise<void> | void\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport {\n EMPTY_DASHBOARD,\n dashboardBlobZ,\n uuidv7,\n type ChartDef,\n type ChartDefInput,\n type ChartGroup,\n type DashboardBlob,\n type IDashboardStore,\n type TimeRange,\n} from '@modern-admin/core'\nimport type { AdminClient, TimeSeriesMetric, TimeSeriesStep } from './client.js'\n\nconst STORAGE_PREFIX = 'modern-admin:dashboard:v1:'\nconst ANON_USER = '__anon__'\n\n/**\n * localStorage-backed `IDashboardStore`. Persists one blob per user under\n * `modern-admin:dashboard:v1:<userId>` so multiple admins on the same\n * browser do not see each other's charts.\n *\n * SSR-safe: `typeof window` checks gate every access; on the server load()\n * returns `EMPTY_DASHBOARD` and save() is a no-op.\n */\nexport class LocalStorageDashboardStore implements IDashboardStore {\n load(userId: string): DashboardBlob {\n if (typeof window === 'undefined') return EMPTY_DASHBOARD\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + (userId || ANON_USER))\n if (!raw) return EMPTY_DASHBOARD\n const parsed = JSON.parse(raw) as unknown\n const result = dashboardBlobZ.safeParse(parsed)\n // Legacy bare-array shapes and other malformed blobs reset to empty\n // rather than crashing the dashboard.\n return result.success ? result.data : EMPTY_DASHBOARD\n } catch {\n return EMPTY_DASHBOARD\n }\n }\n\n save(userId: string, blob: DashboardBlob): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + (userId || ANON_USER),\n JSON.stringify(blob),\n )\n } catch {\n // Quota exceeded / private mode — silently drop.\n }\n }\n}\n\nconst defaultStore = new LocalStorageDashboardStore()\n\n/**\n * Server-backed `IDashboardStore` that persists per-user dashboard layouts\n * via `GET/PUT /admin/api/dashboard`. Requires `configStore` to be wired in\n * `ModernAdminModule.forRoot()`. Falls back gracefully when the endpoint\n * returns an empty dashboard (e.g. first load or missing configStore).\n */\nexport class ServerDashboardStore implements IDashboardStore {\n constructor(private readonly client: AdminClient) {}\n\n async load(_userId: string): Promise<DashboardBlob> {\n try {\n const res = await this.client.loadDashboard()\n return res.dashboard\n } catch {\n return EMPTY_DASHBOARD\n }\n }\n\n async save(_userId: string, blob: DashboardBlob): Promise<void> {\n try {\n await this.client.saveDashboard(blob)\n } catch {\n // Server unavailable — silently drop. The next save attempt will retry.\n }\n }\n}\n\n// ─── Time-range helpers ──────────────────────────────────────────────────\n\n/**\n * Resolve a `TimeRange` (preset or explicit custom) into concrete\n * inclusive `from`/`to` `YYYY-MM-DD` strings. Presets are anchored to\n * `now` so cards always reflect \"the last N days\" without re-saving.\n *\n * `'all'` resolves to a 10-year window ending at `now`, which is wide\n * enough for any realistic admin dataset while keeping the server's\n * date-range constraint satisfied.\n */\nexport function resolveRange(\n range: TimeRange,\n now: Date = new Date(),\n): { from: string; to: string } {\n if (range.preset === 'custom') return { from: range.from, to: range.to }\n const days =\n range.preset === '7d' ? 7\n : range.preset === '30d' ? 30\n : range.preset === '90d' ? 90\n : range.preset === '1y' ? 365\n : 3650 // 'all' → 10 years\n const to = new Date(now)\n const from = new Date(now)\n from.setDate(from.getDate() - days)\n return { from: ymd(from), to: ymd(to) }\n}\n\n/**\n * Equal-length window immediately preceding `[from, to]`.\n */\nexport function previousRangeOf(\n range: { from: string; to: string },\n): { from: string; to: string } | null {\n const f = new Date(range.from).getTime()\n const t = new Date(range.to).getTime()\n if (isNaN(f) || isNaN(t) || t < f) return null\n const span = t - f\n const prevTo = new Date(f - 86_400_000)\n const prevFrom = new Date(prevTo.getTime() - span)\n return { from: ymd(prevFrom), to: ymd(prevTo) }\n}\n\nconst ymd = (d: Date): string => d.toISOString().slice(0, 10)\n\n// ─── Reload signal ───────────────────────────────────────────────────────\n\n/**\n * Module-scoped pub/sub so external code (e.g. AI assistant widget after a\n * chart mutation) can force the dashboard to reload its blob from the store\n * without lifting state up. Subscribers are notified asynchronously.\n */\nconst dashboardReloadListeners = new Set<() => void>()\n\n/** Signal every mounted `useDashboardCharts` hook to reload from its store. */\nexport function emitDashboardReload(): void {\n for (const listener of dashboardReloadListeners) {\n try {\n listener()\n } catch {\n // Listener errors must not block sibling listeners.\n }\n }\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────────\n\nexport interface UseDashboardChartsOptions {\n /** Used to scope the storage key. `null`/`undefined` defers loading. */\n userId: string | null | undefined\n /** Override the default localStorage store (e.g. server-backed in future). */\n store?: IDashboardStore\n}\n\nexport interface UseDashboardChartsResult {\n charts: ChartDef[]\n /** Groups defined on the dashboard, sorted by `order` ascending. */\n groups: ChartGroup[]\n /** True until the initial load has resolved (relevant for async stores). */\n isLoading: boolean\n /** Append a new chart. Auto-assigns to the first group when groups exist and no `groupId` is provided. */\n addChart(input: ChartDefInput): void\n updateChart(id: string, input: ChartDefInput): void\n removeChart(id: string): void\n /**\n * Create a new group. When this is the very first group, every existing\n * (ungrouped) chart is moved into it so the user keeps the same view.\n * Returns the new group id so callers can switch to it.\n */\n addGroup(input: { name: string; order?: number }): string\n updateGroup(id: string, patch: { name?: string; order?: number }): void\n /** Remove a group AND every chart assigned to it. */\n removeGroup(id: string): void\n}\n\n/**\n * Per-user dashboard chart registry backed by `IDashboardStore` (default:\n * `LocalStorageDashboardStore`). When `userId` is null/undefined the hook\n * returns an empty list and ignores writes — used while\n * `useCurrentUser()` is still loading.\n */\nexport function useDashboardCharts(\n options: UseDashboardChartsOptions,\n): UseDashboardChartsResult {\n const { userId, store = defaultStore } = options\n const [charts, setCharts] = useState<ChartDef[]>([])\n const [groups, setGroups] = useState<ChartGroup[]>([])\n const [isLoading, setIsLoading] = useState(true)\n // Bumping this counter re-runs the load effect; used by external\n // `emitDashboardReload()` callers (e.g. AI assistant widget) so the hook\n // can pick up changes other actors made to the underlying store.\n const [reloadTick, setReloadTick] = useState(0)\n\n // Reload whenever `userId` flips (login / logout / switch) or an external\n // reload is signalled.\n useEffect(() => {\n if (!userId) {\n setCharts([])\n setIsLoading(false)\n return\n }\n let cancelled = false\n setIsLoading(true)\n Promise.resolve(store.load(userId)).then((blob) => {\n if (cancelled) return\n setCharts(blob.charts)\n setGroups([...blob.groups].sort(byOrderThenCreated))\n setIsLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [userId, store, reloadTick])\n\n // Subscribe to module-scoped reload signal.\n useEffect(() => {\n const listener = (): void => setReloadTick((tick) => tick + 1)\n dashboardReloadListeners.add(listener)\n return () => {\n dashboardReloadListeners.delete(listener)\n }\n }, [])\n\n // Single persist that writes BOTH charts and groups so a partial update\n // never strands one in localStorage while overwriting the other.\n const persist = useCallback(\n (nextCharts: ChartDef[], nextGroups: ChartGroup[]): void => {\n setCharts(nextCharts)\n setGroups([...nextGroups].sort(byOrderThenCreated))\n if (!userId) return\n void Promise.resolve(\n store.save(userId, { version: 1, charts: nextCharts, groups: nextGroups }),\n )\n },\n [userId, store],\n )\n\n const addChart = useCallback(\n (input: ChartDefInput): void => {\n const now = new Date().toISOString()\n // When groups exist and the caller didn't pick one, fall back to the\n // first-ordered group so the new chart is visible somewhere.\n const fallbackGroupId = input.groupId ?? groups[0]?.id\n const def = {\n ...input,\n id: uuidv7(),\n title: input.title ?? '',\n filters: input.filters ?? {},\n ...(fallbackGroupId ? { groupId: fallbackGroupId } : {}),\n createdAt: now,\n updatedAt: now,\n } as ChartDef\n persist([...charts, def], groups)\n },\n [charts, groups, persist],\n )\n\n const updateChart = useCallback(\n (id: string, input: ChartDefInput): void => {\n persist(\n charts.map((c) =>\n c.id === id\n ? ({\n ...c,\n ...input,\n id,\n title: input.title ?? '',\n filters: input.filters ?? {},\n createdAt: c.createdAt,\n updatedAt: new Date().toISOString(),\n } as ChartDef)\n : c,\n ),\n groups,\n )\n },\n [charts, groups, persist],\n )\n\n const removeChart = useCallback(\n (id: string): void => {\n persist(charts.filter((c) => c.id !== id), groups)\n },\n [charts, groups, persist],\n )\n\n const addGroup = useCallback(\n (input: { name: string; order?: number }): string => {\n const now = new Date().toISOString()\n const id = uuidv7()\n const next: ChartGroup = {\n id,\n name: input.name,\n order: input.order ?? groups.length,\n createdAt: now,\n updatedAt: now,\n }\n // First-group rule: existing ungrouped charts join this group so the\n // user does not lose their current dashboard view.\n const isFirstGroup = groups.length === 0\n const nextCharts = isFirstGroup\n ? charts.map((c) => (c.groupId ? c : { ...c, groupId: id, updatedAt: now }))\n : charts\n persist(nextCharts, [...groups, next])\n return id\n },\n [charts, groups, persist],\n )\n\n const updateGroup = useCallback(\n (id: string, patch: { name?: string; order?: number }): void => {\n const now = new Date().toISOString()\n persist(\n charts,\n groups.map((g) =>\n g.id === id\n ? {\n ...g,\n ...(patch.name !== undefined ? { name: patch.name } : {}),\n ...(patch.order !== undefined ? { order: patch.order } : {}),\n updatedAt: now,\n }\n : g,\n ),\n )\n },\n [charts, groups, persist],\n )\n\n const removeGroup = useCallback(\n (id: string): void => {\n // Cascading delete: every chart assigned to the group disappears with it.\n persist(charts.filter((c) => c.groupId !== id), groups.filter((g) => g.id !== id))\n },\n [charts, groups, persist],\n )\n\n return {\n charts,\n groups,\n isLoading,\n addChart,\n updateChart,\n removeChart,\n addGroup,\n updateGroup,\n removeGroup,\n }\n}\n\n/** Stable sort: by `order` ascending, then by `createdAt` for tie-breaking. */\nfunction byOrderThenCreated(a: { order: number; createdAt: string }, b: { order: number; createdAt: string }): number {\n if (a.order !== b.order) return a.order - b.order\n return a.createdAt.localeCompare(b.createdAt)\n}\n\n// Re-export types from client for convenience so consumers import from one place.\nexport type { TimeSeriesMetric, TimeSeriesStep }\nexport type { ChartDef, ChartDefInput, ChartGroup } from '@modern-admin/core'\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-dashboard-charts-aymvhXUB.js","names":[],"sources":["../../../../core/src/dashboard/store.ts","../../../../react/src/use-dashboard-charts.ts"],"sourcesContent":["// Dashboard / chart-builder schemas and storage port.\n//\n// Source of truth for the on-disk shape of saved dashboards. Both the\n// frontend (localStorage default) and any future server-side store\n// implement the same `IDashboardStore` interface, so the UI is agnostic\n// to where the data actually lives.\n\nimport { z } from 'zod'\n\n// Pie removed in Phase 10 — time-series first means category-only charts\n// don't fit the model.\nexport const chartVisualisationZ = z.enum(['kpi', 'line', 'area', 'bar'])\nexport type ChartVisualisation = z.infer<typeof chartVisualisationZ>\n\nexport const aggregationOpZ = z.enum(['count', 'sum', 'avg', 'min', 'max'])\nexport type AggregationOpName = z.infer<typeof aggregationOpZ>\n\n// `'all'` collapses the whole window into one bucket (KPI mode).\nexport const aggregationStepZ = z.enum(['day', 'week', 'month', 'year', 'all'])\nexport type AggregationStep = z.infer<typeof aggregationStepZ>\n\nexport const timeRangePresetZ = z.enum(['7d', '30d', '90d', '1y', 'all', 'custom'])\nexport type TimeRangePreset = z.infer<typeof timeRangePresetZ>\n\n/** Tile width on the dashboard grid. `'half'` = 1 of 2 columns at md+, `'full'` = full row. */\nexport const chartWidthZ = z.enum(['half', 'full'])\nexport type ChartWidth = z.infer<typeof chartWidthZ>\n\n/**\n * Time range stored on a chart. Presets resolve to concrete from/to at\n * render time so cards always reflect \"now\" without re-saving.\n */\nexport const timeRangeZ = z.discriminatedUnion('preset', [\n z.object({ preset: z.enum(['7d', '30d', '90d', '1y', 'all']) }),\n z.object({\n preset: z.literal('custom'),\n from: z.iso.date(),\n to: z.iso.date(),\n }),\n])\nexport type TimeRange = z.infer<typeof timeRangeZ>\n\n/**\n * One step of the presentation-only value pipeline applied client-side\n * before charting (so axis, tooltip and KPI values agree), e.g.\n * `{ op: 'divide', value: 100 }` to show cents as dollars.\n */\nexport const chartTransformStepZ = z.object({\n op: z.enum(['divide', 'multiply', 'add', 'subtract']),\n value: z.number().finite(),\n})\nexport type ChartTransformStep = z.infer<typeof chartTransformStepZ>\n\n/**\n * Display formatting applied at render time via `Intl.NumberFormat`.\n * Note: `percent` follows Intl semantics (0.42 → \"42%\"). `compact`\n * abbreviates large values (12.5k / 1.2M).\n */\nexport const chartFormatZ = z.object({\n style: z.enum(['number', 'currency', 'percent']).default('number'),\n /** ISO 4217 code; render layer falls back to 'USD' when absent. */\n currency: z.string().length(3).optional(),\n decimals: z.number().int().min(0).max(6).optional(),\n prefix: z.string().max(8).optional(),\n suffix: z.string().max(8).optional(),\n compact: z.boolean().optional(),\n})\nexport type ChartFormat = z.infer<typeof chartFormatZ>\n\n/**\n * Per-series style overrides, keyed by the stable series key\n * (`__total__`, a groupBy value, `__other__`, …) — never by display label.\n * Absent series fall back to the palette color for their index.\n */\nexport const seriesStyleZ = z.object({\n color: z\n .string()\n .regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/)\n .optional(),\n})\nexport type SeriesStyle = z.infer<typeof seriesStyleZ>\n\nexport const chartDefZ = z\n .object({\n id: z.uuid(),\n title: z.string().max(120).default(''),\n resource: z.string().min(1),\n visualisation: chartVisualisationZ,\n /** Property path of the date/datetime column used for X-axis bucketing. */\n dateField: z.string().min(1),\n /** Time bucket granularity. KPI charts always use `'all'`. */\n step: aggregationStepZ,\n metric: aggregationOpZ,\n /** Required for non-count metrics. */\n field: z.string().min(1).optional(),\n /** Optional secondary breakdown — produces one series per distinct value. */\n groupBy: z.string().min(1).optional(),\n /** Maximum series count for `groupBy`-charts; rest collapses to \"other\". */\n topN: z.number().int().min(1).max(50).default(10),\n /**\n * When `groupBy` produces FK ids (reference property), the analytics\n * endpoint resolves them to human-readable titles via `findMany` on this\n * resource id. Auto-set by the chart builder when it detects a reference\n * property in the `groupBy` selector.\n */\n groupByLabelResource: z.string().min(1).optional(),\n width: chartWidthZ.default('half'),\n filters: z.record(z.string(), z.string()).default({}),\n /**\n * Property paths exposed as \"quick filters\" above the chart on the\n * dashboard tile. Their values are taken from `filters` but the widget\n * lets the user tweak them inline and apply via a dedicated Apply button.\n */\n quickFilters: z.array(z.string()).default([]),\n timeRange: timeRangeZ,\n /** Per-series style overrides keyed by stable series key. */\n series: z.record(z.string(), seriesStyleZ).optional(),\n /** Presentation-only value pipeline, applied in order before charting. */\n transform: z.array(chartTransformStepZ).max(8).default([]),\n /** Display number format for axis / tooltip / KPI values. */\n format: chartFormatZ.optional(),\n /**\n * Overlay the equal-length preceding window as a dashed series and show\n * the period-over-period delta next to the title. Only honoured for\n * charts without `groupBy` (top-N keys are not stable across windows).\n */\n comparePrevious: z.boolean().default(false),\n /**\n * Optional group membership. `undefined` means the chart is not assigned\n * to any group yet — when at least one group exists, ungrouped charts\n * are bucketed into the first group (by `order`) at display time.\n */\n groupId: z.uuid().optional(),\n /** Sort key within a group; lower numbers come first. Defaults to 0. */\n order: z.number().int().default(0),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n })\n .refine((c) => c.metric === 'count' || !!c.field, {\n message: 'field is required when metric is not count',\n path: ['field'],\n })\n .refine((c) => c.visualisation !== 'kpi' || c.step === 'all', {\n message: \"KPI charts must use step 'all'\",\n path: ['step'],\n })\n .refine((c) => c.visualisation === 'kpi' || c.step !== 'all', {\n message: \"non-KPI charts cannot use step 'all'\",\n path: ['step'],\n })\n\nexport type ChartDef = z.infer<typeof chartDefZ>\nexport type ChartDefInput = z.input<typeof chartDefZ>\n\n/**\n * Group of charts on the dashboard. Groups are rendered as tabs above the\n * charts grid. When the user creates the very first group, all existing\n * (ungrouped) charts are auto-assigned to it.\n */\nexport const chartGroupZ = z.object({\n id: z.uuid(),\n name: z.string().min(1).max(120),\n /** Sort key for the tab strip; lower numbers come first. */\n order: z.number().int().default(0),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n})\nexport type ChartGroup = z.infer<typeof chartGroupZ>\nexport type ChartGroupInput = z.input<typeof chartGroupZ>\n\nexport const dashboardBlobZ = z.object({\n version: z.literal(1),\n charts: z.array(chartDefZ),\n /** Optional — legacy blobs without `groups` parse cleanly via `.default([])`. */\n groups: z.array(chartGroupZ).default([]),\n})\nexport type DashboardBlob = z.infer<typeof dashboardBlobZ>\n\nexport const EMPTY_DASHBOARD: DashboardBlob = { version: 1, charts: [], groups: [] }\n\n/**\n * Per-user dashboard storage port. Default implementation in\n * `@modern-admin/react` is browser-localStorage; a server-side store\n * implementing this same shape can be plugged in later without UI changes.\n */\nexport interface IDashboardStore {\n load(userId: string): Promise<DashboardBlob> | DashboardBlob\n\n save(userId: string, blob: DashboardBlob): Promise<void> | void\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport {\n EMPTY_DASHBOARD,\n dashboardBlobZ,\n uuidv7,\n type ChartDef,\n type ChartDefInput,\n type ChartGroup,\n type DashboardBlob,\n type IDashboardStore,\n type TimeRange,\n} from '@modern-admin/core'\nimport type { AdminClient, TimeSeriesMetric, TimeSeriesStep } from './client.js'\n\nconst STORAGE_PREFIX = 'modern-admin:dashboard:v1:'\nconst ANON_USER = '__anon__'\n\n/**\n * localStorage-backed `IDashboardStore`. Persists one blob per user under\n * `modern-admin:dashboard:v1:<userId>` so multiple admins on the same\n * browser do not see each other's charts.\n *\n * SSR-safe: `typeof window` checks gate every access; on the server load()\n * returns `EMPTY_DASHBOARD` and save() is a no-op.\n */\nexport class LocalStorageDashboardStore implements IDashboardStore {\n load(userId: string): DashboardBlob {\n if (typeof window === 'undefined') return EMPTY_DASHBOARD\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + (userId || ANON_USER))\n if (!raw) return EMPTY_DASHBOARD\n const parsed = JSON.parse(raw) as unknown\n const result = dashboardBlobZ.safeParse(parsed)\n // Legacy bare-array shapes and other malformed blobs reset to empty\n // rather than crashing the dashboard.\n return result.success ? result.data : EMPTY_DASHBOARD\n } catch {\n return EMPTY_DASHBOARD\n }\n }\n\n save(userId: string, blob: DashboardBlob): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + (userId || ANON_USER),\n JSON.stringify(blob),\n )\n } catch {\n // Quota exceeded / private mode — silently drop.\n }\n }\n}\n\nconst defaultStore = new LocalStorageDashboardStore()\n\n/**\n * Server-backed `IDashboardStore` that persists per-user dashboard layouts\n * via `GET/PUT /admin/api/dashboard`. Requires `configStore` to be wired in\n * `ModernAdminModule.forRoot()`. Falls back gracefully when the endpoint\n * returns an empty dashboard (e.g. first load or missing configStore).\n */\nexport class ServerDashboardStore implements IDashboardStore {\n constructor(private readonly client: AdminClient) {}\n\n async load(_userId: string): Promise<DashboardBlob> {\n try {\n const res = await this.client.loadDashboard()\n return res.dashboard\n } catch {\n return EMPTY_DASHBOARD\n }\n }\n\n async save(_userId: string, blob: DashboardBlob): Promise<void> {\n try {\n await this.client.saveDashboard(blob)\n } catch {\n // Server unavailable — silently drop. The next save attempt will retry.\n }\n }\n}\n\n// ─── Time-range helpers ──────────────────────────────────────────────────\n\n/**\n * Resolve a `TimeRange` (preset or explicit custom) into concrete\n * inclusive `from`/`to` `YYYY-MM-DD` strings. Presets are anchored to\n * `now` so cards always reflect \"the last N days\" without re-saving.\n *\n * `'all'` resolves to a 10-year window ending at `now`, which is wide\n * enough for any realistic admin dataset while keeping the server's\n * date-range constraint satisfied.\n */\nexport function resolveRange(\n range: TimeRange,\n now: Date = new Date(),\n): { from: string; to: string } {\n if (range.preset === 'custom') return { from: range.from, to: range.to }\n const days =\n range.preset === '7d' ? 7\n : range.preset === '30d' ? 30\n : range.preset === '90d' ? 90\n : range.preset === '1y' ? 365\n : 3650 // 'all' → 10 years\n const to = new Date(now)\n const from = new Date(now)\n from.setDate(from.getDate() - days)\n return { from: ymd(from), to: ymd(to) }\n}\n\n/**\n * Equal-length window immediately preceding `[from, to]`.\n */\nexport function previousRangeOf(\n range: { from: string; to: string },\n): { from: string; to: string } | null {\n const f = new Date(range.from).getTime()\n const t = new Date(range.to).getTime()\n if (isNaN(f) || isNaN(t) || t < f) return null\n const span = t - f\n const prevTo = new Date(f - 86_400_000)\n const prevFrom = new Date(prevTo.getTime() - span)\n return { from: ymd(prevFrom), to: ymd(prevTo) }\n}\n\nconst ymd = (d: Date): string => d.toISOString().slice(0, 10)\n\n// ─── Reload signal ───────────────────────────────────────────────────────\n\n/**\n * Module-scoped pub/sub so external code (e.g. AI assistant widget after a\n * chart mutation) can force the dashboard to reload its blob from the store\n * without lifting state up. Subscribers are notified asynchronously.\n */\nconst dashboardReloadListeners = new Set<() => void>()\n\n/** Signal every mounted `useDashboardCharts` hook to reload from its store. */\nexport function emitDashboardReload(): void {\n for (const listener of dashboardReloadListeners) {\n try {\n listener()\n } catch {\n // Listener errors must not block sibling listeners.\n }\n }\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────────\n\nexport interface UseDashboardChartsOptions {\n /** Used to scope the storage key. `null`/`undefined` defers loading. */\n userId: string | null | undefined\n /** Override the default localStorage store (e.g. server-backed in future). */\n store?: IDashboardStore\n}\n\nexport interface UseDashboardChartsResult {\n charts: ChartDef[]\n /** Groups defined on the dashboard, sorted by `order` ascending. */\n groups: ChartGroup[]\n /** True until the initial load has resolved (relevant for async stores). */\n isLoading: boolean\n /** Append a new chart. Auto-assigns to the first group when groups exist and no `groupId` is provided. */\n addChart(input: ChartDefInput): void\n updateChart(id: string, input: ChartDefInput): void\n removeChart(id: string): void\n /**\n * Create a new group. When this is the very first group, every existing\n * (ungrouped) chart is moved into it so the user keeps the same view.\n * Returns the new group id so callers can switch to it.\n */\n addGroup(input: { name: string; order?: number }): string\n updateGroup(id: string, patch: { name?: string; order?: number }): void\n /** Remove a group AND every chart assigned to it. */\n removeGroup(id: string): void\n}\n\n/**\n * Per-user dashboard chart registry backed by `IDashboardStore` (default:\n * `LocalStorageDashboardStore`). When `userId` is null/undefined the hook\n * returns an empty list and ignores writes — used while\n * `useCurrentUser()` is still loading.\n */\nexport function useDashboardCharts(\n options: UseDashboardChartsOptions,\n): UseDashboardChartsResult {\n const { userId, store = defaultStore } = options\n const [charts, setCharts] = useState<ChartDef[]>([])\n const [groups, setGroups] = useState<ChartGroup[]>([])\n const [isLoading, setIsLoading] = useState(true)\n // Bumping this counter re-runs the load effect; used by external\n // `emitDashboardReload()` callers (e.g. AI assistant widget) so the hook\n // can pick up changes other actors made to the underlying store.\n const [reloadTick, setReloadTick] = useState(0)\n\n // Reload whenever `userId` flips (login / logout / switch) or an external\n // reload is signalled.\n useEffect(() => {\n if (!userId) {\n setCharts([])\n setIsLoading(false)\n return\n }\n let cancelled = false\n setIsLoading(true)\n Promise.resolve(store.load(userId)).then((blob) => {\n if (cancelled) return\n setCharts(blob.charts)\n setGroups([...blob.groups].sort(byOrderThenCreated))\n setIsLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [userId, store, reloadTick])\n\n // Subscribe to module-scoped reload signal.\n useEffect(() => {\n const listener = (): void => setReloadTick((tick) => tick + 1)\n dashboardReloadListeners.add(listener)\n return () => {\n dashboardReloadListeners.delete(listener)\n }\n }, [])\n\n // Single persist that writes BOTH charts and groups so a partial update\n // never strands one in localStorage while overwriting the other.\n const persist = useCallback(\n (nextCharts: ChartDef[], nextGroups: ChartGroup[]): void => {\n setCharts(nextCharts)\n setGroups([...nextGroups].sort(byOrderThenCreated))\n if (!userId) return\n void Promise.resolve(\n store.save(userId, { version: 1, charts: nextCharts, groups: nextGroups }),\n )\n },\n [userId, store],\n )\n\n const addChart = useCallback(\n (input: ChartDefInput): void => {\n const now = new Date().toISOString()\n // When groups exist and the caller didn't pick one, fall back to the\n // first-ordered group so the new chart is visible somewhere.\n const fallbackGroupId = input.groupId ?? groups[0]?.id\n const def = {\n ...input,\n id: uuidv7(),\n title: input.title ?? '',\n filters: input.filters ?? {},\n ...(fallbackGroupId ? { groupId: fallbackGroupId } : {}),\n createdAt: now,\n updatedAt: now,\n } as ChartDef\n persist([...charts, def], groups)\n },\n [charts, groups, persist],\n )\n\n const updateChart = useCallback(\n (id: string, input: ChartDefInput): void => {\n persist(\n charts.map((c) =>\n c.id === id\n ? ({\n ...c,\n ...input,\n id,\n title: input.title ?? '',\n filters: input.filters ?? {},\n createdAt: c.createdAt,\n updatedAt: new Date().toISOString(),\n } as ChartDef)\n : c,\n ),\n groups,\n )\n },\n [charts, groups, persist],\n )\n\n const removeChart = useCallback(\n (id: string): void => {\n persist(charts.filter((c) => c.id !== id), groups)\n },\n [charts, groups, persist],\n )\n\n const addGroup = useCallback(\n (input: { name: string; order?: number }): string => {\n const now = new Date().toISOString()\n const id = uuidv7()\n const next: ChartGroup = {\n id,\n name: input.name,\n order: input.order ?? groups.length,\n createdAt: now,\n updatedAt: now,\n }\n // First-group rule: existing ungrouped charts join this group so the\n // user does not lose their current dashboard view.\n const isFirstGroup = groups.length === 0\n const nextCharts = isFirstGroup\n ? charts.map((c) => (c.groupId ? c : { ...c, groupId: id, updatedAt: now }))\n : charts\n persist(nextCharts, [...groups, next])\n return id\n },\n [charts, groups, persist],\n )\n\n const updateGroup = useCallback(\n (id: string, patch: { name?: string; order?: number }): void => {\n const now = new Date().toISOString()\n persist(\n charts,\n groups.map((g) =>\n g.id === id\n ? {\n ...g,\n ...(patch.name !== undefined ? { name: patch.name } : {}),\n ...(patch.order !== undefined ? { order: patch.order } : {}),\n updatedAt: now,\n }\n : g,\n ),\n )\n },\n [charts, groups, persist],\n )\n\n const removeGroup = useCallback(\n (id: string): void => {\n // Cascading delete: every chart assigned to the group disappears with it.\n persist(charts.filter((c) => c.groupId !== id), groups.filter((g) => g.id !== id))\n },\n [charts, groups, persist],\n )\n\n return {\n charts,\n groups,\n isLoading,\n addChart,\n updateChart,\n removeChart,\n addGroup,\n updateGroup,\n removeGroup,\n }\n}\n\n/** Stable sort: by `order` ascending, then by `createdAt` for tie-breaking. */\nfunction byOrderThenCreated(a: { order: number; createdAt: string }, b: { order: number; createdAt: string }): number {\n if (a.order !== b.order) return a.order - b.order\n return a.createdAt.localeCompare(b.createdAt)\n}\n\n// Re-export types from client for convenience so consumers import from one place.\nexport type { TimeSeriesMetric, TimeSeriesStep }\nexport type { ChartDef, ChartDefInput, ChartGroup } from '@modern-admin/core'\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{C as n,S as r,_ as i,a,d as o,f as s,h as c,i as l,l as u,o as d,p as f,r as p,w as m,y as ee}from"./floating-layer-DJGCYMex.js";import{a as h,i as g,n as _,r as te,t as v}from"./dist-CmyV2PEd.js";import{$ as ne,B as re,G as y,H as b,J as x,K as S,Q as C,U as w,V as T,W as E,X as D,Y as O,Z as ie,at as ae,et as oe,it as se,ot as ce,q as le,rt as ue}from"./hooks-DHDUQgzs.js";var k=e(t(),1),A=m(),j=`Popover`,[M,de]=n(j,[h]),N=h(),[P,F]=M(j),I=e=>{let{__scopePopover:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:s=!1}=e,l=N(t),u=k.useRef(null),[d,f]=k.useState(!1),[p,m]=c({prop:r,defaultProp:i??!1,onChange:a,caller:j});return(0,A.jsx)(g,{...l,children:(0,A.jsx)(P,{scope:t,contentId:o(),triggerRef:u,open:p,onOpenChange:m,onOpenToggle:k.useCallback(()=>m(e=>!e),[m]),hasCustomAnchor:d,onCustomAnchorAdd:k.useCallback(()=>f(!0),[]),onCustomAnchorRemove:k.useCallback(()=>f(!1),[]),modal:s,children:n})})};I.displayName=j;var L=`PopoverAnchor`,R=k.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=F(L,n),a=N(n),{onCustomAnchorAdd:o,onCustomAnchorRemove:s}=i;return k.useEffect(()=>(o(),()=>s()),[o,s]),(0,A.jsx)(v,{...a,...r,ref:t})});R.displayName=L;var z=`PopoverTrigger`,B=k.forwardRef((e,t)=>{let{__scopePopover:n,...a}=e,o=F(z,n),s=N(n),c=r(t,o.triggerRef),l=(0,A.jsx)(f.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":Y(o.open),...a,ref:c,onClick:i(e.onClick,o.onOpenToggle)});return o.hasCustomAnchor?l:(0,A.jsx)(v,{asChild:!0,...s,children:l})});B.displayName=z;var V=`PopoverPortal`,[H,U]=M(V,{forceMount:void 0}),W=e=>{let{__scopePopover:t,forceMount:n,children:r,container:i}=e,o=F(V,t);return(0,A.jsx)(H,{scope:t,forceMount:n,children:(0,A.jsx)(s,{present:n||o.open,children:(0,A.jsx)(a,{asChild:!0,container:i,children:r})})})};W.displayName=V;var G=`PopoverContent`,K=k.forwardRef((e,t)=>{let n=U(G,e.__scopePopover),{forceMount:r=n.forceMount,...i}=e,a=F(G,e.__scopePopover);return(0,A.jsx)(s,{present:r||a.open,children:a.modal?(0,A.jsx)(pe,{...i,ref:t}):(0,A.jsx)(me,{...i,ref:t})})});K.displayName=G;var fe=ee(`PopoverContent.RemoveScroll`),pe=k.forwardRef((e,t)=>{let n=F(G,e.__scopePopover),a=k.useRef(null),o=r(t,a),s=k.useRef(!1);return k.useEffect(()=>{let e=a.current;if(e)return se(e)},[]),(0,A.jsx)(ue,{as:fe,allowPinchZoom:!0,children:(0,A.jsx)(q,{...e,ref:o,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:i(e.onCloseAutoFocus,e=>{e.preventDefault(),s.current||n.triggerRef.current?.focus()}),onPointerDownOutside:i(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0,r=t.button===2||n;s.current=r},{checkForDefaultPrevented:!1}),onFocusOutside:i(e.onFocusOutside,e=>e.preventDefault(),{checkForDefaultPrevented:!1})})})}),me=k.forwardRef((e,t)=>{let n=F(G,e.__scopePopover),r=k.useRef(!1),i=k.useRef(!1);return(0,A.jsx)(q,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})}),q=k.forwardRef((e,t)=>{let{__scopePopover:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,disableOutsidePointerEvents:o,onEscapeKeyDown:s,onPointerDownOutside:c,onFocusOutside:l,onInteractOutside:u,...f}=e,p=F(G,n),m=N(n);return ce(),(0,A.jsx)(ae,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,A.jsx)(d,{asChild:!0,disableOutsidePointerEvents:o,onInteractOutside:u,onEscapeKeyDown:s,onPointerDownOutside:c,onFocusOutside:l,onDismiss:()=>p.onOpenChange(!1),deferPointerDownOutside:!0,children:(0,A.jsx)(te,{"data-state":Y(p.open),role:`dialog`,id:p.contentId,...m,...f,ref:t,style:{...f.style,"--radix-popover-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-popover-content-available-width":`var(--radix-popper-available-width)`,"--radix-popover-content-available-height":`var(--radix-popper-available-height)`,"--radix-popover-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-popover-trigger-height":`var(--radix-popper-anchor-height)`}})})})}),J=`PopoverClose`,he=k.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,a=F(J,n);return(0,A.jsx)(f.button,{type:`button`,...r,ref:t,onClick:i(e.onClick,()=>a.onOpenChange(!1))})});he.displayName=J;var ge=`PopoverArrow`,_e=k.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=N(n);return(0,A.jsx)(_,{...i,...r,ref:t})});_e.displayName=ge;function Y(e){return e?`open`:`closed`}var ve=I,ye=R,be=B,xe=W,X=K,Se=ve,Z=be,Ce=ye,Q=k.forwardRef(({className:e,align:t=`center`,sideOffset:n=4,collisionPadding:r,container:i,...a},o)=>{let s=p(),c=l();return(0,A.jsx)(xe,{container:i??s,children:(0,A.jsx)(X,{ref:o,align:t,sideOffset:n,collisionPadding:r??c,className:u(`z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2`,e),...a})})});Q.displayName=X.displayName;function $(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function we(e,t,n){let r=e.slice(0);return r[t]=n,r}var Te=class extends oe{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,D.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!ne(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&($(e,n).forEach(e=>{e.destroy()}),$(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=C(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new O(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=we(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&D.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}};function Ee({queries:e,...t},n){let r=x(n),i=le(),a=S(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{re(e);let t=r.getQueryCache().get(e.queryHash);w(e,a,t)}),y(a);let[s]=k.useState(()=>new Te(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(D.batchCalls(e)):ie,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>b(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&b(n,e)?T(n,new O(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&E({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}export{Z as a,Q as i,Se as n,Ce as r,Ee as t};
2
+ //# sourceMappingURL=useQueries-Dch5Ggjr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQueries-Ba2PuYhZ.js","names":["Popover","PopperPrimitive.Root","PopoverAnchor","PopperPrimitive.Anchor","PopoverTrigger","PortalPrimitive","PopoverContent","RemoveScroll","PopperPrimitive.Content","PopperPrimitive.Arrow","#client","#options","#queries","#observers","#result","#onUpdate","#findMatchingObservers","#observerMatches","#notify","#combineResult","#trackResult","#lastQueryHashes","#combinedResult","#lastResult","#lastCombine","#shouldSkipCombine"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-popover@1.1.19+ae2b4604ef263bc9/node_modules/@radix-ui/react-popover/dist/index.mjs","../../../../ui/src/components/popover.tsx","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/queriesObserver.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/useQueries.js"],"sourcesContent":["\"use client\";\n\n// src/popover.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar POPOVER_NAME = \"Popover\";\nvar [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);\nvar Popover = (props) => {\n const {\n __scopePopover,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = false\n } = props;\n const popperScope = usePopperScope(__scopePopover);\n const triggerRef = React.useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = React.useState(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: POPOVER_NAME\n });\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n PopoverProvider,\n {\n scope: __scopePopover,\n contentId: useId(),\n triggerRef,\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n hasCustomAnchor,\n onCustomAnchorAdd: React.useCallback(() => setHasCustomAnchor(true), []),\n onCustomAnchorRemove: React.useCallback(() => setHasCustomAnchor(false), []),\n modal,\n children\n }\n ) });\n};\nPopover.displayName = POPOVER_NAME;\nvar ANCHOR_NAME = \"PopoverAnchor\";\nvar PopoverAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...anchorProps } = props;\n const context = usePopoverContext(ANCHOR_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const { onCustomAnchorAdd, onCustomAnchorRemove } = context;\n React.useEffect(() => {\n onCustomAnchorAdd();\n return () => onCustomAnchorRemove();\n }, [onCustomAnchorAdd, onCustomAnchorRemove]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nPopoverAnchor.displayName = ANCHOR_NAME;\nvar TRIGGER_NAME = \"PopoverTrigger\";\nvar PopoverTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...triggerProps } = props;\n const context = usePopoverContext(TRIGGER_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.open ? context.contentId : void 0,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: trigger });\n }\n);\nPopoverTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"PopoverPortal\";\nvar [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar PopoverPortal = (props) => {\n const { __scopePopover, forceMount, children, container } = props;\n const context = usePopoverContext(PORTAL_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nPopoverPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"PopoverContent\";\nvar PopoverContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nPopoverContent.displayName = CONTENT_NAME;\nvar Slot = createSlot(\"PopoverContent.RemoveScroll\");\nvar PopoverContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = React.useRef(false);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n if (!isRightClickOutsideRef.current) context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(\n props.onPointerDownOutside,\n (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutsideRef.current = isRightClick;\n },\n { checkForDefaultPrevented: false }\n ),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nvar PopoverContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar PopoverContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopover,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n ...contentProps\n } = props;\n const context = usePopoverContext(CONTENT_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n useFocusGuards();\n return /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onDismiss: () => context.onOpenChange(false),\n deferPointerDownOutside: true,\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n \"data-state\": getState(context.open),\n role: \"dialog\",\n id: context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-popover-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-popover-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-popover-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-popover-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-popover-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n )\n }\n )\n }\n );\n }\n);\nvar CLOSE_NAME = \"PopoverClose\";\nvar PopoverClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...closeProps } = props;\n const context = usePopoverContext(CLOSE_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nPopoverClose.displayName = CLOSE_NAME;\nvar ARROW_NAME = \"PopoverArrow\";\nvar PopoverArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopePopover);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nPopoverArrow.displayName = ARROW_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar Root2 = Popover;\nvar Anchor2 = PopoverAnchor;\nvar Trigger = PopoverTrigger;\nvar Portal = PopoverPortal;\nvar Content2 = PopoverContent;\nvar Close = PopoverClose;\nvar Arrow2 = PopoverArrow;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n Close,\n Content2 as Content,\n Popover,\n PopoverAnchor,\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverTrigger,\n Portal,\n Root2 as Root,\n Trigger,\n createPopoverScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { cn } from '../lib/utils.js'\nimport { usePortalContainer, useViewportCollisionPadding } from '../lib/floating-layer.js'\n\nexport const Popover = PopoverPrimitive.Root\nexport const PopoverTrigger = PopoverPrimitive.Trigger\nexport const PopoverAnchor = PopoverPrimitive.Anchor\n\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {\n /** Override the portal target. Defaults to the enclosing Dialog/Sheet\n * content (so touch-scroll works inside it) or `document.body`. */\n container?: HTMLElement | null\n}\n\nexport const PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(({ className, align = 'center', sideOffset = 4, collisionPadding, container, ...props }, ref) => {\n const portalContainer = usePortalContainer()\n const viewportPadding = useViewportCollisionPadding()\n return (\n <PopoverPrimitive.Portal container={container ?? portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding ?? viewportPadding}\n className={cn(\n 'z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n})\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n","// src/queriesObserver.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { QueryObserver } from \"./queryObserver.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { replaceEqualDeep, shallowEqualObjects } from \"./utils.js\";\nfunction difference(array1, array2) {\n const excludeSet = new Set(array2);\n return array1.filter((x) => !excludeSet.has(x));\n}\nfunction replaceAt(array, index, value) {\n const copy = array.slice(0);\n copy[index] = value;\n return copy;\n}\nvar QueriesObserver = class extends Subscribable {\n #client;\n #result;\n #queries;\n #options;\n #observers;\n #combinedResult;\n #lastCombine;\n #lastResult;\n #lastQueryHashes;\n #observerMatches = [];\n constructor(client, queries, options) {\n super();\n this.#client = client;\n this.#options = options;\n this.#queries = [];\n this.#observers = [];\n this.#result = [];\n this.setQueries(queries);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result);\n });\n });\n }\n }\n onUnsubscribe() {\n if (!this.listeners.size) {\n this.destroy();\n }\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#observers.forEach((observer) => {\n observer.destroy();\n });\n }\n setQueries(queries, options) {\n this.#queries = queries;\n this.#options = options;\n if (process.env.NODE_ENV !== \"production\") {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash\n );\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n \"[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.\"\n );\n }\n }\n notifyManager.batch(() => {\n const prevObservers = this.#observers;\n const newObserverMatches = this.#findMatchingObservers(this.#queries);\n newObserverMatches.forEach(\n (match) => match.observer.setOptions(match.defaultedQueryOptions)\n );\n const newObservers = newObserverMatches.map((match) => match.observer);\n const newResult = newObservers.map(\n (observer) => observer.getCurrentResult()\n );\n const hasLengthChange = prevObservers.length !== newObservers.length;\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index]\n );\n const hasStructuralChange = hasLengthChange || hasIndexChange;\n const hasResultChange = hasStructuralChange ? true : newResult.some((result, index) => {\n const prev = this.#result[index];\n return !prev || !shallowEqualObjects(result, prev);\n });\n if (!hasStructuralChange && !hasResultChange) return;\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches;\n this.#observers = newObservers;\n }\n this.#result = newResult;\n if (!this.hasListeners()) return;\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy();\n });\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result);\n });\n });\n }\n this.#notify();\n });\n }\n getCurrentResult() {\n return this.#result;\n }\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery());\n }\n getObservers() {\n return this.#observers;\n }\n getOptimisticResult(queries, combine) {\n const matches = this.#findMatchingObservers(queries);\n const result = matches.map(\n (match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)\n );\n const queryHashes = matches.map(\n (match) => match.defaultedQueryOptions.queryHash\n );\n return [\n result,\n (r) => {\n return this.#combineResult(r ?? result, combine, queryHashes);\n },\n () => {\n return this.#trackResult(result, matches);\n }\n ];\n }\n #trackResult(result, matches) {\n return matches.map((match, index) => {\n const observerResult = result[index];\n return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => {\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp);\n });\n }) : observerResult;\n });\n }\n #combineResult(input, combine, queryHashes) {\n if (combine) {\n const lastHashes = this.#lastQueryHashes;\n const queryHashesChanged = queryHashes !== void 0 && lastHashes !== void 0 && (lastHashes.length !== queryHashes.length || queryHashes.some((hash, i) => hash !== lastHashes[i]));\n if (!this.#combinedResult || this.#result !== this.#lastResult || queryHashesChanged || combine !== this.#lastCombine) {\n this.#lastCombine = combine;\n this.#lastResult = this.#result;\n if (queryHashes !== void 0) {\n this.#lastQueryHashes = queryHashes;\n }\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input)\n );\n }\n return this.#combinedResult;\n }\n return input;\n }\n #shouldSkipCombine() {\n return this.#options?.combine !== void 0 && this.#observers.some((observer, index) => {\n return observer.options.suspense && this.#result[index]?.data === void 0;\n });\n }\n #findMatchingObservers(queries) {\n const prevObserversMap = /* @__PURE__ */ new Map();\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash;\n if (!key) return;\n const previousObservers = prevObserversMap.get(key);\n if (previousObservers) {\n previousObservers.push(observer);\n } else {\n prevObserversMap.set(key, [observer]);\n }\n });\n const observers = [];\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift();\n const observer = match ?? new QueryObserver(this.#client, defaultedOptions);\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer\n });\n });\n return observers;\n }\n #onUpdate(observer, result) {\n const index = this.#observers.indexOf(observer);\n if (index !== -1) {\n this.#result = replaceAt(this.#result, index, result);\n this.#notify();\n }\n }\n #notify() {\n if (this.hasListeners()) {\n const newTracked = this.#trackResult(this.#result, this.#observerMatches);\n const shouldSkipCombine = this.#shouldSkipCombine();\n const previousResult = this.#combinedResult;\n const newResult = shouldSkipCombine ? previousResult : this.#combineResult(newTracked, this.#options?.combine);\n if (shouldSkipCombine || previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result);\n });\n });\n }\n }\n }\n};\nexport {\n QueriesObserver\n};\n//# sourceMappingURL=queriesObserver.js.map","\"use client\";\n\n// src/useQueries.ts\nimport * as React from \"react\";\nimport {\n QueriesObserver,\n QueryObserver,\n noop,\n notifyManager\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend\n} from \"./suspense.js\";\nfunction useQueries({\n queries,\n ...options\n}, queryClient) {\n const client = useQueryClient(queryClient);\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const defaultedQueries = React.useMemo(\n () => queries.map((opts) => {\n const defaultedOptions = client.defaultQueryOptions(\n opts\n );\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n return defaultedOptions;\n }),\n [queries, client, isRestoring]\n );\n defaultedQueries.forEach((queryOptions) => {\n ensureSuspenseTimers(queryOptions);\n const query = client.getQueryCache().get(queryOptions.queryHash);\n ensurePreventErrorBoundaryRetry(queryOptions, errorResetBoundary, query);\n });\n useClearResetErrorBoundary(errorResetBoundary);\n const [observer] = React.useState(\n () => new QueriesObserver(\n client,\n defaultedQueries,\n options\n )\n );\n const [optimisticResult, getCombinedResult, trackResult] = observer.getOptimisticResult(\n defaultedQueries,\n options.combine\n );\n const shouldSubscribe = !isRestoring && options.subscribed !== false;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop,\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setQueries(\n defaultedQueries,\n options\n );\n }, [defaultedQueries, options, observer]);\n const shouldAtLeastOneSuspend = optimisticResult.some(\n (result, index) => shouldSuspend(defaultedQueries[index], result)\n );\n const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {\n const opts = defaultedQueries[index];\n if (opts && shouldSuspend(opts, result)) {\n const queryObserver = new QueryObserver(client, opts);\n return fetchOptimistic(opts, queryObserver, errorResetBoundary);\n }\n return [];\n }) : [];\n if (suspensePromises.length > 0) {\n throw Promise.all(suspensePromises);\n }\n const firstSingleResultWhichShouldThrow = optimisticResult.find(\n (result, index) => {\n const query = defaultedQueries[index];\n return query && getHasError({\n result,\n errorResetBoundary,\n throwOnError: query.throwOnError,\n query: client.getQueryCache().get(query.queryHash),\n suspense: query.suspense\n });\n }\n );\n if (firstSingleResultWhichShouldThrow?.error) {\n throw firstSingleResultWhichShouldThrow.error;\n }\n return getCombinedResult(trackResult());\n}\nexport {\n useQueries\n};\n//# sourceMappingURL=useQueries.js.map"],"x_google_ignoreList":[0,2,3],"mappings":"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"}
1
+ {"version":3,"file":"useQueries-Dch5Ggjr.js","names":["Popover","PopperPrimitive.Root","PopoverAnchor","PopperPrimitive.Anchor","PopoverTrigger","PortalPrimitive","PopoverContent","RemoveScroll","PopperPrimitive.Content","PopperPrimitive.Arrow","#client","#options","#queries","#observers","#result","#onUpdate","#findMatchingObservers","#observerMatches","#notify","#combineResult","#trackResult","#lastQueryHashes","#combinedResult","#lastResult","#lastCombine","#shouldSkipCombine"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-popover@1.1.19+ae2b4604ef263bc9/node_modules/@radix-ui/react-popover/dist/index.mjs","../../../../ui/src/components/popover.tsx","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/queriesObserver.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/useQueries.js"],"sourcesContent":["\"use client\";\n\n// src/popover.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar POPOVER_NAME = \"Popover\";\nvar [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);\nvar Popover = (props) => {\n const {\n __scopePopover,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = false\n } = props;\n const popperScope = usePopperScope(__scopePopover);\n const triggerRef = React.useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = React.useState(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: POPOVER_NAME\n });\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n PopoverProvider,\n {\n scope: __scopePopover,\n contentId: useId(),\n triggerRef,\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n hasCustomAnchor,\n onCustomAnchorAdd: React.useCallback(() => setHasCustomAnchor(true), []),\n onCustomAnchorRemove: React.useCallback(() => setHasCustomAnchor(false), []),\n modal,\n children\n }\n ) });\n};\nPopover.displayName = POPOVER_NAME;\nvar ANCHOR_NAME = \"PopoverAnchor\";\nvar PopoverAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...anchorProps } = props;\n const context = usePopoverContext(ANCHOR_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const { onCustomAnchorAdd, onCustomAnchorRemove } = context;\n React.useEffect(() => {\n onCustomAnchorAdd();\n return () => onCustomAnchorRemove();\n }, [onCustomAnchorAdd, onCustomAnchorRemove]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nPopoverAnchor.displayName = ANCHOR_NAME;\nvar TRIGGER_NAME = \"PopoverTrigger\";\nvar PopoverTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...triggerProps } = props;\n const context = usePopoverContext(TRIGGER_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.open ? context.contentId : void 0,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: trigger });\n }\n);\nPopoverTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"PopoverPortal\";\nvar [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar PopoverPortal = (props) => {\n const { __scopePopover, forceMount, children, container } = props;\n const context = usePopoverContext(PORTAL_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nPopoverPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"PopoverContent\";\nvar PopoverContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nPopoverContent.displayName = CONTENT_NAME;\nvar Slot = createSlot(\"PopoverContent.RemoveScroll\");\nvar PopoverContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = React.useRef(false);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n if (!isRightClickOutsideRef.current) context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(\n props.onPointerDownOutside,\n (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutsideRef.current = isRightClick;\n },\n { checkForDefaultPrevented: false }\n ),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nvar PopoverContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar PopoverContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopover,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n ...contentProps\n } = props;\n const context = usePopoverContext(CONTENT_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n useFocusGuards();\n return /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onDismiss: () => context.onOpenChange(false),\n deferPointerDownOutside: true,\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n \"data-state\": getState(context.open),\n role: \"dialog\",\n id: context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-popover-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-popover-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-popover-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-popover-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-popover-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n )\n }\n )\n }\n );\n }\n);\nvar CLOSE_NAME = \"PopoverClose\";\nvar PopoverClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...closeProps } = props;\n const context = usePopoverContext(CLOSE_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nPopoverClose.displayName = CLOSE_NAME;\nvar ARROW_NAME = \"PopoverArrow\";\nvar PopoverArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopePopover);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nPopoverArrow.displayName = ARROW_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar Root2 = Popover;\nvar Anchor2 = PopoverAnchor;\nvar Trigger = PopoverTrigger;\nvar Portal = PopoverPortal;\nvar Content2 = PopoverContent;\nvar Close = PopoverClose;\nvar Arrow2 = PopoverArrow;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n Close,\n Content2 as Content,\n Popover,\n PopoverAnchor,\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverTrigger,\n Portal,\n Root2 as Root,\n Trigger,\n createPopoverScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { cn } from '../lib/utils.js'\nimport { usePortalContainer, useViewportCollisionPadding } from '../lib/floating-layer.js'\n\nexport const Popover = PopoverPrimitive.Root\nexport const PopoverTrigger = PopoverPrimitive.Trigger\nexport const PopoverAnchor = PopoverPrimitive.Anchor\n\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {\n /** Override the portal target. Defaults to the enclosing Dialog/Sheet\n * content (so touch-scroll works inside it) or `document.body`. */\n container?: HTMLElement | null\n}\n\nexport const PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(({ className, align = 'center', sideOffset = 4, collisionPadding, container, ...props }, ref) => {\n const portalContainer = usePortalContainer()\n const viewportPadding = useViewportCollisionPadding()\n return (\n <PopoverPrimitive.Portal container={container ?? portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding ?? viewportPadding}\n className={cn(\n 'z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n})\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n","// src/queriesObserver.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { QueryObserver } from \"./queryObserver.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { replaceEqualDeep, shallowEqualObjects } from \"./utils.js\";\nfunction difference(array1, array2) {\n const excludeSet = new Set(array2);\n return array1.filter((x) => !excludeSet.has(x));\n}\nfunction replaceAt(array, index, value) {\n const copy = array.slice(0);\n copy[index] = value;\n return copy;\n}\nvar QueriesObserver = class extends Subscribable {\n #client;\n #result;\n #queries;\n #options;\n #observers;\n #combinedResult;\n #lastCombine;\n #lastResult;\n #lastQueryHashes;\n #observerMatches = [];\n constructor(client, queries, options) {\n super();\n this.#client = client;\n this.#options = options;\n this.#queries = [];\n this.#observers = [];\n this.#result = [];\n this.setQueries(queries);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result);\n });\n });\n }\n }\n onUnsubscribe() {\n if (!this.listeners.size) {\n this.destroy();\n }\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#observers.forEach((observer) => {\n observer.destroy();\n });\n }\n setQueries(queries, options) {\n this.#queries = queries;\n this.#options = options;\n if (process.env.NODE_ENV !== \"production\") {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash\n );\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n \"[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.\"\n );\n }\n }\n notifyManager.batch(() => {\n const prevObservers = this.#observers;\n const newObserverMatches = this.#findMatchingObservers(this.#queries);\n newObserverMatches.forEach(\n (match) => match.observer.setOptions(match.defaultedQueryOptions)\n );\n const newObservers = newObserverMatches.map((match) => match.observer);\n const newResult = newObservers.map(\n (observer) => observer.getCurrentResult()\n );\n const hasLengthChange = prevObservers.length !== newObservers.length;\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index]\n );\n const hasStructuralChange = hasLengthChange || hasIndexChange;\n const hasResultChange = hasStructuralChange ? true : newResult.some((result, index) => {\n const prev = this.#result[index];\n return !prev || !shallowEqualObjects(result, prev);\n });\n if (!hasStructuralChange && !hasResultChange) return;\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches;\n this.#observers = newObservers;\n }\n this.#result = newResult;\n if (!this.hasListeners()) return;\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy();\n });\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result);\n });\n });\n }\n this.#notify();\n });\n }\n getCurrentResult() {\n return this.#result;\n }\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery());\n }\n getObservers() {\n return this.#observers;\n }\n getOptimisticResult(queries, combine) {\n const matches = this.#findMatchingObservers(queries);\n const result = matches.map(\n (match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)\n );\n const queryHashes = matches.map(\n (match) => match.defaultedQueryOptions.queryHash\n );\n return [\n result,\n (r) => {\n return this.#combineResult(r ?? result, combine, queryHashes);\n },\n () => {\n return this.#trackResult(result, matches);\n }\n ];\n }\n #trackResult(result, matches) {\n return matches.map((match, index) => {\n const observerResult = result[index];\n return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => {\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp);\n });\n }) : observerResult;\n });\n }\n #combineResult(input, combine, queryHashes) {\n if (combine) {\n const lastHashes = this.#lastQueryHashes;\n const queryHashesChanged = queryHashes !== void 0 && lastHashes !== void 0 && (lastHashes.length !== queryHashes.length || queryHashes.some((hash, i) => hash !== lastHashes[i]));\n if (!this.#combinedResult || this.#result !== this.#lastResult || queryHashesChanged || combine !== this.#lastCombine) {\n this.#lastCombine = combine;\n this.#lastResult = this.#result;\n if (queryHashes !== void 0) {\n this.#lastQueryHashes = queryHashes;\n }\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input)\n );\n }\n return this.#combinedResult;\n }\n return input;\n }\n #shouldSkipCombine() {\n return this.#options?.combine !== void 0 && this.#observers.some((observer, index) => {\n return observer.options.suspense && this.#result[index]?.data === void 0;\n });\n }\n #findMatchingObservers(queries) {\n const prevObserversMap = /* @__PURE__ */ new Map();\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash;\n if (!key) return;\n const previousObservers = prevObserversMap.get(key);\n if (previousObservers) {\n previousObservers.push(observer);\n } else {\n prevObserversMap.set(key, [observer]);\n }\n });\n const observers = [];\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift();\n const observer = match ?? new QueryObserver(this.#client, defaultedOptions);\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer\n });\n });\n return observers;\n }\n #onUpdate(observer, result) {\n const index = this.#observers.indexOf(observer);\n if (index !== -1) {\n this.#result = replaceAt(this.#result, index, result);\n this.#notify();\n }\n }\n #notify() {\n if (this.hasListeners()) {\n const newTracked = this.#trackResult(this.#result, this.#observerMatches);\n const shouldSkipCombine = this.#shouldSkipCombine();\n const previousResult = this.#combinedResult;\n const newResult = shouldSkipCombine ? previousResult : this.#combineResult(newTracked, this.#options?.combine);\n if (shouldSkipCombine || previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result);\n });\n });\n }\n }\n }\n};\nexport {\n QueriesObserver\n};\n//# sourceMappingURL=queriesObserver.js.map","\"use client\";\n\n// src/useQueries.ts\nimport * as React from \"react\";\nimport {\n QueriesObserver,\n QueryObserver,\n noop,\n notifyManager\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend\n} from \"./suspense.js\";\nfunction useQueries({\n queries,\n ...options\n}, queryClient) {\n const client = useQueryClient(queryClient);\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const defaultedQueries = React.useMemo(\n () => queries.map((opts) => {\n const defaultedOptions = client.defaultQueryOptions(\n opts\n );\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n return defaultedOptions;\n }),\n [queries, client, isRestoring]\n );\n defaultedQueries.forEach((queryOptions) => {\n ensureSuspenseTimers(queryOptions);\n const query = client.getQueryCache().get(queryOptions.queryHash);\n ensurePreventErrorBoundaryRetry(queryOptions, errorResetBoundary, query);\n });\n useClearResetErrorBoundary(errorResetBoundary);\n const [observer] = React.useState(\n () => new QueriesObserver(\n client,\n defaultedQueries,\n options\n )\n );\n const [optimisticResult, getCombinedResult, trackResult] = observer.getOptimisticResult(\n defaultedQueries,\n options.combine\n );\n const shouldSubscribe = !isRestoring && options.subscribed !== false;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop,\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setQueries(\n defaultedQueries,\n options\n );\n }, [defaultedQueries, options, observer]);\n const shouldAtLeastOneSuspend = optimisticResult.some(\n (result, index) => shouldSuspend(defaultedQueries[index], result)\n );\n const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {\n const opts = defaultedQueries[index];\n if (opts && shouldSuspend(opts, result)) {\n const queryObserver = new QueryObserver(client, opts);\n return fetchOptimistic(opts, queryObserver, errorResetBoundary);\n }\n return [];\n }) : [];\n if (suspensePromises.length > 0) {\n throw Promise.all(suspensePromises);\n }\n const firstSingleResultWhichShouldThrow = optimisticResult.find(\n (result, index) => {\n const query = defaultedQueries[index];\n return query && getHasError({\n result,\n errorResetBoundary,\n throwOnError: query.throwOnError,\n query: client.getQueryCache().get(query.queryHash),\n suspense: query.suspense\n });\n }\n );\n if (firstSingleResultWhichShouldThrow?.error) {\n throw firstSingleResultWhichShouldThrow.error;\n }\n return getCombinedResult(trackResult());\n}\nexport {\n useQueries\n};\n//# sourceMappingURL=useQueries.js.map"],"x_google_ignoreList":[0,2,3],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import{n as e}from"./createLucideIcon-CUopU_LC.js";import{E as t,d as n}from"./with-selector-id7qGzTH.js";import{rt as r}from"./router-BcZgB5cZ.js";import{t as i}from"./useQueries-Ba2PuYhZ.js";e();var a=t(),o={added:`Added`,changed:`Changed`,removed:`Removed`,before:`Before`,after:`After`,noChanges:`No changes`},s=e=>e===void 0?``:e===null?`null`:typeof e==`string`?e:JSON.stringify(e,null,2),c=e=>e.includes(`
2
- `)||e.length>80;function l({fields:e,labels:t,className:r}){let i={...o,...t};return e.length===0?(0,a.jsx)(`div`,{className:n(`rounded-md border border-dashed border-border p-4 text-sm text-muted-foreground`,r),children:i.noChanges}):(0,a.jsx)(`ul`,{className:n(`divide-y divide-border overflow-hidden rounded-md border border-border bg-card text-xs`,r),children:e.map(e=>(0,a.jsx)(u,{field:e,labels:i},e.path))})}function u({field:e,labels:t}){let n=e.kind===`added`?``:s(e.before),r=e.kind===`removed`?``:s(e.after),i=!c(n)&&!c(r);return(0,a.jsxs)(`li`,{className:`grid grid-cols-[8rem_1fr] gap-x-3 px-3 py-1.5 sm:grid-cols-[10rem_1fr]`,children:[(0,a.jsxs)(`div`,{className:`min-w-0 pt-0.5`,children:[e.label&&(0,a.jsx)(`p`,{className:`truncate text-[11px] font-medium text-foreground`,title:e.label,children:e.label}),(0,a.jsx)(`code`,{className:`truncate font-mono text-[10px] text-muted-foreground`,title:e.path,children:e.path})]}),i?(0,a.jsx)(d,{kind:e.kind,before:n,after:r,labels:t}):(0,a.jsx)(f,{kind:e.kind,before:n,after:r,labels:t})]})}function d({kind:e,before:t,after:n,labels:r}){return(0,a.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-0.5 font-mono text-xs leading-5`,children:[e!==`added`&&(0,a.jsx)(`span`,{"aria-label":r.before,className:`truncate rounded bg-red-50 px-1.5 text-red-900 line-through decoration-red-400/60 dark:bg-red-950/40 dark:text-red-100`,title:t,children:t||`\xA0`}),e!==`removed`&&(0,a.jsx)(`span`,{"aria-label":r.after,className:`truncate rounded bg-green-50 px-1.5 text-green-900 dark:bg-green-950/40 dark:text-green-100`,title:n,children:n||`\xA0`})]})}function f({kind:e,before:t,after:n,labels:r}){return(0,a.jsxs)(`div`,{className:`min-w-0 overflow-hidden rounded font-mono text-xs leading-5`,children:[e!==`added`&&(0,a.jsx)(`pre`,{"aria-label":r.before,className:`overflow-x-auto whitespace-pre-wrap bg-red-50 px-2 py-0.5 text-red-900 dark:bg-red-950/40 dark:text-red-100`,children:p(`-`,t)}),e!==`removed`&&(0,a.jsx)(`pre`,{"aria-label":r.after,className:`overflow-x-auto whitespace-pre-wrap bg-green-50 px-2 py-0.5 text-green-900 dark:bg-green-950/40 dark:text-green-100`,children:p(`+`,n)})]})}var p=(e,t)=>t.split(`
1
+ import{n as e}from"./createLucideIcon-CUopU_LC.js";import{l as t,w as n}from"./floating-layer-DJGCYMex.js";import{I as r}from"./hooks-DHDUQgzs.js";import{t as i}from"./useQueries-Dch5Ggjr.js";e();var a=n(),o={added:`Added`,changed:`Changed`,removed:`Removed`,before:`Before`,after:`After`,noChanges:`No changes`},s=e=>e===void 0?``:e===null?`null`:typeof e==`string`?e:JSON.stringify(e,null,2),c=e=>e.includes(`
2
+ `)||e.length>80;function l({fields:e,labels:n,className:r}){let i={...o,...n};return e.length===0?(0,a.jsx)(`div`,{className:t(`rounded-md border border-dashed border-border p-4 text-sm text-muted-foreground`,r),children:i.noChanges}):(0,a.jsx)(`ul`,{className:t(`divide-y divide-border overflow-hidden rounded-md border border-border bg-card text-xs`,r),children:e.map(e=>(0,a.jsx)(u,{field:e,labels:i},e.path))})}function u({field:e,labels:t}){let n=e.kind===`added`?``:s(e.before),r=e.kind===`removed`?``:s(e.after),i=!c(n)&&!c(r);return(0,a.jsxs)(`li`,{className:`grid grid-cols-[8rem_1fr] gap-x-3 px-3 py-1.5 sm:grid-cols-[10rem_1fr]`,children:[(0,a.jsxs)(`div`,{className:`min-w-0 pt-0.5`,children:[e.label&&(0,a.jsx)(`p`,{className:`truncate text-[11px] font-medium text-foreground`,title:e.label,children:e.label}),(0,a.jsx)(`code`,{className:`truncate font-mono text-[10px] text-muted-foreground`,title:e.path,children:e.path})]}),i?(0,a.jsx)(d,{kind:e.kind,before:n,after:r,labels:t}):(0,a.jsx)(f,{kind:e.kind,before:n,after:r,labels:t})]})}function d({kind:e,before:t,after:n,labels:r}){return(0,a.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-0.5 font-mono text-xs leading-5`,children:[e!==`added`&&(0,a.jsx)(`span`,{"aria-label":r.before,className:`truncate rounded bg-red-50 px-1.5 text-red-900 line-through decoration-red-400/60 dark:bg-red-950/40 dark:text-red-100`,title:t,children:t||`\xA0`}),e!==`removed`&&(0,a.jsx)(`span`,{"aria-label":r.after,className:`truncate rounded bg-green-50 px-1.5 text-green-900 dark:bg-green-950/40 dark:text-green-100`,title:n,children:n||`\xA0`})]})}function f({kind:e,before:t,after:n,labels:r}){return(0,a.jsxs)(`div`,{className:`min-w-0 overflow-hidden rounded font-mono text-xs leading-5`,children:[e!==`added`&&(0,a.jsx)(`pre`,{"aria-label":r.before,className:`overflow-x-auto whitespace-pre-wrap bg-red-50 px-2 py-0.5 text-red-900 dark:bg-red-950/40 dark:text-red-100`,children:p(`-`,t)}),e!==`removed`&&(0,a.jsx)(`pre`,{"aria-label":r.after,className:`overflow-x-auto whitespace-pre-wrap bg-green-50 px-2 py-0.5 text-green-900 dark:bg-green-950/40 dark:text-green-100`,children:p(`+`,n)})]})}var p=(e,t)=>t.split(`
3
3
  `).map(t=>`${e} ${t}`).join(`
4
4
  `),m=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),h=e=>typeof e!=`object`||!e?JSON.stringify(e):e instanceof Date?JSON.stringify(e.toISOString()):typeof e.toJSON==`function`?h(e.toJSON()):Array.isArray(e)?`[${e.map(h).join(`,`)}]`:`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${h(t)}`).join(`,`)}}`,g=(e,t)=>h(e)===h(t);function _(e,t,n=new Set){let r=new Set([...Object.keys(e),...Object.keys(t)]),i=[];for(let a of[...r].sort((e,t)=>e.localeCompare(t))){if(n.has(a))continue;let r=m(e,a),o=m(t,a);!r&&o?i.push({path:a,after:t[a],kind:`added`}):r&&!o?i.push({path:a,before:e[a],kind:`removed`}):g(e[a],t[a])||i.push({path:a,before:e[a],after:t[a],kind:`changed`})}return i}var v=_,y=`admins`;function b(e){let t=r(),n=i({queries:e.map(e=>({queryKey:[`modern-admin`,`user-dir`,y,e],queryFn:async()=>{try{return(await t.show(y,e)).record}catch{return null}},staleTime:6e4,retry:!1}))}),a=new Map;return e.forEach((e,t)=>a.set(e,n[t]?.data??null)),a}function x(e,t){if(!e)return t;let n=e.params??{},r=[n.name,n.fullName,n.email,e.title];for(let t of r){let n=typeof t==`string`?t.trim():``;if(n&&n!==e.id)return n}return t}export{l as a,v as i,b as n,x as r,y as t};
5
- //# sourceMappingURL=user-directory-Df5X8VOe.js.map
5
+ //# sourceMappingURL=user-directory-C33bGZdb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-directory-Df5X8VOe.js","names":[],"sources":["../../../../ui/src/components/diff-view.tsx","../../../../core/src/diff/index.ts","../../../../react/src/user-directory.ts"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport interface DiffField {\n path: string\n /** Human-readable property label. When present, shown before the path. */\n label?: string\n before?: unknown\n after?: unknown\n kind: 'added' | 'changed' | 'removed'\n}\n\nexport interface DiffViewLabels {\n added?: string\n changed?: string\n removed?: string\n before?: string\n after?: string\n noChanges?: string\n}\n\nexport interface DiffViewProps {\n fields: ReadonlyArray<DiffField>\n labels?: DiffViewLabels\n className?: string\n}\n\nconst DEFAULT_LABELS: Required<DiffViewLabels> = {\n added: 'Added',\n changed: 'Changed',\n removed: 'Removed',\n before: 'Before',\n after: 'After',\n noChanges: 'No changes',\n}\n\nconst formatValue = (value: unknown): string => {\n if (value === undefined) return ''\n if (value === null) return 'null'\n if (typeof value === 'string') return value\n return JSON.stringify(value, null, 2)\n}\n\nconst isMultiline = (text: string): boolean => text.includes('\\n') || text.length > 80\n\nexport function DiffView({ fields, labels, className }: DiffViewProps): React.ReactElement {\n const l = { ...DEFAULT_LABELS, ...labels }\n if (fields.length === 0) {\n return (\n <div className={cn('rounded-md border border-dashed border-border p-4 text-sm text-muted-foreground', className)}>\n {l.noChanges}\n </div>\n )\n }\n return (\n <ul\n className={cn(\n 'divide-y divide-border overflow-hidden rounded-md border border-border bg-card text-xs',\n className,\n )}\n >\n {fields.map((field) => (\n <FieldDiff key={field.path} field={field} labels={l} />\n ))}\n </ul>\n )\n}\n\nfunction FieldDiff({\n field,\n labels,\n}: {\n field: DiffField\n labels: Required<DiffViewLabels>\n}): React.ReactElement {\n const beforeText = field.kind === 'added' ? '' : formatValue(field.before)\n const afterText = field.kind === 'removed' ? '' : formatValue(field.after)\n const compact = !isMultiline(beforeText) && !isMultiline(afterText)\n return (\n <li className=\"grid grid-cols-[8rem_1fr] gap-x-3 px-3 py-1.5 sm:grid-cols-[10rem_1fr]\">\n <div className=\"min-w-0 pt-0.5\">\n {field.label && (\n <p className=\"truncate text-[11px] font-medium text-foreground\" title={field.label}>\n {field.label}\n </p>\n )}\n <code\n className=\"truncate font-mono text-[10px] text-muted-foreground\"\n title={field.path}\n >\n {field.path}\n </code>\n </div>\n {compact ? (\n <CompactValues\n kind={field.kind}\n before={beforeText}\n after={afterText}\n labels={labels}\n />\n ) : (\n <StackedValues\n kind={field.kind}\n before={beforeText}\n after={afterText}\n labels={labels}\n />\n )}\n </li>\n )\n}\n\nfunction CompactValues({\n kind,\n before,\n after,\n labels,\n}: {\n kind: DiffField['kind']\n before: string\n after: string\n labels: Required<DiffViewLabels>\n}): React.ReactElement {\n return (\n <div className=\"flex min-w-0 flex-col gap-0.5 font-mono text-xs leading-5\">\n {kind !== 'added' && (\n <span\n aria-label={labels.before}\n className=\"truncate rounded bg-red-50 px-1.5 text-red-900 line-through decoration-red-400/60 dark:bg-red-950/40 dark:text-red-100\"\n title={before}\n >\n {before || '\\u00A0'}\n </span>\n )}\n {kind !== 'removed' && (\n <span\n aria-label={labels.after}\n className=\"truncate rounded bg-green-50 px-1.5 text-green-900 dark:bg-green-950/40 dark:text-green-100\"\n title={after}\n >\n {after || '\\u00A0'}\n </span>\n )}\n </div>\n )\n}\n\nfunction StackedValues({\n kind,\n before,\n after,\n labels,\n}: {\n kind: DiffField['kind']\n before: string\n after: string\n labels: Required<DiffViewLabels>\n}): React.ReactElement {\n return (\n <div className=\"min-w-0 overflow-hidden rounded font-mono text-xs leading-5\">\n {kind !== 'added' && (\n <pre\n aria-label={labels.before}\n className=\"overflow-x-auto whitespace-pre-wrap bg-red-50 px-2 py-0.5 text-red-900 dark:bg-red-950/40 dark:text-red-100\"\n >\n {prefixed('-', before)}\n </pre>\n )}\n {kind !== 'removed' && (\n <pre\n aria-label={labels.after}\n className=\"overflow-x-auto whitespace-pre-wrap bg-green-50 px-2 py-0.5 text-green-900 dark:bg-green-950/40 dark:text-green-100\"\n >\n {prefixed('+', after)}\n </pre>\n )}\n </div>\n )\n}\n\nconst prefixed = (sign: '+' | '-', text: string): string =>\n text.split('\\n').map((l) => `${sign} ${l}`).join('\\n')\n","/**\n * Snapshot diff utilities — shared between server-side history capture\n * (feature-history) and the client-side revisions UI (`packages/react`).\n *\n * Kept transport- and ORM-agnostic so both layers can render exactly the\n * same diff without round-tripping every entry through the network.\n */\n\nexport interface FieldDiffEntry {\n /** Top-level field name. (Nested paths are not split — the value is\n * compared structurally via `valuesEqual`.) */\n path: string\n before?: unknown\n after?: unknown\n kind: 'added' | 'changed' | 'removed'\n}\n\nconst has = (obj: Record<string, unknown>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * JSON.stringify with deterministic key ordering for stable structural\n * equality. Used by `valuesEqual` and as a hash for the side-by-side\n * revision viewer.\n */\nexport const stableStringify = (value: unknown): string => {\n if (value === null || typeof value !== 'object') return JSON.stringify(value)\n if (value instanceof Date) return JSON.stringify(value.toISOString())\n // Honour custom `toJSON` (e.g. Decimal.js, Day.js, Mongo ObjectId) so\n // values that round-trip through JSON keep stable identity.\n if (typeof (value as { toJSON?: unknown }).toJSON === 'function') {\n return stableStringify((value as { toJSON: () => unknown }).toJSON())\n }\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n return `{${entries.join(',')}}`\n}\n\n/** Structural equality based on `stableStringify`. */\nexport const valuesEqual = (a: unknown, b: unknown): boolean =>\n stableStringify(a) === stableStringify(b)\n\n/**\n * Compare two record snapshots and return the field-level diff.\n *\n * Excluded fields are dropped from both sides before comparison. The\n * output is sorted alphabetically by `path` for stable rendering.\n */\nexport function computeFieldDiff(\n before: Record<string, unknown>,\n after: Record<string, unknown>,\n excludeFields: ReadonlySet<string> = new Set(),\n): FieldDiffEntry[] {\n const keys = new Set([...Object.keys(before), ...Object.keys(after)])\n const out: FieldDiffEntry[] = []\n for (const path of [...keys].sort((a, b) => a.localeCompare(b))) {\n if (excludeFields.has(path)) continue\n const beforeHas = has(before, path)\n const afterHas = has(after, path)\n if (!beforeHas && afterHas) {\n out.push({ path, after: after[path], kind: 'added' })\n } else if (beforeHas && !afterHas) {\n out.push({ path, before: before[path], kind: 'removed' })\n } else if (!valuesEqual(before[path], after[path])) {\n out.push({ path, before: before[path], after: after[path], kind: 'changed' })\n }\n }\n return out\n}\n\n/** Convenience alias used by the React revisions side panel. */\nexport const diffSnapshots = computeFieldDiff\n\n/** Return a shallow copy of `value` with `excludeFields` removed. */\nexport function omitFields(\n value: Record<string, unknown>,\n excludeFields: ReadonlySet<string>,\n): Record<string, unknown> {\n if (excludeFields.size === 0) return { ...value }\n const out: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) {\n if (!excludeFields.has(key)) out[key] = item\n }\n return out\n}\n","import { useQueries } from '@tanstack/react-query'\nimport { useAdminClient } from './provider.js'\nimport type { RecordJSON } from './types.js'\n\n/** Convention: the host app exposes panel administrators under the\n * `admins` resource id (backed by Better Auth's `ma_user` table). When\n * absent or the lookup fails we fall back to the raw id string. */\nexport const USERS_RESOURCE_ID = 'admins'\n\n/** Resolve admin user records by id via the conventional `users` resource.\n * Failed lookups (404 / no users resource) cache as `null` so we don't keep\n * retrying them on every re-render.\n *\n * NOTE: uses the `'user-dir'` segment (not `'show'`) so the cached value\n * (`RecordJSON | null`) doesn't collide with `useRecord`'s cache which stores\n * the full `RecordResponse` shape under `['modern-admin', id, 'show', ...]`. */\nexport function useUserDirectory(\n userIds: ReadonlyArray<string>,\n): Map<string, RecordJSON | null> {\n const client = useAdminClient()\n const queries = useQueries({\n queries: userIds.map((id) => ({\n queryKey: ['modern-admin', 'user-dir', USERS_RESOURCE_ID, id] as const,\n queryFn: async (): Promise<RecordJSON | null> => {\n try {\n const res = await client.show(USERS_RESOURCE_ID, id)\n return res.record\n } catch {\n return null\n }\n },\n staleTime: 60_000,\n retry: false,\n })),\n })\n const map = new Map<string, RecordJSON | null>()\n userIds.forEach((id, i) => map.set(id, queries[i]?.data ?? null))\n return map\n}\n\n/** Pick a human-readable label for an admin record. Checks explicit name\n * fields first — `record.title` may be the id fallback when the resource\n * has no matching TITLE_COLUMN_NAMES property. */\nexport function userLabelOf(\n record: RecordJSON | null | undefined,\n fallback: string,\n): string {\n if (!record) return fallback\n const params = record.params ?? {}\n const candidates = [params.name, params.fullName, params.email, record.title]\n for (const candidate of candidates) {\n const s = typeof candidate === 'string' ? candidate.trim() : ''\n if (s && s !== record.id) return s\n }\n return fallback\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"user-directory-C33bGZdb.js","names":[],"sources":["../../../../ui/src/components/diff-view.tsx","../../../../core/src/diff/index.ts","../../../../react/src/user-directory.ts"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport interface DiffField {\n path: string\n /** Human-readable property label. When present, shown before the path. */\n label?: string\n before?: unknown\n after?: unknown\n kind: 'added' | 'changed' | 'removed'\n}\n\nexport interface DiffViewLabels {\n added?: string\n changed?: string\n removed?: string\n before?: string\n after?: string\n noChanges?: string\n}\n\nexport interface DiffViewProps {\n fields: ReadonlyArray<DiffField>\n labels?: DiffViewLabels\n className?: string\n}\n\nconst DEFAULT_LABELS: Required<DiffViewLabels> = {\n added: 'Added',\n changed: 'Changed',\n removed: 'Removed',\n before: 'Before',\n after: 'After',\n noChanges: 'No changes',\n}\n\nconst formatValue = (value: unknown): string => {\n if (value === undefined) return ''\n if (value === null) return 'null'\n if (typeof value === 'string') return value\n return JSON.stringify(value, null, 2)\n}\n\nconst isMultiline = (text: string): boolean => text.includes('\\n') || text.length > 80\n\nexport function DiffView({ fields, labels, className }: DiffViewProps): React.ReactElement {\n const l = { ...DEFAULT_LABELS, ...labels }\n if (fields.length === 0) {\n return (\n <div className={cn('rounded-md border border-dashed border-border p-4 text-sm text-muted-foreground', className)}>\n {l.noChanges}\n </div>\n )\n }\n return (\n <ul\n className={cn(\n 'divide-y divide-border overflow-hidden rounded-md border border-border bg-card text-xs',\n className,\n )}\n >\n {fields.map((field) => (\n <FieldDiff key={field.path} field={field} labels={l} />\n ))}\n </ul>\n )\n}\n\nfunction FieldDiff({\n field,\n labels,\n}: {\n field: DiffField\n labels: Required<DiffViewLabels>\n}): React.ReactElement {\n const beforeText = field.kind === 'added' ? '' : formatValue(field.before)\n const afterText = field.kind === 'removed' ? '' : formatValue(field.after)\n const compact = !isMultiline(beforeText) && !isMultiline(afterText)\n return (\n <li className=\"grid grid-cols-[8rem_1fr] gap-x-3 px-3 py-1.5 sm:grid-cols-[10rem_1fr]\">\n <div className=\"min-w-0 pt-0.5\">\n {field.label && (\n <p className=\"truncate text-[11px] font-medium text-foreground\" title={field.label}>\n {field.label}\n </p>\n )}\n <code\n className=\"truncate font-mono text-[10px] text-muted-foreground\"\n title={field.path}\n >\n {field.path}\n </code>\n </div>\n {compact ? (\n <CompactValues\n kind={field.kind}\n before={beforeText}\n after={afterText}\n labels={labels}\n />\n ) : (\n <StackedValues\n kind={field.kind}\n before={beforeText}\n after={afterText}\n labels={labels}\n />\n )}\n </li>\n )\n}\n\nfunction CompactValues({\n kind,\n before,\n after,\n labels,\n}: {\n kind: DiffField['kind']\n before: string\n after: string\n labels: Required<DiffViewLabels>\n}): React.ReactElement {\n return (\n <div className=\"flex min-w-0 flex-col gap-0.5 font-mono text-xs leading-5\">\n {kind !== 'added' && (\n <span\n aria-label={labels.before}\n className=\"truncate rounded bg-red-50 px-1.5 text-red-900 line-through decoration-red-400/60 dark:bg-red-950/40 dark:text-red-100\"\n title={before}\n >\n {before || '\\u00A0'}\n </span>\n )}\n {kind !== 'removed' && (\n <span\n aria-label={labels.after}\n className=\"truncate rounded bg-green-50 px-1.5 text-green-900 dark:bg-green-950/40 dark:text-green-100\"\n title={after}\n >\n {after || '\\u00A0'}\n </span>\n )}\n </div>\n )\n}\n\nfunction StackedValues({\n kind,\n before,\n after,\n labels,\n}: {\n kind: DiffField['kind']\n before: string\n after: string\n labels: Required<DiffViewLabels>\n}): React.ReactElement {\n return (\n <div className=\"min-w-0 overflow-hidden rounded font-mono text-xs leading-5\">\n {kind !== 'added' && (\n <pre\n aria-label={labels.before}\n className=\"overflow-x-auto whitespace-pre-wrap bg-red-50 px-2 py-0.5 text-red-900 dark:bg-red-950/40 dark:text-red-100\"\n >\n {prefixed('-', before)}\n </pre>\n )}\n {kind !== 'removed' && (\n <pre\n aria-label={labels.after}\n className=\"overflow-x-auto whitespace-pre-wrap bg-green-50 px-2 py-0.5 text-green-900 dark:bg-green-950/40 dark:text-green-100\"\n >\n {prefixed('+', after)}\n </pre>\n )}\n </div>\n )\n}\n\nconst prefixed = (sign: '+' | '-', text: string): string =>\n text.split('\\n').map((l) => `${sign} ${l}`).join('\\n')\n","/**\n * Snapshot diff utilities — shared between server-side history capture\n * (feature-history) and the client-side revisions UI (`packages/react`).\n *\n * Kept transport- and ORM-agnostic so both layers can render exactly the\n * same diff without round-tripping every entry through the network.\n */\n\nexport interface FieldDiffEntry {\n /** Top-level field name. (Nested paths are not split — the value is\n * compared structurally via `valuesEqual`.) */\n path: string\n before?: unknown\n after?: unknown\n kind: 'added' | 'changed' | 'removed'\n}\n\nconst has = (obj: Record<string, unknown>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * JSON.stringify with deterministic key ordering for stable structural\n * equality. Used by `valuesEqual` and as a hash for the side-by-side\n * revision viewer.\n */\nexport const stableStringify = (value: unknown): string => {\n if (value === null || typeof value !== 'object') return JSON.stringify(value)\n if (value instanceof Date) return JSON.stringify(value.toISOString())\n // Honour custom `toJSON` (e.g. Decimal.js, Day.js, Mongo ObjectId) so\n // values that round-trip through JSON keep stable identity.\n if (typeof (value as { toJSON?: unknown }).toJSON === 'function') {\n return stableStringify((value as { toJSON: () => unknown }).toJSON())\n }\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n return `{${entries.join(',')}}`\n}\n\n/** Structural equality based on `stableStringify`. */\nexport const valuesEqual = (a: unknown, b: unknown): boolean =>\n stableStringify(a) === stableStringify(b)\n\n/**\n * Compare two record snapshots and return the field-level diff.\n *\n * Excluded fields are dropped from both sides before comparison. The\n * output is sorted alphabetically by `path` for stable rendering.\n */\nexport function computeFieldDiff(\n before: Record<string, unknown>,\n after: Record<string, unknown>,\n excludeFields: ReadonlySet<string> = new Set(),\n): FieldDiffEntry[] {\n const keys = new Set([...Object.keys(before), ...Object.keys(after)])\n const out: FieldDiffEntry[] = []\n for (const path of [...keys].sort((a, b) => a.localeCompare(b))) {\n if (excludeFields.has(path)) continue\n const beforeHas = has(before, path)\n const afterHas = has(after, path)\n if (!beforeHas && afterHas) {\n out.push({ path, after: after[path], kind: 'added' })\n } else if (beforeHas && !afterHas) {\n out.push({ path, before: before[path], kind: 'removed' })\n } else if (!valuesEqual(before[path], after[path])) {\n out.push({ path, before: before[path], after: after[path], kind: 'changed' })\n }\n }\n return out\n}\n\n/** Convenience alias used by the React revisions side panel. */\nexport const diffSnapshots = computeFieldDiff\n\n/** Return a shallow copy of `value` with `excludeFields` removed. */\nexport function omitFields(\n value: Record<string, unknown>,\n excludeFields: ReadonlySet<string>,\n): Record<string, unknown> {\n if (excludeFields.size === 0) return { ...value }\n const out: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) {\n if (!excludeFields.has(key)) out[key] = item\n }\n return out\n}\n","import { useQueries } from '@tanstack/react-query'\nimport { useAdminClient } from './provider.js'\nimport type { RecordJSON } from './types.js'\n\n/** Convention: the host app exposes panel administrators under the\n * `admins` resource id (backed by Better Auth's `ma_user` table). When\n * absent or the lookup fails we fall back to the raw id string. */\nexport const USERS_RESOURCE_ID = 'admins'\n\n/** Resolve admin user records by id via the conventional `users` resource.\n * Failed lookups (404 / no users resource) cache as `null` so we don't keep\n * retrying them on every re-render.\n *\n * NOTE: uses the `'user-dir'` segment (not `'show'`) so the cached value\n * (`RecordJSON | null`) doesn't collide with `useRecord`'s cache which stores\n * the full `RecordResponse` shape under `['modern-admin', id, 'show', ...]`. */\nexport function useUserDirectory(\n userIds: ReadonlyArray<string>,\n): Map<string, RecordJSON | null> {\n const client = useAdminClient()\n const queries = useQueries({\n queries: userIds.map((id) => ({\n queryKey: ['modern-admin', 'user-dir', USERS_RESOURCE_ID, id] as const,\n queryFn: async (): Promise<RecordJSON | null> => {\n try {\n const res = await client.show(USERS_RESOURCE_ID, id)\n return res.record\n } catch {\n return null\n }\n },\n staleTime: 60_000,\n retry: false,\n })),\n })\n const map = new Map<string, RecordJSON | null>()\n userIds.forEach((id, i) => map.set(id, queries[i]?.data ?? null))\n return map\n}\n\n/** Pick a human-readable label for an admin record. Checks explicit name\n * fields first — `record.title` may be the id fallback when the resource\n * has no matching TITLE_COLUMN_NAMES property. */\nexport function userLabelOf(\n record: RecordJSON | null | undefined,\n fallback: string,\n): string {\n if (!record) return fallback\n const params = record.params ?? {}\n const candidates = [params.name, params.fullName, params.email, record.title]\n for (const candidate of candidates) {\n const s = typeof candidate === 'string' ? candidate.trim() : ''\n if (s && s !== record.id) return s\n }\n return fallback\n}\n"],"mappings":"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"}