@piwitests/server 0.24.0 → 0.25.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 (438) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{DbmGeOus.js → 5nOoVJzL.js} +1 -1
  3. package/.output/public/_nuxt/6DSY_93j.js +1 -0
  4. package/.output/public/_nuxt/7vRR5W2L.js +1 -0
  5. package/.output/public/_nuxt/{DM3bDZC6.js → 9Dtlg-K4.js} +1 -1
  6. package/.output/public/_nuxt/9Yziijlb.js +1 -0
  7. package/.output/public/_nuxt/{BakMHV79.js → B-onBCAB.js} +1 -1
  8. package/.output/public/_nuxt/B2bK5uNR.js +1 -0
  9. package/.output/public/_nuxt/{BkM2KXUo.js → B63B19Iv.js} +2 -2
  10. package/.output/public/_nuxt/{BFxvHlO9.js → B77w1Eib.js} +1 -1
  11. package/.output/public/_nuxt/{Drw8yQg6.js → BC5bqlfM.js} +1 -1
  12. package/.output/public/_nuxt/{CJ1rmnk4.js → BF5JDf9_.js} +1 -1
  13. package/.output/public/_nuxt/BFVrl1ss.js +1 -0
  14. package/.output/public/_nuxt/{CjtjQV60.js → BIHMeNW-.js} +1 -1
  15. package/.output/public/_nuxt/BKqOGcst.js +1 -0
  16. package/.output/public/_nuxt/{Bme1UkOl.js → BLqooxh5.js} +1 -1
  17. package/.output/public/_nuxt/{D0Kop4bS.js → BMfTUMYy.js} +1 -1
  18. package/.output/public/_nuxt/{V9p3z39z.js → BOrnSpTA.js} +1 -1
  19. package/.output/public/_nuxt/{DEvYVl9M.js → BPQNVV4M.js} +1 -1
  20. package/.output/public/_nuxt/{DuOH5jcQ.js → BSKLNgre.js} +1 -1
  21. package/.output/public/_nuxt/BTCWUyBX.js +1 -0
  22. package/.output/public/_nuxt/BUYmGTVP.js +1 -0
  23. package/.output/public/_nuxt/{CgkXEZMo.js → BWddBCom.js} +1 -1
  24. package/.output/public/_nuxt/{B33YjaHr.js → BYQ9lXQb.js} +1 -1
  25. package/.output/public/_nuxt/BYWQ47QQ.js +5 -0
  26. package/.output/public/_nuxt/{BvAfKk6C.js → BYnqoVCE.js} +1 -1
  27. package/.output/public/_nuxt/{-COcylA_.js → BaU2hm4B.js} +1 -1
  28. package/.output/public/_nuxt/{6Z_ZwH8I.js → BbXvpkBp.js} +1 -1
  29. package/.output/public/_nuxt/Bb_925DD.js +1 -0
  30. package/.output/public/_nuxt/BcHU1KNK.js +1 -0
  31. package/.output/public/_nuxt/BdUGUwvE.js +1 -0
  32. package/.output/public/_nuxt/{DPZBpFOX.js → BeQq85yJ.js} +2 -2
  33. package/.output/public/_nuxt/Bg8yOdSf.js +1 -0
  34. package/.output/public/_nuxt/BhzfJaPC.js +1 -0
  35. package/.output/public/_nuxt/{D1vqYZsL.js → Bkb-0yS0.js} +4 -4
  36. package/.output/public/_nuxt/BmweLu9g.js +2 -0
  37. package/.output/public/_nuxt/Boyv6hLW.js +1 -0
  38. package/.output/public/_nuxt/{BtSGUY-7.js → Bq4xEWLF.js} +4 -4
  39. package/.output/public/_nuxt/{CMuzkARi.js → BraJd4EA.js} +1 -1
  40. package/.output/public/_nuxt/BvXrhZ8k.js +1 -0
  41. package/.output/public/_nuxt/{B8H4XydJ.js → Bw4oIhct.js} +1 -1
  42. package/.output/public/_nuxt/BxSrScjV.js +1 -0
  43. package/.output/public/_nuxt/Byqt8JHG.js +1 -0
  44. package/.output/public/_nuxt/{C5TrTuWv.js → BzBaMPgu.js} +3 -3
  45. package/.output/public/_nuxt/{BKrWWV14.js → C1-8_6cB.js} +1 -1
  46. package/.output/public/_nuxt/{CjBktNrC.js → C7SG50jD.js} +1 -1
  47. package/.output/public/_nuxt/{BkxRbXIj.js → C8WgBDU1.js} +1 -1
  48. package/.output/public/_nuxt/C8uZoJVq.js +1 -0
  49. package/.output/public/_nuxt/{Bg93Rnts.js → CBQXv4bU.js} +2 -2
  50. package/.output/public/_nuxt/CDEmotIt.js +1 -0
  51. package/.output/public/_nuxt/CIBOv3Ge.js +2 -0
  52. package/.output/public/_nuxt/CO7j4p5r.js +1 -0
  53. package/.output/public/_nuxt/COMhp7lz.js +1 -0
  54. package/.output/public/_nuxt/{CsV7pmcT.js → CPiLUjjx.js} +1 -1
  55. package/.output/public/_nuxt/{D_y2VS8k.js → CTYlay1H.js} +1 -1
  56. package/.output/public/_nuxt/{VACXezo0.js → CVEk4D8I.js} +1 -1
  57. package/.output/public/_nuxt/{P5uOaRUZ.js → CbuK1HIv.js} +1 -1
  58. package/.output/public/_nuxt/{opyDpgSw.js → CdLqOMvN.js} +1 -1
  59. package/.output/public/_nuxt/CdM2qNYM.js +2 -0
  60. package/.output/public/_nuxt/Ch8sGLqE.js +1 -0
  61. package/.output/public/_nuxt/CkdznmkX.js +1 -0
  62. package/.output/public/_nuxt/{B1LUinhp.js → Cmuwgbf4.js} +1 -1
  63. package/.output/public/_nuxt/{Ce5_Tq63.js → CnRNwiuE.js} +1 -1
  64. package/.output/public/_nuxt/{Bp3FRuEm.js → CnsaoeEq.js} +1 -1
  65. package/.output/public/_nuxt/{BUnwEAjq.js → Cp0V2FeW.js} +1 -1
  66. package/.output/public/_nuxt/Cvw4EFTy.js +17 -0
  67. package/.output/public/_nuxt/CwDej2Lz.js +1 -0
  68. package/.output/public/_nuxt/D-wlhH6J.js +1 -0
  69. package/.output/public/_nuxt/D5Mhpp98.js +1 -0
  70. package/.output/public/_nuxt/{CDTeSrLO.js → D8ixf-ZR.js} +5 -5
  71. package/.output/public/_nuxt/{DMWfVJCj.js → DBvdRbTA.js} +2 -2
  72. package/.output/public/_nuxt/DDho3MJD.js +1 -0
  73. package/.output/public/_nuxt/DEGHW4pO.js +1 -0
  74. package/.output/public/_nuxt/{BoNKdx5o.js → DHSYRMJp.js} +1 -1
  75. package/.output/public/_nuxt/DH_LEqhd.js +2 -0
  76. package/.output/public/_nuxt/{BVLqydCr.js → DIqik40e.js} +1 -1
  77. package/.output/public/_nuxt/DLwuL-qR.js +1 -0
  78. package/.output/public/_nuxt/{CIpF9l75.js → DPDFGVb_.js} +2 -2
  79. package/.output/public/_nuxt/DRNHuVn4.js +2 -0
  80. package/.output/public/_nuxt/{DcR0Mmdl.js → DUtYU4Sb.js} +1 -1
  81. package/.output/public/_nuxt/{opwuUqHG.js → DWl73MJR.js} +1 -1
  82. package/.output/public/_nuxt/{BCGljaM0.js → DWz_bHNP.js} +1 -1
  83. package/.output/public/_nuxt/{DGq4A2Pd.js → D_SCB-z2.js} +1 -1
  84. package/.output/public/_nuxt/{DMAiMrNr.js → D_j436ND.js} +1 -1
  85. package/.output/public/_nuxt/DamzjN7l.js +1 -0
  86. package/.output/public/_nuxt/Db5xe__T.js +1 -0
  87. package/.output/public/_nuxt/{CpcrljrH.js → DcUBmKKE.js} +1 -1
  88. package/.output/public/_nuxt/DiP18sFE.js +1 -0
  89. package/.output/public/_nuxt/Die1200X.js +1 -0
  90. package/.output/public/_nuxt/{BN1zZw5b.js → DihSeDlY.js} +4 -4
  91. package/.output/public/_nuxt/{DzZpIs4W.js → DkGXOZRW.js} +1 -1
  92. package/.output/public/_nuxt/{C7fq_rHE.js → DnOtRv65.js} +1 -1
  93. package/.output/public/_nuxt/DnV-BkUA.js +1 -0
  94. package/.output/public/_nuxt/DpeRrg68.js +1 -0
  95. package/.output/public/_nuxt/Dq6_-84R.js +1 -0
  96. package/.output/public/_nuxt/DqKFKS1b.js +1 -0
  97. package/.output/public/_nuxt/DrbO0dl5.js +6 -0
  98. package/.output/public/_nuxt/{Qo6oszaF.js → Ds8_6Fzl.js} +1 -1
  99. package/.output/public/_nuxt/{BtbpLWDs.js → DvewDI9t.js} +1 -1
  100. package/.output/public/_nuxt/E26Y1NWH.js +1 -0
  101. package/.output/public/_nuxt/Hp-_W7z4.js +1 -0
  102. package/.output/public/_nuxt/OanUGF_v.js +1 -0
  103. package/.output/public/_nuxt/{CX_G-FHC.js → RSS6R9Te.js} +13 -13
  104. package/.output/public/_nuxt/{BmzxRbcg.js → VqLetC2g.js} +1 -1
  105. package/.output/public/_nuxt/WCZdf9Ln.js +1 -0
  106. package/.output/public/_nuxt/{DF6Mes5z.js → Yl6iqHwK.js} +4 -4
  107. package/.output/public/_nuxt/builds/latest.json +1 -1
  108. package/.output/public/_nuxt/builds/meta/03f2d81b-8c58-4ea8-9a9d-7553c8ca4af6.json +1 -0
  109. package/.output/public/_nuxt/{entry.DzPSf_u5.css → entry.DVKh2Fd6.css} +1 -1
  110. package/.output/public/_nuxt/iUf7K_JR.js +1 -0
  111. package/.output/public/_nuxt/{C8Paf_V1.js → kDEwM7SQ.js} +1 -1
  112. package/.output/public/_nuxt/{Bd8B-yeR.js → knaDbxMJ.js} +1 -1
  113. package/.output/public/_nuxt/lnpLc047.js +1 -0
  114. package/.output/public/_nuxt/{CD8ZzAFC.js → mhvG7mu8.js} +1 -1
  115. package/.output/public/_nuxt/{BgABj4Ty.js → qUaN2ZW8.js} +4 -4
  116. package/.output/public/_nuxt/qeqzb80l.js +1 -0
  117. package/.output/public/_nuxt/{Fsw2W4TA.js → uj92NYTx.js} +2 -2
  118. package/.output/public/_nuxt/vOZZ2cLi.js +1 -0
  119. package/.output/public/_nuxt/{CGHV0Y2d.js → zAFiz2Mg.js} +1 -1
  120. package/.output/public/demo/seed.version.json +2 -2
  121. package/.output/server/chunks/build/{Alert-He-UxEt6.mjs → Alert-BhTWQzM5.mjs} +2 -2
  122. package/.output/server/chunks/build/Alert-BhTWQzM5.mjs.map +1 -0
  123. package/.output/server/chunks/build/{Breadcrumb-DEP2dVCZ.mjs → Breadcrumb-BJnPB2AW.mjs} +3 -3
  124. package/.output/server/chunks/build/Breadcrumb-BJnPB2AW.mjs.map +1 -0
  125. package/.output/server/chunks/build/{BreadcrumbNav-y6nMDYcR.mjs → BreadcrumbNav-C6Cun6tF.mjs} +3 -3
  126. package/.output/server/chunks/build/BreadcrumbNav-C6Cun6tF.mjs.map +1 -0
  127. package/.output/server/chunks/build/{BrowserBadge-DIASU8Gf.mjs → BrowserBadge-T1KRMIXA.mjs} +4 -4
  128. package/.output/server/chunks/build/BrowserBadge-T1KRMIXA.mjs.map +1 -0
  129. package/.output/server/chunks/build/{ChartCard-ZTsCvItQ.mjs → ChartCard-D_asI_WF.mjs} +2 -2
  130. package/.output/server/chunks/build/ChartCard-D_asI_WF.mjs.map +1 -0
  131. package/.output/server/chunks/build/{ChartMarkerTooltip-u_1DUHh-.mjs → ChartMarkerTooltip-DscESDg7.mjs} +3 -3
  132. package/.output/server/chunks/build/ChartMarkerTooltip-DscESDg7.mjs.map +1 -0
  133. package/.output/server/chunks/build/{Checkbox-BisdHf8n.mjs → Checkbox-Y9ZiIRkJ.mjs} +6 -6
  134. package/.output/server/chunks/build/Checkbox-Y9ZiIRkJ.mjs.map +1 -0
  135. package/.output/server/chunks/build/{CodeBlock-B8BNtZAe.mjs → CodeBlock-Bnn_ps9O.mjs} +4 -4
  136. package/.output/server/chunks/build/CodeBlock-Bnn_ps9O.mjs.map +1 -0
  137. package/.output/server/chunks/build/{DashboardNavbar-D7-3zBUU.mjs → DashboardNavbar-D37dPEtR.mjs} +3 -3
  138. package/.output/server/chunks/build/DashboardNavbar-D37dPEtR.mjs.map +1 -0
  139. package/.output/server/chunks/build/{DashboardSidebarToggle-C3HdHvlE.mjs → DashboardSidebarToggle-DzwsZHVx.mjs} +2 -2
  140. package/.output/server/chunks/build/DashboardSidebarToggle-DzwsZHVx.mjs.map +1 -0
  141. package/.output/server/chunks/build/{DataLocationCard-CC2-lHiP.mjs → DataLocationCard-CUXgZQEs.mjs} +4 -4
  142. package/.output/server/chunks/build/DataLocationCard-CUXgZQEs.mjs.map +1 -0
  143. package/.output/server/chunks/build/{DesktopRunLocallyButton-iNzrDsEs.mjs → DesktopRunLocallyButton-BCmQklj6.mjs} +15 -76
  144. package/.output/server/chunks/build/DesktopRunLocallyButton-BCmQklj6.mjs.map +1 -0
  145. package/.output/server/chunks/build/{DiagnosisPanel-BVb2LgHu.mjs → DiagnosisPanel-haHS2azn.mjs} +7 -7
  146. package/.output/server/chunks/build/DiagnosisPanel-haHS2azn.mjs.map +1 -0
  147. package/.output/server/chunks/build/{DiagnosisResult-xVgZlfKK.mjs → DiagnosisResult-DqTIOelM.mjs} +10 -10
  148. package/.output/server/chunks/build/DiagnosisResult-DqTIOelM.mjs.map +1 -0
  149. package/.output/server/chunks/build/{DurationValue-UX9uajQJ.mjs → DurationValue-D6fQEi5S.mjs} +2 -2
  150. package/.output/server/chunks/build/DurationValue-D6fQEi5S.mjs.map +1 -0
  151. package/.output/server/chunks/build/{EmptyState-DC2q_7TD.mjs → EmptyState-C-mCzGhO.mjs} +2 -2
  152. package/.output/server/chunks/build/EmptyState-C-mCzGhO.mjs.map +1 -0
  153. package/.output/server/chunks/build/{EntityLinks-Dzn73fbq.mjs → EntityLinks-CRJQM9Vy.mjs} +3 -3
  154. package/.output/server/chunks/build/EntityLinks-CRJQM9Vy.mjs.map +1 -0
  155. package/.output/server/chunks/build/{EnvManagedBadge-C-agmABK.mjs → EnvManagedBadge-hyelwXrw.mjs} +4 -4
  156. package/.output/server/chunks/build/EnvManagedBadge-hyelwXrw.mjs.map +1 -0
  157. package/.output/server/chunks/build/{ErrorState-CktYyeEZ.mjs → ErrorState-9UPssp7w.mjs} +2 -2
  158. package/.output/server/chunks/build/ErrorState-9UPssp7w.mjs.map +1 -0
  159. package/.output/server/chunks/build/{FeatureUnavailable-DHFkwI7t.mjs → FeatureUnavailable-CDw3__eq.mjs} +3 -3
  160. package/.output/server/chunks/build/FeatureUnavailable-CDw3__eq.mjs.map +1 -0
  161. package/.output/server/chunks/build/{FormField-GYHKiSI6.mjs → FormField-8vSc-3mb.mjs} +2 -2
  162. package/.output/server/chunks/build/FormField-8vSc-3mb.mjs.map +1 -0
  163. package/.output/server/chunks/build/{GetStartedWizard-BpcGYsm2.mjs → GetStartedWizard-Dp_tjhry.mjs} +4 -4
  164. package/.output/server/chunks/build/GetStartedWizard-Dp_tjhry.mjs.map +1 -0
  165. package/.output/server/chunks/build/{HelpHint-plioHKA0.mjs → HelpHint-Bfyo3ar6.mjs} +4 -4
  166. package/.output/server/chunks/build/HelpHint-Bfyo3ar6.mjs.map +1 -0
  167. package/.output/server/chunks/build/{LoadingState-CwpfmI0W.mjs → LoadingState-CxfFwac9.mjs} +2 -2
  168. package/.output/server/chunks/build/LoadingState-CxfFwac9.mjs.map +1 -0
  169. package/.output/server/chunks/build/{MarkerBadge-Biz5--h2.mjs → MarkerBadge-DmubzeuF.mjs} +2 -2
  170. package/.output/server/chunks/build/MarkerBadge-DmubzeuF.mjs.map +1 -0
  171. package/.output/server/chunks/build/{MetaStripGroup-A0a72vt5.mjs → MetaStripGroup-C-cNBfC9.mjs} +6 -6
  172. package/.output/server/chunks/build/MetaStripGroup-C-cNBfC9.mjs.map +1 -0
  173. package/.output/server/chunks/build/{Modal-hKLvVFNp.mjs → Modal-DcNzjvnm.mjs} +2 -2
  174. package/.output/server/chunks/build/Modal-DcNzjvnm.mjs.map +1 -0
  175. package/.output/server/chunks/build/{NavbarActions-_YjrSUat.mjs → NavbarActions-VCHW0u67.mjs} +2 -2
  176. package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +1 -0
  177. package/.output/server/chunks/build/{NavigationMenu-RfBOyS32.mjs → NavigationMenu-DG6V0R9Y.mjs} +4 -4
  178. package/.output/server/chunks/build/NavigationMenu-DG6V0R9Y.mjs.map +1 -0
  179. package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs → OpenInIdeLink-CLj2cTkc.mjs} +5 -5
  180. package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs.map → OpenInIdeLink-CLj2cTkc.mjs.map} +1 -1
  181. package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs → ProjectTestCasesTable-BNd5Fn_G.mjs} +15 -15
  182. package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs.map → ProjectTestCasesTable-BNd5Fn_G.mjs.map} +1 -1
  183. package/.output/server/chunks/build/{RovingFocusItem-BOSx1Z9Z.mjs → RovingFocusItem-DkZadRuK.mjs} +2 -2
  184. package/.output/server/chunks/build/RovingFocusItem-DkZadRuK.mjs.map +1 -0
  185. package/.output/server/chunks/build/{RunReports-nuLb-Nm3.mjs → RunReports-CnyGcU8K.mjs} +3 -3
  186. package/.output/server/chunks/build/RunReports-CnyGcU8K.mjs.map +1 -0
  187. package/.output/server/chunks/build/{RunStatusBadge-CvWmcFYM.mjs → RunStatusBadge-DTqX18X-.mjs} +3 -3
  188. package/.output/server/chunks/build/RunStatusBadge-DTqX18X-.mjs.map +1 -0
  189. package/.output/server/chunks/build/{SectionCard-DHAFvJxm.mjs → SectionCard-taTpPtua.mjs} +3 -3
  190. package/.output/server/chunks/build/SectionCard-taTpPtua.mjs.map +1 -0
  191. package/.output/server/chunks/build/{Select-CEyw7HGK.mjs → Select-BChKOOsc.mjs} +3 -3
  192. package/.output/server/chunks/build/Select-BChKOOsc.mjs.map +1 -0
  193. package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs → SelectMenu-DLkMyBsW.mjs} +4 -4
  194. package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs.map → SelectMenu-DLkMyBsW.mjs.map} +1 -1
  195. package/.output/server/chunks/build/{Separator-lrN70ODV.mjs → Separator-Dn-4PN3P.mjs} +2 -2
  196. package/.output/server/chunks/build/Separator-Dn-4PN3P.mjs.map +1 -0
  197. package/.output/server/chunks/build/{SettingsField-tRmytcEJ.mjs → SettingsField-BLO1C7uY.mjs} +6 -6
  198. package/.output/server/chunks/build/SettingsField-BLO1C7uY.mjs.map +1 -0
  199. package/.output/server/chunks/build/{Slideover-D6cRIqch.mjs → Slideover-BiDJaQrt.mjs} +3 -3
  200. package/.output/server/chunks/build/Slideover-BiDJaQrt.mjs.map +1 -0
  201. package/.output/server/chunks/build/{Switch-R2n82ncQ.mjs → Switch-Ca3fYrSH.mjs} +4 -4
  202. package/.output/server/chunks/build/Switch-Ca3fYrSH.mjs.map +1 -0
  203. package/.output/server/chunks/build/{Table-qZdnm9t2.mjs → Table-DQb34a0A.mjs} +2 -2
  204. package/.output/server/chunks/build/Table-DQb34a0A.mjs.map +1 -0
  205. package/.output/server/chunks/build/{Tabs-BDP7MWl4.mjs → Tabs-_ALhm_oG.mjs} +3 -3
  206. package/.output/server/chunks/build/Tabs-_ALhm_oG.mjs.map +1 -0
  207. package/.output/server/chunks/build/{TestCaseHistoryChart-CKDXQ2GI.mjs → TestCaseHistoryChart-D-TEUsZ8.mjs} +3 -3
  208. package/.output/server/chunks/build/TestCaseHistoryChart-D-TEUsZ8.mjs.map +1 -0
  209. package/.output/server/chunks/build/{TestMetaBadges-BlyKmfeP.mjs → TestMetaBadges-G2dAHnT-.mjs} +2 -2
  210. package/.output/server/chunks/build/TestMetaBadges-G2dAHnT-.mjs.map +1 -0
  211. package/.output/server/chunks/build/{TestStatusBar-CvsmKJ4D.mjs → TestStatusBar-CseETAdn.mjs} +2 -2
  212. package/.output/server/chunks/build/TestStatusBar-CseETAdn.mjs.map +1 -0
  213. package/.output/server/chunks/build/{Textarea-DpmpM-lN.mjs → Textarea-CXOoRq7y.mjs} +2 -2
  214. package/.output/server/chunks/build/Textarea-CXOoRq7y.mjs.map +1 -0
  215. package/.output/server/chunks/build/{Tooltip-BI3WQErw.mjs → Tooltip-trltUr5c.mjs} +2 -2
  216. package/.output/server/chunks/build/Tooltip-trltUr5c.mjs.map +1 -0
  217. package/.output/server/chunks/build/{VisuallyHiddenInput-D4E5aJCQ.mjs → VisuallyHiddenInput-CGURvg3N.mjs} +2 -2
  218. package/.output/server/chunks/build/VisuallyHiddenInput-CGURvg3N.mjs.map +1 -0
  219. package/.output/server/chunks/build/{_id_-w7YCSiiy.mjs → _id_-B-G4eG5U.mjs} +40 -40
  220. package/.output/server/chunks/build/{_id_-w7YCSiiy.mjs.map → _id_-B-G4eG5U.mjs.map} +1 -1
  221. package/.output/server/chunks/build/{_id_-T965GKYC.mjs → _id_-Cnzg8n21.mjs} +41 -38
  222. package/.output/server/chunks/build/_id_-Cnzg8n21.mjs.map +1 -0
  223. package/.output/server/chunks/build/{_id_-wiULjAVc.mjs → _id_-Dp_d6gT7.mjs} +62 -54
  224. package/.output/server/chunks/build/{_id_-wiULjAVc.mjs.map → _id_-Dp_d6gT7.mjs.map} +1 -1
  225. package/.output/server/chunks/build/{_id_-26komi8G.mjs → _id_-t2AWaYuK.mjs} +46 -46
  226. package/.output/server/chunks/build/{_id_-26komi8G.mjs.map → _id_-t2AWaYuK.mjs.map} +1 -1
  227. package/.output/server/chunks/build/{about-B3V_OEiu.mjs → about-BFsHkJwE.mjs} +8 -8
  228. package/.output/server/chunks/build/about-BFsHkJwE.mjs.map +1 -0
  229. package/.output/server/chunks/build/{account-DpBdYE46.mjs → account-CZAq8kVg.mjs} +8 -8
  230. package/.output/server/chunks/build/account-CZAq8kVg.mjs.map +1 -0
  231. package/.output/server/chunks/build/{ai-DYhpzbqp.mjs → ai-BGP3GcCR.mjs} +20 -20
  232. package/.output/server/chunks/build/{ai-DYhpzbqp.mjs.map → ai-BGP3GcCR.mjs.map} +1 -1
  233. package/.output/server/chunks/build/{analytics-CZJEU0an.mjs → analytics-CXl5OWV-.mjs} +25 -25
  234. package/.output/server/chunks/build/{analytics-CZJEU0an.mjs.map → analytics-CXl5OWV-.mjs.map} +1 -1
  235. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  236. package/.output/server/chunks/build/{default-CQa_bmAf.mjs → default-4ixAePum.mjs} +208 -76
  237. package/.output/server/chunks/build/default-4ixAePum.mjs.map +1 -0
  238. package/.output/server/chunks/build/{docs-C8bndVXg.mjs → docs-Cgsd01H9.mjs} +16 -16
  239. package/.output/server/chunks/build/{docs-C8bndVXg.mjs.map → docs-Cgsd01H9.mjs.map} +1 -1
  240. package/.output/server/chunks/build/{edit-BdfF9er2.mjs → edit-BEQ-ozj9.mjs} +436 -40
  241. package/.output/server/chunks/build/edit-BEQ-ozj9.mjs.map +1 -0
  242. package/.output/server/chunks/build/{fetch-tkz5_OA-.mjs → fetch-B5TVXZ1s.mjs} +2 -2
  243. package/.output/server/chunks/build/fetch-B5TVXZ1s.mjs.map +1 -0
  244. package/.output/server/chunks/build/{forgot-password-swZRcvXE.mjs → forgot-password-mqE1mpDI.mjs} +4 -4
  245. package/.output/server/chunks/build/forgot-password-mqE1mpDI.mjs.map +1 -0
  246. package/.output/server/chunks/build/{help-content-C876a9WD.mjs → help-content-Bc99BajS.mjs} +6 -1
  247. package/.output/server/chunks/build/help-content-Bc99BajS.mjs.map +1 -0
  248. package/.output/server/chunks/build/{import-B27Sv7h5.mjs → import-DqDDTcSc.mjs} +14 -14
  249. package/.output/server/chunks/build/import-DqDDTcSc.mjs.map +1 -0
  250. package/.output/server/chunks/build/{index-ID913tUa.mjs → index-Bpdj6TXV.mjs} +5 -5
  251. package/.output/server/chunks/build/index-Bpdj6TXV.mjs.map +1 -0
  252. package/.output/server/chunks/build/{index-Dq6nk6OB.mjs → index-DBFsIsjA.mjs} +180 -188
  253. package/.output/server/chunks/build/{index-Dq6nk6OB.mjs.map → index-DBFsIsjA.mjs.map} +1 -1
  254. package/.output/server/chunks/build/{index-C7m32bRI.mjs → index-DSufXCZq.mjs} +22 -18
  255. package/.output/server/chunks/build/index-DSufXCZq.mjs.map +1 -0
  256. package/.output/server/chunks/build/{index-BdZmxLtC.mjs → index-WXE60AXk.mjs} +24 -24
  257. package/.output/server/chunks/build/{index-BdZmxLtC.mjs.map → index-WXE60AXk.mjs.map} +1 -1
  258. package/.output/server/chunks/build/{index-ByWTzqF6.mjs → index-okKjrRhL.mjs} +15 -4
  259. package/.output/server/chunks/build/index-okKjrRhL.mjs.map +1 -0
  260. package/.output/server/chunks/build/{isValueEqualOrExist-D4lZ8uRY.mjs → isValueEqualOrExist-C-9DzL4K.mjs} +2 -2
  261. package/.output/server/chunks/build/isValueEqualOrExist-C-9DzL4K.mjs.map +1 -0
  262. package/.output/server/chunks/build/{login-hxCF06JT.mjs → login-eQ88UoBW.mjs} +6 -6
  263. package/.output/server/chunks/build/login-eQ88UoBW.mjs.map +1 -0
  264. package/.output/server/chunks/build/{mcp-BVW1llyW.mjs → mcp-frcSP2Zg.mjs} +13 -13
  265. package/.output/server/chunks/build/mcp-frcSP2Zg.mjs.map +1 -0
  266. package/.output/server/chunks/build/{notifications-Dn-evqXM.mjs → notifications-DAtRd5V6.mjs} +14 -14
  267. package/.output/server/chunks/build/notifications-DAtRd5V6.mjs.map +1 -0
  268. package/.output/server/chunks/build/{performance-CV8qm94u.mjs → performance-BcQzGXE7.mjs} +13 -13
  269. package/.output/server/chunks/build/performance-BcQzGXE7.mjs.map +1 -0
  270. package/.output/server/chunks/build/{pr-feedback-gKDz8LyA.mjs → pr-feedback-BHtgvegy.mjs} +11 -11
  271. package/.output/server/chunks/build/pr-feedback-BHtgvegy.mjs.map +1 -0
  272. package/.output/server/chunks/build/{reset-password-DtEISa1I.mjs → reset-password-DMHrp14-.mjs} +4 -4
  273. package/.output/server/chunks/build/reset-password-DMHrp14-.mjs.map +1 -0
  274. package/.output/server/chunks/build/server.mjs +32 -32
  275. package/.output/server/chunks/build/{settings-BJDnuLpc.mjs → settings-Bo5OETop.mjs} +11 -11
  276. package/.output/server/chunks/build/settings-Bo5OETop.mjs.map +1 -0
  277. package/.output/server/chunks/build/{settings-metadata-DnAK4Rzg.mjs → settings-metadata-BHbsWQ2g.mjs} +2 -2
  278. package/.output/server/chunks/build/settings-metadata-BHbsWQ2g.mjs.map +1 -0
  279. package/.output/server/chunks/build/{setup-BO9tXa_G.mjs → setup-DAXcxuNY.mjs} +18 -18
  280. package/.output/server/chunks/build/{setup-BO9tXa_G.mjs.map → setup-DAXcxuNY.mjs.map} +1 -1
  281. package/.output/server/chunks/build/{storage-zN92cA9q.mjs → storage-BPK0fVwx.mjs} +12 -12
  282. package/.output/server/chunks/build/storage-BPK0fVwx.mjs.map +1 -0
  283. package/.output/server/chunks/build/{tags-CJFnoyQc.mjs → tags-CoxErA5m.mjs} +8 -8
  284. package/.output/server/chunks/build/tags-CoxErA5m.mjs.map +1 -0
  285. package/.output/server/chunks/build/{test-cases-0Q6rT73d.mjs → test-cases-D8rn-0le.mjs} +27 -27
  286. package/.output/server/chunks/build/test-cases-D8rn-0le.mjs.map +1 -0
  287. package/.output/server/chunks/build/{test-functions-DVRJgiWo.mjs → test-functions-pWs9mhbJ.mjs} +12 -12
  288. package/.output/server/chunks/build/test-functions-pWs9mhbJ.mjs.map +1 -0
  289. package/.output/server/chunks/build/{useCopyRich-BM9GTjJi.mjs → useCopyRich-BqVfhnoH.mjs} +27 -16
  290. package/.output/server/chunks/build/{useCopyRich-BM9GTjJi.mjs.map → useCopyRich-BqVfhnoH.mjs.map} +1 -1
  291. package/.output/server/chunks/build/{useDesktopDownload-Dyf0fR47.mjs → useDesktopDownload-l80DQJ9e.mjs} +2 -2
  292. package/.output/server/chunks/build/useDesktopDownload-l80DQJ9e.mjs.map +1 -0
  293. package/.output/server/chunks/build/{useDesktopLocalRuns-k7Gw3Fv3.mjs → useDesktopLocalRuns-Dil3YzyU.mjs} +68 -6
  294. package/.output/server/chunks/build/useDesktopLocalRuns-Dil3YzyU.mjs.map +1 -0
  295. package/.output/server/chunks/build/{useDesktopProjectLink-WwLte59P.mjs → useDesktopProjectLink-BnIONB--.mjs} +21 -4
  296. package/.output/server/chunks/build/useDesktopProjectLink-BnIONB--.mjs.map +1 -0
  297. package/.output/server/chunks/build/{useFormControl-8skMOTIf.mjs → useFormControl-CXKztoWk.mjs} +2 -2
  298. package/.output/server/chunks/build/useFormControl-CXKztoWk.mjs.map +1 -0
  299. package/.output/server/chunks/build/{useOpenInIde-D74FmDNg.mjs → useOpenInIde-CbbYW3pd.mjs} +2 -2
  300. package/.output/server/chunks/build/useOpenInIde-CbbYW3pd.mjs.map +1 -0
  301. package/.output/server/chunks/build/{useSettingsNav-BLTHducV.mjs → useSettingsNav-C6NpD4Ab.mjs} +2 -2
  302. package/.output/server/chunks/build/useSettingsNav-C6NpD4Ab.mjs.map +1 -0
  303. package/.output/server/chunks/build/{users-C9bjOBde.mjs → users-C2MuCf5G.mjs} +9 -9
  304. package/.output/server/chunks/build/users-C2MuCf5G.mjs.map +1 -0
  305. package/.output/server/chunks/nitro/nitro.mjs +677 -670
  306. package/.output/server/package.json +1 -1
  307. package/package.json +1 -1
  308. package/.output/public/_nuxt/03FA4-rI.js +0 -1
  309. package/.output/public/_nuxt/5a7jHE9s.js +0 -1
  310. package/.output/public/_nuxt/7ZHq6PCI.js +0 -1
  311. package/.output/public/_nuxt/98sAB6Gu.js +0 -1
  312. package/.output/public/_nuxt/B--J7VNt.js +0 -1
  313. package/.output/public/_nuxt/B69RP95P.js +0 -1
  314. package/.output/public/_nuxt/B8Xm4_S_.js +0 -1
  315. package/.output/public/_nuxt/BBhrClA9.js +0 -1
  316. package/.output/public/_nuxt/BPXqL9vK.js +0 -1
  317. package/.output/public/_nuxt/BWMSVSNM.js +0 -1
  318. package/.output/public/_nuxt/B_r0xHVS.js +0 -1
  319. package/.output/public/_nuxt/BevElZaK.js +0 -1
  320. package/.output/public/_nuxt/BfA6lfg4.js +0 -1
  321. package/.output/public/_nuxt/BjaRappk.js +0 -1
  322. package/.output/public/_nuxt/Bn0jaRxI.js +0 -1
  323. package/.output/public/_nuxt/BrUBOQ0y.js +0 -1
  324. package/.output/public/_nuxt/BwEN1fJ1.js +0 -1
  325. package/.output/public/_nuxt/C-XjxjG5.js +0 -1
  326. package/.output/public/_nuxt/C3W_wyr9.js +0 -1
  327. package/.output/public/_nuxt/C7D5Wl7T.js +0 -1
  328. package/.output/public/_nuxt/COuZu9FO.js +0 -2
  329. package/.output/public/_nuxt/CX5Q0dZ8.js +0 -1
  330. package/.output/public/_nuxt/Cf4MFOuf.js +0 -1
  331. package/.output/public/_nuxt/Cq33x7yV.js +0 -1
  332. package/.output/public/_nuxt/Cu2Q4iPh.js +0 -1
  333. package/.output/public/_nuxt/CyLcEDg2.js +0 -2
  334. package/.output/public/_nuxt/D1Y43xM1.js +0 -2
  335. package/.output/public/_nuxt/D2rZosKf.js +0 -6
  336. package/.output/public/_nuxt/D7jpwkRG.js +0 -5
  337. package/.output/public/_nuxt/D8NAb7VE.js +0 -1
  338. package/.output/public/_nuxt/D8vguZKg.js +0 -17
  339. package/.output/public/_nuxt/DH5H1DJh.js +0 -1
  340. package/.output/public/_nuxt/DL8knjzi.js +0 -1
  341. package/.output/public/_nuxt/DMsm-RGQ.js +0 -1
  342. package/.output/public/_nuxt/DMtrFQqi.js +0 -2
  343. package/.output/public/_nuxt/DVEGfqtt.js +0 -2
  344. package/.output/public/_nuxt/DaNC-xl1.js +0 -1
  345. package/.output/public/_nuxt/DcLbz6DV.js +0 -1
  346. package/.output/public/_nuxt/DhYznn-U.js +0 -1
  347. package/.output/public/_nuxt/DhuRRlmK.js +0 -1
  348. package/.output/public/_nuxt/DuO5wfAC.js +0 -1
  349. package/.output/public/_nuxt/DvEsAuE9.js +0 -1
  350. package/.output/public/_nuxt/Dz6g_QJT.js +0 -1
  351. package/.output/public/_nuxt/DzzNS-K1.js +0 -1
  352. package/.output/public/_nuxt/LwoTUb-r.js +0 -1
  353. package/.output/public/_nuxt/OfPjZaky.js +0 -1
  354. package/.output/public/_nuxt/T5UuMUxA.js +0 -1
  355. package/.output/public/_nuxt/UY8pjaZA.js +0 -1
  356. package/.output/public/_nuxt/YmCeJkZ2.js +0 -1
  357. package/.output/public/_nuxt/builds/meta/70224ee0-4d1f-45d2-b380-2ecb18064bf1.json +0 -1
  358. package/.output/public/_nuxt/fXUwH_3d.js +0 -1
  359. package/.output/public/_nuxt/sVV8xB9f.js +0 -1
  360. package/.output/public/_nuxt/xa5UHCot.js +0 -1
  361. package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +0 -1
  362. package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +0 -1
  363. package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +0 -1
  364. package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +0 -1
  365. package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +0 -1
  366. package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +0 -1
  367. package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +0 -1
  368. package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +0 -1
  369. package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +0 -1
  370. package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +0 -1
  371. package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +0 -1
  372. package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +0 -1
  373. package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +0 -1
  374. package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +0 -1
  375. package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +0 -1
  376. package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +0 -1
  377. package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +0 -1
  378. package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +0 -1
  379. package/.output/server/chunks/build/ErrorState-CktYyeEZ.mjs.map +0 -1
  380. package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +0 -1
  381. package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +0 -1
  382. package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +0 -1
  383. package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +0 -1
  384. package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +0 -1
  385. package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +0 -1
  386. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +0 -1
  387. package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +0 -1
  388. package/.output/server/chunks/build/NavbarActions-_YjrSUat.mjs.map +0 -1
  389. package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +0 -1
  390. package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +0 -1
  391. package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +0 -1
  392. package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +0 -1
  393. package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +0 -1
  394. package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +0 -1
  395. package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +0 -1
  396. package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +0 -1
  397. package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +0 -1
  398. package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +0 -1
  399. package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +0 -1
  400. package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +0 -1
  401. package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.mjs.map +0 -1
  402. package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +0 -1
  403. package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +0 -1
  404. package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +0 -1
  405. package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +0 -1
  406. package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +0 -1
  407. package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +0 -1
  408. package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +0 -1
  409. package/.output/server/chunks/build/account-DpBdYE46.mjs.map +0 -1
  410. package/.output/server/chunks/build/default-CQa_bmAf.mjs.map +0 -1
  411. package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +0 -1
  412. package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +0 -1
  413. package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +0 -1
  414. package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +0 -1
  415. package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +0 -1
  416. package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +0 -1
  417. package/.output/server/chunks/build/index-C7m32bRI.mjs.map +0 -1
  418. package/.output/server/chunks/build/index-ID913tUa.mjs.map +0 -1
  419. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +0 -1
  420. package/.output/server/chunks/build/login-hxCF06JT.mjs.map +0 -1
  421. package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +0 -1
  422. package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +0 -1
  423. package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +0 -1
  424. package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +0 -1
  425. package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +0 -1
  426. package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +0 -1
  427. package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +0 -1
  428. package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +0 -1
  429. package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +0 -1
  430. package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +0 -1
  431. package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +0 -1
  432. package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +0 -1
  433. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +0 -1
  434. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +0 -1
  435. package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +0 -1
  436. package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +0 -1
  437. package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +0 -1
  438. package/.output/server/chunks/build/users-C9bjOBde.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piwitests/dashboard-prod",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piwitests/server",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "description": "Self-hosted dashboard that keeps and explains your Playwright test results — run with npx @piwitests/server",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- import{aw as o}from"./C5TrTuWv.js";function n(){const e=o()?.vnode?.scopeId;return e?{[e]:""}:{}}export{n as u};
@@ -1 +0,0 @@
1
- import{_ as N}from"./CJ1rmnk4.js";import{_ as P}from"./BakMHV79.js";import{_ as L}from"./DMAiMrNr.js";import{d as R,b as F,B as H,ak as U,k as e,f as v,g as i,v as k,r as h,o as a,i as _,c as f,j as s,m as l,t as S,_ as q,z as O,F as Q,aM as Y,h as z,x as j,an as J,p as E,w as K,A as W}from"./C5TrTuWv.js";import{e as A,f as X}from"./DMtrFQqi.js";import{_ as Z}from"./BBhrClA9.js";import{a as ee}from"./B69RP95P.js";import{u as te}from"./fXUwH_3d.js";import{u as ne}from"./T5UuMUxA.js";import"./C8Paf_V1.js";import"./BjaRappk.js";const se={class:"space-y-3"},oe={key:0,class:"flex items-center justify-between gap-3"},ae={key:1,class:"text-sm text-muted"},ie={key:2,class:"flex items-center justify-between gap-3"},le={class:"text-sm flex items-center gap-2"},re={class:"flex items-start justify-between gap-3"},ce={class:"space-y-1 min-w-0"},ue={class:"text-sm font-medium"},de={key:0,class:"text-xs text-muted whitespace-pre-wrap line-clamp-6"},pe={key:1,class:"text-xs text-muted"},me=R({__name:"DesktopUpdateCard",props:{currentVersion:{}},setup(T){const p=F(),b=h(!1),r=h(!1),u=h(!1),x=h(!1),c=h(null),d=h(null);let m=null;H(()=>{b.value=!!U()}),J(()=>{m?.()});async function g(){const n=U();if(!(!n||r.value)){r.value=!0;try{c.value=await n.invoke("desktop_check_update")}catch(t){p.add({title:"Update check failed",description:A(t),color:"error"})}finally{r.value=!1}}}async function V(){const n=U(),t=Y();if(!(!n||u.value)){u.value=!0,d.value={downloaded:0,total:null};try{t&&!m&&(m=await t.listen("piwi:update-progress",({payload:o})=>{d.value=o})),await n.invoke("desktop_install_update"),x.value=!0}catch(o){p.add({title:"Update failed",description:A(o),color:"error"}),d.value=null}finally{u.value=!1}}}async function y(){const n=U();if(n)try{await n.invoke("desktop_restart_app")}catch{}}const w=z(()=>{const n=d.value;return n?.total?Math.min(100,Math.round(n.downloaded/n.total*100)):null});return(n,t)=>{const o=q,D=j,C=E,$=O,B=L;return e(b)?(a(),v(B,{key:0,icon:"i-lucide-arrow-up-circle",title:"Updates"},{subtitle:i(()=>[l(" Updates install from GitHub releases and apply on restart"+S(T.currentVersion?` — you are on v${T.currentVersion}`:"")+". ",1)]),default:i(()=>[_("div",se,[e(c)?e(c).state==="unsupported"?(a(),f("p",ae,[t[3]||(t[3]=l(" This build has no update channel — dev builds and releases made without the update signing key cannot self-update. Grab new versions from the ",-1)),s(D,{to:"https://github.com/piwitests/platform/releases/latest",target:"_blank",rel:"noopener noreferrer",class:"text-primary hover:underline"},{default:i(()=>[...t[2]||(t[2]=[l("latest release",-1)])]),_:1}),t[4]||(t[4]=l(". ",-1))])):e(c).state==="uptodate"?(a(),f("div",ie,[_("p",le,[s(C,{name:"i-lucide-check-circle",class:"size-4 text-success"}),t[5]||(t[5]=l(" You're on the latest version. ",-1))]),s(o,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-refresh-cw",loading:e(r),onClick:g},{default:i(()=>[...t[6]||(t[6]=[l(" Check again ",-1)])]),_:1},8,["loading"])])):(a(),f(Q,{key:3},[_("div",re,[_("div",ce,[_("p",ue,"Version "+S(e(c).version)+" is available",1),e(c).notes?(a(),f("p",de,S(e(c).notes),1)):k("",!0)]),e(x)?(a(),v(o,{key:1,size:"xs",color:"success",icon:"i-lucide-rotate-cw",class:"shrink-0",onClick:y},{default:i(()=>[...t[7]||(t[7]=[l(" Restart now ",-1)])]),_:1})):(a(),v(o,{key:0,size:"xs",icon:"i-lucide-download",loading:e(u),class:"shrink-0",onClick:V},{default:i(()=>[l(S(e(u)?"Installing…":"Install update"),1)]),_:1},8,["loading"]))]),e(u)&&e(w)!==null?(a(),v($,{key:0,"model-value":e(w),size:"sm"},null,8,["model-value"])):k("",!0),e(x)?(a(),f("p",pe," The update is installed — it applies the next time the app starts. ")):k("",!0)],64)):(a(),f("div",oe,[t[1]||(t[1]=_("p",{class:"text-sm text-muted"},"Check GitHub for a newer version of the desktop app.",-1)),s(o,{size:"xs",icon:"i-lucide-refresh-cw",loading:e(r),onClick:g},{default:i(()=>[...t[0]||(t[0]=[l("Check for updates",-1)])]),_:1},8,["loading"])]))])]),_:1})):k("",!0)}}}),_e=Object.assign(me,{__name:"DesktopUpdateCard"}),fe={class:"space-y-6"},ve={class:"flex flex-wrap items-center gap-x-6 gap-y-3 text-sm"},Ve=R({__name:"about",async setup(T){let p,b;const r=W(),u=te(),{data:x}=([p,b]=K(()=>ne("/api/version","$PC3uzh76dT")),p=await p,b(),p),c=r.public.appVersion,d=r.public.buildSha,m=r.public.buildTime,g=r.public.nodeVersion,V=r.public.authEnabled,y=z(()=>d?d.slice(0,7):null),w=z(()=>{const n=x.value?.dbBackend;return n==="postgresql"?"PostgreSQL":n==="sqlite"?"SQLite":n??null});return(n,t)=>{const o=N,D=P,C=L,$=_e,B=Z,G=ee,I=j,M=E;return a(),f("div",fe,[s(C,{icon:"i-lucide-info",title:"Application"},{default:i(()=>[s(D,null,{default:i(()=>[s(o,{label:"Version",value:`v${e(c)}`},null,8,["value"]),e(y)?(a(),v(o,{key:0,label:"Build",value:e(y),hint:e(d)},null,8,["value","hint"])):k("",!0),e(m)?(a(),v(o,{key:1,label:"Built",value:("formatRelativeTime"in n?n.formatRelativeTime:e(X))(e(m)),hint:e(m)},null,8,["value","hint"])):k("",!0),s(o,{label:"Node.js",value:e(g)},null,8,["value"]),s(o,{label:"Database",value:e(w)},null,8,["value"]),s(o,{label:"Authentication",value:e(V)?"Enabled":"Disabled"},null,8,["value"])]),_:1})]),_:1}),s($,{"current-version":e(c)},null,8,["current-version"]),e(u)?(a(),v(B,{key:0,icon:"i-lucide-rocket",color:"neutral",variant:"subtle",title:"Connecting the reporter and AI clients",description:"The URL and access token for this local instance, the data location, and background-service control are on the Setup page.",actions:[{label:"Open Setup",to:"/setup",color:"neutral",variant:"solid",size:"xs"}]})):k("",!0),s(C,{icon:"i-lucide-book-open",title:"Resources"},{default:i(()=>[_("div",ve,[s(G,{to:""},{default:i(()=>[...t[0]||(t[0]=[l("Documentation",-1)])]),_:1}),s(I,{to:"/docs",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:i(()=>[...t[1]||(t[1]=[l(" API reference ",-1)])]),_:1}),s(I,{to:"https://github.com/piwitests/platform",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:i(()=>[t[2]||(t[2]=l(" GitHub ",-1)),s(M,{name:"i-lucide-external-link",class:"w-3.5 h-3.5 shrink-0"})]),_:1})])]),_:1})])}}});export{Ve as default};
@@ -1 +0,0 @@
1
- import{_ as Y}from"./Cu2Q4iPh.js";import{_ as Z}from"./Qo6oszaF.js";import{_ as tt}from"./CyLcEDg2.js";import{_ as et}from"./Drw8yQg6.js";import{_ as st,a as at}from"./opyDpgSw.js";import{_ as ot}from"./D0Kop4bS.js";import{d as rt,u as nt,w,J as it,e as lt,f as u,g as a,h as j,o as r,i,t as l,k as t,v as d,c as _,j as o,s as ct,m,G as ut,_ as dt,F as S,y as D,q as _t,p as mt,r as pt,n as ft}from"./C5TrTuWv.js";import{_ as gt}from"./CJ1rmnk4.js";import{_ as ht}from"./LwoTUb-r.js";import{_ as yt}from"./B69RP95P.js";import{_ as xt}from"./BakMHV79.js";import{_ as bt}from"./DM3bDZC6.js";import{_ as vt}from"./BkxRbXIj.js";import{_ as kt}from"./DuOH5jcQ.js";import{_ as $t}from"./Bg93Rnts.js";import{_ as jt}from"./BFxvHlO9.js";import{_ as Rt}from"./DMAiMrNr.js";import{_ as Ct}from"./BWMSVSNM.js";import{f as Tt,j as wt}from"./DMtrFQqi.js";import{u as I}from"./T5UuMUxA.js";import"./BCGljaM0.js";import"./BBhrClA9.js";import"./Ce5_Tq63.js";import"./DaNC-xl1.js";import"./DH5H1DJh.js";import"./D_y2VS8k.js";import"./C-XjxjG5.js";import"./03FA4-rI.js";import"./DMsm-RGQ.js";import"./B1LUinhp.js";import"./6Z_ZwH8I.js";import"./Bn0jaRxI.js";import"./CX5Q0dZ8.js";import"./BrUBOQ0y.js";import"./BjaRappk.js";import"./DGq4A2Pd.js";import"./BvAfKk6C.js";import"./D7W_4Sqc.js";import"./P5uOaRUZ.js";import"./V9p3z39z.js";import"./C8Paf_V1.js";const St={class:"flex flex-col gap-4 p-4"},Dt={class:"flex items-start gap-4 flex-wrap"},It={class:"flex-1 min-w-0"},zt={class:"text-xl font-bold truncate"},Lt={key:1,class:"flex items-center gap-2 mt-2"},Nt={key:0,class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},Pt={class:"flex items-center gap-1 flex-wrap max-h-[200px] overflow-y-auto py-1"},Ut={key:0,class:"text-sm text-gray-400"},Et={key:1,class:"text-center py-6 text-gray-400"},At={class:"text-xs whitespace-nowrap"},Bt={class:"text-gray-500"},Vt={class:"text-gray-400 ml-1"},Ft={key:1,class:"text-gray-400"},Kt=["title"],Ht={class:"flex justify-end"},Gt={class:"space-y-2"},Mt={class:"flex items-center gap-2 min-w-0"},Ot={class:"text-sm truncate"},qt={key:0,class:"text-xs text-gray-400 shrink-0"},Ae=rt({__name:"[id]",async setup(Jt){let p,y;const h=nt().params.id,{data:s,refresh:z}=([p,y]=w(()=>I(`/api/test-cases/${h}`,"$IiVoRdAdzb")),p=await p,y(),p),{data:f}=([p,y]=w(()=>I(`/api/test-cases/${h}/history`,"$cuQ0G6KeIS")),p=await p,y(),p),R=pt([]);it(()=>s.value?.project?.id,async n=>{if(n)try{R.value=(await $fetch(`/api/projects/${n}/markers`)).markers??[]}catch{}},{immediate:!0});function L(){const n=s.value?.project?.id;n&&ft(`/projects/${n}?tab=timeline`)}lt(j(()=>({title:`${s.value?.title||`Test case #${h}`} — Piwi Dashboard`})));const x=j(()=>{const n=s.value;return!n||!n.totalRuns?null:Math.round((n.passedRuns+n.skippedRuns)/n.totalRuns*100)}),N=j(()=>s.value?.filePath?[{filePath:s.value.filePath,title:s.value.title,line:null}]:[]),P=n=>n==="open"?"error":n==="resolved"?"success":"neutral",U=[{accessorKey:"startTime",header:"Date"},{accessorKey:"status",header:"Status"},{accessorKey:"duration",header:"Duration"},{accessorKey:"retries",header:"Retries"},{accessorKey:"runId",header:"Run"},{accessorKey:"error",header:"Error"},{id:"actions",header:"Actions"}];return(n,c)=>{const E=Y,A=Z,B=tt,V=et,F=at,K=ot,b=ct,v=dt,k=ut,g=gt,C=ht,H=yt,G=xt,M=bt,T=vt,O=kt,q=mt,J=$t,Q=jt,$=Rt,W=Ct,X=st;return r(),u(X,{id:"test-case-evolution"},{header:a(()=>[o(F,null,{leading:a(()=>[o(E),o(A,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...t(s)?.project?.id?[{label:t(s).project.name||"Project",to:`/projects/${t(s).project.id}`}]:[{label:"Project"}],{label:t(s)?.title||`Test case #${t(h)}`}]},null,8,["items"])]),right:a(()=>[o(B,{"project-id":t(s)?.project?.id,"project-label":t(s)?.project?.label??t(s)?.project?.name,cases:t(N),label:"Reproduce locally","preset-options":{mode:"grep",repeatEach:20,trace:!0},class:"mr-2"},null,8,["project-id","project-label","cases"]),o(V,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>t(z)()}]},null,8,["actions"])]),_:1})]),body:a(()=>[i("div",St,[i("div",Dt,[i("div",It,[i("h1",zt,l(t(s)?.title),1),t(s)?.filePath?(r(),u(K,{key:0,"file-path":t(s).filePath,"project-key":t(s)?.project?.id,"project-name":t(s)?.project?.name,class:"text-sm text-gray-500 mt-0.5"},null,8,["file-path","project-key","project-name"])):d("",!0),t(s)?.project?(r(),_("div",Lt,[o(b,{color:"neutral",variant:"soft",size:"xs",class:"font-mono"},{default:a(()=>[m(l(t(s).project.name),1)]),_:1}),t(s)?.flakyRuns>0?(r(),u(b,{key:0,color:"warning",variant:"soft",size:"xs"},{default:a(()=>[m(l(t(s).flakyRuns)+" flaky run"+l(t(s).flakyRuns===1?"":"s"),1)]),_:1})):d("",!0)])):d("",!0)]),t(s)?.lastExecutionId?(r(),u(k,{key:0,to:`/test-run-cases/${t(s).lastExecutionId}`,class:"shrink-0"},{default:a(()=>[o(v,{size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:a(()=>[...c[0]||(c[0]=[m(" Latest execution ",-1)])]),_:1})]),_:1},8,["to"])):d("",!0)]),o(G,null,{default:a(()=>[o(g,{label:"Total runs",value:t(s)?.totalRuns??0},null,8,["value"]),o(g,{label:"Pass rate",value:t(x)!==null?`${t(x)}%`:"—","value-class":(t(x)??0)>=80?"text-green-600":(t(x)??0)>=50?"text-yellow-600":"text-red-600"},null,8,["value","value-class"]),o(g,{label:"Failed",value:t(s)?.failedRuns??0,"value-class":"text-red-600"},null,8,["value"]),o(g,{label:"Avg duration"},{default:a(()=>[o(C,{ms:t(s)?.avgDuration},null,8,["ms"])]),_:1}),o(g,{label:"Flaky",value:t(s)?.flakyRuns??0,"value-class":(t(s)?.flakyRuns??0)>0?"text-purple-600":""},{label:a(()=>[c[1]||(c[1]=m(" Flaky ",-1)),o(H,{topic:"case.flaky-count"})]),_:1},8,["value","value-class"]),o(g,{label:"Last run",size:"sm",value:t(s)?.lastRunAt?("formatRelativeTime"in n?n.formatRelativeTime:t(Tt))(t(s).lastRunAt):"—"},null,8,["value"])]),_:1}),t(f)&&t(f).length>1?(r(),_("div",Nt,[o(T,{title:"Duration trend",icon:"i-lucide-trending-up",help:"case.history-chart"},{default:a(()=>[o(M,{data:t(f),height:200,markers:t(R),onMarkerClick:L},null,8,["data","markers"])]),_:1}),o(T,{title:"Status history",icon:"i-lucide-check-circle",help:"case.sparkline"},{default:a(()=>[i("div",Pt,[(r(!0),_(S,null,D(t(f),(e,Wt)=>(r(),u(O,{key:e.id,text:`Run #${e.runId}: ${e.status} — ${new Date(e.startTime).toLocaleDateString("en-US",{month:"short",day:"numeric"})}`},{default:a(()=>[o(k,{to:`/test-run-cases/${e.id}`,class:_t([{"bg-red-500 hover:bg-red-600":e.status==="failed"||e.status==="timedOut","bg-green-500 hover:bg-green-600":e.status==="passed","bg-yellow-500 hover:bg-yellow-600":e.status==="skipped","bg-gray-400 hover:bg-gray-500":!["passed","failed","skipped","timedOut"].includes(e.status)},"size-3.5 rounded-sm inline-block transition-colors"]),title:`Run #${e.runId}: ${e.status}`},null,8,["to","class","title"])]),_:2},1032,["text"]))),128)),t(f).length===0?(r(),_("span",Ut,"No history yet")):d("",!0)])]),_:1})])):t(f)&&t(f).length<=1?(r(),_("div",Et,[o(q,{name:"i-lucide-trending-up",class:"size-6 mx-auto mb-1"}),c[2]||(c[2]=i("p",{class:"text-sm"},"Need at least 2 runs to show trends.",-1))])):d("",!0),o($,{icon:"i-lucide-list-checks",title:`Recent executions (${t(s)?.recentExecutions?.length??0})`},{default:a(()=>[t(s)?.recentExecutions?.length?(r(),u(J,{key:0,data:t(s).recentExecutions,columns:U,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"startTime-cell":a(({row:e})=>[i("span",At,[i("span",Bt,l(new Date(e.original.startTime).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),i("span",Vt,l(new Date(e.original.startTime).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})),1)])]),"status-cell":a(({row:e})=>[o(b,{color:("getStatusColor"in n?n.getStatusColor:t(wt))(e.original.status),variant:"subtle",class:"capitalize"},{default:a(()=>[m(l(e.original.status),1)]),_:2},1032,["color"])]),"duration-cell":a(({row:e})=>[e.original.duration!==null?(r(),u(C,{key:0,ms:e.original.duration},null,8,["ms"])):(r(),_("span",Ft,"—"))]),"retries-cell":a(({row:e})=>[m(l(e.original.retries&&e.original.retries>0?e.original.retries:""),1)]),"runId-cell":a(({row:e})=>[o(k,{to:`/test-runs/${e.original.runId}`,class:"text-primary hover:underline"},{default:a(()=>[m(l(e.original.runLabel?`${e.original.runLabel} (#${e.original.runId})`:`#${e.original.runId}`),1)]),_:2},1032,["to"])]),"error-cell":a(({row:e})=>[e.original.error?(r(),_("span",{key:0,class:"text-red-600 text-xs truncate max-w-xs block",title:e.original.error},l(e.original.error.length>80?`${e.original.error.substring(0,80)}…`:e.original.error),9,Kt)):d("",!0)]),"actions-header":a(()=>[...c[3]||(c[3]=[i("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":a(({row:e})=>[i("div",Ht,[o(v,{to:`/test-run-cases/${e.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:a(()=>[...c[4]||(c[4]=[m(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data"])):(r(),u(Q,{key:1,icon:"i-lucide-inbox",text:"No executions yet"}))]),_:1},8,["title"]),t(s)?.failureClusters?.length?(r(),u($,{key:2,icon:"i-lucide-bug",title:`Failure clusters (${t(s).failureClusters.length})`,help:"cluster.concept"},{default:a(()=>[i("div",Gt,[(r(!0),_(S,null,D(t(s).failureClusters,e=>(r(),_("div",{key:e.id,class:"flex items-center justify-between py-2 px-2 rounded hover:bg-gray-50 dark:hover:bg-gray-800"},[i("div",Mt,[o(b,{color:P(e.status),variant:"soft",size:"xs",class:"capitalize"},{default:a(()=>[m(l(e.status),1)]),_:2},1032,["color"]),i("span",Ot,l(e.signature),1),e.occurrences>1?(r(),_("span",qt,l(e.occurrences)+" occurrences ",1)):d("",!0)]),o(v,{to:`/failure-clusters/${e.id}`,size:"xs",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:a(()=>[...c[5]||(c[5]=[m(" View ",-1)])]),_:1},8,["to"])]))),128))])]),_:1},8,["title"])):d("",!0),t(s)?.links?.length?(r(),u($,{key:3,icon:"i-lucide-link",title:"Links",help:"shared.entity-links"},{default:a(()=>[o(W,{"entity-type":"test_case","entity-id":Number(t(h)),links:t(s).links??null},null,8,["entity-id","links"])]),_:1})):d("",!0)])]),_:1})}}});export{Ae as default};
@@ -1 +0,0 @@
1
- import{d as m,k as r,o as c,f as _,g,j as b,p as w,R as v,q as x,c as $,h as t}from"./C5TrTuWv.js";import{_ as C}from"./DuOH5jcQ.js";import{C as S,D as k}from"./DMtrFQqi.js";const z={key:1,class:"text-xs text-gray-400 dark:text-gray-500 italic"},B=m({__name:"BrowserBadge",props:{browser:{},size:{}},setup(a){const n=a,s=t(()=>n.browser?.projectName??null),l=t(()=>S(s.value)),p=t(()=>k(s.value)),u=t(()=>n.size==="sm"?"size-3.5":n.size==="lg"?"size-5":"size-4"),i=t(()=>{const e=n.browser;if(!e)return[];const o=[];return e.browserName&&e.browserName!==s.value&&o.push(`Browser: ${e.browserName}`),e.channel&&o.push(`Channel: ${e.channel}`),e.viewport&&o.push(`Viewport: ${e.viewport.width}×${e.viewport.height}`),e.deviceScaleFactor&&e.deviceScaleFactor!==1&&o.push(`Scale: ${e.deviceScaleFactor}x`),e.isMobile&&o.push("Mobile"),e.hasTouch&&!e.isMobile&&o.push("Touch"),e.locale&&o.push(`Locale: ${e.locale}`),e.timezoneId&&o.push(`TZ: ${e.timezoneId}`),e.colorScheme&&e.colorScheme!=="light"&&o.push(`Color: ${e.colorScheme}`),e.reducedMotion&&e.reducedMotion!=="no-preference"&&o.push(`Motion: ${e.reducedMotion}`),e.forcedColors&&e.forcedColors!=="none"&&o.push("Colors: forced"),e.offline&&o.push("Offline"),e.bypassCSP&&o.push("CSP bypassed"),e.javaScriptEnabled===!1&&o.push("JS disabled"),e.serviceWorkers==="block"&&o.push("SW blocked"),e.geolocation&&o.push(`Geo: ${e.geolocation.latitude.toFixed(2)},${e.geolocation.longitude.toFixed(2)}`),e.userAgent&&o.push(`UA: ${e.userAgent.length>60?e.userAgent.slice(0,60)+"…":e.userAgent}`),o}),h=t(()=>s.value?i.value.length?`${s.value} · ${i.value.join(" · ")}`:s.value:"");return(e,o)=>{const f=w,d=C;return r(s)?(c(),_(d,{key:0,text:r(h),popper:{placement:"top"}},{default:g(()=>[b(f,{name:r(l),class:x(["shrink-0 cursor-help",r(u)]),style:v({color:r(p)})},null,8,["name","class","style"])]),_:1},8,["text"])):(c(),$("span",z,"—"))}}}),A=Object.assign(B,{__name:"BrowserBadge"});export{A as _};
@@ -1 +0,0 @@
1
- import{_ as pe}from"./Cu2Q4iPh.js";import{_ as me}from"./Qo6oszaF.js";import{_ as he,a as fe}from"./opyDpgSw.js";import{_ as ye}from"./B1LUinhp.js";import{_ as X}from"./BBhrClA9.js";import{_ as ge}from"./DMAiMrNr.js";import{d as Y,o as v,c as C,i as b,t as I,k as e,j as E,g as S,p as J,q,m as R,s as ve,f as A,v as B,x as _e,F as K,y as Q,h as U,_ as Z,z as be,A as ee,r as F,u as xe,w as we,e as ke,B as $e,C as O}from"./C5TrTuWv.js";import{_ as Te}from"./BFxvHlO9.js";import{f as V}from"./D-c8ZSws.js";import{u as Ce}from"./T5UuMUxA.js";import"./BCGljaM0.js";import"./DMtrFQqi.js";import"./B69RP95P.js";import"./BjaRappk.js";import"./C8Paf_V1.js";const Ie={class:"p-3 sm:p-4 space-y-2"},Be={class:"flex items-start justify-between gap-3"},ze={class:"min-w-0 space-y-1"},Ee={class:"font-medium text-sm break-all"},Ue={class:"text-xs text-gray-500"},Re={class:"flex items-center gap-2 shrink-0"},Ae={key:2,class:"text-xs"},je={key:0,class:"text-xs text-gray-500"},Le={class:"text-default"},Pe={key:1,class:"flex flex-wrap gap-x-4 gap-y-1 text-xs text-gray-500"},Se={key:0},De={key:1},Fe={key:2},Ne={key:3},Me={key:3,class:"text-xs text-gray-500"},Ve={class:"space-y-0.5"},He={class:"text-[11px]"},Oe=Y({__name:"ImportFileRow",props:{entry:{},removable:{type:Boolean}},emits:["remove"],setup(p){const c=p,a={hashing:{label:"Reading",color:"neutral",icon:"i-lucide-loader-circle"},checking:{label:"Checking",color:"neutral",icon:"i-lucide-loader-circle"},ready:{label:"Ready",color:"primary",icon:"i-lucide-circle-check"},uploading:{label:"Importing",color:"primary",icon:"i-lucide-loader-circle"},imported:{label:"Imported",color:"success",icon:"i-lucide-check"},duplicate:{label:"Already imported",color:"neutral",icon:"i-lucide-copy-check"},"too-large":{label:"Too large",color:"warning",icon:"i-lucide-weight"},invalid:{label:"Not importable",color:"warning",icon:"i-lucide-file-x"},failed:{label:"Failed",color:"error",icon:"i-lucide-circle-alert"}},d=U(()=>a[c.entry.state]),m=U(()=>["hashing","checking","uploading"].includes(c.entry.state)),o=U(()=>c.entry.result),t=U(()=>c.entry.state==="imported"?o.value:null),h=U(()=>t.value?.kind==="trace");function n(l,i){return`${l} ${i}${l===1?"":"s"}`}return(l,i)=>{const f=J,y=ve,k=Z,$=be,x=_e,T=X;return v(),C("div",Ie,[b("div",Be,[b("div",ze,[b("p",Ee,I(p.entry.name),1),b("p",Ue,I(("formatBytes"in l?l.formatBytes:e(V))(p.entry.size)),1)]),b("div",Re,[E(y,{color:e(d).color,variant:"subtle",size:"sm"},{default:S(()=>[E(f,{name:e(d).icon,class:q(["size-3.5 mr-1",e(m)&&"animate-spin"])},null,8,["name","class"]),R(" "+I(e(d).label),1)]),_:1},8,["color"]),p.removable?(v(),A(k,{key:0,icon:"i-lucide-x",color:"neutral",variant:"ghost",size:"xs",title:"Remove from the list",onClick:i[0]||(i[0]=s=>l.$emit("remove",p.entry.id))})):B("",!0)])]),p.entry.state==="uploading"||p.entry.state==="hashing"?(v(),A($,{key:0,"model-value":Math.round(p.entry.progress*100),size:"sm"},null,8,["model-value"])):B("",!0),p.entry.message?(v(),C("p",{key:1,class:q(["text-xs",p.entry.state==="failed"?"text-error":"text-gray-500"])},I(p.entry.message),3)):B("",!0),e(o)?.testRunId?(v(),C("div",Ae,[E(x,{to:`/test-runs/${e(o).testRunId}`,class:"text-primary hover:underline"},{default:S(()=>[R(" View run #"+I(e(o).testRunId),1)]),_:1},8,["to"])])):B("",!0),e(t)?(v(),C(K,{key:3},[e(h)?(v(),C("p",je,[i[1]||(i[1]=R(" Added ",-1)),b("span",Le,I(e(t).caseTitle),1),i[2]||(i[2]=R(" to this run. ",-1))])):(v(),C("div",Pe,[b("span",null,I(n(e(t).totalTests,"execution")),1),b("span",null,I(e(t).passedTests)+" passed",1),b("span",null,I(e(t).failedTests)+" failed",1),e(t).skippedTests?(v(),C("span",Se,I(e(t).skippedTests)+" skipped",1)):B("",!0),e(t).flakyTests?(v(),C("span",De,I(e(t).flakyTests)+" flaky",1)):B("",!0),e(t).traceCount?(v(),C("span",Fe,I(n(e(t).traceCount,"trace")),1)):B("",!0),e(t).attachmentCount?(v(),C("span",Ne,I(n(e(t).attachmentCount,"attachment")),1)):B("",!0)])),e(t).shard?(v(),A(T,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-split",description:`This archive is shard ${e(t).shard.current} of ${e(t).shard.total}. Each shard imports as its own run — they are not merged.`,ui:{description:"text-xs"}},null,8,["description"])):B("",!0),e(t).filePaths.length&&!e(h)?(v(),C("div",Me,[i[3]||(i[3]=b("p",{class:"mb-1"},[R(" Spec files recorded as "),b("span",{class:"text-gray-400"},"(these must match the paths your live runs report for history to line up)"),R(": ")],-1)),b("ul",Ve,[(v(!0),C(K,null,Q(e(t).filePaths,s=>(v(),C("li",{key:s},[b("code",He,I(s),1)]))),128))])])):B("",!0)],64)):B("",!0)])}}}),qe=Object.assign(Oe,{__name:"ImportFileRow"}),P=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Ke=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),We=Array.from({length:256},(p,c)=>c.toString(16).padStart(2,"0"));class te{#r=new Uint32Array(Ke);#t=new Uint8Array(64);#e=0;#n=0;#i=new Uint32Array(64);#o=!1;update(c){if(this.#o)throw new Error("Sha256: update() after digest()");this.#n+=c.length;let a=0;if(this.#e>0){const d=Math.min(64-this.#e,c.length);if(this.#t.set(c.subarray(0,d),this.#e),this.#e+=d,a=d,this.#e<64)return this;this.#s(this.#t,0),this.#e=0}for(;a+64<=c.length;a+=64)this.#s(c,a);return a<c.length&&(this.#t.set(c.subarray(a),0),this.#e=c.length-a),this}digest(){if(this.#o)throw new Error("Sha256: digest() called twice");this.#o=!0;const c=this.#n*8;this.#t[this.#e++]=128,this.#e>56&&(this.#t.fill(0,this.#e),this.#s(this.#t,0),this.#e=0),this.#t.fill(0,this.#e,56);const a=new DataView(this.#t.buffer,this.#t.byteOffset,64);a.setUint32(56,Math.floor(c/4294967296),!1),a.setUint32(60,c>>>0,!1),this.#s(this.#t,0);const d=new Uint8Array(32),m=new DataView(d.buffer);for(let o=0;o<8;o++)m.setUint32(o*4,this.#r[o],!1);return d}hex(){const c=this.digest();let a="";for(let d=0;d<32;d++)a+=We[c[d]];return a}#s(c,a){const d=this.#i,m=this.#r;for(let r=0;r<16;r++){const _=a+r*4;d[r]=c[_]<<24|c[_+1]<<16|c[_+2]<<8|c[_+3]}for(let r=16;r<64;r++){const _=d[r-15],z=d[r-2],g=(_>>>7|_<<25)^(_>>>18|_<<14)^_>>>3,D=(z>>>17|z<<15)^(z>>>19|z<<13)^z>>>10;d[r]=d[r-16]+g+d[r-7]+D|0}let o=m[0],t=m[1],h=m[2],n=m[3],l=m[4],i=m[5],f=m[6],y=m[7],k=0,$=0,x=0,T=0,s=0,u=0;for(let r=0;r<64;r+=8)$=(l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7),x=l&i^~l&f,s=y+$+x+P[r]+d[r]|0,k=(o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10),T=o&t^o&h^t&h,u=k+T|0,n=n+s|0,y=s+u|0,$=(n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7),x=n&l^~n&i,s=f+$+x+P[r+1]+d[r+1]|0,k=(y>>>2|y<<30)^(y>>>13|y<<19)^(y>>>22|y<<10),T=y&o^y&t^o&t,u=k+T|0,h=h+s|0,f=s+u|0,$=(h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7),x=h&n^~h&l,s=i+$+x+P[r+2]+d[r+2]|0,k=(f>>>2|f<<30)^(f>>>13|f<<19)^(f>>>22|f<<10),T=f&y^f&o^y&o,u=k+T|0,t=t+s|0,i=s+u|0,$=(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7),x=t&h^~t&n,s=l+$+x+P[r+3]+d[r+3]|0,k=(i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10),T=i&f^i&y^f&y,u=k+T|0,o=o+s|0,l=s+u|0,$=(o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7),x=o&t^~o&h,s=n+$+x+P[r+4]+d[r+4]|0,k=(l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10),T=l&i^l&f^i&f,u=k+T|0,y=y+s|0,n=s+u|0,$=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7),x=y&o^~y&t,s=h+$+x+P[r+5]+d[r+5]|0,k=(n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10),T=n&l^n&i^l&i,u=k+T|0,f=f+s|0,h=s+u|0,$=(f>>>6|f<<26)^(f>>>11|f<<21)^(f>>>25|f<<7),x=f&y^~f&o,s=t+$+x+P[r+6]+d[r+6]|0,k=(h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10),T=h&n^h&l^n&l,u=k+T|0,i=i+s|0,t=s+u|0,$=(i>>>6|i<<26)^(i>>>11|i<<21)^(i>>>25|i<<7),x=i&f^~i&y,s=o+$+x+P[r+7]+d[r+7]|0,k=(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10),T=t&h^t&n^h&n,u=k+T|0,l=l+s|0,o=s+u|0;m[0]=m[0]+o|0,m[1]=m[1]+t|0,m[2]=m[2]+h|0,m[3]=m[3]+n|0,m[4]=m[4]+l|0,m[5]=m[5]+i|0,m[6]=m[6]+f|0,m[7]=m[7]+y|0}}async function Ge(p,c){const a=new te,d=p.stream().getReader();let m=0;for(;;){const{done:o,value:t}=await d.read();if(o)break;a.update(t),m+=t.length,c&&c(p.size?m/p.size:1)}return c&&c(1),a.hex()}const G=["ready","failed"],Xe={ok:"ready",duplicate:"duplicate","too-large":"too-large",invalid:"invalid"};function Ye(p){const c=Je("/api/test-runs/import"),a=F([]),d=F(null),m=F(null),o=F(!1);let t=1;const h=U(()=>a.value.filter(s=>G.includes(s.state)).length),n=U(()=>a.value.filter(s=>s.state==="imported").length),l=U(()=>a.value.some(s=>s.state==="hashing"||s.state==="checking")),i=F({done:0,total:0});async function f(){if(p.value)try{const s=await $fetch("/api/test-runs/import/check",{method:"POST",body:{projectName:p.value,files:[]}});d.value=s.maxBytes,m.value=null}catch(s){m.value=M(s,"Could not reach the server to read its upload limit.")}}async function y(s){const u=s.map(g=>({id:t++,file:g,name:g.name,size:g.size,state:"hashing",progress:0}));a.value=[...a.value,...u];const r=a.value.slice(-u.length),_=[];for(const g of r)d.value!=null&&g.size>d.value?(g.state="too-large",g.message=`${V(g.size)} exceeds the ${V(d.value)} limit.`):g.size===0?(g.state="invalid",g.message="The file is empty."):g.name.toLowerCase().endsWith(".zip")?_.push(g):(g.state="invalid",g.message="Expected a .zip blob report (blob-report/report-*.zip).");if(_.length===0)return;for(const g of _)try{g.progress=0,g.hash=await Ge(g.file,D=>{g.progress=D}),g.state="checking"}catch(D){g.state="failed",g.message=M(D,"Could not read the file.")}finally{g.progress=0}const z=await Qe(_);for(const g of _)g.group=z??void 0;await k(_.filter(g=>g.state==="checking"))}async function k(s){if(!(s.length===0||!p.value))try{const u=await $fetch("/api/test-runs/import/check",{method:"POST",body:{projectName:p.value,files:s.map(r=>({name:r.name,size:r.size,hash:r.hash}))}});d.value=u.maxBytes,u.results.forEach((r,_)=>{const z=s[_];z&&(z.state=Xe[r.status]??"ready",z.message=r.message,r.testRunId&&(z.result={testRunId:r.testRunId}))})}catch(u){const r=M(u,"Pre-flight check failed.");for(const _ of s)_.state="ready",_.message=`${r} Importing will still verify it.`}}async function $(){if(o.value||!p.value)return;o.value=!0;const s=a.value.filter(u=>G.includes(u.state));i.value={done:0,total:s.length};try{for(const u of s){u.state="uploading",u.message=void 0,u.progress=0;try{const r=await Ze(c,p.value,u,u.group??null,_=>{u.progress=_});u.result=r,u.state=r.status==="duplicate"?"duplicate":"imported",u.message=r.status==="duplicate"?"Already imported into this project.":void 0}catch(r){u.state="failed",u.message=M(r,"The import failed.")}finally{u.progress=0,i.value={...i.value,done:i.value.done+1}}}}finally{o.value=!1}}function x(s){a.value=a.value.filter(u=>u.id!==s)}function T(){a.value=a.value.filter(s=>!["imported","duplicate"].includes(s.state))}return{entries:a,maxBytes:d,limitError:m,importing:o,readyCount:h,importedCount:n,busy:l,batch:i,loadLimit:f,addFiles:y,startImport:$,remove:x,clearFinished:T}}function Je(p){return`${(ee().app.baseURL||"/").replace(/\/$/,"")}${p}`}async function Qe(p){const c=p.map(a=>a.hash).filter(a=>!!a);return c.length===0?null:new te().update(new TextEncoder().encode([...c].sort().join(""))).hex()}function Ze(p,c,a,d,m){return new Promise((o,t)=>{const h=new FormData;h.append("projectName",c),d&&h.append("importGroup",d),h.append("archive",a.file,a.name);const n=new XMLHttpRequest;n.open("POST",p),n.responseType="json",n.upload.addEventListener("progress",l=>{l.lengthComputable&&m(l.loaded/l.total)}),n.addEventListener("load",()=>{const l=n.response;if(n.status>=200&&n.status<300){o(l);return}const i=typeof l?.message=="string"?l.message:null;t(new Error(i??et(n.status)))}),n.addEventListener("error",()=>t(new Error("The connection dropped during the upload."))),n.addEventListener("abort",()=>t(new Error("The upload was cancelled."))),n.addEventListener("timeout",()=>t(new Error("The upload timed out."))),n.send(h)})}function et(p){return p===413?"The server (or a proxy in front of it) rejected the archive as too large.":p===401||p===403?"You do not have permission to import into this project.":p===0?"The connection dropped during the upload.":p>=500?`The server failed while importing (HTTP ${p}).`:`The import was rejected (HTTP ${p}).`}function M(p,c){const a=p?.data;return typeof a?.message=="string"&&a.message?a.message:p?.message||c}const tt={class:"p-4 space-y-4"},st={class:"space-y-4"},ot={class:"text-sm text-gray-600 dark:text-gray-400 space-y-2"},rt={class:"flex items-center gap-2"},nt={key:0,class:"text-xs text-gray-500 tabular-nums"},it={class:"space-y-4"},at={key:0,class:"text-xs text-gray-500 mt-3"},lt={key:1,class:"divide-y divide-gray-100 dark:divide-gray-800 border rounded-lg border-gray-200 dark:border-gray-800"},ct={key:2,class:"flex justify-end"},Tt=Y({__name:"import",async setup(p){let c,a;const m=xe().params.id,{data:o}=([c,a]=we(()=>Ce(`/api/projects/${m}`,"$GhVKHsNemL")),c=await c,a(),c);ke(U(()=>({title:`Import runs — ${o.value?.label||o.value?.name||"Project"} — Piwi Dashboard`})));const t=ee().public.demoMode,h=U(()=>o.value?.name),{entries:n,maxBytes:l,limitError:i,importing:f,readyCount:y,importedCount:k,busy:$,batch:x,loadLimit:T,addFiles:s,startImport:u,remove:r,clearFinished:_}=Ye(h);$e(T);const z=F(null),g=F(!1);function D(j){const w=j.target;w.files?.length&&s([...w.files]),w.value=""}function se(j){g.value=!1;const w=[...j.dataTransfer?.files??[]];w.length&&s(w)}const oe=U(()=>n.value.filter(j=>["imported","duplicate"].includes(j.state)).length);return(j,w)=>{const re=pe,ne=me,ie=fe,ae=ye,H=X,W=ge,N=Z,le=J,ce=Te,de=qe,ue=he;return v(),A(ue,{id:"project-import"},{header:S(()=>[E(ie,null,{leading:S(()=>[E(re),E(ne,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(o)?.label||e(o)?.name||"Project",to:`/projects/${e(m)}`},{label:"Import runs"}]},null,8,["items"])]),_:1})]),body:S(()=>[b("div",tt,[E(W,{title:"Import past runs",icon:"i-lucide-import",help:"project.import",subtitle:"Backfill runs recorded before you started using Piwi, from Playwright's own blob reports."},{default:S(()=>[b("div",st,[b("div",ot,[w[5]||(w[5]=b("p",null,[R(" Run your suite with the blob reporter and upload the archives it writes to "),b("code",null,"blob-report/"),R(": ")],-1)),E(ae,{code:"npx playwright test --reporter=blob",language:"bash"}),w[6]||(w[6]=b("p",null," Each archive imports as one completed run, with its traces, screenshots and videos. Importing the same archive twice does nothing, so an interrupted batch is safe to repeat. ",-1))]),e(t)?(v(),A(H,{key:0,color:"primary",variant:"subtle",icon:"i-lucide-monitor-smartphone",title:"Nothing leaves your browser",description:"This is the demo: the archive is read by a service worker and stored in your browser, not uploaded. It is cleared when the demo's sample data is refreshed, or when you reset the demo.",ui:{description:"text-xs"}})):B("",!0),E(H,{color:"neutral",variant:"subtle",icon:"i-lucide-info",title:"What imported runs carry",description:"Failures still cluster, and traces, screenshots and videos open exactly as they do for reported runs. Web vitals, page state and locator healing come from Piwi's own capture fixtures, so historical runs have none — they start once the reporter is in place.",ui:{description:"text-xs"}}),e(i)?(v(),A(H,{key:1,color:"error",variant:"subtle",icon:"i-lucide-circle-alert",description:e(i)},null,8,["description"])):B("",!0)])]),_:1}),E(W,{title:"Archives",icon:"i-lucide-files",count:e(n).length||null},{actions:S(()=>[b("div",rt,[e(f)?(v(),C("span",nt,I(e(x).done)+" of "+I(e(x).total)+" done ",1)):B("",!0),e(oe)>0&&!e(f)?(v(),A(N,{key:1,label:"Clear finished",icon:"i-lucide-eraser",color:"neutral",variant:"ghost",size:"sm",disabled:e(f),onClick:w[0]||(w[0]=L=>e(_)())},null,8,["disabled"])):B("",!0),E(N,{label:e(y)>0?`Import ${e(y)} archive${e(y)===1?"":"s"}`:"Import",icon:"i-lucide-upload",size:"sm",loading:e(f),disabled:e(y)===0||e($),onClick:w[1]||(w[1]=L=>e(u)())},null,8,["label","loading","disabled"])])]),default:S(()=>[b("div",it,[b("div",{class:q(["rounded-lg border-2 border-dashed p-6 text-center transition-colors",e(g)?"border-primary bg-primary/5":"border-gray-200 dark:border-gray-700"]),onDragover:w[3]||(w[3]=O(L=>g.value=!0,["prevent"])),onDragleave:w[4]||(w[4]=O(L=>g.value=!1,["prevent"])),onDrop:O(se,["prevent"])},[E(le,{name:"i-lucide-file-archive",class:"size-7 text-gray-400 mb-2"}),w[7]||(w[7]=b("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[R("Drop "),b("code",null,"report-*.zip"),R(" files here, or")],-1)),E(N,{label:"Choose files",icon:"i-lucide-folder-open",variant:"outline",size:"sm",class:"mt-2",disabled:e(f),onClick:w[2]||(w[2]=L=>e(z)?.click())},null,8,["disabled"]),e(l)?(v(),C("p",at," Up to "+I(("formatBytes"in j?j.formatBytes:e(V))(e(l)))+" per archive. Larger ones are rejected here, before uploading. ",1)):B("",!0),b("input",{ref_key:"fileInput",ref:z,type:"file",accept:".zip",multiple:"",class:"hidden",onChange:D},null,544)],34),e(n).length===0?(v(),A(ce,{key:0,icon:"i-lucide-inbox",text:"No archives selected yet."})):(v(),C("div",lt,[(v(!0),C(K,null,Q(e(n),L=>(v(),A(de,{key:L.id,entry:L,removable:!e(f)&&L.state!=="uploading",onRemove:e(r)},null,8,["entry","removable","onRemove"]))),128))])),e(k)>0?(v(),C("div",ct,[E(N,{label:`Open ${e(o)?.label||e(o)?.name||"project"}`,icon:"i-lucide-arrow-right",trailing:"",variant:"ghost",size:"sm",to:`/projects/${e(m)}`},null,8,["label","to"])])):B("",!0)])]),_:1},8,["count"])])]),_:1})}}});export{Tt as default};
@@ -1 +0,0 @@
1
- import{d as W,o as a,f as m,x,k as e,g as u,V as M,p as v,v as s,h as n,m as y,K as L,l as D,j as C,c as _,t as p,i as E,F as N,y as U,r as k,_ as H}from"./C5TrTuWv.js";import{H as w}from"./BjaRappk.js";import{a as G}from"./T5UuMUxA.js";const B="https://piwitests.github.io";function X(t){return`${B}/${t.replace(/^\//,"")}`}const Y=W({__name:"DocLink",props:{to:{},noIcon:{type:Boolean}},setup(t){const r=t,h=n(()=>X(r.to));return(c,o)=>{const g=v,I=x;return a(),m(I,{to:e(h),target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:u(()=>[M(c.$slots,"default",{},()=>[o[0]||(o[0]=y("Learn more",-1))]),t.noIcon?s("",!0):(a(),m(g,{key:0,name:"i-lucide-external-link",class:"w-3.5 h-3.5 shrink-0"}))]),_:3},8,["to"])}}}),V=Object.assign(Y,{__name:"DocLink"}),P={PIWI_SITE_URL:{description:"Public base URL of the instance (e.g. https://piwi.example.com). Used to build links in emails.",category:"general",type:"url",example:"https://piwi.example.com",notes:"When unset, links in emails point to http://localhost:3000 and OAuth callback URLs are inferred from the request host — set it when running behind a reverse proxy."},PIWI_SECRET_KEY:{description:"Master key for AES-256-GCM encryption of secrets stored in the database (AI API keys, webhook/SCM secrets). Strongly recommended in production.",category:"general",secret:!0,example:"a 64-char random hex string",notes:"Falls back to an insecure built-in development key (with a startup warning in production). Generate one with `node -e \"console.log(require('node:crypto').randomBytes(32).toString('hex'))\"`."},PIWI_BUILD_DIR:{description:"Overrides the Nuxt build output directory. Used by the test harness to isolate parallel builds.",category:"build",runtimeOnly:!0,type:"path"},PIWI_BUILD_SHA:{description:"Commit SHA baked into the build for provenance. Shown on Settings → About. Set as a build-time arg.",category:"build",runtimeOnly:!0},PIWI_DESKTOP_TOKEN:{description:"Per-install access token the desktop (Tauri) app injects to gate its local server. Set automatically by the desktop shell — not user-configurable. Absent on the server build.",category:"desktop",secret:!0,runtimeOnly:!0,since:"0.16.0"},PIWI_DATABASE_PATH:{description:"Path to the SQLite database file (used when PIWI_DATABASE_URL is not set).",category:"database",type:"path",default:".data/piwi.db",relevantWhen:{PIWI_DATABASE_URL:""}},PIWI_DATABASE_URL:{description:"PostgreSQL connection string. When set, PostgreSQL is used instead of SQLite and migrations run automatically on startup.",category:"database",secret:!0,example:"postgres://piwi:piwi@db:5432/piwi",docs:"deployment#docker-compose-with-postgresql"},PIWI_RETENTION_DAYS:{description:"Days of test-run history the nightly retention sweep keeps. Unset or 0 disables automatic run pruning (the default — pruning is opt-in).",category:"database",type:"number",min:0,docs:"storage#data-retention"},PIWI_RETENTION_NOTIFICATION_DAYS:{description:"Days to keep sent/failed notification outbox rows before the nightly sweep prunes them (default 30; 0 keeps them forever).",category:"database",type:"number",default:"30",min:0},PIWI_RETENTION_DIAGNOSIS_VERSIONS:{description:"AI-diagnosis history versions kept per diagnosis by the nightly sweep (default 20; 0 disables capping).",category:"database",type:"number",default:"20",min:0},PIWI_STORAGE_TYPE:{description:'Storage backend for test artifacts (HTML reports, traces, attachments): "local" or "s3".',category:"storage",type:"enum",enum:["local","s3"],default:"local",notes:"Only the exact value `s3` selects S3; any other value falls back to local storage."},PIWI_STORAGE_PATH:{description:'Directory for local file storage (when PIWI_STORAGE_TYPE is "local").',category:"storage",type:"path",default:".data/storage",relevantWhen:{PIWI_STORAGE_TYPE:"local"}},PIWI_S3_BUCKET:{description:'S3 bucket name for artifact storage (when PIWI_STORAGE_TYPE is "s3").',category:"storage",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"},docs:"storage#s3-compatible-storage"},PIWI_S3_REGION:{description:'S3 bucket region (when PIWI_STORAGE_TYPE is "s3").',category:"storage",example:"us-east-1",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_ACCESS_KEY_ID:{description:"S3 access key id with write access to the bucket.",category:"storage",secret:!0,relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_SECRET_ACCESS_KEY:{description:"S3 secret access key.",category:"storage",secret:!0,relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_ENDPOINT:{description:"Custom endpoint for S3-compatible services (MinIO, R2, Spaces).",category:"storage",type:"url",example:"https://minio.example.com",relevantWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_FORCE_PATH_STYLE:{description:"Use path-style addressing (required by some S3-compatible services).",category:"storage",type:"boolean",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},notes:"Defaults to on when a custom endpoint is set, off otherwise; only the exact value `false` turns it off explicitly."},PIWI_AUTH_ENABLED:{description:'Set to "true" to enable role-based access control and API keys. Off by default.',category:"auth",type:"boolean",default:"false"},PIWI_AUTH_SECRET:{description:"Secret used to sign/encrypt session cookies. Required when PIWI_AUTH_ENABLED is true.",category:"auth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_AUTH_ENABLED:"true"},notes:"The server refuses to start when auth is enabled and this is unset."},PIWI_OAUTH_GOOGLE_CLIENT_ID:{description:"Google OAuth client id (optional single sign-on).",category:"oauth",relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GOOGLE_CLIENT_SECRET:"*"},docs:"authentication#oauth-google-github"},PIWI_OAUTH_GOOGLE_CLIENT_SECRET:{description:"Google OAuth client secret.",category:"oauth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GOOGLE_CLIENT_ID:"*"}},PIWI_OAUTH_GITHUB_CLIENT_ID:{description:"GitHub OAuth client id (optional single sign-on).",category:"oauth",relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GITHUB_CLIENT_SECRET:"*"},docs:"authentication#oauth-google-github"},PIWI_OAUTH_GITHUB_CLIENT_SECRET:{description:"GitHub OAuth client secret.",category:"oauth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GITHUB_CLIENT_ID:"*"}},PIWI_OAUTH_ALLOWED_DOMAINS:{description:"Comma-separated verified email domains allowed to sign in via OAuth (all providers).",category:"oauth",type:"list",example:"example.com,corp.example.com",relevantWhen:{PIWI_AUTH_ENABLED:"true"},notes:"Only verified emails in these domains are accepted. Empty means no domain restriction."},PIWI_OAUTH_GITHUB_ALLOWED_ORGS:{description:"Comma-separated GitHub org logins a user must belong to (requests read:org scope).",category:"oauth",type:"list",relevantWhen:{PIWI_OAUTH_GITHUB_CLIENT_ID:"*"}},PIWI_AI_PROVIDER:{description:'AI provider for failure diagnosis: "anthropic" or "openai" (OpenAI-compatible).',category:"ai",type:"enum",enum:["anthropic","openai"]},PIWI_AI_API_KEY:{description:"API key for the diagnosis provider. Takes precedence over the DB-stored key.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"anthropic"},notes:"Optional for OpenAI-compatible providers that need no key (e.g. a local model)."},PIWI_AI_MODEL:{description:"Diagnosis model name (default: claude-opus-4-8 for Anthropic).",category:"ai",example:"claude-opus-4-8",relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"openai"}},PIWI_AI_BASE_URL:{description:"Base URL for OpenAI-compatible providers (e.g. http://localhost:11434/v1).",category:"ai",type:"url",example:"http://localhost:11434/v1",relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"openai"}},PIWI_AI_AUTO_DIAGNOSE:{description:'Set to "true" to auto-diagnose new failure clusters when a run finishes.',category:"ai",type:"boolean",default:"false",relevantWhen:{PIWI_AI_PROVIDER:"*"}},PIWI_AI_AUTO_DIAGNOSE_MAX:{description:"Max clusters auto-diagnosed per finished run (budget cap; default 3).",category:"ai",type:"number",default:"3",min:1,relevantWhen:{PIWI_AI_AUTO_DIAGNOSE:"true"}},PIWI_AI_RESEARCH_PROVIDER:{description:"Provider for the optional research (pre-analysis) stage. Falls back to PIWI_AI_PROVIDER.",category:"ai",type:"enum",enum:["anthropic","openai"],relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_RESEARCH_MODEL:{description:"Cheaper/faster model for the research stage. Empty disables the two-stage pipeline.",category:"ai",relevantWhen:{PIWI_AI_PROVIDER:"*"}},PIWI_AI_RESEARCH_BASE_URL:{description:"Base URL for the research-stage provider. Falls back to PIWI_AI_BASE_URL.",category:"ai",type:"url",relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_RESEARCH_API_KEY:{description:"API key for the research-stage provider. Falls back to PIWI_AI_API_KEY.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_EMBEDDING_PROVIDER:{description:"Provider for embeddings (semantic failure clustering). Falls back to PIWI_AI_PROVIDER.",category:"ai",type:"enum",enum:["openai"],relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:'Must resolve to an OpenAI-compatible provider — Anthropic has no embeddings API — so the fallback only helps when the main provider is "openai".'},PIWI_AI_EMBEDDING_MODEL:{description:"Embedding model name (e.g. text-embedding-3-small).",category:"ai",example:"text-embedding-3-small",relevantWhen:{PIWI_AI_PROVIDER:"*"},notes:"Empty disables semantic clustering (and the embedding fallbacks)."},PIWI_AI_EMBEDDING_BASE_URL:{description:"Base URL for the embedding provider. Falls back to PIWI_AI_BASE_URL.",category:"ai",type:"url",relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"}},PIWI_AI_EMBEDDING_API_KEY:{description:"API key for the embedding provider. Falls back to PIWI_AI_API_KEY.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"}},PIWI_AI_MAX_SAMPLE_ERROR_CHARS:{description:"Max characters of raw error text (per error block).",category:"ai-limits",type:"number",default:"10000",min:200,max:5e4},PIWI_AI_MAX_SCM_PATCH_BUDGET:{description:"Total characters of diff patches across changed files.",category:"ai-limits",type:"number",default:"15000",min:0,max:5e4},PIWI_AI_MAX_AFFECTED_TESTS:{description:"Max affected tests listed in the diagnosis context.",category:"ai-limits",type:"number",default:"30",min:1,max:200},PIWI_AI_MAX_STEPS:{description:"Max recent test steps included.",category:"ai-limits",type:"number",default:"50",min:1,max:200},PIWI_AI_MAX_CONSOLE_ENTRIES:{description:"Max console error/warning entries included.",category:"ai-limits",type:"number",default:"30",min:0,max:200},PIWI_AI_MAX_CONSOLE_ENTRY_CHARS:{description:"Max characters per console entry.",category:"ai-limits",type:"number",default:"1000",min:50,max:5e3},PIWI_AI_MAX_NETWORK_REQUESTS:{description:"Max failed network requests included.",category:"ai-limits",type:"number",default:"25",min:0,max:200},PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS:{description:"Max characters of the page ARIA snapshot.",category:"ai-limits",type:"number",default:"12000",min:0,max:5e4},PIWI_AI_MAX_TEST_SOURCE_CHARS:{description:"Max characters of the test source snippet.",category:"ai-limits",type:"number",default:"8000",min:0,max:5e4},PIWI_AI_MAX_SOURCE_FILES:{description:"Max full source files fetched from SCM to ground patches (0 disables).",category:"ai-limits",type:"number",default:"4",min:0,max:20},PIWI_AI_MAX_SOURCE_FILE_CHARS:{description:"Max characters per fetched full source file.",category:"ai-limits",type:"number",default:"12000",min:0,max:5e4},PIWI_AI_MAX_SERVER_LOG_ENTRIES:{description:"Max backend server log entries (from X-Piwi-Logs header) included.",category:"ai-limits",type:"number",default:"50",min:0,max:200},PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS:{description:"Max characters per backend server log entry.",category:"ai-limits",type:"number",default:"1000",min:50,max:5e3},PIWI_AI_MAX_SERVER_TRACE_SPANS:{description:"Max backend server spans (from X-Piwi-Trace header) included in AI diagnosis (0 disables).",category:"ai-limits",type:"number",default:"40",min:0,max:500,since:"0.16.0"},PIWI_AI_MAX_STEP_INTENTS:{description:"Max AI-step intent mappings (natural-language prompt → compiled locator) included in a diagnosis (0 disables the section).",category:"ai-limits",type:"number",default:"20",min:0,max:100,since:"0.24.0"},PIWI_AI_STEP_MAX_SNAPSHOT_CHARS:{description:"Max characters of the page ARIA snapshot the reporter sends per AI-step authoring iteration.",category:"ai-steps",type:"number",default:"24000",min:0,max:1e5,since:"0.24.0"},PIWI_AI_STEP_MAX_OUTPUT_TOKENS:{description:"Max output tokens the model may return per AI-step authoring iteration. Reasoning models count hidden chain-of-thought against this, so raise it (up to 8192) when authoring with one.",category:"ai-steps",type:"number",default:"1024",min:256,max:8192,since:"0.24.0"},PIWI_AI_MAX_IMAGES:{description:"Max screenshots auto-included in the diagnosis context.",category:"ai-limits",type:"number",default:"5",min:0,max:20},PIWI_AI_MAX_PASSED_PEERS:{description:"Max peer tests in the same file listed when they passed.",category:"ai-limits",type:"number",default:"20",min:0,max:100},PIWI_AI_MAX_CONSOLE_WINDOW:{description:"Max console entries of any type in the window before failure.",category:"ai-limits",type:"number",default:"50",min:0,max:200},PIWI_AI_SLOW_REQUEST_MS:{description:"Network request duration (ms) threshold for flagging as slow.",category:"ai-limits",type:"number",default:"1500",min:100,max:3e4},PIWI_AI_MAX_TRACE_ACTIONS:{description:"Max actions extracted from trace ZIP for failing-action context (0 disables).",category:"ai-limits",type:"number",default:"10",min:0,max:50},PIWI_AI_TRACE_DOM_CHARS:{description:"Max characters for the trace-derived DOM/ARIA excerpt in failing-action context.",category:"ai-limits",type:"number",default:"6000",min:0,max:2e4},PIWI_AI_MAX_TRACE_STACK_FRAMES:{description:"Max call-stack frames (with source windows) from the trace call-stack section (0 disables).",category:"ai-limits",type:"number",default:"10",min:0,max:50},PIWI_AI_MAX_TRACE_NETWORK_REQUESTS:{description:"Max requests included from the trace network stream (0 disables).",category:"ai-limits",type:"number",default:"20",min:0,max:200},PIWI_AI_MAX_DOM_SNAPSHOT_CHARS:{description:"Max characters of the failure-time DOM snapshot rendered from the trace (0 disables).",category:"ai-limits",type:"number",default:"8000",min:0,max:5e4},PIWI_AI_IMAGE_MAX_EDGE:{description:"Screenshots are downscaled to at most this many pixels on the long edge before being sent.",category:"ai-limits",type:"number",default:"1920",min:512,max:8192},PIWI_INGEST_MAX_CONSOLE_ENTRIES:{description:"Max console entries stored per test execution.",category:"ingest",type:"number",default:"200",min:10,max:5e3},PIWI_IMPORT_MAX_BYTES:{description:"Max size of a single multipart upload (report upload or blob-report import), in bytes. Lower it to match a reverse proxy that rejects large bodies, so the import page rejects an oversized archive before uploading it.",category:"ingest",type:"number",default:String(500*1024*1024),min:1024*1024,max:5*1024*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_INLINE_BYTES:{description:"Max size of a single evidence file embedded as a data: URI in an HTML export, in bytes. Larger files are left out of the single-file HTML (and listed as omitted); the ZIP export still carries them at full size.",category:"export",type:"number",default:String(8*1024*1024),min:64*1024,max:512*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_BYTES:{description:"Max total size of one export, in bytes. Evidence is added largest-last until the budget is reached; the rest is listed as omitted. The archive is built in memory, so this also bounds what a single export costs the server.",category:"export",type:"number",default:String(500*1024*1024),min:1024*1024,max:4*1024*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_CASES:{description:"Max member executions carrying full evidence in a failure-cluster export. Remaining affected tests are listed by name without their evidence.",category:"export",type:"number",default:"25",min:1,max:200,since:"0.19.0"},PIWI_INGEST_MAX_CONSOLE_ENTRY_CHARS:{description:"Max characters stored per console entry.",category:"ingest",type:"number",default:"2000",min:200,max:2e4},PIWI_INGEST_MAX_STEPS:{description:"Max test steps stored per execution.",category:"ingest",type:"number",default:"500",min:20,max:5e3},PIWI_INGEST_MAX_STEP_EVENTS:{description:"Max step events stored per execution.",category:"ingest",type:"number",default:"1000",min:20,max:1e4},PIWI_INGEST_MAX_ARIA_CHARS:{description:"Max characters of the ARIA snapshot stored per failing execution.",category:"ingest",type:"number",default:"100000",min:1e3,max:1e6},PIWI_INGEST_MAX_ERROR_CHARS:{description:"Max characters of error text stored per execution (head and tail are kept).",category:"ingest",type:"number",default:"20000",min:1e3,max:1e5},PIWI_INGEST_MAX_SAMPLE_ERROR_CHARS:{description:"Max characters of the sample error stored per failure cluster.",category:"ingest",type:"number",default:"50000",min:1e3,max:2e5},PIWI_INGEST_MAX_TEST_SOURCE_CHARS:{description:"Max characters of the test source snippet stored per failing execution.",category:"ingest",type:"number",default:"50000",min:1e3,max:2e5},PIWI_INGEST_MAX_SOURCE_FRAMES:{description:"Max source stack frames stored per failing execution.",category:"ingest",type:"number",default:"8",min:1,max:32},PIWI_INGEST_MAX_SOURCE_FRAME_CHARS:{description:"Max characters per stored source frame snippet.",category:"ingest",type:"number",default:"4000",min:500,max:2e4},PIWI_AUTO_MARKERS:{description:"Automatically create a timeline marker when a run’s environment, Playwright version, or reporter version changes from the previous run (default: enabled). Set to false to disable.",category:"markers",type:"boolean",default:"true",docs:"timeline-markers",notes:"Only the exact value `false` disables auto-markers."},PIWI_TEST_LOGS_DISABLED:{description:"Disable X-Piwi-Logs response header emission (default: auto-disabled in production, enabled in development).",category:"testing",type:"boolean",docs:"backend-logs",notes:"Unset: capture is on in development and off in production builds; `true` forces it off everywhere, `false` forces it on even in production."},PIWI_CLUSTER_SIMILARITY_THRESHOLD:{description:"Cosine similarity (0–1) above which two failure embeddings merge into one cluster.",category:"clustering",type:"number",default:"0.92",min:0,max:1,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:"Must be greater than 0 and at most 1; invalid values fall back to the default."},PIWI_CLUSTER_SUGGEST_THRESHOLD:{description:"Similarity at which a failure is suggested (not auto-merged) as related to a cluster.",category:"clustering",type:"number",default:"0.80",min:0,max:1,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:"Capped at the merge threshold."},PIWI_SMTP_HOST:{description:"SMTP server hostname for outbound email.",category:"smtp",example:"smtp.example.com"},PIWI_SMTP_PORT:{description:"SMTP port (default 587; 465 for implicit TLS).",category:"smtp",type:"number",default:"587",min:1,max:65535,relevantWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_USER:{description:"SMTP username.",category:"smtp",relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_PASS:{description:"SMTP password. Never returned by the API.",category:"smtp",secret:!0,relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_FROM:{description:"From address for outbound email (e.g. noreply@example.com).",category:"smtp",example:"noreply@example.com",relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_FROM_NAME:{description:"Display name for the from address (optional).",category:"smtp",default:"Piwi Dashboard",relevantWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_SECURE:{description:'Set to "true" for implicit TLS on port 465 (default false → STARTTLS/plain).',category:"smtp",type:"boolean",relevantWhen:{PIWI_SMTP_HOST:"*"},notes:"Defaults to on when the port is 465, off otherwise."},PIWI_WASTED_WAIT_PATTERNS:{description:"Glob patterns (comma or newline separated) defining which wait steps count as wasted time. Locks the UI when set.",category:"wasted-time",type:"list",default:"Wait for timeout*,*waitForTimeout*",notes:"Case-insensitive globs (`*` and `?`) matched against a wait step’s title or source location. Use `*` to count every wait."},PIWI_DEMO_MODE:{description:'Set to "true" to build the standalone client-side demo SPA (no server).',category:"demo",runtimeOnly:!0,type:"boolean"},PIWI_BASE_URL:{description:"Base URL the metadata test spec targets (defaults to http://localhost:3000).",category:"test",runtimeOnly:!0},PIWI_POSTGRES_TEST_URL:{description:"PostgreSQL connection string used by the Postgres test suite.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_BUCKET:{description:"S3 bucket for the storage integration tests.",category:"test",runtimeOnly:!0},PIWI_S3_TEST_REGION:{description:"Region for the S3 storage integration tests.",category:"test",runtimeOnly:!0},PIWI_S3_TEST_ACCESS_KEY_ID:{description:"Access key id for the S3 storage integration tests.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_SECRET_ACCESS_KEY:{description:"Secret access key for the S3 storage integration tests.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_ENDPOINT:{description:"Custom endpoint for the S3 storage integration tests.",category:"test",runtimeOnly:!0},PIWI_MAILPIT_URL:{description:"Mailpit base URL; when set, the email/notification E2E tests run against it.",category:"test",runtimeOnly:!0},PIWI_MAILPIT_SMTP_PORT:{description:"SMTP port the email E2E tests send to (Mailpit).",category:"test",runtimeOnly:!0},PIWI_EMAIL_SERVER_URL:{description:"Base URL the email test spec targets.",category:"test",runtimeOnly:!0},PIWI_TEST_CLEANUP_ENABLED:{description:"Allow the E2E cleanup endpoint (`DELETE /api/tests/cleanup`) on a production build, which CI needs because it runs the suite against one. Never set it on a real deployment.",category:"test",runtimeOnly:!0,type:"boolean",since:"0.19.0"}};function T(t){return P[t]}function oe(t){return Object.keys(P).filter(r=>P[r].category===t)}const q={key:0,class:"font-medium mb-1"},F={class:"text-muted"},K={key:1,class:"mt-2 space-y-1"},$={class:"text-muted text-xs"},z={class:"flex flex-col gap-1.5"},Q=["title","onClick"],j={class:"block font-mono text-xs bg-elevated rounded px-1.5 py-0.5 select-all cursor-pointer group-hover:ring-1 ring-default"},Z={key:0,class:"block text-muted text-[11px] mt-0.5"},J={key:2,class:"mt-2 flex flex-col gap-1"},ee=W({__name:"HelpHint",props:{topic:{},title:{},text:{},doc:{},envVars:{},size:{}},setup(t){const r=t,{copy:h}=G(),c=n(()=>r.topic?w[r.topic]:null),o=n(()=>r.title??c.value?.title),g=n(()=>r.text??c.value?.text??""),I=n(()=>r.doc??c.value?.doc),d=n(()=>r.envVars??c.value?.envVars),A=k(!1),S=n(()=>o.value?`Help: ${o.value}`:"Help"),b=n(()=>({side:"bottom","aria-label":S.value}));return(te,l)=>{const R=H,f=V,O=L;return a(),m(O,{open:e(A),"onUpdate:open":l[0]||(l[0]=i=>D(A)?A.value=i:null),content:e(b),ui:{content:"max-w-xs p-3 text-sm"}},{content:u(()=>[e(o)?(a(),_("p",q,p(e(o)),1)):s("",!0),E("p",F,p(e(g)),1),e(d)?.length?(a(),_("div",K,[E("p",$,"Environment variable"+p(e(d).length>1?"s":"")+":",1),E("div",z,[(a(!0),_(N,null,U(e(d),i=>(a(),_("button",{key:i,type:"button",class:"group text-left",title:`Click to copy ${i}`,onClick:ae=>e(h)(i,{toast:`Copied ${i}`})},[E("code",j,p(i),1),e(T)(i).description?(a(),_("span",Z,p(e(T)(i).description),1)):s("",!0)],8,Q))),128))])])):s("",!0),e(I)||e(d)?.length?(a(),_("div",J,[e(I)?(a(),m(f,{key:0,to:e(I)},{default:u(()=>[...l[1]||(l[1]=[y("Learn more",-1)])]),_:1},8,["to"])):s("",!0),e(d)?.length?(a(),m(f,{key:1,to:"configuration"},{default:u(()=>[...l[2]||(l[2]=[y("Configuration reference",-1)])]),_:1})):s("",!0)])):s("",!0)]),default:u(()=>[C(R,{size:t.size??"xs",variant:"ghost",color:"neutral",icon:"i-lucide-circle-help","aria-label":e(S),title:"What is this?",class:"text-muted hover:text-default align-middle"},null,8,["size","aria-label"])]),_:1},8,["open","content"])}}}),se=Object.assign(ee,{__name:"HelpHint"});export{se as _,V as a,X as d,oe as e,T as g};
@@ -1 +0,0 @@
1
- import{_ as f}from"./Cu2Q4iPh.js";import{_ as b}from"./Qo6oszaF.js";import{_ as h}from"./Drw8yQg6.js";import{_ as j,a as v}from"./opyDpgSw.js";import{_ as x}from"./Bd8B-yeR.js";import{d as $,u as w,w as y,e as C,f as P,g as a,h as k,o as B,i as N,j as e,k as o,r as g}from"./C5TrTuWv.js";import{u as D}from"./T5UuMUxA.js";import"./BCGljaM0.js";import"./Ce5_Tq63.js";import"./DaNC-xl1.js";import"./B8H4XydJ.js";import"./DcLbz6DV.js";import"./DcR0Mmdl.js";import"./BFxvHlO9.js";import"./BBhrClA9.js";import"./VACXezo0.js";import"./DuOH5jcQ.js";import"./LwoTUb-r.js";import"./DMtrFQqi.js";import"./CMuzkARi.js";import"./D0Kop4bS.js";import"./BrUBOQ0y.js";import"./CX5Q0dZ8.js";import"./Bg93Rnts.js";import"./V9p3z39z.js";import"./DMAiMrNr.js";import"./B69RP95P.js";import"./BjaRappk.js";import"./C8Paf_V1.js";import"./DzZpIs4W.js";const R={class:"p-4"},_o=$({__name:"test-cases",async setup(T){let r,n;const i=w(),s=String(i.params.id),{data:t}=([r,n]=y(()=>D(`/api/projects/${s}`,"$GBv2haQFFX")),r=await r,n(),r),c=g(null);return C(k(()=>({title:`${t.value?.label||t.value?.name||"Project"} — Test cases — Piwi Dashboard`}))),(F,U)=>{const m=f,p=b,_=h,l=v,u=x,d=j;return B(),P(d,{id:"project-test-cases"},{header:a(()=>[e(l,null,{leading:a(()=>[e(m),e(p,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(t)?.label||o(t)?.name||"Project",to:`/projects/${o(s)}`},{label:"Test cases"}]},null,8,["items"])]),right:a(()=>[e(_,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>o(c)?.refresh()}]},null,8,["actions"])]),_:1})]),body:a(()=>[N("div",R,[e(u,{ref_key:"tableRef",ref:c,"project-id":o(s),"project-name":o(t)?.name,"sync-query":""},null,8,["project-id","project-name"])])]),_:1})}}});export{_o as default};
@@ -1 +0,0 @@
1
- import{a2 as $,a3 as S,a4 as C,a5 as V,o as a,f as l,g as B,V as c,k as r,aK as j,W as d,p as A,q as s,v as o,i as N,c as u,m,t as x,F as b,y as h,_ as p,X as O,h as P,a8 as F}from"./C5TrTuWv.js";const I={slots:{root:"relative overflow-hidden w-full rounded-lg p-4 flex gap-2.5",wrapper:"min-w-0 flex-1 flex flex-col",title:"text-sm font-medium",description:"text-sm opacity-90",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xl",actions:"flex flex-wrap gap-1.5 shrink-0",close:"p-0"},variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{solid:"",outline:"",soft:"",subtle:""},orientation:{horizontal:{root:"items-center",actions:"items-center"},vertical:{root:"items-start",actions:"items-start mt-2.5"}},title:{true:{description:"mt-1"}}},compoundVariants:[{color:"primary",variant:"solid",class:{root:"bg-primary text-inverted"}},{color:"secondary",variant:"solid",class:{root:"bg-secondary text-inverted"}},{color:"success",variant:"solid",class:{root:"bg-success text-inverted"}},{color:"info",variant:"solid",class:{root:"bg-info text-inverted"}},{color:"warning",variant:"solid",class:{root:"bg-warning text-inverted"}},{color:"error",variant:"solid",class:{root:"bg-error text-inverted"}},{color:"primary",variant:"outline",class:{root:"text-primary ring ring-inset ring-primary/25"}},{color:"secondary",variant:"outline",class:{root:"text-secondary ring ring-inset ring-secondary/25"}},{color:"success",variant:"outline",class:{root:"text-success ring ring-inset ring-success/25"}},{color:"info",variant:"outline",class:{root:"text-info ring ring-inset ring-info/25"}},{color:"warning",variant:"outline",class:{root:"text-warning ring ring-inset ring-warning/25"}},{color:"error",variant:"outline",class:{root:"text-error ring ring-inset ring-error/25"}},{color:"primary",variant:"soft",class:{root:"bg-primary/10 text-primary"}},{color:"secondary",variant:"soft",class:{root:"bg-secondary/10 text-secondary"}},{color:"success",variant:"soft",class:{root:"bg-success/10 text-success"}},{color:"info",variant:"soft",class:{root:"bg-info/10 text-info"}},{color:"warning",variant:"soft",class:{root:"bg-warning/10 text-warning"}},{color:"error",variant:"soft",class:{root:"bg-error/10 text-error"}},{color:"primary",variant:"subtle",class:{root:"bg-primary/10 text-primary ring ring-inset ring-primary/25"}},{color:"secondary",variant:"subtle",class:{root:"bg-secondary/10 text-secondary ring ring-inset ring-secondary/25"}},{color:"success",variant:"subtle",class:{root:"bg-success/10 text-success ring ring-inset ring-success/25"}},{color:"info",variant:"subtle",class:{root:"bg-info/10 text-info ring ring-inset ring-info/25"}},{color:"warning",variant:"subtle",class:{root:"bg-warning/10 text-warning ring ring-inset ring-warning/25"}},{color:"error",variant:"subtle",class:{root:"bg-error/10 text-error ring ring-inset ring-error/25"}},{color:"neutral",variant:"solid",class:{root:"text-inverted bg-inverted"}},{color:"neutral",variant:"outline",class:{root:"text-highlighted bg-default ring ring-inset ring-default"}},{color:"neutral",variant:"soft",class:{root:"text-highlighted bg-elevated/50"}},{color:"neutral",variant:"subtle",class:{root:"text-highlighted bg-elevated/50 ring ring-inset ring-accented"}}],defaultVariants:{color:"primary",variant:"solid"}},D={__name:"UAlert",props:{as:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},orientation:{type:null,required:!1,default:"vertical"},actions:{type:Array,required:!1},close:{type:[Boolean,Object],required:!1},closeIcon:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},emits:["update:open"],setup(w,{emit:k}){const q=w,z=k,i=$(),t=S("alert",q),{t:_}=C(),f=V(),e=P(()=>F({extend:I,...f.ui?.alert||{}})({color:t.color,variant:t.variant,orientation:t.orientation,title:!!t.title||!!i.title}));return(n,y)=>(a(),l(r(O),{as:r(t).as,"data-orientation":r(t).orientation,"data-slot":"root",class:s(e.value.root({class:[r(t).ui?.root,r(t).class]}))},{default:B(()=>[c(n.$slots,"leading",{ui:e.value},()=>[r(t).avatar?(a(),l(j,d({key:0,size:r(t).ui?.avatarSize||e.value.avatarSize()},r(t).avatar,{"data-slot":"avatar",class:e.value.avatar({class:r(t).ui?.avatar})}),null,16,["size","class"])):r(t).icon?(a(),l(A,{key:1,name:r(t).icon,"data-slot":"icon",class:s(e.value.icon({class:r(t).ui?.icon}))},null,8,["name","class"])):o("",!0)]),N("div",{"data-slot":"wrapper",class:s(e.value.wrapper({class:r(t).ui?.wrapper}))},[r(t).title||i.title?(a(),u("div",{key:0,"data-slot":"title",class:s(e.value.title({class:r(t).ui?.title}))},[c(n.$slots,"title",{},()=>[m(x(r(t).title),1)])],2)):o("",!0),r(t).description||i.description?(a(),u("div",{key:1,"data-slot":"description",class:s(e.value.description({class:r(t).ui?.description}))},[c(n.$slots,"description",{},()=>[m(x(r(t).description),1)])],2)):o("",!0),r(t).orientation==="vertical"&&(r(t).actions?.length||i.actions)?(a(),u("div",{key:2,"data-slot":"actions",class:s(e.value.actions({class:r(t).ui?.actions}))},[c(n.$slots,"actions",{},()=>[(a(!0),u(b,null,h(r(t).actions,(g,v)=>(a(),l(p,d({key:v,size:"xs"},{ref_for:!0},g),null,16))),128))])],2)):o("",!0)],2),r(t).orientation==="horizontal"&&(r(t).actions?.length||i.actions)||r(t).close?(a(),u("div",{key:0,"data-slot":"actions",class:s(e.value.actions({class:r(t).ui?.actions,orientation:"horizontal"}))},[r(t).orientation==="horizontal"&&(r(t).actions?.length||i.actions)?c(n.$slots,"actions",{key:0},()=>[(a(!0),u(b,null,h(r(t).actions,(g,v)=>(a(),l(p,d({key:v,size:"xs"},{ref_for:!0},g),null,16))),128))]):o("",!0),c(n.$slots,"close",{ui:e.value},()=>[r(t).close?(a(),l(p,d({key:0,icon:r(t).closeIcon||r(f).ui.icons.close,color:"neutral",variant:"link","aria-label":r(_)("alert.close")},typeof r(t).close=="object"?r(t).close:{},{"data-slot":"close",class:e.value.close({class:r(t).ui?.close}),onClick:y[0]||(y[0]=g=>z("update:open",!1))}),null,16,["icon","aria-label","class"])):o("",!0)])],2)):o("",!0)]),_:3},8,["as","data-orientation","class"]))}};export{D as _};
@@ -1 +0,0 @@
1
- import{d as A,Z as ke,Y as me,U as P,o as c,f as x,g as h,V as D,k as e,X as K,$ as le,aC as se,r as V,J as he,B as _e,aS as Ve,j as T,W as O,v as N,aE as ue,h as B,L as Be,aT as Te,aB as $e,S as Re,c9 as Le,bz as Q,b3 as ie,bt as Se,ax as xe,a9 as je,bK as Ue,bN as Je,bb as Xe,bs as qe,ah as ze,aG as re,c as R,F as j,bY as Ye,bX as Ge,a2 as Ze,a3 as Qe,a5 as et,a6 as Ee,a7 as tt,b8 as Me,aK as at,bR as nt,p as W,q,aJ as Y,m as ce,t as ee,ag as oe,s as lt,x as fe,bc as pe,K as it,bd as te,i as G,y as ae,b9 as ve,ba as Oe,a8 as ot,bV as rt}from"./C5TrTuWv.js";import{i as st}from"./CpcrljrH.js";import{_ as ut}from"./DuOH5jcQ.js";const[Ae,dt]=le("CollapsibleRoot");var ct=A({__name:"CollapsibleRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:open"],setup(u,{expose:r,emit:l}){const n=u,t=ke(n,"open",l,{defaultValue:n.defaultOpen,passive:n.open===void 0}),{disabled:s,unmountOnHide:d}=me(n);return dt({contentId:"",disabled:s,open:t,unmountOnHide:d,onOpenToggle:()=>{s.value||(t.value=!t.value)}}),r({open:t}),P(),(f,C)=>(c(),x(e(K),{as:f.as,"as-child":n.asChild,"data-state":e(t)?"open":"closed","data-disabled":e(s)?"":void 0},{default:h(()=>[D(f.$slots,"default",{open:e(t)})]),_:3},8,["as","as-child","data-state","data-disabled"]))}}),ft=ct,pt=A({inheritAttrs:!1,__name:"CollapsibleContent",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["contentFound"],setup(u,{emit:r}){const l=u,n=r,i=Ae();i.contentId||=se(void 0,"reka-collapsible-content");const t=V(),{forwardRef:s,currentElement:d}=P(),f=V(0),C=V(0),I=B(()=>i.open.value),y=V(I.value),M=V();he(()=>[I.value,t.value?.present],async()=>{await Be();const p=d.value;if(!p)return;M.value=M.value||{transitionDuration:p.style.transitionDuration,animationName:p.style.animationName},p.style.transitionDuration="0s",p.style.animationName="none";const L=p.getBoundingClientRect();C.value=L.height,f.value=L.width,y.value||(p.style.transitionDuration=M.value.transitionDuration,p.style.animationName=M.value.animationName)},{immediate:!0});const _=B(()=>y.value&&i.open.value);return _e(()=>{requestAnimationFrame(()=>{y.value=!1})}),Ve(d,"beforematch",p=>{requestAnimationFrame(()=>{i.onOpenToggle(),n("contentFound")})}),(p,L)=>(c(),x(e(ue),{ref_key:"presentRef",ref:t,present:p.forceMount||e(i).open.value,"force-mount":!0},{default:h(({present:o})=>[T(e(K),O(p.$attrs,{id:e(i).contentId,ref:e(s),"as-child":l.asChild,as:p.as,hidden:o?void 0:e(i).unmountOnHide.value?"":"until-found","data-state":_.value?void 0:e(i).open.value?"open":"closed","data-disabled":e(i).disabled?.value?"":void 0,style:{"--reka-collapsible-content-height":`${C.value}px`,"--reka-collapsible-content-width":`${f.value}px`}}),{default:h(()=>[!e(i).unmountOnHide.value||o?D(p.$slots,"default",{key:0}):N("v-if",!0)]),_:2},1040,["id","as-child","as","hidden","data-state","data-disabled","style"])]),_:3},8,["present"]))}}),vt=pt,gt=A({__name:"CollapsibleTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(u){const r=u;P();const l=Ae();return(n,i)=>(c(),x(e(K),{type:n.as==="button"?"button":void 0,as:n.as,"as-child":r.asChild,"aria-controls":e(l).contentId,"aria-expanded":e(l).open.value,"data-state":e(l).open.value?"open":"closed","data-disabled":e(l).disabled?.value?"":void 0,disabled:e(l).disabled?.value,onClick:e(l).onOpenToggle},{default:h(()=>[D(n.$slots,"default")]),_:3},8,["type","as","as-child","aria-controls","aria-expanded","data-state","data-disabled","disabled","onClick"]))}}),ht=gt;function bt({type:u,defaultValue:r,modelValue:l}){const n=l||r;return l!==void 0||r!==void 0?Array.isArray(n)?"multiple":"single":u??"single"}function yt({type:u,defaultValue:r,modelValue:l}){return u||bt({type:u,defaultValue:r,modelValue:l})}function kt({type:u,defaultValue:r}){return r!==void 0?r:u==="single"?void 0:[]}function mt(u,r){const l=B(()=>yt(u)),n=ke(u,"modelValue",r,{defaultValue:kt(u),passive:u.modelValue===void 0,deep:!0});function i(s){if(l.value==="single")n.value=Te(s,n.value)?void 0:s;else{const d=Array.isArray(n.value)?[...n.value||[]]:[n.value].filter(Boolean);if(st(d,s)){const f=d.findIndex(C=>Te(C,s));d.splice(f,1)}else d.push(s);n.value=d}}const t=B(()=>l.value==="single");return{modelValue:n,changeModelValue:i,isSingle:t}}const[Ce,_t]=le("AccordionRoot");var Lt=A({__name:"AccordionRoot",props:{collapsible:{type:Boolean,required:!1,default:!1},disabled:{type:Boolean,required:!1,default:!1},dir:{type:String,required:!1},orientation:{type:String,required:!1,default:"vertical"},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},type:{type:String,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1}},emits:["update:modelValue"],setup(u,{emit:r}){const l=u,n=r,{dir:i,disabled:t,unmountOnHide:s}=me(l),d=$e(i),{modelValue:f,changeModelValue:C,isSingle:I}=mt(l,n),{forwardRef:y,currentElement:M}=P();return _t({disabled:t,direction:d,orientation:l.orientation,parentElement:M,isSingle:I,collapsible:l.collapsible,modelValue:f,changeModelValue:C,unmountOnHide:s}),(_,p)=>(c(),x(e(K),{ref:e(y),"as-child":_.asChild,as:_.as},{default:h(()=>[D(_.$slots,"default",{modelValue:e(f)})]),_:3},8,["as-child","as"]))}}),De=Lt,be=(function(u){return u.Open="open",u.Closed="closed",u})(be||{});const[Pe,xt]=le("AccordionItem");var Ct=A({__name:"AccordionItem",props:{disabled:{type:Boolean,required:!1},value:{type:String,required:!0},unmountOnHide:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u,{expose:r}){const l=u,n=Ce(),i=B(()=>n.isSingle.value?l.value===n.modelValue.value:Array.isArray(n.modelValue.value)&&n.modelValue.value.includes(l.value)),t=B(()=>n.disabled.value||l.disabled),s=B(()=>t.value?"":void 0),d=B(()=>i.value?be.Open:be.Closed);r({open:i,dataDisabled:s});const{currentRef:f,currentElement:C}=P();xt({open:i,dataState:d,disabled:t,dataDisabled:s,triggerId:"",currentRef:f,currentElement:C,value:B(()=>l.value)});function I(y){const M=y.target;if(Array.from(n.parentElement.value?.querySelectorAll("[data-reka-collection-item]")??[]).findIndex(L=>L===M)===-1)return null;Le(y,M,n.parentElement.value,{arrowKeyOptions:n.orientation,dir:n.direction.value,focus:!0})}return(y,M)=>(c(),x(e(ft),{"data-orientation":e(n).orientation,"data-disabled":s.value,"data-state":d.value,disabled:t.value,open:i.value,as:l.as,"as-child":l.asChild,"unmount-on-hide":l.unmountOnHide??e(n).unmountOnHide.value,onKeydown:Re(I,["up","down","left","right","home","end"])},{default:h(()=>[D(y.$slots,"default",{open:i.value})]),_:3},8,["data-orientation","data-disabled","data-state","disabled","open","as","as-child","unmount-on-hide"]))}}),wt=Ct,It=A({__name:"AccordionContent",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const r=u,l=Ce(),n=Pe();return P(),(i,t)=>(c(),x(e(vt),{role:"region","as-child":r.asChild,as:i.as,"force-mount":r.forceMount,"aria-labelledby":e(n).triggerId,"data-state":e(n).dataState.value,"data-disabled":e(n).dataDisabled.value,"data-orientation":e(l).orientation,style:{"--reka-accordion-content-width":"var(--reka-collapsible-content-width)","--reka-accordion-content-height":"var(--reka-collapsible-content-height)"},onContentFound:t[0]||(t[0]=s=>e(l).changeModelValue(e(n).value.value))},{default:h(()=>[D(i.$slots,"default")]),_:3},8,["as-child","as","force-mount","aria-labelledby","data-state","data-disabled","data-orientation"]))}}),Tt=It,qt=A({__name:"AccordionTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const r=u,l=Ce(),n=Pe();n.triggerId||=se(void 0,"reka-accordion-trigger");function i(){const t=l.isSingle.value&&n.open.value&&!l.collapsible;n.disabled.value||t||l.changeModelValue(n.value.value)}return(t,s)=>(c(),x(e(ht),{id:e(n).triggerId,ref:e(n).currentRef,"data-reka-collection-item":"",as:r.as,"as-child":r.asChild,"aria-disabled":e(n).disabled.value||void 0,"aria-expanded":e(n).open.value||!1,"data-disabled":e(n).dataDisabled.value,"data-orientation":e(l).orientation,"data-state":e(n).dataState.value,disabled:e(n).disabled.value,onClick:i},{default:h(()=>[D(t.$slots,"default")]),_:3},8,["id","as","as-child","aria-disabled","aria-expanded","data-disabled","data-orientation","data-state","disabled"]))}}),Ne=qt;function de(u){return u?"open":"closed"}function Ke(u,r){return`${u}-trigger-${r}`}function we(u,r){return`${u}-content-${r}`}const Et="navigationMenu.linkSelect",ne="navigationMenu.rootContentDismiss";function ye(u){const r=[],l=document.createTreeWalker(u,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const i=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||i?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;l.nextNode();)r.push(l.currentNode);return r}function Fe(u){const r=Q();return u.some(l=>l===r?!0:(l.focus(),Q()!==r))}function Mt(u){return u.forEach(r=>{r.dataset.tabindex=r.getAttribute("tabindex")||"",r.setAttribute("tabindex","-1")}),()=>{u.forEach(r=>{const l=r.dataset.tabindex;r.setAttribute("tabindex",l)})}}function He(u){return r=>r.pointerType==="mouse"?u(r):void 0}const[Z,Ot]=le(["NavigationMenuRoot","NavigationMenuSub"],"NavigationMenuContext");var Dt=A({__name:"NavigationMenuRoot",props:{modelValue:{type:String,required:!1,default:void 0},defaultValue:{type:String,required:!1},dir:{type:String,required:!1},orientation:{type:String,required:!1,default:"horizontal"},delayDuration:{type:Number,required:!1,default:200},skipDelayDuration:{type:Number,required:!1,default:300},disableClickTrigger:{type:Boolean,required:!1,default:!1},disableHoverTrigger:{type:Boolean,required:!1,default:!1},disablePointerLeaveClose:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"nav"}},emits:["update:modelValue"],setup(u,{emit:r}){const l=u,i=ke(l,"modelValue",r,{defaultValue:l.defaultValue??"",passive:l.modelValue===void 0}),t=V(""),{forwardRef:s,currentElement:d}=P(),f=V(),C=V(),I=V(),{getItems:y,CollectionSlot:M}=ie({key:"NavigationMenu",isProvider:!0}),{delayDuration:_,skipDelayDuration:p,dir:L,disableClickTrigger:o,disableHoverTrigger:S,unmountOnHide:g}=me(l),b=$e(L),E=Se(!1,p),v=V(!1),w=B(()=>i.value!==""||E.value?150:_.value),a=je(k=>{if(typeof k=="string"){if(k===""&&v.value){v.value=!1;return}t.value=i.value,i.value=k,k===""&&(E.value=!0)}},w);xe(()=>{if(!i.value)return;const k=y().map($=>$.ref);I.value=k.find($=>$.id.includes(i.value))}),Ve(d,ne,m),Ot({isRootMenu:!0,modelValue:i,previousValue:t,baseId:se(void 0,"reka-navigation-menu"),disableClickTrigger:o,disableHoverTrigger:S,dir:b,unmountOnHide:g,orientation:l.orientation,rootNavigationMenu:d,indicatorTrack:f,activeTrigger:I,onIndicatorTrackChange:k=>{f.value=k},viewport:C,onViewportChange:k=>{C.value=k},onTriggerEnter:k=>{i.value!==""?(v.value=!0,t.value=i.value,i.value=k):a(k)},onTriggerLeave:()=>{v.value=!1,a("")},onContentEnter:()=>{a()},onContentLeave:()=>{l.disablePointerLeaveClose||(v.value=!1,a(""))},onItemSelect:k=>{t.value=i.value,i.value=k},onItemDismiss:m});function m(){t.value=i.value,i.value=""}return(k,$)=>(c(),x(e(M),null,{default:h(()=>[T(e(K),{ref:e(s),as:k.as,"as-child":k.asChild,"data-orientation":k.orientation,dir:e(b),"data-reka-navigation-menu":""},{default:h(()=>[D(k.$slots,"default",{modelValue:e(i)})]),_:3},8,["as","as-child","data-orientation","dir"])]),_:3}))}}),Nt=Dt;const[Ie,Vt]=le("NavigationMenuItem");var Bt=A({__name:"NavigationMenuItem",props:{value:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"li"}},setup(u){const r=u;P();const{getItems:l}=ie({key:"NavigationMenu"}),n=Z(),i=se(r.value),t=V(),s=V(),d=we(n.baseId,i);let f=()=>({});const C=V(!1);async function I(p="start"){const L=document.getElementById(d);if(L){f();const o=ye(L);o.length&&Fe(p==="start"?o:o.reverse())}}function y(){const p=document.getElementById(d);if(p){const L=ye(p);L.length&&(f=Mt(L))}}Vt({value:i,contentId:d,triggerRef:t,focusProxyRef:s,wasEscapeCloseRef:C,onEntryKeyDown:I,onFocusProxyEnter:I,onContentFocusOutside:y,onRootContentClose:y});function M(){n.onItemDismiss(),t.value?.focus()}function _(p){const L=Q();if(p.keyCode===32||p.key==="Enter")if(n.modelValue.value===i){M(),p.preventDefault();return}else{p.target.click(),p.preventDefault();return}const o=l().filter(g=>g.ref.parentElement?.hasAttribute("data-menu-item")).map(g=>g.ref);if(!o.includes(L))return;const S=Le(p,L,void 0,{itemsArray:o,loop:!1});S&&S?.focus(),p.preventDefault(),p.stopPropagation()}return(p,L)=>(c(),x(e(K),{"as-child":p.asChild,as:p.as,"data-menu-item":"",onKeydown:Re(_,["up","down","left","right","home","end","space"])},{default:h(()=>[D(p.$slots,"default")]),_:3},8,["as-child","as"]))}}),$t=Bt,Rt=A({__name:"NavigationMenuContentImpl",props:{disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(u,{emit:r}){const l=u,n=r,{getItems:i}=ie({key:"NavigationMenu"}),{forwardRef:t,currentElement:s}=P(),d=Z(),f=Ie(),C=Ke(d.baseId,f.value),I=we(d.baseId,f.value),y=V(null),M=B(()=>{const g=i().map(m=>m.ref.id.split("trigger-")[1]);d.dir.value==="rtl"&&g.reverse();const b=g.indexOf(d.modelValue.value),E=g.indexOf(d.previousValue.value),v=f.value===d.modelValue.value,w=E===g.indexOf(f.value);if(!v&&!w)return y.value;const a=(()=>{if(b!==E){if(v&&E!==-1)return b>E?"from-end":"from-start";if(w&&b!==-1)return b>E?"to-start":"to-end"}return null})();return y.value=a,a});function _(g){if(n("focusOutside",g),n("interactOutside",g),g.detail.originalEvent.target.hasAttribute("data-navigation-menu-trigger")&&g.preventDefault(),!g.defaultPrevented){f.onContentFocusOutside();const E=g.target;d.rootNavigationMenu?.value?.contains(E)&&g.preventDefault()}}function p(g){if(n("pointerDownOutside",g),!g.defaultPrevented){const b=g.target,E=i().some(w=>w.ref.contains(b)),v=d.isRootMenu&&d.viewport.value?.contains(b);(E||v||!d.isRootMenu)&&g.preventDefault()}}xe(g=>{const b=s.value;if(d.isRootMenu&&b){const E=()=>{d.onItemDismiss(),f.onRootContentClose(),b.contains(Q())&&f.triggerRef.value?.focus()};b.addEventListener(ne,E),g(()=>b.removeEventListener(ne,E))}});function L(g){n("escapeKeyDown",g),g.defaultPrevented||(d.onItemDismiss(),f.triggerRef?.value?.focus(),f.wasEscapeCloseRef.value=!0)}function o(g){if(g.target.closest("[data-reka-navigation-menu]")!==d.rootNavigationMenu.value)return;const b=g.altKey||g.ctrlKey||g.metaKey,E=g.key==="Tab"&&!b,v=ye(g.currentTarget);if(E){const a=Q(),m=v.findIndex(z=>z===a),$=g.shiftKey?v.slice(0,m).reverse():v.slice(m+1,v.length);if(Fe($))g.preventDefault();else{f.focusProxyRef.value?.focus();return}}Le(g,Q(),void 0,{itemsArray:v,loop:!1,enableIgnoredElement:!0})?.focus()}function S(){if(d.modelValue.value!==f.value)return;const g=new Event(ne,{bubbles:!0,cancelable:!0});s.value?.dispatchEvent(g)}return(g,b)=>(c(),x(e(Ue),O({id:e(I),ref:e(t),"aria-labelledby":e(C),"data-motion":M.value,"data-state":e(de)(e(d).modelValue.value===e(f).value),"data-orientation":e(d).orientation},l,{onKeydown:o,onEscapeKeyDown:L,onPointerDownOutside:p,onFocusOutside:_,onDismiss:S}),{default:h(()=>[D(g.$slots,"default")]),_:3},16,["id","aria-labelledby","data-motion","data-state","data-orientation"]))}}),St=Rt,zt=A({inheritAttrs:!1,__name:"NavigationMenuContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(u,{emit:r}){const l=u,n=r,i=Je(Xe(l,"forceMount"),n),{forwardRef:t}=P(),s=Z(),d=Ie(),f=B(()=>d.value===s.modelValue.value),C=B(()=>s.viewport.value&&!s.modelValue.value&&s.previousValue.value?s.previousValue.value===d.value:!1);return(I,y)=>(c(),x(ze,{to:e(qe)&&e(s).viewport.value?e(s).viewport.value:"body",disabled:e(qe)&&e(s).viewport.value?!e(s).viewport.value:!0},[T(e(ue),{present:I.forceMount||f.value||C.value,"force-mount":!e(s).unmountOnHide.value},{default:h(({present:M})=>[T(St,O({ref:e(t),"data-state":e(de)(f.value),style:{pointerEvents:!f.value&&e(s).isRootMenu?"none":void 0}},{...I.$attrs,...e(i)},{hidden:!M,onPointerenter:y[0]||(y[0]=_=>e(s).onContentEnter(e(d).value)),onPointerleave:y[1]||(y[1]=_=>e(He)(()=>e(s).onContentLeave())(_)),onPointerDownOutside:y[2]||(y[2]=_=>n("pointerDownOutside",_)),onFocusOutside:y[3]||(y[3]=_=>n("focusOutside",_)),onInteractOutside:y[4]||(y[4]=_=>n("interactOutside",_))}),{default:h(()=>[D(I.$slots,"default")]),_:2},1040,["data-state","style","hidden"])]),_:3},8,["present","force-mount"])],8,["to","disabled"]))}}),At=zt,Pt=A({inheritAttrs:!1,__name:"NavigationMenuIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const r=u,{forwardRef:l}=P(),n=Z(),i=V(),t=B(()=>n.orientation==="horizontal"),s=B(()=>!!n.modelValue.value),{activeTrigger:d}=n;function f(){d.value&&(i.value={size:t.value?d.value.offsetWidth:d.value.offsetHeight,position:t.value?d.value.offsetLeft:d.value.offsetTop})}return xe(()=>{n.modelValue.value&&f()}),re(d,f),re(n.indicatorTrack,f),(C,I)=>e(n).indicatorTrack.value?(c(),x(ze,{key:0,to:e(n).indicatorTrack.value},[T(e(ue),{present:C.forceMount||s.value},{default:h(()=>[T(e(K),O({ref:e(l),"aria-hidden":"true","data-state":s.value?"visible":"hidden","data-orientation":e(n).orientation,"as-child":r.asChild,as:C.as,style:{...i.value?{"--reka-navigation-menu-indicator-size":`${i.value.size}px`,"--reka-navigation-menu-indicator-position":`${i.value.position}px`}:{}}},C.$attrs),{default:h(()=>[D(C.$slots,"default")]),_:3},16,["data-state","data-orientation","as-child","as","style"])]),_:3},8,["present"])],8,["to"])):N("v-if",!0)}}),Kt=Pt,Ft=A({__name:"NavigationMenuLink",props:{active:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"a"}},emits:["select"],setup(u,{emit:r}){const l=u,n=r,{CollectionItem:i}=ie({key:"NavigationMenu"});P();async function t(s){const d=new CustomEvent(Et,{bubbles:!0,cancelable:!0,detail:{originalEvent:s}});if(n("select",d),!d.defaultPrevented&&!s.metaKey){const f=new CustomEvent(ne,{bubbles:!0,cancelable:!0});s.target?.dispatchEvent(f)}}return(s,d)=>(c(),x(e(i),null,{default:h(()=>[T(e(K),{as:s.as,"data-active":s.active?"":void 0,"aria-current":s.active?"page":void 0,"as-child":l.asChild,onClick:t},{default:h(()=>[D(s.$slots,"default")]),_:3},8,["as","data-active","aria-current","as-child"])]),_:3}))}}),ge=Ft,Ht=A({inheritAttrs:!1,__name:"NavigationMenuList",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"ul"}},setup(u){const r=u,l=Z(),{forwardRef:n,currentElement:i}=P();return _e(()=>{l.onIndicatorTrackChange(i.value)}),(t,s)=>(c(),x(e(K),{ref:e(n),style:{position:"relative"}},{default:h(()=>[T(e(K),O(t.$attrs,{"as-child":r.asChild,as:t.as,"data-orientation":e(l).orientation}),{default:h(()=>[D(t.$slots,"default")]),_:3},16,["as-child","as","data-orientation"])]),_:3},512))}}),Wt=Ht;const jt=["aria-owns"];var Ut=A({inheritAttrs:!1,__name:"NavigationMenuTrigger",props:{disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(u){const r=u,l=Z(),n=Ie(),{CollectionItem:i}=ie({key:"NavigationMenu"}),{forwardRef:t,currentElement:s}=P(),d=V(""),f=V(""),C=Se(!1,300),I=V(!1),y=B(()=>n.value===l.modelValue.value);_e(()=>{n.triggerRef=s,d.value=Ke(l.baseId,n.value),f.value=we(l.baseId,n.value)});function M(){l.disableHoverTrigger.value||(I.value=!1,n.wasEscapeCloseRef.value=!1)}function _(b){if(!l.disableHoverTrigger.value&&b.pointerType==="mouse"){if(r.disabled||I.value||n.wasEscapeCloseRef.value||C.value)return;l.onTriggerEnter(n.value),C.value=!0}}function p(b){if(!l.disableHoverTrigger.value&&b.pointerType==="mouse"){if(r.disabled)return;l.onTriggerLeave(),C.value=!1}}function L(b){(!("pointerType"in b)||b.pointerType==="mouse")&&l.disableClickTrigger.value||C.value||(y.value?l.onItemSelect(""):l.onItemSelect(n.value),I.value=y.value)}function o(b){const v={horizontal:"ArrowDown",vertical:l.dir.value==="rtl"?"ArrowLeft":"ArrowRight"}[l.orientation];y.value&&b.key===v&&(n.onEntryKeyDown(),b.preventDefault(),b.stopPropagation())}function S(b){b&&(n.focusProxyRef.value=Ge(b))}function g(b){const E=document.getElementById(n.contentId),v=b.relatedTarget,w=v===s.value,a=E?.contains(v);(w||!a)&&n.onFocusProxyEnter(w?"start":"end")}return(b,E)=>(c(),R(j,null,[T(e(i),null,{default:h(()=>[T(e(K),O({id:d.value,ref:e(t),disabled:b.disabled,"data-disabled":b.disabled?"":void 0,"data-state":e(de)(y.value),"data-navigation-menu-trigger":"","aria-expanded":y.value,"aria-controls":f.value,"as-child":r.asChild,as:b.as},b.$attrs,{onPointerenter:M,onPointermove:_,onPointerleave:p,onClick:L,onKeydown:o}),{default:h(()=>[D(b.$slots,"default")]),_:3},16,["id","disabled","data-disabled","data-state","aria-expanded","aria-controls","as-child","as"])]),_:3}),y.value?(c(),R(j,{key:0},[T(e(Ye),{ref:S,"aria-hidden":"true",tabindex:0,onFocus:g}),e(l).viewport?(c(),R("span",{key:0,"aria-owns":f.value},null,8,jt)):N("v-if",!0)],64)):N("v-if",!0)],64))}}),Jt=Ut,Xt=A({inheritAttrs:!1,__name:"NavigationMenuViewport",props:{forceMount:{type:Boolean,required:!1},align:{type:String,required:!1,default:"center"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const r=u,{forwardRef:l,currentElement:n}=P(),i=Z(),{activeTrigger:t,rootNavigationMenu:s,modelValue:d}=i,f=V(),C=V(),I=B(()=>!!i.modelValue.value);he(n,()=>{i.onViewportChange(n.value)});const y=V();he([d,I],()=>{Be(()=>{n.value&&requestAnimationFrame(()=>{const _=n.value?.querySelector("[data-state=open]");y.value=_})})},{immediate:!0});function M(){if(y.value&&t.value&&s.value){const _=document.documentElement.offsetWidth,p=document.documentElement.offsetHeight,L=s.value.getBoundingClientRect(),o=t.value.getBoundingClientRect(),{offsetWidth:S,offsetHeight:g}=y.value,b=o.left-L.left,E=o.top-L.top;let v=null,w=null;switch(r.align){case"start":v=b,w=E;break;case"end":v=b-S+o.width,w=E-g+o.height;break;default:v=b-S/2+o.width/2,w=E-g/2+o.height/2}const a=10;v+L.left<a&&(v=a-L.left);const m=v+L.left+S;m>_-a&&(v-=m-_+a,v<a-L.left&&(v=a-L.left)),w+L.top<a&&(w=a-L.top);const k=w+L.top+g;k>p-a&&(w-=k-p+a,w<a-L.top&&(w=a-L.top)),v=Math.round(v),w=Math.round(w),C.value={left:v,top:w}}}return re(y,()=>{y.value&&(f.value={width:y.value.offsetWidth,height:y.value.offsetHeight},M())}),re([globalThis.document?.body,s],()=>{M()}),(_,p)=>(c(),x(e(ue),{present:_.forceMount||I.value,"force-mount":!e(i).unmountOnHide.value,onAfterLeave:p[2]||(p[2]=()=>{f.value=void 0,C.value=void 0})},{default:h(({present:L})=>[T(e(K),O(_.$attrs,{ref:e(l),as:_.as,"as-child":_.asChild,"data-state":e(de)(I.value),"data-orientation":e(i).orientation,style:{pointerEvents:!I.value&&e(i).isRootMenu?"none":void 0,"--reka-navigation-menu-viewport-width":f.value?`${f.value?.width}px`:void 0,"--reka-navigation-menu-viewport-height":f.value?`${f.value?.height}px`:void 0,"--reka-navigation-menu-viewport-left":C.value?`${C.value?.left}px`:void 0,"--reka-navigation-menu-viewport-top":C.value?`${C.value?.top}px`:void 0},hidden:!L,onPointerenter:p[0]||(p[0]=o=>e(i).onContentEnter(e(i).modelValue.value)),onPointerleave:p[1]||(p[1]=o=>e(He)(()=>e(i).onContentLeave())(o))}),{default:h(()=>[D(_.$slots,"default")]),_:2},1040,["as","as-child","data-state","data-orientation","style","hidden"])]),_:3},8,["present","force-mount"]))}}),Yt=Xt;const Gt={slots:{root:"relative flex gap-1.5 [&>div]:min-w-0",list:"isolate min-w-0",label:"w-full flex items-center gap-1.5 font-semibold text-xs/5 text-highlighted px-2.5 py-1.5",item:"min-w-0",link:"group relative w-full flex items-center gap-1.5 font-medium text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:outline-3",linkLeadingIcon:"shrink-0 size-5",linkLeadingAvatar:"shrink-0",linkLeadingAvatarSize:"2xs",linkLeadingChipSize:"sm",linkTrailing:"group ms-auto inline-flex gap-1.5 items-center",linkTrailingBadge:"shrink-0",linkTrailingBadgeSize:"sm",linkTrailingIcon:"size-5 transform shrink-0 group-data-[state=open]:rotate-180 transition-transform duration-200",linkLabel:"truncate",linkLabelExternalIcon:"inline-block size-3 align-top text-dimmed",childList:"isolate",childLabel:"text-xs text-highlighted",childItem:"",childLink:"group relative size-full flex items-start text-start text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:outline-3",childLinkWrapper:"min-w-0",childLinkIcon:"size-5 shrink-0",childLinkLabel:"truncate",childLinkLabelExternalIcon:"inline-block size-3 align-top text-dimmed",childLinkDescription:"text-muted",separator:"px-2 h-px bg-border",viewportWrapper:"absolute top-full start-0 flex w-full",viewport:"relative overflow-hidden bg-default shadow-lg rounded-md ring ring-default h-(--reka-navigation-menu-viewport-height) w-full transition-[width,height,left,right] duration-200 origin-[top_center] data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] z-1",content:"",indicator:"absolute left-0 data-[state=visible]:animate-[fade-in_100ms_ease-out] data-[state=hidden]:animate-[fade-out_100ms_ease-in] data-[state=hidden]:opacity-0 bottom-0 z-2 w-(--reka-navigation-menu-indicator-size) translate-x-(--reka-navigation-menu-indicator-position) flex h-2.5 items-end justify-center overflow-hidden transition-[translate,width] duration-200",arrow:"relative top-[50%] size-2.5 rotate-45 border border-default bg-default z-1 rounded-xs"},variants:{color:{primary:{link:"before:outline-primary/25",childLink:"before:outline-primary/25"},secondary:{link:"before:outline-secondary/25",childLink:"before:outline-secondary/25"},success:{link:"before:outline-success/25",childLink:"before:outline-success/25"},info:{link:"before:outline-info/25",childLink:"before:outline-info/25"},warning:{link:"before:outline-warning/25",childLink:"before:outline-warning/25"},error:{link:"before:outline-error/25",childLink:"before:outline-error/25"},neutral:{link:"before:outline-inverted/25",childLink:"before:outline-inverted/25"}},highlightColor:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{pill:"",link:""},orientation:{horizontal:{root:"items-center justify-between",list:"flex items-center",item:"py-2",link:"px-2.5 py-1.5 before:inset-x-px before:inset-y-0",childList:"grid p-2",childLink:"px-3 py-2 gap-2 before:inset-x-px before:inset-y-0",childLinkLabel:"font-medium",content:"absolute top-0 start-0 w-full max-h-[70vh] overflow-y-auto"},vertical:{root:"flex-col",link:"flex-row px-2.5 py-1.5 before:inset-y-px before:inset-x-0",childLabel:"px-1.5 py-0.5",childLink:"p-1.5 gap-1.5 before:inset-y-px before:inset-x-0"}},contentOrientation:{horizontal:{viewportWrapper:"justify-center",content:"data-[motion=from-start]:animate-[enter-from-left_200ms_ease] data-[motion=from-end]:animate-[enter-from-right_200ms_ease] data-[motion=to-start]:animate-[exit-to-left_200ms_ease] data-[motion=to-end]:animate-[exit-to-right_200ms_ease]"},vertical:{viewport:"sm:w-(--reka-navigation-menu-viewport-width) left-(--reka-navigation-menu-viewport-left) rtl:left-auto rtl:right-[calc(100%-var(--reka-navigation-menu-viewport-left)-var(--reka-navigation-menu-viewport-width))]"}},active:{true:{childLink:"before:bg-elevated text-highlighted",childLinkIcon:"text-default"},false:{link:"text-muted",linkLeadingIcon:"text-dimmed",childLink:["hover:before:bg-elevated/50 text-default hover:text-highlighted","transition-colors before:transition-colors"],childLinkIcon:["text-dimmed group-hover:text-default","transition-colors"]}},disabled:{true:{link:"cursor-not-allowed opacity-75"}},highlight:{true:""},level:{true:""},collapsed:{true:""}},compoundVariants:[{orientation:"horizontal",contentOrientation:"horizontal",class:{childList:"grid-cols-2 gap-2"}},{orientation:"horizontal",contentOrientation:"vertical",class:{childList:"gap-1",content:"w-60"}},{orientation:"vertical",collapsed:!1,class:{childList:"ms-5 border-s border-default",childItem:"ps-1.5 -ms-px",content:"data-[state=open]:animate-[collapsible-down_200ms_ease-out] data-[state=closed]:animate-[collapsible-up_200ms_ease-out] data-[state=closed]:overflow-hidden"}},{orientation:"vertical",collapsed:!0,class:{link:"px-1.5",linkLabel:"hidden",linkTrailing:"hidden",content:"shadow-sm rounded-sm min-h-6 p-1"}},{orientation:"horizontal",highlight:!0,class:{link:["after:absolute after:-bottom-2 after:inset-x-2.5 after:block after:h-px after:rounded-full","after:transition-colors"]}},{orientation:"vertical",highlight:!0,level:!0,class:{link:["after:absolute after:-start-1.5 after:inset-y-0.5 after:block after:w-px after:rounded-full","after:transition-colors"]}},{disabled:!1,active:!1,variant:"pill",class:{link:["hover:text-highlighted hover:before:bg-elevated/50","transition-colors before:transition-colors"],linkLeadingIcon:["group-hover:text-default","transition-colors"]}},{disabled:!1,active:!1,variant:"pill",orientation:"horizontal",class:{link:"data-[state=open]:text-highlighted",linkLeadingIcon:"group-data-[state=open]:text-default"}},{disabled:!1,variant:"pill",highlight:!0,orientation:"horizontal",class:{link:"data-[state=open]:before:bg-elevated/50"}},{disabled:!1,variant:"pill",highlight:!1,active:!1,orientation:"horizontal",class:{link:"data-[state=open]:before:bg-elevated/50"}},{color:"primary",variant:"pill",active:!0,class:{link:"text-primary",linkLeadingIcon:"text-primary group-data-[state=open]:text-primary"}},{color:"secondary",variant:"pill",active:!0,class:{link:"text-secondary",linkLeadingIcon:"text-secondary group-data-[state=open]:text-secondary"}},{color:"success",variant:"pill",active:!0,class:{link:"text-success",linkLeadingIcon:"text-success group-data-[state=open]:text-success"}},{color:"info",variant:"pill",active:!0,class:{link:"text-info",linkLeadingIcon:"text-info group-data-[state=open]:text-info"}},{color:"warning",variant:"pill",active:!0,class:{link:"text-warning",linkLeadingIcon:"text-warning group-data-[state=open]:text-warning"}},{color:"error",variant:"pill",active:!0,class:{link:"text-error",linkLeadingIcon:"text-error group-data-[state=open]:text-error"}},{color:"neutral",variant:"pill",active:!0,class:{link:"text-highlighted",linkLeadingIcon:"text-highlighted group-data-[state=open]:text-highlighted"}},{variant:"pill",active:!0,highlight:!1,class:{link:"before:bg-elevated"}},{variant:"pill",active:!0,highlight:!0,disabled:!1,class:{link:["hover:before:bg-elevated/50","before:transition-colors"]}},{disabled:!1,active:!1,variant:"link",class:{link:["hover:text-highlighted","transition-colors"],linkLeadingIcon:["group-hover:text-default","transition-colors"]}},{disabled:!1,active:!1,variant:"link",orientation:"horizontal",class:{link:"data-[state=open]:text-highlighted",linkLeadingIcon:"group-data-[state=open]:text-default"}},{color:"primary",variant:"link",active:!0,class:{link:"text-primary",linkLeadingIcon:"text-primary group-data-[state=open]:text-primary"}},{color:"secondary",variant:"link",active:!0,class:{link:"text-secondary",linkLeadingIcon:"text-secondary group-data-[state=open]:text-secondary"}},{color:"success",variant:"link",active:!0,class:{link:"text-success",linkLeadingIcon:"text-success group-data-[state=open]:text-success"}},{color:"info",variant:"link",active:!0,class:{link:"text-info",linkLeadingIcon:"text-info group-data-[state=open]:text-info"}},{color:"warning",variant:"link",active:!0,class:{link:"text-warning",linkLeadingIcon:"text-warning group-data-[state=open]:text-warning"}},{color:"error",variant:"link",active:!0,class:{link:"text-error",linkLeadingIcon:"text-error group-data-[state=open]:text-error"}},{color:"neutral",variant:"link",active:!0,class:{link:"text-highlighted",linkLeadingIcon:"text-highlighted group-data-[state=open]:text-highlighted"}},{highlightColor:"primary",highlight:!0,level:!0,active:!0,class:{link:"after:bg-primary"}},{highlightColor:"secondary",highlight:!0,level:!0,active:!0,class:{link:"after:bg-secondary"}},{highlightColor:"success",highlight:!0,level:!0,active:!0,class:{link:"after:bg-success"}},{highlightColor:"info",highlight:!0,level:!0,active:!0,class:{link:"after:bg-info"}},{highlightColor:"warning",highlight:!0,level:!0,active:!0,class:{link:"after:bg-warning"}},{highlightColor:"error",highlight:!0,level:!0,active:!0,class:{link:"after:bg-error"}},{highlightColor:"neutral",highlight:!0,level:!0,active:!0,class:{link:"after:bg-inverted"}}],defaultVariants:{color:"primary",highlightColor:"primary",variant:"pill"}},ta=Object.assign({inheritAttrs:!1},{__name:"UNavigationMenu",props:{as:{type:null,required:!1},type:{type:null,required:!1,default:"multiple"},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},trailingIcon:{type:null,required:!1},externalIcon:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},items:{type:null,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},collapsed:{type:Boolean,required:!1},tooltip:{type:[Boolean,Object],required:!1},popover:{type:[Boolean,Object],required:!1},highlight:{type:Boolean,required:!1},highlightColor:{type:null,required:!1},content:{type:Object,required:!1},contentOrientation:{type:null,required:!1,default:"horizontal"},arrow:{type:Boolean,required:!1},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},class:{type:null,required:!1},ui:{type:Object,required:!1},delayDuration:{type:Number,required:!1,default:0},disableClickTrigger:{type:Boolean,required:!1},disableHoverTrigger:{type:Boolean,required:!1},skipDelayDuration:{type:Number,required:!1},disablePointerLeaveClose:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},disabled:{type:Boolean,required:!1},collapsible:{type:Boolean,required:!1,default:!0}},emits:["update:modelValue"],setup(u,{emit:r}){const l=u,n=r,i=Ze(),t=Qe("navigationMenu",l),s=et(),d=Ee(B(()=>({as:t.as,delayDuration:t.delayDuration,skipDelayDuration:t.skipDelayDuration,orientation:t.orientation,disableClickTrigger:t.disableClickTrigger,disableHoverTrigger:t.disableHoverTrigger,disablePointerLeaveClose:t.disablePointerLeaveClose,unmountOnHide:t.unmountOnHide})),n),f=Ee(tt(t,"collapsible","disabled","type","unmountOnHide"),n),C=ve(()=>t.content),I=ve(()=>Oe(typeof t.tooltip=="boolean"?{}:t.tooltip,{...t.orientation==="vertical"&&{delayDuration:0,content:{side:"right"}}})),y=ve(()=>Oe(typeof t.popover=="boolean"?{}:t.popover,{mode:"hover",content:{side:"right",align:"start",alignOffset:2}})),[M,_]=Me(),[p,L]=Me({props:{item:Object,index:Number,level:Number,listIndex:Number}}),o=B(()=>ot({extend:Gt,...s.ui?.navigationMenu||{}})({orientation:t.orientation,contentOrientation:t.orientation==="vertical"?void 0:t.contentOrientation,collapsed:t.collapsed,color:t.color,variant:t.variant,highlight:t.highlight,highlightColor:t.highlightColor||t.color})),S=B(()=>t.items?.length?rt(t.items)?t.items:[t.items]:[]);function g(v,w,a,m){const k=S.value.length>1?`group-${m}-`:"";return Y(v,t.valueKey)??(a>0?`${k}item-${a}-${w}`:`${k}item-${w}`)}function b(v,w=0,a=0){const m=v.reduce((k,$,z)=>(($.defaultOpen||$.open)&&k.push(g($,z,w,a)),k),[]);return t.type==="single"?m[0]:m}function E(v,w){w.children?.length&&(t.orientation==="horizontal"?v.preventDefault():t.orientation==="vertical"&&!t.collapsed&&(v.preventDefault(),v.stopPropagation()))}return(v,w)=>(c(),R(j,null,[T(e(M),null,{default:h(({item:a,active:m,index:k})=>[D(v.$slots,a.slot||"item",{item:a,index:k,active:m,ui:o.value},()=>[D(v.$slots,a.slot?`${a.slot}-leading`:"item-leading",{item:a,active:m,index:k,ui:o.value},()=>[a.avatar?(c(),x(at,O({key:0,size:a.ui?.linkLeadingAvatarSize||e(t).ui?.linkLeadingAvatarSize||o.value.linkLeadingAvatarSize()},a.avatar,{"data-slot":"linkLeadingAvatar",class:o.value.linkLeadingAvatar({class:[e(t).ui?.linkLeadingAvatar,a.ui?.linkLeadingAvatar],active:m,disabled:!!a.disabled})}),null,16,["size","class"])):a.icon&&a.chip?(c(),x(nt,O({key:1,size:a.ui?.linkLeadingChipSize||e(t).ui?.linkLeadingChipSize||o.value.linkLeadingChipSize(),inset:""},typeof a.chip=="object"?a.chip:{},{"data-slot":"linkLeadingChip"}),{default:h(()=>[T(W,{name:a.icon,"data-slot":"linkLeadingIcon",class:q(o.value.linkLeadingIcon({class:[e(t).ui?.linkLeadingIcon,a.ui?.linkLeadingIcon],active:m,disabled:!!a.disabled}))},null,8,["name","class"])]),_:2},1040,["size"])):a.icon?(c(),x(W,{key:2,name:a.icon,"data-slot":"linkLeadingIcon",class:q(o.value.linkLeadingIcon({class:[e(t).ui?.linkLeadingIcon,a.ui?.linkLeadingIcon],active:m,disabled:!!a.disabled}))},null,8,["name","class"])):N("",!0)]),e(Y)(a,e(t).labelKey)||i[a.slot?`${a.slot}-label`:"item-label"]?(c(),R("span",{key:0,"data-slot":"linkLabel",class:q(o.value.linkLabel({class:[e(t).ui?.linkLabel,a.ui?.linkLabel]}))},[D(v.$slots,a.slot?`${a.slot}-label`:"item-label",{item:a,active:m,index:k},()=>[ce(ee(e(Y)(a,e(t).labelKey)),1)]),a.target==="_blank"&&e(t).externalIcon!==!1?(c(),x(W,{key:0,name:typeof e(t).externalIcon=="string"?e(t).externalIcon:e(s).ui.icons.external,"data-slot":"linkLabelExternalIcon",class:q(o.value.linkLabelExternalIcon({class:[e(t).ui?.linkLabelExternalIcon,a.ui?.linkLabelExternalIcon],active:m}))},null,8,["name","class"])):N("",!0)],2)):N("",!0),a.badge||a.badge===0||e(t).orientation==="horizontal"&&(a.children?.length||i[a.slot?`${a.slot}-content`:"item-content"])||e(t).orientation==="vertical"&&a.children?.length||a.trailingIcon||i[a.slot?`${a.slot}-trailing`:"item-trailing"]?(c(),x(oe(e(t).orientation==="vertical"&&a.children?.length&&!e(t).collapsed?e(Ne):"span"),{key:1,as:e(t).orientation==="vertical"&&a.children?.length&&!e(t).collapsed?"span":void 0,"data-slot":"linkTrailing",class:q(o.value.linkTrailing({class:[e(t).ui?.linkTrailing,a.ui?.linkTrailing]})),onClick:$=>E($,a)},{default:h(()=>[D(v.$slots,a.slot?`${a.slot}-trailing`:"item-trailing",{item:a,active:m,index:k,ui:o.value},()=>[a.badge||a.badge===0?(c(),x(lt,O({key:0,color:"neutral",variant:"outline",size:a.ui?.linkTrailingBadgeSize||e(t).ui?.linkTrailingBadgeSize||o.value.linkTrailingBadgeSize()},typeof a.badge=="string"||typeof a.badge=="number"?{label:a.badge}:a.badge,{"data-slot":"linkTrailingBadge",class:o.value.linkTrailingBadge({class:[e(t).ui?.linkTrailingBadge,a.ui?.linkTrailingBadge]})}),null,16,["size","class"])):N("",!0),e(t).orientation==="horizontal"&&(a.children?.length||i[a.slot?`${a.slot}-content`:"item-content"])||e(t).orientation==="vertical"&&a.children?.length?(c(),x(W,{key:1,name:a.trailingIcon||e(t).trailingIcon||e(s).ui.icons.chevronDown,"data-slot":"linkTrailingIcon",class:q(o.value.linkTrailingIcon({class:[e(t).ui?.linkTrailingIcon,a.ui?.linkTrailingIcon],active:m}))},null,8,["name","class"])):a.trailingIcon?(c(),x(W,{key:2,name:a.trailingIcon,"data-slot":"linkTrailingIcon",class:q(o.value.linkTrailingIcon({class:[e(t).ui?.linkTrailingIcon,a.ui?.linkTrailingIcon],active:m}))},null,8,["name","class"])):N("",!0)])]),_:2},1032,["as","class","onClick"])):N("",!0)])]),_:3}),T(e(p),null,{default:h(({item:a,index:m,level:k=0,listIndex:$=0})=>[(c(),x(oe(e(t).orientation==="vertical"&&!e(t).collapsed?e(wt):e($t)),O({as:"li"},e(t).orientation==="vertical"&&!e(t).collapsed?{disabled:!!a.disabled}:{},{value:g(a,m,k,$)}),{default:h(()=>[e(t).orientation==="vertical"&&a.type==="label"&&!e(t).collapsed?(c(),R("div",{key:0,"data-slot":"label",class:q(o.value.label({class:[e(t).ui?.label,a.ui?.label,a.class]}))},[T(e(_),{item:a,index:m},null,8,["item","index"])],2)):a.type!=="label"?(c(),x(fe,O({key:1},e(t).orientation==="vertical"&&a.children?.length&&!e(t).collapsed&&a.type==="trigger"?{}:e(pe)(a),{custom:""}),{default:h(({active:z,...J})=>[(c(),x(oe(e(t).orientation==="horizontal"&&(a.children?.length||i[a.slot?`${a.slot}-content`:"item-content"])?e(Jt):e(t).orientation==="vertical"&&a.children?.length&&!e(t).collapsed&&!J.href?e(Ne):e(ge)),{"as-child":"",active:z||a.active,disabled:a.disabled,onSelect:a.onSelect},{default:h(()=>[e(t).orientation==="vertical"&&e(t).collapsed&&a.children?.length&&(e(t).popover||a.popover)?(c(),x(it,O({key:0},{...y.value,...typeof a.popover=="boolean"?{}:a.popover||{}},{ui:{content:o.value.content({class:[e(t).ui?.content,a.ui?.content]})}}),{content:h(({close:F})=>[D(v.$slots,a.slot?`${a.slot}-content`:"item-content",{item:a,active:z||a.active,index:m,ui:o.value,close:F},()=>[G("ul",{"data-slot":"childList",class:q(o.value.childList({class:[e(t).ui?.childList,a.ui?.childList]}))},[G("li",{"data-slot":"childLabel",class:q(o.value.childLabel({class:[e(t).ui?.childLabel,a.ui?.childLabel]}))},ee(e(Y)(a,e(t).labelKey)),3),(c(!0),R(j,null,ae(a.children,(H,U)=>(c(),R("li",{key:U,"data-slot":"childItem",class:q(o.value.childItem({class:[e(t).ui?.childItem,a.ui?.childItem]}))},[T(fe,O({ref_for:!0},e(pe)(H),{custom:""}),{default:h(({active:X,...We})=>[T(e(ge),{"as-child":"",active:X,onSelect:H.onSelect},{default:h(()=>[T(te,O({ref_for:!0},We,{"data-slot":"childLink",class:o.value.childLink({class:[e(t).ui?.childLink,a.ui?.childLink,H.class],active:X})}),{default:h(()=>[H.icon?(c(),x(W,{key:0,name:H.icon,"data-slot":"childLinkIcon",class:q(o.value.childLinkIcon({class:[e(t).ui?.childLinkIcon,a.ui?.childLinkIcon],active:X}))},null,8,["name","class"])):N("",!0),G("span",{"data-slot":"childLinkLabel",class:q(o.value.childLinkLabel({class:[e(t).ui?.childLinkLabel,a.ui?.childLinkLabel],active:X}))},[ce(ee(e(Y)(H,e(t).labelKey))+" ",1),H.target==="_blank"&&e(t).externalIcon!==!1?(c(),x(W,{key:0,name:typeof e(t).externalIcon=="string"?e(t).externalIcon:e(s).ui.icons.external,"data-slot":"childLinkLabelExternalIcon",class:q(o.value.childLinkLabelExternalIcon({class:[e(t).ui?.childLinkLabelExternalIcon,a.ui?.childLinkLabelExternalIcon],active:X}))},null,8,["name","class"])):N("",!0)],2)]),_:2},1040,["class"])]),_:2},1032,["active","onSelect"])]),_:2},1040)],2))),128))],2)])]),default:h(()=>[T(te,O(J,{"data-slot":"link",class:o.value.link({class:[e(t).ui?.link,a.ui?.link,a.class],active:z||a.active,disabled:!!a.disabled,level:k>0})}),{default:h(()=>[T(e(_),{item:a,active:z||a.active,index:m},null,8,["item","active","index"])]),_:2},1040,["class"])]),_:2},1040,["ui"])):e(t).orientation==="vertical"&&e(t).collapsed&&(e(t).tooltip||a.tooltip)||e(t).orientation==="horizontal"&&a.tooltip?(c(),x(ut,O({key:1,text:e(Y)(a,e(t).labelKey)},{...I.value,...typeof a.tooltip=="boolean"?{}:a.tooltip||{}}),{default:h(()=>[T(te,O(J,{"data-slot":"link",class:o.value.link({class:[e(t).ui?.link,a.ui?.link,a.class],active:z||a.active,disabled:!!a.disabled,level:k>0})}),{default:h(()=>[T(e(_),{item:a,active:z||a.active,index:m},null,8,["item","active","index"])]),_:2},1040,["class"])]),_:2},1040,["text"])):(c(),x(te,O({key:2},J,{"data-slot":"link",class:o.value.link({class:[e(t).ui?.link,a.ui?.link,a.class],active:z||a.active,disabled:!!a.disabled,level:e(t).orientation==="horizontal"||k>0})}),{default:h(()=>[T(e(_),{item:a,active:z||a.active,index:m},null,8,["item","active","index"])]),_:2},1040,["class"]))]),_:2},1064,["active","disabled","onSelect"])),e(t).orientation==="horizontal"&&(a.children?.length||i[a.slot?`${a.slot}-content`:"item-content"])?(c(),x(e(At),O({key:0},C.value,{"data-slot":"content",class:o.value.content({class:[e(t).ui?.content,a.ui?.content]})}),{default:h(()=>[D(v.$slots,a.slot?`${a.slot}-content`:"item-content",{item:a,active:z||a.active,index:m,ui:o.value},()=>[G("ul",{"data-slot":"childList",class:q(o.value.childList({class:[e(t).ui?.childList,a.ui?.childList]}))},[(c(!0),R(j,null,ae(a.children,(F,H)=>(c(),R("li",{key:H,"data-slot":"childItem",class:q(o.value.childItem({class:[e(t).ui?.childItem,a.ui?.childItem]}))},[T(fe,O({ref_for:!0},e(pe)(F),{custom:""}),{default:h(({active:U,...X})=>[T(e(ge),{"as-child":"",active:U,onSelect:F.onSelect},{default:h(()=>[T(te,O({ref_for:!0},X,{"data-slot":"childLink",class:o.value.childLink({class:[e(t).ui?.childLink,a.ui?.childLink,F.class],active:U})}),{default:h(()=>[F.icon?(c(),x(W,{key:0,name:F.icon,"data-slot":"childLinkIcon",class:q(o.value.childLinkIcon({class:[e(t).ui?.childLinkIcon,a.ui?.childLinkIcon],active:U}))},null,8,["name","class"])):N("",!0),G("div",{"data-slot":"childLinkWrapper",class:q(o.value.childLinkWrapper({class:[e(t).ui?.childLinkWrapper,a.ui?.childLinkWrapper]}))},[G("p",{"data-slot":"childLinkLabel",class:q(o.value.childLinkLabel({class:[e(t).ui?.childLinkLabel,a.ui?.childLinkLabel],active:U}))},[ce(ee(e(Y)(F,e(t).labelKey))+" ",1),F.target==="_blank"&&e(t).externalIcon!==!1?(c(),x(W,{key:0,name:typeof e(t).externalIcon=="string"?e(t).externalIcon:e(s).ui.icons.external,"data-slot":"childLinkLabelExternalIcon",class:q(o.value.childLinkLabelExternalIcon({class:[e(t).ui?.childLinkLabelExternalIcon,a.ui?.childLinkLabelExternalIcon],active:U}))},null,8,["name","class"])):N("",!0)],2),F.description?(c(),R("p",{key:0,"data-slot":"childLinkDescription",class:q(o.value.childLinkDescription({class:[e(t).ui?.childLinkDescription,a.ui?.childLinkDescription],active:U}))},ee(F.description),3)):N("",!0)],2)]),_:2},1040,["class"])]),_:2},1032,["active","onSelect"])]),_:2},1040)],2))),128))],2)])]),_:2},1040,["class"])):N("",!0)]),_:2},1040)):N("",!0),e(t).orientation==="vertical"&&a.children?.length&&!e(t).collapsed?(c(),x(e(Tt),{key:2,"data-slot":"content",class:q(o.value.content({class:[e(t).ui?.content,a.ui?.content]}))},{default:h(()=>[T(e(De),O({...e(f),defaultValue:b(a.children,k+1,$)},{as:"ul","data-slot":"childList",class:o.value.childList({class:[e(t).ui?.childList,a.ui?.childList]})}),{default:h(()=>[(c(!0),R(j,null,ae(a.children,(z,J)=>(c(),x(e(L),{key:J,item:z,index:J,level:k+1,"list-index":$,"data-slot":"childItem",class:q(o.value.childItem({class:[e(t).ui?.childItem,z.ui?.childItem]}))},null,8,["item","index","level","list-index","class"]))),128))]),_:2},1040,["class"])]),_:2},1032,["class"])):N("",!0)]),_:2},1040,["value"]))]),_:3}),T(e(Nt),O({"data-slot":"root"},{...e(d),...e(t).orientation==="horizontal"?{modelValue:e(t).modelValue,defaultValue:e(t).defaultValue}:{},...v.$attrs},{"data-collapsed":e(t).collapsed,class:o.value.root({class:[e(t).ui?.root,e(t).class]})}),{default:h(()=>[D(v.$slots,"list-leading"),(c(!0),R(j,null,ae(S.value,(a,m)=>(c(),R(j,{key:`list-${m}`},[(c(),x(oe(e(t).orientation==="vertical"?e(De):e(Wt)),O({ref_for:!0},e(t).orientation==="vertical"&&!e(t).collapsed?{...e(f),modelValue:e(t).modelValue,defaultValue:e(t).defaultValue??b(a,0,m)}:{},{as:"ul","data-slot":"list",class:o.value.list({class:e(t).ui?.list})}),{default:h(()=>[(c(!0),R(j,null,ae(a,(k,$)=>(c(),x(e(L),{key:`list-${m}-${$}`,item:k,index:$,"list-index":m,"data-slot":"item",class:q(o.value.item({class:[e(t).ui?.item,k.ui?.item]}))},null,8,["item","index","list-index","class"]))),128))]),_:2},1040,["class"])),e(t).orientation==="vertical"&&m<S.value.length-1?(c(),R("div",{key:0,"data-slot":"separator",class:q(o.value.separator({class:e(t).ui?.separator}))},null,2)):N("",!0)],64))),128)),D(v.$slots,"list-trailing"),e(t).orientation==="horizontal"?(c(),R("div",{key:0,"data-slot":"viewportWrapper",class:q(o.value.viewportWrapper({class:e(t).ui?.viewportWrapper}))},[e(t).arrow?(c(),x(e(Kt),{key:0,"data-slot":"indicator",class:q(o.value.indicator({class:e(t).ui?.indicator}))},{default:h(()=>[G("div",{"data-slot":"arrow",class:q(o.value.arrow({class:e(t).ui?.arrow}))},null,2)]),_:1},8,["class"])):N("",!0),T(e(Yt),{"data-slot":"viewport",class:q(o.value.viewport({class:e(t).ui?.viewport}))},null,8,["class"])],2)):N("",!0)]),_:3},16,["data-collapsed","class"])],64))}});export{ta as _};
@@ -1 +0,0 @@
1
- import{d as T,o as r,c as x,j as p,k as a,p as U,t as E,v as b,i as k,f as _,g as y,m as L,_ as j,h as w,s as N,r as h,J as O,F as S,y as Z,C as D,E as R,l as I,K as J}from"./C5TrTuWv.js";import{a as K}from"./T5UuMUxA.js";const M=[{provider:"jira",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/browse\//i,/^https:\/\/[^/]+\/jira\/software\/c\/projects\//i,/^https:\/\/[^/]+\/.+\/browse\//i],keyExtract:/\/([A-Z][A-Z0-9_]+-\d+)(?:\?|$|#)/i},{provider:"github-issue",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"github-pr",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\//i],keyExtract:/\/pull\/(\d+)/},{provider:"gitlab-issue",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"gitlab-mr",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/merge_requests\//i],keyExtract:/\/merge_requests\/(\d+)/},{provider:"bitbucket",tests:[/^https:\/\/bitbucket\.org\/[^/]+\/[^/]+\/pull-requests\//i],keyExtract:/\/pull-requests\/(\d+)/},{provider:"confluence",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/wiki\//i]},{provider:"slack",tests:[/^https:\/\/[^/]+\.slack\.com\//i]},{provider:"linear",tests:[/^https:\/\/linear\.app\//i],keyExtract:/\/([A-Za-z]+-\d+)(?:\/|\?|$|#)/},{provider:"notion",tests:[/^https:\/\/(www\.)?notion\.so\//i]}];function G(t){for(const c of M)if(c.tests.some(e=>e.test(t)))return c.provider;return"generic"}function z(t){return{jira:"i-simple-icons-jira","github-issue":"i-simple-icons-github","github-pr":"i-simple-icons-github","gitlab-issue":"i-simple-icons-gitlab","gitlab-mr":"i-simple-icons-gitlab",bitbucket:"i-simple-icons-bitbucket",confluence:"i-simple-icons-confluence",slack:"i-simple-icons-slack",linear:"i-simple-icons-linear",notion:"i-simple-icons-notion",generic:"i-lucide-link"}[t]}const H={class:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 group hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"},Q={key:0,class:"font-mono text-primary font-medium"},W=["title"],X=T({__name:"LinkChip",props:{link:{},removable:{type:Boolean}},emits:["remove"],setup(t,{emit:c}){const e=t,v=c,g=w(()=>e.link.title||e.link.key||e.link.url.replace(/^https?:\/\//,"").slice(0,50)),o=w(()=>z(e.link.provider));return(s,l)=>{const d=U,f=N,m=j;return r(),x("span",H,[p(d,{name:a(o),class:"w-3.5 h-3.5 shrink-0"},null,8,["name"]),t.link.key?(r(),x("span",Q,E(t.link.key),1)):b("",!0),k("span",{class:"max-w-48 truncate",title:t.link.title||t.link.url},E(a(g)),9,W),t.link.statusText?(r(),_(f,{key:1,color:t.link.statusColor||"neutral",variant:"subtle",size:"xs"},{default:y(()=>[L(E(t.link.statusText),1)]),_:1},8,["color"])):b("",!0),p(m,{to:t.link.url,target:"_blank",size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-external-link",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1"},null,8,["to"]),t.removable?(r(),_(m,{key:2,size:"xs",variant:"ghost",color:"error",icon:"i-lucide-x",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1",onClick:l[0]||(l[0]=C=>v("remove",t.link.id))})):b("",!0)])}}}),Y=Object.assign(X,{__name:"LinkChip"}),tt={class:"flex flex-wrap items-center gap-1.5"},et={class:"relative"},it={class:"flex justify-end gap-2"},st=T({__name:"EntityLinks",props:{entityType:{},entityId:{},links:{}},emits:["updated"],setup(t,{emit:c}){const e=t,v=c,{copy:g}=K(),o=h(e.links??[]),s=h(""),l=h(!1),d=h(!1),f=w(()=>{try{return s.value?G(s.value):null}catch{return null}}),m=w(()=>f.value?z(f.value):null);async function C(){const n=await $fetch("/api/links",{params:{entityType:e.entityType,entityId:e.entityId}});o.value=n.links}async function B(){if(!(!s.value||d.value)){d.value=!0;try{const n=await $fetch("/api/links",{method:"POST",body:{entityType:e.entityType,entityId:e.entityId,url:s.value}});o.value.push(n.link),s.value="",l.value=!1,v("updated")}catch(n){g(n?.data?.message||"Failed to add link",{toast:!0})}finally{d.value=!1}}}async function V(n){try{await $fetch(`/api/links/${n}`,{method:"DELETE"}),o.value=o.value.filter(i=>i.id!==n),v("updated")}catch{g("Failed to remove link",{toast:!0})}}return O(()=>[e.entityType,e.entityId],()=>{e.links?o.value=e.links:C()},{immediate:!0}),(n,i)=>{const A=Y,$=j,P=R,q=U,F=J;return r(),x("div",tt,[(r(!0),x(S,null,Z(a(o),u=>(r(),_(A,{key:u.id,link:u,removable:"",onRemove:V},null,8,["link"]))),128)),p(F,{open:a(l),"onUpdate:open":i[2]||(i[2]=u=>I(l)?l.value=u:null)},{content:y(()=>[k("form",{class:"p-3 space-y-3 min-w-72",onSubmit:D(B,["prevent"])},[i[5]||(i[5]=k("p",{class:"text-sm font-medium"},"Add link",-1)),k("div",et,[p(P,{modelValue:a(s),"onUpdate:modelValue":i[0]||(i[0]=u=>I(s)?s.value=u:null),placeholder:"https://...",size:"sm",class:"w-full",autofocus:""},null,8,["modelValue"]),a(m)?(r(),_(q,{key:0,name:a(m),class:"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"},null,8,["name"])):b("",!0)]),k("div",it,[p($,{size:"xs",variant:"ghost",color:"neutral",onClick:i[1]||(i[1]=u=>l.value=!1)},{default:y(()=>[...i[3]||(i[3]=[L(" Cancel ",-1)])]),_:1}),p($,{size:"xs",color:"primary",type:"submit",loading:a(d),disabled:!a(s).trim()},{default:y(()=>[...i[4]||(i[4]=[L(" Add ",-1)])]),_:1},8,["loading","disabled"])])],32)]),default:y(()=>[p($,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-plus",class:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",title:"Add link"})]),_:1},8,["open"])])}}}),ot=Object.assign(st,{__name:"EntityLinks"});export{ot as _};
@@ -1 +0,0 @@
1
- import{a3 as se,a5 as ie,aU as oe,aP as ue,ao as z,aV as H,aW as X,B as Y,L as le,ad as fe,r as j,M,h as x,aX as R,o as ce,f as de,g as me,V as pe,C as ye,q as ve,k as g,ag as he,aY as Ee,a8 as be,N as w,aZ as ge,a_ as we,a$ as Se,b0 as Fe}from"./C5TrTuWv.js";function Ie(n){return"schema"in n&&typeof n.coercer=="function"&&typeof n.validator=="function"&&typeof n.refiner=="function"}function qe(n){return"~standard"in n}async function je(n,i){const f=await i["~standard"].validate(n);return f.issues?{errors:f.issues?.map(u=>({name:u.path?.map(o=>typeof o=="object"?o.key:o).join(".")||"",message:u.message}))||[],result:null}:{errors:null,result:f.value}}async function xe(n,i){const[f,u]=i.validate(n);return f?{errors:f.failures().map(r=>({message:r.message,name:r.path.join(".")})),result:null}:{errors:null,result:u}}function Be(n,i){if(qe(i))return je(n,i);if(Ie(i))return xe(n,i);throw new Error("Form validation failed: Unsupported form schema")}function Ne(n,i){return i?i.split(".").reduce((u,o)=>u?.[o],n):n}function Oe(n,i,f){if(!i)return Object.assign(n,f);if(!n)return n;const u=i.split(".");let o=n;for(let y=0;y<u.length-1;y++){const v=u[y];(o[v]===void 0||o[v]===null)&&(y+1<u.length&&!Number.isNaN(Number(u[y+1]))?o[v]=[]:o[v]={}),o=o[v]}const r=u[u.length-1];return o[r]=f,n}class B extends Error{formId;errors;constructor(i,f){super("Form validation exception"),this.formId=i,this.errors=f,Object.setPrototypeOf(this,B.prototype)}}const ke={base:""},_e={__name:"UForm",props:{id:{type:[String,Number],required:!1},schema:{type:null,required:!1},state:{type:null,required:!1},validate:{type:Function,required:!1},validateOn:{type:Array,required:!1,default(){return["input","blur","change"]}},disabled:{type:Boolean,required:!1},name:{type:String,required:!1},validateOnInputDelay:{type:Number,required:!1,default:300},transform:{type:null,required:!1,default:()=>!0},nested:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},onSubmit:{type:Function,required:!1}},emits:["submit","error"],setup(n,{expose:i,emit:f}){const u=n,o=f,r=se("form",u),y=ie(),v=x(()=>be({extend:ke,...y.ui?.form||{}})),S=r.id??oe(),_=ue("formRef"),A=Ee(`form-${S}`),E=r.nested===!0&&z(H,void 0),C=r.nested===!0?z(X,void 0):void 0,F=x(()=>C?.value?r.name?Ne(C.value,r.name):C.value:r.state);w(H,A),w(X,F);const I=j(new Map);Y(async()=>{E&&(await le(),E.emit({type:"attach",validate:q,formId:S,name:r.name,api:$}))}),fe(()=>{A.reset(),E&&E.emit({type:"detach",formId:S})}),Y(async()=>{A.on(async e=>{e.type==="attach"?I.value.set(e.formId,{validate:e.validate,name:e.name,api:e.api}):e.type==="detach"?I.value.delete(e.formId):r.validateOn?.includes(e.type)&&!h.value&&(e.type!=="input"?await q({name:e.name,silent:!0,nested:!1}):(e.eager||K.has(e.name))&&await q({name:e.name,silent:!0,nested:!1})),e.type==="blur"&&K.add(e.name),(e.type==="change"||e.type==="input"||e.type==="blur"||e.type==="focus")&&T.add(e.name),(e.type==="change"||e.type==="input")&&O.add(e.name)})});const l=j([]);w(ge,l);const N=j({});w(we,N);const O=M(new Set),T=M(new Set),K=M(new Set);function W(e){return e.map(t=>({...t,id:t?.name?N.value[t.name]?.id:void 0}))}const k=j(null);async function Z(){let e=r.validate?await r.validate(F.value)??[]:[];if(r.schema){const{errors:t,result:a}=await Be(F.value,r.schema);t?e=e.concat(t):k.value=a}return W(e)}async function q(e={silent:!1,nested:!1,transform:!1}){const t=e.name&&!Array.isArray(e.name)?[e.name]:e.name;let a=[],s=[];if(!t&&e.nested){const p=Array.from(I.value.values()).map(m=>G(m,e)),d=await Promise.all(p);s=d.filter(m=>m.error).flatMap(m=>m.error.errors.map(ne=>J(ne,m.name))),a=d.filter(m=>m.output!==void 0)}const b=[...await Z(),...s];if(t?l.value=ae(b,t):l.value=b,l.value?.length){if(e.silent)return!1;throw new B(S,l.value)}return e.transform?(a.forEach(p=>{p.name?Oe(k.value,p.name,p.output):Object.assign(k.value,p.output)}),k.value??F.value):F.value}const h=j(!1);w(Se,R(h));async function D(e){h.value=!!r.loadingAuto;const t=e;try{t.data=await q({nested:!0,transform:r.transform}),await r.onSubmit?.(t),O.clear()}catch(a){if(!(a instanceof B))throw a;const s={...t,errors:a.errors};o("error",s)}finally{h.value=!1}}const L=x(()=>r.disabled||h.value);w(Fe,x(()=>({disabled:L.value,validateOnInputDelay:r.validateOnInputDelay})));async function G(e,t){try{const a=await e.validate({...t,silent:!1});return{name:e.name,output:a}}catch(a){if(!(a instanceof B))throw a;return{name:e.name,error:a}}}function J(e,t){return!t||!e.name?e:{...e,name:t+"."+e.name}}function Q(e,t){const a=t+".",s=e?.name?.startsWith(a)?e.name.substring(a.length):e.name;return{...e,name:s}}function ee(e,t){return t?e.filter(a=>a?.name?.startsWith(t+".")).map(a=>Q(a,t)):e}function U(e){return e.api.getErrors().map(t=>e.name?{...t,name:e.name+"."+t.name}:t)}function P(e,t){return!e||!t?!0:e instanceof RegExp?e.test(t):t===e||typeof e=="string"&&e.startsWith(t+".")}function te(e,t){if(!e||e instanceof RegExp)return e;if(t!==e)return typeof e=="string"&&e.startsWith(t+".")?e.substring(t.length+1):e}function ae(e,t){const a=new Set(t),s=t.map(d=>N.value?.[d]?.pattern).filter(Boolean),c=d=>d.name?a.has(d.name)?!0:s.some(m=>m.test(d.name)):!1,b=l.value.filter(d=>!c(d)),p=e.filter(c);return[...b,...p]}function re(e,t){return e.filter(a=>t instanceof RegExp?!(a.name&&t.test(a.name)):!a.name||a.name!==t)}function V(e){return!e.name||!!N.value[e.name]}const $={validate:q,errors:l,setErrors(e,t){const a=W(e.filter(V)),s=[];for(const c of I.value.values())if(P(t,c.name)){const b=ee(e,c.name);c.api.setErrors(b,te(t,c.name||"")),s.push(...U(c))}if(t){const c=re(l.value,t);l.value=[...c,...a,...s]}else l.value=[...a,...s]},async submit(){_.value instanceof HTMLFormElement&&_.value.reportValidity()===!1||await D(new Event("submit"))},getErrors(e){return e?l.value.filter(t=>e instanceof RegExp?t.name&&e.test(t.name):t.name===e):l.value},clear(e){const t=e?l.value.filter(s=>V(s)&&(e instanceof RegExp?!(s.name&&e.test(s.name)):s.name!==e)):[],a=[];for(const s of I.value.values())P(e,s.name)&&s.api.clear(),a.push(...U(s));l.value=[...t,...a]},disabled:L,loading:h,dirty:x(()=>!!O.size),dirtyFields:R(O),blurredFields:R(K),touchedFields:R(T)};return i($),(e,t)=>(ce(),de(he(g(E)?"div":"form"),{id:g(S),ref_key:"formRef",ref:_,name:g(E)?void 0:g(r).name,method:"post",class:ve(v.value({class:[g(r).ui?.base,g(r).class]})),onSubmit:ye(D,["prevent"])},{default:me(()=>[pe(e.$slots,"default",{errors:l.value,loading:h.value})]),_:3},40,["id","name","class"]))}};export{_e as _};
@@ -1 +0,0 @@
1
- import{h}from"./C5TrTuWv.js";function r(s){if(!s.location)return s.title;const o=s.location.match(/^(.*):(\d+):(\d+)$/);return`${o?o[1]:s.location}::${s.title}`}function C(s,o){const c=h(()=>{if(!s.value?.testCases||!o.value?.testCases)return[];const d=new Map;for(const t of s.value.testCases)d.set(r(t),t);const u=[];for(const t of o.value.testCases){const a=d.get(r(t)),l=a?.duration??null,n=t.duration??null;let e=null,f=null;l!==null&&n!==null&&(e=n-l,f=l>0?Math.round((n-l)/l*100):null),u.push({title:t.title,location:t.location??null,statusA:a?.status??null,statusB:t.status,durationA:l,durationB:n,delta:e,percentChange:f})}const i=new Set(o.value.testCases.map(r));for(const t of s.value.testCases)i.has(r(t))||u.push({title:t.title,location:t.location??null,statusA:t.status,statusB:null,durationA:t.duration??null,durationB:null,delta:null,percentChange:null});return u.sort((t,a)=>Math.abs(a.delta??0)-Math.abs(t.delta??0))}),p=h(()=>{let u=0,i=0,t=0,a=0,l=0,n=0;for(const e of c.value)e.statusA==="passed"&&e.statusB==="failed"?a++:e.statusA==="failed"&&e.statusB==="passed"?l++:e.statusA==="failed"&&e.statusB==="failed"&&n++,e.percentChange!==null&&(e.percentChange<-10?u++:e.percentChange>10?i++:t++);return{improved:u,regressed:i,unchanged:t,newFailures:a,recovered:l,stillFailing:n}});return{comparisonData:c,comparisonSummary:p}}export{C as u};
@@ -1 +0,0 @@
1
- import{a2 as W,a3 as X,Z,a5 as Y,aN as ee,aO as ie,aP as ae,J as se,B as le,L as w,o as n,f as d,g as te,i as ne,W as B,k as i,V as b,c as k,q as r,p as A,aK as re,v as g,X as oe,h as ue,aQ as de,a8 as ge}from"./C5TrTuWv.js";const ce={slots:{root:"relative inline-flex items-center",base:["w-full rounded-md border-0 appearance-none placeholder:text-dimmed disabled:cursor-not-allowed disabled:opacity-75","transition-colors"],leading:"absolute start-0 flex items-start",leadingIcon:"shrink-0 text-dimmed",leadingAvatar:"shrink-0",leadingAvatarSize:"",trailing:"absolute end-0 flex items-start",trailingIcon:"shrink-0 text-dimmed"},variants:{fieldGroup:{horizontal:{root:"group has-focus-visible:z-[1]",base:"group-not-only:group-first:rounded-e-none group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none"},vertical:{root:"group has-focus-visible:z-[1]",base:"group-not-only:group-first:rounded-b-none group-not-only:group-last:rounded-t-none group-not-last:group-not-first:rounded-none"}},size:{xs:{base:"px-2 py-1 text-sm/4 gap-1",leading:"ps-2 inset-y-1",trailing:"pe-2 inset-y-1",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},sm:{base:"px-2.5 py-1.5 text-sm/4 gap-1.5",leading:"ps-2.5 inset-y-1.5",trailing:"pe-2.5 inset-y-1.5",leadingIcon:"size-4",leadingAvatarSize:"3xs",trailingIcon:"size-4"},md:{base:"px-2.5 py-1.5 text-base/5 gap-1.5",leading:"ps-2.5 inset-y-1.5",trailing:"pe-2.5 inset-y-1.5",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},lg:{base:"px-3 py-2 text-base/5 gap-2",leading:"ps-3 inset-y-2",trailing:"pe-3 inset-y-2",leadingIcon:"size-5",leadingAvatarSize:"2xs",trailingIcon:"size-5"},xl:{base:"px-3 py-2 text-base gap-2",leading:"ps-3 inset-y-2",trailing:"pe-3 inset-y-2",leadingIcon:"size-6",leadingAvatarSize:"xs",trailingIcon:"size-6"}},variant:{outline:"text-highlighted bg-default ring ring-inset ring-accented",soft:"text-highlighted bg-elevated/50 hover:bg-elevated focus:bg-elevated disabled:bg-elevated/50",subtle:"text-highlighted bg-elevated ring ring-inset ring-accented",ghost:"text-highlighted bg-transparent hover:bg-elevated focus:bg-elevated disabled:bg-transparent dark:disabled:bg-transparent",none:"text-highlighted bg-transparent focus:outline-none"},color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},leading:{true:""},trailing:{true:""},loading:{true:""},highlight:{true:""},fixed:{false:""},type:{file:"file:me-1.5 file:font-medium file:text-muted file:outline-none"},autoresize:{true:{base:"resize-none"}}},compoundVariants:[{color:"primary",variant:["outline","subtle"],class:"outline-primary/25 focus-visible:outline-3 focus-visible:ring-primary"},{color:"secondary",variant:["outline","subtle"],class:"outline-secondary/25 focus-visible:outline-3 focus-visible:ring-secondary"},{color:"success",variant:["outline","subtle"],class:"outline-success/25 focus-visible:outline-3 focus-visible:ring-success"},{color:"info",variant:["outline","subtle"],class:"outline-info/25 focus-visible:outline-3 focus-visible:ring-info"},{color:"warning",variant:["outline","subtle"],class:"outline-warning/25 focus-visible:outline-3 focus-visible:ring-warning"},{color:"error",variant:["outline","subtle"],class:"outline-error/25 focus-visible:outline-3 focus-visible:ring-error"},{color:"primary",variant:["soft","ghost"],class:"outline-primary/25 focus-visible:outline-3"},{color:"secondary",variant:["soft","ghost"],class:"outline-secondary/25 focus-visible:outline-3"},{color:"success",variant:["soft","ghost"],class:"outline-success/25 focus-visible:outline-3"},{color:"info",variant:["soft","ghost"],class:"outline-info/25 focus-visible:outline-3"},{color:"warning",variant:["soft","ghost"],class:"outline-warning/25 focus-visible:outline-3"},{color:"error",variant:["soft","ghost"],class:"outline-error/25 focus-visible:outline-3"},{color:"primary",highlight:!0,class:"ring ring-inset ring-primary"},{color:"secondary",highlight:!0,class:"ring ring-inset ring-secondary"},{color:"success",highlight:!0,class:"ring ring-inset ring-success"},{color:"info",highlight:!0,class:"ring ring-inset ring-info"},{color:"warning",highlight:!0,class:"ring ring-inset ring-warning"},{color:"error",highlight:!0,class:"ring ring-inset ring-error"},{color:"neutral",variant:["outline","subtle"],class:"outline-inverted/25 focus-visible:outline-3 focus-visible:ring-inverted"},{color:"neutral",variant:["soft","ghost"],class:"outline-inverted/25 focus-visible:outline-3"},{color:"neutral",highlight:!0,class:"ring ring-inset ring-inverted"},{leading:!0,size:"xs",class:"ps-7"},{leading:!0,size:"sm",class:"ps-8"},{leading:!0,size:"md",class:"ps-9"},{leading:!0,size:"lg",class:"ps-10"},{leading:!0,size:"xl",class:"ps-11"},{trailing:!0,size:"xs",class:"pe-7"},{trailing:!0,size:"sm",class:"pe-8"},{trailing:!0,size:"md",class:"pe-9"},{trailing:!0,size:"lg",class:"pe-10"},{trailing:!0,size:"xl",class:"pe-11"},{loading:!0,leading:!0,class:{leadingIcon:"animate-spin"}},{loading:!0,leading:!1,trailing:!0,class:{trailingIcon:"animate-spin"}},{fixed:!1,size:"xs",class:"md:text-xs"},{fixed:!1,size:"sm",class:"md:text-xs"},{fixed:!1,size:"md",class:"md:text-sm"},{fixed:!1,size:"lg",class:"md:text-sm"}],defaultVariants:{size:"md",color:"primary",variant:"outline"}},fe=["id","value","name","rows","placeholder","disabled","required"],me=Object.assign({inheritAttrs:!1},{__name:"UTextarea",props:{as:{type:null,required:!1},id:{type:String,required:!1},name:{type:String,required:!1},placeholder:{type:String,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},size:{type:null,required:!1},required:{type:Boolean,required:!1},autofocus:{type:Boolean,required:!1},autofocusDelay:{type:Number,required:!1,default:0},autoresize:{type:Boolean,required:!1},autoresizeDelay:{type:Number,required:!1,default:0},disabled:{type:Boolean,required:!1},rows:{type:Number,required:!1,default:3},maxrows:{type:Number,required:!1,default:0},highlight:{type:Boolean,required:!1},fixed:{type:Boolean,required:!1},defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1},modelModifiers:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1}},emits:["update:modelValue","blur","change"],setup(S,{expose:V,emit:N}){const h=S,c=N,o=W(),e=X("textarea",h),f=Z(e,"modelValue",c,{defaultValue:e.defaultValue}),M=Y(),{emitFormFocus:y,emitFormBlur:C,emitFormInput:F,emitFormChange:T,size:_,color:$,id:R,name:D,highlight:O,disabled:P,ariaAttrs:j}=ee(h,{deferInputValidation:!0}),{isLeading:p,isTrailing:x,leadingIconName:z,trailingIconName:q}=ie(e),s=ue(()=>ge({extend:ce,...M.ui?.textarea||{}})({color:$.value??e.color,variant:e.variant,size:_?.value??e.size,loading:e.loading,highlight:O.value??e.highlight,fixed:e.fixed,autoresize:e.autoresize,leading:p.value||!!e.avatar||!!o.leading,trailing:x.value||!!o.trailing})),l=ae("textareaRef");function I(a){e.modelModifiers?.trim&&(typeof a=="string"||a===null||a===void 0)&&(a=a?.trim()??null),e.modelModifiers?.number&&(a=de(a)),e.modelModifiers?.nullable&&(a||=null),e.modelModifiers?.optional&&!e.modelModifiers?.nullable&&a!==null&&(a||=void 0),f.value=a,F()}function H(a){u(),e.modelModifiers?.lazy||I(a.target.value)}function L(a){const t=a.target.value;e.modelModifiers?.lazy&&I(t),e.modelModifiers?.trim&&(a.target.value=t.trim()),T(),c("change",a)}function E(a){C(),c("blur",a)}function G(){e.autofocus&&l.value?.focus()}function u(){if(e.autoresize&&l.value){l.value.rows=e.rows;const a=l.value.style.overflow;l.value.style.overflow="hidden";const t=window.getComputedStyle(l.value),m=Number.parseInt(t.paddingTop),J=Number.parseInt(t.paddingBottom),K=m+J,Q=Number.parseInt(t.lineHeight),{scrollHeight:U}=l.value,v=(U-K)/Q;v>e.rows&&(l.value.rows=e.maxrows?Math.min(v,e.maxrows):v),l.value.style.overflow=a}}return se(f,()=>{w(u)}),le(()=>{setTimeout(()=>{G()},e.autofocusDelay),setTimeout(async()=>{await w(),u()},e.autoresizeDelay)}),V({textareaRef:l,autoResize:u}),(a,t)=>(n(),d(i(oe),{as:i(e).as,"data-slot":a.$attrs["data-slot"]??"root",class:r(s.value.root({class:[i(e).ui?.root,i(e).class]}))},{default:te(()=>[ne("textarea",B({id:i(R),ref_key:"textareaRef",ref:l,value:i(f),name:i(D),rows:i(e).rows,placeholder:i(e).placeholder,class:s.value.base({class:i(e).ui?.base}),disabled:i(P),required:i(e).required},{...a.$attrs,...i(j)},{"data-slot":"base",onInput:H,onBlur:E,onChange:L,onFocus:t[0]||(t[0]=(...m)=>i(y)&&i(y)(...m))}),null,16,fe),b(a.$slots,"default",{ui:s.value}),i(p)||i(e).avatar||o.leading?(n(),k("span",{key:0,"data-slot":"leading",class:r(s.value.leading({class:i(e).ui?.leading}))},[b(a.$slots,"leading",{ui:s.value},()=>[i(p)&&i(z)?(n(),d(A,{key:0,name:i(z),"data-slot":"leadingIcon",class:r(s.value.leadingIcon({class:i(e).ui?.leadingIcon}))},null,8,["name","class"])):i(e).avatar?(n(),d(re,B({key:1,size:i(e).ui?.leadingAvatarSize||s.value.leadingAvatarSize()},i(e).avatar,{"data-slot":"leadingAvatar",class:s.value.leadingAvatar({class:i(e).ui?.leadingAvatar})}),null,16,["size","class"])):g("",!0)])],2)):g("",!0),i(x)||o.trailing?(n(),k("span",{key:1,"data-slot":"trailing",class:r(s.value.trailing({class:i(e).ui?.trailing}))},[b(a.$slots,"trailing",{ui:s.value},()=>[i(q)?(n(),d(A,{key:0,name:i(q),"data-slot":"trailingIcon",class:r(s.value.trailingIcon({class:i(e).ui?.trailingIcon}))},null,8,["name","class"])):g("",!0)])],2)):g("",!0)]),_:3},8,["as","data-slot","class"]))}});export{me as _};
@@ -1 +0,0 @@
1
- const t={"home.flaky":{title:"Flaky tests",text:"Tests that pass and fail without code changes. This counts how many were detected across your projects recently.",doc:"flaky-tests#flaky-test-detection"},"home.trend-bars":{title:"Run history bars",text:"One bar per full run (up to 20), oldest left → newest right. Green = pass, red = fail, amber = passed with flaky tests, gray = skipped/unknown. Click a bar to open that run.",doc:"ui-overview#home"},"home.tendency":{title:"Tendency",text:"Derived from the last 5 full runs. Failing = latest run failed; flaky = pass/fail mixed or flaky tests seen in the window; passing = all recent runs green.",doc:"ui-overview#home"},"home.project-health":{title:"Project health",text:"Every project at a glance — run history bars and a tendency badge so you can immediately see which project needs attention. Only full runs count.",doc:"ui-overview#home"},"home.get-started":{title:"Get started",text:"Wire the Piwi reporter into your Playwright config to start sending results here. The wizard generates the snippet for you.",doc:"getting-started#using-the-piwi-dashboard-reporter"},"analytics.insights":{title:"Insights",text:"Auto-generated findings over the selected period — pass-rate drops, failing streaks, stale clusters, wasted CI time. Ranked by severity; click one to jump to the source."},"analytics.portfolio":{title:"Portfolio health",text:"Every project over the selected period: pass rate with its change vs the previous period, flaky volume, open failure clusters, and the latest run. Worst health sorts first."},"analytics.heatmap":{title:"Pass rate heatmap",text:"Each cell is the aggregate pass rate of one project over one time bucket — green is healthy, red is broken, gray means no runs. Longer periods use wider buckets."},"analytics.ci-time":{title:"CI time",text:"Total minutes your test runs consumed, over time, with the change vs the previous equal-length period. Steady growth here is a capacity conversation."},"analytics.wasted-time":{title:"Wasted CI time",text:"Minutes that produced no signal: time inside wait steps plus time executing attempts that ended failed or timed out. The strongest argument for fixing slow waits and flaky tests."},"analytics.flaky-leaderboard":{title:"Flakiest tests",text:"The worst flaky tests across all projects, using the same scoring as each project’s Flaky tests tab, sorted by wasted-CI impact.",doc:"flaky-tests#flaky-test-detection"},"analytics.cluster-landscape":{title:"Failure clusters",text:"Open failure clusters across all projects — the biggest and oldest unresolved root causes. Clusters outlive run retention, so this works on long horizons.",doc:"ai-diagnosis#failure-clustering"},"analytics.regression-velocity":{title:"Regression velocity",text:"How much new breakage each period introduces: tests that passed in a baseline and now fail (regressions), plus tests that turned flaky. Rising bars mean quality debt is accumulating.",doc:"flaky-tests#regression-signals"},"analytics.browser-matrix":{title:"Browser matrix",text:"Pass rate per project × browser, so a suite that is green on one browser but failing on another (a browser-specific bug) stands out immediately."},"analytics.slow-endpoints":{title:"Slow endpoints",text:"Backend calls captured during tests, aggregated across all projects by route: p50/p90 latency, error rate, and how many projects hit each one — a shared endpoint regressing shows up here first.",doc:"capture-fixtures"},"projects.tag-filter":{text:"Filter projects by tag. Selecting several tags uses OR logic — a project matching any of them is shown."},"projects.table":{title:"Projects",text:"Every project that has reported results, with its latest run, pass rate and activity. Click a row to drill in.",doc:"ui-overview#projects"},"project.import":{title:"Importing past runs",text:"Upload the archives Playwright writes to blob-report/ to backfill runs from before you adopted Piwi. One archive becomes one run, complete with traces and screenshots, and re-uploading the same archive changes nothing. Imports are silent by design — no notifications, AI diagnosis or regression signals, so a backfill never pages the team about months-old failures.",doc:"importing-runs",envVars:["PIWI_IMPORT_MAX_BYTES"]},"project.run-scope":{title:"Full vs partial runs",text:"A partial run executed only a subset of the suite (a shard, a retry, or a filtered selection). Trends use full runs so partial results don’t skew the numbers.",doc:"ui-overview#test-run-detail"},"project.runs-trend":{title:"Run trend",text:"Pass/fail counts per run over time. Hover a point for the exact run; sudden drops mark where things broke.",doc:"ui-overview#project-detail"},"project.flaky-tests":{title:"Flaky tests",text:"Tests that fail intermittently across runs. Impact estimates wasted CI time; the score (0–100) rates severity and root cause explains why.",doc:"flaky-tests#flaky-test-detection"},"project.quarantine":{title:"Quarantine",text:"A quarantined test still runs and still reports — it is only excluded from the CI gate’s verdict. Passing runs accumulate as a streak, so a test that recovers is flagged ready to release instead of staying quarantined forever.",doc:"flaky-tests#quarantine-with-a-way-out"},"project.performance":{title:"Performance",text:"Duration trends for the suite — average and P90 (the slowest 10% threshold). Use it to catch tests getting steadily slower.",doc:"flaky-tests#performance"},"project.timeline":{title:"Timeline markers",text:"Dated events — deploys, config changes, infra migrations, incidents — overlaid as vertical lines on the trend charts, so you can tell whether a change moved your results or performance. Markers can be scoped to an environment; some are detected automatically when tooling versions change between runs.",doc:"timeline-markers",envVars:["PIWI_AUTO_MARKERS"]},"project.slowest-tests":{title:"Slowest tests",text:"The tests taking the most time, ranked. Optimizing the top entries shortens your overall run the fastest.",doc:"flaky-tests#performance"},"project.run-compare":{title:"Run comparison",text:"Diff two runs to see which tests changed status or duration between them — handy for confirming a fix or spotting a regression.",doc:"ui-overview#test-run-detail"},"project.test-cases":{title:"Test cases",text:'Every distinct test in the project with its executed-only pass rate, result breakdown and average duration across runs. Search by title or file, filter by status, and switch to a per-spec tree. Cases not run within the selected age window are hidden by default (last 30 days) — pick "All time" to see obsolete ones. Click a test to see its full history.',doc:"ui-overview#project-detail"},"project.compare":{title:"Compare runs",text:"Pick two runs to see a side-by-side summary and a per-test status diff between them.",doc:"ui-overview#test-run-detail"},"project.spec-health":{title:"Spec health",text:"A heatmap grouped by spec file: pass rate, flaky rate and average time per spec, so you can find the riskiest files at a glance.",doc:"flaky-tests#spec-health-heatmap"},"project.members":{title:"Project access",text:"Who can see this project. Admins always have access; reporters and users see only the projects assigned to them.",doc:"authentication#user-management"},"project.ai-instructions":{title:"AI diagnosis instructions",text:"Extra guidance handed to the AI when diagnosing this project’s failures — e.g. domain terms, known-flaky areas, or where to look first.",doc:"ai-diagnosis#custom-instructions"},"project.scm-token":{title:"Repository access token",text:"A read-only Git host token lets diagnosis pull the actual commit diffs behind a failure for SCM-grounded analysis. Stored encrypted.",doc:"ai-diagnosis#scm-grounded-context"},"run.summary":{title:"Run summary",text:"Headline outcome of this run — overall status, test counts and total duration.",doc:"ui-overview#test-run-detail"},"run.partial":{title:"Partial run",text:"This run covered only part of the suite (a shard, retry or filtered selection), so its totals aren’t a full picture.",doc:"ui-overview#test-run-detail"},"run.live":{title:"Live run",text:"This run is still streaming results in real time. Results and counts update as each test finishes.",doc:"reporter#live-streaming"},"run.ci-env":{title:"CI & environment",text:"Where this run executed — CI provider, pipeline and machine details — collected automatically by the reporter.",doc:"reporter#automatic-metadata-collection"},"run.reports":{title:"Storage & reports",text:"HTML reports, traces and attachments uploaded with this run. A run can carry several reports (e.g. per shard).",doc:"reporter#multiple-reports"},"run.metadata":{title:"Tags, links & custom data",text:"Extra context attached to the run: tags for grouping, links to external issues, and any custom key/value data your reporter sent."},"run.test-cases":{title:"Test cases",text:"Per-test results for this run. Filter by status, or by the NEW (new regression) and FLAKY signal badges.",doc:"ui-overview#test-run-detail"},"run.insights":{title:"Run insights",text:"Automatic highlights for this run — newly failing, flaky and slow tests — surfaced so you don’t have to hunt for them.",doc:"flaky-tests#run-insights"},"run.regression":{title:"Regression signals",text:"Tests that newly started failing in this run versus the project baseline — the most likely fallout from the latest change.",doc:"flaky-tests#regression-signals"},"run.timeline":{title:"Workers timeline",text:"When each test ran on each parallel worker. Gaps and long bars reveal poor parallelization or a single slow test stalling a shard.",doc:"ui-overview#test-run-detail"},"case.diagnosis-tab":{title:"Diagnosis",text:"Everything you need to understand and fix this failure in one place — the error, a verdict on what kind of failure it is, the captured evidence, and an AI diagnosis.",doc:"ui-overview#test-case-detail"},"case.verdict":{title:"Failure verdict",text:"An at-a-glance read on this failure: whether it newly regressed or is flaky, how many times it retried, and how long the test has been failing.",doc:"flaky-tests#regression-signals"},"case.evidence":{title:"Failure evidence",text:"What was captured at the moment of failure — screenshots, video and traces — grouped so you can see exactly what the browser saw.",doc:"ui-overview#trace-viewer"},"case.test-source":{title:"Test source",text:"The source around the failing line and the callers above it — captured from the failure’s call stack — so you can read where it broke, and the code that led there, without opening your editor. When the execution has a trace, this deepens into the complete call stack with the real source of every frame, read from the trace’s embedded files.",doc:"ui-overview#trace-powered-deep-views"},"export.offline":{title:"Reading this offline",text:"Takes this investigation out of the dashboard as a file that needs no network and no Piwi server. HTML is one self-contained page with screenshots and video embedded; ZIP adds the raw artifacts — trace archives, full-size video, logs — plus a machine-readable data.json; PDF is the HTML printed from your browser. Evidence past the size budget is listed in the report as omitted rather than dropped quietly.",envVars:["PIWI_EXPORT_MAX_INLINE_BYTES","PIWI_EXPORT_MAX_BYTES","PIWI_EXPORT_MAX_CASES"]},"case.artifacts":{title:"Artifacts",text:"Traces, attachments, console output and network requests captured for this execution — the raw material behind the result.",doc:"ui-overview#trace-viewer"},"case.steps":{title:"Steps",text:"Each step Playwright ran, with its duration. A failed step is highlighted with its error, and slow steps are color-coded.",doc:"ui-overview#test-case-detail"},"case.wasted-time":{title:"Wasted time",text:"Time spent in fixed waits (waitForTimeout and matching patterns) that could usually be replaced with a web-first assertion.",doc:"flaky-tests#performance"},"case.ai":{title:"AI diagnosis for this execution",text:"Diagnose just this failing execution, or copy the full evidence context to paste into your own AI assistant.",doc:"ai-diagnosis#diagnosing-one-execution"},"case.web-vitals":{title:"Web Vitals",text:"Core Web Vitals (LCP, CLS, etc.) captured during the test, measuring real loading and responsiveness of the page under test.",doc:"capture-fixtures"},"case.traces":{title:"Traces",text:`Playwright trace files for this execution. "View trace" opens them in the dashboard's own trace viewer — the trace stays on your server, it is never sent to a third party.`,doc:"ui-overview#trace-viewer"},"case.console":{title:"Console output",text:"Browser console messages logged while this test ran — often the first clue for a JavaScript error behind a failure.",doc:"capture-fixtures"},"case.network":{title:"Network requests",text:"HTTP requests the page made during the test, with timing and status — useful for spotting failed or slow calls. When the execution has a trace, the Full trace view shows every request (all resource types) with headers, timing phases, a waterfall and capped body previews; sensitive header values are masked.",doc:"ui-overview#trace-powered-deep-views"},"case.backend-logs":{title:"Backend server logs",text:"Server-side warnings and errors captured during the test, correlated with this execution via a Piwi backend integration.",doc:"backend-logs"},"case.aria":{title:"ARIA snapshot",text:"A snapshot of the accessibility tree at the moment of failure — what assistive tech saw, and useful grounding for AI diagnosis.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"case.flaky-count":{title:"Flaky runs",text:"How many of this test’s recent executions flipped between pass and fail without a code change.",doc:"flaky-tests#flaky-test-detection"},"case.history-chart":{title:"Duration trend",text:"This test’s duration across recent runs. Rising times or spikes hint at a slowdown or instability.",doc:"flaky-tests#flaky-test-detection"},"case.sparkline":{title:"Status history",text:"Pass/fail outcome of this test over its recent runs, oldest to newest — a quick read on its stability.",doc:"flaky-tests#flaky-test-detection"},"cluster.concept":{title:"Failure clusters",text:"Failures with the same error fingerprint are grouped into one cluster, so a single root cause shows up once instead of N times.",doc:"ai-diagnosis#failure-clustering"},"cluster.new-vs-known":{title:"New vs known failure",text:"Whether this failure matches an existing cluster (a known issue) or opened a new one — a fresh signature worth a closer look.",doc:"ai-diagnosis#failure-clustering"},"cluster.triage":{text:"Track a cluster’s state: set its status, add triage notes, or extract a subset of failures into a separate cluster."},"cluster.resolution":{title:"Resolution",text:"Recorded when a full run turns this cluster green: when the fix landed, how long the cluster stayed open, and whether the change matched the diagnosed files. If the failure comes back, the cluster is marked as regressed rather than quietly reopened.",doc:"ai-diagnosis#did-the-fix-work"},"cluster.evidence":{title:"Test evidence",text:"The concrete artifacts behind this cluster — screenshots, signals and traces from affected tests — gathered for review and AI diagnosis.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.scm":{title:"What changed",text:"Recent commits and diffs around when this failure started, so you can connect the break to the change that caused it.",doc:"ai-diagnosis#scm-grounded-context"},"cluster.baseline":{title:"Baseline commit",text:"The last known-good commit. Diffs are computed from here forward to scope the search for the offending change.",doc:"ai-diagnosis#scm-grounded-context"},"cluster.commit-browser":{title:"Commit browser",text:"Browse the repository’s recent commits and inspect each diff to pick a baseline or find the suspect change.",doc:"ai-diagnosis#scm-grounded-context"},"cluster.diagnosis":{title:"AI diagnosis",text:"Runs the configured AI model over the failure plus its evidence and code changes to propose a root cause and fix.",doc:"ai-diagnosis#enabling-ai-diagnosis"},"cluster.context-input":{title:"Additional context",text:"Extra notes, files or screenshots you add to steer the diagnosis — anything the model can’t infer from the captured evidence.",doc:"ai-diagnosis#custom-instructions"},"cluster.context-preview":{title:"Context preview",text:"Exactly what will be sent to the AI, including how much was trimmed to fit the token budget. Review it before spending tokens.",doc:"ai-diagnosis#context-limits-and-token-cost"},"cluster.result":{title:"Diagnosis result",text:"The AI’s proposed root cause, fix and confidence. Treat it as a lead to verify, not proof — confirm against the evidence before acting.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.ai-setup":{title:"AI not configured",text:"Diagnosis needs an AI provider and API key. Configure one in Settings → AI to enable automatic and on-demand analysis.",doc:"ai-diagnosis#enabling-ai-diagnosis"},"cluster.confidence":{title:"Confidence score",text:"How sure the model is of the top hypothesis (0–100). It is lowered when key evidence is missing or truncated, so treat a low score as “gather more before acting”.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.hypotheses":{title:"Other hypotheses",text:"Alternative root causes the model weighed, ranked by likelihood. Useful when the evidence is ambiguous and the top pick is not conclusive.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.coverage":{title:"Data coverage",text:"Which evidence sections were present, truncated or absent for this diagnosis — the same map the model sees. Absent or trimmed evidence lowers confidence; the quote icon marks sections the diagnosis cited.",doc:"ai-diagnosis#context-limits-and-token-cost"},"notifications.subscribe":{title:"Project notifications",text:"Get notified about this project’s runs through your channels. Choose which events trigger an alert.",doc:"notifications#subscriptions"},"settings.general":{title:"General settings",text:"Central place for account, users, AI diagnosis, notifications, storage and tags. Settings that can be overridden by environment variables show a lock badge naming the variable."},"settings.storage-stats":{title:"Storage statistics",text:"How much disk your reports, traces and attachments use, broken down so you can see what to clean up.",doc:"storage#storage-architecture"},"settings.cleanup":{title:"Cleanup old runs",text:"Delete runs (and their reports, traces and attachments) older than a chosen age to reclaim storage. This cannot be undone.",doc:"storage#storage-management"},"account.email":{title:"Email & verification",text:"Your account email is used for password resets and notifications. Verifying it confirms you own the address.",doc:"authentication#user-management"},"settings.smtp":{title:"SMTP status",text:"Outbound email (resets, invites, notifications) is configured through environment variables and shown here read-only.",doc:"notifications#smtp-configuration",envVars:["PIWI_SMTP_HOST","PIWI_SMTP_PORT","PIWI_SMTP_USER","PIWI_SMTP_PASS","PIWI_SMTP_FROM","PIWI_SMTP_FROM_NAME","PIWI_SMTP_SECURE"]},"notifications.channels":{title:"Channels",text:"Destinations an alert can go to — email, Slack or webhook. Create a channel, then subscribe events to it.",doc:"notifications#channels"},"notifications.subscriptions":{title:"Subscriptions",text:"Which events (run failed, new cluster, etc.) notify which channel, optionally scoped to one project and filtered.",doc:"notifications#subscriptions"},"settings.ai-provider":{title:"AI provider",text:"Configure the model providers behind the three AI roles — diagnosis, research and embedding. Each role has its own provider config, or reuses another role’s provider and credentials. Keys are stored encrypted and never returned by the API.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_PROVIDER","PIWI_AI_MODEL","PIWI_AI_API_KEY","PIWI_AI_BASE_URL"]},"settings.ai-instructions":{title:"Global analysis instructions",text:"Guidance applied to every diagnosis across all projects — house style, terminology, or things to always check. Per-project instructions add to this.",doc:"ai-diagnosis#custom-instructions"},"settings.ai-research":{title:"Research model",text:"An optional cheaper/faster model that pre-analyzes the failure (on a lean view) before the main model writes the final diagnosis. It can use its own provider, and the costly SCM diff is only fetched when it flags a likely regression. It also handles cluster naming and merge adjudication, so configuring a cheap research model routes those utility calls away from the expensive diagnosis model.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_RESEARCH_PROVIDER","PIWI_AI_RESEARCH_MODEL","PIWI_AI_RESEARCH_BASE_URL","PIWI_AI_RESEARCH_API_KEY"]},"settings.ai-limits":{title:"Diagnosis context limits",text:"Caps on how much evidence (and how many tokens) go into each diagnosis. Higher limits give the model more to work with but cost more. Each field can be pinned individually by its env var.",doc:"ai-diagnosis#context-limits-and-token-cost",envVars:["PIWI_AI_MAX_SAMPLE_ERROR_CHARS","PIWI_AI_MAX_SCM_PATCH_BUDGET","PIWI_AI_MAX_AFFECTED_TESTS","PIWI_AI_MAX_STEPS","PIWI_AI_MAX_CONSOLE_ENTRIES","PIWI_AI_MAX_CONSOLE_ENTRY_CHARS","PIWI_AI_MAX_NETWORK_REQUESTS","PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS","PIWI_AI_MAX_TEST_SOURCE_CHARS","PIWI_AI_MAX_SERVER_LOG_ENTRIES","PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS","PIWI_AI_MAX_IMAGES","PIWI_AI_MAX_PASSED_PEERS","PIWI_AI_MAX_CONSOLE_WINDOW","PIWI_AI_SLOW_REQUEST_MS","PIWI_AI_MAX_TRACE_STACK_FRAMES","PIWI_AI_MAX_TRACE_NETWORK_REQUESTS"]},"settings.users":{title:"Users & roles",text:"Manage accounts and their role. Administrators control everything; reporters submit results; users have read-only access.",doc:"authentication#roles"},"settings.api-keys":{title:"API keys",text:"Tokens (prefixed pd_) that let the reporter or scripts authenticate without a password. Shown once at creation; revoke anytime.",doc:"authentication#api-keys"},"settings.tags":{text:"Reusable labels you can attach to projects for grouping and filtering across the dashboard."},"settings.wasted-time":{title:"Wasted-time patterns",text:"Define which wait steps count as wasted time. A wait is wasted when any pattern matches its step title or source location. Patterns are case-insensitive and support * and ? wildcards. Changes apply to existing runs immediately.",doc:"flaky-tests#performance",envVars:["PIWI_WASTED_WAIT_PATTERNS"]},"settings.timeout-hygiene":{title:"Timeout hygiene",text:"Thresholds for flagging oversized per-test timeouts and stale test.slow() marks. Opportunities are recomputed at read time, so changes apply to existing runs immediately.",doc:"flaky-tests#performance"},"settings.pr-feedback":{title:"Pull-request feedback",text:"When a run finishes on a branch with an open pull request, Piwi can post a summary comment — new failures separated from pre-existing ones, with suggested locators — and set a commit status. Needs PIWI_SITE_URL and an SCM token with write access.",doc:"ci#pull-request-feedback",envVars:["PIWI_SITE_URL"]},"settings.auto-diagnose":{title:"Auto-diagnose",text:"When a run finishes, up to 3 new failure clusters are diagnosed automatically — each diagnosis is one research call (when a research model is configured) plus one diagnosis call — and new clusters get human-readable titles in one batched call. Requires the diagnosis model to be configured.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_AUTO_DIAGNOSE"]},"settings.embedding-model":{title:"Embedding model",text:"Embeds failures so semantically-similar errors group together (used by failure clustering). Can reuse another role’s provider or configure its own.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_EMBEDDING_PROVIDER","PIWI_AI_EMBEDDING_MODEL","PIWI_AI_EMBEDDING_BASE_URL","PIWI_AI_EMBEDDING_API_KEY"]},"settings.privacy":{title:"Privacy notice",text:"What data is sent to the configured LLM provider when diagnosing a failure, and how secrets are stored. API keys are encrypted at rest; env vars keep them out of the DB entirely.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"settings.storage-backend":{title:"Storage backend",text:"Where test artifacts (HTML reports, traces, attachments) are stored — local disk or S3. Configured entirely through environment variables; shown here read-only.",doc:"storage#storage-architecture",envVars:["PIWI_STORAGE_TYPE","PIWI_STORAGE_PATH","PIWI_S3_BUCKET","PIWI_S3_REGION","PIWI_S3_ACCESS_KEY_ID","PIWI_S3_SECRET_ACCESS_KEY","PIWI_S3_ENDPOINT","PIWI_S3_FORCE_PATH_STYLE"]},"settings.auth-toggle":{title:"Authentication",text:"Role-based access control and API keys. Off by default — when disabled, every endpoint behaves as a single virtual administrator.",doc:"authentication",envVars:["PIWI_AUTH_ENABLED","PIWI_AUTH_SECRET"]},"account.display-name":{title:"Display name",text:"A friendly name shown alongside your account. Optional, and visible only within the dashboard."},"account.connected-accounts":{title:"Connected accounts",text:"Sign in with an OAuth provider (Google or GitHub). Providers are configured by an operator through environment variables; one provider can be linked per account.",doc:"authentication#oauth-google-github",envVars:["PIWI_OAUTH_GOOGLE_CLIENT_ID","PIWI_OAUTH_GOOGLE_CLIENT_SECRET","PIWI_OAUTH_GITHUB_CLIENT_ID","PIWI_OAUTH_GITHUB_CLIENT_SECRET","PIWI_OAUTH_ALLOWED_DOMAINS","PIWI_OAUTH_GITHUB_ALLOWED_ORGS"]},"account.password":{title:"Password",text:"Change the password you sign in with. OAuth-only accounts manage their password through their provider.",doc:"authentication#user-management"},"notifications.test-email":{title:"Send test email",text:"Send a test message through the configured SMTP server to verify delivery. Uses the environment-configured SMTP connection.",doc:"notifications#smtp-configuration"},"mcp.tools":{title:"What it provides",text:"The tools this MCP server exposes to AI agents, letting them query your projects, runs and failures directly.",doc:"mcp#what-it-provides"},"mcp.auth":{title:"Authentication",text:"How an MCP client authenticates to this server — uses the same API keys as the rest of the dashboard.",doc:"mcp#authentication"},"mcp.client-setup":{title:"Client setup",text:"Copy-paste configuration to connect Claude Code, Cursor, VS Code and other MCP clients to this server.",doc:"mcp#client-setup"},"shared.entity-links":{title:"Entity links",text:"Links to external systems (Jira, GitHub, etc.) attached to this item. The provider is detected automatically from the URL."},"ide.open":{title:"Open in IDE",text:"Click a source path to open it in your local editor. Set your local workspace folder (so VS Code gets an absolute path) or a JetBrains project name, then pick a method. Auto probes the JetBrains local server first (the only one it can confirm) before falling back to a vscode:// or jetbrains:// launch. These preferences live in this browser only.",doc:"ide-integration"},"locator-healing":{title:"Alternative locators",text:'When a locator breaks after a UI change, Piwi suggests pre-captured alternatives from the last passing run — or from another test in the project that uses the same locator. Each alternative is ranked by stability score — prefer data-testid (100) over CSS classes (10–40). The recommended fix shows the exact one-line edit for the failing test, with a "Copy fix prompt" for an AI coding agent. A "Your pick" badge marks a replacement you confirmed on the failing page: "Pick from snapshot" opens the failure-time DOM and lets you click the intended element, and "Pick from trace" opens the failure trace in the trace viewer, whose Pick locator tool works on the recorded page snapshots.',doc:"reporter#locator-healing"},"environment-diff":{title:"Environment diff",text:"Compares this execution’s environment (Playwright version, browser config, locale, viewport, CI provider, …) against the same test’s last passing run on the same browser. Only changed keys are shown — an empty diff rules out environment drift as the cause."},"visual-diff":{title:"Visual diff",text:"Pixel-compares the failing screenshot against the same test’s last passing screenshot (same browser). Red pixels in the overlay mark what changed. When the two screenshots have different dimensions the ratio is flagged as unreliable."},"dom-snapshot":{title:"DOM snapshot",text:"The page’s HTML around the failing action, rendered from the uploaded Playwright trace — nothing extra is captured. Input values, inline handlers and script bodies are removed; token-shaped strings are masked."},"page-state":{title:"App state at test end",text:"URL, history state, storage key names + value lengths, and cookie names + flags captured when the test ended. Values are never captured. Disable with the reporter’s capturePageState option.",doc:"capture-fixtures"}};function s(e){return t[e].envVars??[]}export{t as H,s as h};
@@ -1 +0,0 @@
1
- import{e as H,t as j}from"./CX5Q0dZ8.js";import{ap as $,b as J,a as K,ak as b,h as X,aM as Y}from"./C5TrTuWv.js";import{e as V}from"./DMtrFQqi.js";const z={normal:[],headed:["--headed"],debug:["--debug"],ui:["--ui"]};function Q(n){const i=new Map;for(const r of n){const u=r.projectName||"";i.has(u)||i.set(u,[]),i.get(u).push(r)}return i}function W(n,i){if(i==="grep"){const a=n.map(c=>H(c.title));return["--grep",a.length===1?a[0]:`(${a.join("|")})`]}const r=new Set,u=[];for(const a of n){const c=i==="file-line"&&a.line?`${j(a.filePath)}:${a.line}`:j(a.filePath);r.has(c)||(r.add(c),u.push(c))}return u}function Z(n){return/[\s"'()|]/.test(n)?`"${n.replace(/"/g,'\\"')}"`:n}function ee(n,i={}){if(n.length===0)return[];const r=i.mode??"file-line",u=i.runMode??"normal",a=Math.min(1e3,Math.max(1,Math.floor(i.repeatEach??1))),c=[];for(const[h,g]of Q(n)){const d=W(g,r);h&&d.push(`--project=${h}`),d.push(...z[u]),i.trace&&d.push("--trace=on"),a>1&&d.push(`--repeat-each=${a}`),c.push({args:d,display:["playwright","test",...d.map(Z)].join(" ")})}return c}function re(n){return n.progressTotal?`Running ${n.progressDone}/${n.progressTotal}…`:n.steps.length>1?`Running ${n.stepIndex+1}/${n.steps.length}…`:"Running…"}const te={mode:"file-line",runMode:"normal",trace:!1,repeatEach:1},ce=[{label:"Headless",value:"normal",icon:"i-lucide-square-terminal"},{label:"Headed",value:"headed",icon:"i-lucide-app-window"},{label:"Debug (inspector)",value:"debug",icon:"i-lucide-bug"},{label:"UI mode",value:"ui",icon:"i-lucide-layout-grid"}],ue=[{label:"File:line",value:"file-line"},{label:"Title (grep)",value:"grep"},{label:"File only",value:"file"}],S=2e3,k=15,_="piwi:desktop-local-run-options";let se=1,E=null,w=0,v=[];const y=new Map,R=new Map;let I=null,O=null,x=!1;const ne=/^Running (\d+) tests? using \d+ workers?$/,oe=/^\s{1,6}(?:✓|✘|✗|x|ok|-)\s+\d+\s/;function de(){const n=$("desktop-local-runs",()=>[]),i=$("desktop-local-runs-tray",()=>!1),r=$("desktop-local-run-options",()=>({}));I=J(),O=K();const u=X(()=>n.value.filter(e=>e.status==="running").length);function a(){if(!x){x=!0;try{const e=localStorage.getItem(_);e&&(r.value=JSON.parse(e))}catch{}}}function c(e){return a(),{...te,...r.value[String(e)]}}function h(e,t){a();const s={...c(e),...t};r.value={...r.value,[String(e)]:s};try{localStorage.setItem(_,JSON.stringify(r.value))}catch{}}function g(e,t,s){if(e.lines.push({text:t,error:s}),e.lines.length>S&&e.lines.splice(0,e.lines.length-S),s)return;const o=ne.exec(t);o?e.progressTotal=(e.progressTotal??0)+Number(o[1]):oe.test(t)&&(e.progressDone=Math.min(e.progressDone+1,e.progressTotal??e.progressDone+1))}function d(e,t){if(t.kind==="exit"){R.get(t.id)?.(t.code);return}g(e,t.line??"",t.kind!=="stdout")}async function M(){if(E)return;const e=Y();if(!e)throw new Error("The desktop bridge is unavailable.");E=await e.listen("piwi:local-run",({payload:t})=>{const s=y.get(t.id);s?d(s,t):w>0&&v.push(t)})}async function T(e,t){const s=b();if(!s)throw new Error("The desktop bridge is unavailable.");w+=1;let o;try{o=await s.invoke("desktop_run_local_tests",{projectId:e.projectId,args:t.args})}catch(p){throw w-=1,p}const l=new Promise(p=>R.set(o,p));y.set(o,e),e.shellId=o;const f=v.filter(p=>p.id===o);v=w>1?v.filter(p=>p.id!==o):[],w-=1;for(const p of f)d(e,p);const m=await l;return y.delete(o),R.delete(o),e.shellId=null,m}async function A(e){try{await M();let t=0;for(const[s,o]of e.steps.entries()){if(e.stopRequested)break;e.stepIndex=s,e.steps.length>1&&g(e,`$ ${o.display}`,!1);const l=await T(e,o);if(e.stopRequested)break;l!==0&&(t=l??1)}e.stopRequested?e.status="stopped":(e.exitCode=typeof t=="number"?t:1,e.status=t===0?"passed":"failed")}catch(t){g(e,V(t),!0),e.status="error"}finally{e.finishedAt=Date.now(),P(e),N()}}function P(e){if(e.status==="stopped")return;const t=e.projectLabel||"Local run",s=`${e.cases.length} test${e.cases.length===1?"":"s"}`,o=Math.max(1,Math.round(((e.finishedAt??Date.now())-e.startedAt)/1e3));D(e,t,s,o);const l={label:"View output",color:"neutral",variant:"outline",onClick:()=>{i.value=!0}},f=e.piwiRunId==null?[]:[{label:`Open run #${e.piwiRunId}`,color:"neutral",variant:"outline",onClick:()=>{O?.push(`/test-runs/${e.piwiRunId}`)}}];e.status==="passed"?I?.add({title:"Local run passed",description:`${t} — ${s} in ${o}s`,icon:"i-lucide-check",color:"success",actions:[l,...f]}):e.status==="failed"?I?.add({title:"Local run failed",description:`${t} — exit ${e.exitCode??1} after ${o}s`,icon:"i-lucide-x",color:"error",actions:[l,...f]}):I?.add({title:"Local run could not start",description:e.lines.findLast(m=>m.error)?.text,icon:"i-lucide-triangle-alert",color:"error",actions:[l]})}function D(e,t,s,o){if(typeof Notification>"u"||Notification.permission!=="granted"||!document.hidden&&document.hasFocus())return;const l=e.status==="passed"?"Local run passed":e.status==="failed"?"Local run failed":"Local run could not start",f=e.status==="failed"?`${t} — exit ${e.exitCode??1} after ${o}s`:`${t} — ${s} in ${o}s`;try{new Notification(l,{body:f})}catch{}}function N(){const e=n.value.filter(s=>s.status!=="running");if(e.length<=k)return;const t=new Set(e.slice(k).map(s=>s.key));n.value=n.value.filter(s=>!t.has(s.key))}function L(e){if(!b()||e.cases.length===0)return null;const t={...c(e.projectId),...e.options},s=ee(e.cases,t);if(s.length===0)return null;e.persistOptions!==!1&&h(e.projectId,t);const o={key:se++,projectId:String(e.projectId),projectLabel:e.projectLabel??null,cases:e.cases.map(f=>({...f})),options:t,steps:s,stepIndex:0,status:"running",lines:[],exitCode:null,startedAt:Date.now(),finishedAt:null,shellId:null,stopRequested:!1,progressTotal:null,progressDone:0,piwiRunId:null,piwiRunBaseline:null};n.value=[o,...n.value];const l=n.value[0];return i.value=!0,C(l),A(l),l}async function C(e){try{const t=await $fetch(`/api/projects/${e.projectId}/latest-run`);e.piwiRunBaseline=t?.id??0}catch{}}async function F(){const e=Date.now()-12e4;for(const t of n.value)if(!(t.piwiRunId!=null||t.piwiRunBaseline==null)&&!(t.status!=="running"&&(t.finishedAt??0)<e))try{const s=await $fetch(`/api/projects/${t.projectId}/latest-run`);s&&s.id>t.piwiRunBaseline&&(t.piwiRunId=s.id)}catch{}}function B(e){return L({projectId:e.projectId,projectLabel:e.projectLabel,cases:e.cases,options:e.options,persistOptions:!1})}async function U(e){if(e.status!=="running")return;e.stopRequested=!0;const t=b(),s=e.shellId;if(t&&s!=null){try{await t.invoke("desktop_stop_local_tests",{runId:s})}catch{}R.get(s)?.(null)}}function q(){n.value=n.value.filter(e=>e.status==="running")}function G(e){if(e==null)return;const t=String(e);return n.value.find(s=>s.projectId===t)}return{runs:n,trayOpen:i,activeCount:u,startRun:L,rerun:B,stopRun:U,clearFinished:q,latestForProject:G,getProjectOptions:c,saveProjectOptions:h,correlatePiwiRuns:F}}export{ce as L,ue as R,ee as b,re as l,de as u};
@@ -1 +0,0 @@
1
- import{d as S,o,f as i,g as f,V as x,W as h,k as a,X as k,h as c,a0 as C,a1 as B,a2 as w,a3 as P,a5 as O,a6 as V,a7 as $,b8 as N,c as y,j as z,i as _,q as d,t as R,p as j,aK as A,v as b,F as g,a8 as F}from"./C5TrTuWv.js";var T=S({__name:"BaseSeparator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const s=n,l=["horizontal","vertical"];function e(r){return l.includes(r)}const u=c(()=>e(s.orientation)?s.orientation:"horizontal"),v=c(()=>u.value==="vertical"?s.orientation:void 0),m=c(()=>s.decorative?{role:"none"}:{"aria-orientation":v.value,role:"separator"});return(r,p)=>(o(),i(a(k),h({as:r.as,"as-child":r.asChild,"data-orientation":u.value},m.value),{default:f(()=>[x(r.$slots,"default")]),_:3},16,["as","as-child","data-orientation"]))}}),D=T,E=S({__name:"Separator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const s=n;return(l,e)=>(o(),i(D,C(B(s)),{default:f(()=>[x(l.$slots,"default")]),_:3},16))}}),I=E;const K={slots:{root:"flex items-center align-center text-center",border:"",container:"font-medium text-default flex",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xs",label:"text-sm"},variants:{color:{primary:{border:"border-primary"},secondary:{border:"border-secondary"},success:{border:"border-success"},info:{border:"border-info"},warning:{border:"border-warning"},error:{border:"border-error"},neutral:{border:"border-default"}},orientation:{horizontal:{root:"w-full flex-row",border:"w-full",container:"whitespace-nowrap"},vertical:{root:"h-full flex-col",border:"h-full",container:""}},size:{xs:"",sm:"",md:"",lg:"",xl:""},position:{start:"",center:"",end:""},type:{solid:{border:"border-solid"},dashed:{border:"border-dashed"},dotted:{border:"border-dotted"}}},compoundVariants:[{orientation:"horizontal",position:"start",class:{container:"me-3"}},{orientation:"horizontal",position:"center",class:{container:"mx-3"}},{orientation:"horizontal",position:"end",class:{container:"ms-3"}},{orientation:"vertical",position:"start",class:{container:"mb-2"}},{orientation:"vertical",position:"center",class:{container:"my-2"}},{orientation:"vertical",position:"end",class:{container:"mt-2"}},{orientation:"horizontal",size:"xs",class:{border:"border-t"}},{orientation:"horizontal",size:"sm",class:{border:"border-t-[2px]"}},{orientation:"horizontal",size:"md",class:{border:"border-t-[3px]"}},{orientation:"horizontal",size:"lg",class:{border:"border-t-[4px]"}},{orientation:"horizontal",size:"xl",class:{border:"border-t-[5px]"}},{orientation:"vertical",size:"xs",class:{border:"border-s"}},{orientation:"vertical",size:"sm",class:{border:"border-s-[2px]"}},{orientation:"vertical",size:"md",class:{border:"border-s-[3px]"}},{orientation:"vertical",size:"lg",class:{border:"border-s-[4px]"}},{orientation:"vertical",size:"xl",class:{border:"border-s-[5px]"}}],defaultVariants:{color:"neutral",size:"xs",type:"solid"}},X=Object.assign({inheritAttrs:!1},{__name:"USeparator",props:{as:{type:null,required:!1},label:{type:String,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},size:{type:null,required:!1},type:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},position:{type:null,required:!1,default:"center"},class:{type:null,required:!1},ui:{type:null,required:!1},decorative:{type:Boolean,required:!1}},setup(n){const s=n,l=w(),e=P("separator",s),u=O(),v=V($(e,"as","decorative","orientation")),[m,r]=N(),p=c(()=>!!(e.label||e.icon||e.avatar||l.default)),t=c(()=>F({extend:K,...u.ui?.separator||{}})({color:e.color,orientation:e.orientation,size:e.size,position:e.position,type:e.type}));return(q,U)=>(o(),y(g,null,[z(a(m),null,{default:f(()=>[_("div",{"data-slot":"container",class:d(t.value.container({class:a(e).ui?.container}))},[x(q.$slots,"default",{ui:t.value},()=>[a(e).label?(o(),y("span",{key:0,"data-slot":"label",class:d(t.value.label({class:a(e).ui?.label}))},R(a(e).label),3)):a(e).icon?(o(),i(j,{key:1,name:a(e).icon,"data-slot":"icon",class:d(t.value.icon({class:a(e).ui?.icon}))},null,8,["name","class"])):a(e).avatar?(o(),i(A,h({key:2,size:a(e).ui?.avatarSize||t.value.avatarSize()},a(e).avatar,{"data-slot":"avatar",class:t.value.avatar({class:a(e).ui?.avatar})}),null,16,["size","class"])):b("",!0)])],2)]),_:3}),z(a(I),h({"data-slot":"root"},{...a(v),...q.$attrs},{class:t.value.root({class:[a(e).ui?.root,a(e).class]})}),{default:f(()=>[p.value&&a(e).position==="start"?(o(),i(a(r),{key:0})):b("",!0),_("div",{"data-slot":"border",class:d(t.value.border({class:a(e).ui?.border}))},null,2),p.value&&a(e).position==="center"?(o(),y(g,{key:1},[z(a(r)),_("div",{"data-slot":"border",class:d(t.value.border({class:a(e).ui?.border}))},null,2)],64)):b("",!0),p.value&&a(e).position==="end"?(o(),i(a(r),{key:2})):b("",!0)]),_:1},16,["class"])],64))}});export{X as _};