zenml-nightly 0.84.0.dev20250729__py3-none-any.whl → 0.84.1.dev20250731__py3-none-any.whl

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 (206) hide show
  1. zenml/VERSION +1 -1
  2. zenml/client.py +6 -1
  3. zenml/constants.py +28 -2
  4. zenml/integrations/gcp/__init__.py +4 -1
  5. zenml/logging/__init__.py +0 -11
  6. zenml/logging/step_logging.py +255 -149
  7. zenml/models/__init__.py +4 -0
  8. zenml/models/v2/core/service_account.py +87 -1
  9. zenml/models/v2/core/user.py +20 -6
  10. zenml/models/v2/misc/external_user.py +4 -1
  11. zenml/orchestrators/step_launcher.py +2 -4
  12. zenml/zen_server/auth.py +138 -27
  13. zenml/zen_server/dashboard/assets/{404-B5cfnwZ1.js → 404-CMbwR10f.js} +1 -1
  14. zenml/zen_server/dashboard/assets/{@radix-C_LirfyT.js → @radix-B1sy0Lhr.js} +1 -1
  15. zenml/zen_server/dashboard/assets/{@react-router-BSsrkPOd.js → @react-router-CHjLNlgw.js} +1 -1
  16. zenml/zen_server/dashboard/assets/{@reactflow-D9hglKLF.js → @reactflow-gbyyU3kq.js} +2 -2
  17. zenml/zen_server/dashboard/assets/{@tanstack-C0SeHZng.js → @tanstack-Dwlisomv.js} +1 -1
  18. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BpLj419i.js +1 -0
  19. zenml/zen_server/dashboard/assets/ButtonGroup-DVhzbQxV.js +1 -0
  20. zenml/zen_server/dashboard/assets/{CodeSnippet-D8iBqOVv.js → CodeSnippet-B7Wd4R8u.js} +1 -1
  21. zenml/zen_server/dashboard/assets/{CollapsibleCard-D0-pQi1n.js → CollapsibleCard-DSZzbjx5.js} +1 -1
  22. zenml/zen_server/dashboard/assets/{ComponentBadge-mw2Ja_ON.js → ComponentBadge-MVT08kBV.js} +1 -1
  23. zenml/zen_server/dashboard/assets/{ComponentIcon-BXgpt-jw.js → ComponentIcon-C9AY8usJ.js} +1 -1
  24. zenml/zen_server/dashboard/assets/DeleteAlertDialog-CzhTVQaC.js +1 -0
  25. zenml/zen_server/dashboard/assets/{DialogItem-DeME0oSt.js → DialogItem-DD_7v3UY.js} +1 -1
  26. zenml/zen_server/dashboard/assets/{DisplayDate-v3KW7oez.js → DisplayDate-57lUNS79.js} +1 -1
  27. zenml/zen_server/dashboard/assets/{EmptyState-DG0m-CGv.js → EmptyState-BMA34iVR.js} +1 -1
  28. zenml/zen_server/dashboard/assets/{Error-DcVLcrLs.js → Error-Cakgjexo.js} +1 -1
  29. zenml/zen_server/dashboard/assets/{ExecutionStatus-C4tlFnlh.js → ExecutionStatus-CQbWovhV.js} +1 -1
  30. zenml/zen_server/dashboard/assets/{Helpbox-C-RGHz3S.js → Helpbox-7FZpmsHB.js} +1 -1
  31. zenml/zen_server/dashboard/assets/{Infobox-DFCWPbMb.js → Infobox-DnduZjNU.js} +1 -1
  32. zenml/zen_server/dashboard/assets/{LeftSideMenu-Czev0KCA.js → LeftSideMenu-D5UEs4vB.js} +1 -1
  33. zenml/zen_server/dashboard/assets/{Lock-CRP5J_su.js → Lock-u8WOoTTd.js} +1 -1
  34. zenml/zen_server/dashboard/assets/NestedCollapsible-0yviIfaA.js +1 -0
  35. zenml/zen_server/dashboard/assets/{NumberBox-CoQjQYDJ.js → NumberBox-C2Pju4PR.js} +1 -1
  36. zenml/zen_server/dashboard/assets/{Pagination-CcDD5yHh.js → Pagination-C1sE5Nzn.js} +1 -1
  37. zenml/zen_server/dashboard/assets/{Partials-DlMzfKgs.js → Partials-DosysQMU.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{PasswordChecker-BZwoeQIm.js → PasswordChecker-DOPLfvg7.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{ProCta-CU2ycJDo.js → ProCta-CUkpV3PJ.js} +1 -1
  40. zenml/zen_server/dashboard/assets/{ProviderIcon-BMAn9Jld.js → ProviderIcon-aQjTuTRX.js} +1 -1
  41. zenml/zen_server/dashboard/assets/{ProviderRadio-D_q9tE3G.js → ProviderRadio-C6pLVNxC.js} +1 -1
  42. zenml/zen_server/dashboard/assets/RunsBody-CZAiSxYK.js +1 -0
  43. zenml/zen_server/dashboard/assets/{SearchField-D_0-uAPj.js → SearchField-Byv1PtST.js} +1 -1
  44. zenml/zen_server/dashboard/assets/{SecretTooltip-BcWMKb9f.js → SecretTooltip-CErfhVgF.js} +1 -1
  45. zenml/zen_server/dashboard/assets/{SetPassword-CaKVSqAL.js → SetPassword-C4OH-cn1.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{SheetHeader-7vwlsY_i.js → SheetHeader-Bb3v9rha.js} +1 -1
  47. zenml/zen_server/dashboard/assets/StackComponentList-D85oab98.js +1 -0
  48. zenml/zen_server/dashboard/assets/StackList-DSAjbVb5.js +1 -0
  49. zenml/zen_server/dashboard/assets/Tabs-2uwqXsdL.js +1 -0
  50. zenml/zen_server/dashboard/assets/Tick-BQ7_xDBl.js +1 -0
  51. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Da5RndbV.js → UpdatePasswordSchemas-DNkYgzN6.js} +1 -1
  52. zenml/zen_server/dashboard/assets/{Wizard-8aJzxUjb.js → Wizard-2FIi8JNY.js} +1 -1
  53. zenml/zen_server/dashboard/assets/WizardFooter-DQEnlDmZ.js +1 -0
  54. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-gorNNEaT.js → all-pipeline-runs-query-CdvWtiAY.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{arrow-left-hcj2H8HY.js → arrow-left-BFB2mgJo.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{bar-chart-square-check-9siI9icm.js → bar-chart-square-check-_m-oYysN.js} +1 -1
  57. zenml/zen_server/dashboard/assets/{bulk-delete-B5RTlnD_.js → bulk-delete-wdObjfps.js} +2 -2
  58. zenml/zen_server/dashboard/assets/{check-D1bHMJkL.js → check-C9Nye5lR.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{check-circle-mnEgPhPF.js → check-circle-CG6XAdk-.js} +1 -1
  60. zenml/zen_server/dashboard/assets/{chevron-down-Z3nUe-0U.js → chevron-down-Bl7WwQAL.js} +1 -1
  61. zenml/zen_server/dashboard/assets/{chevron-right-double-CbRQKN4Q.js → chevron-right-double-CbMG1dOM.js} +1 -1
  62. zenml/zen_server/dashboard/assets/{clock-BMjHXT3f.js → clock-BnPvxp3D.js} +1 -1
  63. zenml/zen_server/dashboard/assets/{code-browser-DftoiCIg.js → code-browser-CzWvJ4S6.js} +1 -1
  64. zenml/zen_server/dashboard/assets/configuration-form-BbcNBQTO.js +1 -0
  65. zenml/zen_server/dashboard/assets/constants-DfvsDtcH.js +1 -0
  66. zenml/zen_server/dashboard/assets/{create-stack-BruqH_6X.js → create-stack-D4Sf7QpF.js} +1 -1
  67. zenml/zen_server/dashboard/assets/{credit-card-CH1BHrXY.js → credit-card-DfBA6dBb.js} +1 -1
  68. zenml/zen_server/dashboard/assets/{dataflow-2-qHjWt7zp.js → dataflow-2-BLkaTH0Q.js} +1 -1
  69. zenml/zen_server/dashboard/assets/{delete-run-ibBtciMR.js → delete-run-XSre8ru-.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{expand-full-CD4fFvM-.js → expand-full-C8p_0jQv.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{eye-CLNgIh_K.js → eye-BXcQevds.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{file-text-CltVhgwZ.js → file-text-TdPXNd7s.js} +1 -1
  73. zenml/zen_server/dashboard/assets/form-C1jJgRy1.js +1 -0
  74. zenml/zen_server/dashboard/assets/{form-schemas-B9XgTS1V.js → form-schemas-BjWDRvGd.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{help-B0CvBhCm.js → help-CRPfbPTO.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{icon-hDriJUXY.js → icon--Tp6obFZ.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{index-mA8kL088.js → index-B4ZeIaPd.js} +1 -1
  78. zenml/zen_server/dashboard/assets/{index-dCcVgFNl.js → index-BYHxFvoG.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{index-BQWlHo1Y.js → index-BYzR7YrM.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{index-BacoJBEQ.js → index-CO6UN3UX.js} +11 -11
  81. zenml/zen_server/dashboard/assets/{index-B7CRNU8l.js → index-d_QrPL-8.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{index-BRhKF2z-.js → index-g7wOyc86.js} +1 -1
  83. zenml/zen_server/dashboard/assets/index-n_sn2ITN.css +1 -0
  84. zenml/zen_server/dashboard/assets/{index.es-DcVFDpJU.js → index.es-CZMSrR6z.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{index.esm-COnaHLSh.js → index.esm-SBF9nn_P.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{info-CyMih3vQ.js → info-CI2szPUG.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{key-icon-HOx2gazv.js → key-icon-BiV171aI.js} +1 -1
  88. zenml/zen_server/dashboard/assets/layout-Cyc-V16c.js +1 -0
  89. zenml/zen_server/dashboard/assets/{layout-C5dgIReC.js → layout-GIiNvS10.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{login-mutation-CidpsqyH.js → login-mutation-CDgTlQBD.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{logs-DoLoTEfj.js → logs-lNLbZqHL.js} +1 -1
  92. zenml/zen_server/dashboard/assets/{mail-C160gvB0.js → mail-DBJRSzyu.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{message-chat-square-DLz6XmPS.js → message-chat-square-C3CRCQvD.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{package-BhYXGPxF.js → package-pR4bbXJp.js} +1 -1
  95. zenml/zen_server/dashboard/assets/page-1DXG7hp8.js +1 -0
  96. zenml/zen_server/dashboard/assets/{page-BCRXJXC9.js → page-43SWdz4k.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{page-YdWnx9MX.js → page-AOVMuHDc.js} +1 -1
  98. zenml/zen_server/dashboard/assets/page-B4QBxV0B.js +22 -0
  99. zenml/zen_server/dashboard/assets/{page-CvllZMBF.js → page-B8ict_cR.js} +1 -1
  100. zenml/zen_server/dashboard/assets/page-BDre_qCO.js +1 -0
  101. zenml/zen_server/dashboard/assets/page-BbsvGfyi.js +18 -0
  102. zenml/zen_server/dashboard/assets/page-Bi4I23Hs.js +1 -0
  103. zenml/zen_server/dashboard/assets/page-BnAMyQZb.js +1 -0
  104. zenml/zen_server/dashboard/assets/{page-D6cvOG8w.js → page-BnZEAhNn.js} +1 -1
  105. zenml/zen_server/dashboard/assets/page-Bncp08FW.js +1 -0
  106. zenml/zen_server/dashboard/assets/{page-BTDi81N3.js → page-C4Jnp1qP.js} +1 -1
  107. zenml/zen_server/dashboard/assets/page-C7Z2sDHE.js +1 -0
  108. zenml/zen_server/dashboard/assets/page-C8t9qLdV.js +1 -0
  109. zenml/zen_server/dashboard/assets/{page-BByayrO-.js → page-C9IsnFid.js} +2 -2
  110. zenml/zen_server/dashboard/assets/page-CEHZzQ1Q.js +1 -0
  111. zenml/zen_server/dashboard/assets/page-CGtll3Jk.js +1 -0
  112. zenml/zen_server/dashboard/assets/{page-q41JNDWO.js → page-CKPkbOoE.js} +1 -1
  113. zenml/zen_server/dashboard/assets/{page-DF4FVxxW.js → page-CMvcoaSZ.js} +2 -2
  114. zenml/zen_server/dashboard/assets/page-CVwTAlzd.js +1 -0
  115. zenml/zen_server/dashboard/assets/{page-DSZfclXt.js → page-ClqRvz_V.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{page-7CJ4Wq3O.js → page-CzDjN1wE.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{page-BK59rZvf.js → page-D654xHWd.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{page-DcXrWWWh.js → page-DLrYW-Dn.js} +1 -1
  119. zenml/zen_server/dashboard/assets/page-DOnAInjC.js +1 -0
  120. zenml/zen_server/dashboard/assets/{page-Cc8owYXQ.js → page-DQncGJeH.js} +1 -1
  121. zenml/zen_server/dashboard/assets/page-DQzNmXk3.js +1 -0
  122. zenml/zen_server/dashboard/assets/{page-FQxi1Otg.js → page-DSn1Jcvs.js} +1 -1
  123. zenml/zen_server/dashboard/assets/page-DZ5hcS1o.js +1 -0
  124. zenml/zen_server/dashboard/assets/page-DerIbaqa.js +1 -0
  125. zenml/zen_server/dashboard/assets/{page-8U20Tu_8.js → page-DgOEl3Bc.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{page-DgldL5UB.js → page-DgSu4pTE.js} +2 -2
  127. zenml/zen_server/dashboard/assets/page-DgblJuXC.js +1 -0
  128. zenml/zen_server/dashboard/assets/{page-CY0LPcAJ.js → page-Dpw-xP4q.js} +1 -1
  129. zenml/zen_server/dashboard/assets/page-DsFXol8x.js +1 -0
  130. zenml/zen_server/dashboard/assets/page-Du6bFZTS.js +1 -0
  131. zenml/zen_server/dashboard/assets/{page-CeGBDh1Q.js → page-DznxxpKA.js} +1 -1
  132. zenml/zen_server/dashboard/assets/page-E9Mx9_rn.js +1 -0
  133. zenml/zen_server/dashboard/assets/page-HrebZOAM.js +1 -0
  134. zenml/zen_server/dashboard/assets/{page-BX67x4iL.js → page-O5xnz_nW.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{page-DDWW21kl.js → page-hX7NkNdA.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{persist-BKKcL1Kp.js → persist-B3Hb8HDW.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{persist-DxiyfAax.js → persist-Dkbp9MFP.js} +1 -1
  138. zenml/zen_server/dashboard/assets/{pipeline-BJ8liDnl.js → pipeline-CDJSAXrb.js} +1 -1
  139. zenml/zen_server/dashboard/assets/{plus-cI8zD2xh.js → plus-DOrkJCmy.js} +1 -1
  140. zenml/zen_server/dashboard/assets/primary-role-CjkpP9fL.js +1 -0
  141. zenml/zen_server/dashboard/assets/{react-error-boundary.esm-DoXxY4pT.js → react-error-boundary.esm-DgOYA0wh.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{refresh-3EF2R7ja.js → refresh-C8BXS3Fb.js} +1 -1
  143. zenml/zen_server/dashboard/assets/{resource-tyes-list-B5rkZcbc.js → resource-tyes-list-CugyWUAE.js} +1 -1
  144. zenml/zen_server/dashboard/assets/{resource-type-tooltip-E97WGqfk.js → resource-type-tooltip-V-zdiLKz.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{service-B9aVzfAF.js → service-FjqYTmBw.js} +2 -2
  146. zenml/zen_server/dashboard/assets/{service-connectors-DL2-k_E2.js → service-connectors-nF4-OXB9.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{sharedSchema-DyUO09BR.js → sharedSchema-Br1JPr8d.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{slash-circle-D2Lb2FyR.js → slash-circle-B0xMh8q6.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{stack-detail-query-Bc4QKlWg.js → stack-detail-query-DnyMCdVE.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{terminal-BObrvDlO.js → terminal-C2tAF2XG.js} +1 -1
  151. zenml/zen_server/dashboard/assets/{terminal-square-BObrvDlO.js → terminal-square-C2tAF2XG.js} +1 -1
  152. zenml/zen_server/dashboard/assets/{transform-DFpKTKgF.js → transform-S7omcvTm.js} +1 -1
  153. zenml/zen_server/dashboard/assets/{trash-HKxXWbSG.js → trash-D9LA4VFD.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{update-current-user-mutation-DSyUyHVj.js → update-current-user-mutation-B3Dpv3u6.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-CdM-Sdds.js → update-server-settings-mutation-s7tlHN8s.js} +1 -1
  156. zenml/zen_server/dashboard/assets/{zod-DgEcN9jD.js → zod-D48zuELD.js} +1 -1
  157. zenml/zen_server/dashboard/index.html +7 -7
  158. zenml/zen_server/rbac/zenml_cloud_rbac.py +8 -4
  159. zenml/zen_server/routers/service_accounts_endpoints.py +71 -12
  160. zenml/zen_stores/base_zen_store.py +0 -19
  161. zenml/zen_stores/migrations/versions/0.84.1_release.py +23 -0
  162. zenml/zen_stores/migrations/versions/8d4b9ba22c1f_add_user_avatar.py +39 -0
  163. zenml/zen_stores/schemas/user_schemas.py +16 -5
  164. zenml/zen_stores/sql_zen_store.py +5 -1
  165. {zenml_nightly-0.84.0.dev20250729.dist-info → zenml_nightly-0.84.1.dev20250731.dist-info}/METADATA +1 -1
  166. {zenml_nightly-0.84.0.dev20250729.dist-info → zenml_nightly-0.84.1.dev20250731.dist-info}/RECORD +169 -167
  167. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-druRNuO2.js +0 -1
  168. zenml/zen_server/dashboard/assets/ButtonGroup-SF2DlzHV.js +0 -1
  169. zenml/zen_server/dashboard/assets/DeleteAlertDialog-BbyFVnVI.js +0 -1
  170. zenml/zen_server/dashboard/assets/NestedCollapsible-CN9scBUn.js +0 -1
  171. zenml/zen_server/dashboard/assets/RunsBody-BToytB8e.js +0 -1
  172. zenml/zen_server/dashboard/assets/StackComponentList-s7eSfm8o.js +0 -1
  173. zenml/zen_server/dashboard/assets/StackList-Dt0FrIkM.js +0 -1
  174. zenml/zen_server/dashboard/assets/Tabs-B27AHUfo.js +0 -1
  175. zenml/zen_server/dashboard/assets/Tick-DDeDgTuT.js +0 -1
  176. zenml/zen_server/dashboard/assets/WizardFooter-Bt7_UE14.js +0 -1
  177. zenml/zen_server/dashboard/assets/configuration-form-Yz8m0QIG.js +0 -1
  178. zenml/zen_server/dashboard/assets/constants-DeV48DuZ.js +0 -1
  179. zenml/zen_server/dashboard/assets/form-6aSt3tIl.js +0 -1
  180. zenml/zen_server/dashboard/assets/index-eggipFZS.css +0 -1
  181. zenml/zen_server/dashboard/assets/layout-CFLL6-CM.js +0 -1
  182. zenml/zen_server/dashboard/assets/page-6huxSHEu.js +0 -1
  183. zenml/zen_server/dashboard/assets/page-BMpXak4U.js +0 -1
  184. zenml/zen_server/dashboard/assets/page-Bjmcdg64.js +0 -1
  185. zenml/zen_server/dashboard/assets/page-BsAn8p4m.js +0 -1
  186. zenml/zen_server/dashboard/assets/page-BwjPRuaY.js +0 -1
  187. zenml/zen_server/dashboard/assets/page-CDtSVkNc.js +0 -1
  188. zenml/zen_server/dashboard/assets/page-CEDU0L2T.js +0 -1
  189. zenml/zen_server/dashboard/assets/page-COJK90rG.js +0 -1
  190. zenml/zen_server/dashboard/assets/page-C_XMn4GU.js +0 -1
  191. zenml/zen_server/dashboard/assets/page-Cb3KGsPK.js +0 -22
  192. zenml/zen_server/dashboard/assets/page-CiGOVsj3.js +0 -1
  193. zenml/zen_server/dashboard/assets/page-CmLSFMkW.js +0 -1
  194. zenml/zen_server/dashboard/assets/page-CnfCptXq.js +0 -1
  195. zenml/zen_server/dashboard/assets/page-CxzglV3-.js +0 -1
  196. zenml/zen_server/dashboard/assets/page-DVLez4R1.js +0 -1
  197. zenml/zen_server/dashboard/assets/page-Dg7-H_9i.js +0 -1
  198. zenml/zen_server/dashboard/assets/page-Dw7XuiSo.js +0 -18
  199. zenml/zen_server/dashboard/assets/page-XrmOHHg7.js +0 -1
  200. zenml/zen_server/dashboard/assets/page-oRm7D4TC.js +0 -1
  201. zenml/zen_server/dashboard/assets/page-x2GXC8sI.js +0 -1
  202. zenml/zen_server/dashboard/assets/page-z2FXP4GY.js +0 -1
  203. zenml/zen_server/dashboard/assets/primary-role-CPGHymjN.js +0 -1
  204. {zenml_nightly-0.84.0.dev20250729.dist-info → zenml_nightly-0.84.1.dev20250731.dist-info}/LICENSE +0 -0
  205. {zenml_nightly-0.84.0.dev20250729.dist-info → zenml_nightly-0.84.1.dev20250731.dist-info}/WHEEL +0 -0
  206. {zenml_nightly-0.84.0.dev20250729.dist-info → zenml_nightly-0.84.1.dev20250731.dist-info}/entry_points.txt +0 -0
zenml/models/__init__.py CHANGED
@@ -283,6 +283,8 @@ from zenml.models.v2.core.service_account import (
283
283
  ServiceAccountResponseMetadata,
284
284
  ServiceAccountUpdate,
285
285
  ServiceAccountRequest,
286
+ ServiceAccountInternalRequest,
287
+ ServiceAccountInternalUpdate,
286
288
  ServiceAccountResponse,
287
289
  )
288
290
  from zenml.models.v2.core.service_connector import (
@@ -740,6 +742,8 @@ __all__ = [
740
742
  "ServiceAccountResponseMetadata",
741
743
  "ServiceAccountUpdate",
742
744
  "ServiceAccountRequest",
745
+ "ServiceAccountInternalRequest",
746
+ "ServiceAccountInternalUpdate",
743
747
  "ServiceAccountResponse",
744
748
  "ServiceConnectorConfiguration",
745
749
  "ServiceConnectorRequest",
@@ -14,6 +14,7 @@
14
14
  """Models representing service accounts."""
15
15
 
16
16
  from typing import TYPE_CHECKING, ClassVar, List, Optional, Type, Union
17
+ from uuid import UUID
17
18
 
18
19
  from pydantic import ConfigDict, Field
19
20
 
@@ -43,8 +44,13 @@ class ServiceAccountRequest(BaseRequest):
43
44
  ]
44
45
 
45
46
  name: str = Field(
46
- title="The unique name for the service account.",
47
+ title="The unique username for the service account.",
48
+ max_length=STR_FIELD_MAX_LENGTH,
49
+ )
50
+ full_name: str = Field(
51
+ default="",
47
52
  max_length=STR_FIELD_MAX_LENGTH,
53
+ title="The display name of the service account.",
48
54
  )
49
55
  description: Optional[str] = Field(
50
56
  default=None,
@@ -52,9 +58,23 @@ class ServiceAccountRequest(BaseRequest):
52
58
  max_length=TEXT_FIELD_MAX_LENGTH,
53
59
  )
54
60
  active: bool = Field(title="Whether the service account is active or not.")
61
+ avatar_url: Optional[str] = Field(
62
+ default=None,
63
+ title="The avatar URL for the account.",
64
+ )
65
+
55
66
  model_config = ConfigDict(validate_assignment=True, extra="ignore")
56
67
 
57
68
 
69
+ class ServiceAccountInternalRequest(ServiceAccountRequest):
70
+ """Internal request model for service accounts."""
71
+
72
+ external_user_id: Optional[UUID] = Field(
73
+ default=None,
74
+ title="The external user ID associated with the account.",
75
+ )
76
+
77
+
58
78
  # ------------------ Update Model ------------------
59
79
 
60
80
 
@@ -68,6 +88,11 @@ class ServiceAccountUpdate(BaseUpdate):
68
88
  max_length=STR_FIELD_MAX_LENGTH,
69
89
  default=None,
70
90
  )
91
+ full_name: Optional[str] = Field(
92
+ title="The display name of the service account.",
93
+ max_length=STR_FIELD_MAX_LENGTH,
94
+ default=None,
95
+ )
71
96
  description: Optional[str] = Field(
72
97
  title="A description of the service account.",
73
98
  max_length=TEXT_FIELD_MAX_LENGTH,
@@ -78,16 +103,38 @@ class ServiceAccountUpdate(BaseUpdate):
78
103
  default=None,
79
104
  )
80
105
 
106
+ avatar_url: Optional[str] = Field(
107
+ default=None,
108
+ title="The avatar URL for the account.",
109
+ )
110
+
81
111
  model_config = ConfigDict(validate_assignment=True)
82
112
 
83
113
 
114
+ class ServiceAccountInternalUpdate(ServiceAccountUpdate):
115
+ """Internal update model for service accounts."""
116
+
117
+ external_user_id: Optional[UUID] = Field(
118
+ default=None,
119
+ title="The external user ID associated with the account.",
120
+ )
121
+
122
+
84
123
  # ------------------ Response Model ------------------
85
124
 
86
125
 
87
126
  class ServiceAccountResponseBody(BaseDatedResponseBody):
88
127
  """Response body for service accounts."""
89
128
 
129
+ full_name: str = Field(
130
+ default="",
131
+ title="The display name of the service account.",
132
+ )
90
133
  active: bool = Field(default=False, title="Whether the account is active.")
134
+ avatar_url: Optional[str] = Field(
135
+ default=None,
136
+ title="The avatar URL for the account.",
137
+ )
91
138
 
92
139
 
93
140
  class ServiceAccountResponseMetadata(BaseResponseMetadata):
@@ -99,6 +146,11 @@ class ServiceAccountResponseMetadata(BaseResponseMetadata):
99
146
  max_length=TEXT_FIELD_MAX_LENGTH,
100
147
  )
101
148
 
149
+ external_user_id: Optional[UUID] = Field(
150
+ default=None,
151
+ title="The external user ID associated with the account.",
152
+ )
153
+
102
154
 
103
155
  class ServiceAccountResponseResources(BaseResponseResources):
104
156
  """Class for all resource models associated with the service account entity."""
@@ -160,6 +212,8 @@ class ServiceAccountResponse(
160
212
  created=self.created,
161
213
  updated=self.updated,
162
214
  is_admin=False,
215
+ avatar_url=self.avatar_url,
216
+ full_name=self.full_name,
163
217
  ),
164
218
  metadata=UserResponseMetadata(
165
219
  description=self.description,
@@ -167,6 +221,15 @@ class ServiceAccountResponse(
167
221
  )
168
222
 
169
223
  # Body and metadata properties
224
+ @property
225
+ def full_name(self) -> str:
226
+ """The `full_name` property.
227
+
228
+ Returns:
229
+ the value of the property.
230
+ """
231
+ return self.get_body().full_name
232
+
170
233
  @property
171
234
  def active(self) -> bool:
172
235
  """The `active` property.
@@ -185,6 +248,24 @@ class ServiceAccountResponse(
185
248
  """
186
249
  return self.get_metadata().description
187
250
 
251
+ @property
252
+ def external_user_id(self) -> Optional[UUID]:
253
+ """The `external_user_id` property.
254
+
255
+ Returns:
256
+ the value of the property.
257
+ """
258
+ return self.get_metadata().external_user_id
259
+
260
+ @property
261
+ def avatar_url(self) -> Optional[str]:
262
+ """The `avatar_url` property.
263
+
264
+ Returns:
265
+ the value of the property.
266
+ """
267
+ return self.get_body().avatar_url
268
+
188
269
 
189
270
  # ------------------ Filter Model ------------------
190
271
  class ServiceAccountFilter(BaseFilter):
@@ -203,6 +284,11 @@ class ServiceAccountFilter(BaseFilter):
203
284
  description="Whether the user is active",
204
285
  union_mode="left_to_right",
205
286
  )
287
+ external_user_id: Optional[Union[UUID, str]] = Field(
288
+ default=None,
289
+ title="The external user ID associated with the account.",
290
+ union_mode="left_to_right",
291
+ )
206
292
 
207
293
  def apply_filter(
208
294
  self,
@@ -81,6 +81,10 @@ class UserBase(BaseModel):
81
81
  default=None,
82
82
  title="The metadata associated with the user.",
83
83
  )
84
+ avatar_url: Optional[str] = Field(
85
+ default=None,
86
+ title="The avatar URL for the account.",
87
+ )
84
88
 
85
89
  @classmethod
86
90
  def _get_crypt_context(cls) -> "CryptContext":
@@ -156,8 +160,7 @@ class UserRequest(UserBase, BaseRequest):
156
160
  )
157
161
  full_name: str = Field(
158
162
  default="",
159
- title="The full name for the account owner. Only relevant for user "
160
- "accounts.",
163
+ title="The display name for the account.",
161
164
  max_length=STR_FIELD_MAX_LENGTH,
162
165
  )
163
166
  is_admin: bool = Field(
@@ -186,8 +189,7 @@ class UserUpdate(UserBase, BaseUpdate):
186
189
  )
187
190
  full_name: Optional[str] = Field(
188
191
  default=None,
189
- title="The full name for the account owner. Only relevant for user "
190
- "accounts.",
192
+ title="The display name for the account.",
191
193
  max_length=STR_FIELD_MAX_LENGTH,
192
194
  )
193
195
  is_admin: Optional[bool] = Field(
@@ -266,8 +268,7 @@ class UserResponseBody(BaseDatedResponseBody):
266
268
  )
267
269
  full_name: str = Field(
268
270
  default="",
269
- title="The full name for the account owner. Only relevant for user "
270
- "accounts.",
271
+ title="The display name for the account.",
271
272
  max_length=STR_FIELD_MAX_LENGTH,
272
273
  )
273
274
  email_opted_in: Optional[bool] = Field(
@@ -287,6 +288,10 @@ class UserResponseBody(BaseDatedResponseBody):
287
288
  default=None,
288
289
  title="The default project ID for the user.",
289
290
  )
291
+ avatar_url: Optional[str] = Field(
292
+ default=None,
293
+ title="The avatar URL for the account.",
294
+ )
290
295
 
291
296
 
292
297
  class UserResponseMetadata(BaseResponseMetadata):
@@ -439,6 +444,15 @@ class UserResponse(
439
444
  """
440
445
  return self.get_body().default_project_id
441
446
 
447
+ @property
448
+ def avatar_url(self) -> Optional[str]:
449
+ """The `avatar_url` property.
450
+
451
+ Returns:
452
+ the value of the property.
453
+ """
454
+ return self.get_body().avatar_url
455
+
442
456
  # Helper methods
443
457
  @classmethod
444
458
  def _get_crypt_context(cls) -> "CryptContext":
@@ -23,8 +23,11 @@ class ExternalUserModel(BaseModel):
23
23
  """External user model."""
24
24
 
25
25
  id: UUID
26
- email: str
26
+ username: str
27
+ email: Optional[str] = None
27
28
  name: Optional[str] = None
28
29
  is_admin: bool = False
30
+ is_service_account: bool = False
31
+ avatar_url: Optional[str] = None
29
32
 
30
33
  model_config = ConfigDict(extra="ignore")
@@ -16,7 +16,6 @@
16
16
  import signal
17
17
  import time
18
18
  from contextlib import nullcontext
19
- from functools import partial
20
19
  from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Tuple
21
20
 
22
21
  from zenml.client import Client
@@ -299,9 +298,8 @@ class StepLauncher:
299
298
  logs_context,
300
299
  step_logging.PipelineLogsStorageContext,
301
300
  ):
302
- force_write_logs = partial(
303
- logs_context.storage.save_to_file,
304
- force=True,
301
+ force_write_logs = (
302
+ logs_context.storage.send_merge_event
305
303
  )
306
304
  else:
307
305
 
zenml/zen_server/auth.py CHANGED
@@ -63,7 +63,11 @@ from zenml.models import (
63
63
  OAuthDeviceInternalResponse,
64
64
  OAuthDeviceInternalUpdate,
65
65
  OAuthTokenResponse,
66
+ ServiceAccountFilter,
67
+ ServiceAccountInternalRequest,
68
+ ServiceAccountInternalUpdate,
66
69
  UserAuthModel,
70
+ UserFilter,
67
71
  UserRequest,
68
72
  UserResponse,
69
73
  UserUpdate,
@@ -109,7 +113,8 @@ def _fetch_and_verify_api_key(
109
113
  Raises:
110
114
  CredentialsNotValid: If the API key could not be found, is not
111
115
  active, if it could not be verified against the supplied key value
112
- or if the associated service account is not active.
116
+ or if the associated service account is not active or is an
117
+ external service account.
113
118
  """
114
119
  store = zen_store()
115
120
 
@@ -129,6 +134,14 @@ def _fetch_and_verify_api_key(
129
134
  logger.exception(error)
130
135
  raise CredentialsNotValid(error)
131
136
 
137
+ if api_key.service_account.external_user_id:
138
+ error = (
139
+ "Authentication error: cannot use an API key associated with an "
140
+ "external service account to authenticate to the ZenML server"
141
+ )
142
+ logger.exception(error)
143
+ raise CredentialsNotValid(error)
144
+
132
145
  if not api_key.active:
133
146
  error = (
134
147
  f"Authentication error: API key "
@@ -714,37 +727,135 @@ def authenticate_external_user(
714
727
 
715
728
  # Check if the external user already exists in the ZenML server database
716
729
  # If not, create a new user. If yes, update the existing user.
717
- try:
718
- user = store.get_external_user(user_id=external_user.id)
719
-
720
- # Update the user information
721
- user = store.update_user(
722
- user_id=user.id,
723
- user_update=UserUpdate(
724
- name=external_user.email,
725
- full_name=external_user.name or "",
726
- email_opted_in=True,
727
- active=True,
728
- email=external_user.email,
729
- is_admin=external_user.is_admin,
730
+ user: Optional[UserResponse] = None
731
+ if not external_user.is_service_account:
732
+ users = store.list_users(
733
+ UserFilter(
734
+ external_user_id=external_user.id,
730
735
  ),
731
736
  )
732
- except KeyError:
733
- logger.info(
734
- f"External user with ID {external_user.id} not found in ZenML "
735
- f"server database. Creating a new user."
736
- )
737
- user = store.create_user(
738
- UserRequest(
739
- name=external_user.email,
740
- full_name=external_user.name or "",
737
+ if users.items:
738
+ user = users.items[0]
739
+ logger.info(
740
+ f"Found user with ID {user.id} matching the external user ID "
741
+ f"{external_user.id}."
742
+ )
743
+ else:
744
+ logger.info(
745
+ f"User with external user ID {external_user.id} not found."
746
+ )
747
+ # Try finding a user or service account with the same username.
748
+ # This is to handle migration of accounts from ZenML OSS to ZenML
749
+ # Pro: if the server contains an internal account with the same
750
+ # username as the ZenML Pro account, we adopt the existing
751
+ # user/service account.
752
+ users = store.list_users(
753
+ UserFilter(
754
+ name=external_user.username,
755
+ )
756
+ )
757
+ if users.items:
758
+ user = users.items[0]
759
+ logger.info(
760
+ f"Adopting existing user with username {user.name} and "
761
+ f"internal ID {user.id} as external user with ID "
762
+ f"{external_user.id}."
763
+ )
764
+ else:
765
+ service_accounts = store.list_service_accounts(
766
+ ServiceAccountFilter(
741
767
  external_user_id=external_user.id,
742
- email_opted_in=True,
743
- active=True,
744
- email=external_user.email,
745
- is_admin=external_user.is_admin,
746
768
  )
747
769
  )
770
+ if service_accounts.items:
771
+ service_account = service_accounts.items[0]
772
+ logger.info(
773
+ f"Found service account with ID {service_account.id} matching "
774
+ f"the external user ID {external_user.id}."
775
+ )
776
+ user = service_account.to_user_model()
777
+ else:
778
+ logger.info(
779
+ f"Service account with external user ID {external_user.id} "
780
+ f"not found."
781
+ )
782
+ # Try finding a service account with the same username.
783
+ # This is to handle migration of accounts from ZenML OSS to ZenML
784
+ # Pro: if the server contains an internal service account with the
785
+ # same username as the ZenML Pro service account, we adopt the
786
+ # existing service account.
787
+ service_accounts = store.list_service_accounts(
788
+ ServiceAccountFilter(
789
+ name=external_user.username,
790
+ )
791
+ )
792
+ if service_accounts.items:
793
+ service_account = service_accounts.items[0]
794
+ logger.info(
795
+ f"Adopting existing service account with username "
796
+ f"{service_account.name} and internal ID "
797
+ f"{service_account.id} as external service account with "
798
+ f"ID {external_user.id}."
799
+ )
800
+ user = service_account.to_user_model()
801
+
802
+ if user is not None:
803
+ if not user.is_service_account:
804
+ # Update the user information
805
+ user = store.update_user(
806
+ user_id=user.id,
807
+ user_update=UserUpdate(
808
+ name=external_user.username,
809
+ full_name=external_user.name or "",
810
+ email_opted_in=True,
811
+ active=True,
812
+ email=external_user.email,
813
+ is_admin=external_user.is_admin,
814
+ avatar_url=external_user.avatar_url,
815
+ external_user_id=external_user.id,
816
+ ),
817
+ )
818
+ else:
819
+ # Update the service account information
820
+ user = store.update_service_account(
821
+ service_account_name_or_id=user.id,
822
+ service_account_update=ServiceAccountInternalUpdate(
823
+ name=external_user.username,
824
+ full_name=external_user.name or "",
825
+ external_user_id=external_user.id,
826
+ active=True,
827
+ avatar_url=external_user.avatar_url,
828
+ ),
829
+ ).to_user_model()
830
+ else:
831
+ logger.info(
832
+ f"External account with ID {external_user.id} or name "
833
+ f"{external_user.username} not found in ZenML server database. "
834
+ f"Creating a new account."
835
+ )
836
+ if external_user.is_service_account:
837
+ user = store.create_service_account(
838
+ service_account=ServiceAccountInternalRequest(
839
+ name=external_user.username,
840
+ full_name=external_user.name or "",
841
+ external_user_id=external_user.id,
842
+ active=True,
843
+ avatar_url=external_user.avatar_url,
844
+ ),
845
+ ).to_user_model()
846
+ else:
847
+ user = store.create_user(
848
+ UserRequest(
849
+ name=external_user.username,
850
+ full_name=external_user.name or "",
851
+ external_user_id=external_user.id,
852
+ email_opted_in=True,
853
+ active=True,
854
+ email=external_user.email,
855
+ is_admin=external_user.is_admin,
856
+ avatar_url=external_user.avatar_url,
857
+ )
858
+ )
748
859
 
749
860
  with AnalyticsContext() as context:
750
861
  context.user_id = user.id
@@ -1 +1 @@
1
- import{j as e}from"./@radix-C_LirfyT.js";import{B as s,r as t}from"./index-BacoJBEQ.js";import{E as r}from"./EmptyState-DG0m-CGv.js";import{S as a}from"./help-B0CvBhCm.js";import{L as o}from"./@react-router-BSsrkPOd.js";import"./@tanstack-C0SeHZng.js";import"./@reactflow-D9hglKLF.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.projects.overview,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
1
+ import{j as e}from"./@radix-B1sy0Lhr.js";import{B as s,r as t}from"./index-CO6UN3UX.js";import{E as r}from"./EmptyState-BMA34iVR.js";import{S as a}from"./help-CRPfbPTO.js";import{L as o}from"./@react-router-CHjLNlgw.js";import"./@tanstack-Dwlisomv.js";import"./@reactflow-gbyyU3kq.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.projects.overview,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
@@ -92,4 +92,4 @@ You can add a description to the \`${Lr}\` by passing a \`${sg}\` component as a
92
92
 
93
93
  Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${Lr}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
94
94
 
95
- For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return f.useEffect(()=>{var s;document.getElementById((s=n.current)==null?void 0:s.getAttribute("aria-describedby"))||console.warn(i)},[i,n]),null},h1=eg,g1=tg,y1=ng,w1=rg,x1=og,S1=ug,C1=dg,E1=lg,P1=ag;function EP(n,i){return f.useReducer((o,s)=>i[o][s]??o,n)}var uc="ScrollArea",[fg,R1]=$e(uc),[PP,_t]=fg(uc),pg=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,type:s="hover",dir:a,scrollHideDelay:c=600,...p}=n,[v,m]=f.useState(null),[h,y]=f.useState(null),[w,S]=f.useState(null),[E,R]=f.useState(null),[C,T]=f.useState(null),[M,k]=f.useState(0),[I,b]=f.useState(0),[j,W]=f.useState(!1),[V,Q]=f.useState(!1),ee=we(i,he=>m(he)),ue=zr(a);return x.jsx(PP,{scope:o,type:s,dir:ue,scrollHideDelay:c,scrollArea:v,viewport:h,onViewportChange:y,content:w,onContentChange:S,scrollbarX:E,onScrollbarXChange:R,scrollbarXEnabled:j,onScrollbarXEnabledChange:W,scrollbarY:C,onScrollbarYChange:T,scrollbarYEnabled:V,onScrollbarYEnabledChange:Q,onCornerWidthChange:k,onCornerHeightChange:b,children:x.jsx(te.div,{dir:ue,...p,ref:ee,style:{position:"relative","--radix-scroll-area-corner-width":M+"px","--radix-scroll-area-corner-height":I+"px",...n.style}})})});pg.displayName=uc;var vg="ScrollAreaViewport",mg=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,children:s,nonce:a,...c}=n,p=_t(vg,o),v=f.useRef(null),m=we(i,v,p.onViewportChange);return x.jsxs(x.Fragment,{children:[x.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:a}),x.jsx(te.div,{"data-radix-scroll-area-viewport":"",...c,ref:m,style:{overflowX:p.scrollbarXEnabled?"scroll":"hidden",overflowY:p.scrollbarYEnabled?"scroll":"hidden",...n.style},children:x.jsx("div",{ref:p.onContentChange,style:{minWidth:"100%",display:"table"},children:s})})]})});mg.displayName=vg;var Wt="ScrollAreaScrollbar",RP=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=_t(Wt,n.__scopeScrollArea),{onScrollbarXEnabledChange:c,onScrollbarYEnabledChange:p}=a,v=n.orientation==="horizontal";return f.useEffect(()=>(v?c(!0):p(!0),()=>{v?c(!1):p(!1)}),[v,c,p]),a.type==="hover"?x.jsx(TP,{...s,ref:i,forceMount:o}):a.type==="scroll"?x.jsx(_P,{...s,ref:i,forceMount:o}):a.type==="auto"?x.jsx(hg,{...s,ref:i,forceMount:o}):a.type==="always"?x.jsx(cc,{...s,ref:i}):null});RP.displayName=Wt;var TP=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=_t(Wt,n.__scopeScrollArea),[c,p]=f.useState(!1);return f.useEffect(()=>{const v=a.scrollArea;let m=0;if(v){const h=()=>{window.clearTimeout(m),p(!0)},y=()=>{m=window.setTimeout(()=>p(!1),a.scrollHideDelay)};return v.addEventListener("pointerenter",h),v.addEventListener("pointerleave",y),()=>{window.clearTimeout(m),v.removeEventListener("pointerenter",h),v.removeEventListener("pointerleave",y)}}},[a.scrollArea,a.scrollHideDelay]),x.jsx(ze,{present:o||c,children:x.jsx(hg,{"data-state":c?"visible":"hidden",...s,ref:i})})}),_P=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=_t(Wt,n.__scopeScrollArea),c=n.orientation==="horizontal",p=Zl(()=>m("SCROLL_END"),100),[v,m]=EP("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return f.useEffect(()=>{if(v==="idle"){const h=window.setTimeout(()=>m("HIDE"),a.scrollHideDelay);return()=>window.clearTimeout(h)}},[v,a.scrollHideDelay,m]),f.useEffect(()=>{const h=a.viewport,y=c?"scrollLeft":"scrollTop";if(h){let w=h[y];const S=()=>{const E=h[y];w!==E&&(m("SCROLL"),p()),w=E};return h.addEventListener("scroll",S),()=>h.removeEventListener("scroll",S)}},[a.viewport,c,m,p]),x.jsx(ze,{present:o||v!=="hidden",children:x.jsx(cc,{"data-state":v==="hidden"?"hidden":"visible",...s,ref:i,onPointerEnter:H(n.onPointerEnter,()=>m("POINTER_ENTER")),onPointerLeave:H(n.onPointerLeave,()=>m("POINTER_LEAVE"))})})}),hg=f.forwardRef((n,i)=>{const o=_t(Wt,n.__scopeScrollArea),{forceMount:s,...a}=n,[c,p]=f.useState(!1),v=n.orientation==="horizontal",m=Zl(()=>{if(o.viewport){const h=o.viewport.offsetWidth<o.viewport.scrollWidth,y=o.viewport.offsetHeight<o.viewport.scrollHeight;p(v?h:y)}},10);return Fr(o.viewport,m),Fr(o.content,m),x.jsx(ze,{present:s||c,children:x.jsx(cc,{"data-state":c?"visible":"hidden",...a,ref:i})})}),cc=f.forwardRef((n,i)=>{const{orientation:o="vertical",...s}=n,a=_t(Wt,n.__scopeScrollArea),c=f.useRef(null),p=f.useRef(0),[v,m]=f.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),h=xg(v.viewport,v.content),y={...s,sizes:v,onSizesChange:m,hasThumb:h>0&&h<1,onThumbChange:S=>c.current=S,onThumbPointerUp:()=>p.current=0,onThumbPointerDown:S=>p.current=S};function w(S,E){return OP(S,p.current,v,E)}return o==="horizontal"?x.jsx(kP,{...y,ref:i,onThumbPositionChange:()=>{if(a.viewport&&c.current){const S=a.viewport.scrollLeft,E=Vp(S,v,a.dir);c.current.style.transform=`translate3d(${E}px, 0, 0)`}},onWheelScroll:S=>{a.viewport&&(a.viewport.scrollLeft=S)},onDragScroll:S=>{a.viewport&&(a.viewport.scrollLeft=w(S,a.dir))}}):o==="vertical"?x.jsx(NP,{...y,ref:i,onThumbPositionChange:()=>{if(a.viewport&&c.current){const S=a.viewport.scrollTop,E=Vp(S,v);c.current.style.transform=`translate3d(0, ${E}px, 0)`}},onWheelScroll:S=>{a.viewport&&(a.viewport.scrollTop=S)},onDragScroll:S=>{a.viewport&&(a.viewport.scrollTop=w(S))}}):null}),kP=f.forwardRef((n,i)=>{const{sizes:o,onSizesChange:s,...a}=n,c=_t(Wt,n.__scopeScrollArea),[p,v]=f.useState(),m=f.useRef(null),h=we(i,m,c.onScrollbarXChange);return f.useEffect(()=>{m.current&&v(getComputedStyle(m.current))},[m]),x.jsx(yg,{"data-orientation":"horizontal",...a,ref:h,sizes:o,style:{bottom:0,left:c.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:c.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":Ql(o)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.x),onDragScroll:y=>n.onDragScroll(y.x),onWheelScroll:(y,w)=>{if(c.viewport){const S=c.viewport.scrollLeft+y.deltaX;n.onWheelScroll(S),Cg(S,w)&&y.preventDefault()}},onResize:()=>{m.current&&c.viewport&&p&&s({content:c.viewport.scrollWidth,viewport:c.viewport.offsetWidth,scrollbar:{size:m.current.clientWidth,paddingStart:Tl(p.paddingLeft),paddingEnd:Tl(p.paddingRight)}})}})}),NP=f.forwardRef((n,i)=>{const{sizes:o,onSizesChange:s,...a}=n,c=_t(Wt,n.__scopeScrollArea),[p,v]=f.useState(),m=f.useRef(null),h=we(i,m,c.onScrollbarYChange);return f.useEffect(()=>{m.current&&v(getComputedStyle(m.current))},[m]),x.jsx(yg,{"data-orientation":"vertical",...a,ref:h,sizes:o,style:{top:0,right:c.dir==="ltr"?0:void 0,left:c.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":Ql(o)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.y),onDragScroll:y=>n.onDragScroll(y.y),onWheelScroll:(y,w)=>{if(c.viewport){const S=c.viewport.scrollTop+y.deltaY;n.onWheelScroll(S),Cg(S,w)&&y.preventDefault()}},onResize:()=>{m.current&&c.viewport&&p&&s({content:c.viewport.scrollHeight,viewport:c.viewport.offsetHeight,scrollbar:{size:m.current.clientHeight,paddingStart:Tl(p.paddingTop),paddingEnd:Tl(p.paddingBottom)}})}})}),[AP,gg]=fg(Wt),yg=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,sizes:s,hasThumb:a,onThumbChange:c,onThumbPointerUp:p,onThumbPointerDown:v,onThumbPositionChange:m,onDragScroll:h,onWheelScroll:y,onResize:w,...S}=n,E=_t(Wt,o),[R,C]=f.useState(null),T=we(i,ee=>C(ee)),M=f.useRef(null),k=f.useRef(""),I=E.viewport,b=s.content-s.viewport,j=De(y),W=De(m),V=Zl(w,10);function Q(ee){if(M.current){const ue=ee.clientX-M.current.left,he=ee.clientY-M.current.top;h({x:ue,y:he})}}return f.useEffect(()=>{const ee=ue=>{const he=ue.target;(R==null?void 0:R.contains(he))&&j(ue,b)};return document.addEventListener("wheel",ee,{passive:!1}),()=>document.removeEventListener("wheel",ee,{passive:!1})},[I,R,b,j]),f.useEffect(W,[s,W]),Fr(R,V),Fr(E.content,V),x.jsx(AP,{scope:o,scrollbar:R,hasThumb:a,onThumbChange:De(c),onThumbPointerUp:De(p),onThumbPositionChange:W,onThumbPointerDown:De(v),children:x.jsx(te.div,{...S,ref:T,style:{position:"absolute",...S.style},onPointerDown:H(n.onPointerDown,ee=>{ee.button===0&&(ee.target.setPointerCapture(ee.pointerId),M.current=R.getBoundingClientRect(),k.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",E.viewport&&(E.viewport.style.scrollBehavior="auto"),Q(ee))}),onPointerMove:H(n.onPointerMove,Q),onPointerUp:H(n.onPointerUp,ee=>{const ue=ee.target;ue.hasPointerCapture(ee.pointerId)&&ue.releasePointerCapture(ee.pointerId),document.body.style.webkitUserSelect=k.current,E.viewport&&(E.viewport.style.scrollBehavior=""),M.current=null})})})}),Rl="ScrollAreaThumb",MP=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=gg(Rl,n.__scopeScrollArea);return x.jsx(ze,{present:o||a.hasThumb,children:x.jsx(IP,{ref:i,...s})})}),IP=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,style:s,...a}=n,c=_t(Rl,o),p=gg(Rl,o),{onThumbPositionChange:v}=p,m=we(i,w=>p.onThumbChange(w)),h=f.useRef(void 0),y=Zl(()=>{h.current&&(h.current(),h.current=void 0)},100);return f.useEffect(()=>{const w=c.viewport;if(w){const S=()=>{if(y(),!h.current){const E=LP(w,v);h.current=E,v()}};return v(),w.addEventListener("scroll",S),()=>w.removeEventListener("scroll",S)}},[c.viewport,y,v]),x.jsx(te.div,{"data-state":p.hasThumb?"visible":"hidden",...a,ref:m,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...s},onPointerDownCapture:H(n.onPointerDownCapture,w=>{const E=w.target.getBoundingClientRect(),R=w.clientX-E.left,C=w.clientY-E.top;p.onThumbPointerDown({x:R,y:C})}),onPointerUp:H(n.onPointerUp,p.onThumbPointerUp)})});MP.displayName=Rl;var dc="ScrollAreaCorner",wg=f.forwardRef((n,i)=>{const o=_t(dc,n.__scopeScrollArea),s=!!(o.scrollbarX&&o.scrollbarY);return o.type!=="scroll"&&s?x.jsx(DP,{...n,ref:i}):null});wg.displayName=dc;var DP=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,...s}=n,a=_t(dc,o),[c,p]=f.useState(0),[v,m]=f.useState(0),h=!!(c&&v);return Fr(a.scrollbarX,()=>{var w;const y=((w=a.scrollbarX)==null?void 0:w.offsetHeight)||0;a.onCornerHeightChange(y),m(y)}),Fr(a.scrollbarY,()=>{var w;const y=((w=a.scrollbarY)==null?void 0:w.offsetWidth)||0;a.onCornerWidthChange(y),p(y)}),h?x.jsx(te.div,{...s,ref:i,style:{width:c,height:v,position:"absolute",right:a.dir==="ltr"?0:void 0,left:a.dir==="rtl"?0:void 0,bottom:0,...n.style}}):null});function Tl(n){return n?parseInt(n,10):0}function xg(n,i){const o=n/i;return isNaN(o)?0:o}function Ql(n){const i=xg(n.viewport,n.content),o=n.scrollbar.paddingStart+n.scrollbar.paddingEnd,s=(n.scrollbar.size-o)*i;return Math.max(s,18)}function OP(n,i,o,s="ltr"){const a=Ql(o),c=a/2,p=i||c,v=a-p,m=o.scrollbar.paddingStart+p,h=o.scrollbar.size-o.scrollbar.paddingEnd-v,y=o.content-o.viewport,w=s==="ltr"?[0,y]:[y*-1,0];return Sg([m,h],w)(n)}function Vp(n,i,o="ltr"){const s=Ql(i),a=i.scrollbar.paddingStart+i.scrollbar.paddingEnd,c=i.scrollbar.size-a,p=i.content-i.viewport,v=c-s,m=o==="ltr"?[0,p]:[p*-1,0],h=hu(n,m);return Sg([0,p],[0,v])(h)}function Sg(n,i){return o=>{if(n[0]===n[1]||i[0]===i[1])return i[0];const s=(i[1]-i[0])/(n[1]-n[0]);return i[0]+s*(o-n[0])}}function Cg(n,i){return n>0&&n<i}var LP=(n,i=()=>{})=>{let o={left:n.scrollLeft,top:n.scrollTop},s=0;return function a(){const c={left:n.scrollLeft,top:n.scrollTop},p=o.left!==c.left,v=o.top!==c.top;(p||v)&&i(),o=c,s=window.requestAnimationFrame(a)}(),()=>window.cancelAnimationFrame(s)};function Zl(n,i){const o=De(n),s=f.useRef(0);return f.useEffect(()=>()=>window.clearTimeout(s.current),[]),f.useCallback(()=>{window.clearTimeout(s.current),s.current=window.setTimeout(o,i)},[o,i])}function Fr(n,i){const o=De(i);Ue(()=>{let s=0;if(n){const a=new ResizeObserver(()=>{cancelAnimationFrame(s),s=window.requestAnimationFrame(o)});return a.observe(n),()=>{window.cancelAnimationFrame(s),a.unobserve(n)}}},[n,o])}var T1=pg,_1=mg,k1=wg,ru,fc="HoverCard",[Eg,N1]=$e(fc,[Bt]),ql=Bt(),[bP,pc]=Eg(fc),Pg=n=>{const{__scopeHoverCard:i,children:o,open:s,defaultOpen:a,onOpenChange:c,openDelay:p=700,closeDelay:v=300}=n,m=ql(i),h=f.useRef(0),y=f.useRef(0),w=f.useRef(!1),S=f.useRef(!1),[E=!1,R]=dt({prop:s,defaultProp:a,onChange:c}),C=f.useCallback(()=>{clearTimeout(y.current),h.current=window.setTimeout(()=>R(!0),p)},[p,R]),T=f.useCallback(()=>{clearTimeout(h.current),!w.current&&!S.current&&(y.current=window.setTimeout(()=>R(!1),v))},[v,R]),M=f.useCallback(()=>R(!1),[R]);return f.useEffect(()=>()=>{clearTimeout(h.current),clearTimeout(y.current)},[]),x.jsx(bP,{scope:i,open:E,onOpenChange:R,onOpen:C,onClose:T,onDismiss:M,hasSelectionRef:w,isPointerDownOnContentRef:S,children:x.jsx(Uo,{...m,children:o})})};Pg.displayName=fc;var Rg="HoverCardTrigger",Tg=f.forwardRef((n,i)=>{const{__scopeHoverCard:o,...s}=n,a=pc(Rg,o),c=ql(o);return x.jsx(Vr,{asChild:!0,...c,children:x.jsx(te.a,{"data-state":a.open?"open":"closed",...s,ref:i,onPointerEnter:H(n.onPointerEnter,kl(a.onOpen)),onPointerLeave:H(n.onPointerLeave,kl(a.onClose)),onFocus:H(n.onFocus,a.onOpen),onBlur:H(n.onBlur,a.onClose),onTouchStart:H(n.onTouchStart,p=>p.preventDefault())})})});Tg.displayName=Rg;var jP="HoverCardPortal",[A1,FP]=Eg(jP,{forceMount:void 0}),_l="HoverCardContent",_g=f.forwardRef((n,i)=>{const o=FP(_l,n.__scopeHoverCard),{forceMount:s=o.forceMount,...a}=n,c=pc(_l,n.__scopeHoverCard);return x.jsx(ze,{present:s||c.open,children:x.jsx($P,{"data-state":c.open?"open":"closed",...a,onPointerEnter:H(n.onPointerEnter,kl(c.onOpen)),onPointerLeave:H(n.onPointerLeave,kl(c.onClose)),ref:i})})});_g.displayName=_l;var $P=f.forwardRef((n,i)=>{const{__scopeHoverCard:o,onEscapeKeyDown:s,onPointerDownOutside:a,onFocusOutside:c,onInteractOutside:p,...v}=n,m=pc(_l,o),h=ql(o),y=f.useRef(null),w=we(i,y),[S,E]=f.useState(!1);return f.useEffect(()=>{if(S){const R=document.body;return ru=R.style.userSelect||R.style.webkitUserSelect,R.style.userSelect="none",R.style.webkitUserSelect="none",()=>{R.style.userSelect=ru,R.style.webkitUserSelect=ru}}},[S]),f.useEffect(()=>{if(y.current){const R=()=>{E(!1),m.isPointerDownOnContentRef.current=!1,setTimeout(()=>{var T;((T=document.getSelection())==null?void 0:T.toString())!==""&&(m.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",R),()=>{document.removeEventListener("pointerup",R),m.hasSelectionRef.current=!1,m.isPointerDownOnContentRef.current=!1}}},[m.isPointerDownOnContentRef,m.hasSelectionRef]),f.useEffect(()=>{y.current&&UP(y.current).forEach(C=>C.setAttribute("tabindex","-1"))}),x.jsx(bn,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:p,onEscapeKeyDown:s,onPointerDownOutside:a,onFocusOutside:H(c,R=>{R.preventDefault()}),onDismiss:m.onDismiss,children:x.jsx(Vo,{...h,...v,onPointerDown:H(v.onPointerDown,R=>{R.currentTarget.contains(R.target)&&E(!0),m.hasSelectionRef.current=!1,m.isPointerDownOnContentRef.current=!0}),ref:w,style:{...v.style,userSelect:S?"text":void 0,WebkitUserSelect:S?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})})}),zP="HoverCardArrow",HP=f.forwardRef((n,i)=>{const{__scopeHoverCard:o,...s}=n,a=ql(o);return x.jsx(Bo,{...a,...s,ref:i})});HP.displayName=zP;function kl(n){return i=>i.pointerType==="touch"?void 0:n()}function UP(n){const i=[],o=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;o.nextNode();)i.push(o.currentNode);return i}var M1=Pg,I1=Tg,D1=_g,vc="Radio",[VP,kg]=$e(vc),[BP,WP]=VP(vc),Ng=f.forwardRef((n,i)=>{const{__scopeRadio:o,name:s,checked:a=!1,required:c,disabled:p,value:v="on",onCheck:m,form:h,...y}=n,[w,S]=f.useState(null),E=we(i,T=>S(T)),R=f.useRef(!1),C=w?h||!!w.closest("form"):!0;return x.jsxs(BP,{scope:o,checked:a,disabled:p,children:[x.jsx(te.button,{type:"button",role:"radio","aria-checked":a,"data-state":Ig(a),"data-disabled":p?"":void 0,disabled:p,value:v,...y,ref:E,onClick:H(n.onClick,T=>{a||m==null||m(),C&&(R.current=T.isPropagationStopped(),R.current||T.stopPropagation())})}),C&&x.jsx(KP,{control:w,bubbles:!R.current,name:s,value:v,checked:a,required:c,disabled:p,form:h,style:{transform:"translateX(-100%)"}})]})});Ng.displayName=vc;var Ag="RadioIndicator",Mg=f.forwardRef((n,i)=>{const{__scopeRadio:o,forceMount:s,...a}=n,c=WP(Ag,o);return x.jsx(ze,{present:s||c.checked,children:x.jsx(te.span,{"data-state":Ig(c.checked),"data-disabled":c.disabled?"":void 0,...a,ref:i})})});Mg.displayName=Ag;var KP=n=>{const{control:i,checked:o,bubbles:s=!0,...a}=n,c=f.useRef(null),p=Bl(o),v=Ol(i);return f.useEffect(()=>{const m=c.current,h=window.HTMLInputElement.prototype,w=Object.getOwnPropertyDescriptor(h,"checked").set;if(p!==o&&w){const S=new Event("click",{bubbles:s});w.call(m,o),m.dispatchEvent(S)}},[p,o,s]),x.jsx("input",{type:"radio","aria-hidden":!0,defaultChecked:o,...a,tabIndex:-1,ref:c,style:{...n.style,...v,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})};function Ig(n){return n?"checked":"unchecked"}var GP=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],mc="RadioGroup",[YP,O1]=$e(mc,[Wr,kg]),Dg=Wr(),Og=kg(),[XP,QP]=YP(mc),Lg=f.forwardRef((n,i)=>{const{__scopeRadioGroup:o,name:s,defaultValue:a,value:c,required:p=!1,disabled:v=!1,orientation:m,dir:h,loop:y=!0,onValueChange:w,...S}=n,E=Dg(o),R=zr(h),[C,T]=dt({prop:c,defaultProp:a,onChange:w});return x.jsx(XP,{scope:o,name:s,required:p,disabled:v,value:C,onValueChange:T,children:x.jsx(Ou,{asChild:!0,...E,orientation:m,dir:R,loop:y,children:x.jsx(te.div,{role:"radiogroup","aria-required":p,"aria-orientation":m,"data-disabled":v?"":void 0,dir:R,...S,ref:i})})})});Lg.displayName=mc;var bg="RadioGroupItem",jg=f.forwardRef((n,i)=>{const{__scopeRadioGroup:o,disabled:s,...a}=n,c=QP(bg,o),p=c.disabled||s,v=Dg(o),m=Og(o),h=f.useRef(null),y=we(i,h),w=c.value===a.value,S=f.useRef(!1);return f.useEffect(()=>{const E=C=>{GP.includes(C.key)&&(S.current=!0)},R=()=>S.current=!1;return document.addEventListener("keydown",E),document.addEventListener("keyup",R),()=>{document.removeEventListener("keydown",E),document.removeEventListener("keyup",R)}},[]),x.jsx(Lu,{asChild:!0,...v,focusable:!p,active:w,children:x.jsx(Ng,{disabled:p,required:c.required,checked:w,...m,...a,name:c.name,ref:y,onCheck:()=>c.onValueChange(a.value),onKeyDown:H(E=>{E.key==="Enter"&&E.preventDefault()}),onFocus:H(a.onFocus,()=>{var E;S.current&&((E=h.current)==null||E.click())})})})});jg.displayName=bg;var ZP="RadioGroupIndicator",Fg=f.forwardRef((n,i)=>{const{__scopeRadioGroup:o,...s}=n,a=Og(o);return x.jsx(Mg,{...a,...s,ref:i})});Fg.displayName=ZP;var L1=Lg,b1=jg,j1=Fg,hc="Popover",[$g,F1]=$e(hc,[Bt]),Qo=Bt(),[qP,$n]=$g(hc),zg=n=>{const{__scopePopover:i,children:o,open:s,defaultOpen:a,onOpenChange:c,modal:p=!1}=n,v=Qo(i),m=f.useRef(null),[h,y]=f.useState(!1),[w=!1,S]=dt({prop:s,defaultProp:a,onChange:c});return x.jsx(Uo,{...v,children:x.jsx(qP,{scope:i,contentId:gt(),triggerRef:m,open:w,onOpenChange:S,onOpenToggle:f.useCallback(()=>S(E=>!E),[S]),hasCustomAnchor:h,onCustomAnchorAdd:f.useCallback(()=>y(!0),[]),onCustomAnchorRemove:f.useCallback(()=>y(!1),[]),modal:p,children:o})})};zg.displayName=hc;var Hg="PopoverAnchor",JP=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=$n(Hg,o),c=Qo(o),{onCustomAnchorAdd:p,onCustomAnchorRemove:v}=a;return f.useEffect(()=>(p(),()=>v()),[p,v]),x.jsx(Vr,{...c,...s,ref:i})});JP.displayName=Hg;var Ug="PopoverTrigger",Vg=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=$n(Ug,o),c=Qo(o),p=we(i,a.triggerRef),v=x.jsx(te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":Yg(a.open),...s,ref:p,onClick:H(n.onClick,a.onOpenToggle)});return a.hasCustomAnchor?v:x.jsx(Vr,{asChild:!0,...c,children:v})});Vg.displayName=Ug;var gc="PopoverPortal",[eR,tR]=$g(gc,{forceMount:void 0}),Bg=n=>{const{__scopePopover:i,forceMount:o,children:s,container:a}=n,c=$n(gc,i);return x.jsx(eR,{scope:i,forceMount:o,children:x.jsx(ze,{present:o||c.open,children:x.jsx(Br,{asChild:!0,container:a,children:s})})})};Bg.displayName=gc;var $r="PopoverContent",Wg=f.forwardRef((n,i)=>{const o=tR($r,n.__scopePopover),{forceMount:s=o.forceMount,...a}=n,c=$n($r,n.__scopePopover);return x.jsx(ze,{present:s||c.open,children:c.modal?x.jsx(nR,{...a,ref:i}):x.jsx(rR,{...a,ref:i})})});Wg.displayName=$r;var nR=f.forwardRef((n,i)=>{const o=$n($r,n.__scopePopover),s=f.useRef(null),a=we(i,s),c=f.useRef(!1);return f.useEffect(()=>{const p=s.current;if(p)return bl(p)},[]),x.jsx(Wo,{as:In,allowPinchZoom:!0,children:x.jsx(Kg,{...n,ref:a,trapFocus:o.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:H(n.onCloseAutoFocus,p=>{var v;p.preventDefault(),c.current||(v=o.triggerRef.current)==null||v.focus()}),onPointerDownOutside:H(n.onPointerDownOutside,p=>{const v=p.detail.originalEvent,m=v.button===0&&v.ctrlKey===!0,h=v.button===2||m;c.current=h},{checkForDefaultPrevented:!1}),onFocusOutside:H(n.onFocusOutside,p=>p.preventDefault(),{checkForDefaultPrevented:!1})})})}),rR=f.forwardRef((n,i)=>{const o=$n($r,n.__scopePopover),s=f.useRef(!1),a=f.useRef(!1);return x.jsx(Kg,{...n,ref:i,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:c=>{var p,v;(p=n.onCloseAutoFocus)==null||p.call(n,c),c.defaultPrevented||(s.current||(v=o.triggerRef.current)==null||v.focus(),c.preventDefault()),s.current=!1,a.current=!1},onInteractOutside:c=>{var m,h;(m=n.onInteractOutside)==null||m.call(n,c),c.defaultPrevented||(s.current=!0,c.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const p=c.target;((h=o.triggerRef.current)==null?void 0:h.contains(p))&&c.preventDefault(),c.detail.originalEvent.type==="focusin"&&a.current&&c.preventDefault()}})}),Kg=f.forwardRef((n,i)=>{const{__scopePopover:o,trapFocus:s,onOpenAutoFocus:a,onCloseAutoFocus:c,disableOutsidePointerEvents:p,onEscapeKeyDown:v,onPointerDownOutside:m,onFocusOutside:h,onInteractOutside:y,...w}=n,S=$n($r,o),E=Qo(o);return Ml(),x.jsx(zo,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:a,onUnmountAutoFocus:c,children:x.jsx(bn,{asChild:!0,disableOutsidePointerEvents:p,onInteractOutside:y,onEscapeKeyDown:v,onPointerDownOutside:m,onFocusOutside:h,onDismiss:()=>S.onOpenChange(!1),children:x.jsx(Vo,{"data-state":Yg(S.open),role:"dialog",id:S.contentId,...E,...w,ref:i,style:{...w.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),Gg="PopoverClose",oR=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=$n(Gg,o);return x.jsx(te.button,{type:"button",...s,ref:i,onClick:H(n.onClick,()=>a.onOpenChange(!1))})});oR.displayName=Gg;var iR="PopoverArrow",lR=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=Qo(o);return x.jsx(Bo,{...a,...s,ref:i})});lR.displayName=iR;function Yg(n){return n?"open":"closed"}var $1=zg,z1=Vg,H1=Bg,U1=Wg;export{c1 as $,HR as A,UR as B,VC as C,WC as D,KR as E,fR as F,XR as G,QR as H,dR as I,GR as J,YR as K,wR as L,qR as M,JR as N,UC as O,te as P,n1 as Q,Yw as R,In as S,BC as T,o1 as U,WR as V,i1 as W,l1 as X,s1 as Y,a1 as Z,u1 as _,aR as a,d1 as a0,p1 as a1,v1 as a2,w1 as a3,y1 as a4,x1 as a5,E1 as a6,P1 as a7,T1 as a8,_1 as a9,r1 as aA,M1 as aB,I1 as aC,BR as aD,sR as aE,Wm as aF,Hm as aG,Vm as aH,$m as aI,k1 as aa,RP as ab,MP as ac,D1 as ad,L1 as ae,b1 as af,j1 as ag,H1 as ah,U1 as ai,zC as aj,QC as ak,ZC as al,kR as am,mR as an,hR as ao,bR as ap,jR as aq,FR as ar,h1 as as,C1 as at,jm as au,g1 as av,S1 as aw,$1 as ax,z1 as ay,t1 as az,Cu as b,Nn as c,qw as d,$C as e,HC as f,Wp as g,cR as h,RR as i,x as j,TR as k,gR as l,yR as m,xR as n,Eu as o,SR as p,ER as q,f as r,CR as s,PR as t,gt as u,NR as v,AR as w,MR as x,DR as y,$R as z};
95
+ For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return f.useEffect(()=>{var s;document.getElementById((s=n.current)==null?void 0:s.getAttribute("aria-describedby"))||console.warn(i)},[i,n]),null},h1=eg,g1=tg,y1=ng,w1=rg,x1=og,S1=ug,C1=dg,E1=lg,P1=ag;function EP(n,i){return f.useReducer((o,s)=>i[o][s]??o,n)}var uc="ScrollArea",[fg,R1]=$e(uc),[PP,_t]=fg(uc),pg=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,type:s="hover",dir:a,scrollHideDelay:c=600,...p}=n,[v,m]=f.useState(null),[h,y]=f.useState(null),[w,S]=f.useState(null),[E,R]=f.useState(null),[C,T]=f.useState(null),[M,k]=f.useState(0),[I,b]=f.useState(0),[j,W]=f.useState(!1),[V,Q]=f.useState(!1),ee=we(i,he=>m(he)),ue=zr(a);return x.jsx(PP,{scope:o,type:s,dir:ue,scrollHideDelay:c,scrollArea:v,viewport:h,onViewportChange:y,content:w,onContentChange:S,scrollbarX:E,onScrollbarXChange:R,scrollbarXEnabled:j,onScrollbarXEnabledChange:W,scrollbarY:C,onScrollbarYChange:T,scrollbarYEnabled:V,onScrollbarYEnabledChange:Q,onCornerWidthChange:k,onCornerHeightChange:b,children:x.jsx(te.div,{dir:ue,...p,ref:ee,style:{position:"relative","--radix-scroll-area-corner-width":M+"px","--radix-scroll-area-corner-height":I+"px",...n.style}})})});pg.displayName=uc;var vg="ScrollAreaViewport",mg=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,children:s,nonce:a,...c}=n,p=_t(vg,o),v=f.useRef(null),m=we(i,v,p.onViewportChange);return x.jsxs(x.Fragment,{children:[x.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:a}),x.jsx(te.div,{"data-radix-scroll-area-viewport":"",...c,ref:m,style:{overflowX:p.scrollbarXEnabled?"scroll":"hidden",overflowY:p.scrollbarYEnabled?"scroll":"hidden",...n.style},children:x.jsx("div",{ref:p.onContentChange,style:{minWidth:"100%",display:"table"},children:s})})]})});mg.displayName=vg;var Wt="ScrollAreaScrollbar",RP=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=_t(Wt,n.__scopeScrollArea),{onScrollbarXEnabledChange:c,onScrollbarYEnabledChange:p}=a,v=n.orientation==="horizontal";return f.useEffect(()=>(v?c(!0):p(!0),()=>{v?c(!1):p(!1)}),[v,c,p]),a.type==="hover"?x.jsx(TP,{...s,ref:i,forceMount:o}):a.type==="scroll"?x.jsx(_P,{...s,ref:i,forceMount:o}):a.type==="auto"?x.jsx(hg,{...s,ref:i,forceMount:o}):a.type==="always"?x.jsx(cc,{...s,ref:i}):null});RP.displayName=Wt;var TP=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=_t(Wt,n.__scopeScrollArea),[c,p]=f.useState(!1);return f.useEffect(()=>{const v=a.scrollArea;let m=0;if(v){const h=()=>{window.clearTimeout(m),p(!0)},y=()=>{m=window.setTimeout(()=>p(!1),a.scrollHideDelay)};return v.addEventListener("pointerenter",h),v.addEventListener("pointerleave",y),()=>{window.clearTimeout(m),v.removeEventListener("pointerenter",h),v.removeEventListener("pointerleave",y)}}},[a.scrollArea,a.scrollHideDelay]),x.jsx(ze,{present:o||c,children:x.jsx(hg,{"data-state":c?"visible":"hidden",...s,ref:i})})}),_P=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=_t(Wt,n.__scopeScrollArea),c=n.orientation==="horizontal",p=Zl(()=>m("SCROLL_END"),100),[v,m]=EP("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return f.useEffect(()=>{if(v==="idle"){const h=window.setTimeout(()=>m("HIDE"),a.scrollHideDelay);return()=>window.clearTimeout(h)}},[v,a.scrollHideDelay,m]),f.useEffect(()=>{const h=a.viewport,y=c?"scrollLeft":"scrollTop";if(h){let w=h[y];const S=()=>{const E=h[y];w!==E&&(m("SCROLL"),p()),w=E};return h.addEventListener("scroll",S),()=>h.removeEventListener("scroll",S)}},[a.viewport,c,m,p]),x.jsx(ze,{present:o||v!=="hidden",children:x.jsx(cc,{"data-state":v==="hidden"?"hidden":"visible",...s,ref:i,onPointerEnter:H(n.onPointerEnter,()=>m("POINTER_ENTER")),onPointerLeave:H(n.onPointerLeave,()=>m("POINTER_LEAVE"))})})}),hg=f.forwardRef((n,i)=>{const o=_t(Wt,n.__scopeScrollArea),{forceMount:s,...a}=n,[c,p]=f.useState(!1),v=n.orientation==="horizontal",m=Zl(()=>{if(o.viewport){const h=o.viewport.offsetWidth<o.viewport.scrollWidth,y=o.viewport.offsetHeight<o.viewport.scrollHeight;p(v?h:y)}},10);return Fr(o.viewport,m),Fr(o.content,m),x.jsx(ze,{present:s||c,children:x.jsx(cc,{"data-state":c?"visible":"hidden",...a,ref:i})})}),cc=f.forwardRef((n,i)=>{const{orientation:o="vertical",...s}=n,a=_t(Wt,n.__scopeScrollArea),c=f.useRef(null),p=f.useRef(0),[v,m]=f.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),h=xg(v.viewport,v.content),y={...s,sizes:v,onSizesChange:m,hasThumb:h>0&&h<1,onThumbChange:S=>c.current=S,onThumbPointerUp:()=>p.current=0,onThumbPointerDown:S=>p.current=S};function w(S,E){return OP(S,p.current,v,E)}return o==="horizontal"?x.jsx(kP,{...y,ref:i,onThumbPositionChange:()=>{if(a.viewport&&c.current){const S=a.viewport.scrollLeft,E=Vp(S,v,a.dir);c.current.style.transform=`translate3d(${E}px, 0, 0)`}},onWheelScroll:S=>{a.viewport&&(a.viewport.scrollLeft=S)},onDragScroll:S=>{a.viewport&&(a.viewport.scrollLeft=w(S,a.dir))}}):o==="vertical"?x.jsx(NP,{...y,ref:i,onThumbPositionChange:()=>{if(a.viewport&&c.current){const S=a.viewport.scrollTop,E=Vp(S,v);c.current.style.transform=`translate3d(0, ${E}px, 0)`}},onWheelScroll:S=>{a.viewport&&(a.viewport.scrollTop=S)},onDragScroll:S=>{a.viewport&&(a.viewport.scrollTop=w(S))}}):null}),kP=f.forwardRef((n,i)=>{const{sizes:o,onSizesChange:s,...a}=n,c=_t(Wt,n.__scopeScrollArea),[p,v]=f.useState(),m=f.useRef(null),h=we(i,m,c.onScrollbarXChange);return f.useEffect(()=>{m.current&&v(getComputedStyle(m.current))},[m]),x.jsx(yg,{"data-orientation":"horizontal",...a,ref:h,sizes:o,style:{bottom:0,left:c.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:c.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":Ql(o)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.x),onDragScroll:y=>n.onDragScroll(y.x),onWheelScroll:(y,w)=>{if(c.viewport){const S=c.viewport.scrollLeft+y.deltaX;n.onWheelScroll(S),Cg(S,w)&&y.preventDefault()}},onResize:()=>{m.current&&c.viewport&&p&&s({content:c.viewport.scrollWidth,viewport:c.viewport.offsetWidth,scrollbar:{size:m.current.clientWidth,paddingStart:Tl(p.paddingLeft),paddingEnd:Tl(p.paddingRight)}})}})}),NP=f.forwardRef((n,i)=>{const{sizes:o,onSizesChange:s,...a}=n,c=_t(Wt,n.__scopeScrollArea),[p,v]=f.useState(),m=f.useRef(null),h=we(i,m,c.onScrollbarYChange);return f.useEffect(()=>{m.current&&v(getComputedStyle(m.current))},[m]),x.jsx(yg,{"data-orientation":"vertical",...a,ref:h,sizes:o,style:{top:0,right:c.dir==="ltr"?0:void 0,left:c.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":Ql(o)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.y),onDragScroll:y=>n.onDragScroll(y.y),onWheelScroll:(y,w)=>{if(c.viewport){const S=c.viewport.scrollTop+y.deltaY;n.onWheelScroll(S),Cg(S,w)&&y.preventDefault()}},onResize:()=>{m.current&&c.viewport&&p&&s({content:c.viewport.scrollHeight,viewport:c.viewport.offsetHeight,scrollbar:{size:m.current.clientHeight,paddingStart:Tl(p.paddingTop),paddingEnd:Tl(p.paddingBottom)}})}})}),[AP,gg]=fg(Wt),yg=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,sizes:s,hasThumb:a,onThumbChange:c,onThumbPointerUp:p,onThumbPointerDown:v,onThumbPositionChange:m,onDragScroll:h,onWheelScroll:y,onResize:w,...S}=n,E=_t(Wt,o),[R,C]=f.useState(null),T=we(i,ee=>C(ee)),M=f.useRef(null),k=f.useRef(""),I=E.viewport,b=s.content-s.viewport,j=De(y),W=De(m),V=Zl(w,10);function Q(ee){if(M.current){const ue=ee.clientX-M.current.left,he=ee.clientY-M.current.top;h({x:ue,y:he})}}return f.useEffect(()=>{const ee=ue=>{const he=ue.target;(R==null?void 0:R.contains(he))&&j(ue,b)};return document.addEventListener("wheel",ee,{passive:!1}),()=>document.removeEventListener("wheel",ee,{passive:!1})},[I,R,b,j]),f.useEffect(W,[s,W]),Fr(R,V),Fr(E.content,V),x.jsx(AP,{scope:o,scrollbar:R,hasThumb:a,onThumbChange:De(c),onThumbPointerUp:De(p),onThumbPositionChange:W,onThumbPointerDown:De(v),children:x.jsx(te.div,{...S,ref:T,style:{position:"absolute",...S.style},onPointerDown:H(n.onPointerDown,ee=>{ee.button===0&&(ee.target.setPointerCapture(ee.pointerId),M.current=R.getBoundingClientRect(),k.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",E.viewport&&(E.viewport.style.scrollBehavior="auto"),Q(ee))}),onPointerMove:H(n.onPointerMove,Q),onPointerUp:H(n.onPointerUp,ee=>{const ue=ee.target;ue.hasPointerCapture(ee.pointerId)&&ue.releasePointerCapture(ee.pointerId),document.body.style.webkitUserSelect=k.current,E.viewport&&(E.viewport.style.scrollBehavior=""),M.current=null})})})}),Rl="ScrollAreaThumb",MP=f.forwardRef((n,i)=>{const{forceMount:o,...s}=n,a=gg(Rl,n.__scopeScrollArea);return x.jsx(ze,{present:o||a.hasThumb,children:x.jsx(IP,{ref:i,...s})})}),IP=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,style:s,...a}=n,c=_t(Rl,o),p=gg(Rl,o),{onThumbPositionChange:v}=p,m=we(i,w=>p.onThumbChange(w)),h=f.useRef(void 0),y=Zl(()=>{h.current&&(h.current(),h.current=void 0)},100);return f.useEffect(()=>{const w=c.viewport;if(w){const S=()=>{if(y(),!h.current){const E=LP(w,v);h.current=E,v()}};return v(),w.addEventListener("scroll",S),()=>w.removeEventListener("scroll",S)}},[c.viewport,y,v]),x.jsx(te.div,{"data-state":p.hasThumb?"visible":"hidden",...a,ref:m,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...s},onPointerDownCapture:H(n.onPointerDownCapture,w=>{const E=w.target.getBoundingClientRect(),R=w.clientX-E.left,C=w.clientY-E.top;p.onThumbPointerDown({x:R,y:C})}),onPointerUp:H(n.onPointerUp,p.onThumbPointerUp)})});MP.displayName=Rl;var dc="ScrollAreaCorner",wg=f.forwardRef((n,i)=>{const o=_t(dc,n.__scopeScrollArea),s=!!(o.scrollbarX&&o.scrollbarY);return o.type!=="scroll"&&s?x.jsx(DP,{...n,ref:i}):null});wg.displayName=dc;var DP=f.forwardRef((n,i)=>{const{__scopeScrollArea:o,...s}=n,a=_t(dc,o),[c,p]=f.useState(0),[v,m]=f.useState(0),h=!!(c&&v);return Fr(a.scrollbarX,()=>{var w;const y=((w=a.scrollbarX)==null?void 0:w.offsetHeight)||0;a.onCornerHeightChange(y),m(y)}),Fr(a.scrollbarY,()=>{var w;const y=((w=a.scrollbarY)==null?void 0:w.offsetWidth)||0;a.onCornerWidthChange(y),p(y)}),h?x.jsx(te.div,{...s,ref:i,style:{width:c,height:v,position:"absolute",right:a.dir==="ltr"?0:void 0,left:a.dir==="rtl"?0:void 0,bottom:0,...n.style}}):null});function Tl(n){return n?parseInt(n,10):0}function xg(n,i){const o=n/i;return isNaN(o)?0:o}function Ql(n){const i=xg(n.viewport,n.content),o=n.scrollbar.paddingStart+n.scrollbar.paddingEnd,s=(n.scrollbar.size-o)*i;return Math.max(s,18)}function OP(n,i,o,s="ltr"){const a=Ql(o),c=a/2,p=i||c,v=a-p,m=o.scrollbar.paddingStart+p,h=o.scrollbar.size-o.scrollbar.paddingEnd-v,y=o.content-o.viewport,w=s==="ltr"?[0,y]:[y*-1,0];return Sg([m,h],w)(n)}function Vp(n,i,o="ltr"){const s=Ql(i),a=i.scrollbar.paddingStart+i.scrollbar.paddingEnd,c=i.scrollbar.size-a,p=i.content-i.viewport,v=c-s,m=o==="ltr"?[0,p]:[p*-1,0],h=hu(n,m);return Sg([0,p],[0,v])(h)}function Sg(n,i){return o=>{if(n[0]===n[1]||i[0]===i[1])return i[0];const s=(i[1]-i[0])/(n[1]-n[0]);return i[0]+s*(o-n[0])}}function Cg(n,i){return n>0&&n<i}var LP=(n,i=()=>{})=>{let o={left:n.scrollLeft,top:n.scrollTop},s=0;return function a(){const c={left:n.scrollLeft,top:n.scrollTop},p=o.left!==c.left,v=o.top!==c.top;(p||v)&&i(),o=c,s=window.requestAnimationFrame(a)}(),()=>window.cancelAnimationFrame(s)};function Zl(n,i){const o=De(n),s=f.useRef(0);return f.useEffect(()=>()=>window.clearTimeout(s.current),[]),f.useCallback(()=>{window.clearTimeout(s.current),s.current=window.setTimeout(o,i)},[o,i])}function Fr(n,i){const o=De(i);Ue(()=>{let s=0;if(n){const a=new ResizeObserver(()=>{cancelAnimationFrame(s),s=window.requestAnimationFrame(o)});return a.observe(n),()=>{window.cancelAnimationFrame(s),a.unobserve(n)}}},[n,o])}var T1=pg,_1=mg,k1=wg,ru,fc="HoverCard",[Eg,N1]=$e(fc,[Bt]),ql=Bt(),[bP,pc]=Eg(fc),Pg=n=>{const{__scopeHoverCard:i,children:o,open:s,defaultOpen:a,onOpenChange:c,openDelay:p=700,closeDelay:v=300}=n,m=ql(i),h=f.useRef(0),y=f.useRef(0),w=f.useRef(!1),S=f.useRef(!1),[E=!1,R]=dt({prop:s,defaultProp:a,onChange:c}),C=f.useCallback(()=>{clearTimeout(y.current),h.current=window.setTimeout(()=>R(!0),p)},[p,R]),T=f.useCallback(()=>{clearTimeout(h.current),!w.current&&!S.current&&(y.current=window.setTimeout(()=>R(!1),v))},[v,R]),M=f.useCallback(()=>R(!1),[R]);return f.useEffect(()=>()=>{clearTimeout(h.current),clearTimeout(y.current)},[]),x.jsx(bP,{scope:i,open:E,onOpenChange:R,onOpen:C,onClose:T,onDismiss:M,hasSelectionRef:w,isPointerDownOnContentRef:S,children:x.jsx(Uo,{...m,children:o})})};Pg.displayName=fc;var Rg="HoverCardTrigger",Tg=f.forwardRef((n,i)=>{const{__scopeHoverCard:o,...s}=n,a=pc(Rg,o),c=ql(o);return x.jsx(Vr,{asChild:!0,...c,children:x.jsx(te.a,{"data-state":a.open?"open":"closed",...s,ref:i,onPointerEnter:H(n.onPointerEnter,kl(a.onOpen)),onPointerLeave:H(n.onPointerLeave,kl(a.onClose)),onFocus:H(n.onFocus,a.onOpen),onBlur:H(n.onBlur,a.onClose),onTouchStart:H(n.onTouchStart,p=>p.preventDefault())})})});Tg.displayName=Rg;var jP="HoverCardPortal",[A1,FP]=Eg(jP,{forceMount:void 0}),_l="HoverCardContent",_g=f.forwardRef((n,i)=>{const o=FP(_l,n.__scopeHoverCard),{forceMount:s=o.forceMount,...a}=n,c=pc(_l,n.__scopeHoverCard);return x.jsx(ze,{present:s||c.open,children:x.jsx($P,{"data-state":c.open?"open":"closed",...a,onPointerEnter:H(n.onPointerEnter,kl(c.onOpen)),onPointerLeave:H(n.onPointerLeave,kl(c.onClose)),ref:i})})});_g.displayName=_l;var $P=f.forwardRef((n,i)=>{const{__scopeHoverCard:o,onEscapeKeyDown:s,onPointerDownOutside:a,onFocusOutside:c,onInteractOutside:p,...v}=n,m=pc(_l,o),h=ql(o),y=f.useRef(null),w=we(i,y),[S,E]=f.useState(!1);return f.useEffect(()=>{if(S){const R=document.body;return ru=R.style.userSelect||R.style.webkitUserSelect,R.style.userSelect="none",R.style.webkitUserSelect="none",()=>{R.style.userSelect=ru,R.style.webkitUserSelect=ru}}},[S]),f.useEffect(()=>{if(y.current){const R=()=>{E(!1),m.isPointerDownOnContentRef.current=!1,setTimeout(()=>{var T;((T=document.getSelection())==null?void 0:T.toString())!==""&&(m.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",R),()=>{document.removeEventListener("pointerup",R),m.hasSelectionRef.current=!1,m.isPointerDownOnContentRef.current=!1}}},[m.isPointerDownOnContentRef,m.hasSelectionRef]),f.useEffect(()=>{y.current&&UP(y.current).forEach(C=>C.setAttribute("tabindex","-1"))}),x.jsx(bn,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:p,onEscapeKeyDown:s,onPointerDownOutside:a,onFocusOutside:H(c,R=>{R.preventDefault()}),onDismiss:m.onDismiss,children:x.jsx(Vo,{...h,...v,onPointerDown:H(v.onPointerDown,R=>{R.currentTarget.contains(R.target)&&E(!0),m.hasSelectionRef.current=!1,m.isPointerDownOnContentRef.current=!0}),ref:w,style:{...v.style,userSelect:S?"text":void 0,WebkitUserSelect:S?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})})}),zP="HoverCardArrow",HP=f.forwardRef((n,i)=>{const{__scopeHoverCard:o,...s}=n,a=ql(o);return x.jsx(Bo,{...a,...s,ref:i})});HP.displayName=zP;function kl(n){return i=>i.pointerType==="touch"?void 0:n()}function UP(n){const i=[],o=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;o.nextNode();)i.push(o.currentNode);return i}var M1=Pg,I1=Tg,D1=_g,vc="Radio",[VP,kg]=$e(vc),[BP,WP]=VP(vc),Ng=f.forwardRef((n,i)=>{const{__scopeRadio:o,name:s,checked:a=!1,required:c,disabled:p,value:v="on",onCheck:m,form:h,...y}=n,[w,S]=f.useState(null),E=we(i,T=>S(T)),R=f.useRef(!1),C=w?h||!!w.closest("form"):!0;return x.jsxs(BP,{scope:o,checked:a,disabled:p,children:[x.jsx(te.button,{type:"button",role:"radio","aria-checked":a,"data-state":Ig(a),"data-disabled":p?"":void 0,disabled:p,value:v,...y,ref:E,onClick:H(n.onClick,T=>{a||m==null||m(),C&&(R.current=T.isPropagationStopped(),R.current||T.stopPropagation())})}),C&&x.jsx(KP,{control:w,bubbles:!R.current,name:s,value:v,checked:a,required:c,disabled:p,form:h,style:{transform:"translateX(-100%)"}})]})});Ng.displayName=vc;var Ag="RadioIndicator",Mg=f.forwardRef((n,i)=>{const{__scopeRadio:o,forceMount:s,...a}=n,c=WP(Ag,o);return x.jsx(ze,{present:s||c.checked,children:x.jsx(te.span,{"data-state":Ig(c.checked),"data-disabled":c.disabled?"":void 0,...a,ref:i})})});Mg.displayName=Ag;var KP=n=>{const{control:i,checked:o,bubbles:s=!0,...a}=n,c=f.useRef(null),p=Bl(o),v=Ol(i);return f.useEffect(()=>{const m=c.current,h=window.HTMLInputElement.prototype,w=Object.getOwnPropertyDescriptor(h,"checked").set;if(p!==o&&w){const S=new Event("click",{bubbles:s});w.call(m,o),m.dispatchEvent(S)}},[p,o,s]),x.jsx("input",{type:"radio","aria-hidden":!0,defaultChecked:o,...a,tabIndex:-1,ref:c,style:{...n.style,...v,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})};function Ig(n){return n?"checked":"unchecked"}var GP=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],mc="RadioGroup",[YP,O1]=$e(mc,[Wr,kg]),Dg=Wr(),Og=kg(),[XP,QP]=YP(mc),Lg=f.forwardRef((n,i)=>{const{__scopeRadioGroup:o,name:s,defaultValue:a,value:c,required:p=!1,disabled:v=!1,orientation:m,dir:h,loop:y=!0,onValueChange:w,...S}=n,E=Dg(o),R=zr(h),[C,T]=dt({prop:c,defaultProp:a,onChange:w});return x.jsx(XP,{scope:o,name:s,required:p,disabled:v,value:C,onValueChange:T,children:x.jsx(Ou,{asChild:!0,...E,orientation:m,dir:R,loop:y,children:x.jsx(te.div,{role:"radiogroup","aria-required":p,"aria-orientation":m,"data-disabled":v?"":void 0,dir:R,...S,ref:i})})})});Lg.displayName=mc;var bg="RadioGroupItem",jg=f.forwardRef((n,i)=>{const{__scopeRadioGroup:o,disabled:s,...a}=n,c=QP(bg,o),p=c.disabled||s,v=Dg(o),m=Og(o),h=f.useRef(null),y=we(i,h),w=c.value===a.value,S=f.useRef(!1);return f.useEffect(()=>{const E=C=>{GP.includes(C.key)&&(S.current=!0)},R=()=>S.current=!1;return document.addEventListener("keydown",E),document.addEventListener("keyup",R),()=>{document.removeEventListener("keydown",E),document.removeEventListener("keyup",R)}},[]),x.jsx(Lu,{asChild:!0,...v,focusable:!p,active:w,children:x.jsx(Ng,{disabled:p,required:c.required,checked:w,...m,...a,name:c.name,ref:y,onCheck:()=>c.onValueChange(a.value),onKeyDown:H(E=>{E.key==="Enter"&&E.preventDefault()}),onFocus:H(a.onFocus,()=>{var E;S.current&&((E=h.current)==null||E.click())})})})});jg.displayName=bg;var ZP="RadioGroupIndicator",Fg=f.forwardRef((n,i)=>{const{__scopeRadioGroup:o,...s}=n,a=Og(o);return x.jsx(Mg,{...a,...s,ref:i})});Fg.displayName=ZP;var L1=Lg,b1=jg,j1=Fg,hc="Popover",[$g,F1]=$e(hc,[Bt]),Qo=Bt(),[qP,$n]=$g(hc),zg=n=>{const{__scopePopover:i,children:o,open:s,defaultOpen:a,onOpenChange:c,modal:p=!1}=n,v=Qo(i),m=f.useRef(null),[h,y]=f.useState(!1),[w=!1,S]=dt({prop:s,defaultProp:a,onChange:c});return x.jsx(Uo,{...v,children:x.jsx(qP,{scope:i,contentId:gt(),triggerRef:m,open:w,onOpenChange:S,onOpenToggle:f.useCallback(()=>S(E=>!E),[S]),hasCustomAnchor:h,onCustomAnchorAdd:f.useCallback(()=>y(!0),[]),onCustomAnchorRemove:f.useCallback(()=>y(!1),[]),modal:p,children:o})})};zg.displayName=hc;var Hg="PopoverAnchor",JP=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=$n(Hg,o),c=Qo(o),{onCustomAnchorAdd:p,onCustomAnchorRemove:v}=a;return f.useEffect(()=>(p(),()=>v()),[p,v]),x.jsx(Vr,{...c,...s,ref:i})});JP.displayName=Hg;var Ug="PopoverTrigger",Vg=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=$n(Ug,o),c=Qo(o),p=we(i,a.triggerRef),v=x.jsx(te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":Yg(a.open),...s,ref:p,onClick:H(n.onClick,a.onOpenToggle)});return a.hasCustomAnchor?v:x.jsx(Vr,{asChild:!0,...c,children:v})});Vg.displayName=Ug;var gc="PopoverPortal",[eR,tR]=$g(gc,{forceMount:void 0}),Bg=n=>{const{__scopePopover:i,forceMount:o,children:s,container:a}=n,c=$n(gc,i);return x.jsx(eR,{scope:i,forceMount:o,children:x.jsx(ze,{present:o||c.open,children:x.jsx(Br,{asChild:!0,container:a,children:s})})})};Bg.displayName=gc;var $r="PopoverContent",Wg=f.forwardRef((n,i)=>{const o=tR($r,n.__scopePopover),{forceMount:s=o.forceMount,...a}=n,c=$n($r,n.__scopePopover);return x.jsx(ze,{present:s||c.open,children:c.modal?x.jsx(nR,{...a,ref:i}):x.jsx(rR,{...a,ref:i})})});Wg.displayName=$r;var nR=f.forwardRef((n,i)=>{const o=$n($r,n.__scopePopover),s=f.useRef(null),a=we(i,s),c=f.useRef(!1);return f.useEffect(()=>{const p=s.current;if(p)return bl(p)},[]),x.jsx(Wo,{as:In,allowPinchZoom:!0,children:x.jsx(Kg,{...n,ref:a,trapFocus:o.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:H(n.onCloseAutoFocus,p=>{var v;p.preventDefault(),c.current||(v=o.triggerRef.current)==null||v.focus()}),onPointerDownOutside:H(n.onPointerDownOutside,p=>{const v=p.detail.originalEvent,m=v.button===0&&v.ctrlKey===!0,h=v.button===2||m;c.current=h},{checkForDefaultPrevented:!1}),onFocusOutside:H(n.onFocusOutside,p=>p.preventDefault(),{checkForDefaultPrevented:!1})})})}),rR=f.forwardRef((n,i)=>{const o=$n($r,n.__scopePopover),s=f.useRef(!1),a=f.useRef(!1);return x.jsx(Kg,{...n,ref:i,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:c=>{var p,v;(p=n.onCloseAutoFocus)==null||p.call(n,c),c.defaultPrevented||(s.current||(v=o.triggerRef.current)==null||v.focus(),c.preventDefault()),s.current=!1,a.current=!1},onInteractOutside:c=>{var m,h;(m=n.onInteractOutside)==null||m.call(n,c),c.defaultPrevented||(s.current=!0,c.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const p=c.target;((h=o.triggerRef.current)==null?void 0:h.contains(p))&&c.preventDefault(),c.detail.originalEvent.type==="focusin"&&a.current&&c.preventDefault()}})}),Kg=f.forwardRef((n,i)=>{const{__scopePopover:o,trapFocus:s,onOpenAutoFocus:a,onCloseAutoFocus:c,disableOutsidePointerEvents:p,onEscapeKeyDown:v,onPointerDownOutside:m,onFocusOutside:h,onInteractOutside:y,...w}=n,S=$n($r,o),E=Qo(o);return Ml(),x.jsx(zo,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:a,onUnmountAutoFocus:c,children:x.jsx(bn,{asChild:!0,disableOutsidePointerEvents:p,onInteractOutside:y,onEscapeKeyDown:v,onPointerDownOutside:m,onFocusOutside:h,onDismiss:()=>S.onOpenChange(!1),children:x.jsx(Vo,{"data-state":Yg(S.open),role:"dialog",id:S.contentId,...E,...w,ref:i,style:{...w.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),Gg="PopoverClose",oR=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=$n(Gg,o);return x.jsx(te.button,{type:"button",...s,ref:i,onClick:H(n.onClick,()=>a.onOpenChange(!1))})});oR.displayName=Gg;var iR="PopoverArrow",lR=f.forwardRef((n,i)=>{const{__scopePopover:o,...s}=n,a=Qo(o);return x.jsx(Bo,{...a,...s,ref:i})});lR.displayName=iR;function Yg(n){return n?"open":"closed"}var $1=zg,z1=Vg,H1=Bg,U1=Wg;export{c1 as $,HR as A,UR as B,VC as C,WC as D,KR as E,fR as F,XR as G,QR as H,dR as I,GR as J,YR as K,wR as L,qR as M,JR as N,UC as O,te as P,n1 as Q,Yw as R,In as S,BC as T,o1 as U,WR as V,i1 as W,l1 as X,s1 as Y,a1 as Z,u1 as _,aR as a,d1 as a0,p1 as a1,v1 as a2,w1 as a3,y1 as a4,x1 as a5,E1 as a6,P1 as a7,T1 as a8,_1 as a9,r1 as aA,M1 as aB,I1 as aC,BR as aD,sR as aE,Wm as aF,Hm as aG,Vm as aH,$m as aI,k1 as aa,RP as ab,MP as ac,D1 as ad,L1 as ae,b1 as af,j1 as ag,H1 as ah,U1 as ai,zC as aj,QC as ak,ZC as al,kR as am,mR as an,hR as ao,jm as ap,bR as aq,jR as ar,FR as as,h1 as at,C1 as au,g1 as av,S1 as aw,$1 as ax,z1 as ay,t1 as az,Cu as b,Nn as c,qw as d,$C as e,HC as f,Wp as g,cR as h,RR as i,x as j,TR as k,gR as l,yR as m,xR as n,Eu as o,SR as p,ER as q,f as r,CR as s,PR as t,gt as u,NR as v,AR as w,MR as x,DR as y,$R as z};
@@ -1,4 +1,4 @@
1
- import{r as g,R as Yr,a as Gr}from"./@radix-C_LirfyT.js";/**
1
+ import{r as g,R as Yr,a as Gr}from"./@radix-B1sy0Lhr.js";/**
2
2
  * @remix-run/router v1.20.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.