@modern-admin/web 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/dist/config/runtime-config.d.ts +28 -2
  2. package/dist/config/vite.d.ts +14 -0
  3. package/dist/config/vite.js +22 -2
  4. package/dist/lib/index.js +10 -6
  5. package/dist/lib/runtime-config.d.ts +28 -2
  6. package/dist/standalone/assets/action-component-host-Cch_SQOc.js +1 -0
  7. package/dist/standalone/assets/action-component-host-Cch_SQOc.js.br +0 -0
  8. package/dist/standalone/assets/action-component-host-Cch_SQOc.js.gz +0 -0
  9. package/dist/standalone/assets/{action-page-CET1s1MA.js → action-page-Cs9GeU9A.js} +1 -2
  10. package/dist/standalone/assets/action-page-Cs9GeU9A.js.br +0 -0
  11. package/dist/standalone/assets/action-page-Cs9GeU9A.js.gz +0 -0
  12. package/dist/standalone/assets/ai-assistant-widget-DC9Li4zI.js +1 -0
  13. package/dist/standalone/assets/ai-assistant-widget-DC9Li4zI.js.br +0 -0
  14. package/dist/standalone/assets/ai-assistant-widget-DC9Li4zI.js.gz +0 -0
  15. package/dist/standalone/assets/arrow-left-yVCaEJJu.js +1 -0
  16. package/dist/standalone/assets/audit-log-page-Bq4ywsHY.js +1 -0
  17. package/dist/standalone/assets/audit-log-page-Bq4ywsHY.js.br +0 -0
  18. package/dist/standalone/assets/audit-log-page-Bq4ywsHY.js.gz +0 -0
  19. package/dist/standalone/assets/{badge-8oeWEs3P.js → badge-CdW_Z0lB.js} +1 -2
  20. package/dist/standalone/assets/{bot-DFDgGfNj.js → bot-CuDPD_ZU.js} +1 -2
  21. package/dist/standalone/assets/cache-page-D6YyRm0a.js +1 -0
  22. package/dist/standalone/assets/cache-page-D6YyRm0a.js.br +0 -0
  23. package/dist/standalone/assets/cache-page-D6YyRm0a.js.gz +0 -0
  24. package/dist/standalone/assets/calendar-Dt13SKbK.js +1 -0
  25. package/dist/standalone/assets/calendar-Dt13SKbK.js.br +0 -0
  26. package/dist/standalone/assets/calendar-Dt13SKbK.js.gz +0 -0
  27. package/dist/standalone/assets/card-BYbadRar.js +1 -0
  28. package/dist/standalone/assets/card-BYbadRar.js.br +0 -0
  29. package/dist/standalone/assets/card-BYbadRar.js.gz +0 -0
  30. package/dist/standalone/assets/chart-widget-BCr0m4cg.js +1 -0
  31. package/dist/standalone/assets/chart-widget-BCr0m4cg.js.br +0 -0
  32. package/dist/standalone/assets/chart-widget-BCr0m4cg.js.gz +0 -0
  33. package/dist/standalone/assets/chevrons-up-down-y29_Sm-3.js +1 -0
  34. package/dist/standalone/assets/circle-alert-D1sKnXtO.js +1 -0
  35. package/dist/standalone/assets/{clock-OCmX6DtA.js → clock-B9qbSr_k.js} +1 -2
  36. package/dist/standalone/assets/command-D25Gk8Ov.js +1 -0
  37. package/dist/standalone/assets/command-D25Gk8Ov.js.br +0 -0
  38. package/dist/standalone/assets/command-D25Gk8Ov.js.gz +0 -0
  39. package/dist/standalone/assets/copy-5fb4qj-_.js +1 -0
  40. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js +1 -0
  41. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.br +0 -0
  42. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.gz +0 -0
  43. package/dist/standalone/assets/date-picker-dWT-FYDM.js +1 -0
  44. package/dist/standalone/assets/date-picker-dWT-FYDM.js.br +0 -0
  45. package/dist/standalone/assets/date-picker-dWT-FYDM.js.gz +0 -0
  46. package/dist/standalone/assets/dist-B4BiJqz7.js +1 -0
  47. package/dist/standalone/assets/dist-B4BiJqz7.js.br +0 -0
  48. package/dist/standalone/assets/dist-B4BiJqz7.js.gz +0 -0
  49. package/dist/standalone/assets/dist-CiXwD0ML.js +1 -0
  50. package/dist/standalone/assets/dist-CiXwD0ML.js.br +0 -0
  51. package/dist/standalone/assets/dist-CiXwD0ML.js.gz +0 -0
  52. package/dist/standalone/assets/dist-DPxQeZn3.js +1 -0
  53. package/dist/standalone/assets/dist-DPxQeZn3.js.br +0 -0
  54. package/dist/standalone/assets/dist-DPxQeZn3.js.gz +0 -0
  55. package/dist/standalone/assets/edit-page-7gYT2IT5.js +1 -0
  56. package/dist/standalone/assets/edit-page-7gYT2IT5.js.br +0 -0
  57. package/dist/standalone/assets/edit-page-7gYT2IT5.js.gz +0 -0
  58. package/dist/standalone/assets/ellipsis-BRmOlhsy.js +1 -0
  59. package/dist/standalone/assets/empty-BUKxdeYB.js +1 -0
  60. package/dist/standalone/assets/empty-BUKxdeYB.js.br +0 -0
  61. package/dist/standalone/assets/empty-BUKxdeYB.js.gz +0 -0
  62. package/dist/standalone/assets/{file-text-CcLZq8HA.js → file-text-MQF--yeB.js} +1 -2
  63. package/dist/standalone/assets/floating-layer-BcTp2AMB.js +1 -0
  64. package/dist/standalone/assets/floating-layer-BcTp2AMB.js.br +0 -0
  65. package/dist/standalone/assets/floating-layer-BcTp2AMB.js.gz +0 -0
  66. package/dist/standalone/assets/global-search-dialog--byVFtbc.js +1 -0
  67. package/dist/standalone/assets/global-search-dialog--byVFtbc.js.br +0 -0
  68. package/dist/standalone/assets/global-search-dialog--byVFtbc.js.gz +0 -0
  69. package/dist/standalone/assets/heavy-fields-BMTsLOom.js +173 -0
  70. package/dist/standalone/assets/heavy-fields-BMTsLOom.js.br +0 -0
  71. package/dist/standalone/assets/heavy-fields-BMTsLOom.js.gz +0 -0
  72. package/dist/standalone/assets/home-page-DKd5Im5n.js +60 -0
  73. package/dist/standalone/assets/home-page-DKd5Im5n.js.br +0 -0
  74. package/dist/standalone/assets/home-page-DKd5Im5n.js.gz +0 -0
  75. package/dist/standalone/assets/{hooks-DHDUQgzs.js → hooks-DOvU3a-p.js} +20 -21
  76. package/dist/standalone/assets/hooks-DOvU3a-p.js.br +0 -0
  77. package/dist/standalone/assets/hooks-DOvU3a-p.js.gz +0 -0
  78. package/dist/standalone/assets/icon-registry-CNZsLqJm.js +1 -0
  79. package/dist/standalone/assets/icon-registry-CNZsLqJm.js.br +0 -0
  80. package/dist/standalone/assets/icon-registry-CNZsLqJm.js.gz +0 -0
  81. package/dist/standalone/assets/index-Cz5ntgJ_.css +2 -0
  82. package/dist/standalone/assets/index-Cz5ntgJ_.css.br +0 -0
  83. package/dist/standalone/assets/index-Cz5ntgJ_.css.gz +0 -0
  84. package/dist/standalone/assets/index-D_weBQAa.js +14 -0
  85. package/dist/standalone/assets/index-D_weBQAa.js.br +0 -0
  86. package/dist/standalone/assets/index-D_weBQAa.js.gz +0 -0
  87. package/dist/standalone/assets/{info-CGVdWTj1.js → info-ChwYoM77.js} +1 -2
  88. package/dist/standalone/assets/json-editor--WP9_q0O.js +1 -0
  89. package/dist/standalone/assets/json-editor--WP9_q0O.js.br +0 -0
  90. package/dist/standalone/assets/json-editor--WP9_q0O.js.gz +0 -0
  91. package/dist/standalone/assets/key-BzJFbNbz.js +1 -0
  92. package/dist/standalone/assets/{key-round-CQLp1Ua9.js → key-round-oSqmVdkQ.js} +1 -2
  93. package/dist/standalone/assets/{minimize-2-Bx2cH_WS.js → minimize-2-iWv98HjE.js} +1 -2
  94. package/dist/standalone/assets/{palette-DVP_4RAn.js → palette-jgTV28yN.js} +1 -2
  95. package/dist/standalone/assets/{pencil-BO-k3yTG.js → pencil-kFOObGrY.js} +1 -2
  96. package/dist/standalone/assets/{pipette-CqHYfQnn.js → pipette-roLBCmPv.js} +1 -2
  97. package/dist/standalone/assets/pipette-roLBCmPv.js.br +0 -0
  98. package/dist/standalone/assets/pipette-roLBCmPv.js.gz +0 -0
  99. package/dist/standalone/assets/plus-D7PHzena.js +1 -0
  100. package/dist/standalone/assets/property-renderer-CqISwCnB.js +3 -0
  101. package/dist/standalone/assets/property-renderer-CqISwCnB.js.br +0 -0
  102. package/dist/standalone/assets/property-renderer-CqISwCnB.js.gz +0 -0
  103. package/dist/standalone/assets/reference-tHFrlwlu.js +1 -0
  104. package/dist/standalone/assets/reference-tHFrlwlu.js.br +0 -0
  105. package/dist/standalone/assets/reference-tHFrlwlu.js.gz +0 -0
  106. package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js +1 -0
  107. package/dist/standalone/assets/revisions-button-DUOp7SdS.js +1 -0
  108. package/dist/standalone/assets/revisions-button-DUOp7SdS.js.br +0 -0
  109. package/dist/standalone/assets/revisions-button-DUOp7SdS.js.gz +0 -0
  110. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js +67 -0
  111. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.br +0 -0
  112. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.gz +0 -0
  113. package/dist/standalone/assets/{rotate-ccw-BLr0QLAg.js → rotate-ccw-AB1VcvbK.js} +1 -2
  114. package/dist/standalone/assets/{save-Cd3oR3Sj.js → save-BkkrgP5Q.js} +1 -2
  115. package/dist/standalone/assets/schemas-ByMQmMCS.js +64 -0
  116. package/dist/standalone/assets/schemas-ByMQmMCS.js.br +0 -0
  117. package/dist/standalone/assets/schemas-ByMQmMCS.js.gz +0 -0
  118. package/dist/standalone/assets/select-CNvBRk3J.js +1 -0
  119. package/dist/standalone/assets/select-CNvBRk3J.js.br +0 -0
  120. package/dist/standalone/assets/select-CNvBRk3J.js.gz +0 -0
  121. package/dist/standalone/assets/{send-D4KHQGYj.js → send-Bzb_4uMT.js} +1 -2
  122. package/dist/standalone/assets/settings-page-SE19h-6J.js +1 -0
  123. package/dist/standalone/assets/settings-page-SE19h-6J.js.br +0 -0
  124. package/dist/standalone/assets/settings-page-SE19h-6J.js.gz +0 -0
  125. package/dist/standalone/assets/show-page-Bl5uqPGq.js +1 -0
  126. package/dist/standalone/assets/show-page-Bl5uqPGq.js.br +0 -0
  127. package/dist/standalone/assets/show-page-Bl5uqPGq.js.gz +0 -0
  128. package/dist/standalone/assets/{sparkles-CqF0zjrF.js → sparkles-1tT0H4n4.js} +1 -2
  129. package/dist/standalone/assets/{square-pen-DGT7ekeJ.js → square-pen-ZvVEwkzw.js} +1 -2
  130. package/dist/standalone/assets/table-RI-lM4fw.js +1 -0
  131. package/dist/standalone/assets/table-RI-lM4fw.js.br +0 -0
  132. package/dist/standalone/assets/table-RI-lM4fw.js.gz +0 -0
  133. package/dist/standalone/assets/tabs-bJ8DvO_f.js +1 -0
  134. package/dist/standalone/assets/tabs-bJ8DvO_f.js.br +0 -0
  135. package/dist/standalone/assets/tabs-bJ8DvO_f.js.gz +0 -0
  136. package/dist/standalone/assets/textarea-C2w7TG3h.js +1 -0
  137. package/dist/standalone/assets/{trash-2-DhyKQCKv.js → trash-2-BIJVpWxv.js} +1 -2
  138. package/dist/standalone/assets/{triangle-alert-CyaaNWN8.js → triangle-alert-yljVpQCM.js} +1 -2
  139. package/dist/standalone/assets/{undo-2-DlSB-5DM.js → undo-2-CnH3ScKE.js} +1 -2
  140. package/dist/standalone/assets/undo-2-CnH3ScKE.js.br +0 -0
  141. package/dist/standalone/assets/undo-2-CnH3ScKE.js.gz +0 -0
  142. package/dist/standalone/assets/{upload-BVhXhZgn.js → upload-DrfB-4bU.js} +1 -2
  143. package/dist/standalone/assets/upload-DrfB-4bU.js.br +0 -0
  144. package/dist/standalone/assets/upload-DrfB-4bU.js.gz +0 -0
  145. package/dist/standalone/assets/{use-dashboard-charts-aymvhXUB.js → use-dashboard-charts-D7-ctwCE.js} +1 -2
  146. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.br +0 -0
  147. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.gz +0 -0
  148. package/dist/standalone/assets/useQueries-ClcMJqXb.js +1 -0
  149. package/dist/standalone/assets/useQueries-ClcMJqXb.js.br +0 -0
  150. package/dist/standalone/assets/useQueries-ClcMJqXb.js.gz +0 -0
  151. package/dist/standalone/assets/{user-directory-C33bGZdb.js → user-directory-DxioDri9.js} +3 -4
  152. package/dist/standalone/assets/user-directory-DxioDri9.js.br +0 -0
  153. package/dist/standalone/assets/user-directory-DxioDri9.js.gz +0 -0
  154. package/dist/standalone/assets/uuid-DLSnbsz2.js +1 -2
  155. package/dist/standalone/assets/{wand-sparkles-DWaFQeYS.js → wand-sparkles-DwseTI5T.js} +1 -2
  156. package/dist/standalone/assets/wizard-create-page-u_8xKlPY.js +1 -0
  157. package/dist/standalone/assets/wizard-create-page-u_8xKlPY.js.br +0 -0
  158. package/dist/standalone/assets/wizard-create-page-u_8xKlPY.js.gz +0 -0
  159. package/dist/standalone/assets/x-c-gfVPJa.js +1 -0
  160. package/dist/standalone/assets/zap-BxPAEPtJ.js +1 -0
  161. package/dist/standalone/assets/zod-B9XvCD94.js +1 -0
  162. package/dist/standalone/assets/zod-B9XvCD94.js.br +0 -0
  163. package/dist/standalone/assets/zod-B9XvCD94.js.gz +0 -0
  164. package/dist/standalone/index.html +12 -12
  165. package/dist/standalone/index.html.br +0 -0
  166. package/dist/standalone/index.html.gz +0 -0
  167. package/package.json +22 -21
  168. package/src/app.tsx +3 -0
  169. package/src/runtime-config.ts +28 -2
  170. package/src/vite.ts +37 -1
  171. package/dist/lib/app.d.ts.map +0 -1
  172. package/dist/lib/index.d.ts.map +0 -1
  173. package/dist/lib/index.js.map +0 -1
  174. package/dist/lib/mount.d.ts.map +0 -1
  175. package/dist/lib/runtime-config.d.ts.map +0 -1
  176. package/dist/standalone/assets/action-component-host-QVowRL_F.js +0 -2
  177. package/dist/standalone/assets/action-component-host-QVowRL_F.js.br +0 -0
  178. package/dist/standalone/assets/action-component-host-QVowRL_F.js.gz +0 -0
  179. package/dist/standalone/assets/action-component-host-QVowRL_F.js.map +0 -1
  180. package/dist/standalone/assets/action-page-CET1s1MA.js.br +0 -0
  181. package/dist/standalone/assets/action-page-CET1s1MA.js.gz +0 -0
  182. package/dist/standalone/assets/action-page-CET1s1MA.js.map +0 -1
  183. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js +0 -2
  184. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.br +0 -0
  185. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.gz +0 -0
  186. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.map +0 -1
  187. package/dist/standalone/assets/arrow-left-CI9hUPwJ.js +0 -2
  188. package/dist/standalone/assets/arrow-left-CI9hUPwJ.js.map +0 -1
  189. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js +0 -2
  190. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.br +0 -0
  191. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.gz +0 -0
  192. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.map +0 -1
  193. package/dist/standalone/assets/badge-8oeWEs3P.js.map +0 -1
  194. package/dist/standalone/assets/bot-DFDgGfNj.js.map +0 -1
  195. package/dist/standalone/assets/cache-page-CoKusfv-.js +0 -2
  196. package/dist/standalone/assets/cache-page-CoKusfv-.js.br +0 -0
  197. package/dist/standalone/assets/cache-page-CoKusfv-.js.gz +0 -0
  198. package/dist/standalone/assets/cache-page-CoKusfv-.js.map +0 -1
  199. package/dist/standalone/assets/calendar-DDv0Qalf.js +0 -2
  200. package/dist/standalone/assets/calendar-DDv0Qalf.js.br +0 -0
  201. package/dist/standalone/assets/calendar-DDv0Qalf.js.gz +0 -0
  202. package/dist/standalone/assets/calendar-DDv0Qalf.js.map +0 -1
  203. package/dist/standalone/assets/card-MNH_XK0V.js +0 -2
  204. package/dist/standalone/assets/card-MNH_XK0V.js.br +0 -0
  205. package/dist/standalone/assets/card-MNH_XK0V.js.gz +0 -0
  206. package/dist/standalone/assets/card-MNH_XK0V.js.map +0 -1
  207. package/dist/standalone/assets/chart-widget-R2NG5T1y.js +0 -2
  208. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.br +0 -0
  209. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.gz +0 -0
  210. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.map +0 -1
  211. package/dist/standalone/assets/chevrons-up-down-BHCs46XQ.js +0 -2
  212. package/dist/standalone/assets/chevrons-up-down-BHCs46XQ.js.map +0 -1
  213. package/dist/standalone/assets/circle-alert-0EyKeic4.js +0 -2
  214. package/dist/standalone/assets/circle-alert-0EyKeic4.js.map +0 -1
  215. package/dist/standalone/assets/clock-OCmX6DtA.js.map +0 -1
  216. package/dist/standalone/assets/command-Cw-hTtpk.js +0 -2
  217. package/dist/standalone/assets/command-Cw-hTtpk.js.br +0 -0
  218. package/dist/standalone/assets/command-Cw-hTtpk.js.gz +0 -0
  219. package/dist/standalone/assets/command-Cw-hTtpk.js.map +0 -1
  220. package/dist/standalone/assets/copy-BexCWf4U.js +0 -2
  221. package/dist/standalone/assets/copy-BexCWf4U.js.map +0 -1
  222. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js +0 -2
  223. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.br +0 -0
  224. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.gz +0 -0
  225. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.map +0 -1
  226. package/dist/standalone/assets/date-picker-DQ4XOgO6.js +0 -2
  227. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.br +0 -0
  228. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.gz +0 -0
  229. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.map +0 -1
  230. package/dist/standalone/assets/dist-CmyV2PEd.js +0 -2
  231. package/dist/standalone/assets/dist-CmyV2PEd.js.br +0 -0
  232. package/dist/standalone/assets/dist-CmyV2PEd.js.gz +0 -0
  233. package/dist/standalone/assets/dist-CmyV2PEd.js.map +0 -1
  234. package/dist/standalone/assets/dist-DI9XNddW.js +0 -2
  235. package/dist/standalone/assets/dist-DI9XNddW.js.br +0 -0
  236. package/dist/standalone/assets/dist-DI9XNddW.js.gz +0 -0
  237. package/dist/standalone/assets/dist-DI9XNddW.js.map +0 -1
  238. package/dist/standalone/assets/dist-jC1pK2zN.js +0 -2
  239. package/dist/standalone/assets/dist-jC1pK2zN.js.br +0 -0
  240. package/dist/standalone/assets/dist-jC1pK2zN.js.gz +0 -0
  241. package/dist/standalone/assets/dist-jC1pK2zN.js.map +0 -1
  242. package/dist/standalone/assets/edit-page-CVjik6T5.js +0 -2
  243. package/dist/standalone/assets/edit-page-CVjik6T5.js.br +0 -0
  244. package/dist/standalone/assets/edit-page-CVjik6T5.js.gz +0 -0
  245. package/dist/standalone/assets/edit-page-CVjik6T5.js.map +0 -1
  246. package/dist/standalone/assets/ellipsis-lEjcTxo0.js +0 -2
  247. package/dist/standalone/assets/ellipsis-lEjcTxo0.js.map +0 -1
  248. package/dist/standalone/assets/empty-DcETRWsu.js +0 -2
  249. package/dist/standalone/assets/empty-DcETRWsu.js.br +0 -0
  250. package/dist/standalone/assets/empty-DcETRWsu.js.gz +0 -0
  251. package/dist/standalone/assets/empty-DcETRWsu.js.map +0 -1
  252. package/dist/standalone/assets/file-text-CcLZq8HA.js.map +0 -1
  253. package/dist/standalone/assets/floating-layer-DJGCYMex.js +0 -2
  254. package/dist/standalone/assets/floating-layer-DJGCYMex.js.br +0 -0
  255. package/dist/standalone/assets/floating-layer-DJGCYMex.js.gz +0 -0
  256. package/dist/standalone/assets/floating-layer-DJGCYMex.js.map +0 -1
  257. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js +0 -2
  258. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.br +0 -0
  259. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.gz +0 -0
  260. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.map +0 -1
  261. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js +0 -181
  262. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.br +0 -0
  263. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.gz +0 -0
  264. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.map +0 -1
  265. package/dist/standalone/assets/home-page-B3WVGerG.js +0 -3
  266. package/dist/standalone/assets/home-page-B3WVGerG.js.br +0 -0
  267. package/dist/standalone/assets/home-page-B3WVGerG.js.gz +0 -0
  268. package/dist/standalone/assets/home-page-B3WVGerG.js.map +0 -1
  269. package/dist/standalone/assets/hooks-DHDUQgzs.js.br +0 -0
  270. package/dist/standalone/assets/hooks-DHDUQgzs.js.gz +0 -0
  271. package/dist/standalone/assets/hooks-DHDUQgzs.js.map +0 -1
  272. package/dist/standalone/assets/icon-registry-O7MDzgTi.js +0 -2
  273. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.br +0 -0
  274. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.gz +0 -0
  275. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.map +0 -1
  276. package/dist/standalone/assets/index-BvESJd1R.js +0 -15
  277. package/dist/standalone/assets/index-BvESJd1R.js.br +0 -0
  278. package/dist/standalone/assets/index-BvESJd1R.js.gz +0 -0
  279. package/dist/standalone/assets/index-BvESJd1R.js.map +0 -1
  280. package/dist/standalone/assets/index-DSYyF4Ah.css +0 -2
  281. package/dist/standalone/assets/index-DSYyF4Ah.css.br +0 -0
  282. package/dist/standalone/assets/index-DSYyF4Ah.css.gz +0 -0
  283. package/dist/standalone/assets/info-CGVdWTj1.js.map +0 -1
  284. package/dist/standalone/assets/json-editor-DJ-yNmlx.js +0 -2
  285. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.br +0 -0
  286. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.gz +0 -0
  287. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.map +0 -1
  288. package/dist/standalone/assets/key-lbuX0yk_.js +0 -2
  289. package/dist/standalone/assets/key-lbuX0yk_.js.map +0 -1
  290. package/dist/standalone/assets/key-round-CQLp1Ua9.js.map +0 -1
  291. package/dist/standalone/assets/minimize-2-Bx2cH_WS.js.map +0 -1
  292. package/dist/standalone/assets/palette-DVP_4RAn.js.map +0 -1
  293. package/dist/standalone/assets/pencil-BO-k3yTG.js.map +0 -1
  294. package/dist/standalone/assets/pipette-CqHYfQnn.js.br +0 -0
  295. package/dist/standalone/assets/pipette-CqHYfQnn.js.gz +0 -0
  296. package/dist/standalone/assets/pipette-CqHYfQnn.js.map +0 -1
  297. package/dist/standalone/assets/plus-Dk-FzitW.js +0 -2
  298. package/dist/standalone/assets/plus-Dk-FzitW.js.map +0 -1
  299. package/dist/standalone/assets/property-renderer-DeykD9hp.js +0 -7
  300. package/dist/standalone/assets/property-renderer-DeykD9hp.js.br +0 -0
  301. package/dist/standalone/assets/property-renderer-DeykD9hp.js.gz +0 -0
  302. package/dist/standalone/assets/property-renderer-DeykD9hp.js.map +0 -1
  303. package/dist/standalone/assets/reference-BDP1QYCg.js +0 -2
  304. package/dist/standalone/assets/reference-BDP1QYCg.js.br +0 -0
  305. package/dist/standalone/assets/reference-BDP1QYCg.js.gz +0 -0
  306. package/dist/standalone/assets/reference-BDP1QYCg.js.map +0 -1
  307. package/dist/standalone/assets/refresh-cw-DHvUQTMb.js +0 -2
  308. package/dist/standalone/assets/refresh-cw-DHvUQTMb.js.map +0 -1
  309. package/dist/standalone/assets/revisions-button-CI74_D14.js +0 -2
  310. package/dist/standalone/assets/revisions-button-CI74_D14.js.br +0 -0
  311. package/dist/standalone/assets/revisions-button-CI74_D14.js.gz +0 -0
  312. package/dist/standalone/assets/revisions-button-CI74_D14.js.map +0 -1
  313. package/dist/standalone/assets/richtext-render-BHGG3eKV.js +0 -67
  314. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.br +0 -0
  315. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.gz +0 -0
  316. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.map +0 -1
  317. package/dist/standalone/assets/rotate-ccw-BLr0QLAg.js.map +0 -1
  318. package/dist/standalone/assets/save-Cd3oR3Sj.js.map +0 -1
  319. package/dist/standalone/assets/schemas-twnCb1uT.js +0 -65
  320. package/dist/standalone/assets/schemas-twnCb1uT.js.br +0 -0
  321. package/dist/standalone/assets/schemas-twnCb1uT.js.gz +0 -0
  322. package/dist/standalone/assets/schemas-twnCb1uT.js.map +0 -1
  323. package/dist/standalone/assets/select-BR1RMqsn.js +0 -2
  324. package/dist/standalone/assets/select-BR1RMqsn.js.br +0 -0
  325. package/dist/standalone/assets/select-BR1RMqsn.js.gz +0 -0
  326. package/dist/standalone/assets/select-BR1RMqsn.js.map +0 -1
  327. package/dist/standalone/assets/send-D4KHQGYj.js.map +0 -1
  328. package/dist/standalone/assets/settings-page-CdIWVeh0.js +0 -2
  329. package/dist/standalone/assets/settings-page-CdIWVeh0.js.br +0 -0
  330. package/dist/standalone/assets/settings-page-CdIWVeh0.js.gz +0 -0
  331. package/dist/standalone/assets/settings-page-CdIWVeh0.js.map +0 -1
  332. package/dist/standalone/assets/show-page-Dgw-9Pmn.js +0 -2
  333. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.br +0 -0
  334. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.gz +0 -0
  335. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.map +0 -1
  336. package/dist/standalone/assets/sparkles-CqF0zjrF.js.map +0 -1
  337. package/dist/standalone/assets/square-pen-DGT7ekeJ.js.map +0 -1
  338. package/dist/standalone/assets/table-DzBSPeVH.js +0 -2
  339. package/dist/standalone/assets/table-DzBSPeVH.js.br +0 -0
  340. package/dist/standalone/assets/table-DzBSPeVH.js.gz +0 -0
  341. package/dist/standalone/assets/table-DzBSPeVH.js.map +0 -1
  342. package/dist/standalone/assets/tabs-Dr7UA219.js +0 -2
  343. package/dist/standalone/assets/tabs-Dr7UA219.js.br +0 -0
  344. package/dist/standalone/assets/tabs-Dr7UA219.js.gz +0 -0
  345. package/dist/standalone/assets/tabs-Dr7UA219.js.map +0 -1
  346. package/dist/standalone/assets/textarea-T25SXcrC.js +0 -2
  347. package/dist/standalone/assets/textarea-T25SXcrC.js.map +0 -1
  348. package/dist/standalone/assets/trash-2-DhyKQCKv.js.map +0 -1
  349. package/dist/standalone/assets/triangle-alert-CyaaNWN8.js.map +0 -1
  350. package/dist/standalone/assets/undo-2-DlSB-5DM.js.br +0 -0
  351. package/dist/standalone/assets/undo-2-DlSB-5DM.js.gz +0 -0
  352. package/dist/standalone/assets/undo-2-DlSB-5DM.js.map +0 -1
  353. package/dist/standalone/assets/upload-BVhXhZgn.js.br +0 -0
  354. package/dist/standalone/assets/upload-BVhXhZgn.js.gz +0 -0
  355. package/dist/standalone/assets/upload-BVhXhZgn.js.map +0 -1
  356. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.br +0 -0
  357. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.gz +0 -0
  358. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.map +0 -1
  359. package/dist/standalone/assets/useQueries-Dch5Ggjr.js +0 -2
  360. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.br +0 -0
  361. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.gz +0 -0
  362. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.map +0 -1
  363. package/dist/standalone/assets/user-directory-C33bGZdb.js.br +0 -0
  364. package/dist/standalone/assets/user-directory-C33bGZdb.js.gz +0 -0
  365. package/dist/standalone/assets/user-directory-C33bGZdb.js.map +0 -1
  366. package/dist/standalone/assets/uuid-DLSnbsz2.js.map +0 -1
  367. package/dist/standalone/assets/value-format-CLzWct9Y.js +0 -60
  368. package/dist/standalone/assets/value-format-CLzWct9Y.js.br +0 -0
  369. package/dist/standalone/assets/value-format-CLzWct9Y.js.gz +0 -0
  370. package/dist/standalone/assets/value-format-CLzWct9Y.js.map +0 -1
  371. package/dist/standalone/assets/wand-sparkles-DWaFQeYS.js.map +0 -1
  372. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js +0 -2
  373. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.br +0 -0
  374. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.gz +0 -0
  375. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.map +0 -1
  376. package/dist/standalone/assets/x-C3kLunD6.js +0 -2
  377. package/dist/standalone/assets/x-C3kLunD6.js.map +0 -1
  378. package/dist/standalone/assets/zap-b3saQVKc.js +0 -2
  379. package/dist/standalone/assets/zap-b3saQVKc.js.map +0 -1
  380. package/dist/standalone/assets/zod-N7mHo7BX.js +0 -2
  381. package/dist/standalone/assets/zod-N7mHo7BX.js.br +0 -0
  382. package/dist/standalone/assets/zod-N7mHo7BX.js.gz +0 -0
  383. package/dist/standalone/assets/zod-N7mHo7BX.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-page-CdIWVeh0.js","names":[],"sources":["../../../../react/src/pages/settings-shared.tsx","../../../../react/src/pages/ai-assistant-settings-section.tsx","../../../../react/src/pages/settings-page.tsx"],"sourcesContent":["// Shared layout primitives for the Settings hub. Every section in\n// `settings-page.tsx` (API keys, webhooks, AI assistant, ...) should use\n// these so the look, spacing, and mobile behavior stays uniform.\n\nimport * as React from 'react'\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Empty,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n cn,\n} from '@modern-admin/ui'\n\ntype IconComponent = React.ComponentType<{ className?: string }>\n\ninterface SettingsCardProps {\n icon: IconComponent\n title: React.ReactNode\n description?: React.ReactNode\n action?: React.ReactNode\n /** Removes default padding/header so the card body can fill edge-to-edge. */\n bodyClassName?: string\n children: React.ReactNode\n}\n\n/**\n * Unified card wrapper for a settings section. Header collapses\n * vertically on mobile and lays the action button to the right on `sm+`.\n * `CardContent` gets `min-w-0` so tables/grids inside can shrink and\n * scroll horizontally instead of forcing the parent grid wider.\n */\nexport function SettingsCard({\n icon: Icon,\n title,\n description,\n action,\n bodyClassName,\n children,\n}: SettingsCardProps): React.ReactElement {\n return (\n <Card>\n <CardHeader\n className={cn(\n 'flex-col items-start gap-2',\n action && 'sm:flex-row sm:items-center sm:justify-between',\n )}\n >\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <CardTitle className=\"flex items-center gap-2\">\n <Icon className=\"size-5\" />\n {title}\n </CardTitle>\n {description ? <CardDescription>{description}</CardDescription> : null}\n </div>\n {action}\n </CardHeader>\n <CardContent className={cn('min-w-0', bodyClassName)}>{children}</CardContent>\n </Card>\n )\n}\n\n/**\n * Horizontal-scroll wrapper for tables inside `SettingsCard`. On mobile\n * the content extends to the card edges (`-mx-6`) so the user sees the\n * left edge of the table flush with the card; from `sm+` the negative\n * margin is removed.\n */\nexport function SettingsTableScroll({ children }: { children: React.ReactNode }): React.ReactElement {\n return <div className=\"-mx-6 overflow-x-auto sm:mx-0\">{children}</div>\n}\n\ninterface SettingsEmptyProps {\n icon: IconComponent\n title: React.ReactNode\n description?: React.ReactNode\n}\n\nexport function SettingsEmpty({ icon: Icon, title, description }: SettingsEmptyProps): React.ReactElement {\n return (\n <Empty className=\"border-0\">\n <EmptyHeader>\n <EmptyMedia>\n <Icon />\n </EmptyMedia>\n <EmptyTitle>{title}</EmptyTitle>\n {description ? <EmptyDescription>{description}</EmptyDescription> : null}\n </EmptyHeader>\n </Empty>\n )\n}\n\ninterface SettingsListStateProps {\n isLoading: boolean\n error: unknown\n isEmpty: boolean\n loadingLabel: React.ReactNode\n empty: SettingsEmptyProps\n children: React.ReactNode\n}\n\n/**\n * Renders one of: loading row, destructive error banner, empty state, or\n * the actual list `children`. Keeps every section's \"list with status\"\n * surface identical.\n */\nexport function SettingsListState({\n isLoading,\n error,\n isEmpty,\n loadingLabel,\n empty,\n children,\n}: SettingsListStateProps): React.ReactElement {\n if (isLoading) {\n return <div className=\"py-8 text-center text-sm text-muted-foreground\">{loadingLabel}</div>\n }\n if (error) {\n return (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n {error instanceof Error ? error.message : String(error)}\n </div>\n )\n }\n if (isEmpty) {\n return <SettingsEmpty {...empty} />\n }\n return <>{children}</>\n}\n","import * as React from 'react'\nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { Badge, Button, Input, Label, Switch, Textarea } from '@modern-admin/ui'\nimport { Bot, KeyRound, Save } from 'lucide-react'\nimport { useAdminClient } from '../provider.js'\nimport { useNotify } from '../notify.js'\nimport { useI18n } from '../i18n.js'\nimport type { AiAssistantSettings } from '../client.js'\nimport { SettingsCard } from './settings-shared.js'\n\nexport function AiAssistantSettingsSection(): React.ReactElement {\n const client = useAdminClient()\n const notify = useNotify()\n const { t } = useI18n()\n const settings = useQuery({\n queryKey: ['modern-admin', 'ai-assistant', 'settings'],\n queryFn: () => client.getAiAssistantSettings(),\n })\n const [form, setForm] = React.useState({\n enabled: true,\n model: 'google/gemini-3.1-flash-lite-preview',\n apiKey: '',\n systemPrompt: '',\n })\n\n React.useEffect(() => {\n if (!settings.data) return\n setForm({\n enabled: settings.data.enabled,\n model: settings.data.model,\n apiKey: '',\n systemPrompt: settings.data.systemPrompt,\n })\n }, [settings.data])\n\n const save = useMutation({\n mutationFn: async (): Promise<AiAssistantSettings> =>\n client.updateAiAssistantSettings({\n enabled: form.enabled,\n model: form.model,\n ...(form.apiKey.trim() ? { apiKey: form.apiKey.trim() } : {}),\n systemPrompt: form.systemPrompt,\n }),\n onSuccess: () => {\n settings.refetch()\n setForm((prev) => ({ ...prev, apiKey: '' }))\n notify.success({ message: t('aiAssistant:settings.saved') })\n },\n onError: (err) => {\n notify.error({ message: err instanceof Error ? err.message : String(err) })\n },\n })\n\n if (settings.isLoading) {\n return <div className=\"py-8 text-sm text-muted-foreground\">{t('common:loading')}</div>\n }\n\n if (settings.error) {\n return (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n {settings.error instanceof Error ? settings.error.message : String(settings.error)}\n </div>\n )\n }\n\n const data = settings.data\n if (!data) {\n return <div className=\"py-8 text-sm text-muted-foreground\">{t('aiAssistant:settings.empty')}</div>\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <SettingsCard\n icon={Bot}\n title={t('aiAssistant:settings.title')}\n description={t('aiAssistant:settings.description')}\n bodyClassName=\"space-y-4\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant={data.enabled ? 'secondary' : 'outline'}>\n {data.enabled ? t('aiAssistant:settings.enabled') : t('aiAssistant:settings.disabled')}\n </Badge>\n <Badge variant={data.configured ? 'secondary' : 'outline'}>\n {data.configured ? t('aiAssistant:settings.configured') : t('aiAssistant:settings.apiKeyRequired')}\n </Badge>\n <Badge variant=\"outline\">{t('aiAssistant:settings.readOnly')}</Badge>\n <Badge variant=\"outline\">{t('aiAssistant:settings.provider', { provider: data.provider })}</Badge>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center justify-between rounded-lg border border-border p-3\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"ai-assistant-enabled\">{t('aiAssistant:settings.enableLabel')}</Label>\n <p className=\"text-xs text-muted-foreground\">\n {t('aiAssistant:settings.enableHint')}\n </p>\n </div>\n <Switch\n id=\"ai-assistant-enabled\"\n checked={form.enabled}\n disabled={!data.canManage || save.isPending}\n onCheckedChange={(enabled) => setForm((prev) => ({ ...prev, enabled }))}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"ai-assistant-model\">{t('aiAssistant:settings.modelLabel')}</Label>\n <Input\n id=\"ai-assistant-model\"\n value={form.model}\n disabled={!data.canManage || save.isPending}\n onChange={(e) => setForm((prev) => ({ ...prev, model: e.target.value }))}\n placeholder=\"google/gemini-3.1-flash-lite-preview\"\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"ai-assistant-api-key\" className=\"flex items-center gap-2\">\n <KeyRound className=\"size-4\"/>\n {t('aiAssistant:settings.apiKeyLabel')}\n </Label>\n <Input\n id=\"ai-assistant-api-key\"\n type=\"password\"\n value={form.apiKey}\n disabled={!data.canManage || save.isPending}\n onChange={(e) => setForm((prev) => ({ ...prev, apiKey: e.target.value }))}\n placeholder={data.maskedApiKey ?? 'sk-or-v1-...'}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('aiAssistant:settings.apiKeyHint')}\n </p>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"ai-assistant-system-prompt\">{t('aiAssistant:settings.systemPromptLabel')}</Label>\n <Textarea\n id=\"ai-assistant-system-prompt\"\n value={form.systemPrompt}\n disabled={!data.canManage || save.isPending}\n onChange={(e) => setForm((prev) => ({ ...prev, systemPrompt: e.target.value }))}\n rows={8}\n placeholder={t('aiAssistant:settings.systemPromptPlaceholder')}\n />\n </div>\n\n <div className=\"flex items-center justify-between gap-3 rounded-lg border border-border p-3 text-sm\">\n <div>\n <div className=\"font-medium\">{t('aiAssistant:settings.accessTitle')}</div>\n <div className=\"text-muted-foreground\">\n {t('aiAssistant:settings.accessDescription')}\n </div>\n </div>\n <Badge variant=\"outline\">{t('aiAssistant:settings.futureToolsReady')}</Badge>\n </div>\n\n <div className=\"flex justify-end\">\n <Button onClick={() => save.mutate()} disabled={!data.canManage || save.isPending || !form.model.trim()}>\n <Save className=\"size-4\"/>\n {save.isPending ? t('aiAssistant:settings.saving') : t('aiAssistant:settings.save')}\n </Button>\n </div>\n </SettingsCard>\n </div>\n )\n}\n","// Admin Settings hub. Reachable from the user/profile dropdown menu and\n// rendered by the router for `/settings/<section>`. Currently three\n// sections: `api-keys`, `webhooks`, `ai-assistant`; the layout is built so\n// adding more sections is just a new entry in `SECTIONS` + a switch case.\n\nimport * as React from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n Badge,\n Button,\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n InfoTooltip,\n Input,\n JsonEditor,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n} from '@modern-admin/ui'\nimport {\n AlertTriangle,\n Bot,\n Check,\n Copy,\n Edit,\n Eye,\n EyeOff,\n KeyRound,\n Plus,\n Settings as SettingsIcon,\n Trash2,\n X,\n} from 'lucide-react'\nimport { useAdminClient } from '../provider.js'\nimport { useFeatures, useResources } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { Link, useNavigate } from '../router.js'\nimport { useNotify } from '../notify.js'\nimport { useDialogs } from '../dialogs.js'\nimport type { ApiKeyRecord, WebhookInput, WebhookRecord } from '../client.js'\nimport type { ResourceJSON } from '../types.js'\nimport { getSettingsSectionExtensions } from '../extension-registry.js'\nimport { AiAssistantSettingsSection } from './ai-assistant-settings-section.js'\nimport { SettingsCard, SettingsListState, SettingsTableScroll } from './settings-shared.js'\n\nconst KEY_LIST = ['modern-admin', 'api-keys'] as const\nconst KEY_WEBHOOKS = ['modern-admin', 'webhooks'] as const\n\ntype BuiltInSectionKey = 'api-keys' | 'ai-assistant' | 'webhooks'\n\ninterface SectionDef {\n key: string\n labelKey: string\n icon: React.ComponentType<{ className?: string }>\n /** When `true`, the section is supplied by an extension (no built-in renderer). */\n isExtension?: boolean\n}\n\nconst BUILT_IN_SECTIONS: SectionDef[] = [\n { key: 'api-keys', labelKey: 'settings:apiKeys.title', icon: KeyRound },\n { key: 'webhooks', labelKey: 'settings:webhooks.title', icon: SettingsIcon },\n { key: 'ai-assistant', labelKey: 'aiAssistant:title', icon: Bot },\n]\n\nexport function SettingsPage({ section }: { section?: string }): React.ReactElement {\n const { t } = useI18n()\n const navigate = useNavigate()\n const features = useFeatures()\n // Only surface built-in sections whose backend subsystem is wired.\n // Extension sections are always shown when registered.\n const SECTIONS = React.useMemo<SectionDef[]>(\n () => [\n ...BUILT_IN_SECTIONS.filter((s) =>\n s.key === 'api-keys' ? features.apiKeys\n : s.key === 'webhooks' ? features.webhooks\n : s.key === 'ai-assistant' ? features.aiAssistant\n : true,\n ),\n ...getSettingsSectionExtensions().map((ext) => ({\n key: ext.key,\n labelKey: ext.labelKey,\n icon: ext.icon,\n isExtension: true as const,\n })),\n ],\n\n [features.apiKeys, features.webhooks, features.aiAssistant],\n )\n // Resolve the requested section. If the URL is bogus or the section is\n // disabled, fall back to the first enabled section.\n const builtInKeys: BuiltInSectionKey[] = ['api-keys', 'webhooks', 'ai-assistant']\n const isBuiltIn = (k: string): k is BuiltInSectionKey =>\n (builtInKeys as string[]).includes(k)\n const requested: string | null = section ?? null\n const active: string | null =\n requested && SECTIONS.some((s) => s.key === requested)\n ? requested\n : (SECTIONS[0]?.key ?? null)\n if (active === null) {\n // Defensive: the user menu hides Settings entirely when no section is\n // available, so users normally won't land here. Direct navigation to\n // /settings without any configured section ends up showing this.\n return (\n <div className=\"rounded-md border border-dashed bg-card p-8 text-center text-sm text-muted-foreground\">\n {t('settings:noSectionsConfigured')}\n </div>\n )\n }\n return (\n // `minmax(0,1fr)` (not bare `1fr`) lets the content column shrink below\n // its intrinsic min-width — otherwise wide tables push the whole grid\n // past the viewport at ~`lg` widths (~1000–1100px).\n <div className=\"flex flex-col gap-4 lg:grid lg:grid-cols-[14rem_minmax(0,1fr)]\">\n {/* Mobile: dropdown selector (handles many sections gracefully) */}\n <div className=\"lg:hidden\">\n <Select value={active ?? ''} onValueChange={(v) => navigate({ name: 'settings', section: v })}>\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SECTIONS.map(({ key, labelKey, icon: Icon }) => (\n <SelectItem key={key} value={key}>\n <span className=\"flex items-center gap-2\">\n <Icon className=\"size-4\" />\n <span>{t(labelKey)}</span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n {/* Desktop: sidebar nav */}\n <aside className=\"hidden lg:block\">\n <nav className=\"flex flex-col gap-1\">\n {SECTIONS.map(({ key, labelKey, icon: Icon }) => (\n <Link\n key={key}\n to={{ name: 'settings', section: key }}\n className={cn(\n 'flex items-center gap-2 rounded-md px-3 py-2 text-sm hover:bg-accent',\n active === key && 'bg-accent font-medium',\n )}\n >\n <Icon className=\"size-4\" />\n <span>{t(labelKey)}</span>\n </Link>\n ))}\n </nav>\n </aside>\n <section className=\"min-w-0\">\n {active && isBuiltIn(active) && active === 'api-keys' && <ApiKeysSection />}\n {active && isBuiltIn(active) && active === 'webhooks' && <WebhooksSection />}\n {active && isBuiltIn(active) && active === 'ai-assistant' && <AiAssistantSettingsSection />}\n {active && !isBuiltIn(active) && (() => {\n const extSection = getSettingsSectionExtensions().find((e) => e.key === active)\n return extSection ? <extSection.component /> : null\n })()}\n </section>\n </div>\n )\n}\n\n// ─── API Keys section ─────────────────────────────────────────────────────────\n\nfunction ApiKeysSection(): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const qc = useQueryClient()\n const notify = useNotify()\n const dialogs = useDialogs()\n const resources = useResources()\n const [editorOpen, setEditorOpen] = React.useState(false)\n const [editing, setEditing] = React.useState<ApiKeyRecord | null>(null)\n const [createdSecret, setCreatedSecret] = React.useState<{ key: string; record: ApiKeyRecord } | null>(null)\n\n const list = useQuery({\n queryKey: KEY_LIST,\n queryFn: () => client.listApiKeys(),\n })\n\n const deleteMut = useMutation({\n mutationFn: (id: string) => client.deleteApiKey(id),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY_LIST })\n notify.success({ key: 'settings:apiKeys.notice.revoked' })\n },\n onError: (err) => notify.error({ message: err instanceof Error ? err.message : String(err) }),\n })\n\n const toggleEnabledMut = useMutation({\n mutationFn: (vars: { id: string; enabled: boolean }) =>\n client.updateApiKey(vars.id, { enabled: vars.enabled }),\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY_LIST }),\n onError: (err) => notify.error({ message: err instanceof Error ? err.message : String(err) }),\n })\n\n const onCreate = (): void => {\n setEditing(null)\n setEditorOpen(true)\n }\n\n const onEdit = (key: ApiKeyRecord): void => {\n setEditing(key)\n setEditorOpen(true)\n }\n\n const onRevoke = async (key: ApiKeyRecord): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('settings:apiKeys.confirmRevoke.title'),\n description: t('settings:apiKeys.confirmRevoke.description', { name: key.name ?? key.id }),\n confirmLabel: t('settings:apiKeys.actions.revoke'),\n destructive: true,\n })\n if (ok) deleteMut.mutate(key.id)\n }\n\n const keys = list.data?.keys ?? []\n\n return (\n <div className=\"flex flex-col gap-4\">\n <SettingsCard\n icon={KeyRound}\n title={t('settings:apiKeys.title')}\n description={t('settings:apiKeys.description')}\n action={\n <Button onClick={onCreate} size=\"sm\">\n <Plus className=\"size-4\" />\n <span>{t('settings:apiKeys.actions.create')}</span>\n </Button>\n }\n >\n <SettingsListState\n isLoading={list.isLoading}\n error={list.error}\n isEmpty={keys.length === 0}\n loadingLabel={t('common:loading')}\n empty={{\n icon: KeyRound,\n title: t('settings:apiKeys.empty.title'),\n description: t('settings:apiKeys.empty.description'),\n }}\n >\n <SettingsTableScroll>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('settings:apiKeys.columns.name')}</TableHead>\n <TableHead className=\"hidden sm:table-cell\">{t('settings:apiKeys.columns.start')}</TableHead>\n <TableHead className=\"hidden md:table-cell\">{t('settings:apiKeys.columns.permissions')}</TableHead>\n <TableHead className=\"hidden md:table-cell\">{t('settings:apiKeys.columns.expiresAt')}</TableHead>\n <TableHead>{t('settings:apiKeys.columns.enabled')}</TableHead>\n <TableHead className=\"text-right\">{t('settings:apiKeys.columns.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {keys.map((k) => (\n <TableRow key={k.id}>\n <TableCell className=\"font-medium\">\n <div className=\"flex flex-col\">\n <span>{k.name ?? k.id}</span>\n {k.lastRequest && (\n <span className=\"text-xs text-muted-foreground\">\n {t('settings:apiKeys.lastUsed', { date: formatDate(k.lastRequest) })}\n </span>\n )}\n </div>\n </TableCell>\n <TableCell className=\"hidden font-mono text-xs sm:table-cell\">\n {k.start ? `${k.start}…` : '—'}\n </TableCell>\n <TableCell className=\"hidden md:table-cell\">\n <PermissionsSummary permissions={k.permissions} />\n </TableCell>\n <TableCell className=\"hidden md:table-cell text-xs\">\n {k.expiresAt ? formatDate(k.expiresAt) : t('settings:apiKeys.expiresNever')}\n </TableCell>\n <TableCell>\n <Switch\n checked={k.enabled}\n onCheckedChange={(enabled) => toggleEnabledMut.mutate({ id: k.id, enabled })}\n aria-label={t('settings:apiKeys.columns.enabled')}\n />\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"inline-flex gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onEdit(k)} aria-label={t('settings:apiKeys.actions.edit')}>\n <Edit className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRevoke(k)}\n aria-label={t('settings:apiKeys.actions.revoke')}\n disabled={deleteMut.isPending}\n >\n <Trash2 className=\"size-4 text-destructive\" />\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </SettingsTableScroll>\n </SettingsListState>\n </SettingsCard>\n\n <ApiKeyEditorDialog\n key={editing?.id ?? 'new'}\n open={editorOpen}\n onOpenChange={setEditorOpen}\n editing={editing}\n resources={resources}\n onCreated={(result) => {\n setEditorOpen(false)\n setCreatedSecret(result)\n qc.invalidateQueries({ queryKey: KEY_LIST })\n }}\n onUpdated={() => {\n setEditorOpen(false)\n qc.invalidateQueries({ queryKey: KEY_LIST })\n }}\n />\n\n <CreatedSecretDialog\n secret={createdSecret}\n onClose={() => setCreatedSecret(null)}\n />\n </div>\n )\n}\n\n// ─── Permissions matrix editor ────────────────────────────────────────────────\n\ninterface PermissionsState {\n /** resourceId -> Set<actionName>. `'*'` means all actions of that resource. */\n byResource: Record<string, Set<string>>\n}\n\nconst buildState = (perms: Record<string, string[]>): PermissionsState => ({\n byResource: Object.fromEntries(\n Object.entries(perms).map(([k, v]) => [k, new Set(v)]),\n ),\n})\n\nconst stateToWire = (state: PermissionsState): Record<string, string[]> => {\n const out: Record<string, string[]> = {}\n for (const [k, set] of Object.entries(state.byResource)) {\n if (set.size === 0) continue\n out[k] = Array.from(set)\n }\n return out\n}\n\nfunction PermissionsMatrix({\n resources,\n state,\n onChange,\n}: {\n resources: ResourceJSON[]\n state: PermissionsState\n onChange: (next: PermissionsState) => void\n}): React.ReactElement {\n const { t } = useI18n()\n\n const toggle = (resourceId: string, action: string): void => {\n const set = new Set(state.byResource[resourceId] ?? [])\n if (set.has(action)) set.delete(action)\n else set.add(action)\n onChange({ byResource: { ...state.byResource, [resourceId]: set } })\n }\n\n const toggleAll = (resourceId: string, actions: string[]): void => {\n const current = state.byResource[resourceId] ?? new Set<string>()\n const allSelected = actions.every((a) => current.has(a))\n const next = new Set<string>(allSelected ? [] : actions)\n onChange({ byResource: { ...state.byResource, [resourceId]: next } })\n }\n\n const resourcesWithActions = React.useMemo(\n () => resources.filter((r) => (r.actions ?? []).length > 0),\n [resources],\n )\n\n const allGloballySelected =\n resourcesWithActions.length > 0 &&\n resourcesWithActions.every((r) => {\n const actions = (r.actions ?? []).map((a) => a.name)\n const current = state.byResource[r.id] ?? new Set<string>()\n return actions.every((a) => current.has(a))\n })\n\n const toggleAllResources = (): void => {\n const select = !allGloballySelected\n const next: Record<string, Set<string>> = { ...state.byResource }\n for (const r of resources) {\n const actions = (r.actions ?? []).map((a) => a.name)\n next[r.id] = select ? new Set(actions) : new Set<string>()\n }\n onChange({ byResource: next })\n }\n\n if (resources.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">{t('settings:apiKeys.permissions.noResources')}</p>\n )\n }\n\n return (\n <div className=\"rounded-md border border-border\">\n {resourcesWithActions.length > 0 && (\n <div className=\"flex flex-wrap items-center justify-end gap-2 border-b border-border bg-muted/30 px-3 py-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8\"\n onClick={toggleAllResources}\n >\n {allGloballySelected ? (\n <>\n <X className=\"mr-1.5 size-3.5\" />\n {t('settings:apiKeys.permissions.clearAllResources')}\n </>\n ) : (\n <>\n <Check className=\"mr-1.5 size-3.5\" />\n {t('settings:apiKeys.permissions.selectAllResources')}\n </>\n )}\n </Button>\n </div>\n )}\n <div className=\"max-h-[24rem] overflow-y-auto\">\n <Table>\n <TableHeader className=\"sticky top-0 bg-card\">\n <TableRow>\n <TableHead className=\"w-[14rem]\">{t('settings:apiKeys.permissions.resource')}</TableHead>\n <TableHead>{t('settings:apiKeys.permissions.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {resources.map((r) => {\n const actions = (r.actions ?? []).map((a) => a.name)\n const current = state.byResource[r.id] ?? new Set<string>()\n const allSelected = actions.length > 0 && actions.every((a) => current.has(a))\n return (\n <TableRow key={r.id}>\n <TableCell className=\"align-top\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"font-medium\">{r.name}</span>\n <span className=\"text-xs text-muted-foreground\">{r.id}</span>\n <button\n type=\"button\"\n className=\"mt-1 inline-flex items-center gap-1 self-start text-xs text-primary hover:underline\"\n onClick={() => toggleAll(r.id, actions)}\n >\n {allSelected ? <X className=\"size-3\" /> : <Check className=\"size-3\" />}\n {allSelected\n ? t('settings:apiKeys.permissions.clearAll')\n : t('settings:apiKeys.permissions.selectAll')}\n </button>\n </div>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-wrap gap-2\">\n {actions.map((a) => {\n const checked = current.has(a)\n return (\n <label\n key={a}\n className={cn(\n 'inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border px-2 py-1 text-xs',\n checked && 'border-primary bg-primary/10 text-primary',\n )}\n >\n <Checkbox\n checked={checked}\n onCheckedChange={() => toggle(r.id, a)}\n className=\"size-3.5\"\n />\n <span>{a}</span>\n </label>\n )\n })}\n </div>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n </div>\n )\n}\n\nfunction PermissionsSummary({ permissions }: { permissions: Record<string, string[]> }): React.ReactElement {\n const { t } = useI18n()\n const entries = Object.entries(permissions)\n if (entries.length === 0) {\n return <Badge variant=\"outline\">{t('settings:apiKeys.permissions.none')}</Badge>\n }\n const totalActions = entries.reduce((sum, [, a]) => sum + a.length, 0)\n return (\n <Badge variant=\"secondary\">\n {t('settings:apiKeys.permissions.summary', { resources: entries.length, actions: totalActions })}\n </Badge>\n )\n}\n\n// ─── Editor dialog ────────────────────────────────────────────────────────────\n\nfunction ApiKeyEditorDialog({\n open,\n onOpenChange,\n editing,\n resources,\n onCreated,\n onUpdated,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n editing: ApiKeyRecord | null\n resources: ResourceJSON[]\n onCreated: (result: { key: string; record: ApiKeyRecord }) => void\n onUpdated: (record: ApiKeyRecord) => void\n}): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const notify = useNotify()\n const isEdit = !!editing\n const [name, setName] = React.useState(editing?.name ?? '')\n const [expiresInDays, setExpiresInDays] = React.useState<string>(() => {\n if (!editing?.expiresAt) return ''\n const ms = new Date(editing.expiresAt).getTime() - Date.now()\n return ms > 0 ? String(Math.max(1, Math.round(ms / (24 * 60 * 60 * 1000)))) : ''\n })\n const [permissions, setPermissions] = React.useState<PermissionsState>(() =>\n buildState(editing?.permissions ?? {}),\n )\n\n const save = useMutation({\n mutationFn: async (): Promise<{ key?: string; record: ApiKeyRecord }> => {\n const wire = stateToWire(permissions)\n if (isEdit && editing) {\n const expiry = expiresInDays.trim() === '' ? null : Number(expiresInDays)\n const res = await client.updateApiKey(editing.id, {\n name: name.trim(),\n permissions: wire,\n expiresInDays: expiry === null ? null : Number.isFinite(expiry) && expiry > 0 ? expiry : undefined,\n })\n return { record: res.record }\n }\n const expiry = expiresInDays.trim() === '' ? null : Number(expiresInDays)\n return client.createApiKey({\n name: name.trim(),\n permissions: wire,\n expiresInDays: expiry === null ? null : Number.isFinite(expiry) && expiry > 0 ? expiry : undefined,\n }) as Promise<{ key: string; record: ApiKeyRecord }>\n },\n onSuccess: (result) => {\n if (isEdit) {\n notify.success({ key: 'settings:apiKeys.notice.updated' })\n onUpdated(result.record)\n } else {\n if (result.key) onCreated({ key: result.key, record: result.record })\n }\n },\n onError: (err) => notify.error({ message: err instanceof Error ? err.message : String(err) }),\n })\n\n // Sync state when dialog re-opens against a different record.\n React.useEffect(() => {\n if (!open) return\n setName(editing?.name ?? '')\n setPermissions(buildState(editing?.permissions ?? {}))\n if (!editing?.expiresAt) setExpiresInDays('')\n else {\n const ms = new Date(editing.expiresAt).getTime() - Date.now()\n setExpiresInDays(ms > 0 ? String(Math.max(1, Math.round(ms / (24 * 60 * 60 * 1000)))) : '')\n }\n }, [open, editing])\n\n const totalSelected = Object.values(permissions.byResource).reduce(\n (sum, set) => sum + (set?.size ?? 0),\n 0,\n )\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {isEdit ? t('settings:apiKeys.editor.titleEdit') : t('settings:apiKeys.editor.titleCreate')}\n </DialogTitle>\n <DialogDescription>{t('settings:apiKeys.editor.description')}</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n if (!name.trim()) return\n save.mutate()\n }}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"api-key-name\">{t('settings:apiKeys.editor.name')}</Label>\n <Input\n id=\"api-key-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('settings:apiKeys.editor.namePlaceholder')}\n required\n maxLength={64}\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"api-key-expires\">{t('settings:apiKeys.editor.expiresInDays')}</Label>\n <Input\n id=\"api-key-expires\"\n type=\"number\"\n min={1}\n max={3650}\n value={expiresInDays}\n onChange={(e) => setExpiresInDays(e.target.value)}\n placeholder={t('settings:apiKeys.editor.expiresPlaceholder')}\n />\n <span className=\"text-xs text-muted-foreground\">\n {t('settings:apiKeys.editor.expiresHint')}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <Label>{t('settings:apiKeys.editor.permissions')}</Label>\n <span className=\"text-xs text-muted-foreground\">\n {t('settings:apiKeys.editor.selectedActions', { count: totalSelected })}\n </span>\n </div>\n <PermissionsMatrix resources={resources} state={permissions} onChange={setPermissions} />\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n {t('common:cancel')}\n </Button>\n <Button type=\"submit\" disabled={save.isPending || !name.trim() || totalSelected === 0}>\n {save.isPending ? t('common:saving') : isEdit ? t('common:save') : t('settings:apiKeys.actions.create')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\n// ─── Webhooks section ─────────────────────────────────────────────────────────\n\nconst WEBHOOK_EVENTS = ['record.created', 'record.updated', 'record.deleted', '*']\n\nfunction WebhooksSection(): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const qc = useQueryClient()\n const notify = useNotify()\n const dialogs = useDialogs()\n const resources = useResources()\n const [editorOpen, setEditorOpen] = React.useState(false)\n const [editing, setEditing] = React.useState<WebhookRecord | null>(null)\n const [selectedId, setSelectedId] = React.useState<string | null>(null)\n\n const list = useQuery({\n queryKey: KEY_WEBHOOKS,\n queryFn: () => client.listWebhooks(),\n })\n const deliveries = useQuery({\n queryKey: ['modern-admin', 'webhooks', selectedId, 'deliveries'],\n queryFn: () => client.listWebhookDeliveries(selectedId!),\n enabled: !!selectedId,\n })\n const deleteMut = useMutation({\n mutationFn: (id: string) => client.deleteWebhook(id),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY_WEBHOOKS })\n notify.success({ key: 'settings:webhooks.notice.deleted' })\n },\n onError: (err) => notify.error({ message: err instanceof Error ? err.message : String(err) }),\n })\n const testMut = useMutation({\n mutationFn: (id: string) => client.testWebhook(id),\n onSuccess: () => {\n if (selectedId) qc.invalidateQueries({ queryKey: ['modern-admin', 'webhooks', selectedId, 'deliveries'] })\n notify.success({ key: 'settings:webhooks.notice.testQueued' })\n },\n onError: (err) => notify.error({ message: err instanceof Error ? err.message : String(err) }),\n })\n\n const webhooks = list.data?.webhooks ?? []\n\n const onDelete = async (webhook: WebhookRecord): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('settings:webhooks.confirmDelete.title'),\n description: t('settings:webhooks.confirmDelete.description', { name: webhook.name }),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (ok) deleteMut.mutate(webhook.id)\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <SettingsCard\n icon={SettingsIcon}\n title={t('settings:webhooks.title')}\n description={t('settings:webhooks.description')}\n action={\n <Button size=\"sm\" onClick={() => { setEditing(null); setEditorOpen(true) }}>\n <Plus className=\"size-4\" />\n {t('settings:webhooks.actions.create')}\n </Button>\n }\n >\n <SettingsListState\n isLoading={list.isLoading}\n error={list.error}\n isEmpty={webhooks.length === 0}\n loadingLabel={t('common:loading')}\n empty={{\n icon: SettingsIcon,\n title: t('settings:webhooks.empty.title'),\n description: t('settings:webhooks.empty.description'),\n }}\n >\n <SettingsTableScroll>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('settings:webhooks.columns.name')}</TableHead>\n <TableHead>{t('settings:webhooks.columns.resource')}</TableHead>\n <TableHead>{t('settings:webhooks.columns.events')}</TableHead>\n <TableHead>{t('settings:webhooks.columns.enabled')}</TableHead>\n <TableHead className=\"text-right\">{t('settings:webhooks.columns.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {webhooks.map((webhook) => (\n <TableRow key={webhook.id}>\n <TableCell>\n <button\n type=\"button\"\n className=\"text-left font-medium hover:underline\"\n onClick={() => setSelectedId(webhook.id)}\n >\n {webhook.name}\n </button>\n <div className=\"max-w-xs truncate text-xs text-muted-foreground\">{webhook.url}</div>\n </TableCell>\n <TableCell>{resourceName(resources, webhook.resourceId, t('settings:webhooks.editor.allResources'))}</TableCell>\n <TableCell className=\"max-w-xs\">\n <div className=\"flex flex-wrap gap-1\">\n {webhook.events.map((event) => <Badge key={event} variant=\"outline\">{event}</Badge>)}\n </div>\n </TableCell>\n <TableCell>{webhook.enabled ? t('common:yes') : t('common:no')}</TableCell>\n <TableCell className=\"text-right\">\n <div className=\"inline-flex gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => testMut.mutate(webhook.id)}>\n {t('settings:webhooks.actions.test')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setEditing(webhook); setEditorOpen(true) }}>\n <Edit className=\"size-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void onDelete(webhook)}>\n <Trash2 className=\"size-4 text-destructive\" />\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </SettingsTableScroll>\n </SettingsListState>\n </SettingsCard>\n\n {selectedId && (\n <SettingsCard icon={SettingsIcon} title={t('settings:webhooks.deliveries.title')}>\n {deliveries.isLoading ? (\n <div className=\"py-4 text-sm text-muted-foreground\">{t('common:loading')}</div>\n ) : (\n <SettingsTableScroll>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('settings:webhooks.deliveries.status')}</TableHead>\n <TableHead>{t('settings:webhooks.deliveries.event')}</TableHead>\n <TableHead>{t('settings:webhooks.deliveries.attempt')}</TableHead>\n <TableHead>{t('settings:webhooks.deliveries.response')}</TableHead>\n <TableHead>{t('settings:webhooks.deliveries.createdAt')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {(deliveries.data?.deliveries ?? []).map((delivery) => (\n <TableRow key={delivery.id}>\n <TableCell>{delivery.status}</TableCell>\n <TableCell>{delivery.event}</TableCell>\n <TableCell>{delivery.attempt}</TableCell>\n <TableCell className=\"max-w-sm truncate\">\n {delivery.responseStatus ?? delivery.error ?? delivery.responseBody ?? '—'}\n </TableCell>\n <TableCell>{formatDate(delivery.createdAt)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </SettingsTableScroll>\n )}\n </SettingsCard>\n )}\n\n <WebhookEditorDialog\n key={editing?.id ?? 'new'}\n open={editorOpen}\n onOpenChange={setEditorOpen}\n webhook={editing}\n resources={resources}\n />\n </div>\n )\n}\n\nfunction WebhookEditorDialog({\n open,\n onOpenChange,\n webhook,\n resources,\n}: {\n open: boolean\n onOpenChange(open: boolean): void\n webhook: WebhookRecord | null\n resources: ResourceJSON[]\n}): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const qc = useQueryClient()\n const notify = useNotify()\n const [name, setName] = React.useState(webhook?.name ?? '')\n const [url, setUrl] = React.useState(webhook?.url ?? '')\n const [resourceId, setResourceId] = React.useState(webhook?.resourceId ?? '')\n const [enabled, setEnabled] = React.useState(webhook?.enabled ?? true)\n const [secret, setSecret] = React.useState(webhook?.secret ?? '')\n const [events, setEvents] = React.useState<string[]>(webhook?.events ?? ['record.created', 'record.updated'])\n const [headers, setHeaders] = React.useState<Record<string, unknown>>(webhook?.headers ?? {})\n const [filters, setFilters] = React.useState<Record<string, unknown>>(webhook?.filters ?? {})\n const [payloadFields, setPayloadFields] = React.useState<string[]>(webhook?.payloadFields ?? [])\n const selectedResource = resources.find((r) => r.id === resourceId)\n\n const save = useMutation({\n mutationFn: (payload: WebhookInput) =>\n webhook ? client.updateWebhook(webhook.id, payload) : client.createWebhook(payload),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY_WEBHOOKS })\n notify.success({ key: 'settings:webhooks.notice.saved' })\n onOpenChange(false)\n },\n onError: (err) => notify.error({ message: err instanceof Error ? err.message : String(err) }),\n })\n\n const toggleEvent = (event: string): void => {\n setEvents((prev) => prev.includes(event) ? prev.filter((e) => e !== event) : [...prev, event])\n }\n\n const onSubmit = (e: React.FormEvent): void => {\n e.preventDefault()\n save.mutate({\n name: name.trim(),\n url: url.trim(),\n events,\n resourceId: resourceId || null,\n enabled,\n ...(secret.trim() ? { secret: secret.trim() } : {}),\n headers: stringRecord(headers),\n filters: stringRecord(filters),\n payloadFields,\n })\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>{webhook ? t('settings:webhooks.editor.titleEdit') : t('settings:webhooks.editor.titleCreate')}</DialogTitle>\n <DialogDescription>{t('settings:webhooks.editor.description')}</DialogDescription>\n </DialogHeader>\n <form className=\"space-y-4\" onSubmit={onSubmit}>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label>{t('settings:webhooks.editor.name')}</Label>\n <Input value={name} onChange={(e) => setName(e.target.value)} required />\n </div>\n <div className=\"space-y-1.5\">\n <Label>{t('settings:webhooks.editor.url')}</Label>\n <Input value={url} onChange={(e) => setUrl(e.target.value)} required type=\"url\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label>{t('settings:webhooks.editor.resource')}</Label>\n <Select\n value={resourceId || '__all__'}\n onValueChange={(v) => { setResourceId(v === '__all__' ? '' : v); setPayloadFields([]) }}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">{t('settings:webhooks.editor.allResources')}</SelectItem>\n {resources.map((resource) => (\n <SelectItem key={resource.id} value={resource.id}>\n {resource.name}\n {resource.name !== resource.id && (\n <span className=\"ml-1.5 text-xs text-muted-foreground\">({resource.id})</span>\n )}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Label>{t('settings:webhooks.editor.secret')}</Label>\n <InfoTooltip\n content={t('settings:webhooks.editor.secretHint')}\n ariaLabel={t('settings:webhooks.editor.secret')}\n side=\"right\"\n />\n </div>\n <Input value={secret} onChange={(e) => setSecret(e.target.value)} type=\"password\" />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Switch checked={enabled} onCheckedChange={setEnabled} />\n <Label>{t('settings:webhooks.editor.enabled')}</Label>\n </div>\n <div className=\"space-y-2\">\n <Label>{t('settings:webhooks.editor.events')}</Label>\n <div className=\"flex flex-wrap gap-2\">\n {WEBHOOK_EVENTS.map((event) => (\n <label key={event} className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <Checkbox checked={events.includes(event)} onCheckedChange={() => toggleEvent(event)} />\n {event}\n </label>\n ))}\n </div>\n </div>\n {selectedResource && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <Label>{t('settings:webhooks.editor.payloadFields')}</Label>\n <InfoTooltip\n content={t('settings:webhooks.editor.payloadFieldsHint')}\n ariaLabel={t('settings:webhooks.editor.payloadFields')}\n side=\"right\"\n />\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {selectedResource.properties.map((property) => (\n <label key={property.path} className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={payloadFields.includes(property.path)}\n onCheckedChange={() =>\n setPayloadFields((prev) =>\n prev.includes(property.path)\n ? prev.filter((p) => p !== property.path)\n : [...prev, property.path],\n )\n }\n />\n {property.label}\n </label>\n ))}\n </div>\n </div>\n )}\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Label>{t('settings:webhooks.editor.headers')}</Label>\n <InfoTooltip\n content={t('settings:webhooks.editor.headersHint')}\n ariaLabel={t('settings:webhooks.editor.headers')}\n side=\"top\"\n />\n </div>\n <JsonEditor value={headers} onChange={(next) => setHeaders(toJsonRecord(next))} />\n </div>\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Label>{t('settings:webhooks.editor.filters')}</Label>\n <InfoTooltip\n content={t('settings:webhooks.editor.filtersHint')}\n ariaLabel={t('settings:webhooks.editor.filters')}\n side=\"top\"\n />\n </div>\n <JsonEditor value={filters} onChange={(next) => setFilters(toJsonRecord(next))} />\n </div>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>{t('common:cancel')}</Button>\n <Button type=\"submit\" disabled={save.isPending || !name.trim() || !url.trim() || events.length === 0}>\n {save.isPending ? t('common:saving') : t('common:save')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst resourceName = (\n resources: ResourceJSON[],\n id: string | null | undefined,\n fallback: string,\n): string => id ? (resources.find((r) => r.id === id)?.name ?? id) : fallback\n\nconst toJsonRecord = (value: unknown): Record<string, unknown> =>\n value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n\nconst stringRecord = (value: Record<string, unknown>): Record<string, string> => {\n const out: Record<string, string> = {}\n for (const [key, item] of Object.entries(value)) {\n if (item != null && item !== '') out[key] = String(item)\n }\n return out\n}\n\n// ─── Created-secret dialog ────────────────────────────────────────────────────\n\nfunction CreatedSecretDialog({\n secret,\n onClose,\n}: {\n secret: { key: string; record: ApiKeyRecord } | null\n onClose: () => void\n}): React.ReactElement {\n const { t } = useI18n()\n const notify = useNotify()\n const [reveal, setReveal] = React.useState(false)\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!secret) {\n setReveal(false)\n setCopied(false)\n }\n }, [secret])\n\n const onCopy = async (): Promise<void> => {\n if (!secret) return\n try {\n await navigator.clipboard.writeText(secret.key)\n setCopied(true)\n notify.success({ key: 'settings:apiKeys.notice.copied' })\n setTimeout(() => setCopied(false), 1500)\n } catch {\n notify.error({ key: 'settings:apiKeys.notice.copyFailed' })\n }\n }\n\n return (\n <Dialog open={!!secret} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <SettingsIcon className=\"size-5\" />\n {t('settings:apiKeys.created.title')}\n </DialogTitle>\n <DialogDescription>{t('settings:apiKeys.created.description')}</DialogDescription>\n </DialogHeader>\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50 p-3 text-sm text-amber-900 dark:border-amber-300/30 dark:bg-amber-950/40 dark:text-amber-200\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 size-4\" />\n <p>{t('settings:apiKeys.created.warning')}</p>\n </div>\n </div>\n <div className=\"flex items-stretch gap-2\">\n <div className=\"relative flex-1\">\n <Input\n readOnly\n type={reveal ? 'text' : 'password'}\n value={secret?.key ?? ''}\n className=\"pr-10 font-mono text-xs\"\n onFocus={(e) => e.currentTarget.select()}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute right-1 top-1/2 -translate-y-1/2\"\n onClick={() => setReveal((v) => !v)}\n aria-label={reveal ? t('settings:apiKeys.created.hide') : t('settings:apiKeys.created.reveal')}\n >\n {reveal ? <EyeOff className=\"size-4\" /> : <Eye className=\"size-4\" />}\n </Button>\n </div>\n <Button type=\"button\" onClick={onCopy} variant=\"secondary\">\n {copied ? <Check className=\"size-4\" /> : <Copy className=\"size-4\" />}\n <span className=\"hidden sm:inline\">\n {copied ? t('settings:apiKeys.created.copied') : t('settings:apiKeys.created.copy')}\n </span>\n </Button>\n </div>\n <DialogFooter>\n <Button onClick={onClose}>{t('common:done')}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst formatDate = (input: string | Date): string => {\n try {\n return new Date(input).toLocaleString()\n } catch {\n return String(input)\n }\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{w as n}from"./floating-layer-DJGCYMex.js";import{t as r}from"./trash-2-DhyKQCKv.js";import{t as i}from"./circle-alert-0EyKeic4.js";import{t as a}from"./pencil-BO-k3yTG.js";import{t as o}from"./zap-b3saQVKc.js";import{s}from"./dist-CmyV2PEd.js";import{E as c,N as l,T as u,b as d,d as f,g as p,l as m,nt as h}from"./hooks-DHDUQgzs.js";import{c as g,l as _,n as v,o as y,r as b,s as x}from"./action-component-host-QVowRL_F.js";import{a as S,i as C,n as w,t as T}from"./card-MNH_XK0V.js";import{i as E,n as D,r as O,t as k}from"./tabs-Dr7UA219.js";import{a as A,c as j,l as M,o as N,r as P,s as F,t as I}from"./property-renderer-DeykD9hp.js";import{t as L}from"./revisions-button-CI74_D14.js";import{D as R,E as z,O as B,T as V,i as H,l as U,n as W,o as G,r as K,w as q}from"./index-BvESJd1R.js";var J=e(t(),1),Y=n();function X({parentRecordId:e,related:t,active:n}){let[r,i]=J.useState({perPage:10}),[a,o]=J.useState(n);return J.useEffect(()=>{n&&o(!0)},[n]),a?(0,Y.jsx)(P,{resourceId:t.resourceId,query:r,onQueryChange:i,lockedFilters:{[t.foreignKey]:e},embedPadding:!1,features:{breadcrumbs:!1,title:!1,create:!1,export:!1,card:!1}}):null}function Z({resource:e,recordId:t}){let{t:n}=l(),r=c(),i=e.showRelatedResources!==!1,a=J.useMemo(()=>i?j(e,r):[],[i,e,r]),[o,s]=J.useState(()=>a[0]?`${a[0].resourceId}::${a[0].foreignKey}`:``);if(J.useEffect(()=>{a.length!==0&&(a.some(e=>`${e.resourceId}::${e.foreignKey}`===o)||s(`${a[0].resourceId}::${a[0].foreignKey}`))},[o,a]),a.length===0)return null;let u=e=>e.label??r.find(t=>t.id===e.resourceId)?.name??e.resourceId;return(0,Y.jsxs)(T,{children:[(0,Y.jsx)(C,{children:(0,Y.jsx)(S,{className:`text-base`,children:n(`common:relatedRecords`)})}),(0,Y.jsx)(w,{children:(0,Y.jsxs)(k,{value:o,onValueChange:s,children:[(0,Y.jsx)(O,{className:`w-full justify-start`,children:a.map(e=>{let t=`${e.resourceId}::${e.foreignKey}`;return(0,Y.jsx)(E,{value:t,children:u(e)},t)})}),a.map(e=>{let n=`${e.resourceId}::${e.foreignKey}`;return(0,Y.jsx)(D,{value:n,className:`mt-4`,children:(0,Y.jsx)(X,{parentRecordId:t,related:e,active:o===n})},n)})]})})]})}function Q({error:e,t}){let{status:n,message:r}=h(e),a=t(n===404?`errors:notFound`:n===403?`errors:forbidden`:`errors:server`);return(0,Y.jsxs)(`div`,{className:`flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15`,children:[(0,Y.jsx)(i,{className:`mt-0.5 size-5 shrink-0 text-destructive`}),(0,Y.jsxs)(`div`,{className:`space-y-1 text-sm`,children:[(0,Y.jsx)(`p`,{className:`font-semibold text-destructive`,children:a}),(0,Y.jsx)(`p`,{className:`text-destructive/90`,children:r})]})]})}function $({resourceId:e,recordId:t}){let n=u(e),i=d(e,t),c=m(e),h=p(e),E=f(),{t:D}=l(),O=G(),k=K(),j=U(),P=N(e),J=i.data?.record,X=x((n?.actions??[]).filter(e=>e.actionType===`record`&&![`show`,`edit`,`delete`].includes(e.name)),J),$=y(`edit`,J),ee=y(`delete`,J);W(`mod+e`,()=>{!i.data||!$||O({name:`edit`,resourceId:e,recordId:t})},{description:D(`common:edit`)});let te=async()=>{await k.confirm({title:D(`common:confirmDelete`),confirmLabel:D(`common:delete`),destructive:!0})&&(await c.mutateAsync(t),O({name:`list`,resourceId:e}))};if(!n)return(0,Y.jsx)(`div`,{className:`p-6`,children:D(`common:loading`)});let ne=V(),re=i.data?.record?.title||t;return(0,Y.jsxs)(`div`,{className:`space-y-2 sm:space-y-4`,children:[(0,Y.jsx)(g,{items:[_(D(`common:home`)),{label:n.name,to:{name:`list`,resourceId:e}},{label:re}]}),(0,Y.jsxs)(T,{children:[(0,Y.jsxs)(C,{className:`flex flex-row items-center justify-between gap-3`,children:[(0,Y.jsxs)(S,{className:`truncate`,children:[n.name,` #`,t]}),i.data&&(0,Y.jsxs)(`div`,{className:`flex shrink-0 flex-wrap gap-2`,children:[E.history&&(0,Y.jsx)(L,{resourceId:e,recordId:t}),$&&(0,Y.jsxs)(z,{children:[(0,Y.jsx)(B,{asChild:!0,children:(0,Y.jsx)(s,{variant:`outline-primary`,size:`sm`,asChild:!0,children:(0,Y.jsxs)(H,{to:{name:`edit`,resourceId:e,recordId:t},"aria-label":D(`common:edit`),children:[(0,Y.jsx)(a,{className:`size-4`}),(0,Y.jsx)(`span`,{className:`hidden sm:inline`,children:D(`common:edit`)})]})})}),(0,Y.jsxs)(R,{className:`flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{children:D(`common:edit`)}),(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-0.5`,children:[(0,Y.jsx)(q,{children:ne}),(0,Y.jsx)(`span`,{className:`text-muted-foreground`,children:`+`}),(0,Y.jsx)(q,{children:`E`})]})]})]}),ee&&(0,Y.jsxs)(s,{variant:`outline-destructive`,size:`sm`,disabled:c.isPending,onClick:()=>void te(),"aria-label":D(`common:delete`),children:[(0,Y.jsx)(r,{className:`size-4`}),(0,Y.jsx)(`span`,{className:`hidden sm:inline`,children:D(`common:delete`)})]}),X.length>0&&(0,Y.jsx)(b,{actions:X,onAction:async e=>{if(A(e)){P(e,{recordId:t});return}await F(e,k)&&h.mutateAsync({recordId:t,actionName:e.name}).then(e=>v(j,e.notice)).catch(e=>j.error({message:e.message}))},t:D,trigger:(0,Y.jsxs)(s,{variant:`outline`,size:`sm`,disabled:h.isPending,"aria-label":D(`common:actions`),children:[(0,Y.jsx)(o,{className:`size-4`}),(0,Y.jsx)(`span`,{className:`hidden sm:inline`,children:D(`common:actions`)})]})})]})]}),(0,Y.jsx)(w,{children:(0,Y.jsxs)(`div`,{className:`space-y-4`,children:[i.isLoading&&(0,Y.jsx)(`p`,{className:`text-muted-foreground`,children:D(`common:loading`)}),i.isError&&(0,Y.jsx)(Q,{error:i.error,t:D}),i.data&&(0,Y.jsx)(`dl`,{className:`[column-fill:_balance] md:columns-2`,children:M(n.properties,`show`,n.propertyOrder?.show).map(e=>(0,Y.jsxs)(`div`,{className:`mb-8 break-inside-avoid`,children:[(0,Y.jsx)(`dt`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e.label}),(0,Y.jsx)(`dd`,{className:`mt-1`,children:(0,Y.jsx)(I,{property:e,value:i.data.record.params[e.path],view:`show`,populated:i.data.record.populated})})]},e.path))})]})})]}),i.data&&(0,Y.jsx)(Z,{resource:n,recordId:t})]})}export{$ as ResourceShowPage};
2
- //# sourceMappingURL=show-page-Dgw-9Pmn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"show-page-Dgw-9Pmn.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 +0,0 @@
1
- {"version":3,"file":"sparkles-CqF0zjrF.js","names":[],"sources":["../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/sparkles.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAqBA,IAAM,EAAW,EAAiB,WAAY,CAX5C,CACE,OACA,CACE,EAAG,yQACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,SAAU,CAAE,GAAI,IAAK,GAAI,KAAM,EAAG,IAAK,IAAK,QAAS,CAAC,CAEX,CAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"square-pen-DGT7ekeJ.js","names":[],"sources":["../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/square-pen.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\", key: \"1m0v6g\" }],\n [\n \"path\",\n {\n d: \"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z\",\n key: \"ohrbg2\"\n }\n ]\n];\nconst SquarePen = createLucideIcon(\"square-pen\", __iconNode);\n\nexport { __iconNode, SquarePen as default };\n//# sourceMappingURL=square-pen.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAmBA,IAAM,EAAY,EAAiB,aAAc,CAT/C,CAAC,OAAQ,CAAE,EAAG,6DAA8D,IAAK,QAAS,CAAC,EAC3F,CACE,OACA,CACE,EAAG,0HACH,IAAK,QACP,CACF,CAE+C,CAAU"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{l as n,w as r}from"./floating-layer-DJGCYMex.js";var i=e(t(),1),a=r(),o=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`div`,{className:`relative w-full overflow-auto`,children:(0,a.jsx)(`table`,{ref:r,className:n(`w-full caption-bottom text-sm`,e),...t})}));o.displayName=`Table`;var s=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`thead`,{ref:r,className:n(`[&_tr]:border-b [&_tr]:border-border bg-muted/40`,e),...t}));s.displayName=`TableHeader`;var c=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`tbody`,{ref:r,className:n(`[&_tr:last-child]:border-0`,e),...t}));c.displayName=`TableBody`;var l=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`tfoot`,{ref:r,className:n(`border-t bg-muted/40 font-medium [&>tr]:last:border-b-0`,e),...t}));l.displayName=`TableFooter`;var u=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`tr`,{ref:r,className:n(`border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted`,e),...t}));u.displayName=`TableRow`;var d=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`th`,{ref:r,className:n(`h-10 px-3 text-left align-middle text-xs font-semibold uppercase tracking-wide text-muted-foreground border-r border-border last:border-r-0`,e),...t}));d.displayName=`TableHead`;var f=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`td`,{ref:r,className:n(`px-3 py-2 align-middle border-r border-border last:border-r-0`,e),...t}));f.displayName=`TableCell`;var p=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`caption`,{ref:r,className:n(`mt-4 text-sm text-muted-foreground`,e),...t}));p.displayName=`TableCaption`;export{s as a,d as i,c as n,u as o,f as r,o as t};
2
- //# sourceMappingURL=table-DzBSPeVH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-DzBSPeVH.js","names":[],"sources":["../../../../ui/src/components/table.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport const Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n ),\n)\nTable.displayName = 'Table'\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b [&_tr]:border-border bg-muted/40', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/40 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nexport const TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className,\n )}\n {...props}\n />\n))\nTableRow.displayName = 'TableRow'\n\nexport const TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-3 text-left align-middle text-xs font-semibold uppercase tracking-wide text-muted-foreground border-r border-border last:border-r-0',\n className,\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nexport const TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn('px-3 py-2 align-middle border-r border-border last:border-r-0', className)}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('mt-4 text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n"],"mappings":"uIAGa,EAAA,EAAc,YACxB,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,0CACb,EAAA,EAAA,IAAA,CAAC,QAAD,CAAY,MAAK,UAAW,EAAG,gCAAiC,CAAS,EAAG,GAAI,CAAQ,CAAA,CACrF,CAAA,CAET,EACA,EAAM,YAAc,QAEpB,IAAa,EAAA,EAAoB,YAG9B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAY,MAAK,UAAW,EAAG,mDAAoD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAC5G,EACD,EAAY,YAAc,cAE1B,IAAa,EAAA,EAAkB,YAG5B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,QAAD,CAAY,MAAK,UAAW,EAAG,6BAA8B,CAAS,EAAG,GAAI,CAAQ,CAAA,CACtF,EACD,EAAU,YAAc,YAExB,IAAa,EAAA,EAAoB,YAG9B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,QAAD,CACO,MACL,UAAW,EAAG,0DAA2D,CAAS,EAClF,GAAI,CACL,CAAA,CACF,EACD,EAAY,YAAc,cAE1B,IAAa,EAAA,EAAiB,YAG3B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EACT,4FACA,CACF,EACA,GAAI,CACL,CAAA,CACF,EACD,EAAS,YAAc,WAEvB,IAAa,EAAA,EAAkB,YAG5B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EACT,8IACA,CACF,EACA,GAAI,CACL,CAAA,CACF,EACD,EAAU,YAAc,YAExB,IAAa,EAAA,EAAkB,YAG5B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CACO,MACL,UAAW,EAAG,gEAAiE,CAAS,EACxF,GAAI,CACL,CAAA,CACF,EACD,EAAU,YAAc,YAExB,IAAa,EAAA,EAAqB,YAG/B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,UAAD,CACO,MACL,UAAW,EAAG,qCAAsC,CAAS,EAC7D,GAAI,CACL,CAAA,CACF,EACD,EAAa,YAAc"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{C as n,_ as r,d as i,f as a,h as o,l as s,p as c,w as l}from"./floating-layer-DJGCYMex.js";import{t as u}from"./dist-DI9XNddW.js";import{J as d,K as f,q as p}from"./index-BvESJd1R.js";var m=e(t(),1),h=l(),g=`Tabs`,[_,v]=n(g,[d]),y=d(),[b,x]=_(g),S=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,onValueChange:a,defaultValue:s,orientation:l=`horizontal`,dir:d,activationMode:f=`automatic`,...p}=e,m=u(d),[_,v]=o({prop:r,onChange:a,defaultProp:s??``,caller:g});return(0,h.jsx)(b,{scope:n,baseId:i(),value:_,onValueChange:v,orientation:l,dir:m,activationMode:f,children:(0,h.jsx)(c.div,{dir:m,"data-orientation":l,...p,ref:t})})});S.displayName=g;var C=`TabsList`,w=m.forwardRef((e,t)=>{let{__scopeTabs:n,loop:r=!0,...i}=e,a=x(C,n),o=y(n);return(0,h.jsx)(p,{asChild:!0,...o,orientation:a.orientation,dir:a.dir,loop:r,children:(0,h.jsx)(c.div,{role:`tablist`,"aria-orientation":a.orientation,...i,ref:t})})});w.displayName=C;var T=`TabsTrigger`,E=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:i,disabled:a=!1,...o}=e,s=x(T,n),l=y(n),u=k(s.baseId,i),d=A(s.baseId,i),p=i===s.value;return(0,h.jsx)(f,{asChild:!0,...l,focusable:!a,active:p,children:(0,h.jsx)(c.button,{type:`button`,role:`tab`,"aria-selected":p,"aria-controls":d,"data-state":p?`active`:`inactive`,"data-disabled":a?``:void 0,disabled:a,id:u,...o,ref:t,onMouseDown:r(e.onMouseDown,e=>{!a&&e.button===0&&e.ctrlKey===!1?s.onValueChange(i):e.preventDefault()}),onKeyDown:r(e.onKeyDown,e=>{a||e.target!==e.currentTarget||[` `,`Enter`].includes(e.key)&&s.onValueChange(i)}),onFocus:r(e.onFocus,()=>{let e=s.activationMode!==`manual`;!p&&!a&&e&&s.onValueChange(i)})})})});E.displayName=T;var D=`TabsContent`,O=m.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,forceMount:i,children:o,...s}=e,l=x(D,n),u=k(l.baseId,r),d=A(l.baseId,r),f=r===l.value,p=m.useRef(f);return m.useEffect(()=>{let e=requestAnimationFrame(()=>p.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,h.jsx)(a,{present:i||f,children:({present:n})=>(0,h.jsx)(c.div,{"data-state":f?`active`:`inactive`,"data-orientation":l.orientation,role:`tabpanel`,"aria-labelledby":u,hidden:!n,id:d,tabIndex:0,...s,ref:t,style:{...e.style,animationDuration:p.current?`0s`:void 0},children:n&&o})})});O.displayName=D;function k(e,t){return`${e}-trigger-${t}`}function A(e,t){return`${e}-content-${t}`}var j=S,M=w,N=E,P=O,F=j,I=m.forwardRef(({className:e,...t},n)=>(0,h.jsx)(M,{ref:n,className:s(`flex h-10 w-full items-center justify-start gap-1 overflow-x-auto border-b border-border text-muted-foreground`,e),...t}));I.displayName=M.displayName;var L=m.forwardRef(({className:e,...t},n)=>(0,h.jsx)(N,{ref:n,className:s(`relative -mb-px inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap border-b-2 border-transparent px-4 py-2 text-sm font-medium ring-offset-background transition-all`,`hover:text-foreground`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`,`data-[state=active]:border-primary data-[state=active]:text-foreground`,e),...t}));L.displayName=N.displayName;var R=m.forwardRef(({className:e,...t},n)=>(0,h.jsx)(P,{ref:n,className:s(`mt-3 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,e),...t}));R.displayName=P.displayName;export{L as i,R as n,I as r,F as t};
2
- //# sourceMappingURL=tabs-Dr7UA219.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs-Dr7UA219.js","names":["Tabs","TabsList","RovingFocusGroup.Root","TabsTrigger","RovingFocusGroup.Item","TabsContent"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-tabs@1.1.17+ae2b4604ef263bc9/node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../../ui/src/components/tabs.tsx"],"sourcesContent":["\"use client\";\n\n// src/tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue ?? \"\",\n caller: TABS_NAME\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled || event.target !== event.currentTarget) {\n return;\n }\n if ([\" \", \"Enter\"].includes(event.key)) {\n context.onValueChange(value);\n }\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/utils.js'\n\nexport const Tabs = TabsPrimitive.Root\n\n// Underline-style tab strip — works visually even with a single tab because\n// the active item has a clearly drawn bottom indicator that anchors it to the\n// content below.\nexport const TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-start gap-1 overflow-x-auto border-b border-border text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'relative -mb-px inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap border-b-2 border-transparent px-4 py-2 text-sm font-medium ring-offset-background transition-all',\n 'hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'data-[state=active]:border-primary data-[state=active]:text-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nexport const TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-3 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className,\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{l as n,w as r}from"./floating-layer-DJGCYMex.js";var i=e(t(),1),a=r(),o=i.forwardRef(({className:e,...t},r)=>(0,a.jsx)(`textarea`,{ref:r,className:n(`flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`,e),...t}));o.displayName=`Textarea`;export{o as t};
2
- //# sourceMappingURL=textarea-T25SXcrC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"textarea-T25SXcrC.js","names":[],"sources":["../../../../ui/src/components/textarea.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/utils.js'\n\nexport type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n ),\n)\nTextarea.displayName = 'Textarea'\n"],"mappings":"uIAKa,EAAA,EAAiB,YAC3B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,IAAA,CAAC,WAAD,CACO,MACL,UAAW,EACT,8PACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,EACA,EAAS,YAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"trash-2-DhyKQCKv.js","names":["__iconNode"],"sources":["../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/chevron-up.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/trash-2.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]];\nconst ChevronUp = createLucideIcon(\"chevron-up\", __iconNode);\n\nexport { __iconNode, ChevronUp as default };\n//# sourceMappingURL=chevron-up.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n"],"x_google_ignoreList":[0,1],"mappings":"mDAUA,IAAM,EAAY,EAAiB,aAAcA,CAD7B,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,CAClBA,CAAU,ECMrD,EAAS,EAAiB,UAAW,CANzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,QAAS,CAAC,EACzE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,yCAA0C,IAAK,QAAS,CAAC,CAE9B,CAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"triangle-alert-CyaaNWN8.js","names":[],"sources":["../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/triangle-alert.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAoBA,IAAM,EAAgB,EAAiB,iBAAkB,CAVvD,CACE,OACA,CACE,EAAG,2EACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAS,CAAC,CAEY,CAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"undo-2-DlSB-5DM.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/bold.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/code-xml.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/columns-2.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/heading-1.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/heading-2.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/heading-3.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/italic.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/link.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/list-ordered.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/list.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/minus.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/quote.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/redo-2.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/strikethrough.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/undo-2.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\", key: \"mg9rjx\" }\n ]\n];\nconst Bold = createLucideIcon(\"bold\", __iconNode);\n\nexport { __iconNode, Bold as default };\n//# sourceMappingURL=bold.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m18 16 4-4-4-4\", key: \"1inbqp\" }],\n [\"path\", { d: \"m6 8-4 4 4 4\", key: \"15zrgr\" }],\n [\"path\", { d: \"m14.5 4-5 16\", key: \"e7oirm\" }]\n];\nconst CodeXml = createLucideIcon(\"code-xml\", __iconNode);\n\nexport { __iconNode, CodeXml as default };\n//# sourceMappingURL=code-xml.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }]\n];\nconst Columns2 = createLucideIcon(\"columns-2\", __iconNode);\n\nexport { __iconNode, Columns2 as default };\n//# sourceMappingURL=columns-2.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M4 12h8\", key: \"17cfdx\" }],\n [\"path\", { d: \"M4 18V6\", key: \"1rz3zl\" }],\n [\"path\", { d: \"M12 18V6\", key: \"zqpxq5\" }],\n [\"path\", { d: \"m17 12 3-2v8\", key: \"1hhhft\" }]\n];\nconst Heading1 = createLucideIcon(\"heading-1\", __iconNode);\n\nexport { __iconNode, Heading1 as default };\n//# sourceMappingURL=heading-1.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M4 12h8\", key: \"17cfdx\" }],\n [\"path\", { d: \"M4 18V6\", key: \"1rz3zl\" }],\n [\"path\", { d: \"M12 18V6\", key: \"zqpxq5\" }],\n [\"path\", { d: \"M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1\", key: \"9jr5yi\" }]\n];\nconst Heading2 = createLucideIcon(\"heading-2\", __iconNode);\n\nexport { __iconNode, Heading2 as default };\n//# sourceMappingURL=heading-2.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M4 12h8\", key: \"17cfdx\" }],\n [\"path\", { d: \"M4 18V6\", key: \"1rz3zl\" }],\n [\"path\", { d: \"M12 18V6\", key: \"zqpxq5\" }],\n [\"path\", { d: \"M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2\", key: \"68ncm8\" }],\n [\"path\", { d: \"M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2\", key: \"1ejuhz\" }]\n];\nconst Heading3 = createLucideIcon(\"heading-3\", __iconNode);\n\nexport { __iconNode, Heading3 as default };\n//# sourceMappingURL=heading-3.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"line\", { x1: \"19\", x2: \"10\", y1: \"4\", y2: \"4\", key: \"15jd3p\" }],\n [\"line\", { x1: \"14\", x2: \"5\", y1: \"20\", y2: \"20\", key: \"bu0au3\" }],\n [\"line\", { x1: \"15\", x2: \"9\", y1: \"4\", y2: \"20\", key: \"uljnxc\" }]\n];\nconst Italic = createLucideIcon(\"italic\", __iconNode);\n\nexport { __iconNode, Italic as default };\n//# sourceMappingURL=italic.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\", key: \"1cjeqo\" }],\n [\"path\", { d: \"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\", key: \"19qd67\" }]\n];\nconst Link = createLucideIcon(\"link\", __iconNode);\n\nexport { __iconNode, Link as default };\n//# sourceMappingURL=link.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M11 5h10\", key: \"1cz7ny\" }],\n [\"path\", { d: \"M11 12h10\", key: \"1438ji\" }],\n [\"path\", { d: \"M11 19h10\", key: \"11t30w\" }],\n [\"path\", { d: \"M4 4h1v5\", key: \"10yrso\" }],\n [\"path\", { d: \"M4 9h2\", key: \"r1h2o0\" }],\n [\"path\", { d: \"M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02\", key: \"xtkcd5\" }]\n];\nconst ListOrdered = createLucideIcon(\"list-ordered\", __iconNode);\n\nexport { __iconNode, ListOrdered as default };\n//# sourceMappingURL=list-ordered.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 5h.01\", key: \"18ugdj\" }],\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M3 19h.01\", key: \"noohij\" }],\n [\"path\", { d: \"M8 5h13\", key: \"1pao27\" }],\n [\"path\", { d: \"M8 12h13\", key: \"1za7za\" }],\n [\"path\", { d: \"M8 19h13\", key: \"m83p4d\" }]\n];\nconst List = createLucideIcon(\"list\", __iconNode);\n\nexport { __iconNode, List as default };\n//# sourceMappingURL=list.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]];\nconst Minus = createLucideIcon(\"minus\", __iconNode);\n\nexport { __iconNode, Minus as default };\n//# sourceMappingURL=minus.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\",\n key: \"rib7q0\"\n }\n ],\n [\n \"path\",\n {\n d: \"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\",\n key: \"1ymkrd\"\n }\n ]\n];\nconst Quote = createLucideIcon(\"quote\", __iconNode);\n\nexport { __iconNode, Quote as default };\n//# sourceMappingURL=quote.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 14 5-5-5-5\", key: \"12vg1m\" }],\n [\"path\", { d: \"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\", key: \"6uklza\" }]\n];\nconst Redo2 = createLucideIcon(\"redo-2\", __iconNode);\n\nexport { __iconNode, Redo2 as default };\n//# sourceMappingURL=redo-2.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 4H9a3 3 0 0 0-2.83 4\", key: \"43sutm\" }],\n [\"path\", { d: \"M14 12a4 4 0 0 1 0 8H6\", key: \"nlfj13\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"12\", y2: \"12\", key: \"1e0a9i\" }]\n];\nconst Strikethrough = createLucideIcon(\"strikethrough\", __iconNode);\n\nexport { __iconNode, Strikethrough as default };\n//# sourceMappingURL=strikethrough.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M9 14 4 9l5-5\", key: \"102s5s\" }],\n [\"path\", { d: \"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\", key: \"f3b9sd\" }]\n];\nconst Undo2 = createLucideIcon(\"undo-2\", __iconNode);\n\nexport { __iconNode, Undo2 as default };\n//# sourceMappingURL=undo-2.mjs.map\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload-BVhXhZgn.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/arrow-up-down.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/chevrons-left.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/chevrons-right.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/download.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/file-braces.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/file-spreadsheet.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/inbox.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/list-filter.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.mjs","../../../../../node_modules/.bun/lucide-react@1.23.0+e14d3f224186685e/node_modules/lucide-react/dist/esm/icons/upload.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 16-4 4-4-4\", key: \"f6ql7i\" }],\n [\"path\", { d: \"M17 20V4\", key: \"1ejh1v\" }],\n [\"path\", { d: \"m3 8 4-4 4 4\", key: \"11wl7u\" }],\n [\"path\", { d: \"M7 4v16\", key: \"1glfcx\" }]\n];\nconst ArrowUpDown = createLucideIcon(\"arrow-up-down\", __iconNode);\n\nexport { __iconNode, ArrowUpDown as default };\n//# sourceMappingURL=arrow-up-down.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m11 17-5-5 5-5\", key: \"13zhaf\" }],\n [\"path\", { d: \"m18 17-5-5 5-5\", key: \"h8a8et\" }]\n];\nconst ChevronsLeft = createLucideIcon(\"chevrons-left\", __iconNode);\n\nexport { __iconNode, ChevronsLeft as default };\n//# sourceMappingURL=chevrons-left.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m6 17 5-5-5-5\", key: \"xnjwq\" }],\n [\"path\", { d: \"m13 17 5-5-5-5\", key: \"17xmmf\" }]\n];\nconst ChevronsRight = createLucideIcon(\"chevrons-right\", __iconNode);\n\nexport { __iconNode, ChevronsRight as default };\n//# sourceMappingURL=chevrons-right.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n { d: \"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\", key: \"1oajmo\" }\n ],\n [\n \"path\",\n { d: \"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\", key: \"mpwhp6\" }\n ]\n];\nconst FileBraces = createLucideIcon(\"file-braces\", __iconNode);\n\nexport { __iconNode, FileBraces as default };\n//# sourceMappingURL=file-braces.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M8 13h2\", key: \"yr2amv\" }],\n [\"path\", { d: \"M14 13h2\", key: \"un5t4a\" }],\n [\"path\", { d: \"M8 17h2\", key: \"2yhykz\" }],\n [\"path\", { d: \"M14 17h2\", key: \"10kma7\" }]\n];\nconst FileSpreadsheet = createLucideIcon(\"file-spreadsheet\", __iconNode);\n\nexport { __iconNode, FileSpreadsheet as default };\n//# sourceMappingURL=file-spreadsheet.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"polyline\", { points: \"22 12 16 12 14 15 10 15 8 12 2 12\", key: \"o97t9d\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ]\n];\nconst Inbox = createLucideIcon(\"inbox\", __iconNode);\n\nexport { __iconNode, Inbox as default };\n//# sourceMappingURL=inbox.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M2 5h20\", key: \"1fs1ex\" }],\n [\"path\", { d: \"M6 12h12\", key: \"8npq4p\" }],\n [\"path\", { d: \"M9 19h6\", key: \"456am0\" }]\n];\nconst ListFilter = createLucideIcon(\"list-filter\", __iconNode);\n\nexport { __iconNode, ListFilter as default };\n//# sourceMappingURL=list-filter.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 5H3\", key: \"1qgfaw\" }],\n [\"path\", { d: \"M12 19H3\", key: \"yhmn1j\" }],\n [\"path\", { d: \"M14 3v4\", key: \"1sua03\" }],\n [\"path\", { d: \"M16 17v4\", key: \"1q0r14\" }],\n [\"path\", { d: \"M21 12h-9\", key: \"1o4lsq\" }],\n [\"path\", { d: \"M21 19h-5\", key: \"1rlt1p\" }],\n [\"path\", { d: \"M21 5h-7\", key: \"1oszz2\" }],\n [\"path\", { d: \"M8 10v4\", key: \"tgpxqk\" }],\n [\"path\", { d: \"M8 12H3\", key: \"a7s4jb\" }]\n];\nconst SlidersHorizontal = createLucideIcon(\"sliders-horizontal\", __iconNode);\n\nexport { __iconNode, SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-dashboard-charts-aymvhXUB.js","names":[],"sources":["../../../../core/src/dashboard/store.ts","../../../../react/src/use-dashboard-charts.ts"],"sourcesContent":["// Dashboard / chart-builder schemas and storage port.\n//\n// Source of truth for the on-disk shape of saved dashboards. Both the\n// frontend (localStorage default) and any future server-side store\n// implement the same `IDashboardStore` interface, so the UI is agnostic\n// to where the data actually lives.\n\nimport { z } from 'zod'\n\n// Pie removed in Phase 10 — time-series first means category-only charts\n// don't fit the model.\nexport const chartVisualisationZ = z.enum(['kpi', 'line', 'area', 'bar'])\nexport type ChartVisualisation = z.infer<typeof chartVisualisationZ>\n\nexport const aggregationOpZ = z.enum(['count', 'sum', 'avg', 'min', 'max'])\nexport type AggregationOpName = z.infer<typeof aggregationOpZ>\n\n// `'all'` collapses the whole window into one bucket (KPI mode).\nexport const aggregationStepZ = z.enum(['day', 'week', 'month', 'year', 'all'])\nexport type AggregationStep = z.infer<typeof aggregationStepZ>\n\nexport const timeRangePresetZ = z.enum(['7d', '30d', '90d', '1y', 'all', 'custom'])\nexport type TimeRangePreset = z.infer<typeof timeRangePresetZ>\n\n/** Tile width on the dashboard grid. `'half'` = 1 of 2 columns at md+, `'full'` = full row. */\nexport const chartWidthZ = z.enum(['half', 'full'])\nexport type ChartWidth = z.infer<typeof chartWidthZ>\n\n/**\n * Time range stored on a chart. Presets resolve to concrete from/to at\n * render time so cards always reflect \"now\" without re-saving.\n */\nexport const timeRangeZ = z.discriminatedUnion('preset', [\n z.object({ preset: z.enum(['7d', '30d', '90d', '1y', 'all']) }),\n z.object({\n preset: z.literal('custom'),\n from: z.iso.date(),\n to: z.iso.date(),\n }),\n])\nexport type TimeRange = z.infer<typeof timeRangeZ>\n\n/**\n * One step of the presentation-only value pipeline applied client-side\n * before charting (so axis, tooltip and KPI values agree), e.g.\n * `{ op: 'divide', value: 100 }` to show cents as dollars.\n */\nexport const chartTransformStepZ = z.object({\n op: z.enum(['divide', 'multiply', 'add', 'subtract']),\n value: z.number().finite(),\n})\nexport type ChartTransformStep = z.infer<typeof chartTransformStepZ>\n\n/**\n * Display formatting applied at render time via `Intl.NumberFormat`.\n * Note: `percent` follows Intl semantics (0.42 → \"42%\"). `compact`\n * abbreviates large values (12.5k / 1.2M).\n */\nexport const chartFormatZ = z.object({\n style: z.enum(['number', 'currency', 'percent']).default('number'),\n /** ISO 4217 code; render layer falls back to 'USD' when absent. */\n currency: z.string().length(3).optional(),\n decimals: z.number().int().min(0).max(6).optional(),\n prefix: z.string().max(8).optional(),\n suffix: z.string().max(8).optional(),\n compact: z.boolean().optional(),\n})\nexport type ChartFormat = z.infer<typeof chartFormatZ>\n\n/**\n * Per-series style overrides, keyed by the stable series key\n * (`__total__`, a groupBy value, `__other__`, …) — never by display label.\n * Absent series fall back to the palette color for their index.\n */\nexport const seriesStyleZ = z.object({\n color: z\n .string()\n .regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/)\n .optional(),\n})\nexport type SeriesStyle = z.infer<typeof seriesStyleZ>\n\nexport const chartDefZ = z\n .object({\n id: z.uuid(),\n title: z.string().max(120).default(''),\n resource: z.string().min(1),\n visualisation: chartVisualisationZ,\n /** Property path of the date/datetime column used for X-axis bucketing. */\n dateField: z.string().min(1),\n /** Time bucket granularity. KPI charts always use `'all'`. */\n step: aggregationStepZ,\n metric: aggregationOpZ,\n /** Required for non-count metrics. */\n field: z.string().min(1).optional(),\n /** Optional secondary breakdown — produces one series per distinct value. */\n groupBy: z.string().min(1).optional(),\n /** Maximum series count for `groupBy`-charts; rest collapses to \"other\". */\n topN: z.number().int().min(1).max(50).default(10),\n /**\n * When `groupBy` produces FK ids (reference property), the analytics\n * endpoint resolves them to human-readable titles via `findMany` on this\n * resource id. Auto-set by the chart builder when it detects a reference\n * property in the `groupBy` selector.\n */\n groupByLabelResource: z.string().min(1).optional(),\n width: chartWidthZ.default('half'),\n filters: z.record(z.string(), z.string()).default({}),\n /**\n * Property paths exposed as \"quick filters\" above the chart on the\n * dashboard tile. Their values are taken from `filters` but the widget\n * lets the user tweak them inline and apply via a dedicated Apply button.\n */\n quickFilters: z.array(z.string()).default([]),\n timeRange: timeRangeZ,\n /** Per-series style overrides keyed by stable series key. */\n series: z.record(z.string(), seriesStyleZ).optional(),\n /** Presentation-only value pipeline, applied in order before charting. */\n transform: z.array(chartTransformStepZ).max(8).default([]),\n /** Display number format for axis / tooltip / KPI values. */\n format: chartFormatZ.optional(),\n /**\n * Overlay the equal-length preceding window as a dashed series and show\n * the period-over-period delta next to the title. Only honoured for\n * charts without `groupBy` (top-N keys are not stable across windows).\n */\n comparePrevious: z.boolean().default(false),\n /**\n * Optional group membership. `undefined` means the chart is not assigned\n * to any group yet — when at least one group exists, ungrouped charts\n * are bucketed into the first group (by `order`) at display time.\n */\n groupId: z.uuid().optional(),\n /** Sort key within a group; lower numbers come first. Defaults to 0. */\n order: z.number().int().default(0),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n })\n .refine((c) => c.metric === 'count' || !!c.field, {\n message: 'field is required when metric is not count',\n path: ['field'],\n })\n .refine((c) => c.visualisation !== 'kpi' || c.step === 'all', {\n message: \"KPI charts must use step 'all'\",\n path: ['step'],\n })\n .refine((c) => c.visualisation === 'kpi' || c.step !== 'all', {\n message: \"non-KPI charts cannot use step 'all'\",\n path: ['step'],\n })\n\nexport type ChartDef = z.infer<typeof chartDefZ>\nexport type ChartDefInput = z.input<typeof chartDefZ>\n\n/**\n * Group of charts on the dashboard. Groups are rendered as tabs above the\n * charts grid. When the user creates the very first group, all existing\n * (ungrouped) charts are auto-assigned to it.\n */\nexport const chartGroupZ = z.object({\n id: z.uuid(),\n name: z.string().min(1).max(120),\n /** Sort key for the tab strip; lower numbers come first. */\n order: z.number().int().default(0),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n})\nexport type ChartGroup = z.infer<typeof chartGroupZ>\nexport type ChartGroupInput = z.input<typeof chartGroupZ>\n\nexport const dashboardBlobZ = z.object({\n version: z.literal(1),\n charts: z.array(chartDefZ),\n /** Optional — legacy blobs without `groups` parse cleanly via `.default([])`. */\n groups: z.array(chartGroupZ).default([]),\n})\nexport type DashboardBlob = z.infer<typeof dashboardBlobZ>\n\nexport const EMPTY_DASHBOARD: DashboardBlob = { version: 1, charts: [], groups: [] }\n\n/**\n * Per-user dashboard storage port. Default implementation in\n * `@modern-admin/react` is browser-localStorage; a server-side store\n * implementing this same shape can be plugged in later without UI changes.\n */\nexport interface IDashboardStore {\n load(userId: string): Promise<DashboardBlob> | DashboardBlob\n\n save(userId: string, blob: DashboardBlob): Promise<void> | void\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport {\n EMPTY_DASHBOARD,\n dashboardBlobZ,\n uuidv7,\n type ChartDef,\n type ChartDefInput,\n type ChartGroup,\n type DashboardBlob,\n type IDashboardStore,\n type TimeRange,\n} from '@modern-admin/core'\nimport type { AdminClient, TimeSeriesMetric, TimeSeriesStep } from './client.js'\n\nconst STORAGE_PREFIX = 'modern-admin:dashboard:v1:'\nconst ANON_USER = '__anon__'\n\n/**\n * localStorage-backed `IDashboardStore`. Persists one blob per user under\n * `modern-admin:dashboard:v1:<userId>` so multiple admins on the same\n * browser do not see each other's charts.\n *\n * SSR-safe: `typeof window` checks gate every access; on the server load()\n * returns `EMPTY_DASHBOARD` and save() is a no-op.\n */\nexport class LocalStorageDashboardStore implements IDashboardStore {\n load(userId: string): DashboardBlob {\n if (typeof window === 'undefined') return EMPTY_DASHBOARD\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + (userId || ANON_USER))\n if (!raw) return EMPTY_DASHBOARD\n const parsed = JSON.parse(raw) as unknown\n const result = dashboardBlobZ.safeParse(parsed)\n // Legacy bare-array shapes and other malformed blobs reset to empty\n // rather than crashing the dashboard.\n return result.success ? result.data : EMPTY_DASHBOARD\n } catch {\n return EMPTY_DASHBOARD\n }\n }\n\n save(userId: string, blob: DashboardBlob): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + (userId || ANON_USER),\n JSON.stringify(blob),\n )\n } catch {\n // Quota exceeded / private mode — silently drop.\n }\n }\n}\n\nconst defaultStore = new LocalStorageDashboardStore()\n\n/**\n * Server-backed `IDashboardStore` that persists per-user dashboard layouts\n * via `GET/PUT /admin/api/dashboard`. Requires `configStore` to be wired in\n * `ModernAdminModule.forRoot()`. Falls back gracefully when the endpoint\n * returns an empty dashboard (e.g. first load or missing configStore).\n */\nexport class ServerDashboardStore implements IDashboardStore {\n constructor(private readonly client: AdminClient) {}\n\n async load(_userId: string): Promise<DashboardBlob> {\n try {\n const res = await this.client.loadDashboard()\n return res.dashboard\n } catch {\n return EMPTY_DASHBOARD\n }\n }\n\n async save(_userId: string, blob: DashboardBlob): Promise<void> {\n try {\n await this.client.saveDashboard(blob)\n } catch {\n // Server unavailable — silently drop. The next save attempt will retry.\n }\n }\n}\n\n// ─── Time-range helpers ──────────────────────────────────────────────────\n\n/**\n * Resolve a `TimeRange` (preset or explicit custom) into concrete\n * inclusive `from`/`to` `YYYY-MM-DD` strings. Presets are anchored to\n * `now` so cards always reflect \"the last N days\" without re-saving.\n *\n * `'all'` resolves to a 10-year window ending at `now`, which is wide\n * enough for any realistic admin dataset while keeping the server's\n * date-range constraint satisfied.\n */\nexport function resolveRange(\n range: TimeRange,\n now: Date = new Date(),\n): { from: string; to: string } {\n if (range.preset === 'custom') return { from: range.from, to: range.to }\n const days =\n range.preset === '7d' ? 7\n : range.preset === '30d' ? 30\n : range.preset === '90d' ? 90\n : range.preset === '1y' ? 365\n : 3650 // 'all' → 10 years\n const to = new Date(now)\n const from = new Date(now)\n from.setDate(from.getDate() - days)\n return { from: ymd(from), to: ymd(to) }\n}\n\n/**\n * Equal-length window immediately preceding `[from, to]`.\n */\nexport function previousRangeOf(\n range: { from: string; to: string },\n): { from: string; to: string } | null {\n const f = new Date(range.from).getTime()\n const t = new Date(range.to).getTime()\n if (isNaN(f) || isNaN(t) || t < f) return null\n const span = t - f\n const prevTo = new Date(f - 86_400_000)\n const prevFrom = new Date(prevTo.getTime() - span)\n return { from: ymd(prevFrom), to: ymd(prevTo) }\n}\n\nconst ymd = (d: Date): string => d.toISOString().slice(0, 10)\n\n// ─── Reload signal ───────────────────────────────────────────────────────\n\n/**\n * Module-scoped pub/sub so external code (e.g. AI assistant widget after a\n * chart mutation) can force the dashboard to reload its blob from the store\n * without lifting state up. Subscribers are notified asynchronously.\n */\nconst dashboardReloadListeners = new Set<() => void>()\n\n/** Signal every mounted `useDashboardCharts` hook to reload from its store. */\nexport function emitDashboardReload(): void {\n for (const listener of dashboardReloadListeners) {\n try {\n listener()\n } catch {\n // Listener errors must not block sibling listeners.\n }\n }\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────────\n\nexport interface UseDashboardChartsOptions {\n /** Used to scope the storage key. `null`/`undefined` defers loading. */\n userId: string | null | undefined\n /** Override the default localStorage store (e.g. server-backed in future). */\n store?: IDashboardStore\n}\n\nexport interface UseDashboardChartsResult {\n charts: ChartDef[]\n /** Groups defined on the dashboard, sorted by `order` ascending. */\n groups: ChartGroup[]\n /** True until the initial load has resolved (relevant for async stores). */\n isLoading: boolean\n /** Append a new chart. Auto-assigns to the first group when groups exist and no `groupId` is provided. */\n addChart(input: ChartDefInput): void\n updateChart(id: string, input: ChartDefInput): void\n removeChart(id: string): void\n /**\n * Create a new group. When this is the very first group, every existing\n * (ungrouped) chart is moved into it so the user keeps the same view.\n * Returns the new group id so callers can switch to it.\n */\n addGroup(input: { name: string; order?: number }): string\n updateGroup(id: string, patch: { name?: string; order?: number }): void\n /** Remove a group AND every chart assigned to it. */\n removeGroup(id: string): void\n}\n\n/**\n * Per-user dashboard chart registry backed by `IDashboardStore` (default:\n * `LocalStorageDashboardStore`). When `userId` is null/undefined the hook\n * returns an empty list and ignores writes — used while\n * `useCurrentUser()` is still loading.\n */\nexport function useDashboardCharts(\n options: UseDashboardChartsOptions,\n): UseDashboardChartsResult {\n const { userId, store = defaultStore } = options\n const [charts, setCharts] = useState<ChartDef[]>([])\n const [groups, setGroups] = useState<ChartGroup[]>([])\n const [isLoading, setIsLoading] = useState(true)\n // Bumping this counter re-runs the load effect; used by external\n // `emitDashboardReload()` callers (e.g. AI assistant widget) so the hook\n // can pick up changes other actors made to the underlying store.\n const [reloadTick, setReloadTick] = useState(0)\n\n // Reload whenever `userId` flips (login / logout / switch) or an external\n // reload is signalled.\n useEffect(() => {\n if (!userId) {\n setCharts([])\n setIsLoading(false)\n return\n }\n let cancelled = false\n setIsLoading(true)\n Promise.resolve(store.load(userId)).then((blob) => {\n if (cancelled) return\n setCharts(blob.charts)\n setGroups([...blob.groups].sort(byOrderThenCreated))\n setIsLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [userId, store, reloadTick])\n\n // Subscribe to module-scoped reload signal.\n useEffect(() => {\n const listener = (): void => setReloadTick((tick) => tick + 1)\n dashboardReloadListeners.add(listener)\n return () => {\n dashboardReloadListeners.delete(listener)\n }\n }, [])\n\n // Single persist that writes BOTH charts and groups so a partial update\n // never strands one in localStorage while overwriting the other.\n const persist = useCallback(\n (nextCharts: ChartDef[], nextGroups: ChartGroup[]): void => {\n setCharts(nextCharts)\n setGroups([...nextGroups].sort(byOrderThenCreated))\n if (!userId) return\n void Promise.resolve(\n store.save(userId, { version: 1, charts: nextCharts, groups: nextGroups }),\n )\n },\n [userId, store],\n )\n\n const addChart = useCallback(\n (input: ChartDefInput): void => {\n const now = new Date().toISOString()\n // When groups exist and the caller didn't pick one, fall back to the\n // first-ordered group so the new chart is visible somewhere.\n const fallbackGroupId = input.groupId ?? groups[0]?.id\n const def = {\n ...input,\n id: uuidv7(),\n title: input.title ?? '',\n filters: input.filters ?? {},\n ...(fallbackGroupId ? { groupId: fallbackGroupId } : {}),\n createdAt: now,\n updatedAt: now,\n } as ChartDef\n persist([...charts, def], groups)\n },\n [charts, groups, persist],\n )\n\n const updateChart = useCallback(\n (id: string, input: ChartDefInput): void => {\n persist(\n charts.map((c) =>\n c.id === id\n ? ({\n ...c,\n ...input,\n id,\n title: input.title ?? '',\n filters: input.filters ?? {},\n createdAt: c.createdAt,\n updatedAt: new Date().toISOString(),\n } as ChartDef)\n : c,\n ),\n groups,\n )\n },\n [charts, groups, persist],\n )\n\n const removeChart = useCallback(\n (id: string): void => {\n persist(charts.filter((c) => c.id !== id), groups)\n },\n [charts, groups, persist],\n )\n\n const addGroup = useCallback(\n (input: { name: string; order?: number }): string => {\n const now = new Date().toISOString()\n const id = uuidv7()\n const next: ChartGroup = {\n id,\n name: input.name,\n order: input.order ?? groups.length,\n createdAt: now,\n updatedAt: now,\n }\n // First-group rule: existing ungrouped charts join this group so the\n // user does not lose their current dashboard view.\n const isFirstGroup = groups.length === 0\n const nextCharts = isFirstGroup\n ? charts.map((c) => (c.groupId ? c : { ...c, groupId: id, updatedAt: now }))\n : charts\n persist(nextCharts, [...groups, next])\n return id\n },\n [charts, groups, persist],\n )\n\n const updateGroup = useCallback(\n (id: string, patch: { name?: string; order?: number }): void => {\n const now = new Date().toISOString()\n persist(\n charts,\n groups.map((g) =>\n g.id === id\n ? {\n ...g,\n ...(patch.name !== undefined ? { name: patch.name } : {}),\n ...(patch.order !== undefined ? { order: patch.order } : {}),\n updatedAt: now,\n }\n : g,\n ),\n )\n },\n [charts, groups, persist],\n )\n\n const removeGroup = useCallback(\n (id: string): void => {\n // Cascading delete: every chart assigned to the group disappears with it.\n persist(charts.filter((c) => c.groupId !== id), groups.filter((g) => g.id !== id))\n },\n [charts, groups, persist],\n )\n\n return {\n charts,\n groups,\n isLoading,\n addChart,\n updateChart,\n removeChart,\n addGroup,\n updateGroup,\n removeGroup,\n }\n}\n\n/** Stable sort: by `order` ascending, then by `createdAt` for tie-breaking. */\nfunction byOrderThenCreated(a: { order: number; createdAt: string }, b: { order: number; createdAt: string }): number {\n if (a.order !== b.order) return a.order - b.order\n return a.createdAt.localeCompare(b.createdAt)\n}\n\n// Re-export types from client for convenience so consumers import from one place.\nexport type { TimeSeriesMetric, TimeSeriesStep }\nexport type { ChartDef, ChartDefInput, ChartGroup } from '@modern-admin/core'\n"],"mappings":"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"}