@modern-admin/web 0.6.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 (315) 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 +2 -2
  4. package/dist/lib/index.js +4 -1
  5. package/dist/lib/runtime-config.d.ts +28 -2
  6. package/dist/standalone/assets/{action-component-host-8DE4kuUJ.js → action-component-host-Cch_SQOc.js} +1 -2
  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-D6BbXzUo.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-BORa8_hT.js → ai-assistant-widget-DC9Li4zI.js} +1 -2
  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 -2
  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-CdW_Z0lB.js +1 -2
  20. package/dist/standalone/assets/bot-CuDPD_ZU.js +1 -2
  21. package/dist/standalone/assets/{cache-page-CBKj7WFq.js → cache-page-D6YyRm0a.js} +1 -2
  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 -2
  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 -2
  34. package/dist/standalone/assets/circle-alert-D1sKnXtO.js +1 -2
  35. package/dist/standalone/assets/clock-B9qbSr_k.js +1 -2
  36. package/dist/standalone/assets/{command-BAXXxf0P.js → command-D25Gk8Ov.js} +1 -2
  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 -2
  40. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js +1 -2
  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-COXu-_Zv.js → dist-B4BiJqz7.js} +1 -2
  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 -2
  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 -2
  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 -2
  59. package/dist/standalone/assets/{empty-DMs98grx.js → empty-BUKxdeYB.js} +1 -2
  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-MQF--yeB.js +1 -2
  63. package/dist/standalone/assets/floating-layer-BcTp2AMB.js +1 -2
  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-LnhreUPp.js → heavy-fields-BMTsLOom.js} +26 -27
  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-DiDOzuic.js → home-page-DKd5Im5n.js} +3 -4
  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-BiOfAnEq.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-s31CNk7M.js → icon-registry-CNZsLqJm.js} +1 -2
  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-D_weBQAa.js +14 -0
  82. package/dist/standalone/assets/index-D_weBQAa.js.br +0 -0
  83. package/dist/standalone/assets/index-D_weBQAa.js.gz +0 -0
  84. package/dist/standalone/assets/info-ChwYoM77.js +1 -2
  85. package/dist/standalone/assets/{json-editor-BD0UhGOT.js → json-editor--WP9_q0O.js} +1 -2
  86. package/dist/standalone/assets/json-editor--WP9_q0O.js.br +0 -0
  87. package/dist/standalone/assets/json-editor--WP9_q0O.js.gz +0 -0
  88. package/dist/standalone/assets/key-BzJFbNbz.js +1 -2
  89. package/dist/standalone/assets/key-round-oSqmVdkQ.js +1 -2
  90. package/dist/standalone/assets/minimize-2-iWv98HjE.js +1 -2
  91. package/dist/standalone/assets/palette-jgTV28yN.js +1 -2
  92. package/dist/standalone/assets/pencil-kFOObGrY.js +1 -2
  93. package/dist/standalone/assets/pipette-roLBCmPv.js +1 -2
  94. package/dist/standalone/assets/pipette-roLBCmPv.js.br +0 -0
  95. package/dist/standalone/assets/pipette-roLBCmPv.js.gz +0 -0
  96. package/dist/standalone/assets/plus-D7PHzena.js +1 -2
  97. package/dist/standalone/assets/property-renderer-CqISwCnB.js +3 -0
  98. package/dist/standalone/assets/property-renderer-CqISwCnB.js.br +0 -0
  99. package/dist/standalone/assets/property-renderer-CqISwCnB.js.gz +0 -0
  100. package/dist/standalone/assets/reference-tHFrlwlu.js +1 -0
  101. package/dist/standalone/assets/reference-tHFrlwlu.js.br +0 -0
  102. package/dist/standalone/assets/reference-tHFrlwlu.js.gz +0 -0
  103. package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js +1 -2
  104. package/dist/standalone/assets/{revisions-button-Csueldv_.js → revisions-button-DUOp7SdS.js} +1 -2
  105. package/dist/standalone/assets/revisions-button-DUOp7SdS.js.br +0 -0
  106. package/dist/standalone/assets/revisions-button-DUOp7SdS.js.gz +0 -0
  107. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js +1 -2
  108. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.br +0 -0
  109. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.gz +0 -0
  110. package/dist/standalone/assets/rotate-ccw-AB1VcvbK.js +1 -2
  111. package/dist/standalone/assets/save-BkkrgP5Q.js +1 -2
  112. package/dist/standalone/assets/schemas-ByMQmMCS.js +1 -2
  113. package/dist/standalone/assets/schemas-ByMQmMCS.js.br +0 -0
  114. package/dist/standalone/assets/schemas-ByMQmMCS.js.gz +0 -0
  115. package/dist/standalone/assets/{select-BOe2daO9.js → select-CNvBRk3J.js} +1 -2
  116. package/dist/standalone/assets/select-CNvBRk3J.js.br +0 -0
  117. package/dist/standalone/assets/select-CNvBRk3J.js.gz +0 -0
  118. package/dist/standalone/assets/send-Bzb_4uMT.js +1 -2
  119. package/dist/standalone/assets/settings-page-SE19h-6J.js +1 -0
  120. package/dist/standalone/assets/settings-page-SE19h-6J.js.br +0 -0
  121. package/dist/standalone/assets/settings-page-SE19h-6J.js.gz +0 -0
  122. package/dist/standalone/assets/{show-page-CDgUXhsx.js → show-page-Bl5uqPGq.js} +1 -2
  123. package/dist/standalone/assets/show-page-Bl5uqPGq.js.br +0 -0
  124. package/dist/standalone/assets/show-page-Bl5uqPGq.js.gz +0 -0
  125. package/dist/standalone/assets/sparkles-1tT0H4n4.js +1 -2
  126. package/dist/standalone/assets/square-pen-ZvVEwkzw.js +1 -2
  127. package/dist/standalone/assets/table-RI-lM4fw.js +1 -2
  128. package/dist/standalone/assets/table-RI-lM4fw.js.br +0 -0
  129. package/dist/standalone/assets/table-RI-lM4fw.js.gz +0 -0
  130. package/dist/standalone/assets/{tabs-Bj4gQaH2.js → tabs-bJ8DvO_f.js} +1 -2
  131. package/dist/standalone/assets/tabs-bJ8DvO_f.js.br +0 -0
  132. package/dist/standalone/assets/tabs-bJ8DvO_f.js.gz +0 -0
  133. package/dist/standalone/assets/textarea-C2w7TG3h.js +1 -2
  134. package/dist/standalone/assets/trash-2-BIJVpWxv.js +1 -2
  135. package/dist/standalone/assets/triangle-alert-yljVpQCM.js +1 -2
  136. package/dist/standalone/assets/undo-2-CnH3ScKE.js +1 -2
  137. package/dist/standalone/assets/undo-2-CnH3ScKE.js.br +0 -0
  138. package/dist/standalone/assets/undo-2-CnH3ScKE.js.gz +0 -0
  139. package/dist/standalone/assets/upload-DrfB-4bU.js +1 -2
  140. package/dist/standalone/assets/upload-DrfB-4bU.js.br +0 -0
  141. package/dist/standalone/assets/upload-DrfB-4bU.js.gz +0 -0
  142. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js +1 -2
  143. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.br +0 -0
  144. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.gz +0 -0
  145. package/dist/standalone/assets/{useQueries-DNUnShBb.js → useQueries-ClcMJqXb.js} +1 -2
  146. package/dist/standalone/assets/useQueries-ClcMJqXb.js.br +0 -0
  147. package/dist/standalone/assets/useQueries-ClcMJqXb.js.gz +0 -0
  148. package/dist/standalone/assets/{user-directory-BvmDzxsG.js → user-directory-DxioDri9.js} +2 -3
  149. package/dist/standalone/assets/user-directory-DxioDri9.js.br +0 -0
  150. package/dist/standalone/assets/user-directory-DxioDri9.js.gz +0 -0
  151. package/dist/standalone/assets/uuid-DLSnbsz2.js +1 -2
  152. package/dist/standalone/assets/wand-sparkles-DwseTI5T.js +1 -2
  153. package/dist/standalone/assets/wizard-create-page-u_8xKlPY.js +1 -0
  154. package/dist/standalone/assets/wizard-create-page-u_8xKlPY.js.br +0 -0
  155. package/dist/standalone/assets/wizard-create-page-u_8xKlPY.js.gz +0 -0
  156. package/dist/standalone/assets/x-c-gfVPJa.js +1 -2
  157. package/dist/standalone/assets/zap-BxPAEPtJ.js +1 -2
  158. package/dist/standalone/assets/zod-B9XvCD94.js +1 -0
  159. package/dist/standalone/assets/zod-B9XvCD94.js.br +0 -0
  160. package/dist/standalone/assets/zod-B9XvCD94.js.gz +0 -0
  161. package/dist/standalone/index.html +6 -6
  162. package/dist/standalone/index.html.br +0 -0
  163. package/dist/standalone/index.html.gz +0 -0
  164. package/package.json +6 -5
  165. package/src/app.tsx +3 -0
  166. package/src/runtime-config.ts +28 -2
  167. package/src/vite.ts +16 -1
  168. package/dist/lib/app.d.ts.map +0 -1
  169. package/dist/lib/index.d.ts.map +0 -1
  170. package/dist/lib/index.js.map +0 -1
  171. package/dist/lib/mount.d.ts.map +0 -1
  172. package/dist/lib/runtime-config.d.ts.map +0 -1
  173. package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.br +0 -0
  174. package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.gz +0 -0
  175. package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.map +0 -1
  176. package/dist/standalone/assets/action-page-D6BbXzUo.js.br +0 -0
  177. package/dist/standalone/assets/action-page-D6BbXzUo.js.gz +0 -0
  178. package/dist/standalone/assets/action-page-D6BbXzUo.js.map +0 -1
  179. package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.br +0 -0
  180. package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.gz +0 -0
  181. package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.map +0 -1
  182. package/dist/standalone/assets/arrow-left-yVCaEJJu.js.map +0 -1
  183. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js +0 -2
  184. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.br +0 -0
  185. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.gz +0 -0
  186. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.map +0 -1
  187. package/dist/standalone/assets/badge-CdW_Z0lB.js.map +0 -1
  188. package/dist/standalone/assets/bot-CuDPD_ZU.js.map +0 -1
  189. package/dist/standalone/assets/cache-page-CBKj7WFq.js.br +0 -0
  190. package/dist/standalone/assets/cache-page-CBKj7WFq.js.gz +0 -0
  191. package/dist/standalone/assets/cache-page-CBKj7WFq.js.map +0 -1
  192. package/dist/standalone/assets/calendar-BuLRvNBg.js +0 -2
  193. package/dist/standalone/assets/calendar-BuLRvNBg.js.br +0 -0
  194. package/dist/standalone/assets/calendar-BuLRvNBg.js.gz +0 -0
  195. package/dist/standalone/assets/calendar-BuLRvNBg.js.map +0 -1
  196. package/dist/standalone/assets/card-BYbadRar.js.map +0 -1
  197. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js +0 -2
  198. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.br +0 -0
  199. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.gz +0 -0
  200. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.map +0 -1
  201. package/dist/standalone/assets/chevrons-up-down-y29_Sm-3.js.map +0 -1
  202. package/dist/standalone/assets/circle-alert-D1sKnXtO.js.map +0 -1
  203. package/dist/standalone/assets/clock-B9qbSr_k.js.map +0 -1
  204. package/dist/standalone/assets/command-BAXXxf0P.js.br +0 -0
  205. package/dist/standalone/assets/command-BAXXxf0P.js.gz +0 -0
  206. package/dist/standalone/assets/command-BAXXxf0P.js.map +0 -1
  207. package/dist/standalone/assets/copy-5fb4qj-_.js.map +0 -1
  208. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.map +0 -1
  209. package/dist/standalone/assets/date-picker-Bxv-yrWf.js +0 -2
  210. package/dist/standalone/assets/date-picker-Bxv-yrWf.js.br +0 -0
  211. package/dist/standalone/assets/date-picker-Bxv-yrWf.js.gz +0 -0
  212. package/dist/standalone/assets/date-picker-Bxv-yrWf.js.map +0 -1
  213. package/dist/standalone/assets/dist-COXu-_Zv.js.br +0 -0
  214. package/dist/standalone/assets/dist-COXu-_Zv.js.gz +0 -0
  215. package/dist/standalone/assets/dist-COXu-_Zv.js.map +0 -1
  216. package/dist/standalone/assets/dist-CiXwD0ML.js.map +0 -1
  217. package/dist/standalone/assets/dist-DPxQeZn3.js.map +0 -1
  218. package/dist/standalone/assets/edit-page-Dm638D2J.js +0 -2
  219. package/dist/standalone/assets/edit-page-Dm638D2J.js.br +0 -0
  220. package/dist/standalone/assets/edit-page-Dm638D2J.js.gz +0 -0
  221. package/dist/standalone/assets/edit-page-Dm638D2J.js.map +0 -1
  222. package/dist/standalone/assets/ellipsis-BRmOlhsy.js.map +0 -1
  223. package/dist/standalone/assets/empty-DMs98grx.js.br +0 -0
  224. package/dist/standalone/assets/empty-DMs98grx.js.gz +0 -0
  225. package/dist/standalone/assets/empty-DMs98grx.js.map +0 -1
  226. package/dist/standalone/assets/file-text-MQF--yeB.js.map +0 -1
  227. package/dist/standalone/assets/floating-layer-BcTp2AMB.js.map +0 -1
  228. package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js +0 -2
  229. package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.br +0 -0
  230. package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.gz +0 -0
  231. package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.map +0 -1
  232. package/dist/standalone/assets/heavy-fields-LnhreUPp.js.br +0 -0
  233. package/dist/standalone/assets/heavy-fields-LnhreUPp.js.gz +0 -0
  234. package/dist/standalone/assets/heavy-fields-LnhreUPp.js.map +0 -1
  235. package/dist/standalone/assets/home-page-DiDOzuic.js.br +0 -0
  236. package/dist/standalone/assets/home-page-DiDOzuic.js.gz +0 -0
  237. package/dist/standalone/assets/home-page-DiDOzuic.js.map +0 -1
  238. package/dist/standalone/assets/hooks-BiOfAnEq.js.br +0 -0
  239. package/dist/standalone/assets/hooks-BiOfAnEq.js.gz +0 -0
  240. package/dist/standalone/assets/hooks-BiOfAnEq.js.map +0 -1
  241. package/dist/standalone/assets/icon-registry-s31CNk7M.js.br +0 -0
  242. package/dist/standalone/assets/icon-registry-s31CNk7M.js.gz +0 -0
  243. package/dist/standalone/assets/icon-registry-s31CNk7M.js.map +0 -1
  244. package/dist/standalone/assets/index-CASCzvYu.js +0 -15
  245. package/dist/standalone/assets/index-CASCzvYu.js.br +0 -0
  246. package/dist/standalone/assets/index-CASCzvYu.js.gz +0 -0
  247. package/dist/standalone/assets/index-CASCzvYu.js.map +0 -1
  248. package/dist/standalone/assets/info-ChwYoM77.js.map +0 -1
  249. package/dist/standalone/assets/json-editor-BD0UhGOT.js.br +0 -0
  250. package/dist/standalone/assets/json-editor-BD0UhGOT.js.gz +0 -0
  251. package/dist/standalone/assets/json-editor-BD0UhGOT.js.map +0 -1
  252. package/dist/standalone/assets/key-BzJFbNbz.js.map +0 -1
  253. package/dist/standalone/assets/key-round-oSqmVdkQ.js.map +0 -1
  254. package/dist/standalone/assets/minimize-2-iWv98HjE.js.map +0 -1
  255. package/dist/standalone/assets/palette-jgTV28yN.js.map +0 -1
  256. package/dist/standalone/assets/pencil-kFOObGrY.js.map +0 -1
  257. package/dist/standalone/assets/pipette-roLBCmPv.js.map +0 -1
  258. package/dist/standalone/assets/plus-D7PHzena.js.map +0 -1
  259. package/dist/standalone/assets/property-renderer-ClrVnSny.js +0 -4
  260. package/dist/standalone/assets/property-renderer-ClrVnSny.js.br +0 -0
  261. package/dist/standalone/assets/property-renderer-ClrVnSny.js.gz +0 -0
  262. package/dist/standalone/assets/property-renderer-ClrVnSny.js.map +0 -1
  263. package/dist/standalone/assets/reference-BMbhUBHD.js +0 -2
  264. package/dist/standalone/assets/reference-BMbhUBHD.js.br +0 -0
  265. package/dist/standalone/assets/reference-BMbhUBHD.js.gz +0 -0
  266. package/dist/standalone/assets/reference-BMbhUBHD.js.map +0 -1
  267. package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js.map +0 -1
  268. package/dist/standalone/assets/revisions-button-Csueldv_.js.br +0 -0
  269. package/dist/standalone/assets/revisions-button-Csueldv_.js.gz +0 -0
  270. package/dist/standalone/assets/revisions-button-Csueldv_.js.map +0 -1
  271. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.map +0 -1
  272. package/dist/standalone/assets/rotate-ccw-AB1VcvbK.js.map +0 -1
  273. package/dist/standalone/assets/save-BkkrgP5Q.js.map +0 -1
  274. package/dist/standalone/assets/schemas-ByMQmMCS.js.map +0 -1
  275. package/dist/standalone/assets/select-BOe2daO9.js.br +0 -0
  276. package/dist/standalone/assets/select-BOe2daO9.js.gz +0 -0
  277. package/dist/standalone/assets/select-BOe2daO9.js.map +0 -1
  278. package/dist/standalone/assets/send-Bzb_4uMT.js.map +0 -1
  279. package/dist/standalone/assets/settings-page-BmphreWj.js +0 -2
  280. package/dist/standalone/assets/settings-page-BmphreWj.js.br +0 -0
  281. package/dist/standalone/assets/settings-page-BmphreWj.js.gz +0 -0
  282. package/dist/standalone/assets/settings-page-BmphreWj.js.map +0 -1
  283. package/dist/standalone/assets/show-page-CDgUXhsx.js.br +0 -0
  284. package/dist/standalone/assets/show-page-CDgUXhsx.js.gz +0 -0
  285. package/dist/standalone/assets/show-page-CDgUXhsx.js.map +0 -1
  286. package/dist/standalone/assets/sparkles-1tT0H4n4.js.map +0 -1
  287. package/dist/standalone/assets/square-pen-ZvVEwkzw.js.map +0 -1
  288. package/dist/standalone/assets/table-RI-lM4fw.js.map +0 -1
  289. package/dist/standalone/assets/tabs-Bj4gQaH2.js.br +0 -0
  290. package/dist/standalone/assets/tabs-Bj4gQaH2.js.gz +0 -0
  291. package/dist/standalone/assets/tabs-Bj4gQaH2.js.map +0 -1
  292. package/dist/standalone/assets/textarea-C2w7TG3h.js.map +0 -1
  293. package/dist/standalone/assets/trash-2-BIJVpWxv.js.map +0 -1
  294. package/dist/standalone/assets/triangle-alert-yljVpQCM.js.map +0 -1
  295. package/dist/standalone/assets/undo-2-CnH3ScKE.js.map +0 -1
  296. package/dist/standalone/assets/upload-DrfB-4bU.js.map +0 -1
  297. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.map +0 -1
  298. package/dist/standalone/assets/useQueries-DNUnShBb.js.br +0 -0
  299. package/dist/standalone/assets/useQueries-DNUnShBb.js.gz +0 -0
  300. package/dist/standalone/assets/useQueries-DNUnShBb.js.map +0 -1
  301. package/dist/standalone/assets/user-directory-BvmDzxsG.js.br +0 -0
  302. package/dist/standalone/assets/user-directory-BvmDzxsG.js.gz +0 -0
  303. package/dist/standalone/assets/user-directory-BvmDzxsG.js.map +0 -1
  304. package/dist/standalone/assets/uuid-DLSnbsz2.js.map +0 -1
  305. package/dist/standalone/assets/wand-sparkles-DwseTI5T.js.map +0 -1
  306. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js +0 -2
  307. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.br +0 -0
  308. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.gz +0 -0
  309. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.map +0 -1
  310. package/dist/standalone/assets/x-c-gfVPJa.js.map +0 -1
  311. package/dist/standalone/assets/zap-BxPAEPtJ.js.map +0 -1
  312. package/dist/standalone/assets/zod-2-ubQvxh.js +0 -2
  313. package/dist/standalone/assets/zod-2-ubQvxh.js.br +0 -0
  314. package/dist/standalone/assets/zod-2-ubQvxh.js.gz +0 -0
  315. package/dist/standalone/assets/zod-2-ubQvxh.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-BOe2daO9.js","names":["__defProp","__name","PopperPrimitive.Root","Select","Fragment2","SelectTrigger","PopperPrimitive.Anchor","SelectValue","PortalPrimitive","SelectContent","RemoveScroll","PopperPrimitive.Content","SelectGroup","SelectLabel","SelectItem","SelectScrollUpButton","SelectScrollDownButton","SelectSeparator"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-use-previous@1.1.4+03aa47d54245a271/node_modules/@radix-ui/react-use-previous/dist/index.mjs","../../../../../node_modules/.bun/@radix-ui+react-select@2.3.7+c32617ced709d283/node_modules/@radix-ui/react-select/dist/index.mjs","../../../../ui/src/components/select.tsx"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/use-previous.tsx\nimport * as React from \"react\";\nfunction usePrevious(value) {\n const ref = React.useRef({ value, previous: value });\n return React.useMemo(() => {\n if (ref.current.value !== value) {\n ref.current.previous = ref.current.value;\n ref.current.value = value;\n }\n return ref.current.previous;\n }, [value]);\n}\n__name(usePrevious, \"usePrevious\");\nexport {\n usePrevious\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/select.tsx\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { VISUALLY_HIDDEN_STYLES } from \"@radix-ui/react-visually-hidden\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { Fragment as Fragment2, jsx, jsxs } from \"react/jsx-runtime\";\nvar OPEN_KEYS = [\" \", \"Enter\", \"ArrowUp\", \"ArrowDown\"];\nvar SELECTION_KEYS = [\" \", \"Enter\"];\nvar SELECT_NAME = \"Select\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(SELECT_NAME);\nvar [createSelectContext, createSelectScope] = createContextScope(SELECT_NAME, [\n createCollectionScope,\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [SelectProviderImpl, useSelectContext] = createSelectContext(SELECT_NAME);\nvar [SelectNativeOptionsProvider, useSelectNativeOptionsContext] = createSelectContext(SELECT_NAME);\nfunction SelectProvider(props) {\n const {\n __scopeSelect,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n value: valueProp,\n defaultValue,\n onValueChange,\n dir,\n name,\n autoComplete,\n disabled,\n required,\n form,\n // @ts-expect-error internal render prop used by `Select` to compose its default parts\n internal_do_not_use_render\n } = props;\n const popperScope = usePopperScope(__scopeSelect);\n const [trigger, setTrigger] = React.useState(null);\n const [valueNode, setValueNode] = React.useState(null);\n const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);\n const direction = useDirection(dir);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: SELECT_NAME\n });\n const [value, setValue] = useControllableState({\n prop: valueProp,\n defaultProp: defaultValue,\n onChange: onValueChange,\n caller: SELECT_NAME\n });\n const triggerPointerDownPosRef = React.useRef(null);\n const initialValueRef = React.useRef(value);\n React.useEffect(() => {\n const associatedForm = form ? trigger?.ownerDocument.getElementById(form) : trigger?.form;\n if (associatedForm instanceof HTMLFormElement) {\n const reset = /* @__PURE__ */ __name(() => setValue(initialValueRef.current), \"reset\");\n associatedForm.addEventListener(\"reset\", reset);\n return () => associatedForm.removeEventListener(\"reset\", reset);\n }\n }, [form, trigger, setValue]);\n const isFormControl = trigger ? !!form || !!trigger.closest(\"form\") : true;\n const [nativeOptionsSet, setNativeOptionsSet] = React.useState(/* @__PURE__ */ new Set());\n const contentId = useId();\n const nativeSelectKey = Array.from(nativeOptionsSet).map((option) => option.props.value).join(\";\");\n const handleNativeOptionAdd = React.useCallback((option) => {\n setNativeOptionsSet((prev) => new Set(prev).add(option));\n }, []);\n const handleNativeOptionRemove = React.useCallback((option) => {\n setNativeOptionsSet((prev) => {\n const optionsSet = new Set(prev);\n optionsSet.delete(option);\n return optionsSet;\n });\n }, []);\n const context = {\n required,\n trigger,\n onTriggerChange: setTrigger,\n valueNode,\n onValueNodeChange: setValueNode,\n valueNodeHasChildren,\n onValueNodeHasChildrenChange: setValueNodeHasChildren,\n contentId,\n value,\n onValueChange: setValue,\n open,\n onOpenChange: setOpen,\n dir: direction,\n triggerPointerDownPosRef,\n disabled,\n name,\n autoComplete,\n form,\n nativeOptions: nativeOptionsSet,\n nativeSelectKey,\n isFormControl\n };\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(SelectProviderImpl, { scope: __scopeSelect, ...context, children: /* @__PURE__ */ jsx(Collection.Provider, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(\n SelectNativeOptionsProvider,\n {\n scope: __scopeSelect,\n onNativeOptionAdd: handleNativeOptionAdd,\n onNativeOptionRemove: handleNativeOptionRemove,\n children: isFunction(internal_do_not_use_render) ? internal_do_not_use_render(context) : children\n }\n ) }) }) });\n}\n__name(SelectProvider, \"SelectProvider\");\nvar Select = /* @__PURE__ */ __name((props) => {\n const { __scopeSelect, children, ...providerProps } = props;\n return /* @__PURE__ */ jsx(\n SelectProvider,\n {\n __scopeSelect,\n ...providerProps,\n internal_do_not_use_render: ({ isFormControl }) => /* @__PURE__ */ jsxs(Fragment2, { children: [\n children,\n isFormControl ? /* @__PURE__ */ jsx(\n SelectBubbleInput,\n {\n __scopeSelect\n }\n ) : null\n ] })\n }\n );\n}, \"Select\");\nvar TRIGGER_NAME = \"SelectTrigger\";\nvar SelectTrigger = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectTrigger2(props, forwardedRef) {\n const { __scopeSelect, disabled = false, ...triggerProps } = props;\n const popperScope = usePopperScope(__scopeSelect);\n const context = useSelectContext(TRIGGER_NAME, __scopeSelect);\n const isDisabled = context.disabled || disabled;\n const composedRefs = useComposedRefs(forwardedRef, context.onTriggerChange);\n const getItems = useCollection(__scopeSelect);\n const pointerTypeRef = React.useRef(\"touch\");\n const [searchRef, handleTypeaheadSearch, resetTypeahead] = useTypeaheadSearch((search) => {\n const enabledItems = getItems().filter((item) => !item.disabled);\n const currentItem = enabledItems.find((item) => item.value === context.value);\n const nextItem = findNextItem(enabledItems, search, currentItem);\n if (nextItem !== void 0) {\n context.onValueChange(nextItem.value);\n }\n });\n const handleOpen = /* @__PURE__ */ __name((pointerEvent) => {\n if (!isDisabled) {\n context.onOpenChange(true);\n resetTypeahead();\n }\n if (pointerEvent) {\n context.triggerPointerDownPosRef.current = {\n x: Math.round(pointerEvent.pageX),\n y: Math.round(pointerEvent.pageY)\n };\n }\n }, \"handleOpen\");\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"combobox\",\n \"aria-controls\": context.open ? context.contentId : void 0,\n \"aria-expanded\": context.open,\n \"aria-required\": context.required,\n \"aria-autocomplete\": \"none\",\n dir: context.dir,\n \"data-state\": context.open ? \"open\" : \"closed\",\n disabled: isDisabled,\n \"data-disabled\": isDisabled ? \"\" : void 0,\n \"data-placeholder\": shouldShowPlaceholder(context.value) ? \"\" : void 0,\n ...triggerProps,\n ref: composedRefs,\n onClick: composeEventHandlers(triggerProps.onClick, (event) => {\n event.currentTarget.focus();\n if (pointerTypeRef.current !== \"mouse\") {\n handleOpen(event);\n }\n }),\n onPointerDown: composeEventHandlers(triggerProps.onPointerDown, (event) => {\n pointerTypeRef.current = event.pointerType;\n const target = event.target;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n if (event.button === 0 && event.ctrlKey === false && event.pointerType === \"mouse\") {\n handleOpen(event);\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(triggerProps.onKeyDown, (event) => {\n const isTypingAhead = searchRef.current !== \"\";\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);\n if (isTypingAhead && event.key === \" \") return;\n if (OPEN_KEYS.includes(event.key)) {\n handleOpen();\n event.preventDefault();\n }\n })\n }\n ) });\n }, \"SelectTrigger\")\n);\nvar VALUE_NAME = \"SelectValue\";\nvar SelectValue = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectValue2(props, forwardedRef) {\n const { __scopeSelect, className, style, children, placeholder = \"\", ...valueProps } = props;\n const context = useSelectContext(VALUE_NAME, __scopeSelect);\n const { onValueNodeHasChildrenChange } = context;\n const hasChildren = children !== void 0;\n const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);\n useLayoutEffect(() => {\n onValueNodeHasChildrenChange(hasChildren);\n }, [onValueNodeHasChildrenChange, hasChildren]);\n const showPlaceholder = shouldShowPlaceholder(context.value);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...valueProps,\n asChild: showPlaceholder ? false : valueProps.asChild,\n ref: composedRefs,\n style: { pointerEvents: \"none\" },\n children: /* @__PURE__ */ jsx(React.Fragment, { children: showPlaceholder ? placeholder : children }, showPlaceholder ? \"placeholder\" : \"value\")\n }\n );\n }, \"SelectValue\")\n);\nvar SelectIcon = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectIcon2(props, forwardedRef) {\n const { __scopeSelect, children, ...iconProps } = props;\n return /* @__PURE__ */ jsx(Primitive.span, { \"aria-hidden\": true, ...iconProps, ref: forwardedRef, children: children || \"\\u25BC\" });\n }, \"SelectIcon\")\n);\nvar PORTAL_NAME = \"SelectPortal\";\nvar [PortalProvider, usePortalContext] = createSelectContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar SelectPortal = /* @__PURE__ */ __name((props) => {\n const { __scopeSelect, forceMount, ...portalProps } = props;\n return /* @__PURE__ */ jsx(PortalProvider, { scope: props.__scopeSelect, forceMount, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, ...portalProps }) });\n}, \"SelectPortal\");\nvar CONTENT_NAME = \"SelectContent\";\nvar SelectContent = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectContent2(props, forwardedRef) {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeSelect);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useSelectContext(CONTENT_NAME, props.__scopeSelect);\n const [fragment, setFragment] = React.useState();\n useLayoutEffect(() => {\n setFragment(new DocumentFragment());\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: ({ present }) => present ? /* @__PURE__ */ jsx(SelectContentImpl, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(SelectContentFragment, { ...contentProps, fragment }) });\n }, \"SelectContent\")\n);\nvar SelectContentFragment = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function SelectContentFragment2(props, forwardedRef) {\n const { __scopeSelect, children, fragment } = props;\n if (!fragment) return null;\n return ReactDOM.createPortal(\n /* @__PURE__ */ jsx(SelectContentProvider, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(\"div\", { ref: forwardedRef, children }) }) }),\n fragment\n );\n}, \"SelectContentFragment\"));\nvar CONTENT_MARGIN = 10;\nvar [SelectContentProvider, useSelectContentContext] = createSelectContext(CONTENT_NAME);\nvar Slot = createSlot(\"SelectContent.RemoveScroll\");\nvar SelectContentImpl = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function SelectContentImpl2(props, forwardedRef) {\n const { __scopeSelect } = props;\n const {\n position = \"item-aligned\",\n onCloseAutoFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n //\n // PopperContent props\n side,\n sideOffset,\n align,\n alignOffset,\n arrowPadding,\n collisionBoundary,\n collisionPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n //\n ...contentProps\n } = props;\n const context = useSelectContext(CONTENT_NAME, __scopeSelect);\n const [content, setContent] = React.useState(null);\n const [viewport, setViewport] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, setContent);\n const [selectedItem, setSelectedItem] = React.useState(null);\n const [selectedItemText, setSelectedItemText] = React.useState(\n null\n );\n const getItems = useCollection(__scopeSelect);\n const [isPositioned, setIsPositioned] = React.useState(false);\n const firstValidItemFoundRef = React.useRef(false);\n React.useEffect(() => {\n if (content) return hideOthers(content);\n }, [content]);\n useFocusGuards();\n const focusFirst = React.useCallback(\n (candidates) => {\n const [firstItem, ...restItems] = getItems().map((item) => item.ref.current);\n const [lastItem] = restItems.slice(-1);\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate?.scrollIntoView({ block: \"nearest\" });\n if (candidate === firstItem && viewport) viewport.scrollTop = 0;\n if (candidate === lastItem && viewport) viewport.scrollTop = viewport.scrollHeight;\n candidate?.focus();\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n },\n [getItems, viewport]\n );\n const focusSelectedItem = React.useCallback(\n () => focusFirst([selectedItem, content]),\n [focusFirst, selectedItem, content]\n );\n React.useEffect(() => {\n if (isPositioned) {\n focusSelectedItem();\n }\n }, [isPositioned, focusSelectedItem]);\n const { onOpenChange, triggerPointerDownPosRef } = context;\n React.useEffect(() => {\n if (content) {\n let pointerMoveDelta = { x: 0, y: 0 };\n const handlePointerMove = /* @__PURE__ */ __name((event) => {\n pointerMoveDelta = {\n x: Math.abs(Math.round(event.pageX) - (triggerPointerDownPosRef.current?.x ?? 0)),\n y: Math.abs(Math.round(event.pageY) - (triggerPointerDownPosRef.current?.y ?? 0))\n };\n }, \"handlePointerMove\");\n const handlePointerUp = /* @__PURE__ */ __name((event) => {\n if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {\n event.preventDefault();\n } else {\n if (!event.composedPath().includes(content)) {\n onOpenChange(false);\n }\n }\n document.removeEventListener(\"pointermove\", handlePointerMove);\n triggerPointerDownPosRef.current = null;\n }, \"handlePointerUp\");\n if (triggerPointerDownPosRef.current !== null) {\n document.addEventListener(\"pointermove\", handlePointerMove);\n document.addEventListener(\"pointerup\", handlePointerUp, { capture: true, once: true });\n }\n return () => {\n document.removeEventListener(\"pointermove\", handlePointerMove);\n document.removeEventListener(\"pointerup\", handlePointerUp, { capture: true });\n };\n }\n }, [content, onOpenChange, triggerPointerDownPosRef]);\n React.useEffect(() => {\n const close = /* @__PURE__ */ __name(() => onOpenChange(false), \"close\");\n window.addEventListener(\"blur\", close);\n window.addEventListener(\"resize\", close);\n return () => {\n window.removeEventListener(\"blur\", close);\n window.removeEventListener(\"resize\", close);\n };\n }, [onOpenChange]);\n const [searchRef, handleTypeaheadSearch] = useTypeaheadSearch((search) => {\n const enabledItems = getItems().filter((item) => !item.disabled);\n const currentItem = enabledItems.find((item) => item.ref.current === document.activeElement);\n const nextItem = findNextItem(enabledItems, search, currentItem);\n if (nextItem) {\n setTimeout(() => nextItem.ref.current?.focus());\n }\n });\n const itemRefCallback = React.useCallback(\n (node, value, disabled) => {\n const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;\n const isSelectedItem = context.value !== void 0 && context.value === value;\n if (isSelectedItem || isFirstValidItem) {\n setSelectedItem(node);\n if (isFirstValidItem) firstValidItemFoundRef.current = true;\n }\n },\n [context.value]\n );\n const handleItemLeave = React.useCallback(() => content?.focus(), [content]);\n const itemTextRefCallback = React.useCallback(\n (node, value, disabled) => {\n const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;\n const isSelectedItem = context.value !== void 0 && context.value === value;\n if (isSelectedItem || isFirstValidItem) {\n setSelectedItemText(node);\n }\n },\n [context.value]\n );\n const SelectPosition = position === \"popper\" ? SelectPopperPosition : SelectItemAlignedPosition;\n const popperContentProps = SelectPosition === SelectPopperPosition ? {\n side,\n sideOffset,\n align,\n alignOffset,\n arrowPadding,\n collisionBoundary,\n collisionPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions\n } : {};\n return /* @__PURE__ */ jsx(\n SelectContentProvider,\n {\n scope: __scopeSelect,\n content,\n viewport,\n onViewportChange: setViewport,\n itemRefCallback,\n selectedItem,\n onItemLeave: handleItemLeave,\n itemTextRefCallback,\n focusSelectedItem,\n selectedItemText,\n position,\n isPositioned,\n searchRef,\n children: /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n trapped: context.open,\n onMountAutoFocus: (event) => {\n event.preventDefault();\n },\n onUnmountAutoFocus: composeEventHandlers(onCloseAutoFocus, (event) => {\n context.trigger?.focus({ preventScroll: true });\n event.preventDefault();\n }),\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents: true,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside: (event) => event.preventDefault(),\n onDismiss: () => context.onOpenChange(false),\n children: /* @__PURE__ */ jsx(\n SelectPosition,\n {\n role: \"listbox\",\n id: context.contentId,\n \"data-state\": context.open ? \"open\" : \"closed\",\n dir: context.dir,\n onContextMenu: (event) => event.preventDefault(),\n ...contentProps,\n ...popperContentProps,\n onPlaced: () => setIsPositioned(true),\n ref: composedRefs,\n style: {\n // flex layout so we can place the scroll buttons properly\n display: \"flex\",\n flexDirection: \"column\",\n // reset the outline by default as the content MAY get focused\n outline: \"none\",\n ...contentProps.style\n },\n onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n if (event.key === \"Tab\") event.preventDefault();\n if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);\n if ([\"ArrowUp\", \"ArrowDown\", \"Home\", \"End\"].includes(event.key)) {\n const items = getItems().filter((item) => !item.disabled);\n let candidateNodes = items.map((item) => item.ref.current);\n if ([\"ArrowUp\", \"End\"].includes(event.key)) {\n candidateNodes = candidateNodes.slice().reverse();\n }\n if ([\"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n const currentElement = event.target;\n const currentIndex = candidateNodes.indexOf(currentElement);\n candidateNodes = candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n event.preventDefault();\n }\n })\n }\n )\n }\n )\n }\n ) })\n }\n );\n }, \"SelectContentImpl\")\n);\nvar SelectItemAlignedPosition = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function SelectItemAlignedPosition2(props, forwardedRef) {\n const { __scopeSelect, onPlaced, ...popperProps } = props;\n const context = useSelectContext(CONTENT_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(CONTENT_NAME, __scopeSelect);\n const [contentWrapper, setContentWrapper] = React.useState(null);\n const [content, setContent] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, setContent);\n const getItems = useCollection(__scopeSelect);\n const shouldExpandOnScrollRef = React.useRef(false);\n const shouldRepositionRef = React.useRef(true);\n const { viewport, selectedItem, selectedItemText, focusSelectedItem } = contentContext;\n const position = React.useCallback(() => {\n if (context.trigger && context.valueNode && contentWrapper && content && viewport && selectedItem && selectedItemText) {\n const triggerRect = context.trigger.getBoundingClientRect();\n const contentRect = content.getBoundingClientRect();\n const valueNodeRect = context.valueNode.getBoundingClientRect();\n const itemTextRect = selectedItemText.getBoundingClientRect();\n if (context.dir !== \"rtl\") {\n const itemTextOffset = itemTextRect.left - contentRect.left;\n const left = valueNodeRect.left - itemTextOffset;\n const leftDelta = triggerRect.left - left;\n const minContentWidth = triggerRect.width + leftDelta;\n const contentWidth = Math.max(minContentWidth, contentRect.width);\n const rightEdge = window.innerWidth - CONTENT_MARGIN;\n const clampedLeft = clamp(left, [\n CONTENT_MARGIN,\n // Prevents the content from going off the starting edge of the\n // viewport. It may still go off the ending edge, but this can be\n // controlled by the user since they may want to manage overflow in a\n // specific way.\n // https://github.com/radix-ui/primitives/issues/2049\n Math.max(CONTENT_MARGIN, rightEdge - contentWidth)\n ]);\n contentWrapper.style.minWidth = minContentWidth + \"px\";\n contentWrapper.style.left = clampedLeft + \"px\";\n } else {\n const itemTextOffset = contentRect.right - itemTextRect.right;\n const right = window.innerWidth - valueNodeRect.right - itemTextOffset;\n const rightDelta = window.innerWidth - triggerRect.right - right;\n const minContentWidth = triggerRect.width + rightDelta;\n const contentWidth = Math.max(minContentWidth, contentRect.width);\n const leftEdge = window.innerWidth - CONTENT_MARGIN;\n const clampedRight = clamp(right, [\n CONTENT_MARGIN,\n Math.max(CONTENT_MARGIN, leftEdge - contentWidth)\n ]);\n contentWrapper.style.minWidth = minContentWidth + \"px\";\n contentWrapper.style.right = clampedRight + \"px\";\n }\n const items = getItems();\n const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;\n const itemsHeight = viewport.scrollHeight;\n const contentStyles = window.getComputedStyle(content);\n const contentBorderTopWidth = parseInt(contentStyles.borderTopWidth, 10);\n const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);\n const contentBorderBottomWidth = parseInt(contentStyles.borderBottomWidth, 10);\n const contentPaddingBottom = parseInt(contentStyles.paddingBottom, 10);\n const fullContentHeight = contentBorderTopWidth + contentPaddingTop + itemsHeight + contentPaddingBottom + contentBorderBottomWidth;\n const minContentHeight = Math.min(selectedItem.offsetHeight * 5, fullContentHeight);\n const viewportStyles = window.getComputedStyle(viewport);\n const viewportPaddingTop = parseInt(viewportStyles.paddingTop, 10);\n const viewportPaddingBottom = parseInt(viewportStyles.paddingBottom, 10);\n const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - CONTENT_MARGIN;\n const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;\n const selectedItemHalfHeight = selectedItem.offsetHeight / 2;\n const itemOffsetMiddle = selectedItem.offsetTop + selectedItemHalfHeight;\n const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;\n const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;\n const willAlignWithoutTopOverflow = contentTopToItemMiddle <= topEdgeToTriggerMiddle;\n if (willAlignWithoutTopOverflow) {\n const isLastItem = items.length > 0 && selectedItem === items[items.length - 1].ref.current;\n contentWrapper.style.bottom = \"0px\";\n const viewportOffsetBottom = content.clientHeight - viewport.offsetTop - viewport.offsetHeight;\n const clampedTriggerMiddleToBottomEdge = Math.max(\n triggerMiddleToBottomEdge,\n selectedItemHalfHeight + // viewport might have padding bottom, include it to avoid a scrollable viewport\n (isLastItem ? viewportPaddingBottom : 0) + viewportOffsetBottom + contentBorderBottomWidth\n );\n const height = contentTopToItemMiddle + clampedTriggerMiddleToBottomEdge;\n contentWrapper.style.height = height + \"px\";\n } else {\n const isFirstItem = items.length > 0 && selectedItem === items[0].ref.current;\n contentWrapper.style.top = \"0px\";\n const clampedTopEdgeToTriggerMiddle = Math.max(\n topEdgeToTriggerMiddle,\n contentBorderTopWidth + viewport.offsetTop + // viewport might have padding top, include it to avoid a scrollable viewport\n (isFirstItem ? viewportPaddingTop : 0) + selectedItemHalfHeight\n );\n const height = clampedTopEdgeToTriggerMiddle + itemMiddleToContentBottom;\n contentWrapper.style.height = height + \"px\";\n viewport.scrollTop = contentTopToItemMiddle - topEdgeToTriggerMiddle + viewport.offsetTop;\n }\n contentWrapper.style.margin = `${CONTENT_MARGIN}px 0`;\n contentWrapper.style.minHeight = minContentHeight + \"px\";\n contentWrapper.style.maxHeight = availableHeight + \"px\";\n onPlaced?.();\n requestAnimationFrame(() => shouldExpandOnScrollRef.current = true);\n }\n }, [\n getItems,\n context.trigger,\n context.valueNode,\n contentWrapper,\n content,\n viewport,\n selectedItem,\n selectedItemText,\n context.dir,\n onPlaced\n ]);\n useLayoutEffect(() => position(), [position]);\n const [contentZIndex, setContentZIndex] = React.useState();\n useLayoutEffect(() => {\n if (content) setContentZIndex(window.getComputedStyle(content).zIndex);\n }, [content]);\n const handleScrollButtonChange = React.useCallback(\n (node) => {\n if (node && shouldRepositionRef.current === true) {\n position();\n focusSelectedItem?.();\n shouldRepositionRef.current = false;\n }\n },\n [position, focusSelectedItem]\n );\n return /* @__PURE__ */ jsx(\n SelectViewportProvider,\n {\n scope: __scopeSelect,\n contentWrapper,\n shouldExpandOnScrollRef,\n onScrollButtonChange: handleScrollButtonChange,\n children: /* @__PURE__ */ jsx(\n \"div\",\n {\n ref: setContentWrapper,\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"fixed\",\n zIndex: contentZIndex\n },\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...popperProps,\n ref: composedRefs,\n style: {\n // When we get the height of the content, it includes borders. If we were to set\n // the height without having `boxSizing: 'border-box'` it would be too big.\n boxSizing: \"border-box\",\n // We need to ensure the content doesn't get taller than the wrapper\n maxHeight: \"100%\",\n ...popperProps.style\n }\n }\n )\n }\n )\n }\n );\n}, \"SelectItemAlignedPosition\"));\nvar SelectPopperPosition = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function SelectPopperPosition2(props, forwardedRef) {\n const {\n __scopeSelect,\n align = \"start\",\n collisionPadding = CONTENT_MARGIN,\n ...popperProps\n } = props;\n const popperScope = usePopperScope(__scopeSelect);\n return /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n ...popperScope,\n ...popperProps,\n ref: forwardedRef,\n align,\n collisionPadding,\n style: {\n // Ensure border-box for floating-ui calculations\n boxSizing: \"border-box\",\n ...popperProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-select-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-select-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-select-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-select-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-select-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n}, \"SelectPopperPosition\"));\nvar [SelectViewportProvider, useSelectViewportContext] = createSelectContext(CONTENT_NAME, {});\nvar VIEWPORT_NAME = \"SelectViewport\";\nvar SelectViewport = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectViewport2(props, forwardedRef) {\n const { __scopeSelect, nonce, ...viewportProps } = props;\n const contentContext = useSelectContentContext(VIEWPORT_NAME, __scopeSelect);\n const viewportContext = useSelectViewportContext(VIEWPORT_NAME, __scopeSelect);\n const composedRefs = useComposedRefs(forwardedRef, contentContext.onViewportChange);\n const prevScrollTopRef = React.useRef(0);\n return /* @__PURE__ */ jsxs(Fragment2, { children: [\n /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n ),\n /* @__PURE__ */ jsx(Collection.Slot, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-select-viewport\": \"\",\n role: \"presentation\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n // we use position: 'relative' here on the `viewport` so that when we call\n // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport\n // (independent of the scrollUpButton).\n position: \"relative\",\n flex: 1,\n // Viewport should only be scrollable in the vertical direction.\n // This won't work in vertical writing modes, so we'll need to\n // revisit this if/when that is supported\n // https://developer.chrome.com/blog/vertical-form-controls\n overflow: \"hidden auto\",\n ...viewportProps.style\n },\n onScroll: composeEventHandlers(viewportProps.onScroll, (event) => {\n const viewport = event.currentTarget;\n const { contentWrapper, shouldExpandOnScrollRef } = viewportContext;\n if (shouldExpandOnScrollRef?.current && contentWrapper) {\n const scrolledBy = Math.abs(prevScrollTopRef.current - viewport.scrollTop);\n if (scrolledBy > 0) {\n const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;\n const cssMinHeight = parseFloat(contentWrapper.style.minHeight);\n const cssHeight = parseFloat(contentWrapper.style.height);\n const prevHeight = Math.max(cssMinHeight, cssHeight);\n if (prevHeight < availableHeight) {\n const nextHeight = prevHeight + scrolledBy;\n const clampedNextHeight = Math.min(availableHeight, nextHeight);\n const heightDiff = nextHeight - clampedNextHeight;\n contentWrapper.style.height = clampedNextHeight + \"px\";\n if (contentWrapper.style.bottom === \"0px\") {\n viewport.scrollTop = heightDiff > 0 ? heightDiff : 0;\n contentWrapper.style.justifyContent = \"flex-end\";\n }\n }\n }\n }\n prevScrollTopRef.current = viewport.scrollTop;\n })\n }\n ) })\n ] });\n }, \"SelectViewport\")\n);\nvar GROUP_NAME = \"SelectGroup\";\nvar [SelectGroupContextProvider, useSelectGroupContext] = createSelectContext(GROUP_NAME);\nvar SelectGroup = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectGroup2(props, forwardedRef) {\n const { __scopeSelect, ...groupProps } = props;\n const groupId = useId();\n return /* @__PURE__ */ jsx(SelectGroupContextProvider, { scope: __scopeSelect, id: groupId, children: /* @__PURE__ */ jsx(Primitive.div, { role: \"group\", \"aria-labelledby\": groupId, ...groupProps, ref: forwardedRef }) });\n }, \"SelectGroup\")\n);\nvar LABEL_NAME = \"SelectLabel\";\nvar SelectLabel = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectLabel2(props, forwardedRef) {\n const { __scopeSelect, ...labelProps } = props;\n const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);\n return /* @__PURE__ */ jsx(Primitive.div, { id: groupContext.id, ...labelProps, ref: forwardedRef });\n }, \"SelectLabel\")\n);\nvar ITEM_NAME = \"SelectItem\";\nvar [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);\nvar SelectItem = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectItem2(props, forwardedRef) {\n const {\n __scopeSelect,\n value,\n disabled = false,\n textValue: textValueProp,\n ...itemProps\n } = props;\n const context = useSelectContext(ITEM_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(ITEM_NAME, __scopeSelect);\n const isSelected = context.value === value;\n const [textValue, setTextValue] = React.useState(textValueProp ?? \"\");\n const [isFocused, setIsFocused] = React.useState(false);\n const handleItemRefCallback = useCallbackRef(\n (node) => contentContext.itemRefCallback?.(node, value, disabled)\n );\n const composedRefs = useComposedRefs(forwardedRef, handleItemRefCallback);\n const textId = useId();\n const pointerTypeRef = React.useRef(\"touch\");\n const handleSelect = /* @__PURE__ */ __name(() => {\n if (!disabled) {\n context.onValueChange(value);\n context.onOpenChange(false);\n }\n }, \"handleSelect\");\n return /* @__PURE__ */ jsx(\n SelectItemContextProvider,\n {\n scope: __scopeSelect,\n value,\n disabled,\n textId,\n isSelected,\n onItemTextChange: React.useCallback((node) => {\n setTextValue((prevTextValue) => prevTextValue || (node?.textContent ?? \"\").trim());\n }, []),\n children: /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeSelect,\n value,\n disabled,\n textValue,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"option\",\n \"aria-labelledby\": textId,\n \"data-highlighted\": isFocused ? \"\" : void 0,\n \"aria-selected\": isSelected && isFocused,\n \"data-state\": isSelected ? \"checked\" : \"unchecked\",\n \"aria-disabled\": disabled || void 0,\n \"data-disabled\": disabled ? \"\" : void 0,\n tabIndex: disabled ? void 0 : -1,\n ...itemProps,\n ref: composedRefs,\n onFocus: composeEventHandlers(itemProps.onFocus, () => setIsFocused(true)),\n onBlur: composeEventHandlers(itemProps.onBlur, () => setIsFocused(false)),\n onClick: composeEventHandlers(itemProps.onClick, () => {\n if (pointerTypeRef.current !== \"mouse\") handleSelect();\n }),\n onPointerUp: composeEventHandlers(itemProps.onPointerUp, () => {\n if (pointerTypeRef.current === \"mouse\") handleSelect();\n }),\n onPointerDown: composeEventHandlers(itemProps.onPointerDown, (event) => {\n pointerTypeRef.current = event.pointerType;\n }),\n onPointerMove: composeEventHandlers(itemProps.onPointerMove, (event) => {\n pointerTypeRef.current = event.pointerType;\n if (disabled) {\n contentContext.onItemLeave?.();\n } else if (pointerTypeRef.current === \"mouse\") {\n event.currentTarget.focus({ preventScroll: true });\n }\n }),\n onPointerLeave: composeEventHandlers(itemProps.onPointerLeave, (event) => {\n if (event.currentTarget === document.activeElement) {\n contentContext.onItemLeave?.();\n }\n }),\n onKeyDown: composeEventHandlers(itemProps.onKeyDown, (event) => {\n if (disabled || event.target !== event.currentTarget) {\n return;\n }\n const isTypingAhead = contentContext.searchRef?.current !== \"\";\n if (isTypingAhead && event.key === \" \") {\n return;\n }\n if (SELECTION_KEYS.includes(event.key)) {\n handleSelect();\n }\n if (event.key === \" \") {\n event.preventDefault();\n }\n })\n }\n )\n }\n )\n }\n );\n }, \"SelectItem\")\n);\nvar ITEM_TEXT_NAME = \"SelectItemText\";\nvar SelectItemText = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectItemText2(props, forwardedRef) {\n const { __scopeSelect, className, style, ...itemTextProps } = props;\n const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(ITEM_TEXT_NAME, __scopeSelect);\n const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);\n const nativeOptionsContext = useSelectNativeOptionsContext(ITEM_TEXT_NAME, __scopeSelect);\n const [itemTextNode, setItemTextNode] = React.useState(null);\n const handleItemTextRefCallback = useCallbackRef(\n (node) => contentContext.itemTextRefCallback?.(node, itemContext.value, itemContext.disabled)\n );\n const composedRefs = useComposedRefs(\n forwardedRef,\n setItemTextNode,\n itemContext.onItemTextChange,\n handleItemTextRefCallback\n );\n const textContent = itemTextNode?.textContent;\n const nativeOption = React.useMemo(\n () => /* @__PURE__ */ jsx(\"option\", { value: itemContext.value, disabled: itemContext.disabled, children: textContent }, itemContext.value),\n [itemContext.disabled, itemContext.value, textContent]\n );\n const { onNativeOptionAdd, onNativeOptionRemove } = nativeOptionsContext;\n useLayoutEffect(() => {\n onNativeOptionAdd(nativeOption);\n return () => onNativeOptionRemove(nativeOption);\n }, [onNativeOptionAdd, onNativeOptionRemove, nativeOption]);\n return /* @__PURE__ */ jsxs(Fragment2, { children: [\n /* @__PURE__ */ jsx(Primitive.span, { id: itemContext.textId, ...itemTextProps, ref: composedRefs }),\n itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren && !shouldShowPlaceholder(context.value) ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null\n ] });\n }, \"SelectItemText\")\n);\nvar ITEM_INDICATOR_NAME = \"SelectItemIndicator\";\nvar SelectItemIndicator = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function SelectItemIndicator2(props, forwardedRef) {\n const { __scopeSelect, ...itemIndicatorProps } = props;\n const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect);\n return itemContext.isSelected ? /* @__PURE__ */ jsx(Primitive.span, { \"aria-hidden\": true, ...itemIndicatorProps, ref: forwardedRef }) : null;\n }, \"SelectItemIndicator\")\n);\nvar SCROLL_UP_BUTTON_NAME = \"SelectScrollUpButton\";\nvar SelectScrollUpButton = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function SelectScrollUpButton2(props, forwardedRef) {\n const contentContext = useSelectContentContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);\n const viewportContext = useSelectViewportContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);\n const [canScrollUp, setCanScrollUp] = React.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);\n useLayoutEffect(() => {\n if (contentContext.viewport && contentContext.isPositioned) {\n let handleScroll2 = function() {\n const canScrollUp2 = viewport.scrollTop > 0;\n setCanScrollUp(canScrollUp2);\n };\n var handleScroll = handleScroll2;\n __name(handleScroll2, \"handleScroll\");\n const viewport = contentContext.viewport;\n handleScroll2();\n viewport.addEventListener(\"scroll\", handleScroll2);\n return () => viewport.removeEventListener(\"scroll\", handleScroll2);\n }\n }, [contentContext.viewport, contentContext.isPositioned]);\n return canScrollUp ? /* @__PURE__ */ jsx(\n SelectScrollButtonImpl,\n {\n ...props,\n ref: composedRefs,\n onAutoScroll: () => {\n const { viewport, selectedItem } = contentContext;\n if (viewport && selectedItem) {\n viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;\n }\n }\n }\n ) : null;\n}, \"SelectScrollUpButton\"));\nvar SCROLL_DOWN_BUTTON_NAME = \"SelectScrollDownButton\";\nvar SelectScrollDownButton = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function SelectScrollDownButton2(props, forwardedRef) {\n const contentContext = useSelectContentContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);\n const viewportContext = useSelectViewportContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);\n const [canScrollDown, setCanScrollDown] = React.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);\n useLayoutEffect(() => {\n if (contentContext.viewport && contentContext.isPositioned) {\n let handleScroll2 = function() {\n const maxScroll = viewport.scrollHeight - viewport.clientHeight;\n const canScrollDown2 = Math.ceil(viewport.scrollTop) < maxScroll;\n setCanScrollDown(canScrollDown2);\n };\n var handleScroll = handleScroll2;\n __name(handleScroll2, \"handleScroll\");\n const viewport = contentContext.viewport;\n handleScroll2();\n viewport.addEventListener(\"scroll\", handleScroll2);\n return () => viewport.removeEventListener(\"scroll\", handleScroll2);\n }\n }, [contentContext.viewport, contentContext.isPositioned]);\n return canScrollDown ? /* @__PURE__ */ jsx(\n SelectScrollButtonImpl,\n {\n ...props,\n ref: composedRefs,\n onAutoScroll: () => {\n const { viewport, selectedItem } = contentContext;\n if (viewport && selectedItem) {\n viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;\n }\n }\n }\n ) : null;\n}, \"SelectScrollDownButton\"));\nvar SelectScrollButtonImpl = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function SelectScrollButtonImpl2(props, forwardedRef) {\n const { __scopeSelect, onAutoScroll, ...scrollIndicatorProps } = props;\n const contentContext = useSelectContentContext(\"SelectScrollButton\", __scopeSelect);\n const autoScrollTimerRef = React.useRef(null);\n const getItems = useCollection(__scopeSelect);\n const clearAutoScrollTimer = React.useCallback(() => {\n if (autoScrollTimerRef.current !== null) {\n window.clearInterval(autoScrollTimerRef.current);\n autoScrollTimerRef.current = null;\n }\n }, []);\n React.useEffect(() => {\n return () => clearAutoScrollTimer();\n }, [clearAutoScrollTimer]);\n useLayoutEffect(() => {\n const activeItem = getItems().find((item) => item.ref.current === document.activeElement);\n activeItem?.ref.current?.scrollIntoView({ block: \"nearest\" });\n }, [getItems]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"aria-hidden\": true,\n ...scrollIndicatorProps,\n ref: forwardedRef,\n style: { flexShrink: 0, ...scrollIndicatorProps.style },\n onPointerDown: composeEventHandlers(scrollIndicatorProps.onPointerDown, () => {\n if (autoScrollTimerRef.current === null) {\n autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);\n }\n }),\n onPointerMove: composeEventHandlers(scrollIndicatorProps.onPointerMove, () => {\n contentContext.onItemLeave?.();\n if (autoScrollTimerRef.current === null) {\n autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);\n }\n }),\n onPointerLeave: composeEventHandlers(scrollIndicatorProps.onPointerLeave, () => {\n clearAutoScrollTimer();\n })\n }\n );\n}, \"SelectScrollButtonImpl\"));\nvar SelectSeparator = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function SelectSeparator2(props, forwardedRef) {\n const { __scopeSelect, ...separatorProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { \"aria-hidden\": true, ...separatorProps, ref: forwardedRef });\n }, \"SelectSeparator\")\n);\nvar ARROW_NAME = \"SelectArrow\";\nvar SelectArrow = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function SelectArrow2(props, forwardedRef) {\n const { __scopeSelect, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeSelect);\n const contentContext = useSelectContentContext(ARROW_NAME, __scopeSelect);\n return contentContext.position === \"popper\" ? /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef }) : null;\n }, \"SelectArrow\")\n);\nvar BUBBLE_INPUT_NAME = \"SelectBubbleInput\";\nvar SelectBubbleInput = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function SelectBubbleInput2({ __scopeSelect, ...props }, forwardedRef) {\n const context = useSelectContext(BUBBLE_INPUT_NAME, __scopeSelect);\n const { value, onValueChange, required, disabled, name, autoComplete, form } = context;\n const { nativeOptions, nativeSelectKey } = context;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const selectValue = value ?? \"\";\n const prevValue = usePrevious(selectValue);\n const hasEmptyValueOption = Array.from(nativeOptions).some(\n (option) => (option.props.value ?? \"\") === \"\"\n );\n React.useEffect(() => {\n const select = ref.current;\n if (!select) return;\n const selectProto = window.HTMLSelectElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n selectProto,\n \"value\"\n );\n const setValue = descriptor.set;\n if (prevValue !== selectValue && setValue) {\n const event = new Event(\"change\", { bubbles: true });\n setValue.call(select, selectValue);\n select.dispatchEvent(event);\n }\n }, [prevValue, selectValue]);\n return /* @__PURE__ */ jsxs(\n Primitive.select,\n {\n \"aria-hidden\": true,\n required,\n tabIndex: -1,\n name,\n autoComplete,\n disabled,\n form,\n onChange: (event) => onValueChange(event.target.value),\n ...props,\n style: { ...VISUALLY_HIDDEN_STYLES, ...props.style },\n ref: composedRefs,\n defaultValue: selectValue,\n children: [\n shouldShowPlaceholder(value) && !hasEmptyValueOption ? /* @__PURE__ */ jsx(\"option\", { value: \"\" }) : null,\n Array.from(nativeOptions)\n ]\n },\n nativeSelectKey\n );\n }, \"SelectBubbleInput\")\n);\nfunction isFunction(value) {\n return typeof value === \"function\";\n}\n__name(isFunction, \"isFunction\");\nfunction shouldShowPlaceholder(value) {\n return value === \"\" || value === void 0;\n}\n__name(shouldShowPlaceholder, \"shouldShowPlaceholder\");\nfunction useTypeaheadSearch(onSearchChange) {\n const handleSearchChange = useCallbackRef(onSearchChange);\n const searchRef = React.useRef(\"\");\n const timerRef = React.useRef(0);\n const handleTypeaheadSearch = React.useCallback(\n (key) => {\n const search = searchRef.current + key;\n handleSearchChange(search);\n (/* @__PURE__ */ __name((function updateSearch(value) {\n searchRef.current = value;\n window.clearTimeout(timerRef.current);\n if (value !== \"\") timerRef.current = window.setTimeout(() => updateSearch(\"\"), 1e3);\n }), \"updateSearch\"))(search);\n },\n [handleSearchChange]\n );\n const resetTypeahead = React.useCallback(() => {\n searchRef.current = \"\";\n window.clearTimeout(timerRef.current);\n }, []);\n React.useEffect(() => {\n return () => window.clearTimeout(timerRef.current);\n }, []);\n return [searchRef, handleTypeaheadSearch, resetTypeahead];\n}\n__name(useTypeaheadSearch, \"useTypeaheadSearch\");\nfunction findNextItem(items, search, currentItem) {\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);\n const normalizedSearch = isRepeated ? search[0] : search;\n const currentItemIndex = currentItem ? items.indexOf(currentItem) : -1;\n let wrappedItems = wrapArray(items, Math.max(currentItemIndex, 0));\n const excludeCurrentItem = normalizedSearch.length === 1;\n if (excludeCurrentItem) wrappedItems = wrappedItems.filter((v) => v !== currentItem);\n const nextItem = wrappedItems.find(\n (item) => item.textValue.toLowerCase().startsWith(normalizedSearch.toLowerCase())\n );\n return nextItem !== currentItem ? nextItem : void 0;\n}\n__name(findNextItem, \"findNextItem\");\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\n__name(wrapArray, \"wrapArray\");\nexport {\n SelectArrow as Arrow,\n SelectContent as Content,\n SelectGroup as Group,\n SelectIcon as Icon,\n SelectItem as Item,\n SelectItemIndicator as ItemIndicator,\n SelectItemText as ItemText,\n SelectLabel as Label,\n SelectPortal as Portal,\n Select as Root,\n SelectScrollDownButton as ScrollDownButton,\n SelectScrollUpButton as ScrollUpButton,\n Select,\n SelectArrow,\n SelectContent,\n SelectGroup,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectLabel,\n SelectPortal,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n SelectSeparator as Separator,\n SelectTrigger as Trigger,\n SelectValue as Value,\n SelectViewport as Viewport,\n createSelectScope,\n SelectBubbleInput as unstable_BubbleInput,\n SelectProvider as unstable_Provider,\n SelectBubbleInput as unstable_SelectBubbleInput,\n SelectProvider as unstable_SelectProvider\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { usePortalContainer, useViewportCollisionPadding } from '../lib/floating-layer.js'\n\n/**\n * Thin wrapper around `SelectPrimitive.Root` that suppresses the spurious\n * empty-string callback Radix fires through its hidden bubble-input while\n * `SelectItem` nodes register lazily via Portal after an external `value`\n * change (e.g. `form.reset()` after an async data load). Without this guard\n * the externally-set value is immediately overwritten with `''`.\n *\n * The empty string is never a legitimate choice from a rendered `SelectItem`,\n * so dropping it is always safe. Call sites should NOT add their own\n * `if (v === '') return` guards — this component handles it centrally.\n */\nfunction SelectRoot({\n onValueChange,\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Root>): React.ReactElement {\n const handleValueChange = React.useCallback(\n (value: string) => {\n if (value !== '') onValueChange?.(value)\n },\n [onValueChange],\n )\n return <SelectPrimitive.Root onValueChange={handleValueChange} {...props} />\n}\nSelectRoot.displayName = 'Select'\n\nexport const Select = SelectRoot\nexport const SelectGroup = SelectPrimitive.Group\nexport const SelectValue = SelectPrimitive.Value\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, onMouseEnter, ...props }, ref) => {\n const handleMouseEnter = (e: React.MouseEvent<HTMLButtonElement>): void => {\n // Set native title only when the value span is actually clipped so the\n // tooltip doesn't appear redundantly on short values.\n const valueSpan = e.currentTarget.querySelector<HTMLElement>('span')\n if (valueSpan && valueSpan.scrollWidth > valueSpan.offsetWidth) {\n e.currentTarget.title = valueSpan.textContent ?? ''\n } else {\n e.currentTarget.removeAttribute('title')\n }\n onMouseEnter?.(e)\n }\n\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full cursor-pointer items-center justify-between rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className,\n )}\n onMouseEnter={handleMouseEnter}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n})\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n // Radix mounts this button after the viewport leaves the first option.\n // Keep its 24px slot mounted so the list does not grow and jump at that\n // point; the inner button still appears as intended.\n <div className=\"flex h-6 shrink-0\">\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex w-full cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n </div>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n // Radix unmounts this button after the viewport reaches the last option.\n // Keep its 24px slot mounted so the list does not shrink and jump at that\n // point; the inner button still disappears as intended.\n <div className=\"flex h-6 shrink-0\">\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex w-full cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n </div>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nexport interface SelectContentProps\n extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> {\n /** Override the portal target. Defaults to the enclosing Dialog/Sheet\n * content (so touch-scroll works inside it) or `document.body`. */\n container?: HTMLElement | null\n}\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(({ className, children, position = 'popper', collisionPadding, container, ...props }, ref) => {\n const portalContainer = usePortalContainer()\n const viewportPadding = useViewportCollisionPadding()\n return (\n <SelectPrimitive.Portal container={container ?? portalContainer}>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n // `max-h-96` is the design cap; the available-height variable is the\n // hard one — it keeps the list inside the visible viewport on short\n // mobile screens instead of overflowing under the browser chrome.\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'max-h-[min(24rem,var(--radix-select-content-available-height))] data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n collisionPadding={collisionPadding ?? viewportPadding}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n})\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nexport const SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n title={typeof children === 'string' ? children : undefined}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>\n <span className=\"block truncate\">{children}</span>\n </SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nexport const SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\n/**\n * Plain native `<select>` styled to match the rest of the kit. Useful when\n * you need a no-JS, SSR-friendly fallback or simple form posts. Most call\n * sites should prefer the Radix-based `Select` family above.\n */\nexport type NativeSelectProps = React.SelectHTMLAttributes<HTMLSelectElement>\n\nexport const NativeSelect = React.forwardRef<HTMLSelectElement, NativeSelectProps>(\n ({ className, children, ...props }, ref) => (\n <select\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm 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 {children}\n </select>\n ),\n)\nNativeSelect.displayName = 'NativeSelect'\n"],"x_google_ignoreList":[0,1],"mappings":"ugBAAIA,EAAY,OAAO,eACnBC,GAAU,EAAQ,IAAUD,EAAU,EAAQ,OAAQ,CAAE,QAAO,aAAc,EAAK,CAAC,EAIvF,SAAS,EAAY,EAAO,CAC1B,IAAM,EAAA,EAAY,OAAO,CAAE,QAAO,SAAU,CAAM,CAAC,EACnD,OAAA,EAAa,aACP,EAAI,QAAQ,QAAU,IACxB,EAAI,QAAQ,SAAW,EAAI,QAAQ,MACnC,EAAI,QAAQ,MAAQ,GAEf,EAAI,QAAQ,UAClB,CAAC,CAAK,CAAC,CACZ,CACAC,EAAO,EAAa,aAAa,YCd7B,EAAY,OAAO,eACnB,GAAU,EAAQ,IAAU,EAAU,EAAQ,OAAQ,CAAE,QAAO,aAAc,EAAK,CAAC,EA6BnF,EAAY,CAAC,IAAK,QAAS,UAAW,WAAW,EACjD,EAAiB,CAAC,IAAK,OAAO,EAC9B,EAAc,SACd,CAAC,EAAY,EAAe,IAAyB,EAAiB,CAAW,EACjF,CAAC,EAAqB,IAAqB,EAAmB,EAAa,CAC7E,GACA,CACF,CAAC,EACG,EAAiB,EAAkB,EACnC,CAAC,GAAoB,GAAoB,EAAoB,CAAW,EACxE,CAAC,EAA6B,IAAiC,EAAoB,CAAW,EAClG,SAAS,GAAe,EAAO,CAC7B,GAAM,CACJ,gBACA,WACA,KAAM,EACN,cACA,eACA,MAAO,EACP,eACA,gBACA,MACA,OACA,eACA,WACA,WACA,OAEA,8BACE,EACE,EAAc,EAAe,CAAa,EAC1C,CAAC,EAAS,GAAA,EAAoB,SAAS,IAAI,EAC3C,CAAC,EAAW,GAAA,EAAsB,SAAS,IAAI,EAC/C,CAAC,EAAsB,GAAA,EAAiC,SAAS,EAAK,EACtE,GAAY,EAAa,CAAG,EAC5B,CAAC,EAAM,IAAW,EAAqB,CAC3C,KAAM,EACN,YAAa,GAAe,GAC5B,SAAU,EACV,OAAQ,CACV,CAAC,EACK,CAAC,EAAO,GAAY,EAAqB,CAC7C,KAAM,EACN,YAAa,EACb,SAAU,EACV,OAAQ,CACV,CAAC,EACK,EAAA,EAAiC,OAAO,IAAI,EAC5C,GAAA,EAAwB,OAAO,CAAK,EAC1C,EAAM,cAAgB,CACpB,IAAM,EAAiB,EAAO,GAAS,cAAc,eAAe,CAAI,EAAI,GAAS,KACrF,GAAI,aAA0B,gBAAiB,CAC7C,IAAM,EAAwB,MAAa,EAAS,GAAgB,OAAO,EAAG,OAAO,EAErF,OADA,EAAe,iBAAiB,QAAS,CAAK,MACjC,EAAe,oBAAoB,QAAS,CAAK,CAChE,CACF,EAAG,CAAC,EAAM,EAAS,CAAQ,CAAC,EAC5B,IAAM,EAAgB,IAAU,CAAC,CAAC,GAAQ,CAAC,CAAC,EAAQ,QAAQ,MAAM,EAC5D,CAAC,EAAkB,GAAA,EAA6B,SAAyB,IAAI,GAAK,EAClF,EAAY,EAAM,EAClB,EAAkB,MAAM,KAAK,CAAgB,CAAC,CAAC,IAAK,GAAW,EAAO,MAAM,KAAK,CAAC,CAAC,KAAK,GAAG,EAC3F,EAAA,EAA8B,YAAa,GAAW,CAC1D,EAAqB,GAAS,IAAI,IAAI,CAAI,CAAC,CAAC,IAAI,CAAM,CAAC,CACzD,EAAG,CAAC,CAAC,EACC,EAAA,EAAiC,YAAa,GAAW,CAC7D,EAAqB,GAAS,CAC5B,IAAM,EAAa,IAAI,IAAI,CAAI,EAE/B,OADA,EAAW,OAAO,CAAM,EACjB,CACT,CAAC,CACH,EAAG,CAAC,CAAC,EACC,EAAU,CACd,WACA,UACA,gBAAiB,EACjB,YACA,kBAAmB,EACnB,uBACA,6BAA8B,EAC9B,YACA,QACA,cAAe,EACf,OACA,aAAc,GACd,IAAK,GACL,2BACA,WACA,OACA,eACA,OACA,cAAe,EACf,kBACA,eACF,EACA,OAAuB,EAAA,EAAA,IAAA,CAAIC,EAAsB,CAAE,GAAG,EAAa,UAA0B,EAAA,EAAA,IAAA,CAAI,GAAoB,CAAE,MAAO,EAAe,GAAG,EAAS,UAA0B,EAAA,EAAA,IAAA,CAAI,EAAW,SAAU,CAAE,MAAO,EAAe,UAA0B,EAAA,EAAA,IAAA,CAC5P,EACA,CACE,MAAO,EACP,kBAAmB,EACnB,qBAAsB,EACtB,SAAU,GAAW,CAA0B,EAAI,EAA2B,CAAO,EAAI,CAC3F,CACF,CAAE,CAAC,CAAE,CAAC,CAAE,CAAC,CACX,CACA,EAAO,GAAgB,gBAAgB,EACvC,IAAIC,GAAyB,EAAQ,GAAU,CAC7C,GAAM,CAAE,gBAAe,WAAU,GAAG,GAAkB,EACtD,OAAuB,EAAA,EAAA,IAAA,CACrB,GACA,CACE,gBACA,GAAG,EACH,4BAA6B,CAAE,oBAAoC,EAAA,EAAA,KAAA,CAAKC,EAAAA,SAAW,CAAE,SAAU,CAC7F,EACA,GAAgC,EAAA,EAAA,IAAA,CAC9B,GACA,CACE,eACF,CACF,EAAI,IACN,CAAE,CAAC,CACL,CACF,CACF,EAAG,QAAQ,EACP,GAAe,gBACfC,GAAgC,EAAM,WACxB,EAAO,SAAwB,EAAO,EAAc,CAClE,GAAM,CAAE,gBAAe,WAAW,GAAO,GAAG,GAAiB,EACvD,EAAc,EAAe,CAAa,EAC1C,EAAU,EAAiB,GAAc,CAAa,EACtD,EAAa,EAAQ,UAAY,EACjC,EAAe,EAAgB,EAAc,EAAQ,eAAe,EACpE,EAAW,EAAc,CAAa,EACtC,EAAA,EAAuB,OAAO,OAAO,EACrC,CAAC,EAAW,EAAuB,GAAkB,GAAoB,GAAW,CACxF,IAAM,EAAe,EAAS,CAAC,CAAC,OAAQ,GAAS,CAAC,EAAK,QAAQ,EAEzD,EAAW,GAAa,EAAc,EADxB,EAAa,KAAM,GAAS,EAAK,QAAU,EAAQ,KACT,CAAC,EAC3D,IAAa,IAAK,IACpB,EAAQ,cAAc,EAAS,KAAK,CAExC,CAAC,EACK,EAA6B,EAAQ,GAAiB,CACrD,IACH,EAAQ,aAAa,EAAI,EACzB,EAAe,GAEb,IACF,EAAQ,yBAAyB,QAAU,CACzC,EAAG,KAAK,MAAM,EAAa,KAAK,EAChC,EAAG,KAAK,MAAM,EAAa,KAAK,CAClC,EAEJ,EAAG,YAAY,EACf,OAAuB,EAAA,EAAA,IAAA,CAAIC,EAAwB,CAAE,QAAS,GAAM,GAAG,EAAa,UAA0B,EAAA,EAAA,IAAA,CAC5G,EAAU,OACV,CACE,KAAM,SACN,KAAM,WACN,gBAAiB,EAAQ,KAAO,EAAQ,UAAY,IAAK,GACzD,gBAAiB,EAAQ,KACzB,gBAAiB,EAAQ,SACzB,oBAAqB,OACrB,IAAK,EAAQ,IACb,aAAc,EAAQ,KAAO,OAAS,SACtC,SAAU,EACV,gBAAiB,EAAa,GAAK,IAAK,GACxC,mBAAoB,EAAsB,EAAQ,KAAK,EAAI,GAAK,IAAK,GACrE,GAAG,EACH,IAAK,EACL,QAAS,EAAqB,EAAa,QAAU,GAAU,CAC7D,EAAM,cAAc,MAAM,EACtB,EAAe,UAAY,SAC7B,EAAW,CAAK,CAEpB,CAAC,EACD,cAAe,EAAqB,EAAa,cAAgB,GAAU,CACzE,EAAe,QAAU,EAAM,YAC/B,IAAM,EAAS,EAAM,OACjB,EAAO,kBAAkB,EAAM,SAAS,GAC1C,EAAO,sBAAsB,EAAM,SAAS,EAE1C,EAAM,SAAW,GAAK,EAAM,UAAY,IAAS,EAAM,cAAgB,UACzE,EAAW,CAAK,EAChB,EAAM,eAAe,EAEzB,CAAC,EACD,UAAW,EAAqB,EAAa,UAAY,GAAU,CACjE,IAAM,EAAgB,EAAU,UAAY,GAExC,EADkB,EAAM,SAAW,EAAM,QAAU,EAAM,UACvC,EAAM,IAAI,SAAW,GAAG,EAAsB,EAAM,GAAG,EACzE,KAAiB,EAAM,MAAQ,MAC/B,EAAU,SAAS,EAAM,GAAG,IAC9B,EAAW,EACX,EAAM,eAAe,EAEzB,CAAC,CACH,CACF,CAAE,CAAC,CACL,EAAG,eAAe,CACpB,EACI,GAAa,cACbC,GAA8B,EAAM,WACtB,EAAO,SAAsB,EAAO,EAAc,CAChE,GAAM,CAAE,gBAAe,YAAW,QAAO,WAAU,cAAc,GAAI,GAAG,GAAe,EACjF,EAAU,EAAiB,GAAY,CAAa,EACpD,CAAE,gCAAiC,EACnC,EAAc,IAAa,IAAK,GAChC,EAAe,EAAgB,EAAc,EAAQ,iBAAiB,EAC5E,MAAsB,CACpB,EAA6B,CAAW,CAC1C,EAAG,CAAC,EAA8B,CAAW,CAAC,EAC9C,IAAM,EAAkB,EAAsB,EAAQ,KAAK,EAC3D,OAAuB,EAAA,EAAA,IAAA,CACrB,EAAU,KACV,CACE,GAAG,EACH,QAAS,IAA0B,EAAW,QAC9C,IAAK,EACL,MAAO,CAAE,cAAe,MAAO,EAC/B,UAA0B,EAAA,EAAA,IAAA,CAAA,EAAU,SAAU,CAAE,SAAU,EAAkB,EAAc,CAAS,EAAG,EAAkB,cAAgB,OAAO,CACjJ,CACF,CACF,EAAG,aAAa,CAClB,EACI,GAA6B,EAAM,WACrB,EAAO,SAAqB,EAAO,EAAc,CAC/D,GAAM,CAAE,gBAAe,WAAU,GAAG,GAAc,EAClD,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAU,KAAM,CAAE,cAAe,GAAM,GAAG,EAAW,IAAK,EAAc,SAAU,GAAY,GAAS,CAAC,CACrI,EAAG,YAAY,CACjB,EAEI,CAAC,GAAgB,IAAoB,EAAoB,eAAa,CACxE,WAAY,IAAK,EACnB,CAAC,EACG,GAA+B,EAAQ,GAAU,CACnD,GAAM,CAAE,gBAAe,aAAY,GAAG,GAAgB,EACtD,OAAuB,EAAA,EAAA,IAAA,CAAI,GAAgB,CAAE,MAAO,EAAM,cAAe,aAAY,UAA0B,EAAA,EAAA,IAAA,CAAIC,EAAiB,CAAE,QAAS,GAAM,GAAG,CAAY,CAAC,CAAE,CAAC,CAC1K,EAAG,cAAc,EACb,EAAe,gBACfC,GAAgC,EAAM,WACxB,EAAO,SAAwB,EAAO,EAAc,CAClE,IAAM,EAAgB,GAAiB,EAAc,EAAM,aAAa,EAClE,CAAE,aAAa,EAAc,WAAY,GAAG,GAAiB,EAC7D,EAAU,EAAiB,EAAc,EAAM,aAAa,EAC5D,CAAC,EAAU,GAAA,EAAqB,SAAS,EAI/C,OAHA,MAAsB,CACpB,EAAY,IAAI,gBAAkB,CACpC,EAAG,CAAC,CAAC,GACkB,EAAA,EAAA,IAAA,CAAI,EAAU,CAAE,QAAS,GAAc,EAAQ,KAAM,UAAW,CAAE,aAAc,GAA0B,EAAA,EAAA,IAAA,CAAI,GAAmB,CAAE,GAAG,EAAc,IAAK,CAAa,CAAC,GAAoB,EAAA,EAAA,IAAA,CAAI,GAAuB,CAAE,GAAG,EAAc,UAAS,CAAC,CAAE,CAAC,CAC/Q,EAAG,eAAe,CACpB,EACI,GAAwC,EAAM,WAA2B,EAAO,SAAgC,EAAO,EAAc,CACvI,GAAM,CAAE,gBAAe,WAAU,YAAa,EAE9C,OADK,EACL,EAAgB,cACE,EAAA,EAAA,IAAA,CAAI,GAAuB,CAAE,MAAO,EAAe,UAA0B,EAAA,EAAA,IAAA,CAAI,EAAW,KAAM,CAAE,MAAO,EAAe,UAA0B,EAAA,EAAA,IAAA,CAAI,MAAO,CAAE,IAAK,EAAc,UAAS,CAAC,CAAE,CAAC,CAAE,CAAC,EACpN,CACF,EAJsB,IAKxB,EAAG,uBAAuB,CAAC,EACvB,EAAiB,GACjB,CAAC,GAAuB,GAA2B,EAAoB,CAAY,EACnF,GAAO,EAAW,4BAA4B,EAC9C,GAAoC,EAAM,WAE5B,EAAO,SAA4B,EAAO,EAAc,CACtE,GAAM,CAAE,iBAAkB,EACpB,CACJ,WAAW,eACX,mBACA,kBACA,uBAGA,OACA,aACA,QACA,cACA,eACA,oBACA,mBACA,SACA,mBACA,kBAEA,GAAG,GACD,EACE,EAAU,EAAiB,EAAc,CAAa,EACtD,CAAC,EAAS,GAAA,EAAoB,SAAS,IAAI,EAC3C,CAAC,EAAU,GAAA,EAAqB,SAAS,IAAI,EAC7C,EAAe,EAAgB,EAAc,CAAU,EACvD,CAAC,EAAc,GAAA,EAAyB,SAAS,IAAI,EACrD,CAAC,GAAkB,GAAA,EAA6B,SACpD,IACF,EACM,EAAW,EAAc,CAAa,EACtC,CAAC,EAAc,GAAA,EAAyB,SAAS,EAAK,EACtD,EAAA,EAA+B,OAAO,EAAK,EACjD,EAAM,cAAgB,CACpB,GAAI,EAAS,OAAO,GAAW,CAAO,CACxC,EAAG,CAAC,CAAO,CAAC,EACZ,EAAe,EACf,IAAM,EAAA,EAAmB,YACtB,GAAe,CACd,GAAM,CAAC,EAAW,GAAG,GAAa,EAAS,CAAC,CAAC,IAAK,GAAS,EAAK,IAAI,OAAO,EACrE,CAAC,GAAY,EAAU,MAAM,EAAE,EAC/B,EAA6B,SAAS,cAC5C,IAAK,IAAM,KAAa,EAMtB,GALI,IAAc,IAClB,GAAW,eAAe,CAAE,MAAO,SAAU,CAAC,EAC1C,IAAc,GAAa,IAAU,EAAS,UAAY,GAC1D,IAAc,GAAY,IAAU,EAAS,UAAY,EAAS,cACtE,GAAW,MAAM,EACb,SAAS,gBAAkB,GAA4B,MAE/D,EACA,CAAC,EAAU,CAAQ,CACrB,EACM,EAAA,EAA0B,gBACxB,EAAW,CAAC,EAAc,CAAO,CAAC,EACxC,CAAC,EAAY,EAAc,CAAO,CACpC,EACA,EAAM,cAAgB,CAChB,GACF,EAAkB,CAEtB,EAAG,CAAC,EAAc,CAAiB,CAAC,EACpC,GAAM,CAAE,eAAc,4BAA6B,EACnD,EAAM,cAAgB,CACpB,GAAI,EAAS,CACX,IAAI,EAAmB,CAAE,EAAG,EAAG,EAAG,CAAE,EAC9B,EAAoC,EAAQ,GAAU,CAC1D,EAAmB,CACjB,EAAG,KAAK,IAAI,KAAK,MAAM,EAAM,KAAK,GAAK,EAAyB,SAAS,GAAK,EAAE,EAChF,EAAG,KAAK,IAAI,KAAK,MAAM,EAAM,KAAK,GAAK,EAAyB,SAAS,GAAK,EAAE,CAClF,CACF,EAAG,mBAAmB,EAChB,EAAkC,EAAQ,GAAU,CACpD,EAAiB,GAAK,IAAM,EAAiB,GAAK,GACpD,EAAM,eAAe,EAEhB,EAAM,aAAa,CAAC,CAAC,SAAS,CAAO,GACxC,EAAa,EAAK,EAGtB,SAAS,oBAAoB,cAAe,CAAiB,EAC7D,EAAyB,QAAU,IACrC,EAAG,iBAAiB,EAKpB,OAJI,EAAyB,UAAY,OACvC,SAAS,iBAAiB,cAAe,CAAiB,EAC1D,SAAS,iBAAiB,YAAa,EAAiB,CAAE,QAAS,GAAM,KAAM,EAAK,CAAC,OAE1E,CACX,SAAS,oBAAoB,cAAe,CAAiB,EAC7D,SAAS,oBAAoB,YAAa,EAAiB,CAAE,QAAS,EAAK,CAAC,CAC9E,CACF,CACF,EAAG,CAAC,EAAS,EAAc,CAAwB,CAAC,EACpD,EAAM,cAAgB,CACpB,IAAM,EAAwB,MAAa,EAAa,EAAK,EAAG,OAAO,EAGvE,OAFA,OAAO,iBAAiB,OAAQ,CAAK,EACrC,OAAO,iBAAiB,SAAU,CAAK,MAC1B,CACX,OAAO,oBAAoB,OAAQ,CAAK,EACxC,OAAO,oBAAoB,SAAU,CAAK,CAC5C,CACF,EAAG,CAAC,CAAY,CAAC,EACjB,GAAM,CAAC,GAAW,GAAyB,GAAoB,GAAW,CACxE,IAAM,EAAe,EAAS,CAAC,CAAC,OAAQ,GAAS,CAAC,EAAK,QAAQ,EAEzD,EAAW,GAAa,EAAc,EADxB,EAAa,KAAM,GAAS,EAAK,IAAI,UAAY,SAAS,aAChB,CAAC,EAC3D,GACF,eAAiB,EAAS,IAAI,SAAS,MAAM,CAAC,CAElD,CAAC,EACK,GAAA,EAAwB,aAC3B,EAAM,EAAO,IAAa,CACzB,IAAM,EAAmB,CAAC,EAAuB,SAAW,CAAC,GACtC,EAAQ,QAAU,IAAK,IAAK,EAAQ,QAAU,GAC/C,KACpB,EAAgB,CAAI,EAChB,IAAkB,EAAuB,QAAU,IAE3D,EACA,CAAC,EAAQ,KAAK,CAChB,EACM,EAAA,EAAwB,gBAAkB,GAAS,MAAM,EAAG,CAAC,CAAO,CAAC,EACrE,GAAA,EAA4B,aAC/B,EAAM,EAAO,IAAa,CACzB,IAAM,EAAmB,CAAC,EAAuB,SAAW,CAAC,GACtC,EAAQ,QAAU,IAAK,IAAK,EAAQ,QAAU,GAC/C,IACpB,EAAoB,CAAI,CAE5B,EACA,CAAC,EAAQ,KAAK,CAChB,EACM,EAAiB,IAAa,SAAW,GAAuB,GAChE,GAAqB,IAAmB,GAAuB,CACnE,OACA,aACA,QACA,cACA,eACA,oBACA,mBACA,SACA,mBACA,iBACF,EAAI,CAAC,EACL,OAAuB,EAAA,EAAA,IAAA,CACrB,GACA,CACE,MAAO,EACP,UACA,WACA,iBAAkB,EAClB,mBACA,eACA,YAAa,EACb,uBACA,oBACA,oBACA,WACA,eACA,aACA,UAA0B,EAAA,EAAA,IAAA,CAAIC,GAAc,CAAE,GAAI,GAAM,eAAgB,GAAM,UAA0B,EAAA,EAAA,IAAA,CACtG,EACA,CACE,QAAS,GACT,QAAS,EAAQ,KACjB,iBAAmB,GAAU,CAC3B,EAAM,eAAe,CACvB,EACA,mBAAoB,EAAqB,EAAmB,GAAU,CACpE,EAAQ,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,EAC9C,EAAM,eAAe,CACvB,CAAC,EACD,UAA0B,EAAA,EAAA,IAAA,CACxB,EACA,CACE,QAAS,GACT,4BAA6B,GAC7B,kBACA,uBACA,eAAiB,GAAU,EAAM,eAAe,EAChD,cAAiB,EAAQ,aAAa,EAAK,EAC3C,UAA0B,EAAA,EAAA,IAAA,CACxB,EACA,CACE,KAAM,UACN,GAAI,EAAQ,UACZ,aAAc,EAAQ,KAAO,OAAS,SACtC,IAAK,EAAQ,IACb,cAAgB,GAAU,EAAM,eAAe,EAC/C,GAAG,EACH,GAAG,GACH,aAAgB,EAAgB,EAAI,EACpC,IAAK,EACL,MAAO,CAEL,QAAS,OACT,cAAe,SAEf,QAAS,OACT,GAAG,EAAa,KAClB,EACA,UAAW,EAAqB,EAAa,UAAY,GAAU,CACjE,IAAM,EAAgB,EAAM,SAAW,EAAM,QAAU,EAAM,QAG7D,GAFI,EAAM,MAAQ,OAAO,EAAM,eAAe,EAC1C,CAAC,GAAiB,EAAM,IAAI,SAAW,GAAG,EAAsB,EAAM,GAAG,EACzE,CAAC,UAAW,YAAa,OAAQ,KAAK,CAAC,CAAC,SAAS,EAAM,GAAG,EAAG,CAE/D,IAAI,EADU,EAAS,CAAC,CAAC,OAAQ,GAAS,CAAC,EAAK,QACvB,CAAC,CAAC,IAAK,GAAS,EAAK,IAAI,OAAO,EAIzD,GAHI,CAAC,UAAW,KAAK,CAAC,CAAC,SAAS,EAAM,GAAG,IACvC,EAAiB,EAAe,MAAM,CAAC,CAAC,QAAQ,GAE9C,CAAC,UAAW,WAAW,CAAC,CAAC,SAAS,EAAM,GAAG,EAAG,CAChD,IAAM,EAAiB,EAAM,OACvB,EAAe,EAAe,QAAQ,CAAc,EAC1D,EAAiB,EAAe,MAAM,EAAe,CAAC,CACxD,CACA,eAAiB,EAAW,CAAc,CAAC,EAC3C,EAAM,eAAe,CACvB,CACF,CAAC,CACH,CACF,CACF,CACF,CACF,CACF,CAAE,CAAC,CACL,CACF,CACF,EAAG,mBAAmB,CACxB,EACI,GAA4C,EAAM,WAA2B,EAAO,SAAoC,EAAO,EAAc,CAC/I,GAAM,CAAE,gBAAe,WAAU,GAAG,GAAgB,EAC9C,EAAU,EAAiB,EAAc,CAAa,EACtD,EAAiB,EAAwB,EAAc,CAAa,EACpE,CAAC,EAAgB,GAAA,EAA2B,SAAS,IAAI,EACzD,CAAC,EAAS,GAAA,EAAoB,SAAS,IAAI,EAC3C,EAAe,EAAgB,EAAc,CAAU,EACvD,EAAW,EAAc,CAAa,EACtC,EAAA,EAAgC,OAAO,EAAK,EAC5C,EAAA,EAA4B,OAAO,EAAI,EACvC,CAAE,WAAU,eAAc,mBAAkB,qBAAsB,EAClE,EAAA,EAAiB,gBAAkB,CACvC,GAAI,EAAQ,SAAW,EAAQ,WAAa,GAAkB,GAAW,GAAY,GAAgB,EAAkB,CACrH,IAAM,EAAc,EAAQ,QAAQ,sBAAsB,EACpD,EAAc,EAAQ,sBAAsB,EAC5C,EAAgB,EAAQ,UAAU,sBAAsB,EACxD,EAAe,EAAiB,sBAAsB,EAC5D,GAAI,EAAQ,MAAQ,MAAO,CACzB,IAAM,EAAiB,EAAa,KAAO,EAAY,KACjD,EAAO,EAAc,KAAO,EAC5B,EAAY,EAAY,KAAO,EAC/B,EAAkB,EAAY,MAAQ,EACtC,EAAe,KAAK,IAAI,EAAiB,EAAY,KAAK,EAC1D,EAAY,OAAO,WAAa,EAChC,EAAc,EAAM,EAAM,CAC9B,EAMA,KAAK,IAAI,EAAgB,EAAY,CAAY,CACnD,CAAC,EACD,EAAe,MAAM,SAAW,EAAkB,KAClD,EAAe,MAAM,KAAO,EAAc,IAC5C,KAAO,CACL,IAAM,EAAiB,EAAY,MAAQ,EAAa,MAClD,EAAQ,OAAO,WAAa,EAAc,MAAQ,EAClD,EAAa,OAAO,WAAa,EAAY,MAAQ,EACrD,EAAkB,EAAY,MAAQ,EACtC,EAAe,KAAK,IAAI,EAAiB,EAAY,KAAK,EAC1D,EAAW,OAAO,WAAa,EAC/B,EAAe,EAAM,EAAO,CAChC,EACA,KAAK,IAAI,EAAgB,EAAW,CAAY,CAClD,CAAC,EACD,EAAe,MAAM,SAAW,EAAkB,KAClD,EAAe,MAAM,MAAQ,EAAe,IAC9C,CACA,IAAM,EAAQ,EAAS,EACjB,EAAkB,OAAO,YAAc,EAAiB,EACxD,EAAc,EAAS,aACvB,EAAgB,OAAO,iBAAiB,CAAO,EAC/C,EAAwB,SAAS,EAAc,eAAgB,EAAE,EACjE,EAAoB,SAAS,EAAc,WAAY,EAAE,EACzD,EAA2B,SAAS,EAAc,kBAAmB,EAAE,EACvE,EAAuB,SAAS,EAAc,cAAe,EAAE,EAC/D,EAAoB,EAAwB,EAAoB,EAAc,EAAuB,EACrG,EAAmB,KAAK,IAAI,EAAa,aAAe,EAAG,CAAiB,EAC5E,EAAiB,OAAO,iBAAiB,CAAQ,EACjD,EAAqB,SAAS,EAAe,WAAY,EAAE,EAC3D,EAAwB,SAAS,EAAe,cAAe,EAAE,EACjE,EAAyB,EAAY,IAAM,EAAY,OAAS,EAAI,EACpE,GAA4B,EAAkB,EAC9C,EAAyB,EAAa,aAAe,EACrD,GAAmB,EAAa,UAAY,EAC5C,EAAyB,EAAwB,EAAoB,GACrE,EAA4B,EAAoB,EAEtD,GADoC,GAA0B,EAC7B,CAC/B,IAAM,EAAa,EAAM,OAAS,GAAK,IAAiB,EAAM,EAAM,OAAS,EAAE,CAAC,IAAI,QACpF,EAAe,MAAM,OAAS,MAC9B,IAAM,EAAuB,EAAQ,aAAe,EAAS,UAAY,EAAS,aAM5E,EAAS,EAL0B,KAAK,IAC5C,GACA,GACC,EAAa,EAAwB,GAAK,EAAuB,CAEG,EACvE,EAAe,MAAM,OAAS,EAAS,IACzC,KAAO,CACL,IAAM,EAAc,EAAM,OAAS,GAAK,IAAiB,EAAM,EAAE,CAAC,IAAI,QACtE,EAAe,MAAM,IAAM,MAM3B,IAAM,EALgC,KAAK,IACzC,EACA,EAAwB,EAAS,WAChC,EAAc,EAAqB,GAAK,CAEA,EAAI,EAC/C,EAAe,MAAM,OAAS,EAAS,KACvC,EAAS,UAAY,EAAyB,EAAyB,EAAS,SAClF,CACA,EAAe,MAAM,OAAS,GAAG,EAAe,MAChD,EAAe,MAAM,UAAY,EAAmB,KACpD,EAAe,MAAM,UAAY,EAAkB,KACnD,IAAW,EACX,0BAA4B,EAAwB,QAAU,EAAI,CACpE,CACF,EAAG,CACD,EACA,EAAQ,QACR,EAAQ,UACR,EACA,EACA,EACA,EACA,EACA,EAAQ,IACR,CACF,CAAC,EACD,MAAsB,EAAS,EAAG,CAAC,CAAQ,CAAC,EAC5C,GAAM,CAAC,EAAe,GAAA,EAA0B,SAAS,EACzD,MAAsB,CAChB,GAAS,EAAiB,OAAO,iBAAiB,CAAO,CAAC,CAAC,MAAM,CACvE,EAAG,CAAC,CAAO,CAAC,EACZ,IAAM,EAAA,EAAiC,YACpC,GAAS,CACJ,GAAQ,EAAoB,UAAY,KAC1C,EAAS,EACT,IAAoB,EACpB,EAAoB,QAAU,GAElC,EACA,CAAC,EAAU,CAAiB,CAC9B,EACA,OAAuB,EAAA,EAAA,IAAA,CACrB,GACA,CACE,MAAO,EACP,iBACA,0BACA,qBAAsB,EACtB,UAA0B,EAAA,EAAA,IAAA,CACxB,MACA,CACE,IAAK,EACL,MAAO,CACL,QAAS,OACT,cAAe,SACf,SAAU,QACV,OAAQ,CACV,EACA,UAA0B,EAAA,EAAA,IAAA,CACxB,EAAU,IACV,CACE,GAAG,EACH,IAAK,EACL,MAAO,CAGL,UAAW,aAEX,UAAW,OACX,GAAG,EAAY,KACjB,CACF,CACF,CACF,CACF,CACF,CACF,CACF,EAAG,2BAA2B,CAAC,EAC3B,GAAuC,EAAM,WAA2B,EAAO,SAA+B,EAAO,EAAc,CACrI,GAAM,CACJ,gBACA,QAAQ,QACR,mBAAmB,EACnB,GAAG,GACD,EACE,EAAc,EAAe,CAAa,EAChD,OAAuB,EAAA,EAAA,IAAA,CACrBC,EACA,CACE,GAAG,EACH,GAAG,EACH,IAAK,EACL,QACA,mBACA,MAAO,CAEL,UAAW,aACX,GAAG,EAAY,MAGb,0CAA2C,uCAC3C,yCAA0C,sCAC1C,0CAA2C,uCAC3C,+BAAgC,mCAChC,gCAAiC,mCAErC,CACF,CACF,CACF,EAAG,sBAAsB,CAAC,EACtB,CAAC,GAAwB,GAA4B,EAAoB,EAAc,CAAC,CAAC,EACzF,GAAgB,iBAChB,GAAiC,EAAM,WACzB,EAAO,SAAyB,EAAO,EAAc,CACnE,GAAM,CAAE,gBAAe,QAAO,GAAG,GAAkB,EAC7C,EAAiB,EAAwB,GAAe,CAAa,EACrE,EAAkB,EAAyB,GAAe,CAAa,EACvE,EAAe,EAAgB,EAAc,EAAe,gBAAgB,EAC5E,EAAA,EAAyB,OAAO,CAAC,EACvC,OAAuB,EAAA,EAAA,KAAA,CAAKP,EAAAA,SAAW,CAAE,SAAU,EACjC,EAAA,EAAA,IAAA,CACd,QACA,CACE,wBAAyB,CACvB,OAAQ,2KACV,EACA,OACF,CACF,GACgB,EAAA,EAAA,IAAA,CAAI,EAAW,KAAM,CAAE,MAAO,EAAe,UAA0B,EAAA,EAAA,IAAA,CACrF,EAAU,IACV,CACE,6BAA8B,GAC9B,KAAM,eACN,GAAG,EACH,IAAK,EACL,MAAO,CAIL,SAAU,WACV,KAAM,EAKN,SAAU,cACV,GAAG,EAAc,KACnB,EACA,SAAU,EAAqB,EAAc,SAAW,GAAU,CAChE,IAAM,EAAW,EAAM,cACjB,CAAE,iBAAgB,2BAA4B,EACpD,GAAI,GAAyB,SAAW,EAAgB,CACtD,IAAM,EAAa,KAAK,IAAI,EAAiB,QAAU,EAAS,SAAS,EACzE,GAAI,EAAa,EAAG,CAClB,IAAM,EAAkB,OAAO,YAAc,EAAiB,EACxD,EAAe,WAAW,EAAe,MAAM,SAAS,EACxD,EAAY,WAAW,EAAe,MAAM,MAAM,EAClD,EAAa,KAAK,IAAI,EAAc,CAAS,EACnD,GAAI,EAAa,EAAiB,CAChC,IAAM,EAAa,EAAa,EAC1B,EAAoB,KAAK,IAAI,EAAiB,CAAU,EACxD,EAAa,EAAa,EAChC,EAAe,MAAM,OAAS,EAAoB,KAC9C,EAAe,MAAM,SAAW,QAClC,EAAS,UAAY,EAAa,EAAI,EAAa,EACnD,EAAe,MAAM,eAAiB,WAE1C,CACF,CACF,CACA,EAAiB,QAAU,EAAS,SACtC,CAAC,CACH,CACF,CAAE,CAAC,CACL,CAAE,CAAC,CACL,EAAG,gBAAgB,CACrB,EAEI,CAAC,GAA4B,IAAyB,EAAoB,aAAU,EACpFQ,GAA8B,EAAM,WACtB,EAAO,SAAsB,EAAO,EAAc,CAChE,GAAM,CAAE,gBAAe,GAAG,GAAe,EACnC,EAAU,EAAM,EACtB,OAAuB,EAAA,EAAA,IAAA,CAAI,GAA4B,CAAE,MAAO,EAAe,GAAI,EAAS,UAA0B,EAAA,EAAA,IAAA,CAAI,EAAU,IAAK,CAAE,KAAM,QAAS,kBAAmB,EAAS,GAAG,EAAY,IAAK,CAAa,CAAC,CAAE,CAAC,CAC7N,EAAG,aAAa,CAClB,EACI,GAAa,cACbC,GAA8B,EAAM,WACtB,EAAO,SAAsB,EAAO,EAAc,CAChE,GAAM,CAAE,gBAAe,GAAG,GAAe,EACnC,EAAe,GAAsB,GAAY,CAAa,EACpE,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAU,IAAK,CAAE,GAAI,EAAa,GAAI,GAAG,EAAY,IAAK,CAAa,CAAC,CACrG,EAAG,aAAa,CAClB,EACI,GAAY,aACZ,CAAC,GAA2B,IAAwB,EAAoB,EAAS,EACjFC,GAA6B,EAAM,WACrB,EAAO,SAAqB,EAAO,EAAc,CAC/D,GAAM,CACJ,gBACA,QACA,WAAW,GACX,UAAW,EACX,GAAG,GACD,EACE,EAAU,EAAiB,GAAW,CAAa,EACnD,EAAiB,EAAwB,GAAW,CAAa,EACjE,EAAa,EAAQ,QAAU,EAC/B,CAAC,EAAW,GAAA,EAAsB,SAAS,GAAiB,EAAE,EAC9D,CAAC,EAAW,GAAA,EAAsB,SAAS,EAAK,EAChD,EAAwB,EAC3B,GAAS,EAAe,kBAAkB,EAAM,EAAO,CAAQ,CAClE,EACM,EAAe,EAAgB,EAAc,CAAqB,EAClE,EAAS,EAAM,EACf,EAAA,EAAuB,OAAO,OAAO,EACrC,EAA+B,MAAa,CAC3C,IACH,EAAQ,cAAc,CAAK,EAC3B,EAAQ,aAAa,EAAK,EAE9B,EAAG,cAAc,EACjB,OAAuB,EAAA,EAAA,IAAA,CACrB,GACA,CACE,MAAO,EACP,QACA,WACA,SACA,aACA,iBAAA,EAAwB,YAAa,GAAS,CAC5C,EAAc,GAAkB,IAAkB,GAAM,aAAe,GAAA,CAAI,KAAK,CAAC,CACnF,EAAG,CAAC,CAAC,EACL,UAA0B,EAAA,EAAA,IAAA,CACxB,EAAW,SACX,CACE,MAAO,EACP,QACA,WACA,YACA,UAA0B,EAAA,EAAA,IAAA,CACxB,EAAU,IACV,CACE,KAAM,SACN,kBAAmB,EACnB,mBAAoB,EAAY,GAAK,IAAK,GAC1C,gBAAiB,GAAc,EAC/B,aAAc,EAAa,UAAY,YACvC,gBAAiB,GAAY,IAAK,GAClC,gBAAiB,EAAW,GAAK,IAAK,GACtC,SAAU,EAAW,IAAK,GAAI,GAC9B,GAAG,EACH,IAAK,EACL,QAAS,EAAqB,EAAU,YAAe,EAAa,EAAI,CAAC,EACzE,OAAQ,EAAqB,EAAU,WAAc,EAAa,EAAK,CAAC,EACxE,QAAS,EAAqB,EAAU,YAAe,CACjD,EAAe,UAAY,SAAS,EAAa,CACvD,CAAC,EACD,YAAa,EAAqB,EAAU,gBAAmB,CACzD,EAAe,UAAY,SAAS,EAAa,CACvD,CAAC,EACD,cAAe,EAAqB,EAAU,cAAgB,GAAU,CACtE,EAAe,QAAU,EAAM,WACjC,CAAC,EACD,cAAe,EAAqB,EAAU,cAAgB,GAAU,CACtE,EAAe,QAAU,EAAM,YAC3B,EACF,EAAe,cAAc,EACpB,EAAe,UAAY,SACpC,EAAM,cAAc,MAAM,CAAE,cAAe,EAAK,CAAC,CAErD,CAAC,EACD,eAAgB,EAAqB,EAAU,eAAiB,GAAU,CACpE,EAAM,gBAAkB,SAAS,eACnC,EAAe,cAAc,CAEjC,CAAC,EACD,UAAW,EAAqB,EAAU,UAAY,GAAU,CAC1D,GAAY,EAAM,SAAW,EAAM,gBAGjB,EAAe,WAAW,UAAY,IACvC,EAAM,MAAQ,OAG/B,EAAe,SAAS,EAAM,GAAG,GACnC,EAAa,EAEX,EAAM,MAAQ,KAChB,EAAM,eAAe,EAEzB,CAAC,CACH,CACF,CACF,CACF,CACF,CACF,CACF,EAAG,YAAY,CACjB,EACI,EAAiB,iBACjB,GAAiC,EAAM,WACzB,EAAO,SAAyB,EAAO,EAAc,CACnE,GAAM,CAAE,gBAAe,YAAW,QAAO,GAAG,GAAkB,EACxD,EAAU,EAAiB,EAAgB,CAAa,EACxD,EAAiB,EAAwB,EAAgB,CAAa,EACtE,EAAc,GAAqB,EAAgB,CAAa,EAChE,EAAuB,GAA8B,EAAgB,CAAa,EAClF,CAAC,EAAc,GAAA,EAAyB,SAAS,IAAI,EACrD,EAA4B,EAC/B,GAAS,EAAe,sBAAsB,EAAM,EAAY,MAAO,EAAY,QAAQ,CAC9F,EACM,EAAe,EACnB,EACA,EACA,EAAY,iBACZ,CACF,EACM,EAAc,GAAc,YAC5B,EAAA,EAAqB,aACH,EAAA,EAAA,IAAA,CAAI,SAAU,CAAE,MAAO,EAAY,MAAO,SAAU,EAAY,SAAU,SAAU,CAAY,EAAG,EAAY,KAAK,EAC1I,CAAC,EAAY,SAAU,EAAY,MAAO,CAAW,CACvD,EACM,CAAE,oBAAmB,wBAAyB,EAKpD,OAJA,OACE,EAAkB,CAAY,MACjB,EAAqB,CAAY,GAC7C,CAAC,EAAmB,EAAsB,CAAY,CAAC,GACnC,EAAA,EAAA,KAAA,CAAKV,EAAAA,SAAW,CAAE,SAAU,EACjC,EAAA,EAAA,IAAA,CAAI,EAAU,KAAM,CAAE,GAAI,EAAY,OAAQ,GAAG,EAAe,IAAK,CAAa,CAAC,EACnG,EAAY,YAAc,EAAQ,WAAa,CAAC,EAAQ,sBAAwB,CAAC,EAAsB,EAAQ,KAAK,EAAA,EAAa,aAAa,EAAc,SAAU,EAAQ,SAAS,EAAI,IAC7L,CAAE,CAAC,CACL,EAAG,gBAAgB,CACrB,EACI,GAAsB,sBACtB,GAAsC,EAAM,WAE9B,EAAO,SAA8B,EAAO,EAAc,CACxE,GAAM,CAAE,gBAAe,GAAG,GAAuB,EAEjD,OADoB,GAAqB,GAAqB,CAC7C,CAAC,CAAC,YAA6B,EAAA,EAAA,IAAA,CAAI,EAAU,KAAM,CAAE,cAAe,GAAM,GAAG,EAAoB,IAAK,CAAa,CAAC,EAAI,IAC3I,EAAG,qBAAqB,CAC1B,EACI,GAAwB,uBACxBW,GAAuC,EAAM,WAA2B,EAAO,SAA+B,EAAO,EAAc,CACrI,IAAM,EAAiB,EAAwB,GAAuB,EAAM,aAAa,EACnF,EAAkB,EAAyB,GAAuB,EAAM,aAAa,EACrF,CAAC,EAAa,GAAA,EAAwB,SAAS,EAAK,EACpD,EAAe,EAAgB,EAAc,EAAgB,oBAAoB,EAevF,OAdA,MAAsB,CACpB,GAAI,EAAe,UAAY,EAAe,aAAc,CAC1D,IAAI,EAAgB,UAAW,CAC7B,IAAM,EAAe,EAAS,UAAY,EAC1C,EAAe,CAAY,CAC7B,EAEA,EAAO,EAAe,cAAc,EACpC,IAAM,EAAW,EAAe,SAGhC,OAFA,EAAc,EACd,EAAS,iBAAiB,SAAU,CAAa,MACpC,EAAS,oBAAoB,SAAU,CAAa,CACnE,CACF,EAAG,CAAC,EAAe,SAAU,EAAe,YAAY,CAAC,EAClD,GAA8B,EAAA,EAAA,IAAA,CACnC,GACA,CACE,GAAG,EACH,IAAK,EACL,iBAAoB,CAClB,GAAM,CAAE,WAAU,gBAAiB,EAC/B,GAAY,IACd,EAAS,WAAiC,EAAa,aAE3D,CACF,CACF,EAAI,IACN,EAAG,sBAAsB,CAAC,EACtB,GAA0B,yBAC1BC,GAAyC,EAAM,WAA2B,EAAO,SAAiC,EAAO,EAAc,CACzI,IAAM,EAAiB,EAAwB,GAAyB,EAAM,aAAa,EACrF,EAAkB,EAAyB,GAAyB,EAAM,aAAa,EACvF,CAAC,EAAe,GAAA,EAA0B,SAAS,EAAK,EACxD,EAAe,EAAgB,EAAc,EAAgB,oBAAoB,EAgBvF,OAfA,MAAsB,CACpB,GAAI,EAAe,UAAY,EAAe,aAAc,CAC1D,IAAI,EAAgB,UAAW,CAC7B,IAAM,EAAY,EAAS,aAAe,EAAS,aAC7C,EAAiB,KAAK,KAAK,EAAS,SAAS,EAAI,EACvD,EAAiB,CAAc,CACjC,EAEA,EAAO,EAAe,cAAc,EACpC,IAAM,EAAW,EAAe,SAGhC,OAFA,EAAc,EACd,EAAS,iBAAiB,SAAU,CAAa,MACpC,EAAS,oBAAoB,SAAU,CAAa,CACnE,CACF,EAAG,CAAC,EAAe,SAAU,EAAe,YAAY,CAAC,EAClD,GAAgC,EAAA,EAAA,IAAA,CACrC,GACA,CACE,GAAG,EACH,IAAK,EACL,iBAAoB,CAClB,GAAM,CAAE,WAAU,gBAAiB,EAC/B,GAAY,IACd,EAAS,WAAiC,EAAa,aAE3D,CACF,CACF,EAAI,IACN,EAAG,wBAAwB,CAAC,EACxB,GAAyC,EAAM,WAA2B,EAAO,SAAiC,EAAO,EAAc,CACzI,GAAM,CAAE,gBAAe,eAAc,GAAG,GAAyB,EAC3D,EAAiB,EAAwB,qBAAsB,CAAa,EAC5E,EAAA,EAA2B,OAAO,IAAI,EACtC,EAAW,EAAc,CAAa,EACtC,EAAA,EAA6B,gBAAkB,CAC/C,EAAmB,UAAY,OACjC,OAAO,cAAc,EAAmB,OAAO,EAC/C,EAAmB,QAAU,KAEjC,EAAG,CAAC,CAAC,EAQL,OAPA,EAAM,kBACS,EAAqB,EACjC,CAAC,CAAoB,CAAC,EACzB,MAAsB,CAEpB,EAD4B,CAAC,CAAC,KAAM,GAAS,EAAK,IAAI,UAAY,SAAS,aAClE,CAAC,EAAE,IAAI,SAAS,eAAe,CAAE,MAAO,SAAU,CAAC,CAC9D,EAAG,CAAC,CAAQ,CAAC,GACU,EAAA,EAAA,IAAA,CACrB,EAAU,IACV,CACE,cAAe,GACf,GAAG,EACH,IAAK,EACL,MAAO,CAAE,WAAY,EAAG,GAAG,EAAqB,KAAM,EACtD,cAAe,EAAqB,EAAqB,kBAAqB,CACxE,EAAmB,UAAY,OACjC,EAAmB,QAAU,OAAO,YAAY,EAAc,EAAE,EAEpE,CAAC,EACD,cAAe,EAAqB,EAAqB,kBAAqB,CAC5E,EAAe,cAAc,EACzB,EAAmB,UAAY,OACjC,EAAmB,QAAU,OAAO,YAAY,EAAc,EAAE,EAEpE,CAAC,EACD,eAAgB,EAAqB,EAAqB,mBAAsB,CAC9E,EAAqB,CACvB,CAAC,CACH,CACF,CACF,EAAG,wBAAwB,CAAC,EACxBC,GAAkC,EAAM,WAE1B,EAAO,SAA0B,EAAO,EAAc,CACpE,GAAM,CAAE,gBAAe,GAAG,GAAmB,EAC7C,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAU,IAAK,CAAE,cAAe,GAAM,GAAG,EAAgB,IAAK,CAAa,CAAC,CACzG,EAAG,iBAAiB,CACtB,EAUI,GAAoB,oBACpB,GAAoC,EAAM,WAE5B,EAAO,SAA4B,CAAE,gBAAe,GAAG,GAAS,EAAc,CAC5F,IAAM,EAAU,EAAiB,GAAmB,CAAa,EAC3D,CAAE,QAAO,gBAAe,WAAU,WAAU,OAAM,eAAc,QAAS,EACzE,CAAE,gBAAe,mBAAoB,EACrC,EAAA,EAAY,OAAO,IAAI,EACvB,EAAe,EAAgB,EAAc,CAAG,EAChD,EAAc,GAAS,GACvB,EAAY,EAAY,CAAW,EACnC,EAAsB,MAAM,KAAK,CAAa,CAAC,CAAC,KACnD,IAAY,EAAO,MAAM,OAAS,MAAQ,EAC7C,EAgBA,OAfA,EAAM,cAAgB,CACpB,IAAM,EAAS,EAAI,QACnB,GAAI,CAAC,EAAQ,OACb,IAAM,EAAc,OAAO,kBAAkB,UAKvC,EAJa,OAAO,yBACxB,EACA,OAEwB,CAAC,CAAC,IAC5B,GAAI,IAAc,GAAe,EAAU,CACzC,IAAM,EAAQ,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,EACnD,EAAS,KAAK,EAAQ,CAAW,EACjC,EAAO,cAAc,CAAK,CAC5B,CACF,EAAG,CAAC,EAAW,CAAW,CAAC,GACJ,EAAA,EAAA,KAAA,CACrB,EAAU,OACV,CACE,cAAe,GACf,WACA,SAAU,GACV,OACA,eACA,WACA,OACA,SAAW,GAAU,EAAc,EAAM,OAAO,KAAK,EACrD,GAAG,EACH,MAAO,CAAE,GAAG,GAAwB,GAAG,EAAM,KAAM,EACnD,IAAK,EACL,aAAc,EACd,SAAU,CACR,EAAsB,CAAK,GAAK,CAAC,GAAsC,EAAA,EAAA,IAAA,CAAI,SAAU,CAAE,MAAO,EAAG,CAAC,EAAI,KACtG,MAAM,KAAK,CAAa,CAC1B,CACF,EACA,CACF,CACF,EAAG,mBAAmB,CACxB,EACA,SAAS,GAAW,EAAO,CACzB,OAAO,OAAO,GAAU,UAC1B,CACA,EAAO,GAAY,YAAY,EAC/B,SAAS,EAAsB,EAAO,CACpC,OAAO,IAAU,IAAM,IAAU,IAAK,EACxC,CACA,EAAO,EAAuB,uBAAuB,EACrD,SAAS,GAAmB,EAAgB,CAC1C,IAAM,EAAqB,EAAe,CAAc,EAClD,EAAA,EAAkB,OAAO,EAAE,EAC3B,EAAA,EAAiB,OAAO,CAAC,EACzB,EAAA,EAA8B,YACjC,GAAQ,CACP,IAAM,EAAS,EAAU,QAAU,EACnC,EAAmB,CAAM,EACR,GAAQ,SAAS,EAAa,EAAO,CACpD,EAAU,QAAU,EACpB,OAAO,aAAa,EAAS,OAAO,EAChC,IAAU,KAAI,EAAS,QAAU,OAAO,eAAiB,EAAa,EAAE,EAAG,GAAG,EACpF,GAAI,cAAc,CAAA,CAAG,CAAM,CAC7B,EACA,CAAC,CAAkB,CACrB,EACM,EAAA,EAAuB,gBAAkB,CAC7C,EAAU,QAAU,GACpB,OAAO,aAAa,EAAS,OAAO,CACtC,EAAG,CAAC,CAAC,EAIL,OAHA,EAAM,kBACS,OAAO,aAAa,EAAS,OAAO,EAChD,CAAC,CAAC,EACE,CAAC,EAAW,EAAuB,CAAc,CAC1D,CACA,EAAO,GAAoB,oBAAoB,EAC/C,SAAS,GAAa,EAAO,EAAQ,EAAa,CAEhD,IAAM,EADa,EAAO,OAAS,GAAK,MAAM,KAAK,CAAM,CAAC,CAAC,MAAO,GAAS,IAAS,EAAO,EAAE,EACvD,EAAO,GAAK,EAC5C,EAAmB,EAAc,EAAM,QAAQ,CAAW,EAAI,GAChE,EAAe,GAAU,EAAO,KAAK,IAAI,EAAkB,CAAC,CAAC,EACtC,EAAiB,SAAW,IAC/B,EAAe,EAAa,OAAQ,GAAM,IAAM,CAAW,GACnF,IAAM,EAAW,EAAa,KAC3B,GAAS,EAAK,UAAU,YAAY,CAAC,CAAC,WAAW,EAAiB,YAAY,CAAC,CAClF,EACA,OAAO,IAAa,EAAyB,IAAK,GAAhB,CACpC,CACA,EAAO,GAAc,cAAc,EACnC,SAAS,GAAU,EAAO,EAAY,CACpC,OAAO,EAAM,KAAK,EAAG,IAAU,GAAO,EAAa,GAAS,EAAM,OAAO,CAC3E,CACA,EAAO,GAAW,WAAW,EChpC7B,SAAS,GAAW,CAClB,gBACA,GAAG,GAC+E,CAClF,IAAM,EAAA,EAA0B,YAC7B,GAAkB,CACb,IAAU,IAAI,IAAgB,CAAK,CACzC,EACA,CAAC,CAAa,CAChB,EACA,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAsB,cAAe,EAAmB,GAAI,CAAQ,CAAA,CAC7E,CACA,GAAW,YAAc,SAEzB,IAAa,GAAS,GACT,GAAc,GACd,GAAc,GAEd,GAAA,EAAsB,YAGhC,CAAE,YAAW,WAAU,eAAc,GAAG,GAAS,KAchD,EAAA,EAAA,KAAA,CAAC,GAAD,CACO,MACL,UAAW,EACT,sTACA,CACF,EACA,aAnBsB,GAAiD,CAGzE,IAAM,EAAY,EAAE,cAAc,cAA2B,MAAM,EAC/D,GAAa,EAAU,YAAc,EAAU,YACjD,EAAE,cAAc,MAAQ,EAAU,aAAe,GAEjD,EAAE,cAAc,gBAAgB,OAAO,EAEzC,IAAe,CAAC,CAClB,EAUI,GAAI,EAPN,SAAA,CASG,GACD,EAAA,EAAA,IAAA,CAAC,GAAD,CAAsB,QAAA,GACpB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,UAAU,oBAAsB,CAAA,CACzB,CAAA,CACC,GAE5B,EACD,GAAc,YAAA,GAAsC,YAEpD,IAAa,GAAA,EAA6B,YAGvC,CAAE,YAAW,GAAG,GAAS,KAI1B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oBACb,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CACO,MACL,UAAW,EAAG,8DAA+D,CAAS,EACtF,GAAI,EAEJ,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,UAAU,SAAW,CAAA,CACF,CAAA,CAC7B,CAAA,CACN,EACD,GAAqB,YAAA,GAA6C,YAElE,IAAa,GAAA,EAA+B,YAGzC,CAAE,YAAW,GAAG,GAAS,KAI1B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oBACb,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CACO,MACL,UAAW,EAAG,8DAA+D,CAAS,EACtF,GAAI,EAEJ,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,UAAU,SAAW,CAAA,CACF,CAAA,CAC/B,CAAA,CACN,EACD,GAAuB,YAAA,GAA+C,YAStE,IAAa,GAAA,EAAsB,YAGhC,CAAE,YAAW,WAAU,WAAW,SAAU,mBAAkB,YAAW,GAAG,GAAS,IAAQ,CAC9F,IAAM,EAAkB,EAAmB,EACrC,EAAkB,EAA4B,EACpD,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,UAAW,GAAa,EAC9C,UAAA,EAAA,EAAA,KAAA,CAAC,GAAD,CACO,MACL,UAAW,EAIT,sYACA,IAAa,UACX,kIACF,CACF,EACU,WACV,iBAAkB,GAAoB,EACtC,GAAI,EAbN,SAAA,EAeE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAuB,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,UAAW,EACT,MACA,IAAa,UACX,yFACJ,EAEC,UACuB,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAyB,CAAA,CACF,GACH,CAAA,CAE5B,CAAC,EACD,GAAc,YAAA,GAAsC,YAEpD,IAAa,GAAA,EAAoB,YAG9B,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,GAAD,CACO,MACL,UAAW,EAAG,oCAAqC,CAAS,EAC5D,GAAI,CACL,CAAA,CACF,EACD,GAAY,YAAA,GAAoC,YAEhD,IAAa,GAAA,EAAmB,YAG7B,CAAE,YAAW,WAAU,GAAG,GAAS,KACpC,EAAA,EAAA,KAAA,CAAC,GAAD,CACO,MACL,UAAW,EACT,4NACA,CACF,EACA,MAAO,OAAO,GAAa,SAAW,EAAW,IAAA,GACjD,GAAI,EAPN,SAAA,EASE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,+DACd,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,UAAU,SAAW,CAAA,CACC,CAAA,CAC3B,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,GAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,iBAAkB,UAAe,CAAA,CACzB,CAAA,CACN,CACvB,CAAA,CAAA,EACD,GAAW,YAAA,GAAmC,YAE9C,IAAa,GAAA,EAAwB,YAGlC,CAAE,YAAW,GAAG,GAAS,KAC1B,EAAA,EAAA,IAAA,CAAC,GAAD,CACO,MACL,UAAW,EAAG,2BAA4B,CAAS,EACnD,GAAI,CACL,CAAA,CACF,EACD,GAAgB,YAAA,GAAwC,YASxD,IAAa,GAAA,EAAqB,YAC/B,CAAE,YAAW,WAAU,GAAG,GAAS,KAClC,EAAA,EAAA,IAAA,CAAC,SAAD,CACO,MACL,UAAW,EACT,mNACA,CACF,EACA,GAAI,EAEH,UACK,CAAA,CAEZ,EACA,GAAa,YAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"send-Bzb_4uMT.js","names":["__iconNode"],"sources":["../../../../../node_modules/.bun/lucide-react@1.31.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/message-square.mjs","../../../../../node_modules/.bun/lucide-react@1.31.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/send.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.31.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: \"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\",\n key: \"18887p\"\n }\n ]\n];\nconst MessageSquare = createLucideIcon(\"message-square\", __iconNode);\n\nexport { __iconNode, MessageSquare as default };\n//# sourceMappingURL=message-square.mjs.map\n","/**\n * @license lucide-react v1.31.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: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n];\nconst Send = createLucideIcon(\"send\", __iconNode);\n\nexport { __iconNode, Send as default };\n//# sourceMappingURL=send.mjs.map\n"],"x_google_ignoreList":[0,1],"mappings":"mDAkBA,IAAM,EAAgB,EAAiB,iBAAkBA,CARvD,CACE,OACA,CACE,EAAG,sHACH,IAAK,QACP,CACF,CAEuDA,CAAU,ECC7D,EAAO,EAAiB,OAAQ,CATpC,CACE,OACA,CACE,EAAG,kIACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAS,CAAC,CAEvB,CAAU"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t}from"./createLucideIcon-QE2kj6ru.js";import{C as n,l as r}from"./floating-layer-BcTp2AMB.js";import{t as i}from"./bot-CuDPD_ZU.js";import{t as a}from"./trash-2-BIJVpWxv.js";import{t as o}from"./copy-5fb4qj-_.js";import{t as s}from"./key-round-oSqmVdkQ.js";import{t as c}from"./plus-D7PHzena.js";import{t as l}from"./save-BkkrgP5Q.js";import{t as u}from"./square-pen-ZvVEwkzw.js";import{t as d}from"./triangle-alert-yljVpQCM.js";import{t as f}from"./x-c-gfVPJa.js";import{o as p}from"./dist-DPxQeZn3.js";import{t as m}from"./textarea-C2w7TG3h.js";import{i as h,t as g}from"./json-editor-BD0UhGOT.js";import{a as _,c as v,i as y,o as b,r as x,s as S,t as C}from"./empty-DMs98grx.js";import{E as w,I as T,J as ee,N as E,R as D,d as O,z as k}from"./hooks-BiOfAnEq.js";import{a as te,i as ne,n as re,o as ie,t as ae}from"./select-BOe2daO9.js";import{t as A}from"./badge-CdW_Z0lB.js";import{a as oe,i as j,n as se,r as ce,t as M}from"./card-BYbadRar.js";import{a as N,i as P,n as F,o as I,r as L,t as R}from"./table-RI-lM4fw.js";import{B as z,Dt as B,G as V,H,U,V as W,W as G,at as K,bt as le,d as ue,et as q,i as de,l as J,nt as Y,o as fe,r as pe,xt as me}from"./index-CASCzvYu.js";var X=e(t(),1),Z=n();function Q({icon:e,title:t,description:n,action:i,bodyClassName:a,children:o}){return(0,Z.jsxs)(M,{children:[(0,Z.jsxs)(j,{className:r(`flex-col items-start gap-2`,i&&`sm:flex-row sm:items-center sm:justify-between`),children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1.5`,children:[(0,Z.jsxs)(oe,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(e,{className:`size-5`}),t]}),n?(0,Z.jsx)(ce,{children:n}):null]}),i]}),(0,Z.jsx)(se,{className:r(`min-w-0`,a),children:o})]})}function he({children:e}){return(0,Z.jsx)(`div`,{className:`-mx-6 overflow-x-auto sm:mx-0`,children:e})}function ge({icon:e,title:t,description:n}){return(0,Z.jsx)(C,{className:`border-0`,children:(0,Z.jsxs)(y,{children:[(0,Z.jsx)(_,{children:(0,Z.jsx)(e,{})}),(0,Z.jsx)(b,{children:t}),n?(0,Z.jsx)(x,{children:n}):null]})})}function _e({isLoading:e,error:t,isEmpty:n,loadingLabel:r,empty:i,children:a}){return e?(0,Z.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:r}):t?(0,Z.jsx)(`div`,{className:`rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive`,children:t instanceof Error?t.message:String(t)}):n?(0,Z.jsx)(ge,{...i}):(0,Z.jsx)(Z.Fragment,{children:a})}function ve(){let e=T(),t=J(),{t:n}=E(),r=k({queryKey:[`modern-admin`,`ai-assistant`,`settings`],queryFn:()=>e.getAiAssistantSettings()}),[a,o]=X.useState({enabled:!0,model:`google/gemini-3.1-flash-lite-preview`,apiKey:``,systemPrompt:``});X.useEffect(()=>{r.data&&o({enabled:r.data.enabled,model:r.data.model,apiKey:``,systemPrompt:r.data.systemPrompt})},[r.data]);let c=D({mutationFn:async()=>e.updateAiAssistantSettings({enabled:a.enabled,model:a.model,...a.apiKey.trim()?{apiKey:a.apiKey.trim()}:{},systemPrompt:a.systemPrompt}),onSuccess:()=>{r.refetch(),o(e=>({...e,apiKey:``})),t.success({message:n(`aiAssistant:settings.saved`)})},onError:e=>{t.error({message:e instanceof Error?e.message:String(e)})}});if(r.isLoading)return(0,Z.jsx)(`div`,{className:`py-8 text-sm text-muted-foreground`,children:n(`common:loading`)});if(r.error)return(0,Z.jsx)(`div`,{className:`rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive`,children:r.error instanceof Error?r.error.message:String(r.error)});let u=r.data;return u?(0,Z.jsx)(`div`,{className:`flex flex-col gap-4`,children:(0,Z.jsxs)(Q,{icon:i,title:n(`aiAssistant:settings.title`),description:n(`aiAssistant:settings.description`),bodyClassName:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(A,{variant:u.enabled?`secondary`:`outline`,children:u.enabled?n(`aiAssistant:settings.enabled`):n(`aiAssistant:settings.disabled`)}),(0,Z.jsx)(A,{variant:u.configured?`secondary`:`outline`,children:u.configured?n(`aiAssistant:settings.configured`):n(`aiAssistant:settings.apiKeyRequired`)}),(0,Z.jsx)(A,{variant:`outline`,children:n(`aiAssistant:settings.readOnly`)}),(0,Z.jsx)(A,{variant:`outline`,children:n(`aiAssistant:settings.provider`,{provider:u.provider})})]}),(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded-lg border border-border p-3`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(q,{htmlFor:`ai-assistant-enabled`,children:n(`aiAssistant:settings.enableLabel`)}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n(`aiAssistant:settings.enableHint`)})]}),(0,Z.jsx)(v,{id:`ai-assistant-enabled`,checked:a.enabled,disabled:!u.canManage||c.isPending,onCheckedChange:e=>o(t=>({...t,enabled:e}))})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(q,{htmlFor:`ai-assistant-model`,children:n(`aiAssistant:settings.modelLabel`)}),(0,Z.jsx)(Y,{id:`ai-assistant-model`,value:a.model,disabled:!u.canManage||c.isPending,onChange:e=>o(t=>({...t,model:e.target.value})),placeholder:`google/gemini-3.1-flash-lite-preview`})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(q,{htmlFor:`ai-assistant-api-key`,className:`flex items-center gap-2`,children:[(0,Z.jsx)(s,{className:`size-4`}),n(`aiAssistant:settings.apiKeyLabel`)]}),(0,Z.jsx)(Y,{id:`ai-assistant-api-key`,type:`password`,value:a.apiKey,disabled:!u.canManage||c.isPending,onChange:e=>o(t=>({...t,apiKey:e.target.value})),placeholder:u.maskedApiKey??`sk-or-v1-...`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n(`aiAssistant:settings.apiKeyHint`)})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(q,{htmlFor:`ai-assistant-system-prompt`,children:n(`aiAssistant:settings.systemPromptLabel`)}),(0,Z.jsx)(m,{id:`ai-assistant-system-prompt`,value:a.systemPrompt,disabled:!u.canManage||c.isPending,onChange:e=>o(t=>({...t,systemPrompt:e.target.value})),rows:8,placeholder:n(`aiAssistant:settings.systemPromptPlaceholder`)})]}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-lg border border-border p-3 text-sm`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`font-medium`,children:n(`aiAssistant:settings.accessTitle`)}),(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:n(`aiAssistant:settings.accessDescription`)})]}),(0,Z.jsx)(A,{variant:`outline`,children:n(`aiAssistant:settings.futureToolsReady`)})]}),(0,Z.jsx)(`div`,{className:`flex justify-end`,children:(0,Z.jsxs)(p,{onClick:()=>c.mutate(),disabled:!u.canManage||c.isPending||!a.model.trim(),children:[(0,Z.jsx)(l,{className:`size-4`}),c.isPending?n(`aiAssistant:settings.saving`):n(`aiAssistant:settings.save`)]})})]})}):(0,Z.jsx)(`div`,{className:`py-8 text-sm text-muted-foreground`,children:n(`aiAssistant:settings.empty`)})}var $=[`modern-admin`,`api-keys`],ye=[`modern-admin`,`webhooks`],be=[{key:`api-keys`,labelKey:`settings:apiKeys.title`,icon:s},{key:`webhooks`,labelKey:`settings:webhooks.title`,icon:K},{key:`ai-assistant`,labelKey:`aiAssistant:title`,icon:i}];function xe({section:e}){let{t}=E(),n=fe(),i=O(),a=X.useMemo(()=>[...be.filter(e=>e.key===`api-keys`?i.apiKeys:e.key===`webhooks`?i.webhooks:e.key!==`ai-assistant`||i.aiAssistant),...ue().map(e=>({key:e.key,labelKey:e.labelKey,icon:e.icon,isExtension:!0}))],[i.apiKeys,i.webhooks,i.aiAssistant]),o=[`api-keys`,`webhooks`,`ai-assistant`],s=e=>o.includes(e),c=e??null,l=c&&a.some(e=>e.key===c)?c:a[0]?.key??null;return l===null?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed bg-card p-8 text-center text-sm text-muted-foreground`,children:t(`settings:noSectionsConfigured`)}):(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 lg:grid lg:grid-cols-[14rem_minmax(0,1fr)]`,children:[(0,Z.jsx)(`div`,{className:`lg:hidden`,children:(0,Z.jsxs)(ae,{value:l??``,onValueChange:e=>n({name:`settings`,section:e}),children:[(0,Z.jsx)(te,{className:`w-full`,children:(0,Z.jsx)(ie,{})}),(0,Z.jsx)(re,{children:a.map(({key:e,labelKey:n,icon:r})=>(0,Z.jsx)(ne,{value:e,children:(0,Z.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(r,{className:`size-4`}),(0,Z.jsx)(`span`,{children:t(n)})]})},e))})]})}),(0,Z.jsx)(`aside`,{className:`hidden lg:block`,children:(0,Z.jsx)(`nav`,{className:`flex flex-col gap-1`,children:a.map(({key:e,labelKey:n,icon:i})=>(0,Z.jsxs)(de,{to:{name:`settings`,section:e},className:r(`flex items-center gap-2 rounded-md px-3 py-2 text-sm hover:bg-accent`,l===e&&`bg-accent font-medium`),children:[(0,Z.jsx)(i,{className:`size-4`}),(0,Z.jsx)(`span`,{children:t(n)})]},e))})}),(0,Z.jsxs)(`section`,{className:`min-w-0`,children:[l&&s(l)&&l===`api-keys`&&(0,Z.jsx)(Se,{}),l&&s(l)&&l===`webhooks`&&(0,Z.jsx)(ke,{}),l&&s(l)&&l===`ai-assistant`&&(0,Z.jsx)(ve,{}),l&&!s(l)&&(()=>{let e=ue().find(e=>e.key===l);return e?(0,Z.jsx)(e.component,{}):null})()]})]})}function Se(){let{t:e}=E(),t=T(),n=ee(),r=J(),i=pe(),o=w(),[l,d]=X.useState(!1),[f,m]=X.useState(null),[h,g]=X.useState(null),_=k({queryKey:$,queryFn:()=>t.listApiKeys()}),y=D({mutationFn:e=>t.deleteApiKey(e),onSuccess:()=>{n.invalidateQueries({queryKey:$}),r.success({key:`settings:apiKeys.notice.revoked`})},onError:e=>r.error({message:e instanceof Error?e.message:String(e)})}),b=D({mutationFn:e=>t.updateApiKey(e.id,{enabled:e.enabled}),onSuccess:()=>n.invalidateQueries({queryKey:$}),onError:e=>r.error({message:e instanceof Error?e.message:String(e)})}),x=()=>{m(null),d(!0)},S=e=>{m(e),d(!0)},C=async t=>{await i.confirm({title:e(`settings:apiKeys.confirmRevoke.title`),description:e(`settings:apiKeys.confirmRevoke.description`,{name:t.name??t.id}),confirmLabel:e(`settings:apiKeys.actions.revoke`),destructive:!0})&&y.mutate(t.id)},O=_.data?.keys??[];return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsx)(Q,{icon:s,title:e(`settings:apiKeys.title`),description:e(`settings:apiKeys.description`),action:(0,Z.jsxs)(p,{onClick:x,size:`sm`,children:[(0,Z.jsx)(c,{className:`size-4`}),(0,Z.jsx)(`span`,{children:e(`settings:apiKeys.actions.create`)})]}),children:(0,Z.jsx)(_e,{isLoading:_.isLoading,error:_.error,isEmpty:O.length===0,loadingLabel:e(`common:loading`),empty:{icon:s,title:e(`settings:apiKeys.empty.title`),description:e(`settings:apiKeys.empty.description`)},children:(0,Z.jsx)(he,{children:(0,Z.jsxs)(R,{children:[(0,Z.jsx)(N,{children:(0,Z.jsxs)(I,{children:[(0,Z.jsx)(P,{children:e(`settings:apiKeys.columns.name`)}),(0,Z.jsx)(P,{className:`hidden sm:table-cell`,children:e(`settings:apiKeys.columns.start`)}),(0,Z.jsx)(P,{className:`hidden md:table-cell`,children:e(`settings:apiKeys.columns.permissions`)}),(0,Z.jsx)(P,{className:`hidden md:table-cell`,children:e(`settings:apiKeys.columns.expiresAt`)}),(0,Z.jsx)(P,{children:e(`settings:apiKeys.columns.enabled`)}),(0,Z.jsx)(P,{className:`text-right`,children:e(`settings:apiKeys.columns.actions`)})]})}),(0,Z.jsx)(F,{children:O.map(t=>(0,Z.jsxs)(I,{children:[(0,Z.jsx)(L,{className:`font-medium`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col`,children:[(0,Z.jsx)(`span`,{children:t.name??t.id}),t.lastRequest&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e(`settings:apiKeys.lastUsed`,{date:Fe(t.lastRequest)})})]})}),(0,Z.jsx)(L,{className:`hidden font-mono text-xs sm:table-cell`,children:t.start?`${t.start}…`:`—`}),(0,Z.jsx)(L,{className:`hidden md:table-cell`,children:(0,Z.jsx)(Ee,{permissions:t.permissions})}),(0,Z.jsx)(L,{className:`hidden md:table-cell text-xs`,children:t.expiresAt?Fe(t.expiresAt):e(`settings:apiKeys.expiresNever`)}),(0,Z.jsx)(L,{children:(0,Z.jsx)(v,{checked:t.enabled,onCheckedChange:e=>b.mutate({id:t.id,enabled:e}),"aria-label":e(`settings:apiKeys.columns.enabled`)})}),(0,Z.jsx)(L,{className:`text-right`,children:(0,Z.jsxs)(`div`,{className:`inline-flex gap-1`,children:[(0,Z.jsx)(p,{variant:`ghost`,size:`sm`,onClick:()=>S(t),"aria-label":e(`settings:apiKeys.actions.edit`),children:(0,Z.jsx)(u,{className:`size-4`})}),(0,Z.jsx)(p,{variant:`ghost`,size:`sm`,onClick:()=>C(t),"aria-label":e(`settings:apiKeys.actions.revoke`),disabled:y.isPending,children:(0,Z.jsx)(a,{className:`size-4 text-destructive`})})]})})]},t.id))})]})})})}),(0,Z.jsx)(De,{open:l,onOpenChange:d,editing:f,resources:o,onCreated:e=>{d(!1),g(e),n.invalidateQueries({queryKey:$})},onUpdated:()=>{d(!1),n.invalidateQueries({queryKey:$})}},f?.id??`new`),(0,Z.jsx)(Pe,{secret:h,onClose:()=>g(null)})]})}var Ce=e=>({byResource:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,new Set(t)]))}),we=e=>{let t={};for(let[n,r]of Object.entries(e.byResource))r.size!==0&&(t[n]=Array.from(r));return t};function Te({resources:e,state:t,onChange:n}){let{t:i}=E(),a=(e,r)=>{let i=new Set(t.byResource[e]??[]);i.has(r)?i.delete(r):i.add(r),n({byResource:{...t.byResource,[e]:i}})},o=(e,r)=>{let i=t.byResource[e]??new Set,a=r.every(e=>i.has(e)),o=new Set(a?[]:r);n({byResource:{...t.byResource,[e]:o}})},s=X.useMemo(()=>e.filter(e=>(e.actions??[]).length>0),[e]),c=s.length>0&&s.every(e=>{let n=(e.actions??[]).map(e=>e.name),r=t.byResource[e.id]??new Set;return n.every(e=>r.has(e))});return e.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:i(`settings:apiKeys.permissions.noResources`)}):(0,Z.jsxs)(`div`,{className:`rounded-md border border-border`,children:[s.length>0&&(0,Z.jsx)(`div`,{className:`flex flex-wrap items-center justify-end gap-2 border-b border-border bg-muted/30 px-3 py-2`,children:(0,Z.jsx)(p,{type:`button`,variant:`outline`,size:`sm`,className:`h-8`,onClick:()=>{let r=!c,i={...t.byResource};for(let t of e){let e=(t.actions??[]).map(e=>e.name);i[t.id]=r?new Set(e):new Set}n({byResource:i})},children:c?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(f,{className:`mr-1.5 size-3.5`}),i(`settings:apiKeys.permissions.clearAllResources`)]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(B,{className:`mr-1.5 size-3.5`}),i(`settings:apiKeys.permissions.selectAllResources`)]})})}),(0,Z.jsx)(`div`,{className:`max-h-[24rem] overflow-y-auto`,children:(0,Z.jsxs)(R,{children:[(0,Z.jsx)(N,{className:`sticky top-0 bg-card`,children:(0,Z.jsxs)(I,{children:[(0,Z.jsx)(P,{className:`w-[14rem]`,children:i(`settings:apiKeys.permissions.resource`)}),(0,Z.jsx)(P,{children:i(`settings:apiKeys.permissions.actions`)})]})}),(0,Z.jsx)(F,{children:e.map(e=>{let n=(e.actions??[]).map(e=>e.name),s=t.byResource[e.id]??new Set,c=n.length>0&&n.every(e=>s.has(e));return(0,Z.jsxs)(I,{children:[(0,Z.jsx)(L,{className:`align-top`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:e.name}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.id}),(0,Z.jsxs)(`button`,{type:`button`,className:`mt-1 inline-flex items-center gap-1 self-start text-xs text-primary hover:underline`,onClick:()=>o(e.id,n),children:[c?(0,Z.jsx)(f,{className:`size-3`}):(0,Z.jsx)(B,{className:`size-3`}),i(c?`settings:apiKeys.permissions.clearAll`:`settings:apiKeys.permissions.selectAll`)]})]})}),(0,Z.jsx)(L,{children:(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:n.map(t=>{let n=s.has(t);return(0,Z.jsxs)(`label`,{className:r(`inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border px-2 py-1 text-xs`,n&&`border-primary bg-primary/10 text-primary`),children:[(0,Z.jsx)(h,{checked:n,onCheckedChange:()=>a(e.id,t),className:`size-3.5`}),(0,Z.jsx)(`span`,{children:t})]},t)})})})]},e.id)})})]})})]})}function Ee({permissions:e}){let{t}=E(),n=Object.entries(e);if(n.length===0)return(0,Z.jsx)(A,{variant:`outline`,children:t(`settings:apiKeys.permissions.none`)});let r=n.reduce((e,[,t])=>e+t.length,0);return(0,Z.jsx)(A,{variant:`secondary`,children:t(`settings:apiKeys.permissions.summary`,{resources:n.length,actions:r})})}function De({open:e,onOpenChange:t,editing:n,resources:r,onCreated:i,onUpdated:a}){let{t:o}=E(),s=T(),c=J(),l=!!n,[u,d]=X.useState(n?.name??``),[f,m]=X.useState(()=>{if(!n?.expiresAt)return``;let e=new Date(n.expiresAt).getTime()-Date.now();return e>0?String(Math.max(1,Math.round(e/864e5))):``}),[h,g]=X.useState(()=>Ce(n?.permissions??{})),_=D({mutationFn:async()=>{let e=we(h);if(l&&n){let t=f.trim()===``?null:Number(f);return{record:(await s.updateApiKey(n.id,{name:u.trim(),permissions:e,expiresInDays:t===null?null:Number.isFinite(t)&&t>0?t:void 0})).record}}let t=f.trim()===``?null:Number(f);return s.createApiKey({name:u.trim(),permissions:e,expiresInDays:t===null?null:Number.isFinite(t)&&t>0?t:void 0})},onSuccess:e=>{l?(c.success({key:`settings:apiKeys.notice.updated`}),a(e.record)):e.key&&i({key:e.key,record:e.record})},onError:e=>c.error({message:e instanceof Error?e.message:String(e)})});X.useEffect(()=>{if(e){if(d(n?.name??``),g(Ce(n?.permissions??{})),!n?.expiresAt)m(``);else{let e=new Date(n.expiresAt).getTime()-Date.now();m(e>0?String(Math.max(1,Math.round(e/864e5))):``)}}},[e,n]);let v=Object.values(h.byResource).reduce((e,t)=>e+(t?.size??0),0);return(0,Z.jsx)(z,{open:e,onOpenChange:t,children:(0,Z.jsxs)(W,{className:`max-w-3xl`,children:[(0,Z.jsxs)(G,{children:[(0,Z.jsx)(V,{children:o(l?`settings:apiKeys.editor.titleEdit`:`settings:apiKeys.editor.titleCreate`)}),(0,Z.jsx)(H,{children:o(`settings:apiKeys.editor.description`)})]}),(0,Z.jsxs)(`form`,{className:`flex flex-col gap-4`,onSubmit:e=>{e.preventDefault(),u.trim()&&_.mutate()},children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,Z.jsx)(q,{htmlFor:`api-key-name`,children:o(`settings:apiKeys.editor.name`)}),(0,Z.jsx)(Y,{id:`api-key-name`,value:u,onChange:e=>d(e.target.value),placeholder:o(`settings:apiKeys.editor.namePlaceholder`),required:!0,maxLength:64})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,Z.jsx)(q,{htmlFor:`api-key-expires`,children:o(`settings:apiKeys.editor.expiresInDays`)}),(0,Z.jsx)(Y,{id:`api-key-expires`,type:`number`,min:1,max:3650,value:f,onChange:e=>m(e.target.value),placeholder:o(`settings:apiKeys.editor.expiresPlaceholder`)}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:o(`settings:apiKeys.editor.expiresHint`)})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(q,{children:o(`settings:apiKeys.editor.permissions`)}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:o(`settings:apiKeys.editor.selectedActions`,{count:v})})]}),(0,Z.jsx)(Te,{resources:r,state:h,onChange:g})]}),(0,Z.jsxs)(U,{children:[(0,Z.jsx)(p,{type:`button`,variant:`outline`,onClick:()=>t(!1),children:o(`common:cancel`)}),(0,Z.jsx)(p,{type:`submit`,disabled:_.isPending||!u.trim()||v===0,children:_.isPending?o(`common:saving`):o(l?`common:save`:`settings:apiKeys.actions.create`)})]})]})]})})}var Oe=[`record.created`,`record.updated`,`record.deleted`,`*`];function ke(){let{t:e}=E(),t=T(),n=ee(),r=J(),i=pe(),o=w(),[s,l]=X.useState(!1),[d,f]=X.useState(null),[m,h]=X.useState(null),g=k({queryKey:ye,queryFn:()=>t.listWebhooks()}),_=k({queryKey:[`modern-admin`,`webhooks`,m,`deliveries`],queryFn:()=>t.listWebhookDeliveries(m),enabled:!!m}),v=D({mutationFn:e=>t.deleteWebhook(e),onSuccess:()=>{n.invalidateQueries({queryKey:ye}),r.success({key:`settings:webhooks.notice.deleted`})},onError:e=>r.error({message:e instanceof Error?e.message:String(e)})}),y=D({mutationFn:e=>t.testWebhook(e),onSuccess:()=>{m&&n.invalidateQueries({queryKey:[`modern-admin`,`webhooks`,m,`deliveries`]}),r.success({key:`settings:webhooks.notice.testQueued`})},onError:e=>r.error({message:e instanceof Error?e.message:String(e)})}),b=g.data?.webhooks??[],x=async t=>{await i.confirm({title:e(`settings:webhooks.confirmDelete.title`),description:e(`settings:webhooks.confirmDelete.description`,{name:t.name}),confirmLabel:e(`common:delete`),destructive:!0})&&v.mutate(t.id)};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsx)(Q,{icon:K,title:e(`settings:webhooks.title`),description:e(`settings:webhooks.description`),action:(0,Z.jsxs)(p,{size:`sm`,onClick:()=>{f(null),l(!0)},children:[(0,Z.jsx)(c,{className:`size-4`}),e(`settings:webhooks.actions.create`)]}),children:(0,Z.jsx)(_e,{isLoading:g.isLoading,error:g.error,isEmpty:b.length===0,loadingLabel:e(`common:loading`),empty:{icon:K,title:e(`settings:webhooks.empty.title`),description:e(`settings:webhooks.empty.description`)},children:(0,Z.jsx)(he,{children:(0,Z.jsxs)(R,{children:[(0,Z.jsx)(N,{children:(0,Z.jsxs)(I,{children:[(0,Z.jsx)(P,{children:e(`settings:webhooks.columns.name`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.columns.resource`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.columns.events`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.columns.enabled`)}),(0,Z.jsx)(P,{className:`text-right`,children:e(`settings:webhooks.columns.actions`)})]})}),(0,Z.jsx)(F,{children:b.map(t=>(0,Z.jsxs)(I,{children:[(0,Z.jsxs)(L,{children:[(0,Z.jsx)(`button`,{type:`button`,className:`text-left font-medium hover:underline`,onClick:()=>h(t.id),children:t.name}),(0,Z.jsx)(`div`,{className:`max-w-xs truncate text-xs text-muted-foreground`,children:t.url})]}),(0,Z.jsx)(L,{children:je(o,t.resourceId,e(`settings:webhooks.editor.allResources`))}),(0,Z.jsx)(L,{className:`max-w-xs`,children:(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:t.events.map(e=>(0,Z.jsx)(A,{variant:`outline`,children:e},e))})}),(0,Z.jsx)(L,{children:t.enabled?e(`common:yes`):e(`common:no`)}),(0,Z.jsx)(L,{className:`text-right`,children:(0,Z.jsxs)(`div`,{className:`inline-flex gap-1`,children:[(0,Z.jsx)(p,{variant:`ghost`,size:`sm`,onClick:()=>y.mutate(t.id),children:e(`settings:webhooks.actions.test`)}),(0,Z.jsx)(p,{variant:`ghost`,size:`sm`,onClick:()=>{f(t),l(!0)},children:(0,Z.jsx)(u,{className:`size-4`})}),(0,Z.jsx)(p,{variant:`ghost`,size:`sm`,onClick:()=>void x(t),children:(0,Z.jsx)(a,{className:`size-4 text-destructive`})})]})})]},t.id))})]})})})}),m&&(0,Z.jsx)(Q,{icon:K,title:e(`settings:webhooks.deliveries.title`),children:_.isLoading?(0,Z.jsx)(`div`,{className:`py-4 text-sm text-muted-foreground`,children:e(`common:loading`)}):(0,Z.jsx)(he,{children:(0,Z.jsxs)(R,{children:[(0,Z.jsx)(N,{children:(0,Z.jsxs)(I,{children:[(0,Z.jsx)(P,{children:e(`settings:webhooks.deliveries.status`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.deliveries.event`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.deliveries.attempt`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.deliveries.response`)}),(0,Z.jsx)(P,{children:e(`settings:webhooks.deliveries.createdAt`)})]})}),(0,Z.jsx)(F,{children:(_.data?.deliveries??[]).map(e=>(0,Z.jsxs)(I,{children:[(0,Z.jsx)(L,{children:e.status}),(0,Z.jsx)(L,{children:e.event}),(0,Z.jsx)(L,{children:e.attempt}),(0,Z.jsx)(L,{className:`max-w-sm truncate`,children:e.responseStatus??e.error??e.responseBody??`—`}),(0,Z.jsx)(L,{children:Fe(e.createdAt)})]},e.id))})]})})}),(0,Z.jsx)(Ae,{open:s,onOpenChange:l,webhook:d,resources:o},d?.id??`new`)]})}function Ae({open:e,onOpenChange:t,webhook:n,resources:r}){let{t:i}=E(),a=T(),o=ee(),s=J(),[c,l]=X.useState(n?.name??``),[u,d]=X.useState(n?.url??``),[f,m]=X.useState(n?.resourceId??``),[_,y]=X.useState(n?.enabled??!0),[b,x]=X.useState(n?.secret??``),[C,w]=X.useState(n?.events??[`record.created`,`record.updated`]),[O,k]=X.useState(n?.headers??{}),[A,oe]=X.useState(n?.filters??{}),[j,se]=X.useState(n?.payloadFields??[]),ce=r.find(e=>e.id===f),M=D({mutationFn:e=>n?a.updateWebhook(n.id,e):a.createWebhook(e),onSuccess:()=>{o.invalidateQueries({queryKey:ye}),s.success({key:`settings:webhooks.notice.saved`}),t(!1)},onError:e=>s.error({message:e instanceof Error?e.message:String(e)})}),N=e=>{w(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])};return(0,Z.jsx)(z,{open:e,onOpenChange:t,children:(0,Z.jsxs)(W,{className:`max-w-3xl`,children:[(0,Z.jsxs)(G,{children:[(0,Z.jsx)(V,{children:i(n?`settings:webhooks.editor.titleEdit`:`settings:webhooks.editor.titleCreate`)}),(0,Z.jsx)(H,{children:i(`settings:webhooks.editor.description`)})]}),(0,Z.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),M.mutate({name:c.trim(),url:u.trim(),events:C,resourceId:f||null,enabled:_,...b.trim()?{secret:b.trim()}:{},headers:Ne(O),filters:Ne(A),payloadFields:j})},children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.name`)}),(0,Z.jsx)(Y,{value:c,onChange:e=>l(e.target.value),required:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.url`)}),(0,Z.jsx)(Y,{value:u,onChange:e=>d(e.target.value),required:!0,type:`url`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.resource`)}),(0,Z.jsxs)(ae,{value:f||`__all__`,onValueChange:e=>{m(e===`__all__`?``:e),se([])},children:[(0,Z.jsx)(te,{children:(0,Z.jsx)(ie,{})}),(0,Z.jsxs)(re,{children:[(0,Z.jsx)(ne,{value:`__all__`,children:i(`settings:webhooks.editor.allResources`)}),r.map(e=>(0,Z.jsxs)(ne,{value:e.id,children:[e.name,e.name!==e.id&&(0,Z.jsxs)(`span`,{className:`ml-1.5 text-xs text-muted-foreground`,children:[`(`,e.id,`)`]})]},e.id))]})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.secret`)}),(0,Z.jsx)(S,{content:i(`settings:webhooks.editor.secretHint`),ariaLabel:i(`settings:webhooks.editor.secret`),side:`right`})]}),(0,Z.jsx)(Y,{value:b,onChange:e=>x(e.target.value),type:`password`})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(v,{checked:_,onCheckedChange:y}),(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.enabled`)})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.events`)}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Oe.map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,Z.jsx)(h,{checked:C.includes(e),onCheckedChange:()=>N(e)}),e]},e))})]}),ce&&(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.payloadFields`)}),(0,Z.jsx)(S,{content:i(`settings:webhooks.editor.payloadFieldsHint`),ariaLabel:i(`settings:webhooks.editor.payloadFields`),side:`right`})]}),(0,Z.jsx)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:ce.properties.map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(h,{checked:j.includes(e.path),onCheckedChange:()=>se(t=>t.includes(e.path)?t.filter(t=>t!==e.path):[...t,e.path])}),e.label]},e.path))})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.headers`)}),(0,Z.jsx)(S,{content:i(`settings:webhooks.editor.headersHint`),ariaLabel:i(`settings:webhooks.editor.headers`),side:`top`})]}),(0,Z.jsx)(g,{value:O,onChange:e=>k(Me(e))})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(q,{children:i(`settings:webhooks.editor.filters`)}),(0,Z.jsx)(S,{content:i(`settings:webhooks.editor.filtersHint`),ariaLabel:i(`settings:webhooks.editor.filters`),side:`top`})]}),(0,Z.jsx)(g,{value:A,onChange:e=>oe(Me(e))})]})]}),(0,Z.jsxs)(U,{children:[(0,Z.jsx)(p,{type:`button`,variant:`outline`,onClick:()=>t(!1),children:i(`common:cancel`)}),(0,Z.jsx)(p,{type:`submit`,disabled:M.isPending||!c.trim()||!u.trim()||C.length===0,children:M.isPending?i(`common:saving`):i(`common:save`)})]})]})]})})}var je=(e,t,n)=>t?e.find(e=>e.id===t)?.name??t:n,Me=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:{},Ne=e=>{let t={};for(let[n,r]of Object.entries(e))r!=null&&r!==``&&(t[n]=String(r));return t};function Pe({secret:e,onClose:t}){let{t:n}=E(),r=J(),[i,a]=X.useState(!1),[s,c]=X.useState(!1);return X.useEffect(()=>{e||(a(!1),c(!1))},[e]),(0,Z.jsx)(z,{open:!!e,onOpenChange:e=>!e&&t(),children:(0,Z.jsxs)(W,{className:`max-w-lg`,children:[(0,Z.jsxs)(G,{children:[(0,Z.jsxs)(V,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(K,{className:`size-5`}),n(`settings:apiKeys.created.title`)]}),(0,Z.jsx)(H,{children:n(`settings:apiKeys.created.description`)})]}),(0,Z.jsx)(`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`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(d,{className:`mt-0.5 size-4`}),(0,Z.jsx)(`p`,{children:n(`settings:apiKeys.created.warning`)})]})}),(0,Z.jsxs)(`div`,{className:`flex items-stretch gap-2`,children:[(0,Z.jsxs)(`div`,{className:`relative flex-1`,children:[(0,Z.jsx)(Y,{readOnly:!0,type:i?`text`:`password`,value:e?.key??``,className:`pr-10 font-mono text-xs`,onFocus:e=>e.currentTarget.select()}),(0,Z.jsx)(p,{type:`button`,variant:`ghost`,size:`sm`,className:`absolute right-1 top-1/2 -translate-y-1/2`,onClick:()=>a(e=>!e),"aria-label":n(i?`settings:apiKeys.created.hide`:`settings:apiKeys.created.reveal`),children:i?(0,Z.jsx)(me,{className:`size-4`}):(0,Z.jsx)(le,{className:`size-4`})})]}),(0,Z.jsxs)(p,{type:`button`,onClick:async()=>{if(e)try{await navigator.clipboard.writeText(e.key),c(!0),r.success({key:`settings:apiKeys.notice.copied`}),setTimeout(()=>c(!1),1500)}catch{r.error({key:`settings:apiKeys.notice.copyFailed`})}},variant:`secondary`,children:[s?(0,Z.jsx)(B,{className:`size-4`}):(0,Z.jsx)(o,{className:`size-4`}),(0,Z.jsx)(`span`,{className:`hidden sm:inline`,children:n(s?`settings:apiKeys.created.copied`:`settings:apiKeys.created.copy`)})]})]}),(0,Z.jsx)(U,{children:(0,Z.jsx)(p,{onClick:t,children:n(`common:done`)})})]})})}var Fe=e=>{try{return new Date(e).toLocaleString()}catch{return String(e)}};export{xe as SettingsPage};
2
- //# sourceMappingURL=settings-page-BmphreWj.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-page-BmphreWj.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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"}