@modern-admin/web 0.4.1 → 0.4.2

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 (241) hide show
  1. package/dist/standalone/assets/{action-component-host-BrEZDHZt.js → action-component-host-P6HcuKj3.js} +2 -2
  2. package/dist/standalone/assets/action-component-host-P6HcuKj3.js.br +0 -0
  3. package/dist/standalone/assets/action-component-host-P6HcuKj3.js.gz +0 -0
  4. package/dist/standalone/assets/{action-component-host-BrEZDHZt.js.map → action-component-host-P6HcuKj3.js.map} +1 -1
  5. package/dist/standalone/assets/{action-page-Bx7kzeK7.js → action-page-kyqtK3oq.js} +2 -2
  6. package/dist/standalone/assets/action-page-kyqtK3oq.js.br +0 -0
  7. package/dist/standalone/assets/action-page-kyqtK3oq.js.gz +0 -0
  8. package/dist/standalone/assets/{action-page-Bx7kzeK7.js.map → action-page-kyqtK3oq.js.map} +1 -1
  9. package/dist/standalone/assets/{ai-assistant-widget-BbIXVrSu.js → ai-assistant-widget-DGanix6u.js} +2 -2
  10. package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js.br +0 -0
  11. package/dist/standalone/assets/ai-assistant-widget-DGanix6u.js.gz +0 -0
  12. package/dist/standalone/assets/{ai-assistant-widget-BbIXVrSu.js.map → ai-assistant-widget-DGanix6u.js.map} +1 -1
  13. package/dist/standalone/assets/{audit-log-page-BoZh23oQ.js → audit-log-page-DozriTiA.js} +2 -2
  14. package/dist/standalone/assets/audit-log-page-DozriTiA.js.br +0 -0
  15. package/dist/standalone/assets/audit-log-page-DozriTiA.js.gz +0 -0
  16. package/dist/standalone/assets/{audit-log-page-BoZh23oQ.js.map → audit-log-page-DozriTiA.js.map} +1 -1
  17. package/dist/standalone/assets/{badge-6nyM5Jft.js → badge-lb2Nqx1b.js} +2 -2
  18. package/dist/standalone/assets/{badge-6nyM5Jft.js.map → badge-lb2Nqx1b.js.map} +1 -1
  19. package/dist/standalone/assets/{calendar-nvD_z7KQ.js → calendar-crtd4PEn.js} +2 -2
  20. package/dist/standalone/assets/calendar-crtd4PEn.js.br +0 -0
  21. package/dist/standalone/assets/calendar-crtd4PEn.js.gz +0 -0
  22. package/dist/standalone/assets/{calendar-nvD_z7KQ.js.map → calendar-crtd4PEn.js.map} +1 -1
  23. package/dist/standalone/assets/{card-4cS4uWCP.js → card-Dh44j2Nb.js} +2 -2
  24. package/dist/standalone/assets/card-Dh44j2Nb.js.br +0 -0
  25. package/dist/standalone/assets/card-Dh44j2Nb.js.gz +0 -0
  26. package/dist/standalone/assets/{card-4cS4uWCP.js.map → card-Dh44j2Nb.js.map} +1 -1
  27. package/dist/standalone/assets/chart-widget-B819aHsE.js +2 -0
  28. package/dist/standalone/assets/chart-widget-B819aHsE.js.br +0 -0
  29. package/dist/standalone/assets/chart-widget-B819aHsE.js.gz +0 -0
  30. package/dist/standalone/assets/chart-widget-B819aHsE.js.map +1 -0
  31. package/dist/standalone/assets/{command-Sb0xL-se.js → command-xJ-6Grpv.js} +2 -2
  32. package/dist/standalone/assets/command-xJ-6Grpv.js.br +0 -0
  33. package/dist/standalone/assets/command-xJ-6Grpv.js.gz +0 -0
  34. package/dist/standalone/assets/command-xJ-6Grpv.js.map +1 -0
  35. package/dist/standalone/assets/{date-picker-C4HcgidQ.js → date-picker-D0dWQEox.js} +2 -2
  36. package/dist/standalone/assets/date-picker-D0dWQEox.js.br +0 -0
  37. package/dist/standalone/assets/date-picker-D0dWQEox.js.gz +0 -0
  38. package/dist/standalone/assets/{date-picker-C4HcgidQ.js.map → date-picker-D0dWQEox.js.map} +1 -1
  39. package/dist/standalone/assets/{dist-BSbFjTlr.js → dist-CWGgVQiS.js} +2 -2
  40. package/dist/standalone/assets/dist-CWGgVQiS.js.br +0 -0
  41. package/dist/standalone/assets/dist-CWGgVQiS.js.gz +0 -0
  42. package/dist/standalone/assets/{dist-BSbFjTlr.js.map → dist-CWGgVQiS.js.map} +1 -1
  43. package/dist/standalone/assets/{dist-Dpg8xy_r.js → dist-UsTgBPww.js} +2 -2
  44. package/dist/standalone/assets/dist-UsTgBPww.js.br +0 -0
  45. package/dist/standalone/assets/dist-UsTgBPww.js.gz +0 -0
  46. package/dist/standalone/assets/{dist-Dpg8xy_r.js.map → dist-UsTgBPww.js.map} +1 -1
  47. package/dist/standalone/assets/dist-qlnAsTo_.js +2 -0
  48. package/dist/standalone/assets/dist-qlnAsTo_.js.br +0 -0
  49. package/dist/standalone/assets/dist-qlnAsTo_.js.gz +0 -0
  50. package/dist/standalone/assets/{dist-BcL2U6dT.js.map → dist-qlnAsTo_.js.map} +1 -1
  51. package/dist/standalone/assets/{edit-page-CW7-FAPC.js → edit-page-CFPwq1_5.js} +2 -2
  52. package/dist/standalone/assets/edit-page-CFPwq1_5.js.br +0 -0
  53. package/dist/standalone/assets/edit-page-CFPwq1_5.js.gz +0 -0
  54. package/dist/standalone/assets/{edit-page-CW7-FAPC.js.map → edit-page-CFPwq1_5.js.map} +1 -1
  55. package/dist/standalone/assets/empty-D9sUunOr.js +2 -0
  56. package/dist/standalone/assets/empty-D9sUunOr.js.br +0 -0
  57. package/dist/standalone/assets/empty-D9sUunOr.js.gz +0 -0
  58. package/dist/standalone/assets/{empty-Cposcczv.js.map → empty-D9sUunOr.js.map} +1 -1
  59. package/dist/standalone/assets/{global-search-dialog-DLv_nIvM.js → global-search-dialog-AfQmJSE7.js} +2 -2
  60. package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js.br +0 -0
  61. package/dist/standalone/assets/global-search-dialog-AfQmJSE7.js.gz +0 -0
  62. package/dist/standalone/assets/{global-search-dialog-DLv_nIvM.js.map → global-search-dialog-AfQmJSE7.js.map} +1 -1
  63. package/dist/standalone/assets/{heavy-fields-BiCEgD2L.js → heavy-fields-_zVIBnm1.js} +4 -4
  64. package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.br +0 -0
  65. package/dist/standalone/assets/heavy-fields-_zVIBnm1.js.gz +0 -0
  66. package/dist/standalone/assets/{heavy-fields-BiCEgD2L.js.map → heavy-fields-_zVIBnm1.js.map} +1 -1
  67. package/dist/standalone/assets/{home-page-BSz1wGk0.js → home-page-BdTrAXqk.js} +3 -3
  68. package/dist/standalone/assets/home-page-BdTrAXqk.js.br +0 -0
  69. package/dist/standalone/assets/home-page-BdTrAXqk.js.gz +0 -0
  70. package/dist/standalone/assets/{home-page-BSz1wGk0.js.map → home-page-BdTrAXqk.js.map} +1 -1
  71. package/dist/standalone/assets/{icon-registry-BQU4fIc4.js → icon-registry-CcMm2Zh3.js} +2 -2
  72. package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.br +0 -0
  73. package/dist/standalone/assets/icon-registry-CcMm2Zh3.js.gz +0 -0
  74. package/dist/standalone/assets/{icon-registry-BQU4fIc4.js.map → icon-registry-CcMm2Zh3.js.map} +1 -1
  75. package/dist/standalone/assets/index-DHZwffoP.css +2 -0
  76. package/dist/standalone/assets/index-DHZwffoP.css.br +0 -0
  77. package/dist/standalone/assets/{index-95cwJ2RY.css.gz → index-DHZwffoP.css.gz} +0 -0
  78. package/dist/standalone/assets/index-uYpCUVT4.js +15 -0
  79. package/dist/standalone/assets/index-uYpCUVT4.js.br +0 -0
  80. package/dist/standalone/assets/index-uYpCUVT4.js.gz +0 -0
  81. package/dist/standalone/assets/index-uYpCUVT4.js.map +1 -0
  82. package/dist/standalone/assets/json-editor-yfO4TUB_.js +2 -0
  83. package/dist/standalone/assets/json-editor-yfO4TUB_.js.br +0 -0
  84. package/dist/standalone/assets/json-editor-yfO4TUB_.js.gz +0 -0
  85. package/dist/standalone/assets/{json-editor-CAIgxYb3.js.map → json-editor-yfO4TUB_.js.map} +1 -1
  86. package/dist/standalone/assets/{property-renderer-B8Md-EqW.js → property-renderer-CDKsa2KQ.js} +4 -4
  87. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.br +0 -0
  88. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.gz +0 -0
  89. package/dist/standalone/assets/property-renderer-CDKsa2KQ.js.map +1 -0
  90. package/dist/standalone/assets/reference-DWJEoGIf.js +2 -0
  91. package/dist/standalone/assets/reference-DWJEoGIf.js.br +0 -0
  92. package/dist/standalone/assets/reference-DWJEoGIf.js.gz +0 -0
  93. package/dist/standalone/assets/reference-DWJEoGIf.js.map +1 -0
  94. package/dist/standalone/assets/{revisions-button-0WtL6bsZ.js → revisions-button-DR0oW2wX.js} +2 -2
  95. package/dist/standalone/assets/revisions-button-DR0oW2wX.js.br +0 -0
  96. package/dist/standalone/assets/revisions-button-DR0oW2wX.js.gz +0 -0
  97. package/dist/standalone/assets/{revisions-button-0WtL6bsZ.js.map → revisions-button-DR0oW2wX.js.map} +1 -1
  98. package/dist/standalone/assets/{richtext-render-DnVcQ34I.js → richtext-render-VFCKGulc.js} +2 -2
  99. package/dist/standalone/assets/richtext-render-VFCKGulc.js.br +0 -0
  100. package/dist/standalone/assets/richtext-render-VFCKGulc.js.gz +0 -0
  101. package/dist/standalone/assets/{richtext-render-DnVcQ34I.js.map → richtext-render-VFCKGulc.js.map} +1 -1
  102. package/dist/standalone/assets/{router-wFvtgo77.js → router-BcZgB5cZ.js} +12 -12
  103. package/dist/standalone/assets/router-BcZgB5cZ.js.br +0 -0
  104. package/dist/standalone/assets/router-BcZgB5cZ.js.gz +0 -0
  105. package/dist/standalone/assets/router-BcZgB5cZ.js.map +1 -0
  106. package/dist/standalone/assets/select-BiV9bunJ.js +2 -0
  107. package/dist/standalone/assets/select-BiV9bunJ.js.br +0 -0
  108. package/dist/standalone/assets/select-BiV9bunJ.js.gz +0 -0
  109. package/dist/standalone/assets/{select-CR4acjX0.js.map → select-BiV9bunJ.js.map} +1 -1
  110. package/dist/standalone/assets/{settings-page-DtguXLAP.js → settings-page-DSWp2N6T.js} +2 -2
  111. package/dist/standalone/assets/settings-page-DSWp2N6T.js.br +0 -0
  112. package/dist/standalone/assets/settings-page-DSWp2N6T.js.gz +0 -0
  113. package/dist/standalone/assets/{settings-page-DtguXLAP.js.map → settings-page-DSWp2N6T.js.map} +1 -1
  114. package/dist/standalone/assets/{show-page-Dnox2NwO.js → show-page-CGzUAZoO.js} +2 -2
  115. package/dist/standalone/assets/show-page-CGzUAZoO.js.br +0 -0
  116. package/dist/standalone/assets/show-page-CGzUAZoO.js.gz +0 -0
  117. package/dist/standalone/assets/{show-page-Dnox2NwO.js.map → show-page-CGzUAZoO.js.map} +1 -1
  118. package/dist/standalone/assets/tabs-smdw70rV.js +2 -0
  119. package/dist/standalone/assets/tabs-smdw70rV.js.br +0 -0
  120. package/dist/standalone/assets/tabs-smdw70rV.js.gz +0 -0
  121. package/dist/standalone/assets/{tabs-DUS8e6dR.js.map → tabs-smdw70rV.js.map} +1 -1
  122. package/dist/standalone/assets/{textarea-CX_0QVSz.js → textarea-DBVf3GGt.js} +2 -2
  123. package/dist/standalone/assets/{textarea-CX_0QVSz.js.map → textarea-DBVf3GGt.js.map} +1 -1
  124. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js +2 -0
  125. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.br +0 -0
  126. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.gz +0 -0
  127. package/dist/standalone/assets/useQueries-Ba2PuYhZ.js.map +1 -0
  128. package/dist/standalone/assets/{user-directory-9COoW6AO.js → user-directory-Df5X8VOe.js} +2 -2
  129. package/dist/standalone/assets/user-directory-Df5X8VOe.js.br +0 -0
  130. package/dist/standalone/assets/user-directory-Df5X8VOe.js.gz +0 -0
  131. package/dist/standalone/assets/{user-directory-9COoW6AO.js.map → user-directory-Df5X8VOe.js.map} +1 -1
  132. package/dist/standalone/assets/{value-format-Cgau0meh.js → value-format-BUeGtfH4.js} +16 -16
  133. package/dist/standalone/assets/value-format-BUeGtfH4.js.br +0 -0
  134. package/dist/standalone/assets/value-format-BUeGtfH4.js.gz +0 -0
  135. package/dist/standalone/assets/{value-format-Cgau0meh.js.map → value-format-BUeGtfH4.js.map} +1 -1
  136. package/dist/standalone/assets/with-selector-id7qGzTH.js +2 -0
  137. package/dist/standalone/assets/with-selector-id7qGzTH.js.br +0 -0
  138. package/dist/standalone/assets/with-selector-id7qGzTH.js.gz +0 -0
  139. package/dist/standalone/assets/with-selector-id7qGzTH.js.map +1 -0
  140. package/dist/standalone/assets/{wizard-create-page-v2-Aw8Oj.js → wizard-create-page-B8IcszRF.js} +2 -2
  141. package/dist/standalone/assets/wizard-create-page-B8IcszRF.js.br +0 -0
  142. package/dist/standalone/assets/wizard-create-page-B8IcszRF.js.gz +0 -0
  143. package/dist/standalone/assets/{wizard-create-page-v2-Aw8Oj.js.map → wizard-create-page-B8IcszRF.js.map} +1 -1
  144. package/dist/standalone/assets/{zod-BrelKLfy.js → zod-mi61gVha.js} +2 -2
  145. package/dist/standalone/assets/zod-mi61gVha.js.br +0 -0
  146. package/dist/standalone/assets/zod-mi61gVha.js.gz +0 -0
  147. package/dist/standalone/assets/{zod-BrelKLfy.js.map → zod-mi61gVha.js.map} +1 -1
  148. package/dist/standalone/index.html +10 -10
  149. package/dist/standalone/index.html.br +0 -0
  150. package/dist/standalone/index.html.gz +0 -0
  151. package/package.json +4 -4
  152. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.br +0 -0
  153. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.gz +0 -0
  154. package/dist/standalone/assets/action-page-Bx7kzeK7.js.br +0 -0
  155. package/dist/standalone/assets/action-page-Bx7kzeK7.js.gz +0 -0
  156. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.br +0 -0
  157. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.gz +0 -0
  158. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.br +0 -0
  159. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.gz +0 -0
  160. package/dist/standalone/assets/calendar-nvD_z7KQ.js.br +0 -0
  161. package/dist/standalone/assets/calendar-nvD_z7KQ.js.gz +0 -0
  162. package/dist/standalone/assets/card-4cS4uWCP.js.br +0 -0
  163. package/dist/standalone/assets/card-4cS4uWCP.js.gz +0 -0
  164. package/dist/standalone/assets/chart-widget-YeCL7jdB.js +0 -2
  165. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.br +0 -0
  166. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.gz +0 -0
  167. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.map +0 -1
  168. package/dist/standalone/assets/command-Sb0xL-se.js.br +0 -0
  169. package/dist/standalone/assets/command-Sb0xL-se.js.gz +0 -0
  170. package/dist/standalone/assets/command-Sb0xL-se.js.map +0 -1
  171. package/dist/standalone/assets/date-picker-C4HcgidQ.js.br +0 -0
  172. package/dist/standalone/assets/date-picker-C4HcgidQ.js.gz +0 -0
  173. package/dist/standalone/assets/dist-BSbFjTlr.js.br +0 -0
  174. package/dist/standalone/assets/dist-BSbFjTlr.js.gz +0 -0
  175. package/dist/standalone/assets/dist-BcL2U6dT.js +0 -2
  176. package/dist/standalone/assets/dist-BcL2U6dT.js.br +0 -0
  177. package/dist/standalone/assets/dist-BcL2U6dT.js.gz +0 -0
  178. package/dist/standalone/assets/dist-Dpg8xy_r.js.br +0 -0
  179. package/dist/standalone/assets/dist-Dpg8xy_r.js.gz +0 -0
  180. package/dist/standalone/assets/edit-page-CW7-FAPC.js.br +0 -0
  181. package/dist/standalone/assets/edit-page-CW7-FAPC.js.gz +0 -0
  182. package/dist/standalone/assets/empty-Cposcczv.js +0 -2
  183. package/dist/standalone/assets/empty-Cposcczv.js.br +0 -0
  184. package/dist/standalone/assets/empty-Cposcczv.js.gz +0 -0
  185. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.br +0 -0
  186. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.gz +0 -0
  187. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.br +0 -0
  188. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.gz +0 -0
  189. package/dist/standalone/assets/home-page-BSz1wGk0.js.br +0 -0
  190. package/dist/standalone/assets/home-page-BSz1wGk0.js.gz +0 -0
  191. package/dist/standalone/assets/icon-registry-BQU4fIc4.js.br +0 -0
  192. package/dist/standalone/assets/icon-registry-BQU4fIc4.js.gz +0 -0
  193. package/dist/standalone/assets/index-95cwJ2RY.css +0 -2
  194. package/dist/standalone/assets/index-95cwJ2RY.css.br +0 -0
  195. package/dist/standalone/assets/index-BL8keDxQ.js +0 -15
  196. package/dist/standalone/assets/index-BL8keDxQ.js.br +0 -0
  197. package/dist/standalone/assets/index-BL8keDxQ.js.gz +0 -0
  198. package/dist/standalone/assets/index-BL8keDxQ.js.map +0 -1
  199. package/dist/standalone/assets/json-editor-CAIgxYb3.js +0 -2
  200. package/dist/standalone/assets/json-editor-CAIgxYb3.js.br +0 -0
  201. package/dist/standalone/assets/json-editor-CAIgxYb3.js.gz +0 -0
  202. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.br +0 -0
  203. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.gz +0 -0
  204. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.map +0 -1
  205. package/dist/standalone/assets/reference-WPaf6IdD.js +0 -2
  206. package/dist/standalone/assets/reference-WPaf6IdD.js.br +0 -0
  207. package/dist/standalone/assets/reference-WPaf6IdD.js.gz +0 -0
  208. package/dist/standalone/assets/reference-WPaf6IdD.js.map +0 -1
  209. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.br +0 -0
  210. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.gz +0 -0
  211. package/dist/standalone/assets/richtext-render-DnVcQ34I.js.br +0 -0
  212. package/dist/standalone/assets/richtext-render-DnVcQ34I.js.gz +0 -0
  213. package/dist/standalone/assets/router-wFvtgo77.js.br +0 -0
  214. package/dist/standalone/assets/router-wFvtgo77.js.gz +0 -0
  215. package/dist/standalone/assets/router-wFvtgo77.js.map +0 -1
  216. package/dist/standalone/assets/select-CR4acjX0.js +0 -2
  217. package/dist/standalone/assets/select-CR4acjX0.js.br +0 -0
  218. package/dist/standalone/assets/select-CR4acjX0.js.gz +0 -0
  219. package/dist/standalone/assets/settings-page-DtguXLAP.js.br +0 -0
  220. package/dist/standalone/assets/settings-page-DtguXLAP.js.gz +0 -0
  221. package/dist/standalone/assets/show-page-Dnox2NwO.js.br +0 -0
  222. package/dist/standalone/assets/show-page-Dnox2NwO.js.gz +0 -0
  223. package/dist/standalone/assets/tabs-DUS8e6dR.js +0 -2
  224. package/dist/standalone/assets/tabs-DUS8e6dR.js.br +0 -0
  225. package/dist/standalone/assets/tabs-DUS8e6dR.js.gz +0 -0
  226. package/dist/standalone/assets/useQueries-BCUhWYX4.js +0 -2
  227. package/dist/standalone/assets/useQueries-BCUhWYX4.js.br +0 -0
  228. package/dist/standalone/assets/useQueries-BCUhWYX4.js.gz +0 -0
  229. package/dist/standalone/assets/useQueries-BCUhWYX4.js.map +0 -1
  230. package/dist/standalone/assets/user-directory-9COoW6AO.js.br +0 -0
  231. package/dist/standalone/assets/user-directory-9COoW6AO.js.gz +0 -0
  232. package/dist/standalone/assets/value-format-Cgau0meh.js.br +0 -0
  233. package/dist/standalone/assets/value-format-Cgau0meh.js.gz +0 -0
  234. package/dist/standalone/assets/with-selector-NDLhu4dT.js +0 -2
  235. package/dist/standalone/assets/with-selector-NDLhu4dT.js.br +0 -0
  236. package/dist/standalone/assets/with-selector-NDLhu4dT.js.gz +0 -0
  237. package/dist/standalone/assets/with-selector-NDLhu4dT.js.map +0 -1
  238. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.br +0 -0
  239. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.gz +0 -0
  240. package/dist/standalone/assets/zod-BrelKLfy.js.br +0 -0
  241. package/dist/standalone/assets/zod-BrelKLfy.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"show-page-Dnox2NwO.js","names":[],"sources":["../../../../react/src/components/related-records-tabs.tsx","../../../../react/src/pages/show-page.tsx"],"sourcesContent":["// Tabs of records that reference the open record through a foreign key.\n// Each tab embeds the full ResourceListPage filtered by a locked\n// `{ [foreignKey]: parentRecordId }` so it gets the same table, filters,\n// bulk actions, pagination, and row-click behaviour as the main list.\n//\n// Designed to live below the property card on the show page.\n\nimport * as React from 'react'\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@modern-admin/ui'\nimport { useResources } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { ResourceListPage } from '../pages/list-page.js'\nimport { resolveRelatedResources } from '../relations.js'\nimport type { ListQueryState } from '../router.js'\nimport type { RelatedResource, ResourceJSON } from '../types.js'\n\ninterface RelatedRecordsTabProps {\n parentRecordId: string\n related: RelatedResource\n active: boolean\n}\n\nfunction RelatedRecordsTab({\n parentRecordId,\n related,\n active,\n}: RelatedRecordsTabProps): React.ReactElement | null {\n // Each tab keeps its own page/sort/filter state. Defaults: page 1, perPage 10\n // so embedded tables stay compact compared to the main list (default 20).\n const [query, setQuery] = React.useState<ListQueryState>({ perPage: 10 })\n\n // Lazy-load tab content: only mount the (heavy) ResourceListPage once the\n // user actually visits the tab. Subsequent toggles keep state thanks to\n // Radix's mount-on-activate semantics on TabsContent (we don't force unmount).\n const [hasBeenActive, setHasBeenActive] = React.useState(active)\n React.useEffect(() => {\n if (active) setHasBeenActive(true)\n }, [active])\n\n if (!hasBeenActive) return null\n\n return (\n <ResourceListPage\n resourceId={related.resourceId}\n query={query}\n onQueryChange={setQuery}\n lockedFilters={{ [related.foreignKey]: parentRecordId }}\n // The host `CardContent` already pads the tab body — don't double it,\n // or the table stops spanning the block's full width.\n embedPadding={false}\n features={{\n breadcrumbs: false,\n title: false,\n create: false,\n export: false,\n card: false,\n }}\n />\n )\n}\n\nexport interface RelatedRecordsTabsProps {\n resource: ResourceJSON\n recordId: string\n}\n\nexport function RelatedRecordsTabs({\n resource,\n recordId,\n}: RelatedRecordsTabsProps): React.ReactElement | null {\n const { t } = useI18n()\n const allResources = useResources()\n // Master switch: `showRelatedResources: false` in the resource config hides\n // the whole section regardless of configured/auto-discovered relations.\n const enabled = resource.showRelatedResources !== false\n const tabs = React.useMemo(\n () => (enabled ? resolveRelatedResources(resource, allResources) : []),\n [enabled, resource, allResources],\n )\n // Hooks must run before any early return — call useState unconditionally.\n const [active, setActive] = React.useState<string>(\n () => tabs[0] ? `${tabs[0].resourceId}::${tabs[0].foreignKey}` : '',\n )\n React.useEffect(() => {\n if (tabs.length === 0) return\n if (tabs.some((r) => `${r.resourceId}::${r.foreignKey}` === active)) return\n setActive(`${tabs[0]!.resourceId}::${tabs[0]!.foreignKey}`)\n }, [active, tabs])\n if (tabs.length === 0) return null\n\n const labelFor = (r: RelatedResource): string =>\n r.label ?? allResources.find((x) => x.id === r.resourceId)?.name ?? r.resourceId\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">{t('common:relatedRecords')}</CardTitle>\n </CardHeader>\n <CardContent>\n <Tabs value={active} onValueChange={setActive}>\n <TabsList className=\"w-full justify-start\">\n {tabs.map((r) => {\n const key = `${r.resourceId}::${r.foreignKey}`\n return (\n <TabsTrigger key={key} value={key}>\n {labelFor(r)}\n </TabsTrigger>\n )\n })}\n </TabsList>\n {tabs.map((r) => {\n const key = `${r.resourceId}::${r.foreignKey}`\n return (\n <TabsContent key={key} value={key} className=\"mt-4\">\n <RelatedRecordsTab\n parentRecordId={recordId}\n related={r}\n active={active === key}\n />\n </TabsContent>\n )\n })}\n </Tabs>\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Kbd,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n getModKeyLabel,\n} from '@modern-admin/ui'\nimport { AlertCircle, Pencil, Trash2, Zap } from 'lucide-react'\nimport { useDeleteRecord, useFeatures, useInvokeRecordAction, useRecord, useResource } from '../hooks.js'\nimport { confirmGuard } from '../action-guard.js'\nimport { showActionNotice } from '../action-notice.js'\nimport { hasActionComponent, useActionLauncher } from '../action-launcher.js'\nimport { parseApiError } from '../client.js'\nimport { PropertyDisplay } from '../property-renderer.js'\nimport { Link, useNavigate } from '../router.js'\nimport { useI18n } from '../i18n.js'\nimport { useHotkey } from '../use-hotkey.js'\nimport { PageBreadcrumbs, homeCrumb } from '../breadcrumbs.js'\nimport { RelatedRecordsTabs } from '../components/related-records-tabs.js'\nimport { useDialogs } from '../dialogs.js'\nimport { useNotify } from '../notify.js'\nimport { ActionMenu, isActionAllowedForRecord, visibleRecordActions } from '../action-menu.js'\nimport { RevisionsButton } from '../components/revisions-button.js'\nimport { visibleRecordProperties } from '../relations.js'\n\nfunction PageError({\n error,\n t,\n}: {\n error: unknown\n t: (key: string) => string\n}): React.ReactElement {\n const { status, message } = parseApiError(error)\n const title =\n status === 404\n ? t('errors:notFound')\n : status === 403\n ? t('errors:forbidden')\n : t('errors:server')\n return (\n <div className=\"flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15\">\n <AlertCircle className=\"mt-0.5 size-5 shrink-0 text-destructive\" />\n <div className=\"space-y-1 text-sm\">\n <p className=\"font-semibold text-destructive\">{title}</p>\n <p className=\"text-destructive/90\">{message}</p>\n </div>\n </div>\n )\n}\n\nexport interface ResourceShowPageProps {\n resourceId: string\n recordId: string\n}\n\nexport function ResourceShowPage({\n resourceId,\n recordId,\n}: ResourceShowPageProps): React.ReactElement {\n const resource = useResource(resourceId)\n const record = useRecord(resourceId, recordId)\n const remove = useDeleteRecord(resourceId)\n const invokeRecord = useInvokeRecordAction(resourceId)\n const features = useFeatures()\n const { t } = useI18n()\n const navigate = useNavigate()\n const dialogs = useDialogs()\n const notify = useNotify()\n const openActionComponent = useActionLauncher(resourceId)\n\n // `recordActions` on the loaded record carries the server's per-record\n // `isVisible`/`isAccessible` verdict, which `resource.actions` cannot —\n // it is serialized without any record in context.\n const loadedRecord = record.data?.record\n const customRecordActions = visibleRecordActions(\n (resource?.actions ?? []).filter(\n (a) => a.actionType === 'record' && !['show', 'edit', 'delete'].includes(a.name),\n ),\n loadedRecord,\n )\n const canEdit = isActionAllowedForRecord('edit', loadedRecord)\n const canDelete = isActionAllowedForRecord('delete', loadedRecord)\n\n // ── Keyboard shortcuts ──\n // Ctrl/Cmd+E jumps into edit. Discoverable via the action-button tooltip.\n useHotkey(\n 'mod+e',\n () => {\n if (!record.data || !canEdit) return\n navigate({ name: 'edit', resourceId, recordId })\n },\n { description: t('common:edit') },\n )\n\n const handleDelete = async (): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('common:confirmDelete'),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n await remove.mutateAsync(recordId)\n navigate({ name: 'list', resourceId })\n }\n\n if (!resource) return <div className=\"p-6\">{t('common:loading')}</div>\n\n const modLabel = getModKeyLabel()\n const recordLabel = record.data?.record?.title || recordId\n\n return (\n <div className=\"space-y-2 sm:space-y-4\">\n <PageBreadcrumbs\n items={[\n homeCrumb(t('common:home')),\n { label: resource.name, to: { name: 'list', resourceId } },\n { label: recordLabel },\n ]}\n />\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-3\">\n <CardTitle className=\"truncate\">\n {resource.name} #{recordId}\n </CardTitle>\n {record.data && (\n <div className=\"flex shrink-0 flex-wrap gap-2\">\n {features.history && (\n <RevisionsButton resourceId={resourceId} recordId={recordId} />\n )}\n {canEdit && (\n <Tooltip>\n <TooltipTrigger asChild>\n {/* `asChild` + Link-as-Button keeps the rendered DOM a\n * single `<a>` so it picks up the Button's `h-8` from\n * `size=\"sm\"` instead of stacking a Link wrapper that\n * collapses to its anchor default height. */}\n <Button variant=\"outline-primary\" size=\"sm\" asChild>\n <Link to={{ name: 'edit', resourceId, recordId }} aria-label={t('common:edit')}>\n <Pencil className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:edit')}</span>\n </Link>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:edit')}</span>\n <span className=\"inline-flex items-center gap-0.5\">\n <Kbd>{modLabel}</Kbd>\n <span className=\"text-muted-foreground\">+</span>\n <Kbd>E</Kbd>\n </span>\n </TooltipContent>\n </Tooltip>\n )}\n {canDelete && (\n <Button\n variant=\"outline-destructive\"\n size=\"sm\"\n disabled={remove.isPending}\n onClick={() => void handleDelete()}\n aria-label={t('common:delete')}\n >\n <Trash2 className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:delete')}</span>\n </Button>\n )}\n {customRecordActions.length > 0 && (\n <ActionMenu\n actions={customRecordActions}\n onAction={async (action) => {\n if (hasActionComponent(action)) {\n openActionComponent(action, { recordId })\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n void invokeRecord\n .mutateAsync({ recordId, actionName: action.name })\n .then((res) => showActionNotice(notify, res.notice))\n .catch((err: Error) =>\n notify.error({ message: err.message }),\n )\n }}\n t={t}\n trigger={(\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={invokeRecord.isPending}\n aria-label={t('common:actions')}\n >\n <Zap className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:actions')}</span>\n </Button>\n )}\n />\n )}\n </div>\n )}\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {record.isLoading && <p className=\"text-muted-foreground\">{t('common:loading')}</p>}\n {record.isError && <PageError error={record.error} t={t} />}\n {record.data && (\n <dl className=\"[column-fill:_balance] md:columns-2\">\n {visibleRecordProperties(resource.properties, 'show', resource.propertyOrder?.show)\n .map((p) => (\n <div key={p.path} className=\"mb-8 break-inside-avoid\">\n <dt className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {p.label}\n </dt>\n <dd className=\"mt-1\">\n <PropertyDisplay\n property={p}\n value={record.data!.record.params[p.path]}\n view=\"show\"\n populated={record.data!.record.populated as Record<string, unknown> | undefined}\n />\n </dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n </CardContent>\n </Card>\n {record.data && <RelatedRecordsTabs resource={resource} recordId={recordId} />}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"show-page-CGzUAZoO.js","names":[],"sources":["../../../../react/src/components/related-records-tabs.tsx","../../../../react/src/pages/show-page.tsx"],"sourcesContent":["// Tabs of records that reference the open record through a foreign key.\n// Each tab embeds the full ResourceListPage filtered by a locked\n// `{ [foreignKey]: parentRecordId }` so it gets the same table, filters,\n// bulk actions, pagination, and row-click behaviour as the main list.\n//\n// Designed to live below the property card on the show page.\n\nimport * as React from 'react'\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@modern-admin/ui'\nimport { useResources } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { ResourceListPage } from '../pages/list-page.js'\nimport { resolveRelatedResources } from '../relations.js'\nimport type { ListQueryState } from '../router.js'\nimport type { RelatedResource, ResourceJSON } from '../types.js'\n\ninterface RelatedRecordsTabProps {\n parentRecordId: string\n related: RelatedResource\n active: boolean\n}\n\nfunction RelatedRecordsTab({\n parentRecordId,\n related,\n active,\n}: RelatedRecordsTabProps): React.ReactElement | null {\n // Each tab keeps its own page/sort/filter state. Defaults: page 1, perPage 10\n // so embedded tables stay compact compared to the main list (default 20).\n const [query, setQuery] = React.useState<ListQueryState>({ perPage: 10 })\n\n // Lazy-load tab content: only mount the (heavy) ResourceListPage once the\n // user actually visits the tab. Subsequent toggles keep state thanks to\n // Radix's mount-on-activate semantics on TabsContent (we don't force unmount).\n const [hasBeenActive, setHasBeenActive] = React.useState(active)\n React.useEffect(() => {\n if (active) setHasBeenActive(true)\n }, [active])\n\n if (!hasBeenActive) return null\n\n return (\n <ResourceListPage\n resourceId={related.resourceId}\n query={query}\n onQueryChange={setQuery}\n lockedFilters={{ [related.foreignKey]: parentRecordId }}\n // The host `CardContent` already pads the tab body — don't double it,\n // or the table stops spanning the block's full width.\n embedPadding={false}\n features={{\n breadcrumbs: false,\n title: false,\n create: false,\n export: false,\n card: false,\n }}\n />\n )\n}\n\nexport interface RelatedRecordsTabsProps {\n resource: ResourceJSON\n recordId: string\n}\n\nexport function RelatedRecordsTabs({\n resource,\n recordId,\n}: RelatedRecordsTabsProps): React.ReactElement | null {\n const { t } = useI18n()\n const allResources = useResources()\n // Master switch: `showRelatedResources: false` in the resource config hides\n // the whole section regardless of configured/auto-discovered relations.\n const enabled = resource.showRelatedResources !== false\n const tabs = React.useMemo(\n () => (enabled ? resolveRelatedResources(resource, allResources) : []),\n [enabled, resource, allResources],\n )\n // Hooks must run before any early return — call useState unconditionally.\n const [active, setActive] = React.useState<string>(\n () => tabs[0] ? `${tabs[0].resourceId}::${tabs[0].foreignKey}` : '',\n )\n React.useEffect(() => {\n if (tabs.length === 0) return\n if (tabs.some((r) => `${r.resourceId}::${r.foreignKey}` === active)) return\n setActive(`${tabs[0]!.resourceId}::${tabs[0]!.foreignKey}`)\n }, [active, tabs])\n if (tabs.length === 0) return null\n\n const labelFor = (r: RelatedResource): string =>\n r.label ?? allResources.find((x) => x.id === r.resourceId)?.name ?? r.resourceId\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">{t('common:relatedRecords')}</CardTitle>\n </CardHeader>\n <CardContent>\n <Tabs value={active} onValueChange={setActive}>\n <TabsList className=\"w-full justify-start\">\n {tabs.map((r) => {\n const key = `${r.resourceId}::${r.foreignKey}`\n return (\n <TabsTrigger key={key} value={key}>\n {labelFor(r)}\n </TabsTrigger>\n )\n })}\n </TabsList>\n {tabs.map((r) => {\n const key = `${r.resourceId}::${r.foreignKey}`\n return (\n <TabsContent key={key} value={key} className=\"mt-4\">\n <RelatedRecordsTab\n parentRecordId={recordId}\n related={r}\n active={active === key}\n />\n </TabsContent>\n )\n })}\n </Tabs>\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Kbd,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n getModKeyLabel,\n} from '@modern-admin/ui'\nimport { AlertCircle, Pencil, Trash2, Zap } from 'lucide-react'\nimport { useDeleteRecord, useFeatures, useInvokeRecordAction, useRecord, useResource } from '../hooks.js'\nimport { confirmGuard } from '../action-guard.js'\nimport { showActionNotice } from '../action-notice.js'\nimport { hasActionComponent, useActionLauncher } from '../action-launcher.js'\nimport { parseApiError } from '../client.js'\nimport { PropertyDisplay } from '../property-renderer.js'\nimport { Link, useNavigate } from '../router.js'\nimport { useI18n } from '../i18n.js'\nimport { useHotkey } from '../use-hotkey.js'\nimport { PageBreadcrumbs, homeCrumb } from '../breadcrumbs.js'\nimport { RelatedRecordsTabs } from '../components/related-records-tabs.js'\nimport { useDialogs } from '../dialogs.js'\nimport { useNotify } from '../notify.js'\nimport { ActionMenu, isActionAllowedForRecord, visibleRecordActions } from '../action-menu.js'\nimport { RevisionsButton } from '../components/revisions-button.js'\nimport { visibleRecordProperties } from '../relations.js'\n\nfunction PageError({\n error,\n t,\n}: {\n error: unknown\n t: (key: string) => string\n}): React.ReactElement {\n const { status, message } = parseApiError(error)\n const title =\n status === 404\n ? t('errors:notFound')\n : status === 403\n ? t('errors:forbidden')\n : t('errors:server')\n return (\n <div className=\"flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15\">\n <AlertCircle className=\"mt-0.5 size-5 shrink-0 text-destructive\" />\n <div className=\"space-y-1 text-sm\">\n <p className=\"font-semibold text-destructive\">{title}</p>\n <p className=\"text-destructive/90\">{message}</p>\n </div>\n </div>\n )\n}\n\nexport interface ResourceShowPageProps {\n resourceId: string\n recordId: string\n}\n\nexport function ResourceShowPage({\n resourceId,\n recordId,\n}: ResourceShowPageProps): React.ReactElement {\n const resource = useResource(resourceId)\n const record = useRecord(resourceId, recordId)\n const remove = useDeleteRecord(resourceId)\n const invokeRecord = useInvokeRecordAction(resourceId)\n const features = useFeatures()\n const { t } = useI18n()\n const navigate = useNavigate()\n const dialogs = useDialogs()\n const notify = useNotify()\n const openActionComponent = useActionLauncher(resourceId)\n\n // `recordActions` on the loaded record carries the server's per-record\n // `isVisible`/`isAccessible` verdict, which `resource.actions` cannot —\n // it is serialized without any record in context.\n const loadedRecord = record.data?.record\n const customRecordActions = visibleRecordActions(\n (resource?.actions ?? []).filter(\n (a) => a.actionType === 'record' && !['show', 'edit', 'delete'].includes(a.name),\n ),\n loadedRecord,\n )\n const canEdit = isActionAllowedForRecord('edit', loadedRecord)\n const canDelete = isActionAllowedForRecord('delete', loadedRecord)\n\n // ── Keyboard shortcuts ──\n // Ctrl/Cmd+E jumps into edit. Discoverable via the action-button tooltip.\n useHotkey(\n 'mod+e',\n () => {\n if (!record.data || !canEdit) return\n navigate({ name: 'edit', resourceId, recordId })\n },\n { description: t('common:edit') },\n )\n\n const handleDelete = async (): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('common:confirmDelete'),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n await remove.mutateAsync(recordId)\n navigate({ name: 'list', resourceId })\n }\n\n if (!resource) return <div className=\"p-6\">{t('common:loading')}</div>\n\n const modLabel = getModKeyLabel()\n const recordLabel = record.data?.record?.title || recordId\n\n return (\n <div className=\"space-y-2 sm:space-y-4\">\n <PageBreadcrumbs\n items={[\n homeCrumb(t('common:home')),\n { label: resource.name, to: { name: 'list', resourceId } },\n { label: recordLabel },\n ]}\n />\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-3\">\n <CardTitle className=\"truncate\">\n {resource.name} #{recordId}\n </CardTitle>\n {record.data && (\n <div className=\"flex shrink-0 flex-wrap gap-2\">\n {features.history && (\n <RevisionsButton resourceId={resourceId} recordId={recordId} />\n )}\n {canEdit && (\n <Tooltip>\n <TooltipTrigger asChild>\n {/* `asChild` + Link-as-Button keeps the rendered DOM a\n * single `<a>` so it picks up the Button's `h-8` from\n * `size=\"sm\"` instead of stacking a Link wrapper that\n * collapses to its anchor default height. */}\n <Button variant=\"outline-primary\" size=\"sm\" asChild>\n <Link to={{ name: 'edit', resourceId, recordId }} aria-label={t('common:edit')}>\n <Pencil className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:edit')}</span>\n </Link>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:edit')}</span>\n <span className=\"inline-flex items-center gap-0.5\">\n <Kbd>{modLabel}</Kbd>\n <span className=\"text-muted-foreground\">+</span>\n <Kbd>E</Kbd>\n </span>\n </TooltipContent>\n </Tooltip>\n )}\n {canDelete && (\n <Button\n variant=\"outline-destructive\"\n size=\"sm\"\n disabled={remove.isPending}\n onClick={() => void handleDelete()}\n aria-label={t('common:delete')}\n >\n <Trash2 className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:delete')}</span>\n </Button>\n )}\n {customRecordActions.length > 0 && (\n <ActionMenu\n actions={customRecordActions}\n onAction={async (action) => {\n if (hasActionComponent(action)) {\n openActionComponent(action, { recordId })\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n void invokeRecord\n .mutateAsync({ recordId, actionName: action.name })\n .then((res) => showActionNotice(notify, res.notice))\n .catch((err: Error) =>\n notify.error({ message: err.message }),\n )\n }}\n t={t}\n trigger={(\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={invokeRecord.isPending}\n aria-label={t('common:actions')}\n >\n <Zap className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:actions')}</span>\n </Button>\n )}\n />\n )}\n </div>\n )}\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {record.isLoading && <p className=\"text-muted-foreground\">{t('common:loading')}</p>}\n {record.isError && <PageError error={record.error} t={t} />}\n {record.data && (\n <dl className=\"[column-fill:_balance] md:columns-2\">\n {visibleRecordProperties(resource.properties, 'show', resource.propertyOrder?.show)\n .map((p) => (\n <div key={p.path} className=\"mb-8 break-inside-avoid\">\n <dt className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {p.label}\n </dt>\n <dd className=\"mt-1\">\n <PropertyDisplay\n property={p}\n value={record.data!.record.params[p.path]}\n view=\"show\"\n populated={record.data!.record.populated as Record<string, unknown> | undefined}\n />\n </dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n </CardContent>\n </Card>\n {record.data && <RelatedRecordsTabs resource={resource} recordId={recordId} />}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{E as n,T as r,_ as i,d as a,h as o,m as s,p as c,y as l}from"./with-selector-id7qGzTH.js";import{t as u}from"./dist-CWGgVQiS.js";import{B as d,V as f,z as p}from"./index-uYpCUVT4.js";var m=e(t(),1),h=n(),g=`Tabs`,[_,v]=r(g,[f]),y=f(),[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]=i({prop:r,onChange:a,defaultProp:s??``,caller:g});return(0,h.jsx)(b,{scope:n,baseId:c(),value:_,onValueChange:v,orientation:l,dir:m,activationMode:f,children:(0,h.jsx)(o.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),s=y(n);return(0,h.jsx)(d,{asChild:!0,...s,orientation:a.orientation,dir:a.dir,loop:r,children:(0,h.jsx)(o.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:r,disabled:i=!1,...a}=e,s=x(T,n),c=y(n),u=k(s.baseId,r),d=A(s.baseId,r),f=r===s.value;return(0,h.jsx)(p,{asChild:!0,...c,focusable:!i,active:f,children:(0,h.jsx)(o.button,{type:`button`,role:`tab`,"aria-selected":f,"aria-controls":d,"data-state":f?`active`:`inactive`,"data-disabled":i?``:void 0,disabled:i,id:u,...a,ref:t,onMouseDown:l(e.onMouseDown,e=>{!i&&e.button===0&&e.ctrlKey===!1?s.onValueChange(r):e.preventDefault()}),onKeyDown:l(e.onKeyDown,e=>{i||e.target!==e.currentTarget||[` `,`Enter`].includes(e.key)&&s.onValueChange(r)}),onFocus:l(e.onFocus,()=>{let e=s.activationMode!==`manual`;!f&&!i&&e&&s.onValueChange(r)})})})});E.displayName=T;var D=`TabsContent`,O=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,forceMount:i,children:a,...c}=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)(s,{present:i||f,children:({present:n})=>(0,h.jsx)(o.div,{"data-state":f?`active`:`inactive`,"data-orientation":l.orientation,role:`tabpanel`,"aria-labelledby":u,hidden:!n,id:d,tabIndex:0,...c,ref:t,style:{...e.style,animationDuration:p.current?`0s`:void 0},children:n&&a})})});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:a(`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:a(`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:a(`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-smdw70rV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-DUS8e6dR.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-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,2 +1,2 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n,s as r}from"./with-selector-NDLhu4dT.js";var i=e(t(),1),a=n(),o=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`textarea`,{ref:n,className:r(`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-CX_0QVSz.js.map
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{E as n,d as r}from"./with-selector-id7qGzTH.js";var i=e(t(),1),a=n(),o=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`textarea`,{ref:n,className:r(`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-DBVf3GGt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"textarea-CX_0QVSz.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-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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{E as n,T as r,_ as i,a,c as o,d as s,h as c,m as l,o as u,p as d,s as f,w as p,x as m,y as h}from"./with-selector-id7qGzTH.js";import{a as g,i as ee,n as te,r as ne,t as _}from"./dist-UsTgBPww.js";import{Dt as v,Et as y,Tt as b,_t as x,bt as S,ct as re,dt as ie,ft as C,gt as w,ht as T,lt as E,mt as D,pt as O,st as k,ut as ae,vt as oe,wt as se,xt as ce,yt as le}from"./router-BcZgB5cZ.js";var A=e(t(),1),j=n(),M=`Popover`,[N,ue]=r(M,[g]),P=g(),[F,I]=N(M),L=e=>{let{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:s=!1}=e,c=P(t),l=A.useRef(null),[u,f]=A.useState(!1),[p,m]=i({prop:r,defaultProp:a??!1,onChange:o,caller:M});return(0,j.jsx)(ee,{...c,children:(0,j.jsx)(F,{scope:t,contentId:d(),triggerRef:l,open:p,onOpenChange:m,onOpenToggle:A.useCallback(()=>m(e=>!e),[m]),hasCustomAnchor:u,onCustomAnchorAdd:A.useCallback(()=>f(!0),[]),onCustomAnchorRemove:A.useCallback(()=>f(!1),[]),modal:s,children:n})})};L.displayName=M;var R=`PopoverAnchor`,z=A.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=I(R,n),a=P(n),{onCustomAnchorAdd:o,onCustomAnchorRemove:s}=i;return A.useEffect(()=>(o(),()=>s()),[o,s]),(0,j.jsx)(_,{...a,...r,ref:t})});z.displayName=R;var B=`PopoverTrigger`,V=A.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=I(B,n),a=P(n),o=p(t,i.triggerRef),s=(0,j.jsx)(c.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":Y(i.open),...r,ref:o,onClick:h(e.onClick,i.onOpenToggle)});return i.hasCustomAnchor?s:(0,j.jsx)(_,{asChild:!0,...a,children:s})});V.displayName=B;var H=`PopoverPortal`,[U,de]=N(H,{forceMount:void 0}),W=e=>{let{__scopePopover:t,forceMount:n,children:r,container:i}=e,a=I(H,t);return(0,j.jsx)(U,{scope:t,forceMount:n,children:(0,j.jsx)(l,{present:n||a.open,children:(0,j.jsx)(f,{asChild:!0,container:i,children:r})})})};W.displayName=H;var G=`PopoverContent`,K=A.forwardRef((e,t)=>{let n=de(G,e.__scopePopover),{forceMount:r=n.forceMount,...i}=e,a=I(G,e.__scopePopover);return(0,j.jsx)(l,{present:r||a.open,children:a.modal?(0,j.jsx)(pe,{...i,ref:t}):(0,j.jsx)(me,{...i,ref:t})})});K.displayName=G;var fe=m(`PopoverContent.RemoveScroll`),pe=A.forwardRef((e,t)=>{let n=I(G,e.__scopePopover),r=A.useRef(null),i=p(t,r),a=A.useRef(!1);return A.useEffect(()=>{let e=r.current;if(e)return b(e)},[]),(0,j.jsx)(se,{as:fe,allowPinchZoom:!0,children:(0,j.jsx)(q,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:h(e.onCloseAutoFocus,e=>{e.preventDefault(),a.current||n.triggerRef.current?.focus()}),onPointerDownOutside:h(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0,r=t.button===2||n;a.current=r},{checkForDefaultPrevented:!1}),onFocusOutside:h(e.onFocusOutside,e=>e.preventDefault(),{checkForDefaultPrevented:!1})})})}),me=A.forwardRef((e,t)=>{let n=I(G,e.__scopePopover),r=A.useRef(!1),i=A.useRef(!1);return(0,j.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=A.forwardRef((e,t)=>{let{__scopePopover:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,disableOutsidePointerEvents:s,onEscapeKeyDown:c,onPointerDownOutside:l,onFocusOutside:u,onInteractOutside:d,...f}=e,p=I(G,n),m=P(n);return v(),(0,j.jsx)(y,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,j.jsx)(o,{asChild:!0,disableOutsidePointerEvents:s,onInteractOutside:d,onEscapeKeyDown:c,onPointerDownOutside:l,onFocusOutside:u,onDismiss:()=>p.onOpenChange(!1),deferPointerDownOutside:!0,children:(0,j.jsx)(ne,{"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=A.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=I(J,n);return(0,j.jsx)(c.button,{type:`button`,...r,ref:t,onClick:h(e.onClick,()=>i.onOpenChange(!1))})});he.displayName=J;var ge=`PopoverArrow`,_e=A.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=P(n);return(0,j.jsx)(te,{...i,...r,ref:t})});_e.displayName=ge;function Y(e){return e?`open`:`closed`}var ve=L,ye=z,be=V,xe=W,X=K,Se=ve,Ce=be,we=ye,Z=A.forwardRef(({className:e,align:t=`center`,sideOffset:n=4,collisionPadding:r,container:i,...o},c)=>{let l=a(),d=u();return(0,j.jsx)(xe,{container:i??l,children:(0,j.jsx)(X,{ref:c,align:t,sideOffset:n,collisionPadding:r??d,className:s(`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),...o})})});Z.displayName=X.displayName;function Q(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Te(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ee=class extends ce{#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,x.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||!S(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Q(e,n).forEach(e=>{e.destroy()}),Q(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=le(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 w(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Te(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)&&x.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}};function $({queries:e,...t},n){let r=T(n),i=D(),a=O(),o=A.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{k(e);let t=r.getQueryCache().get(e.queryHash);ae(e,a,t)}),C(a);let[s]=A.useState(()=>new Ee(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;A.useSyncExternalStore(A.useCallback(e=>d?s.subscribe(x.batchCalls(e)):oe,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),A.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>E(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&E(n,e)?re(n,new w(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ie({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{Ce as a,Z as i,Se as n,we as r,$ as t};
2
+ //# sourceMappingURL=useQueries-Ba2PuYhZ.js.map
@@ -0,0 +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":"4dAqBI,EAAe,UACf,CAAC,EAAsB,IAAsB,EAAmB,EAAc,CAChF,CACF,CAAC,EACG,EAAiB,EAAkB,EACnC,CAAC,EAAiB,GAAqB,EAAqB,CAAY,EACxEA,EAAW,GAAU,CACvB,GAAM,CACJ,iBACA,WACA,KAAM,EACN,cACA,eACA,QAAQ,IACN,EACE,EAAc,EAAe,CAAc,EAC3C,EAAA,EAAmB,OAAO,IAAI,EAC9B,CAAC,EAAiB,GAAA,EAA4B,SAAS,EAAK,EAC5D,CAAC,EAAM,GAAW,EAAqB,CAC3C,KAAM,EACN,YAAa,GAAe,GAC5B,SAAU,EACV,OAAQ,CACV,CAAC,EACD,OAAuB,EAAA,EAAA,IAAA,CAAIC,GAAsB,CAAE,GAAG,EAAa,UAA0B,EAAA,EAAA,IAAA,CAC3F,EACA,CACE,MAAO,EACP,UAAW,EAAM,EACjB,aACA,OACA,aAAc,EACd,aAAA,EAAoB,gBAAkB,EAAS,GAAa,CAAC,CAAQ,EAAG,CAAC,CAAO,CAAC,EACjF,kBACA,kBAAA,EAAyB,gBAAkB,EAAmB,EAAI,EAAG,CAAC,CAAC,EACvE,qBAAA,EAA4B,gBAAkB,EAAmB,EAAK,EAAG,CAAC,CAAC,EAC3E,QACA,UACF,CACF,CAAE,CAAC,CACL,EACA,EAAQ,YAAc,EACtB,IAAI,EAAc,gBACdC,EAAAA,EAAsB,YACvB,EAAO,IAAiB,CACvB,GAAM,CAAE,iBAAgB,GAAG,GAAgB,EACrC,EAAU,EAAkB,EAAa,CAAc,EACvD,EAAc,EAAe,CAAc,EAC3C,CAAE,oBAAmB,wBAAyB,EAKpD,OAJA,EAAM,eACJ,EAAkB,MACL,EAAqB,GACjC,CAAC,EAAmB,CAAoB,CAAC,GACrB,EAAA,EAAA,IAAA,CAAIC,EAAwB,CAAE,GAAG,EAAa,GAAG,EAAa,IAAK,CAAa,CAAC,CAC1G,CACF,EACA,EAAc,YAAc,EAC5B,IAAI,EAAe,iBACfC,EAAAA,EAAuB,YACxB,EAAO,IAAiB,CACvB,GAAM,CAAE,iBAAgB,GAAG,GAAiB,EACtC,EAAU,EAAkB,EAAc,CAAc,EACxD,EAAc,EAAe,CAAc,EAC3C,EAAqB,EAAgB,EAAc,EAAQ,UAAU,EACrE,GAA0B,EAAA,EAAA,IAAA,CAC9B,EAAU,OACV,CACE,KAAM,SACN,gBAAiB,SACjB,gBAAiB,EAAQ,KACzB,gBAAiB,EAAQ,KAAO,EAAQ,UAAY,IAAK,GACzD,aAAc,EAAS,EAAQ,IAAI,EACnC,GAAG,EACH,IAAK,EACL,QAAS,EAAqB,EAAM,QAAS,EAAQ,YAAY,CACnE,CACF,EACA,OAAO,EAAQ,gBAAkB,GAA0B,EAAA,EAAA,IAAA,CAAID,EAAwB,CAAE,QAAS,GAAM,GAAG,EAAa,SAAU,CAAQ,CAAC,CAC7I,CACF,EACA,EAAe,YAAc,EAC7B,IAAI,EAAc,gBACd,CAAC,EAAgB,IAAoB,EAAqB,EAAa,CACzE,WAAY,IAAK,EACnB,CAAC,EACG,EAAiB,GAAU,CAC7B,GAAM,CAAE,iBAAgB,aAAY,WAAU,aAAc,EACtD,EAAU,EAAkB,EAAa,CAAc,EAC7D,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAgB,CAAE,MAAO,EAAgB,aAAY,UAA0B,EAAA,EAAA,IAAA,CAAI,EAAU,CAAE,QAAS,GAAc,EAAQ,KAAM,UAA0B,EAAA,EAAA,IAAA,CAAIE,EAAiB,CAAE,QAAS,GAAM,YAAW,UAAS,CAAC,CAAE,CAAC,CAAE,CAAC,CAC5P,EACA,EAAc,YAAc,EAC5B,IAAI,EAAe,iBACfC,EAAAA,EAAuB,YACxB,EAAO,IAAiB,CACvB,IAAM,EAAgB,GAAiB,EAAc,EAAM,cAAc,EACnE,CAAE,aAAa,EAAc,WAAY,GAAG,GAAiB,EAC7D,EAAU,EAAkB,EAAc,EAAM,cAAc,EACpE,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAU,CAAE,QAAS,GAAc,EAAQ,KAAM,SAAU,EAAQ,OAAwB,EAAA,EAAA,IAAA,CAAI,GAAqB,CAAE,GAAG,EAAc,IAAK,CAAa,CAAC,GAAoB,EAAA,EAAA,IAAA,CAAI,GAAwB,CAAE,GAAG,EAAc,IAAK,CAAa,CAAC,CAAE,CAAC,CAChR,CACF,EACA,EAAe,YAAc,EAC7B,IAAI,GAAO,EAAW,6BAA6B,EAC/C,GAAA,EAA4B,YAC7B,EAAO,IAAiB,CACvB,IAAM,EAAU,EAAkB,EAAc,EAAM,cAAc,EAC9D,EAAA,EAAmB,OAAO,IAAI,EAC9B,EAAe,EAAgB,EAAc,CAAU,EACvD,EAAA,EAA+B,OAAO,EAAK,EAKjD,OAJA,EAAM,cAAgB,CACpB,IAAM,EAAU,EAAW,QAC3B,GAAI,EAAS,OAAO,EAAW,CAAO,CACxC,EAAG,CAAC,CAAC,GACkB,EAAA,EAAA,IAAA,CAAIC,GAAc,CAAE,GAAI,GAAM,eAAgB,GAAM,UAA0B,EAAA,EAAA,IAAA,CACnG,EACA,CACE,GAAG,EACH,IAAK,EACL,UAAW,EAAQ,KACnB,4BAA6B,GAC7B,iBAAkB,EAAqB,EAAM,iBAAmB,GAAU,CACxE,EAAM,eAAe,EAChB,EAAuB,SAAS,EAAQ,WAAW,SAAS,MAAM,CACzE,CAAC,EACD,qBAAsB,EACpB,EAAM,qBACL,GAAU,CACT,IAAM,EAAgB,EAAM,OAAO,cAC7B,EAAgB,EAAc,SAAW,GAAK,EAAc,UAAY,GACxE,EAAe,EAAc,SAAW,GAAK,EACnD,EAAuB,QAAU,CACnC,EACA,CAAE,yBAA0B,EAAM,CACpC,EACA,eAAgB,EACd,EAAM,eACL,GAAU,EAAM,eAAe,EAChC,CAAE,yBAA0B,EAAM,CACpC,CACF,CACF,CAAE,CAAC,CACL,CACF,EACI,GAAA,EAA+B,YAChC,EAAO,IAAiB,CACvB,IAAM,EAAU,EAAkB,EAAc,EAAM,cAAc,EAC9D,EAAA,EAAgC,OAAO,EAAK,EAC5C,EAAA,EAAiC,OAAO,EAAK,EACnD,OAAuB,EAAA,EAAA,IAAA,CACrB,EACA,CACE,GAAG,EACH,IAAK,EACL,UAAW,GACX,4BAA6B,GAC7B,iBAAmB,GAAU,CAC3B,EAAM,mBAAmB,CAAK,EACzB,EAAM,mBACJ,EAAwB,SAAS,EAAQ,WAAW,SAAS,MAAM,EACxE,EAAM,eAAe,GAEvB,EAAwB,QAAU,GAClC,EAAyB,QAAU,EACrC,EACA,kBAAoB,GAAU,CAC5B,EAAM,oBAAoB,CAAK,EAC1B,EAAM,mBACT,EAAwB,QAAU,GAC9B,EAAM,OAAO,cAAc,OAAS,gBACtC,EAAyB,QAAU,KAGvC,IAAM,EAAS,EAAM,OACG,EAAQ,WAAW,SAAS,SAAS,CAAM,GAC9C,EAAM,eAAe,EACtC,EAAM,OAAO,cAAc,OAAS,WAAa,EAAyB,SAC5E,EAAM,eAAe,CAEzB,CACF,CACF,CACF,CACF,EACI,EAAA,EAA2B,YAC5B,EAAO,IAAiB,CACvB,GAAM,CACJ,iBACA,YACA,kBACA,mBACA,8BACA,kBACA,uBACA,iBACA,oBACA,GAAG,GACD,EACE,EAAU,EAAkB,EAAc,CAAc,EACxD,EAAc,EAAe,CAAc,EAEjD,OADA,EAAe,GACQ,EAAA,EAAA,IAAA,CACrB,EACA,CACE,QAAS,GACT,KAAM,GACN,QAAS,EACT,iBAAkB,EAClB,mBAAoB,EACpB,UAA0B,EAAA,EAAA,IAAA,CACxB,EACA,CACE,QAAS,GACT,8BACA,oBACA,kBACA,uBACA,iBACA,cAAiB,EAAQ,aAAa,EAAK,EAC3C,wBAAyB,GACzB,UAA0B,EAAA,EAAA,IAAA,CACxBC,GACA,CACE,aAAc,EAAS,EAAQ,IAAI,EACnC,KAAM,SACN,GAAI,EAAQ,UACZ,GAAG,EACH,GAAG,EACH,IAAK,EACL,MAAO,CACL,GAAG,EAAa,MAGd,2CAA4C,uCAC5C,0CAA2C,sCAC3C,2CAA4C,uCAC5C,gCAAiC,mCACjC,iCAAkC,mCAEtC,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CACF,EACI,EAAa,eACb,GAAA,EAAqB,YACtB,EAAO,IAAiB,CACvB,GAAM,CAAE,iBAAgB,GAAG,GAAe,EACpC,EAAU,EAAkB,EAAY,CAAc,EAC5D,OAAuB,EAAA,EAAA,IAAA,CACrB,EAAU,OACV,CACE,KAAM,SACN,GAAG,EACH,IAAK,EACL,QAAS,EAAqB,EAAM,YAAe,EAAQ,aAAa,EAAK,CAAC,CAChF,CACF,CACF,CACF,EACA,GAAa,YAAc,EAC3B,IAAI,GAAa,eACb,GAAA,EAAqB,YACtB,EAAO,IAAiB,CACvB,GAAM,CAAE,iBAAgB,GAAG,GAAe,EACpC,EAAc,EAAe,CAAc,EACjD,OAAuB,EAAA,EAAA,IAAA,CAAIC,GAAuB,CAAE,GAAG,EAAa,GAAG,EAAY,IAAK,CAAa,CAAC,CACxG,CACF,EACA,GAAa,YAAc,GAC3B,SAAS,EAAS,EAAM,CACtB,OAAO,EAAO,OAAS,QACzB,CACA,IAAI,GAAQT,EACR,GAAUE,EACV,GAAUE,EACV,GAAS,EACT,EAAWE,ECvSF,GAAU,GACV,GAAiB,GACjB,GAAgB,GAShB,EAAA,EAAuB,YAGjC,CAAE,YAAW,QAAQ,SAAU,aAAa,EAAG,mBAAkB,YAAW,GAAG,GAAS,IAAQ,CACjG,IAAM,EAAkB,EAAmB,EACrC,EAAkB,EAA4B,EACpD,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAyB,UAAW,GAAa,YAC/C,EAAA,EAAA,IAAA,CAAC,EAAD,CACO,MACE,QACK,aACZ,iBAAkB,GAAoB,EACtC,UAAW,EACT,6WACA,CACF,EACA,GAAI,CACL,CAAA,CACsB,CAAA,CAE7B,CAAC,EACD,EAAe,YAAA,EAAuC,YCjCtD,SAAS,EAAW,EAAQ,EAAQ,CAClC,IAAM,EAAa,IAAI,IAAI,CAAM,EACjC,OAAO,EAAO,OAAQ,GAAM,CAAC,EAAW,IAAI,CAAC,CAAC,CAChD,CACA,SAAS,GAAU,EAAO,EAAO,EAAO,CACtC,IAAM,EAAO,EAAM,MAAM,CAAC,EAE1B,MADA,GAAK,GAAS,EACP,CACT,CACA,IAAI,GAAkB,cAAc,EAAa,CAC/C,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GAAmB,CAAC,EACpB,YAAY,EAAQ,EAAS,EAAS,CACpC,MAAM,EACN,KAAKI,GAAU,EACf,KAAKC,GAAW,EAChB,KAAKC,GAAW,CAAC,EACjB,KAAKC,GAAa,CAAC,EACnB,KAAKC,GAAU,CAAC,EAChB,KAAK,WAAW,CAAO,CACzB,CACA,aAAc,CACR,KAAK,UAAU,OAAS,GAC1B,KAAKD,GAAW,QAAS,GAAa,CACpC,EAAS,UAAW,GAAW,CAC7B,KAAKE,GAAU,EAAU,CAAM,CACjC,CAAC,CACH,CAAC,CAEL,CACA,eAAgB,CACT,KAAK,UAAU,MAClB,KAAK,QAAQ,CAEjB,CACA,SAAU,CACR,KAAK,UAA4B,IAAI,IACrC,KAAKF,GAAW,QAAS,GAAa,CACpC,EAAS,QAAQ,CACnB,CAAC,CACH,CACA,WAAW,EAAS,EAAS,CAC3B,KAAKD,GAAW,EAChB,KAAKD,GAAW,EAWhB,EAAc,UAAY,CACxB,IAAM,EAAgB,KAAKE,GACrB,EAAqB,KAAKG,GAAuB,KAAKJ,EAAQ,EACpE,EAAmB,QAChB,GAAU,EAAM,SAAS,WAAW,EAAM,qBAAqB,CAClE,EACA,IAAM,EAAe,EAAmB,IAAK,GAAU,EAAM,QAAQ,EAC/D,EAAY,EAAa,IAC5B,GAAa,EAAS,iBAAiB,CAC1C,EACM,EAAkB,EAAc,SAAW,EAAa,OACxD,EAAiB,EAAa,MACjC,EAAU,IAAU,IAAa,EAAc,EAClD,EACM,EAAsB,GAAmB,EACzC,EAAkB,EAAsB,GAAO,EAAU,MAAM,EAAQ,IAAU,CACrF,IAAM,EAAO,KAAKE,GAAQ,GAC1B,MAAO,CAAC,GAAQ,CAAC,EAAoB,EAAQ,CAAI,CACnD,CAAC,EACG,CAAC,GAAuB,CAAC,IACzB,IACF,KAAKG,GAAmB,EACxB,KAAKJ,GAAa,GAEpB,KAAKC,GAAU,EACV,KAAK,aAAa,IACnB,IACF,EAAW,EAAe,CAAY,CAAC,CAAC,QAAS,GAAa,CAC5D,EAAS,QAAQ,CACnB,CAAC,EACD,EAAW,EAAc,CAAa,CAAC,CAAC,QAAS,GAAa,CAC5D,EAAS,UAAW,GAAW,CAC7B,KAAKC,GAAU,EAAU,CAAM,CACjC,CAAC,CACH,CAAC,GAEH,KAAKG,GAAQ,GACf,CAAC,CACH,CACA,kBAAmB,CACjB,OAAO,KAAKJ,EACd,CACA,YAAa,CACX,OAAO,KAAKD,GAAW,IAAK,GAAa,EAAS,gBAAgB,CAAC,CACrE,CACA,cAAe,CACb,OAAO,KAAKA,EACd,CACA,oBAAoB,EAAS,EAAS,CACpC,IAAM,EAAU,KAAKG,GAAuB,CAAO,EAC7C,EAAS,EAAQ,IACpB,GAAU,EAAM,SAAS,oBAAoB,EAAM,qBAAqB,CAC3E,EACM,EAAc,EAAQ,IACzB,GAAU,EAAM,sBAAsB,SACzC,EACA,MAAO,CACL,EACC,GACQ,KAAKG,GAAe,GAAK,EAAQ,EAAS,CAAW,MAGrD,KAAKC,GAAa,EAAQ,CAAO,CAE5C,CACF,CACA,GAAa,EAAQ,EAAS,CAC5B,OAAO,EAAQ,KAAK,EAAO,IAAU,CACnC,IAAM,EAAiB,EAAO,GAC9B,OAAQ,EAAM,sBAAsB,oBAI/B,EAJqD,EAAM,SAAS,YAAY,EAAiB,GAAiB,CACrH,EAAQ,QAAS,GAAM,CACrB,EAAE,SAAS,UAAU,CAAY,CACnC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CACA,GAAe,EAAO,EAAS,EAAa,CAC1C,GAAI,EAAS,CACX,IAAM,EAAa,KAAKC,GAClB,EAAqB,IAAgB,IAAK,IAAK,IAAe,IAAK,KAAM,EAAW,SAAW,EAAY,QAAU,EAAY,MAAM,EAAM,IAAM,IAAS,EAAW,EAAE,GAY/K,OAXI,CAAC,KAAKC,IAAmB,KAAKR,KAAY,KAAKS,IAAe,GAAsB,IAAY,KAAKC,MACvG,KAAKA,GAAe,EACpB,KAAKD,GAAc,KAAKT,GACpB,IAAgB,IAAK,KACvB,KAAKO,GAAmB,GAE1B,KAAKC,GAAkB,GACrB,KAAKA,GACL,EAAQ,CAAK,CACf,GAEK,KAAKA,EACd,CACA,OAAO,CACT,CACA,IAAqB,CACnB,OAAO,KAAKX,IAAU,UAAY,IAAK,IAAK,KAAKE,GAAW,MAAM,EAAU,IACnE,EAAS,QAAQ,UAAY,KAAKC,GAAQ,EAAM,EAAE,OAAS,IAAK,EACxE,CACH,CACA,GAAuB,EAAS,CAC9B,IAAM,EAAmC,IAAI,IAC7C,KAAKD,GAAW,QAAS,GAAa,CACpC,IAAM,EAAM,EAAS,QAAQ,UAC7B,GAAI,CAAC,EAAK,OACV,IAAM,EAAoB,EAAiB,IAAI,CAAG,EAC9C,EACF,EAAkB,KAAK,CAAQ,EAE/B,EAAiB,IAAI,EAAK,CAAC,CAAQ,CAAC,CAExC,CAAC,EACD,IAAM,EAAY,CAAC,EAUnB,OATA,EAAQ,QAAS,GAAY,CAC3B,IAAM,EAAmB,KAAKH,GAAQ,oBAAoB,CAAO,EAE3D,EADQ,EAAiB,IAAI,EAAiB,SAAS,CAAC,EAAE,MAAM,GAC5C,IAAI,EAAc,KAAKA,GAAS,CAAgB,EAC1E,EAAU,KAAK,CACb,sBAAuB,EACvB,UACF,CAAC,CACH,CAAC,EACM,CACT,CACA,GAAU,EAAU,EAAQ,CAC1B,IAAM,EAAQ,KAAKG,GAAW,QAAQ,CAAQ,EAC1C,IAAU,KACZ,KAAKC,GAAU,GAAU,KAAKA,GAAS,EAAO,CAAM,EACpD,KAAKI,GAAQ,EAEjB,CACA,IAAU,CACR,GAAI,KAAK,aAAa,EAAG,CACvB,IAAM,EAAa,KAAKE,GAAa,KAAKN,GAAS,KAAKG,EAAgB,EAClE,EAAoB,KAAKQ,GAAmB,EAC5C,EAAiB,KAAKH,GACtB,EAAY,EAAoB,EAAiB,KAAKH,GAAe,EAAY,KAAKR,IAAU,OAAO,GACzG,GAAqB,IAAmB,IAC1C,EAAc,UAAY,CACxB,KAAK,UAAU,QAAS,GAAa,CACnC,EAAS,KAAKG,EAAO,CACvB,CAAC,CACH,CAAC,CAEL,CACF,CACF,EC9LA,SAAS,EAAW,CAClB,UACA,GAAG,GACF,EAAa,CACd,IAAM,EAAS,EAAe,CAAW,EACnC,EAAc,EAAe,EAC7B,EAAqB,EAA2B,EAChD,EAAA,EAAyB,YACvB,EAAQ,IAAK,GAAS,CAC1B,IAAM,EAAmB,EAAO,oBAC9B,CACF,EAEA,MADA,GAAiB,mBAAqB,EAAc,cAAgB,aAC7D,CACT,CAAC,EACD,CAAC,EAAS,EAAQ,CAAW,CAC/B,EACA,EAAiB,QAAS,GAAiB,CACzC,EAAqB,CAAY,EACjC,IAAM,EAAQ,EAAO,cAAc,CAAC,CAAC,IAAI,EAAa,SAAS,EAC/D,GAAgC,EAAc,EAAoB,CAAK,CACzE,CAAC,EACD,EAA2B,CAAkB,EAC7C,GAAM,CAAC,GAAA,EAAkB,aACjB,IAAI,GACR,EACA,EACA,CACF,CACF,EACM,CAAC,EAAkB,EAAmB,GAAe,EAAS,oBAClE,EACA,EAAQ,OACV,EACM,EAAkB,CAAC,GAAe,EAAQ,aAAe,GAC/D,EAAM,qBAAA,EACE,YACH,GAAkB,EAAkB,EAAS,UAAU,EAAc,WAAW,CAAa,CAAC,EAAI,GACnG,CAAC,EAAU,CAAe,CAC5B,MACM,EAAS,iBAAiB,MAC1B,EAAS,iBAAiB,CAClC,EACA,EAAM,cAAgB,CACpB,EAAS,WACP,EACA,CACF,CACF,EAAG,CAAC,EAAkB,EAAS,CAAQ,CAAC,EAIxC,IAAM,EAH0B,EAAiB,MAC9C,EAAQ,IAAU,EAAc,EAAiB,GAAQ,CAAM,CAEnB,EAAI,EAAiB,SAAS,EAAQ,IAAU,CAC7F,IAAM,EAAO,EAAiB,GAK9B,OAJI,GAAQ,EAAc,EAAM,CAAM,EAE7B,GAAgB,EAAM,IADH,EAAc,EAAQ,CACP,EAAG,CAAkB,EAEzD,CAAC,CACV,CAAC,EAAI,CAAC,EACN,GAAI,EAAiB,OAAS,EAC5B,MAAM,QAAQ,IAAI,CAAgB,EAEpC,IAAM,EAAoC,EAAiB,MACxD,EAAQ,IAAU,CACjB,IAAM,EAAQ,EAAiB,GAC/B,OAAO,GAAS,GAAY,CAC1B,SACA,qBACA,aAAc,EAAM,aACpB,MAAO,EAAO,cAAc,CAAC,CAAC,IAAI,EAAM,SAAS,EACjD,SAAU,EAAM,QAClB,CAAC,CACH,CACF,EACA,GAAI,GAAmC,MACrC,MAAM,EAAkC,MAE1C,OAAO,EAAkB,EAAY,CAAC,CACxC"}
@@ -1,5 +1,5 @@
1
- import{n as e}from"./createLucideIcon-CUopU_LC.js";import{S as t,s as n}from"./with-selector-NDLhu4dT.js";import{rt as r}from"./router-wFvtgo77.js";import{t as i}from"./useQueries-BCUhWYX4.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(`
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
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(`
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-9COoW6AO.js.map
5
+ //# sourceMappingURL=user-directory-Df5X8VOe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-directory-9COoW6AO.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-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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"}