@piwitests/server 0.19.0 → 0.21.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 (732) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{279D2RYp.js → 9ti9eNH9.js} +1 -1
  3. package/.output/public/_nuxt/{DcmZRa_F.js → B-zdP-D4.js} +1 -1
  4. package/.output/public/_nuxt/{eaVkJRSa.js → B1RmmOsM.js} +1 -1
  5. package/.output/public/_nuxt/{DprVVyUQ.js → B3Fsod9X.js} +1 -1
  6. package/.output/public/_nuxt/{HXerICAi.js → B3rirOqU.js} +34 -34
  7. package/.output/public/_nuxt/B3zmIJYb.js +1 -0
  8. package/.output/public/_nuxt/{CDk0q2hV.js → BAKUqW95.js} +2 -2
  9. package/.output/public/_nuxt/BG0KKQiT.js +7 -0
  10. package/.output/public/_nuxt/BGL_V7Y4.js +1 -0
  11. package/.output/public/_nuxt/{Jo8kRmHz.js → BGusFAvZ.js} +1 -1
  12. package/.output/public/_nuxt/{CGNkHojN.js → BNurUTla.js} +3 -3
  13. package/.output/public/_nuxt/BR5cR2Ot.js +1 -0
  14. package/.output/public/_nuxt/BTCh_0zN.js +1 -0
  15. package/.output/public/_nuxt/{ZFiQCMUB.js → BTVqMsA3.js} +1 -1
  16. package/.output/public/_nuxt/{BqV0l12c.js → B_13C0GF.js} +1 -1
  17. package/.output/public/_nuxt/BeDIjhoR.js +44 -0
  18. package/.output/public/_nuxt/{BDicZ1gQ.js → BerCW7Ug.js} +1 -1
  19. package/.output/public/_nuxt/BfTNbVc_.js +1 -0
  20. package/.output/public/_nuxt/BnbSEpXX.js +1 -0
  21. package/.output/public/_nuxt/Bo_dxehb.js +1 -0
  22. package/.output/public/_nuxt/{ClOqkAcc.js → BpBHls4-.js} +1 -1
  23. package/.output/public/_nuxt/{C7P1UCO2.js → BpM6ZPIG.js} +1 -1
  24. package/.output/public/_nuxt/BqGumsDo.js +4 -0
  25. package/.output/public/_nuxt/{DS636elg.js → BrxtP_cN.js} +1 -1
  26. package/.output/public/_nuxt/{YVN7WG7q.js → C2hNxjjz.js} +1 -1
  27. package/.output/public/_nuxt/C5PSqfKi.js +2 -0
  28. package/.output/public/_nuxt/C5vsaU4G.js +1 -0
  29. package/.output/public/_nuxt/C9sdHaXd.js +1 -0
  30. package/.output/public/_nuxt/{SfMRXW25.js → CAxgBYIt.js} +2 -2
  31. package/.output/public/_nuxt/{CZfMdzfk.js → CES2i5Pl.js} +1 -1
  32. package/.output/public/_nuxt/{BX9ZXe98.js → CFEdRqaj.js} +1 -1
  33. package/.output/public/_nuxt/{B44A4LSJ.js → CFTZwazK.js} +1 -1
  34. package/.output/public/_nuxt/CIBS7ye6.js +1 -0
  35. package/.output/public/_nuxt/CIEceDOw.js +1 -0
  36. package/.output/public/_nuxt/{DHDtnj7p.js → CJBhojV6.js} +1 -1
  37. package/.output/public/_nuxt/{BPQoBGg5.js → CKYddHa6.js} +1 -1
  38. package/.output/public/_nuxt/{BccXfBfI.js → CLVWiCds.js} +1 -1
  39. package/.output/public/_nuxt/{DX-MDGb3.js → CMYAryzi.js} +1 -1
  40. package/.output/public/_nuxt/{BuMC3WjZ.js → COhdybDy.js} +1 -1
  41. package/.output/public/_nuxt/{Bu2aaVIY.js → CRBXM2d6.js} +2 -2
  42. package/.output/public/_nuxt/{BYDaY0Z7.js → CTD_pJ_v.js} +1 -1
  43. package/.output/public/_nuxt/{C9_jrmk9.js → CTP8Pw0-.js} +2 -2
  44. package/.output/public/_nuxt/{D55D4EYo.js → CV8iF2kG.js} +1 -1
  45. package/.output/public/_nuxt/{BCMuIgP5.js → CWKmbYlT.js} +1 -1
  46. package/.output/public/_nuxt/C_NfGMTd.js +9 -0
  47. package/.output/public/_nuxt/Cejoebel.js +6 -0
  48. package/.output/public/_nuxt/{Dnpkl-1q.js → Chpah_7l.js} +1 -1
  49. package/.output/public/_nuxt/Ci9d8YVV.js +1 -0
  50. package/.output/public/_nuxt/{C95YAaJq.js → CifRHVaR.js} +1 -1
  51. package/.output/public/_nuxt/{BMvCSA6h.js → Ckgsh9AT.js} +1 -1
  52. package/.output/public/_nuxt/{eptP4pGv.js → Cpsq-kYE.js} +1 -1
  53. package/.output/public/_nuxt/Cqc-DSTF.js +1 -0
  54. package/.output/public/_nuxt/{KnfsST6Y.js → CsHulb12.js} +1 -1
  55. package/.output/public/_nuxt/Ctb2CqUf.js +5 -0
  56. package/.output/public/_nuxt/CtstIQSh.js +1 -0
  57. package/.output/public/_nuxt/{DGfAxLHV.js → CvMzDKvu.js} +1 -1
  58. package/.output/public/_nuxt/{fVcG504p.js → D2pBhsH8.js} +1 -1
  59. package/.output/public/_nuxt/{rWNTSFD6.js → D8gX1Jde.js} +3 -3
  60. package/.output/public/_nuxt/D9knOn6D.js +1 -0
  61. package/.output/public/_nuxt/DAPTVdvA.js +1 -0
  62. package/.output/public/_nuxt/{NQikbhmK.js → DCFbQvIN.js} +44 -43
  63. package/.output/public/_nuxt/DCoJlz_q.js +1 -0
  64. package/.output/public/_nuxt/DGnQ69wW.js +64 -0
  65. package/.output/public/_nuxt/{CTxDO9fB.js → DHzij16p.js} +1 -1
  66. package/.output/public/_nuxt/DJMCXRuW.js +5 -0
  67. package/.output/public/_nuxt/DJXcGkJP.js +2 -0
  68. package/.output/public/_nuxt/{CK_2LZBS.js → DKFXZdWZ.js} +1 -1
  69. package/.output/public/_nuxt/{tvgqrYDd.js → DL24AjfW.js} +1 -1
  70. package/.output/public/_nuxt/DON74Yh6.js +1 -0
  71. package/.output/public/_nuxt/{CHEFCN8Q.js → DQM62mxB.js} +1 -1
  72. package/.output/public/_nuxt/DSe8DxMl.js +1 -0
  73. package/.output/public/_nuxt/DWwiVTZX.js +24 -0
  74. package/.output/public/_nuxt/DX4tAP78.js +1 -0
  75. package/.output/public/_nuxt/{DLSrtpsA.js → D_eDAIsT.js} +1 -1
  76. package/.output/public/_nuxt/Da8A92cF.js +1 -0
  77. package/.output/public/_nuxt/{BxCKKeYs.js → DdH3op4b.js} +1 -1
  78. package/.output/public/_nuxt/DepFDZO3.js +1 -0
  79. package/.output/public/_nuxt/{CV9-fTmY.js → DfSBKzrC.js} +1 -1
  80. package/.output/public/_nuxt/{DT53RWbC.js → DfnKh3dZ.js} +1 -1
  81. package/.output/public/_nuxt/{ndShiWE8.js → DhpTfeip.js} +1 -1
  82. package/.output/public/_nuxt/{ybDYeNxd.js → Dk9nD32g.js} +1 -1
  83. package/.output/public/_nuxt/{D0HNloZ9.js → DkT2nCqn.js} +1 -1
  84. package/.output/public/_nuxt/DlW85lQq.js +4 -0
  85. package/.output/public/_nuxt/DnNio-ut.js +1 -0
  86. package/.output/public/_nuxt/{BfTuX0wq.js → DnQv_hst.js} +1 -1
  87. package/.output/public/_nuxt/{FUXhyidq.js → DqEOMteW.js} +1 -1
  88. package/.output/public/_nuxt/{Bti38m-M.js → Dsvu7YJT.js} +1 -1
  89. package/.output/public/_nuxt/DvhCDBrR.js +2 -0
  90. package/.output/public/_nuxt/DwQaVMZR.js +1 -0
  91. package/.output/public/_nuxt/E-_n_6vi.js +1 -0
  92. package/.output/public/_nuxt/{DP8hfJ9h.js → Ebw5l7n8.js} +1 -1
  93. package/.output/public/_nuxt/{nv9-6vBK.js → IPePdbzl.js} +1 -1
  94. package/.output/public/_nuxt/{BPRffDuo.js → LHoUGrfi.js} +1 -1
  95. package/.output/public/_nuxt/{CYsTqbBS.js → NERLHpOL.js} +1 -1
  96. package/.output/public/_nuxt/RAdNGxcF.js +1 -0
  97. package/.output/public/_nuxt/Vxyo_mU9.js +1 -0
  98. package/.output/public/_nuxt/{IvQlbZk6.js → YE1kAkU9.js} +1 -1
  99. package/.output/public/_nuxt/{DgE2YE3R.js → YmT5WiN5.js} +1 -1
  100. package/.output/public/_nuxt/ZcAfCxWE.js +17 -0
  101. package/.output/public/_nuxt/{cHAnlQbv.js → _rglcvXN.js} +1 -1
  102. package/.output/public/_nuxt/bFU9Y1Vw.js +10 -0
  103. package/.output/public/_nuxt/bfecIH89.js +1 -0
  104. package/.output/public/_nuxt/builds/latest.json +1 -1
  105. package/.output/public/_nuxt/builds/meta/31ca2be4-a949-4df6-9818-773fc085557a.json +1 -0
  106. package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
  107. package/.output/public/_nuxt/four-S1Y.js +1 -0
  108. package/.output/public/_nuxt/{DiOLdHBC.js → gV2U_Gqd.js} +1 -1
  109. package/.output/public/_nuxt/{C-elpgyr.js → lGC893pn.js} +1 -1
  110. package/.output/public/_nuxt/nOfj-ar8.js +1 -0
  111. package/.output/public/_nuxt/oKrbs1XK.js +1 -0
  112. package/.output/public/_nuxt/oSJFAC38.js +1 -0
  113. package/.output/public/_nuxt/rL4C0HV5.js +1 -0
  114. package/.output/public/_nuxt/{Cdff9XNh.js → tQoyVPCE.js} +1 -1
  115. package/.output/public/_nuxt/{DEFEpYzn.js → uSPCvASp.js} +1 -1
  116. package/.output/public/_nuxt/{y17lMTFy.js → wkz5-1SO.js} +1 -1
  117. package/.output/public/_nuxt/yYlVYKCz.js +34 -0
  118. package/.output/public/_nuxt/{B9WhzpKO.js → zv8WdMx0.js} +1 -1
  119. package/.output/server/chunks/_/collect.mjs +1 -1
  120. package/.output/server/chunks/_/markers.mjs +1 -1
  121. package/.output/server/chunks/_/quarantine.mjs +1 -1
  122. package/.output/server/chunks/_/scope.mjs +43 -27
  123. package/.output/server/chunks/_/scope.mjs.map +1 -1
  124. package/.output/server/chunks/_/users.mjs +1 -1
  125. package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-3itRZ1uz.mjs} +2 -2
  126. package/.output/server/chunks/build/Breadcrumb-3itRZ1uz.mjs.map +1 -0
  127. package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-GnjBvXuT.mjs} +2 -2
  128. package/.output/server/chunks/build/BreadcrumbNav-GnjBvXuT.mjs.map +1 -0
  129. package/.output/server/chunks/build/{BrowserBadge-D33lqUcj.mjs → BrowserBadge-DQqJS9CV.mjs} +66 -6
  130. package/.output/server/chunks/build/BrowserBadge-DQqJS9CV.mjs.map +1 -0
  131. package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-D0rzMf-N.mjs} +2 -2
  132. package/.output/server/chunks/build/ChartCard-D0rzMf-N.mjs.map +1 -0
  133. package/.output/server/chunks/build/{Checkbox-DvUBGagc.mjs → Checkbox-DmRKG-0s.mjs} +5 -5
  134. package/.output/server/chunks/build/Checkbox-DmRKG-0s.mjs.map +1 -0
  135. package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-DGhKVFad.mjs} +4 -4
  136. package/.output/server/chunks/build/CodeBlock-DGhKVFad.mjs.map +1 -0
  137. package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DCr10nxL.mjs} +2 -2
  138. package/.output/server/chunks/build/DashboardNavbar-DCr10nxL.mjs.map +1 -0
  139. package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-8EpBhX0R.mjs} +3 -3
  140. package/.output/server/chunks/build/DashboardSidebarToggle-8EpBhX0R.mjs.map +1 -0
  141. package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-rzS-pgCP.mjs} +5 -5
  142. package/.output/server/chunks/build/DataLocationCard-rzS-pgCP.mjs.map +1 -0
  143. package/.output/server/chunks/build/{DiagnosisPanel-B646dK4p.mjs → DiagnosisPanel-BWTpoCKy.mjs} +8 -7
  144. package/.output/server/chunks/build/DiagnosisPanel-BWTpoCKy.mjs.map +1 -0
  145. package/.output/server/chunks/build/{useAiStatus-CWvIo32Q.mjs → DiagnosisResult-Br3qBLXe.mjs} +14 -36
  146. package/.output/server/chunks/build/DiagnosisResult-Br3qBLXe.mjs.map +1 -0
  147. package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-CWKfjIF2.mjs} +2 -2
  148. package/.output/server/chunks/build/DurationValue-CWKfjIF2.mjs.map +1 -0
  149. package/.output/server/chunks/build/{EmptyState-Dtlab7S9.mjs → EmptyState-DC2q_7TD.mjs} +3 -3
  150. package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +1 -0
  151. package/.output/server/chunks/build/{EntityLinks-D3fp57pR.mjs → EntityLinks-CF0xG3Y8.mjs} +6 -6
  152. package/.output/server/chunks/build/EntityLinks-CF0xG3Y8.mjs.map +1 -0
  153. package/.output/server/chunks/build/{EnvManagedBadge-Bg3FSiU1.mjs → EnvManagedBadge-UwD2b9v2.mjs} +3 -3
  154. package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs.map +1 -0
  155. package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs +83 -0
  156. package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs.map +1 -0
  157. package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-e7OnSKPM.mjs} +2 -2
  158. package/.output/server/chunks/build/FormField-e7OnSKPM.mjs.map +1 -0
  159. package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs +510 -0
  160. package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs.map +1 -0
  161. package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-DjGrGFA7.mjs} +3 -3
  162. package/.output/server/chunks/build/HelpHint-DjGrGFA7.mjs.map +1 -0
  163. package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-B8v1nWJt.mjs} +3 -3
  164. package/.output/server/chunks/build/LoadingState-B8v1nWJt.mjs.map +1 -0
  165. package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs +1205 -0
  166. package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs.map +1 -0
  167. package/.output/server/chunks/build/{MiniRunBars-CZMugDrh.mjs → MiniRunBars-fgLMgRUp.mjs} +2 -2
  168. package/.output/server/chunks/build/MiniRunBars-fgLMgRUp.mjs.map +1 -0
  169. package/.output/server/chunks/build/{Modal-Ck2XLt8d.mjs → Modal-pSDlXzT3.mjs} +2 -2
  170. package/.output/server/chunks/build/Modal-pSDlXzT3.mjs.map +1 -0
  171. package/.output/server/chunks/build/{useSettingsNav-C3O866KC.mjs → NavigationMenu-cqpt11Ce.mjs} +6 -29
  172. package/.output/server/chunks/build/NavigationMenu-cqpt11Ce.mjs.map +1 -0
  173. package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs → OpenInIdeLink-B9wvQkhy.mjs} +5 -5
  174. package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs.map → OpenInIdeLink-B9wvQkhy.mjs.map} +1 -1
  175. package/.output/server/chunks/build/{ProjectTestCasesTable-CxfQ5wtN.mjs → ProjectTestCasesTable-BwHEtZTz.mjs} +19 -19
  176. package/.output/server/chunks/build/ProjectTestCasesTable-BwHEtZTz.mjs.map +1 -0
  177. package/.output/server/chunks/build/{RovingFocusItem-BJSzTBjy.mjs → RovingFocusItem--OEHI2P3.mjs} +2 -2
  178. package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +1 -0
  179. package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-BDRIWn3o.mjs} +3 -3
  180. package/.output/server/chunks/build/RunReports-BDRIWn3o.mjs.map +1 -0
  181. package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CuTDknRJ.mjs} +2 -2
  182. package/.output/server/chunks/build/RunStatusBadge-CuTDknRJ.mjs.map +1 -0
  183. package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-BW5Lynrr.mjs} +2 -2
  184. package/.output/server/chunks/build/SectionCard-BW5Lynrr.mjs.map +1 -0
  185. package/.output/server/chunks/build/{Select-CUqj50wi.mjs → Select-CVctwpib.mjs} +3 -3
  186. package/.output/server/chunks/build/Select-CVctwpib.mjs.map +1 -0
  187. package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs → SelectMenu-XLVBEa11.mjs} +939 -7
  188. package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs.map → SelectMenu-XLVBEa11.mjs.map} +1 -1
  189. package/.output/server/chunks/build/{SettingsField-D6iEYbEc.mjs → SettingsField-DvtRvI6O.mjs} +4 -4
  190. package/.output/server/chunks/build/SettingsField-DvtRvI6O.mjs.map +1 -0
  191. package/.output/server/chunks/build/{Slideover-DgCa80mf.mjs → Slideover-D270EZZD.mjs} +3 -3
  192. package/.output/server/chunks/build/Slideover-D270EZZD.mjs.map +1 -0
  193. package/.output/server/chunks/build/{StatTile-D61Vzo6e.mjs → StatTile-DpcVQFVI.mjs} +2 -26
  194. package/.output/server/chunks/build/StatTile-DpcVQFVI.mjs.map +1 -0
  195. package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs +30 -0
  196. package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs.map +1 -0
  197. package/.output/server/chunks/build/{Switch-CgUioOYB.mjs → Switch-8zWfwI5B.mjs} +3 -3
  198. package/.output/server/chunks/build/Switch-8zWfwI5B.mjs.map +1 -0
  199. package/.output/server/chunks/build/Table-BRk04Hd2.mjs +1 -1
  200. package/.output/server/chunks/build/{Tabs-Bbsg9wag.mjs → Tabs-BkSOnbaB.mjs} +2 -2
  201. package/.output/server/chunks/build/Tabs-BkSOnbaB.mjs.map +1 -0
  202. package/.output/server/chunks/build/{TestCaseHistoryChart-nMLPhdvD.mjs → TestCaseHistoryChart-C6t5RrCG.mjs} +6 -6
  203. package/.output/server/chunks/build/TestCaseHistoryChart-C6t5RrCG.mjs.map +1 -0
  204. package/.output/server/chunks/build/{TestMetaBadges-D5_yUtIP.mjs → TestMetaBadges-BlyKmfeP.mjs} +1 -1
  205. package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +1 -0
  206. package/.output/server/chunks/build/{TestStatusBar-j6h2Jp6A.mjs → TestStatusBar-DhbrM_rQ.mjs} +4 -4
  207. package/.output/server/chunks/build/TestStatusBar-DhbrM_rQ.mjs.map +1 -0
  208. package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-vkMKVQTJ.mjs} +2 -2
  209. package/.output/server/chunks/build/Textarea-vkMKVQTJ.mjs.map +1 -0
  210. package/.output/server/chunks/build/{Tooltip-BOazooWP.mjs → Tooltip-Dv4htNP6.mjs} +3 -3
  211. package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs.map +1 -0
  212. package/.output/server/chunks/build/{VisuallyHiddenInput-D6kBJxVd.mjs → VisuallyHiddenInput-BHvzNumK.mjs} +2 -2
  213. package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +1 -0
  214. package/.output/server/chunks/build/{_id_-z5N6HPyC.mjs → _id_-2PMH6rl8.mjs} +26 -25
  215. package/.output/server/chunks/build/_id_-2PMH6rl8.mjs.map +1 -0
  216. package/.output/server/chunks/build/{_id_-BHh65pfg.mjs → _id_-8cGIgeg6.mjs} +1912 -1098
  217. package/.output/server/chunks/build/_id_-8cGIgeg6.mjs.map +1 -0
  218. package/.output/server/chunks/build/{_id_-Rzkqx55x.mjs → _id_-CUZ5S6y5.mjs} +43 -44
  219. package/.output/server/chunks/build/_id_-CUZ5S6y5.mjs.map +1 -0
  220. package/.output/server/chunks/build/{_id_-B78ky13D.mjs → _id_-DMkgWSLZ.mjs} +956 -429
  221. package/.output/server/chunks/build/_id_-DMkgWSLZ.mjs.map +1 -0
  222. package/.output/server/chunks/build/about-D3WXTDro.mjs +696 -0
  223. package/.output/server/chunks/build/about-D3WXTDro.mjs.map +1 -0
  224. package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-BslDNCoo.mjs} +6 -6
  225. package/.output/server/chunks/build/account-BslDNCoo.mjs.map +1 -0
  226. package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs → ai-C23R9l94.mjs} +18 -18
  227. package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs.map → ai-C23R9l94.mjs.map} +1 -1
  228. package/.output/server/chunks/build/{analytics-CJPC6t4L.mjs → analytics-DQHeToK0.mjs} +106 -80
  229. package/.output/server/chunks/build/analytics-DQHeToK0.mjs.map +1 -0
  230. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  231. package/.output/server/chunks/build/compare-RxHSOdsO.mjs +1 -0
  232. package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-D74DghqX.mjs} +38 -2
  233. package/.output/server/chunks/build/db.client-D74DghqX.mjs.map +1 -0
  234. package/.output/server/chunks/build/{default-zvbFgDJG.mjs → default-CeyePZ5I.mjs} +624 -79
  235. package/.output/server/chunks/build/default-CeyePZ5I.mjs.map +1 -0
  236. package/.output/server/chunks/build/{docs-DyuVEgtB.mjs → docs-f_bnC75q.mjs} +17 -17
  237. package/.output/server/chunks/build/{docs-DyuVEgtB.mjs.map → docs-f_bnC75q.mjs.map} +1 -1
  238. package/.output/server/chunks/build/{edit-CFR5g2Qf.mjs → edit-BOC4zWuH.mjs} +13 -15
  239. package/.output/server/chunks/build/edit-BOC4zWuH.mjs.map +1 -0
  240. package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-BQg_fhX0.mjs} +32 -4
  241. package/.output/server/chunks/build/fetch-BQg_fhX0.mjs.map +1 -0
  242. package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CxuVbGWy.mjs} +4 -3
  243. package/.output/server/chunks/build/forgot-password-CxuVbGWy.mjs.map +1 -0
  244. package/.output/server/chunks/build/{import-CZo3djDi.mjs → import-CC27wEIu.mjs} +14 -14
  245. package/.output/server/chunks/build/import-CC27wEIu.mjs.map +1 -0
  246. package/.output/server/chunks/build/{index-gCw_y4ZJ.mjs → index-B6PjfyTY.mjs} +44 -543
  247. package/.output/server/chunks/build/index-B6PjfyTY.mjs.map +1 -0
  248. package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-BOK1aJk9.mjs} +2 -1
  249. package/.output/server/chunks/build/index-BOK1aJk9.mjs.map +1 -0
  250. package/.output/server/chunks/build/{index-D7fe97l3.mjs → index-BhS1DuCr.mjs} +400 -151
  251. package/.output/server/chunks/build/index-BhS1DuCr.mjs.map +1 -0
  252. package/.output/server/chunks/build/{index-Stqw0dEI.mjs → index-DUmjP3Gr.mjs} +18 -19
  253. package/.output/server/chunks/build/index-DUmjP3Gr.mjs.map +1 -0
  254. package/.output/server/chunks/build/index-jvF53f7_.mjs +91 -0
  255. package/.output/server/chunks/build/index-jvF53f7_.mjs.map +1 -0
  256. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
  257. package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-CdpOhiP8.mjs} +8 -7
  258. package/.output/server/chunks/build/login-CdpOhiP8.mjs.map +1 -0
  259. package/.output/server/chunks/build/{mcp-B3IUvRgD.mjs → mcp-WTeO5WRo.mjs} +528 -16
  260. package/.output/server/chunks/build/mcp-WTeO5WRo.mjs.map +1 -0
  261. package/.output/server/chunks/build/{notifications-abDv0id8.mjs → notifications-yY6ik-fi.mjs} +11 -11
  262. package/.output/server/chunks/build/notifications-yY6ik-fi.mjs.map +1 -0
  263. package/.output/server/chunks/build/{pr-feedback-DjZID6q-.mjs → pr-feedback-Hv2Ydh_6.mjs} +8 -8
  264. package/.output/server/chunks/build/pr-feedback-Hv2Ydh_6.mjs.map +1 -0
  265. package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-CFtO8A6n.mjs} +4 -3
  266. package/.output/server/chunks/build/reset-password-CFtO8A6n.mjs.map +1 -0
  267. package/.output/server/chunks/build/server.mjs +51 -34
  268. package/.output/server/chunks/build/{settings-Du7YqF8i.mjs → settings-DIpvnY8_.mjs} +11 -9
  269. package/.output/server/chunks/build/settings-DIpvnY8_.mjs.map +1 -0
  270. package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DRv9VveS.mjs} +32 -2
  271. package/.output/server/chunks/build/settings-metadata-DRv9VveS.mjs.map +1 -0
  272. package/.output/server/chunks/build/setup-Di0UMyWx.mjs +1116 -0
  273. package/.output/server/chunks/build/setup-Di0UMyWx.mjs.map +1 -0
  274. package/.output/server/chunks/build/{storage-B4vzxd8G.mjs → storage-gAbY1KbQ.mjs} +13 -13
  275. package/.output/server/chunks/build/storage-gAbY1KbQ.mjs.map +1 -0
  276. package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-DJ80wCqt.mjs} +6 -7
  277. package/.output/server/chunks/build/tags-DJ80wCqt.mjs.map +1 -0
  278. package/.output/server/chunks/build/{test-cases-DUvaO1He.mjs → test-cases-YP83YlnL.mjs} +21 -21
  279. package/.output/server/chunks/build/test-cases-YP83YlnL.mjs.map +1 -0
  280. package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs +550 -0
  281. package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs.map +1 -0
  282. package/.output/server/chunks/build/{timeout-hygiene-CbnSaVbK.mjs → timeout-hygiene-RpXDjXTX.mjs} +6 -6
  283. package/.output/server/chunks/build/timeout-hygiene-RpXDjXTX.mjs.map +1 -0
  284. package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs +9 -0
  285. package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs.map +1 -0
  286. package/.output/server/chunks/build/{useCopyRich-BemRsKgv.mjs → useCopyRich-Cd5Yj_Wy.mjs} +721 -239
  287. package/.output/server/chunks/build/useCopyRich-Cd5Yj_Wy.mjs.map +1 -0
  288. package/.output/server/chunks/build/{useDesktopDownload-D49JRQSw.mjs → useDesktopDownload-BmR6ouz2.mjs} +3 -3
  289. package/.output/server/chunks/build/useDesktopDownload-BmR6ouz2.mjs.map +1 -0
  290. package/.output/server/chunks/build/{useOpenInIde-4GFf-kdi.mjs → useOpenInIde-DolN3bZ5.mjs} +2 -2
  291. package/.output/server/chunks/build/useOpenInIde-DolN3bZ5.mjs.map +1 -0
  292. package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs +19 -0
  293. package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs.map +1 -0
  294. package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs +11 -0
  295. package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs.map +1 -0
  296. package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-I2K7HXS2.mjs} +6 -7
  297. package/.output/server/chunks/build/users-I2K7HXS2.mjs.map +1 -0
  298. package/.output/server/chunks/build/{wasted-time-lYkx5YO4.mjs → wasted-time-DyIk0olc.mjs} +11 -11
  299. package/.output/server/chunks/build/wasted-time-DyIk0olc.mjs.map +1 -0
  300. package/.output/server/chunks/nitro/nitro.mjs +3124 -1782
  301. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  302. package/.output/server/chunks/routes/__piwi/session.get.mjs +2 -1
  303. package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
  304. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +1 -0
  305. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
  306. package/.output/server/chunks/routes/api/admin/stats.get.mjs +1 -0
  307. package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
  308. package/.output/server/chunks/routes/api/ai/status.get.mjs +1 -0
  309. package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -0
  311. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
  312. package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -0
  313. package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
  314. package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -0
  315. package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
  316. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -0
  317. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
  318. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -0
  319. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -0
  321. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
  322. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -0
  323. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
  324. package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -0
  325. package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -0
  327. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -0
  329. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
  330. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -0
  331. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
  332. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -0
  333. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
  334. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -0
  335. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +89 -0
  337. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -0
  338. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +1 -0
  339. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +2 -1
  341. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +2 -1
  343. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +2 -1
  345. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +2 -1
  347. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +2 -1
  349. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +2 -1
  351. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +2 -1
  353. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +2 -1
  355. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +2 -1
  357. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +2 -1
  359. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +2 -1
  361. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +2 -1
  363. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +2 -1
  365. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +2 -1
  367. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +2 -1
  369. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +2 -1
  371. package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/health.get.mjs +2 -1
  373. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  375. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/index.get2.mjs +2 -1
  377. package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/index.get3.mjs +2 -1
  379. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/index.get4.mjs +2 -1
  381. package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
  383. package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
  385. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  386. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  387. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  388. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +2 -1
  389. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +2 -1
  391. package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
  393. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +2 -1
  394. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
  395. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
  396. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +2 -1
  397. package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +2 -1
  399. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +2 -1
  401. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +2 -1
  403. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +2 -1
  405. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +2 -1
  407. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +2 -1
  409. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
  411. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +2 -1
  412. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
  413. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
  414. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +2 -1
  415. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +2 -1
  417. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +2 -1
  419. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +2 -1
  421. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +2 -1
  423. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +2 -1
  425. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +2 -1
  427. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +76 -0
  429. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs.map +1 -0
  430. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +66 -0
  431. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs.map +1 -0
  432. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +53 -0
  433. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs.map +1 -0
  434. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +67 -0
  435. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs.map +1 -0
  436. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +2 -1
  437. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +2 -1
  439. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +2 -1
  441. package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
  443. package/.output/server/chunks/routes/api/projects/menu.get.mjs +2 -1
  444. package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
  445. package/.output/server/chunks/routes/api/projects/overview.get.mjs +2 -1
  446. package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
  447. package/.output/server/chunks/routes/api/projects.get.mjs +2 -1
  448. package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
  449. package/.output/server/chunks/routes/api/search.get.mjs +2 -1
  450. package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
  451. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +2 -1
  452. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
  453. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +2 -1
  454. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
  455. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +1 -0
  456. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
  457. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +2 -1
  458. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
  459. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +2 -1
  460. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
  461. package/.output/server/chunks/routes/api/settings/ai.get.mjs +2 -1
  462. package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
  463. package/.output/server/chunks/routes/api/settings/ai.put.mjs +2 -1
  464. package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
  465. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +2 -1
  466. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -1
  467. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +2 -1
  468. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
  469. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +2 -1
  470. package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
  471. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +2 -1
  472. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
  473. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +2 -1
  474. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
  475. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +2 -1
  476. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
  477. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +2 -1
  478. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
  479. package/.output/server/chunks/routes/api/setup-status.get.mjs +99 -0
  480. package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
  481. package/.output/server/chunks/routes/api/stream.get.mjs +2 -1
  482. package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
  483. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +2 -1
  484. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
  485. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  486. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +2 -1
  487. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  489. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +2 -1
  490. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
  491. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +2 -1
  492. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
  493. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +2 -1
  494. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
  495. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +60 -0
  496. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs.map +1 -0
  497. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +69 -0
  498. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs.map +1 -0
  499. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +2 -1
  500. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
  501. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +2 -1
  502. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
  503. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +2 -1
  504. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
  505. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +2 -1
  506. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -1
  507. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +2 -1
  508. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
  509. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +2 -1
  510. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
  511. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +2 -1
  512. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
  513. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +2 -1
  514. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
  515. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +6 -3
  516. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +2 -1
  518. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
  519. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +2 -1
  520. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
  521. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +2 -1
  522. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +2 -1
  524. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
  525. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +2 -1
  526. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
  527. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +2 -1
  528. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
  529. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +2 -1
  530. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +2 -1
  532. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
  533. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +2 -1
  534. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
  535. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +2 -1
  536. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
  537. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +2 -1
  538. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -1
  539. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +2 -1
  540. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
  541. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +2 -1
  542. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
  543. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +2 -1
  544. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
  545. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +2 -1
  546. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
  547. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +2 -1
  548. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
  549. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +2 -1
  550. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
  551. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +2 -1
  552. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
  553. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +2 -1
  554. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
  555. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +2 -1
  556. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
  557. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +2 -2
  558. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +5 -128
  559. package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -1
  560. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +2 -1
  561. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
  562. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +2 -1
  563. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
  564. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +2 -1
  565. package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
  566. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +2 -1
  567. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  568. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
  569. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  570. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +4 -1
  571. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  572. package/.output/server/chunks/routes/api/traces/check.post.mjs +2 -1
  573. package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
  574. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -0
  575. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
  576. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -0
  577. package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
  578. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  579. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +2 -1
  580. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
  581. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +2 -1
  582. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
  583. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  584. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
  585. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  586. package/.output/server/chunks/routes/api/version.get.mjs +2 -1
  587. package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
  588. package/.output/server/chunks/routes/mcp.post.mjs +41 -11
  589. package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
  590. package/.output/server/chunks/routes/renderer.mjs +1 -1
  591. package/.output/server/chunks/tasks/sweep.mjs +1 -0
  592. package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
  593. package/.output/server/chunks/tasks/sweep2.mjs +1 -0
  594. package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
  595. package/.output/server/database/migrations/0043_watery_dragon_lord.sql +22 -0
  596. package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
  597. package/.output/server/database/migrations/meta/_journal.json +7 -0
  598. package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
  599. package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
  600. package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
  601. package/.output/server/index.mjs +2 -1
  602. package/.output/server/index.mjs.map +1 -1
  603. package/.output/server/package.json +1 -1
  604. package/package.json +1 -1
  605. package/.output/public/_nuxt/-09h6CA9.js +0 -1
  606. package/.output/public/_nuxt/81InBX9v.js +0 -1
  607. package/.output/public/_nuxt/Ar3IelOY.js +0 -1
  608. package/.output/public/_nuxt/B33iXw77.js +0 -1
  609. package/.output/public/_nuxt/B3B9Ii2A.js +0 -1
  610. package/.output/public/_nuxt/B3HO8kuh.js +0 -1
  611. package/.output/public/_nuxt/B7NBP1C-.js +0 -1
  612. package/.output/public/_nuxt/BJ0XQElc.js +0 -1
  613. package/.output/public/_nuxt/BSIxhGsh.js +0 -1
  614. package/.output/public/_nuxt/BVaxh6Nl.js +0 -4
  615. package/.output/public/_nuxt/Bc8mOoz9.js +0 -4
  616. package/.output/public/_nuxt/BeLWlVK0.js +0 -1
  617. package/.output/public/_nuxt/Bn0YQDyy.js +0 -1
  618. package/.output/public/_nuxt/Bp5ELvx9.js +0 -1
  619. package/.output/public/_nuxt/BpUaY9nH.js +0 -2
  620. package/.output/public/_nuxt/C2_3mdPC.js +0 -1
  621. package/.output/public/_nuxt/C5iG7O4O.js +0 -64
  622. package/.output/public/_nuxt/CHNwfU1y.js +0 -1
  623. package/.output/public/_nuxt/CNFYDQmj.js +0 -1
  624. package/.output/public/_nuxt/CU5S9GCh.js +0 -1
  625. package/.output/public/_nuxt/CUtJobDm.js +0 -1
  626. package/.output/public/_nuxt/CpjgB2aY.js +0 -1
  627. package/.output/public/_nuxt/CrwJAwhk.js +0 -1
  628. package/.output/public/_nuxt/CtQBsNUb.js +0 -1
  629. package/.output/public/_nuxt/CuSVQEkS.js +0 -3
  630. package/.output/public/_nuxt/CylWPruw.js +0 -1
  631. package/.output/public/_nuxt/CzGyac8q.js +0 -1
  632. package/.output/public/_nuxt/DDDpCFpF.js +0 -1
  633. package/.output/public/_nuxt/DVDXJYq2.js +0 -2
  634. package/.output/public/_nuxt/DW0xl3I6.js +0 -17
  635. package/.output/public/_nuxt/Dgf5N4Ng.js +0 -1
  636. package/.output/public/_nuxt/DiZyJYez.js +0 -1
  637. package/.output/public/_nuxt/Dk9fwOCm.js +0 -34
  638. package/.output/public/_nuxt/DoUy4UHi.js +0 -44
  639. package/.output/public/_nuxt/DslPMqfa.js +0 -1
  640. package/.output/public/_nuxt/OSduWzyz.js +0 -1
  641. package/.output/public/_nuxt/SlIRLREZ.js +0 -6
  642. package/.output/public/_nuxt/WsxFTEFq.js +0 -10
  643. package/.output/public/_nuxt/aQgs_c6e.js +0 -9
  644. package/.output/public/_nuxt/builds/meta/ab473028-4b37-4884-b243-b8f6e5046e5e.json +0 -1
  645. package/.output/public/_nuxt/dYCKgE-3.js +0 -5
  646. package/.output/public/_nuxt/entry.CPhW41mh.css +0 -1
  647. package/.output/public/_nuxt/g26aVPxc.js +0 -1
  648. package/.output/public/_nuxt/zQyPuvV1.js +0 -1
  649. package/.output/server/chunks/_/import-runs.mjs +0 -351
  650. package/.output/server/chunks/_/import-runs.mjs.map +0 -1
  651. package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +0 -1
  652. package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +0 -1
  653. package/.output/server/chunks/build/BrowserBadge-D33lqUcj.mjs.map +0 -1
  654. package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +0 -1
  655. package/.output/server/chunks/build/Checkbox-DvUBGagc.mjs.map +0 -1
  656. package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs +0 -631
  657. package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs.map +0 -1
  658. package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +0 -1
  659. package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +0 -1
  660. package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +0 -1
  661. package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +0 -1
  662. package/.output/server/chunks/build/DiagnosisPanel-B646dK4p.mjs.map +0 -1
  663. package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +0 -1
  664. package/.output/server/chunks/build/EmptyState-Dtlab7S9.mjs.map +0 -1
  665. package/.output/server/chunks/build/EntityLinks-D3fp57pR.mjs.map +0 -1
  666. package/.output/server/chunks/build/EnvManagedBadge-Bg3FSiU1.mjs.map +0 -1
  667. package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +0 -1
  668. package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +0 -1
  669. package/.output/server/chunks/build/LoadingState-C3pBSuOO.mjs.map +0 -1
  670. package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
  671. package/.output/server/chunks/build/Modal-Ck2XLt8d.mjs.map +0 -1
  672. package/.output/server/chunks/build/ProjectTestCasesTable-CxfQ5wtN.mjs.map +0 -1
  673. package/.output/server/chunks/build/RovingFocusItem-BJSzTBjy.mjs.map +0 -1
  674. package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +0 -1
  675. package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +0 -1
  676. package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +0 -1
  677. package/.output/server/chunks/build/Select-CUqj50wi.mjs.map +0 -1
  678. package/.output/server/chunks/build/SettingsField-D6iEYbEc.mjs.map +0 -1
  679. package/.output/server/chunks/build/Slideover-DgCa80mf.mjs.map +0 -1
  680. package/.output/server/chunks/build/StatTile-D61Vzo6e.mjs.map +0 -1
  681. package/.output/server/chunks/build/Switch-CgUioOYB.mjs.map +0 -1
  682. package/.output/server/chunks/build/Tabs-Bbsg9wag.mjs.map +0 -1
  683. package/.output/server/chunks/build/TestCaseHistoryChart-nMLPhdvD.mjs.map +0 -1
  684. package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +0 -1
  685. package/.output/server/chunks/build/TestStatusBar-j6h2Jp6A.mjs.map +0 -1
  686. package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +0 -1
  687. package/.output/server/chunks/build/Tooltip-BOazooWP.mjs.map +0 -1
  688. package/.output/server/chunks/build/VisuallyHiddenInput-D6kBJxVd.mjs.map +0 -1
  689. package/.output/server/chunks/build/_id_-B78ky13D.mjs.map +0 -1
  690. package/.output/server/chunks/build/_id_-BHh65pfg.mjs.map +0 -1
  691. package/.output/server/chunks/build/_id_-Rzkqx55x.mjs.map +0 -1
  692. package/.output/server/chunks/build/_id_-z5N6HPyC.mjs.map +0 -1
  693. package/.output/server/chunks/build/about-CvSP73Ug.mjs +0 -781
  694. package/.output/server/chunks/build/about-CvSP73Ug.mjs.map +0 -1
  695. package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +0 -1
  696. package/.output/server/chunks/build/analytics-CJPC6t4L.mjs.map +0 -1
  697. package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +0 -1
  698. package/.output/server/chunks/build/default-zvbFgDJG.mjs.map +0 -1
  699. package/.output/server/chunks/build/edit-CFR5g2Qf.mjs.map +0 -1
  700. package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +0 -1
  701. package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +0 -1
  702. package/.output/server/chunks/build/import-CZo3djDi.mjs.map +0 -1
  703. package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +0 -1
  704. package/.output/server/chunks/build/index-D7fe97l3.mjs.map +0 -1
  705. package/.output/server/chunks/build/index-Stqw0dEI.mjs.map +0 -1
  706. package/.output/server/chunks/build/index-gCw_y4ZJ.mjs.map +0 -1
  707. package/.output/server/chunks/build/index-tR6owKzj.mjs +0 -167
  708. package/.output/server/chunks/build/index-tR6owKzj.mjs.map +0 -1
  709. package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +0 -1
  710. package/.output/server/chunks/build/mcp-B3IUvRgD.mjs.map +0 -1
  711. package/.output/server/chunks/build/notifications-abDv0id8.mjs.map +0 -1
  712. package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs.map +0 -1
  713. package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +0 -1
  714. package/.output/server/chunks/build/settings-Du7YqF8i.mjs.map +0 -1
  715. package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +0 -1
  716. package/.output/server/chunks/build/storage-B4vzxd8G.mjs.map +0 -1
  717. package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +0 -1
  718. package/.output/server/chunks/build/test-cases-DUvaO1He.mjs.map +0 -1
  719. package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +0 -1
  720. package/.output/server/chunks/build/useAiStatus-CWvIo32Q.mjs.map +0 -1
  721. package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs +0 -33
  722. package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +0 -1
  723. package/.output/server/chunks/build/useCopyRich-BemRsKgv.mjs.map +0 -1
  724. package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs.map +0 -1
  725. package/.output/server/chunks/build/useOpenInIde-4GFf-kdi.mjs.map +0 -1
  726. package/.output/server/chunks/build/useSettingsNav-C3O866KC.mjs.map +0 -1
  727. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +0 -7
  728. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +0 -1
  729. package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +0 -1
  730. package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs +0 -940
  731. package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs.map +0 -1
  732. package/.output/server/chunks/build/wasted-time-lYkx5YO4.mjs.map +0 -1
@@ -1,44 +1,45 @@
1
- import { _ as _sfc_main$1$1, a as _sfc_main$g } from './DashboardNavbar-BHmMSPX7.mjs';
2
- import { _ as _sfc_main$1$2 } from './Breadcrumb-Ak2Lg3oM.mjs';
3
- import { _ as __nuxt_component_3$1 } from './BreadcrumbNav-DO7I_z-n.mjs';
4
- import { u as useRoute, k as useRouter, r as useRuntimeConfig, l as useHead, j as useToast, n as _sfc_main$7$1, m as _sfc_main$k, s as __nuxt_component_12$1, o as _sfc_main$p, y as __nuxt_component_7$1, _ as _sfc_main$d$1, v as _sfc_main$8$1, p as _sfc_main$j$1 } from './server.mjs';
5
- import { _ as _sfc_main$h } from './Tooltip-BOazooWP.mjs';
1
+ import { _ as _sfc_main$1$1, a as _sfc_main$h } from './DashboardNavbar-DCr10nxL.mjs';
2
+ import { _ as _sfc_main$1$2 } from './Breadcrumb-3itRZ1uz.mjs';
3
+ import { _ as __nuxt_component_3$1 } from './BreadcrumbNav-GnjBvXuT.mjs';
4
+ import { u as useRoute, k as useRouter, r as useRuntimeConfig, l as useHead, j as useToast, n as _sfc_main$7$1, m as _sfc_main$k, v as __nuxt_component_12$1, o as _sfc_main$p, s as __nuxt_component_7$1, _ as _sfc_main$d$1, w as _sfc_main$8$1, p as _sfc_main$j$1 } from './server.mjs';
5
+ import { _ as _sfc_main$i } from './Tooltip-Dv4htNP6.mjs';
6
6
  import { _ as __nuxt_component_4 } from './NavbarActions-_YjrSUat.mjs';
7
- import { _ as __nuxt_component_8, a as __nuxt_component_1$2, c as __nuxt_component_13$2, b as __nuxt_component_14$3, d as __nuxt_component_15$1 } from './CiEnvCard-CrjOM17n.mjs';
8
- import { u as useDetailGrid, _ as __nuxt_component_0$1 } from './useAiStatus-CWvIo32Q.mjs';
9
- import { _ as __nuxt_component_14$2 } from './TestStatusBar-j6h2Jp6A.mjs';
10
- import { _ as __nuxt_component_14$1 } from './DurationValue-D20oGbnc.mjs';
11
- import { _ as _sfc_main$m } from './Card-BQP_oZkQ.mjs';
12
- import { _ as __nuxt_component_2$2 } from './HelpHint-DrcIv-Oj.mjs';
7
+ import { _ as __nuxt_component_8, b as __nuxt_component_1$1, a as __nuxt_component_14$2, c as __nuxt_component_16$1, d as __nuxt_component_17$1 } from './MetaStripGroup-dXXa_MzF.mjs';
8
+ import { _ as __nuxt_component_0$1 } from './DiagnosisResult-Br3qBLXe.mjs';
9
+ import { _ as __nuxt_component_14$3 } from './TestStatusBar-DhbrM_rQ.mjs';
10
+ import { _ as __nuxt_component_14$1 } from './DurationValue-CWKfjIF2.mjs';
11
+ import { _ as _sfc_main$n } from './Card-BQP_oZkQ.mjs';
12
+ import { _ as __nuxt_component_2$2 } from './HelpHint-DjGrGFA7.mjs';
13
13
  import { _ as __nuxt_component_5 } from './MarkerBadge-D7meXy4u.mjs';
14
- import { _ as __nuxt_component_17$1 } from './EntityLinks-D3fp57pR.mjs';
15
- import { p as prettyDateFormat, v as getStatusColor, f as formatRelativeTime, c as copyPreview, j as clusterStatusColor, i as clusterErrorTypeColor, z as reportIcon, n as fileApiUrl, w as createSortHeader, d as formatDuration, F as getStatusTextClass, E as getStatusIcon, a as formatStatusLabel, D as isStatusInFlight, C as isPiwiAnnotation } from './index-CU2nZhAa.mjs';
16
- import { cB as formatBytes, bI as DEFAULT_WASTED_WAIT_PATTERNS, dP as isWastedWait } from '../nitro/nitro.mjs';
14
+ import { _ as __nuxt_component_1$2 } from './StatTileGrid-7zOFUQ6j.mjs';
15
+ import { p as prettyDateFormat, v as getStatusColor, f as formatRelativeTime, c as copyPreview, j as clusterStatusColor, i as clusterErrorTypeColor, z as reportIcon, n as fileApiUrl, w as createSortHeader, d as formatDuration, F as getStatusTextClass, E as getStatusIcon, a as formatStatusLabel, D as isStatusInFlight, C as isPiwiAnnotation } from './index-BOK1aJk9.mjs';
16
+ import { aa as formatBytes, bR as DEFAULT_WASTED_WAIT_PATTERNS, dX as isWastedWait } from '../nitro/nitro.mjs';
17
17
  import { defineComponent, withAsyncContext, ref, computed, watch, withCtx, isRef, unref, createVNode, createTextVNode, openBlock, createBlock, createCommentVNode, toDisplayString, nextTick, mergeProps, Fragment, renderList, useModel, mergeModels, withDirectives, vModelText, useSSRContext } from 'vue';
18
18
  import { ssrRenderComponent, ssrInterpolate, ssrRenderAttrs, ssrRenderClass, ssrRenderList, ssrRenderStyle, ssrRenderAttr, ssrRenderTeleport, ssrIncludeBooleanAttr } from 'vue/server-renderer';
19
- import { b as buildRetryCommand } from './useOpenInIde-4GFf-kdi.mjs';
20
- import { u as useCopy } from './useCopy-CeKWgHyT.mjs';
21
- import { _ as __nuxt_component_4$1 } from './FilterToolbar-BwXy8xSk.mjs';
22
- import { _ as _sfc_main$o } from './Select-CUqj50wi.mjs';
23
- import { _ as _sfc_main$q } from './Checkbox-DvUBGagc.mjs';
24
- import { _ as __nuxt_component_1$3 } from './OpenInIdeLink-C4MXA8ya.mjs';
25
- import { _ as __nuxt_component_2$3 } from './TestMetaBadges-D5_yUtIP.mjs';
26
- import { _ as __nuxt_component_3$3 } from './BrowserBadge-D33lqUcj.mjs';
19
+ import { _ as __nuxt_component_19 } from './EntityLinks-CF0xG3Y8.mjs';
20
+ import { b as buildRetryCommand } from './useOpenInIde-DolN3bZ5.mjs';
21
+ import { u as useFetch, a as useCopy } from './fetch-BQg_fhX0.mjs';
22
+ import { _ as __nuxt_component_4$3 } from './FilterToolbar-BwXy8xSk.mjs';
23
+ import { _ as _sfc_main$q } from './Select-CVctwpib.mjs';
24
+ import { _ as _sfc_main$r } from './Checkbox-DmRKG-0s.mjs';
25
+ import { _ as __nuxt_component_1$3 } from './OpenInIdeLink-B9wvQkhy.mjs';
26
+ import { _ as __nuxt_component_2$3 } from './TestMetaBadges-BlyKmfeP.mjs';
27
+ import { _ as __nuxt_component_3$3 } from './BrowserBadge-DQqJS9CV.mjs';
27
28
  import { u as useTreeViewCookie } from './useTreeViewCookie-CQjQdTkH.mjs';
28
29
  import { _ as __nuxt_component_5$1 } from './ErrorState-CktYyeEZ.mjs';
29
- import { _ as __nuxt_component_1$1 } from './LoadingState-C3pBSuOO.mjs';
30
- import { _ as __nuxt_component_9$2 } from './EmptyState-Dtlab7S9.mjs';
31
- import { _ as __nuxt_component_11 } from './SectionCard-CN-v0FZ_.mjs';
30
+ import { _ as __nuxt_component_12$2 } from './LoadingState-B8v1nWJt.mjs';
31
+ import { _ as __nuxt_component_4$2 } from './EmptyState-DC2q_7TD.mjs';
32
+ import { _ as __nuxt_component_11 } from './SectionCard-BW5Lynrr.mjs';
32
33
  import { _ as __nuxt_component_3$2 } from './TableScroller-DMcdCVrH.mjs';
33
- import { _ as _sfc_main$i } from './Table-BRk04Hd2.mjs';
34
- import { _ as _sfc_main$n } from './Modal-Ck2XLt8d.mjs';
35
- import { _ as __nuxt_component_0$2 } from './DiagnosisPanel-B646dK4p.mjs';
36
- import { u as useFetch } from './fetch-B4FwBOzu.mjs';
37
- import { _ as _sfc_main$j } from './SelectMenu-Db7osY7J.mjs';
38
- import { _ as __nuxt_component_13$1 } from './RunStatusBadge-FfGb6bkW.mjs';
39
- import { _ as _sfc_main$l } from './Alert-C4xq8lao.mjs';
34
+ import { _ as _sfc_main$j } from './Table-BRk04Hd2.mjs';
35
+ import { _ as _sfc_main$o } from './Modal-pSDlXzT3.mjs';
36
+ import { _ as __nuxt_component_0$2 } from './DiagnosisPanel-BWTpoCKy.mjs';
37
+ import { _ as _sfc_main$l } from './SelectMenu-XLVBEa11.mjs';
38
+ import { _ as __nuxt_component_13$1 } from './RunStatusBadge-CuTDknRJ.mjs';
39
+ import { _ as _sfc_main$m } from './Alert-C4xq8lao.mjs';
40
40
  import { u as useRunComparison } from './useRunComparison-CiMBLpe2.mjs';
41
- import './DashboardSidebarToggle-DCTnHiIv.mjs';
41
+ import { _ as __nuxt_component_4$1 } from './FeatureUnavailable-CwPms6X_.mjs';
42
+ import './DashboardSidebarToggle-8EpBhX0R.mjs';
42
43
  import 'vue-router';
43
44
  import '@iconify/vue';
44
45
  import 'tailwindcss/colors';
@@ -71,6 +72,7 @@ import 'highlight.js/lib/languages/typescript';
71
72
  import 'highlight.js/lib/languages/xml';
72
73
  import 'highlight.js/lib/languages/yaml';
73
74
  import 'fflate';
75
+ import 'zod';
74
76
  import 'pixelmatch';
75
77
  import 'sharp';
76
78
  import '@anthropic-ai/sdk';
@@ -94,25 +96,187 @@ import 'node:zlib';
94
96
  import 'consola';
95
97
  import 'node:url';
96
98
  import '@iconify/utils';
97
- import './Tabs-Bbsg9wag.mjs';
98
- import './RovingFocusItem-BJSzTBjy.mjs';
99
- import './CodeBlock-BgE-NSmE.mjs';
100
- import './Textarea-Dv2-lOvW.mjs';
99
+ import './FormField-e7OnSKPM.mjs';
100
+ import './Label-DYDR1Oeh.mjs';
101
+ import './Switch-8zWfwI5B.mjs';
102
+ import './useFormControl-CZ9So7iX.mjs';
103
+ import './useForwardScopeId-D0ameaSU.mjs';
104
+ import './VisuallyHiddenInput-BHvzNumK.mjs';
105
+ import './CodeBlock-DGhKVFad.mjs';
106
+ import './useTauri-Kf3HE_42.mjs';
107
+ import './Tabs-BkSOnbaB.mjs';
108
+ import './RovingFocusItem--OEHI2P3.mjs';
109
+ import './Textarea-vkMKVQTJ.mjs';
101
110
  import './help-content-C876a9WD.mjs';
102
111
  import '../_/marker-categories.mjs';
103
112
  import 'date-fns';
104
- import './useFormControl-CZ9So7iX.mjs';
113
+ import '@vue/shared';
105
114
  import './handleAndDispatchCustomEvent-Bk_AVSSo.mjs';
106
115
  import './isValueEqualOrExist-D2qw9YEr.mjs';
107
- import './useForwardScopeId-D0ameaSU.mjs';
108
- import './VisuallyHiddenInput-D6kBJxVd.mjs';
109
- import './Label-DYDR1Oeh.mjs';
110
116
  import './Separator-CR4WcEKD.mjs';
111
117
  import '@tanstack/vue-table';
112
118
  import '@tanstack/vue-virtual';
113
- import '@vue/shared';
114
- import './virtualizer-Cd1hhlxC.mjs';
119
+ import './useAiStatus-UR8x-feE.mjs';
115
120
 
121
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
122
+ __name: "RunStorageChip",
123
+ __ssrInlineRender: true,
124
+ props: {
125
+ storageStats: {},
126
+ reports: {},
127
+ finalizing: { type: Boolean }
128
+ },
129
+ setup(__props) {
130
+ const config = useRuntimeConfig();
131
+ return (_ctx, _push, _parent, _attrs) => {
132
+ const _component_UIcon = _sfc_main$p;
133
+ const _component_UProgress = _sfc_main$j$1;
134
+ const _component_UPopover = _sfc_main$8$1;
135
+ const _component_HelpHint = __nuxt_component_2$2;
136
+ const _component_UButton = _sfc_main$k;
137
+ if (__props.finalizing) {
138
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "inline-flex items-center gap-2 text-info" }, _attrs))}>`);
139
+ _push(ssrRenderComponent(_component_UIcon, {
140
+ name: "i-lucide-upload",
141
+ class: "size-3.5 shrink-0 animate-pulse"
142
+ }, null, _parent));
143
+ _push(`<span class="text-xs font-medium whitespace-nowrap">Uploading reports &amp; traces…</span>`);
144
+ _push(ssrRenderComponent(_component_UProgress, {
145
+ value: null,
146
+ size: "sm",
147
+ color: "info",
148
+ class: "w-24 rounded-full animate-pulse"
149
+ }, null, _parent));
150
+ _push(`</div>`);
151
+ } else if (__props.storageStats?.totalFiles) {
152
+ _push(ssrRenderComponent(_component_UPopover, _attrs, {
153
+ content: withCtx((_, _push2, _parent2, _scopeId) => {
154
+ if (_push2) {
155
+ _push2(`<div class="p-3 w-72 space-y-2"${_scopeId}><p class="text-xs font-medium text-muted inline-flex items-center gap-1"${_scopeId}> Stored artifacts `);
156
+ _push2(ssrRenderComponent(_component_HelpHint, { topic: "run.reports" }, null, _parent2, _scopeId));
157
+ _push2(`</p><!--[-->`);
158
+ ssrRenderList(__props.reports, (report) => {
159
+ _push2(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId}>`);
160
+ _push2(ssrRenderComponent(_component_UButton, {
161
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
162
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
163
+ target: "_blank",
164
+ size: "xs",
165
+ variant: "outline",
166
+ class: "min-w-0",
167
+ ui: { label: "truncate" }
168
+ }, {
169
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
170
+ if (_push3) {
171
+ _push3(`${ssrInterpolate(report.label)}`);
172
+ } else {
173
+ return [
174
+ createTextVNode(toDisplayString(report.label), 1)
175
+ ];
176
+ }
177
+ }),
178
+ _: 2
179
+ }, _parent2, _scopeId));
180
+ _push2(`<span class="text-xs tabular-nums text-dimmed shrink-0"${_scopeId}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size))}</span></div>`);
181
+ });
182
+ _push2(`<!--]-->`);
183
+ if (__props.storageStats.testCaseFilesCount > 0) {
184
+ _push2(`<div class="flex items-center justify-between gap-2 text-sm border-t border-default pt-2"${_scopeId}><span class="truncate"${_scopeId}>Test files (${ssrInterpolate(__props.storageStats.testCaseFilesCount)})</span><span class="text-xs tabular-nums text-dimmed shrink-0"${_scopeId}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.testCaseFilesSize))}</span></div>`);
185
+ } else {
186
+ _push2(`<!---->`);
187
+ }
188
+ _push2(`</div>`);
189
+ } else {
190
+ return [
191
+ createVNode("div", { class: "p-3 w-72 space-y-2" }, [
192
+ createVNode("p", { class: "text-xs font-medium text-muted inline-flex items-center gap-1" }, [
193
+ createTextVNode(" Stored artifacts "),
194
+ createVNode(_component_HelpHint, { topic: "run.reports" })
195
+ ]),
196
+ (openBlock(true), createBlock(Fragment, null, renderList(__props.reports, (report) => {
197
+ return openBlock(), createBlock("div", {
198
+ key: `${report.type}-${report.path}`,
199
+ class: "flex items-center justify-between gap-2 min-w-0"
200
+ }, [
201
+ createVNode(_component_UButton, {
202
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
203
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
204
+ target: "_blank",
205
+ size: "xs",
206
+ variant: "outline",
207
+ class: "min-w-0",
208
+ ui: { label: "truncate" }
209
+ }, {
210
+ default: withCtx(() => [
211
+ createTextVNode(toDisplayString(report.label), 1)
212
+ ]),
213
+ _: 2
214
+ }, 1032, ["href", "icon"]),
215
+ createVNode("span", { class: "text-xs tabular-nums text-dimmed shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
216
+ ]);
217
+ }), 128)),
218
+ __props.storageStats.testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
219
+ key: 0,
220
+ class: "flex items-center justify-between gap-2 text-sm border-t border-default pt-2"
221
+ }, [
222
+ createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(__props.storageStats.testCaseFilesCount) + ")", 1),
223
+ createVNode("span", { class: "text-xs tabular-nums text-dimmed shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.testCaseFilesSize)), 1)
224
+ ])) : createCommentVNode("", true)
225
+ ])
226
+ ];
227
+ }
228
+ }),
229
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
230
+ if (_push2) {
231
+ _push2(`<button type="button" class="inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 -my-0.5 -ml-1.5 text-muted hover:text-default hover:bg-elevated/60 transition-colors cursor-pointer" title="Stored reports &amp; artifacts"${_scopeId}>`);
232
+ _push2(ssrRenderComponent(_component_UIcon, {
233
+ name: "i-lucide-database",
234
+ class: "size-3.5 text-dimmed shrink-0"
235
+ }, null, _parent2, _scopeId));
236
+ _push2(`<span class="tabular-nums whitespace-nowrap"${_scopeId}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.totalSize))} <span class="text-dimmed"${_scopeId}>· ${ssrInterpolate(__props.storageStats.totalFiles)} file${ssrInterpolate(__props.storageStats.totalFiles === 1 ? "" : "s")}</span></span>`);
237
+ _push2(ssrRenderComponent(_component_UIcon, {
238
+ name: "i-lucide-chevron-down",
239
+ class: "size-3 text-dimmed shrink-0"
240
+ }, null, _parent2, _scopeId));
241
+ _push2(`</button>`);
242
+ } else {
243
+ return [
244
+ createVNode("button", {
245
+ type: "button",
246
+ class: "inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 -my-0.5 -ml-1.5 text-muted hover:text-default hover:bg-elevated/60 transition-colors cursor-pointer",
247
+ title: "Stored reports & artifacts"
248
+ }, [
249
+ createVNode(_component_UIcon, {
250
+ name: "i-lucide-database",
251
+ class: "size-3.5 text-dimmed shrink-0"
252
+ }),
253
+ createVNode("span", { class: "tabular-nums whitespace-nowrap" }, [
254
+ createTextVNode(toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.totalSize)) + " ", 1),
255
+ createVNode("span", { class: "text-dimmed" }, "· " + toDisplayString(__props.storageStats.totalFiles) + " file" + toDisplayString(__props.storageStats.totalFiles === 1 ? "" : "s"), 1)
256
+ ]),
257
+ createVNode(_component_UIcon, {
258
+ name: "i-lucide-chevron-down",
259
+ class: "size-3 text-dimmed shrink-0"
260
+ })
261
+ ])
262
+ ];
263
+ }
264
+ }),
265
+ _: 1
266
+ }, _parent));
267
+ } else {
268
+ _push(`<!---->`);
269
+ }
270
+ };
271
+ }
272
+ });
273
+ const _sfc_setup$g = _sfc_main$g.setup;
274
+ _sfc_main$g.setup = (props, ctx) => {
275
+ const ssrContext = useSSRContext();
276
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/run/RunStorageChip.vue");
277
+ return _sfc_setup$g ? _sfc_setup$g(props, ctx) : void 0;
278
+ };
279
+ const __nuxt_component_18$1 = Object.assign(_sfc_main$g, { __name: "RunStorageChip" });
116
280
  const _sfc_main$f = /* @__PURE__ */ defineComponent({
117
281
  __name: "RunSummary",
118
282
  __ssrInlineRender: true,
@@ -132,17 +296,14 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
132
296
  const toast = useToast();
133
297
  const config = useRuntimeConfig();
134
298
  const storageStats = computed(() => props.testRun?.storageStats);
135
- const showCiEnv = computed(
136
- () => !!(props.testRun?.metadata?.ci || props.testRun?.environment || props.testRun?.playwrightVersion || props.testRun?.reporterVersion)
137
- );
138
- const showSource = computed(() => !!props.testRun?.metadata?.scm);
299
+ const ci = computed(() => props.testRun?.metadata?.ci);
300
+ const scm = computed(() => props.testRun?.metadata?.scm);
301
+ const tags = computed(() => props.testRun?.metadata?.tags);
302
+ const customData = computed(() => props.testRun?.metadata?.customData);
303
+ const showCiGroup = computed(() => !!(ci.value || props.testRun?.environment));
304
+ const showVersions = computed(() => !!(props.testRun?.playwrightVersion || props.testRun?.reporterVersion));
139
305
  const showStorage = computed(() => !!(storageStats.value?.totalFiles || props.finalizing));
140
- const showOther = computed(
141
- () => !!(props.testRun?.metadata?.tags?.length || props.testRun?.metadata?.projectDescription || props.testRun?.metadata?.relatedIssue || props.testRun?.metadata?.customData || props.testRun?.links?.length)
142
- );
143
- const { summaryColSpanClass, blockColSpanClass } = useDetailGrid(
144
- () => [showCiEnv, showSource, showStorage, showOther].filter((b) => b.value).length
145
- );
306
+ const primaryReport = computed(() => props.allReports[0] ?? null);
146
307
  const { copy, copied } = useCopy();
147
308
  const retryMode = ref("file-line");
148
309
  const retryCopied = ref(false);
@@ -237,28 +398,30 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
237
398
  }
238
399
  return (_ctx, _push, _parent, _attrs) => {
239
400
  const _component_FoldableSummary = __nuxt_component_0$1;
240
- const _component_StatusBlock = __nuxt_component_1$2;
401
+ const _component_StatusChip = __nuxt_component_1$1;
241
402
  const _component_UIcon = _sfc_main$p;
242
403
  const _component_UBadge = _sfc_main$7$1;
243
- const _component_TestStatusBar = __nuxt_component_14$2;
404
+ const _component_TestStatusBar = __nuxt_component_14$3;
244
405
  const _component_DurationValue = __nuxt_component_14$1;
245
- const _component_UCard = _sfc_main$m;
406
+ const _component_UCard = _sfc_main$n;
246
407
  const _component_HelpHint = __nuxt_component_2$2;
247
- const _component_UTooltip = _sfc_main$h;
408
+ const _component_UTooltip = _sfc_main$i;
248
409
  const _component_NuxtLink = __nuxt_component_12$1;
249
410
  const _component_MarkerBadge = __nuxt_component_5;
411
+ const _component_ClientOnly = __nuxt_component_7$1;
250
412
  const _component_UButton = _sfc_main$k;
251
413
  const _component_UPopover = _sfc_main$8$1;
252
- const _component_CiEnvCard = __nuxt_component_13$2;
253
- const _component_SourceInfoCard = __nuxt_component_14$3;
254
- const _component_BlockCard = __nuxt_component_15$1;
255
- const _component_UProgress = _sfc_main$j$1;
256
- const _component_EntityLinks = __nuxt_component_17$1;
414
+ const _component_DesktopRunLocallyButton = __nuxt_component_14$2;
415
+ const _component_StatTileGrid = __nuxt_component_1$2;
416
+ const _component_SummaryMetaStrip = __nuxt_component_16$1;
417
+ const _component_MetaStripGroup = __nuxt_component_17$1;
418
+ const _component_RunStorageChip = __nuxt_component_18$1;
419
+ const _component_EntityLinks = __nuxt_component_19;
257
420
  _push(ssrRenderComponent(_component_FoldableSummary, mergeProps({ "storage-key": "test-run" }, _attrs), {
258
421
  folded: withCtx((_, _push2, _parent2, _scopeId) => {
259
422
  if (_push2) {
260
423
  _push2(`<div class="flex items-center gap-3 flex-1 min-w-0 justify-between"${_scopeId}><div class="flex items-center gap-3 min-w-0"${_scopeId}>`);
261
- _push2(ssrRenderComponent(_component_StatusBlock, {
424
+ _push2(ssrRenderComponent(_component_StatusChip, {
262
425
  status: __props.testRun?.status ?? "",
263
426
  size: "sm"
264
427
  }, null, _parent2, _scopeId));
@@ -332,7 +495,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
332
495
  return [
333
496
  createVNode("div", { class: "flex items-center gap-3 flex-1 min-w-0 justify-between" }, [
334
497
  createVNode("div", { class: "flex items-center gap-3 min-w-0" }, [
335
- createVNode(_component_StatusBlock, {
498
+ createVNode(_component_StatusChip, {
336
499
  status: __props.testRun?.status ?? "",
337
500
  size: "sm"
338
501
  }, null, 8, ["status"]),
@@ -434,132 +597,854 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
434
597
  }),
435
598
  default: withCtx((_, _push2, _parent2, _scopeId) => {
436
599
  if (_push2) {
437
- _push2(`<div class="grid grid-cols-1 lg:grid-cols-12 gap-4"${_scopeId}><div class="${ssrRenderClass(unref(summaryColSpanClass))}"${_scopeId}>`);
438
- _push2(ssrRenderComponent(_component_UCard, { class: "shadow-xs h-full" }, {
439
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
600
+ _push2(`<div class="@container"${_scopeId}>`);
601
+ _push2(ssrRenderComponent(_component_UCard, {
602
+ class: "shadow-xs",
603
+ ui: { footer: "px-4 py-2.5 sm:px-4 bg-muted/30" }
604
+ }, {
605
+ footer: withCtx((_2, _push3, _parent3, _scopeId2) => {
440
606
  if (_push3) {
441
- _push3(`<div class="space-y-3"${_scopeId2}><div class="flex items-start gap-3"${_scopeId2}><div class="flex items-center gap-2.5 min-w-0 flex-1"${_scopeId2}>`);
442
- _push3(ssrRenderComponent(_component_StatusBlock, {
443
- status: __props.testRun?.status ?? "",
444
- size: "md"
445
- }, null, _parent3, _scopeId2));
446
- _push3(`<div class="min-w-0 flex-1"${_scopeId2}><div class="flex items-center gap-2"${_scopeId2}><h2 class="text-base font-bold shrink-0 flex items-center gap-1"${_scopeId2}> Run #${ssrInterpolate(__props.testRun?.id)} `);
447
- if (unref(editingLabel)) {
448
- _push3(`<!--[--><input${ssrRenderAttr("value", unref(labelInput))} type="text" placeholder="Add a label..." class="inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId2}>`);
449
- if (unref(savingLabel)) {
450
- _push3(ssrRenderComponent(_component_UIcon, {
451
- name: "i-lucide-loader-circle",
452
- class: "size-3.5 text-zinc-400 animate-spin shrink-0"
453
- }, null, _parent3, _scopeId2));
454
- } else {
455
- _push3(`<!---->`);
456
- }
457
- _push3(`<!--]-->`);
458
- } else {
459
- _push3(`<!--[-->`);
460
- if (__props.testRun?.label) {
461
- _push3(`<span class="font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400"${_scopeId2}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
462
- } else {
463
- _push3(`<button class="text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5" title="Add a label"${_scopeId2}> + label </button>`);
464
- }
465
- _push3(`<!--]-->`);
466
- }
467
- _push3(ssrRenderComponent(_component_HelpHint, { topic: "run.summary" }, null, _parent3, _scopeId2));
468
- _push3(`</h2>`);
469
- if (__props.testRun?.shardTotal && __props.testRun.shardTotal > 1) {
470
- _push3(ssrRenderComponent(_component_UBadge, {
471
- color: "neutral",
472
- variant: "soft",
473
- size: "sm",
474
- class: "shrink-0",
475
- title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
476
- }, {
477
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
478
- if (_push4) {
479
- _push4(ssrRenderComponent(_component_UIcon, {
480
- name: "i-lucide-layout-grid",
481
- class: "size-3 mr-1"
482
- }, null, _parent4, _scopeId3));
483
- _push4(` ${ssrInterpolate(__props.testRun.shardsFinished ?? 0)}/${ssrInterpolate(__props.testRun.shardTotal)}`);
607
+ _push3(ssrRenderComponent(_component_SummaryMetaStrip, null, {
608
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
609
+ if (_push4) {
610
+ if (unref(showCiGroup)) {
611
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
612
+ label: "CI & environment",
613
+ icon: "i-lucide-cloud",
614
+ help: "run.ci-env"
615
+ }, {
616
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
617
+ if (_push5) {
618
+ if (__props.testRun?.environment) {
619
+ _push5(`<span class="rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"${_scopeId4}>${ssrInterpolate(__props.testRun.environment)}</span>`);
620
+ } else {
621
+ _push5(`<!---->`);
622
+ }
623
+ if (unref(ci)?.provider) {
624
+ _push5(`<span${_scopeId4}>${ssrInterpolate(unref(ci).provider)}</span>`);
625
+ } else {
626
+ _push5(`<!---->`);
627
+ }
628
+ if (unref(ci)?.buildNumber || unref(ci)?.buildUrl) {
629
+ _push5(`<!--[--><span class="text-dimmed"${_scopeId4}>·</span>`);
630
+ if (unref(ci)?.buildUrl) {
631
+ _push5(`<a${ssrRenderAttr("href", unref(ci).buildUrl)} target="_blank" class="text-primary hover:underline"${_scopeId4}>${ssrInterpolate(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build")}</a>`);
632
+ } else {
633
+ _push5(`<span${_scopeId4}>Build #${ssrInterpolate(unref(ci).buildNumber)}</span>`);
634
+ }
635
+ _push5(`<!--]-->`);
636
+ } else {
637
+ _push5(`<!---->`);
638
+ }
639
+ if (unref(ci)?.workflow || unref(ci)?.jobName) {
640
+ _push5(`<!--[--><span class="text-dimmed"${_scopeId4}>·</span><span class="text-muted"${_scopeId4}>`);
641
+ if (unref(ci)?.workflow) {
642
+ _push5(`<!--[-->${ssrInterpolate(unref(ci).workflow)}<!--]-->`);
643
+ } else {
644
+ _push5(`<!---->`);
645
+ }
646
+ if (unref(ci)?.workflow && unref(ci)?.jobName) {
647
+ _push5(`<!--[--> · <!--]-->`);
648
+ } else {
649
+ _push5(`<!---->`);
650
+ }
651
+ if (unref(ci)?.jobName) {
652
+ _push5(`<!--[-->${ssrInterpolate(unref(ci).jobName)}<!--]-->`);
653
+ } else {
654
+ _push5(`<!---->`);
655
+ }
656
+ _push5(`</span><!--]-->`);
657
+ } else {
658
+ _push5(`<!---->`);
659
+ }
660
+ } else {
661
+ return [
662
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
663
+ key: 0,
664
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
665
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
666
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
667
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
668
+ createVNode("span", { class: "text-dimmed" }, "·"),
669
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
670
+ key: 0,
671
+ href: unref(ci).buildUrl,
672
+ target: "_blank",
673
+ class: "text-primary hover:underline"
674
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
675
+ ], 64)) : createCommentVNode("", true),
676
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
677
+ createVNode("span", { class: "text-dimmed" }, "·"),
678
+ createVNode("span", { class: "text-muted" }, [
679
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
680
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
681
+ ], 64)) : createCommentVNode("", true),
682
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
683
+ createTextVNode(" · ")
684
+ ], 64)) : createCommentVNode("", true),
685
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
686
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
687
+ ], 64)) : createCommentVNode("", true)
688
+ ])
689
+ ], 64)) : createCommentVNode("", true)
690
+ ];
691
+ }
692
+ }),
693
+ _: 1
694
+ }, _parent4, _scopeId3));
484
695
  } else {
485
- return [
486
- createVNode(_component_UIcon, {
487
- name: "i-lucide-layout-grid",
488
- class: "size-3 mr-1"
696
+ _push4(`<!---->`);
697
+ }
698
+ if (unref(scm)) {
699
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
700
+ label: "Source",
701
+ icon: "i-lucide-git-branch"
702
+ }, {
703
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
704
+ if (_push5) {
705
+ if (unref(scm).branch) {
706
+ _push5(`<span class="font-medium"${_scopeId4}>${ssrInterpolate(unref(scm).branch)}</span>`);
707
+ } else {
708
+ _push5(`<!---->`);
709
+ }
710
+ if (unref(scm).commit) {
711
+ _push5(`<code class="text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded"${ssrRenderAttr("title", unref(scm).commit)}${_scopeId4}>${ssrInterpolate(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit)}</code>`);
712
+ } else {
713
+ _push5(`<!---->`);
714
+ }
715
+ if (unref(scm).author) {
716
+ _push5(`<span class="text-muted"${_scopeId4}>${ssrInterpolate(unref(scm).author)}</span>`);
717
+ } else {
718
+ _push5(`<!---->`);
719
+ }
720
+ if (unref(scm).commitMessage) {
721
+ _push5(`<span class="text-xs text-dimmed truncate max-w-[40ch]"${ssrRenderAttr("title", unref(scm).commitMessage)}${_scopeId4}>${ssrInterpolate(unref(scm).commitMessage)}</span>`);
722
+ } else {
723
+ _push5(`<!---->`);
724
+ }
725
+ } else {
726
+ return [
727
+ unref(scm).branch ? (openBlock(), createBlock("span", {
728
+ key: 0,
729
+ class: "font-medium"
730
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
731
+ unref(scm).commit ? (openBlock(), createBlock("code", {
732
+ key: 1,
733
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
734
+ title: unref(scm).commit
735
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
736
+ unref(scm).author ? (openBlock(), createBlock("span", {
737
+ key: 2,
738
+ class: "text-muted"
739
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
740
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
741
+ key: 3,
742
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
743
+ title: unref(scm).commitMessage
744
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
745
+ ];
746
+ }
489
747
  }),
490
- createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
491
- ];
748
+ _: 1
749
+ }, _parent4, _scopeId3));
750
+ } else {
751
+ _push4(`<!---->`);
492
752
  }
493
- }),
494
- _: 1
495
- }, _parent3, _scopeId2));
496
- } else {
497
- _push3(`<!---->`);
498
- }
499
- if (__props.testRun?.precedingMarker) {
500
- _push3(ssrRenderComponent(_component_UTooltip, {
501
- text: `This run started after: ${__props.testRun.precedingMarker.label}`
502
- }, {
503
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
504
- if (_push4) {
505
- _push4(ssrRenderComponent(_component_NuxtLink, {
506
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
507
- class: "shrink-0 inline-flex items-center gap-1"
753
+ if (unref(showVersions)) {
754
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
755
+ label: "Tooling versions",
756
+ icon: "i-lucide-tag"
508
757
  }, {
509
758
  default: withCtx((_4, _push5, _parent5, _scopeId4) => {
510
759
  if (_push5) {
511
- _push5(`<span class="text-xs text-muted"${_scopeId4}>After</span>`);
512
- _push5(ssrRenderComponent(_component_MarkerBadge, {
513
- marker: __props.testRun.precedingMarker,
514
- size: "xs"
515
- }, null, _parent5, _scopeId4));
760
+ _push5(`<span class="text-muted whitespace-nowrap"${_scopeId4}>`);
761
+ if (__props.testRun?.playwrightVersion) {
762
+ _push5(`<!--[-->Playwright v${ssrInterpolate(__props.testRun.playwrightVersion)}<!--]-->`);
763
+ } else {
764
+ _push5(`<!---->`);
765
+ }
766
+ if (__props.testRun?.playwrightVersion && __props.testRun?.reporterVersion) {
767
+ _push5(`<!--[--> · <!--]-->`);
768
+ } else {
769
+ _push5(`<!---->`);
770
+ }
771
+ if (__props.testRun?.reporterVersion) {
772
+ _push5(`<!--[-->Piwi v${ssrInterpolate(__props.testRun.reporterVersion)}<!--]-->`);
773
+ } else {
774
+ _push5(`<!---->`);
775
+ }
776
+ _push5(`</span>`);
516
777
  } else {
517
778
  return [
518
- createVNode("span", { class: "text-xs text-muted" }, "After"),
519
- createVNode(_component_MarkerBadge, {
520
- marker: __props.testRun.precedingMarker,
521
- size: "xs"
522
- }, null, 8, ["marker"])
779
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
780
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
781
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
782
+ ], 64)) : createCommentVNode("", true),
783
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
784
+ createTextVNode(" · ")
785
+ ], 64)) : createCommentVNode("", true),
786
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
787
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
788
+ ], 64)) : createCommentVNode("", true)
789
+ ])
523
790
  ];
524
791
  }
525
792
  }),
526
793
  _: 1
527
794
  }, _parent4, _scopeId3));
528
795
  } else {
529
- return [
530
- createVNode(_component_NuxtLink, {
531
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
532
- class: "shrink-0 inline-flex items-center gap-1"
533
- }, {
534
- default: withCtx(() => [
535
- createVNode("span", { class: "text-xs text-muted" }, "After"),
536
- createVNode(_component_MarkerBadge, {
537
- marker: __props.testRun.precedingMarker,
538
- size: "xs"
539
- }, null, 8, ["marker"])
540
- ]),
541
- _: 1
542
- }, 8, ["to"])
543
- ];
796
+ _push4(`<!---->`);
544
797
  }
545
- }),
546
- _: 1
547
- }, _parent3, _scopeId2));
548
- } else {
549
- _push3(`<!---->`);
550
- }
551
- _push3(`<span class="text-xs text-zinc-500 ml-auto whitespace-nowrap"${_scopeId2}>${ssrInterpolate(__props.testRun?.project?.label ?? __props.testRun?.project?.name)} · Started ${ssrInterpolate(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime))}</span>`);
552
- _push3(ssrRenderComponent(_component_UTooltip, {
553
- text: unref(copied) ? "Copied!" : "Copy run summary"
554
- }, {
555
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
556
- if (_push4) {
557
- _push4(ssrRenderComponent(_component_UButton, {
798
+ if (unref(tags)?.length) {
799
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
800
+ label: "Tags",
801
+ icon: "i-lucide-tags"
802
+ }, {
803
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
804
+ if (_push5) {
805
+ _push5(`<!--[-->`);
806
+ ssrRenderList(unref(tags), (tag) => {
807
+ _push5(ssrRenderComponent(_component_UBadge, {
808
+ key: tag,
809
+ color: "neutral",
810
+ variant: "soft",
811
+ size: "sm"
812
+ }, {
813
+ default: withCtx((_5, _push6, _parent6, _scopeId5) => {
814
+ if (_push6) {
815
+ _push6(`${ssrInterpolate(tag)}`);
816
+ } else {
817
+ return [
818
+ createTextVNode(toDisplayString(tag), 1)
819
+ ];
820
+ }
821
+ }),
822
+ _: 2
823
+ }, _parent5, _scopeId4));
824
+ });
825
+ _push5(`<!--]-->`);
826
+ } else {
827
+ return [
828
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
829
+ return openBlock(), createBlock(_component_UBadge, {
830
+ key: tag,
831
+ color: "neutral",
832
+ variant: "soft",
833
+ size: "sm"
834
+ }, {
835
+ default: withCtx(() => [
836
+ createTextVNode(toDisplayString(tag), 1)
837
+ ]),
838
+ _: 2
839
+ }, 1024);
840
+ }), 128))
841
+ ];
842
+ }
843
+ }),
844
+ _: 1
845
+ }, _parent4, _scopeId3));
846
+ } else {
847
+ _push4(`<!---->`);
848
+ }
849
+ if (__props.testRun?.metadata?.relatedIssue) {
850
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
851
+ label: "Related issue",
852
+ icon: "i-lucide-bookmark"
853
+ }, {
854
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
855
+ if (_push5) {
856
+ _push5(`<span class="text-muted"${_scopeId4}>${ssrInterpolate(__props.testRun.metadata.relatedIssue)}</span>`);
857
+ } else {
858
+ return [
859
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
860
+ ];
861
+ }
862
+ }),
863
+ _: 1
864
+ }, _parent4, _scopeId3));
865
+ } else {
866
+ _push4(`<!---->`);
867
+ }
868
+ if (unref(showStorage)) {
869
+ _push4(ssrRenderComponent(_component_MetaStripGroup, { label: "Storage" }, {
870
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
871
+ if (_push5) {
872
+ _push5(ssrRenderComponent(_component_RunStorageChip, {
873
+ "storage-stats": unref(storageStats),
874
+ reports: __props.allReports,
875
+ finalizing: __props.finalizing
876
+ }, null, _parent5, _scopeId4));
877
+ } else {
878
+ return [
879
+ createVNode(_component_RunStorageChip, {
880
+ "storage-stats": unref(storageStats),
881
+ reports: __props.allReports,
882
+ finalizing: __props.finalizing
883
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
884
+ ];
885
+ }
886
+ }),
887
+ _: 1
888
+ }, _parent4, _scopeId3));
889
+ } else {
890
+ _push4(`<!---->`);
891
+ }
892
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
893
+ label: "Links",
894
+ icon: "i-lucide-link",
895
+ help: "run.metadata"
896
+ }, {
897
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
898
+ if (_push5) {
899
+ _push5(ssrRenderComponent(_component_EntityLinks, {
900
+ "entity-type": "test_run",
901
+ "entity-id": __props.testRun.id,
902
+ links: __props.testRun.links ?? null,
903
+ onUpdated: ($event) => _ctx.$emit("label-updated")
904
+ }, null, _parent5, _scopeId4));
905
+ } else {
906
+ return [
907
+ createVNode(_component_EntityLinks, {
908
+ "entity-type": "test_run",
909
+ "entity-id": __props.testRun.id,
910
+ links: __props.testRun.links ?? null,
911
+ onUpdated: ($event) => _ctx.$emit("label-updated")
912
+ }, null, 8, ["entity-id", "links", "onUpdated"])
913
+ ];
914
+ }
915
+ }),
916
+ _: 1
917
+ }, _parent4, _scopeId3));
918
+ if (unref(customData)) {
919
+ _push4(ssrRenderComponent(_component_MetaStripGroup, { label: "Custom data" }, {
920
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
921
+ if (_push5) {
922
+ _push5(ssrRenderComponent(_component_UButton, {
923
+ size: "xs",
924
+ variant: "ghost",
925
+ color: "neutral",
926
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
927
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
928
+ }, {
929
+ default: withCtx((_5, _push6, _parent6, _scopeId5) => {
930
+ if (_push6) {
931
+ _push6(` Custom data `);
932
+ } else {
933
+ return [
934
+ createTextVNode(" Custom data ")
935
+ ];
936
+ }
937
+ }),
938
+ _: 1
939
+ }, _parent5, _scopeId4));
940
+ } else {
941
+ return [
942
+ createVNode(_component_UButton, {
943
+ size: "xs",
944
+ variant: "ghost",
945
+ color: "neutral",
946
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
947
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
948
+ }, {
949
+ default: withCtx(() => [
950
+ createTextVNode(" Custom data ")
951
+ ]),
952
+ _: 1
953
+ }, 8, ["icon", "onClick"])
954
+ ];
955
+ }
956
+ }),
957
+ _: 1
958
+ }, _parent4, _scopeId3));
959
+ } else {
960
+ _push4(`<!---->`);
961
+ }
962
+ } else {
963
+ return [
964
+ unref(showCiGroup) ? (openBlock(), createBlock(_component_MetaStripGroup, {
965
+ key: 0,
966
+ label: "CI & environment",
967
+ icon: "i-lucide-cloud",
968
+ help: "run.ci-env"
969
+ }, {
970
+ default: withCtx(() => [
971
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
972
+ key: 0,
973
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
974
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
975
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
976
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
977
+ createVNode("span", { class: "text-dimmed" }, "·"),
978
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
979
+ key: 0,
980
+ href: unref(ci).buildUrl,
981
+ target: "_blank",
982
+ class: "text-primary hover:underline"
983
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
984
+ ], 64)) : createCommentVNode("", true),
985
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
986
+ createVNode("span", { class: "text-dimmed" }, "·"),
987
+ createVNode("span", { class: "text-muted" }, [
988
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
989
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
990
+ ], 64)) : createCommentVNode("", true),
991
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
992
+ createTextVNode(" · ")
993
+ ], 64)) : createCommentVNode("", true),
994
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
995
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
996
+ ], 64)) : createCommentVNode("", true)
997
+ ])
998
+ ], 64)) : createCommentVNode("", true)
999
+ ]),
1000
+ _: 1
1001
+ })) : createCommentVNode("", true),
1002
+ unref(scm) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1003
+ key: 1,
1004
+ label: "Source",
1005
+ icon: "i-lucide-git-branch"
1006
+ }, {
1007
+ default: withCtx(() => [
1008
+ unref(scm).branch ? (openBlock(), createBlock("span", {
1009
+ key: 0,
1010
+ class: "font-medium"
1011
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
1012
+ unref(scm).commit ? (openBlock(), createBlock("code", {
1013
+ key: 1,
1014
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
1015
+ title: unref(scm).commit
1016
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
1017
+ unref(scm).author ? (openBlock(), createBlock("span", {
1018
+ key: 2,
1019
+ class: "text-muted"
1020
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
1021
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
1022
+ key: 3,
1023
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
1024
+ title: unref(scm).commitMessage
1025
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
1026
+ ]),
1027
+ _: 1
1028
+ })) : createCommentVNode("", true),
1029
+ unref(showVersions) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1030
+ key: 2,
1031
+ label: "Tooling versions",
1032
+ icon: "i-lucide-tag"
1033
+ }, {
1034
+ default: withCtx(() => [
1035
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
1036
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1037
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
1038
+ ], 64)) : createCommentVNode("", true),
1039
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
1040
+ createTextVNode(" · ")
1041
+ ], 64)) : createCommentVNode("", true),
1042
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1043
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
1044
+ ], 64)) : createCommentVNode("", true)
1045
+ ])
1046
+ ]),
1047
+ _: 1
1048
+ })) : createCommentVNode("", true),
1049
+ unref(tags)?.length ? (openBlock(), createBlock(_component_MetaStripGroup, {
1050
+ key: 3,
1051
+ label: "Tags",
1052
+ icon: "i-lucide-tags"
1053
+ }, {
1054
+ default: withCtx(() => [
1055
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
1056
+ return openBlock(), createBlock(_component_UBadge, {
1057
+ key: tag,
1058
+ color: "neutral",
1059
+ variant: "soft",
1060
+ size: "sm"
1061
+ }, {
1062
+ default: withCtx(() => [
1063
+ createTextVNode(toDisplayString(tag), 1)
1064
+ ]),
1065
+ _: 2
1066
+ }, 1024);
1067
+ }), 128))
1068
+ ]),
1069
+ _: 1
1070
+ })) : createCommentVNode("", true),
1071
+ __props.testRun?.metadata?.relatedIssue ? (openBlock(), createBlock(_component_MetaStripGroup, {
1072
+ key: 4,
1073
+ label: "Related issue",
1074
+ icon: "i-lucide-bookmark"
1075
+ }, {
1076
+ default: withCtx(() => [
1077
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1078
+ ]),
1079
+ _: 1
1080
+ })) : createCommentVNode("", true),
1081
+ unref(showStorage) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1082
+ key: 5,
1083
+ label: "Storage"
1084
+ }, {
1085
+ default: withCtx(() => [
1086
+ createVNode(_component_RunStorageChip, {
1087
+ "storage-stats": unref(storageStats),
1088
+ reports: __props.allReports,
1089
+ finalizing: __props.finalizing
1090
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
1091
+ ]),
1092
+ _: 1
1093
+ })) : createCommentVNode("", true),
1094
+ createVNode(_component_MetaStripGroup, {
1095
+ label: "Links",
1096
+ icon: "i-lucide-link",
1097
+ help: "run.metadata"
1098
+ }, {
1099
+ default: withCtx(() => [
1100
+ createVNode(_component_EntityLinks, {
1101
+ "entity-type": "test_run",
1102
+ "entity-id": __props.testRun.id,
1103
+ links: __props.testRun.links ?? null,
1104
+ onUpdated: ($event) => _ctx.$emit("label-updated")
1105
+ }, null, 8, ["entity-id", "links", "onUpdated"])
1106
+ ]),
1107
+ _: 1
1108
+ }),
1109
+ unref(customData) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1110
+ key: 6,
1111
+ label: "Custom data"
1112
+ }, {
1113
+ default: withCtx(() => [
1114
+ createVNode(_component_UButton, {
1115
+ size: "xs",
1116
+ variant: "ghost",
1117
+ color: "neutral",
1118
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1119
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1120
+ }, {
1121
+ default: withCtx(() => [
1122
+ createTextVNode(" Custom data ")
1123
+ ]),
1124
+ _: 1
1125
+ }, 8, ["icon", "onClick"])
1126
+ ]),
1127
+ _: 1
1128
+ })) : createCommentVNode("", true)
1129
+ ];
1130
+ }
1131
+ }),
1132
+ _: 1
1133
+ }, _parent3, _scopeId2));
1134
+ if (__props.showCustomData && unref(customData)) {
1135
+ _push3(`<div class="mt-2"${_scopeId2}><div class="bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"${_scopeId2}><pre class="m-0"${_scopeId2}>${ssrInterpolate(JSON.stringify(unref(customData), null, 2))}</pre></div></div>`);
1136
+ } else {
1137
+ _push3(`<!---->`);
1138
+ }
1139
+ } else {
1140
+ return [
1141
+ createVNode(_component_SummaryMetaStrip, null, {
1142
+ default: withCtx(() => [
1143
+ unref(showCiGroup) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1144
+ key: 0,
1145
+ label: "CI & environment",
1146
+ icon: "i-lucide-cloud",
1147
+ help: "run.ci-env"
1148
+ }, {
1149
+ default: withCtx(() => [
1150
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
1151
+ key: 0,
1152
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
1153
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
1154
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
1155
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1156
+ createVNode("span", { class: "text-dimmed" }, "·"),
1157
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
1158
+ key: 0,
1159
+ href: unref(ci).buildUrl,
1160
+ target: "_blank",
1161
+ class: "text-primary hover:underline"
1162
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
1163
+ ], 64)) : createCommentVNode("", true),
1164
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
1165
+ createVNode("span", { class: "text-dimmed" }, "·"),
1166
+ createVNode("span", { class: "text-muted" }, [
1167
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1168
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
1169
+ ], 64)) : createCommentVNode("", true),
1170
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
1171
+ createTextVNode(" · ")
1172
+ ], 64)) : createCommentVNode("", true),
1173
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1174
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
1175
+ ], 64)) : createCommentVNode("", true)
1176
+ ])
1177
+ ], 64)) : createCommentVNode("", true)
1178
+ ]),
1179
+ _: 1
1180
+ })) : createCommentVNode("", true),
1181
+ unref(scm) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1182
+ key: 1,
1183
+ label: "Source",
1184
+ icon: "i-lucide-git-branch"
1185
+ }, {
1186
+ default: withCtx(() => [
1187
+ unref(scm).branch ? (openBlock(), createBlock("span", {
1188
+ key: 0,
1189
+ class: "font-medium"
1190
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
1191
+ unref(scm).commit ? (openBlock(), createBlock("code", {
1192
+ key: 1,
1193
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
1194
+ title: unref(scm).commit
1195
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
1196
+ unref(scm).author ? (openBlock(), createBlock("span", {
1197
+ key: 2,
1198
+ class: "text-muted"
1199
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
1200
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
1201
+ key: 3,
1202
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
1203
+ title: unref(scm).commitMessage
1204
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
1205
+ ]),
1206
+ _: 1
1207
+ })) : createCommentVNode("", true),
1208
+ unref(showVersions) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1209
+ key: 2,
1210
+ label: "Tooling versions",
1211
+ icon: "i-lucide-tag"
1212
+ }, {
1213
+ default: withCtx(() => [
1214
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
1215
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1216
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
1217
+ ], 64)) : createCommentVNode("", true),
1218
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
1219
+ createTextVNode(" · ")
1220
+ ], 64)) : createCommentVNode("", true),
1221
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1222
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
1223
+ ], 64)) : createCommentVNode("", true)
1224
+ ])
1225
+ ]),
1226
+ _: 1
1227
+ })) : createCommentVNode("", true),
1228
+ unref(tags)?.length ? (openBlock(), createBlock(_component_MetaStripGroup, {
1229
+ key: 3,
1230
+ label: "Tags",
1231
+ icon: "i-lucide-tags"
1232
+ }, {
1233
+ default: withCtx(() => [
1234
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
1235
+ return openBlock(), createBlock(_component_UBadge, {
1236
+ key: tag,
1237
+ color: "neutral",
1238
+ variant: "soft",
1239
+ size: "sm"
1240
+ }, {
1241
+ default: withCtx(() => [
1242
+ createTextVNode(toDisplayString(tag), 1)
1243
+ ]),
1244
+ _: 2
1245
+ }, 1024);
1246
+ }), 128))
1247
+ ]),
1248
+ _: 1
1249
+ })) : createCommentVNode("", true),
1250
+ __props.testRun?.metadata?.relatedIssue ? (openBlock(), createBlock(_component_MetaStripGroup, {
1251
+ key: 4,
1252
+ label: "Related issue",
1253
+ icon: "i-lucide-bookmark"
1254
+ }, {
1255
+ default: withCtx(() => [
1256
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1257
+ ]),
1258
+ _: 1
1259
+ })) : createCommentVNode("", true),
1260
+ unref(showStorage) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1261
+ key: 5,
1262
+ label: "Storage"
1263
+ }, {
1264
+ default: withCtx(() => [
1265
+ createVNode(_component_RunStorageChip, {
1266
+ "storage-stats": unref(storageStats),
1267
+ reports: __props.allReports,
1268
+ finalizing: __props.finalizing
1269
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
1270
+ ]),
1271
+ _: 1
1272
+ })) : createCommentVNode("", true),
1273
+ createVNode(_component_MetaStripGroup, {
1274
+ label: "Links",
1275
+ icon: "i-lucide-link",
1276
+ help: "run.metadata"
1277
+ }, {
1278
+ default: withCtx(() => [
1279
+ createVNode(_component_EntityLinks, {
1280
+ "entity-type": "test_run",
1281
+ "entity-id": __props.testRun.id,
1282
+ links: __props.testRun.links ?? null,
1283
+ onUpdated: ($event) => _ctx.$emit("label-updated")
1284
+ }, null, 8, ["entity-id", "links", "onUpdated"])
1285
+ ]),
1286
+ _: 1
1287
+ }),
1288
+ unref(customData) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1289
+ key: 6,
1290
+ label: "Custom data"
1291
+ }, {
1292
+ default: withCtx(() => [
1293
+ createVNode(_component_UButton, {
1294
+ size: "xs",
1295
+ variant: "ghost",
1296
+ color: "neutral",
1297
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1298
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1299
+ }, {
1300
+ default: withCtx(() => [
1301
+ createTextVNode(" Custom data ")
1302
+ ]),
1303
+ _: 1
1304
+ }, 8, ["icon", "onClick"])
1305
+ ]),
1306
+ _: 1
1307
+ })) : createCommentVNode("", true)
1308
+ ]),
1309
+ _: 1
1310
+ }),
1311
+ __props.showCustomData && unref(customData) ? (openBlock(), createBlock("div", {
1312
+ key: 0,
1313
+ class: "mt-2"
1314
+ }, [
1315
+ createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1316
+ createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(unref(customData), null, 2)), 1)
1317
+ ])
1318
+ ])) : createCommentVNode("", true)
1319
+ ];
1320
+ }
1321
+ }),
1322
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1323
+ if (_push3) {
1324
+ _push3(`<div class="space-y-3"${_scopeId2}><div class="flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8"${_scopeId2}><div class="min-w-0 flex-1 basis-64"${_scopeId2}><div class="flex items-center gap-2 flex-wrap"${_scopeId2}>`);
1325
+ _push3(ssrRenderComponent(_component_StatusChip, {
1326
+ status: __props.testRun?.status ?? ""
1327
+ }, null, _parent3, _scopeId2));
1328
+ _push3(`<h2 class="text-base font-bold shrink-0 flex items-center gap-1"${_scopeId2}> Run #${ssrInterpolate(__props.testRun?.id)} `);
1329
+ if (unref(editingLabel)) {
1330
+ _push3(`<!--[--><input${ssrRenderAttr("value", unref(labelInput))} type="text" placeholder="Add a label..." class="inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId2}>`);
1331
+ if (unref(savingLabel)) {
1332
+ _push3(ssrRenderComponent(_component_UIcon, {
1333
+ name: "i-lucide-loader-circle",
1334
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1335
+ }, null, _parent3, _scopeId2));
1336
+ } else {
1337
+ _push3(`<!---->`);
1338
+ }
1339
+ _push3(`<!--]-->`);
1340
+ } else {
1341
+ _push3(`<!--[-->`);
1342
+ if (__props.testRun?.label) {
1343
+ _push3(`<span class="font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400"${_scopeId2}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
1344
+ } else {
1345
+ _push3(`<button class="text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5" title="Add a label"${_scopeId2}> + label </button>`);
1346
+ }
1347
+ _push3(`<!--]-->`);
1348
+ }
1349
+ _push3(ssrRenderComponent(_component_HelpHint, { topic: "run.summary" }, null, _parent3, _scopeId2));
1350
+ _push3(`</h2>`);
1351
+ if (__props.testRun?.shardTotal && __props.testRun.shardTotal > 1) {
1352
+ _push3(ssrRenderComponent(_component_UBadge, {
1353
+ color: "neutral",
1354
+ variant: "soft",
1355
+ size: "sm",
1356
+ class: "shrink-0",
1357
+ title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
1358
+ }, {
1359
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1360
+ if (_push4) {
1361
+ _push4(ssrRenderComponent(_component_UIcon, {
1362
+ name: "i-lucide-layout-grid",
1363
+ class: "size-3 mr-1"
1364
+ }, null, _parent4, _scopeId3));
1365
+ _push4(` ${ssrInterpolate(__props.testRun.shardsFinished ?? 0)}/${ssrInterpolate(__props.testRun.shardTotal)}`);
1366
+ } else {
1367
+ return [
1368
+ createVNode(_component_UIcon, {
1369
+ name: "i-lucide-layout-grid",
1370
+ class: "size-3 mr-1"
1371
+ }),
1372
+ createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
1373
+ ];
1374
+ }
1375
+ }),
1376
+ _: 1
1377
+ }, _parent3, _scopeId2));
1378
+ } else {
1379
+ _push3(`<!---->`);
1380
+ }
1381
+ if (__props.testRun?.precedingMarker) {
1382
+ _push3(ssrRenderComponent(_component_UTooltip, {
1383
+ text: `This run started after: ${__props.testRun.precedingMarker.label}`
1384
+ }, {
1385
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1386
+ if (_push4) {
1387
+ _push4(ssrRenderComponent(_component_NuxtLink, {
1388
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1389
+ class: "shrink-0 inline-flex items-center gap-1"
1390
+ }, {
1391
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
1392
+ if (_push5) {
1393
+ _push5(`<span class="text-xs text-muted"${_scopeId4}>After</span>`);
1394
+ _push5(ssrRenderComponent(_component_MarkerBadge, {
1395
+ marker: __props.testRun.precedingMarker,
1396
+ size: "xs"
1397
+ }, null, _parent5, _scopeId4));
1398
+ } else {
1399
+ return [
1400
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
1401
+ createVNode(_component_MarkerBadge, {
1402
+ marker: __props.testRun.precedingMarker,
1403
+ size: "xs"
1404
+ }, null, 8, ["marker"])
1405
+ ];
1406
+ }
1407
+ }),
1408
+ _: 1
1409
+ }, _parent4, _scopeId3));
1410
+ } else {
1411
+ return [
1412
+ createVNode(_component_NuxtLink, {
1413
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1414
+ class: "shrink-0 inline-flex items-center gap-1"
1415
+ }, {
1416
+ default: withCtx(() => [
1417
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
1418
+ createVNode(_component_MarkerBadge, {
1419
+ marker: __props.testRun.precedingMarker,
1420
+ size: "xs"
1421
+ }, null, 8, ["marker"])
1422
+ ]),
1423
+ _: 1
1424
+ }, 8, ["to"])
1425
+ ];
1426
+ }
1427
+ }),
1428
+ _: 1
1429
+ }, _parent3, _scopeId2));
1430
+ } else {
1431
+ _push3(`<!---->`);
1432
+ }
1433
+ _push3(`</div><p class="mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap"${_scopeId2}><span${_scopeId2}>Started ${ssrInterpolate(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime))}</span>`);
1434
+ _push3(ssrRenderComponent(_component_ClientOnly, null, {}, _parent3, _scopeId2));
1435
+ _push3(`</p></div><div class="flex items-center gap-1.5 shrink-0"${_scopeId2}>`);
1436
+ _push3(ssrRenderComponent(_component_UTooltip, {
1437
+ text: unref(copied) ? "Copied!" : "Copy run summary"
1438
+ }, {
1439
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1440
+ if (_push4) {
1441
+ _push4(ssrRenderComponent(_component_UButton, {
558
1442
  size: "xs",
559
1443
  variant: "ghost",
560
1444
  color: "neutral",
561
1445
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
562
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1446
+ "aria-label": "Copy run summary",
1447
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
563
1448
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
564
1449
  }, null, _parent4, _scopeId3));
565
1450
  } else {
@@ -569,7 +1454,8 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
569
1454
  variant: "ghost",
570
1455
  color: "neutral",
571
1456
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
572
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1457
+ "aria-label": "Copy run summary",
1458
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
573
1459
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
574
1460
  }, null, 8, ["icon", "onClick"])
575
1461
  ];
@@ -609,14 +1495,15 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
609
1495
  variant: "subtle",
610
1496
  icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
611
1497
  title: unref(retryTitle),
1498
+ "aria-label": "Retry",
612
1499
  onClick: ($event) => copyRetryCommand()
613
1500
  }, {
614
1501
  default: withCtx((_4, _push5, _parent5, _scopeId4) => {
615
1502
  if (_push5) {
616
- _push5(` Retry `);
1503
+ _push5(`<span class="hidden @2xl:inline"${_scopeId4}>Retry</span>`);
617
1504
  } else {
618
1505
  return [
619
- createTextVNode(" Retry ")
1506
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
620
1507
  ];
621
1508
  }
622
1509
  }),
@@ -630,10 +1517,11 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
630
1517
  variant: "subtle",
631
1518
  icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
632
1519
  title: unref(retryTitle),
1520
+ "aria-label": "Retry",
633
1521
  onClick: ($event) => copyRetryCommand()
634
1522
  }, {
635
1523
  default: withCtx(() => [
636
- createTextVNode(" Retry ")
1524
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
637
1525
  ]),
638
1526
  _: 1
639
1527
  }, 8, ["icon", "title", "onClick"])
@@ -645,38 +1533,151 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
645
1533
  } else {
646
1534
  _push3(`<!---->`);
647
1535
  }
648
- _push3(`</div></div></div></div><div class="grid grid-cols-3 sm:grid-cols-5 gap-2"${_scopeId2}><button class="${ssrRenderClass([
649
- __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
650
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
651
- ])}"${_scopeId2}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId2}>Total</p><p class="text-xl font-bold mt-0.5"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0)}</p></button><div class="relative"${_scopeId2}><button class="${ssrRenderClass([
652
- __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30",
653
- "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer"
654
- ])}"${_scopeId2}><p class="text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider"${_scopeId2}> Passed </p><p class="text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</p></button>`);
655
- if ((__props.testRun?.flakyTests ?? 0) > 0) {
656
- _push3(`<button class="${ssrRenderClass([
657
- __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60",
658
- "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer"
659
- ])}" title="Flaky — passed only after a retry (a subset of passed). Click to filter."${_scopeId2}>`);
660
- _push3(ssrRenderComponent(_component_UIcon, {
661
- name: "i-lucide-shuffle",
662
- class: "size-3"
1536
+ if (unref(failedCases).length > 0) {
1537
+ _push3(ssrRenderComponent(_component_DesktopRunLocallyButton, {
1538
+ "project-id": __props.testRun?.project?.id,
1539
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
1540
+ cases: unref(failedCases)
663
1541
  }, null, _parent3, _scopeId2));
664
- _push3(` ${ssrInterpolate(__props.testRun?.flakyTests ?? 0)}</button>`);
665
1542
  } else {
666
1543
  _push3(`<!---->`);
667
1544
  }
668
- _push3(`</div><button class="${ssrRenderClass([
669
- __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30",
670
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
671
- ])}"${_scopeId2}><p class="text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider"${_scopeId2}>Failed</p><p class="text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</p></button><button class="${ssrRenderClass([
672
- __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
673
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
674
- ])}"${_scopeId2}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId2}>Skipped</p><p class="text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</p></button><button class="${ssrRenderClass([
675
- __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30",
676
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
677
- ])}" title="Tests that never ran (maxFailures cutoff or a serial-group failure)"${_scopeId2}><p class="text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"${_scopeId2}> Didn&#39;t run </p><p class="text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"${_scopeId2}>${ssrInterpolate(__props.testRun?.didNotRunTests ?? 0)}</p></button></div><div${_scopeId2}>`);
1545
+ if (unref(primaryReport)) {
1546
+ _push3(ssrRenderComponent(_component_UButton, {
1547
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(unref(primaryReport).path, null, unref(config).app?.baseURL),
1548
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(unref(primaryReport).type),
1549
+ target: "_blank",
1550
+ size: "xs",
1551
+ color: "primary",
1552
+ variant: "outline",
1553
+ "aria-label": unref(primaryReport).label,
1554
+ title: unref(primaryReport).size ? `${unref(primaryReport).label} · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(primaryReport).size)}` : unref(primaryReport).label
1555
+ }, {
1556
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1557
+ if (_push4) {
1558
+ _push4(`<span class="hidden @2xl:inline"${_scopeId3}>${ssrInterpolate(unref(primaryReport).label)}</span>`);
1559
+ } else {
1560
+ return [
1561
+ createVNode("span", { class: "hidden @2xl:inline" }, toDisplayString(unref(primaryReport).label), 1)
1562
+ ];
1563
+ }
1564
+ }),
1565
+ _: 1
1566
+ }, _parent3, _scopeId2));
1567
+ } else {
1568
+ _push3(`<!---->`);
1569
+ }
1570
+ _push3(`</div></div>`);
1571
+ _push3(ssrRenderComponent(_component_StatTileGrid, { "min-tile-width": "7.5rem" }, {
1572
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1573
+ if (_push4) {
1574
+ _push4(`<button class="${ssrRenderClass([
1575
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
1576
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1577
+ ])}"${_scopeId3}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId3}>Total</p><p class="text-xl font-bold mt-0.5"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0)}</p></button><div class="relative"${_scopeId3}><button class="${ssrRenderClass([
1578
+ __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30",
1579
+ "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer"
1580
+ ])}"${_scopeId3}><p class="text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider"${_scopeId3}> Passed </p><p class="text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</p></button>`);
1581
+ if ((__props.testRun?.flakyTests ?? 0) > 0) {
1582
+ _push4(`<button class="${ssrRenderClass([
1583
+ __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60",
1584
+ "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer"
1585
+ ])}" title="Flaky — passed only after a retry (a subset of passed). Click to filter."${_scopeId3}>`);
1586
+ _push4(ssrRenderComponent(_component_UIcon, {
1587
+ name: "i-lucide-shuffle",
1588
+ class: "size-3"
1589
+ }, null, _parent4, _scopeId3));
1590
+ _push4(` ${ssrInterpolate(__props.testRun?.flakyTests ?? 0)}</button>`);
1591
+ } else {
1592
+ _push4(`<!---->`);
1593
+ }
1594
+ _push4(`</div><button class="${ssrRenderClass([
1595
+ __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30",
1596
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1597
+ ])}"${_scopeId3}><p class="text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider"${_scopeId3}>Failed</p><p class="text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</p></button><button class="${ssrRenderClass([
1598
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
1599
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1600
+ ])}"${_scopeId3}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId3}>Skipped</p><p class="text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</p></button><button class="${ssrRenderClass([
1601
+ __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30",
1602
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1603
+ ])}" title="Tests that never ran (maxFailures cutoff or a serial-group failure)"${_scopeId3}><p class="text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"${_scopeId3}>Didn&#39;t run</p><p class="text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"${_scopeId3}>${ssrInterpolate(__props.testRun?.didNotRunTests ?? 0)}</p></button>`);
1604
+ } else {
1605
+ return [
1606
+ createVNode("button", {
1607
+ class: [
1608
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1609
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1610
+ ],
1611
+ onClick: ($event) => emit("filter-status", "all")
1612
+ }, [
1613
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
1614
+ createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
1615
+ ], 10, ["onClick"]),
1616
+ createVNode("div", { class: "relative" }, [
1617
+ createVNode("button", {
1618
+ class: [
1619
+ "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
1620
+ __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"
1621
+ ],
1622
+ onClick: ($event) => emit("filter-status", "passed")
1623
+ }, [
1624
+ createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
1625
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1626
+ ], 10, ["onClick"]),
1627
+ (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
1628
+ key: 0,
1629
+ class: [
1630
+ "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",
1631
+ __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"
1632
+ ],
1633
+ title: "Flaky — passed only after a retry (a subset of passed). Click to filter.",
1634
+ onClick: ($event) => emit("filter-status", "flaky")
1635
+ }, [
1636
+ createVNode(_component_UIcon, {
1637
+ name: "i-lucide-shuffle",
1638
+ class: "size-3"
1639
+ }),
1640
+ createTextVNode(" " + toDisplayString(__props.testRun?.flakyTests ?? 0), 1)
1641
+ ], 10, ["onClick"])) : createCommentVNode("", true)
1642
+ ]),
1643
+ createVNode("button", {
1644
+ class: [
1645
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1646
+ __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"
1647
+ ],
1648
+ onClick: ($event) => emit("filter-status", "failed")
1649
+ }, [
1650
+ createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
1651
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
1652
+ ], 10, ["onClick"]),
1653
+ createVNode("button", {
1654
+ class: [
1655
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1656
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1657
+ ],
1658
+ onClick: ($event) => emit("filter-status", "skipped")
1659
+ }, [
1660
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
1661
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
1662
+ ], 10, ["onClick"]),
1663
+ createVNode("button", {
1664
+ class: [
1665
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1666
+ __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"
1667
+ ],
1668
+ title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
1669
+ onClick: ($event) => emit("filter-status", "didnotrun")
1670
+ }, [
1671
+ createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, "Didn't run"),
1672
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
1673
+ ], 10, ["onClick"])
1674
+ ];
1675
+ }
1676
+ }),
1677
+ _: 1
1678
+ }, _parent3, _scopeId2));
678
1679
  if (__props.testRun) {
679
- _push3(`<div class="flex items-center gap-3"${_scopeId2}><div class="flex-1 max-w-md"${_scopeId2}>`);
1680
+ _push3(`<div class="flex items-center gap-x-4 gap-y-1.5 flex-wrap"${_scopeId2}><div class="flex-1 basis-60 min-w-44 max-w-xl"${_scopeId2}>`);
680
1681
  _push3(ssrRenderComponent(_component_TestStatusBar, {
681
1682
  passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
682
1683
  failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
@@ -685,7 +1686,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
685
1686
  "did-not-run": __props.testRun?.didNotRunTests ?? 0,
686
1687
  total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
687
1688
  }, null, _parent3, _scopeId2));
688
- _push3(`</div><div class="flex items-center gap-3 text-xs shrink-0"${_scopeId2}><div class="flex items-center gap-1"${_scopeId2}>`);
1689
+ _push3(`</div><div class="flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0"${_scopeId2}><div class="flex items-center gap-1"${_scopeId2}>`);
689
1690
  _push3(ssrRenderComponent(_component_UIcon, {
690
1691
  name: "i-lucide-clock",
691
1692
  class: "size-3.5 text-zinc-400"
@@ -701,7 +1702,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
701
1702
  name: "i-lucide-gauge",
702
1703
  class: "size-3.5 text-zinc-400"
703
1704
  }, null, _parent3, _scopeId2));
704
- _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>Avg</span>`);
1705
+ _push3(`<span class="text-zinc-500"${_scopeId2}>Avg</span>`);
705
1706
  _push3(ssrRenderComponent(_component_DurationValue, {
706
1707
  ms: __props.testRun.avgTestDuration,
707
1708
  class: "font-medium"
@@ -716,7 +1717,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
716
1717
  name: "i-lucide-arrow-up-right",
717
1718
  class: "size-3.5 text-orange-500"
718
1719
  }, null, _parent3, _scopeId2));
719
- _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>P90</span>`);
1720
+ _push3(`<span class="text-zinc-500"${_scopeId2}>P90</span>`);
720
1721
  _push3(ssrRenderComponent(_component_DurationValue, {
721
1722
  ms: __props.testRun.p90TestDuration,
722
1723
  class: "font-medium text-orange-600 dark:text-orange-400",
@@ -732,7 +1733,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
732
1733
  name: "i-lucide-clock",
733
1734
  class: "size-3.5 text-amber-500"
734
1735
  }, null, _parent3, _scopeId2));
735
- _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>Wasted</span>`);
1736
+ _push3(`<span class="text-zinc-500"${_scopeId2}>Wasted</span>`);
736
1737
  _push3(ssrRenderComponent(_component_DurationValue, {
737
1738
  ms: __props.totalWastedTime,
738
1739
  class: "font-medium text-amber-600 dark:text-amber-400",
@@ -746,283 +1747,315 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
746
1747
  } else {
747
1748
  _push3(`<!---->`);
748
1749
  }
749
- _push3(`</div></div>`);
1750
+ _push3(`</div>`);
750
1751
  } else {
751
1752
  return [
752
1753
  createVNode("div", { class: "space-y-3" }, [
753
- createVNode("div", { class: "flex items-start gap-3" }, [
754
- createVNode("div", { class: "flex items-center gap-2.5 min-w-0 flex-1" }, [
755
- createVNode(_component_StatusBlock, {
756
- status: __props.testRun?.status ?? "",
757
- size: "md"
758
- }, null, 8, ["status"]),
759
- createVNode("div", { class: "min-w-0 flex-1" }, [
760
- createVNode("div", { class: "flex items-center gap-2" }, [
761
- createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
762
- createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
763
- unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
764
- withDirectives(createVNode("input", {
765
- ref_key: "labelInputRef",
766
- ref: labelInputRef,
767
- "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
768
- type: "text",
769
- placeholder: "Add a label...",
770
- class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
771
- onKeydown: onLabelKeydown,
772
- onBlur: saveLabel
773
- }, null, 40, ["onUpdate:modelValue"]), [
774
- [vModelText, unref(labelInput)]
1754
+ createVNode("div", { class: "flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8" }, [
1755
+ createVNode("div", { class: "min-w-0 flex-1 basis-64" }, [
1756
+ createVNode("div", { class: "flex items-center gap-2 flex-wrap" }, [
1757
+ createVNode(_component_StatusChip, {
1758
+ status: __props.testRun?.status ?? ""
1759
+ }, null, 8, ["status"]),
1760
+ createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
1761
+ createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
1762
+ unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1763
+ withDirectives(createVNode("input", {
1764
+ ref_key: "labelInputRef",
1765
+ ref: labelInputRef,
1766
+ "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
1767
+ type: "text",
1768
+ placeholder: "Add a label...",
1769
+ class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
1770
+ onKeydown: onLabelKeydown,
1771
+ onBlur: saveLabel
1772
+ }, null, 40, ["onUpdate:modelValue"]), [
1773
+ [vModelText, unref(labelInput)]
1774
+ ]),
1775
+ unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1776
+ key: 0,
1777
+ name: "i-lucide-loader-circle",
1778
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1779
+ })) : createCommentVNode("", true)
1780
+ ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
1781
+ __props.testRun?.label ? (openBlock(), createBlock("span", {
1782
+ key: 0,
1783
+ class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
1784
+ onClick: startEditLabel
1785
+ }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1786
+ key: 1,
1787
+ class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
1788
+ title: "Add a label",
1789
+ onClick: startEditLabel
1790
+ }, " + label "))
1791
+ ], 64)),
1792
+ createVNode(_component_HelpHint, { topic: "run.summary" })
1793
+ ]),
1794
+ __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
1795
+ key: 0,
1796
+ color: "neutral",
1797
+ variant: "soft",
1798
+ size: "sm",
1799
+ class: "shrink-0",
1800
+ title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
1801
+ }, {
1802
+ default: withCtx(() => [
1803
+ createVNode(_component_UIcon, {
1804
+ name: "i-lucide-layout-grid",
1805
+ class: "size-3 mr-1"
1806
+ }),
1807
+ createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
1808
+ ]),
1809
+ _: 1
1810
+ }, 8, ["title"])) : createCommentVNode("", true),
1811
+ __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
1812
+ key: 1,
1813
+ text: `This run started after: ${__props.testRun.precedingMarker.label}`
1814
+ }, {
1815
+ default: withCtx(() => [
1816
+ createVNode(_component_NuxtLink, {
1817
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1818
+ class: "shrink-0 inline-flex items-center gap-1"
1819
+ }, {
1820
+ default: withCtx(() => [
1821
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
1822
+ createVNode(_component_MarkerBadge, {
1823
+ marker: __props.testRun.precedingMarker,
1824
+ size: "xs"
1825
+ }, null, 8, ["marker"])
775
1826
  ]),
776
- unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
777
- key: 0,
778
- name: "i-lucide-loader-circle",
779
- class: "size-3.5 text-zinc-400 animate-spin shrink-0"
780
- })) : createCommentVNode("", true)
781
- ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
782
- __props.testRun?.label ? (openBlock(), createBlock("span", {
783
- key: 0,
784
- class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
785
- onClick: startEditLabel
786
- }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
787
- key: 1,
788
- class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
789
- title: "Add a label",
790
- onClick: startEditLabel
791
- }, " + label "))
792
- ], 64)),
793
- createVNode(_component_HelpHint, { topic: "run.summary" })
1827
+ _: 1
1828
+ }, 8, ["to"])
794
1829
  ]),
795
- __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
796
- key: 0,
1830
+ _: 1
1831
+ }, 8, ["text"])) : createCommentVNode("", true)
1832
+ ]),
1833
+ createVNode("p", { class: "mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap" }, [
1834
+ createVNode("span", null, "Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
1835
+ createVNode(_component_ClientOnly, null, {
1836
+ default: withCtx(() => [
1837
+ createVNode("span", { class: "text-dimmed" }, "· " + toDisplayString(("formatRelativeTime" in _ctx ? _ctx.formatRelativeTime : unref(formatRelativeTime))(__props.testRun?.startTime)), 1)
1838
+ ]),
1839
+ _: 1
1840
+ })
1841
+ ])
1842
+ ]),
1843
+ createVNode("div", { class: "flex items-center gap-1.5 shrink-0" }, [
1844
+ createVNode(_component_UTooltip, {
1845
+ text: unref(copied) ? "Copied!" : "Copy run summary"
1846
+ }, {
1847
+ default: withCtx(() => [
1848
+ createVNode(_component_UButton, {
1849
+ size: "xs",
1850
+ variant: "ghost",
797
1851
  color: "neutral",
798
- variant: "soft",
799
- size: "sm",
800
- class: "shrink-0",
801
- title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
802
- }, {
803
- default: withCtx(() => [
804
- createVNode(_component_UIcon, {
805
- name: "i-lucide-layout-grid",
806
- class: "size-3 mr-1"
807
- }),
808
- createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
809
- ]),
810
- _: 1
811
- }, 8, ["title"])) : createCommentVNode("", true),
812
- __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
813
- key: 1,
814
- text: `This run started after: ${__props.testRun.precedingMarker.label}`
815
- }, {
816
- default: withCtx(() => [
817
- createVNode(_component_NuxtLink, {
818
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
819
- class: "shrink-0 inline-flex items-center gap-1"
820
- }, {
821
- default: withCtx(() => [
822
- createVNode("span", { class: "text-xs text-muted" }, "After"),
823
- createVNode(_component_MarkerBadge, {
824
- marker: __props.testRun.precedingMarker,
825
- size: "xs"
826
- }, null, 8, ["marker"])
827
- ]),
828
- _: 1
829
- }, 8, ["to"])
830
- ]),
831
- _: 1
832
- }, 8, ["text"])) : createCommentVNode("", true),
833
- createVNode("span", { class: "text-xs text-zinc-500 ml-auto whitespace-nowrap" }, toDisplayString(__props.testRun?.project?.label ?? __props.testRun?.project?.name) + " · Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
834
- createVNode(_component_UTooltip, {
835
- text: unref(copied) ? "Copied!" : "Copy run summary"
1852
+ icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
1853
+ "aria-label": "Copy run summary",
1854
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1855
+ onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
1856
+ }, null, 8, ["icon", "onClick"])
1857
+ ]),
1858
+ _: 1
1859
+ }, 8, ["text"]),
1860
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 0 }, {
1861
+ content: withCtx(() => [
1862
+ createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
1863
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
1864
+ (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
1865
+ return createVNode("button", {
1866
+ key: m,
1867
+ class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
1868
+ onClick: ($event) => retryMode.value = m
1869
+ }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
1870
+ }), 64))
1871
+ ])
1872
+ ]),
1873
+ default: withCtx(() => [
1874
+ createVNode(_component_UButton, {
1875
+ size: "xs",
1876
+ color: "warning",
1877
+ variant: "subtle",
1878
+ icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
1879
+ title: unref(retryTitle),
1880
+ "aria-label": "Retry",
1881
+ onClick: ($event) => copyRetryCommand()
836
1882
  }, {
837
1883
  default: withCtx(() => [
838
- createVNode(_component_UButton, {
839
- size: "xs",
840
- variant: "ghost",
841
- color: "neutral",
842
- icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
843
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
844
- onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
845
- }, null, 8, ["icon", "onClick"])
846
- ]),
847
- _: 1
848
- }, 8, ["text"]),
849
- unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 2 }, {
850
- content: withCtx(() => [
851
- createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
852
- createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
853
- (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
854
- return createVNode("button", {
855
- key: m,
856
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
857
- onClick: ($event) => retryMode.value = m
858
- }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
859
- }), 64))
860
- ])
861
- ]),
862
- default: withCtx(() => [
863
- createVNode(_component_UButton, {
864
- size: "xs",
865
- color: "warning",
866
- variant: "subtle",
867
- icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
868
- title: unref(retryTitle),
869
- onClick: ($event) => copyRetryCommand()
870
- }, {
871
- default: withCtx(() => [
872
- createTextVNode(" Retry ")
873
- ]),
874
- _: 1
875
- }, 8, ["icon", "title", "onClick"])
1884
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
876
1885
  ]),
877
1886
  _: 1
878
- })) : createCommentVNode("", true)
879
- ])
880
- ])
1887
+ }, 8, ["icon", "title", "onClick"])
1888
+ ]),
1889
+ _: 1
1890
+ })) : createCommentVNode("", true),
1891
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
1892
+ key: 1,
1893
+ "project-id": __props.testRun?.project?.id,
1894
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
1895
+ cases: unref(failedCases)
1896
+ }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true),
1897
+ unref(primaryReport) ? (openBlock(), createBlock(_component_UButton, {
1898
+ key: 2,
1899
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(unref(primaryReport).path, null, unref(config).app?.baseURL),
1900
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(unref(primaryReport).type),
1901
+ target: "_blank",
1902
+ size: "xs",
1903
+ color: "primary",
1904
+ variant: "outline",
1905
+ "aria-label": unref(primaryReport).label,
1906
+ title: unref(primaryReport).size ? `${unref(primaryReport).label} · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(primaryReport).size)}` : unref(primaryReport).label
1907
+ }, {
1908
+ default: withCtx(() => [
1909
+ createVNode("span", { class: "hidden @2xl:inline" }, toDisplayString(unref(primaryReport).label), 1)
1910
+ ]),
1911
+ _: 1
1912
+ }, 8, ["href", "icon", "aria-label", "title"])) : createCommentVNode("", true)
881
1913
  ])
882
1914
  ]),
883
- createVNode("div", { class: "grid grid-cols-3 sm:grid-cols-5 gap-2" }, [
884
- createVNode("button", {
885
- class: [
886
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
887
- __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
888
- ],
889
- onClick: ($event) => emit("filter-status", "all")
890
- }, [
891
- createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
892
- createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
893
- ], 10, ["onClick"]),
894
- createVNode("div", { class: "relative" }, [
1915
+ createVNode(_component_StatTileGrid, { "min-tile-width": "7.5rem" }, {
1916
+ default: withCtx(() => [
895
1917
  createVNode("button", {
896
1918
  class: [
897
- "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
898
- __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"
1919
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1920
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
899
1921
  ],
900
- onClick: ($event) => emit("filter-status", "passed")
1922
+ onClick: ($event) => emit("filter-status", "all")
901
1923
  }, [
902
- createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
903
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1924
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
1925
+ createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
904
1926
  ], 10, ["onClick"]),
905
- (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
906
- key: 0,
1927
+ createVNode("div", { class: "relative" }, [
1928
+ createVNode("button", {
1929
+ class: [
1930
+ "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
1931
+ __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"
1932
+ ],
1933
+ onClick: ($event) => emit("filter-status", "passed")
1934
+ }, [
1935
+ createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
1936
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1937
+ ], 10, ["onClick"]),
1938
+ (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
1939
+ key: 0,
1940
+ class: [
1941
+ "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",
1942
+ __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"
1943
+ ],
1944
+ title: "Flaky — passed only after a retry (a subset of passed). Click to filter.",
1945
+ onClick: ($event) => emit("filter-status", "flaky")
1946
+ }, [
1947
+ createVNode(_component_UIcon, {
1948
+ name: "i-lucide-shuffle",
1949
+ class: "size-3"
1950
+ }),
1951
+ createTextVNode(" " + toDisplayString(__props.testRun?.flakyTests ?? 0), 1)
1952
+ ], 10, ["onClick"])) : createCommentVNode("", true)
1953
+ ]),
1954
+ createVNode("button", {
1955
+ class: [
1956
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1957
+ __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"
1958
+ ],
1959
+ onClick: ($event) => emit("filter-status", "failed")
1960
+ }, [
1961
+ createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
1962
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
1963
+ ], 10, ["onClick"]),
1964
+ createVNode("button", {
1965
+ class: [
1966
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1967
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1968
+ ],
1969
+ onClick: ($event) => emit("filter-status", "skipped")
1970
+ }, [
1971
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
1972
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
1973
+ ], 10, ["onClick"]),
1974
+ createVNode("button", {
907
1975
  class: [
908
- "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",
909
- __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"
1976
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1977
+ __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"
910
1978
  ],
911
- title: "Flaky passed only after a retry (a subset of passed). Click to filter.",
912
- onClick: ($event) => emit("filter-status", "flaky")
1979
+ title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
1980
+ onClick: ($event) => emit("filter-status", "didnotrun")
913
1981
  }, [
1982
+ createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, "Didn't run"),
1983
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
1984
+ ], 10, ["onClick"])
1985
+ ]),
1986
+ _: 1
1987
+ }),
1988
+ __props.testRun ? (openBlock(), createBlock("div", {
1989
+ key: 0,
1990
+ class: "flex items-center gap-x-4 gap-y-1.5 flex-wrap"
1991
+ }, [
1992
+ createVNode("div", { class: "flex-1 basis-60 min-w-44 max-w-xl" }, [
1993
+ createVNode(_component_TestStatusBar, {
1994
+ passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
1995
+ failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
1996
+ skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
1997
+ flaky: __props.testRun?.flakyTests ?? 0,
1998
+ "did-not-run": __props.testRun?.didNotRunTests ?? 0,
1999
+ total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
2000
+ }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
2001
+ ]),
2002
+ createVNode("div", { class: "flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0" }, [
2003
+ createVNode("div", { class: "flex items-center gap-1" }, [
914
2004
  createVNode(_component_UIcon, {
915
- name: "i-lucide-shuffle",
916
- class: "size-3"
2005
+ name: "i-lucide-clock",
2006
+ class: "size-3.5 text-zinc-400"
917
2007
  }),
918
- createTextVNode(" " + toDisplayString(__props.testRun?.flakyTests ?? 0), 1)
919
- ], 10, ["onClick"])) : createCommentVNode("", true)
920
- ]),
921
- createVNode("button", {
922
- class: [
923
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
924
- __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"
925
- ],
926
- onClick: ($event) => emit("filter-status", "failed")
927
- }, [
928
- createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
929
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
930
- ], 10, ["onClick"]),
931
- createVNode("button", {
932
- class: [
933
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
934
- __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
935
- ],
936
- onClick: ($event) => emit("filter-status", "skipped")
937
- }, [
938
- createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
939
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
940
- ], 10, ["onClick"]),
941
- createVNode("button", {
942
- class: [
943
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
944
- __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"
945
- ],
946
- title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
947
- onClick: ($event) => emit("filter-status", "didnotrun")
948
- }, [
949
- createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, " Didn't run "),
950
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
951
- ], 10, ["onClick"])
952
- ]),
953
- createVNode("div", null, [
954
- __props.testRun ? (openBlock(), createBlock("div", {
955
- key: 0,
956
- class: "flex items-center gap-3"
957
- }, [
958
- createVNode("div", { class: "flex-1 max-w-md" }, [
959
- createVNode(_component_TestStatusBar, {
960
- passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
961
- failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
962
- skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
963
- flaky: __props.testRun?.flakyTests ?? 0,
964
- "did-not-run": __props.testRun?.didNotRunTests ?? 0,
965
- total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
966
- }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
2008
+ createVNode(_component_DurationValue, {
2009
+ ms: __props.testRun?.duration,
2010
+ class: "font-medium"
2011
+ }, null, 8, ["ms"])
967
2012
  ]),
968
- createVNode("div", { class: "flex items-center gap-3 text-xs shrink-0" }, [
969
- createVNode("div", { class: "flex items-center gap-1" }, [
970
- createVNode(_component_UIcon, {
971
- name: "i-lucide-clock",
972
- class: "size-3.5 text-zinc-400"
973
- }),
974
- createVNode(_component_DurationValue, {
975
- ms: __props.testRun?.duration,
976
- class: "font-medium"
977
- }, null, 8, ["ms"])
978
- ]),
979
- __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
980
- key: 0,
981
- class: "flex items-center gap-1"
982
- }, [
983
- createVNode(_component_UIcon, {
984
- name: "i-lucide-gauge",
985
- class: "size-3.5 text-zinc-400"
986
- }),
987
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Avg"),
988
- createVNode(_component_DurationValue, {
989
- ms: __props.testRun.avgTestDuration,
990
- class: "font-medium"
991
- }, null, 8, ["ms"])
992
- ])) : createCommentVNode("", true),
993
- __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
994
- key: 1,
995
- class: "flex items-center gap-1"
996
- }, [
997
- createVNode(_component_UIcon, {
998
- name: "i-lucide-arrow-up-right",
999
- class: "size-3.5 text-orange-500"
1000
- }),
1001
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "P90"),
1002
- createVNode(_component_DurationValue, {
1003
- ms: __props.testRun.p90TestDuration,
1004
- class: "font-medium text-orange-600 dark:text-orange-400",
1005
- "unit-class": "opacity-60"
1006
- }, null, 8, ["ms"])
1007
- ])) : createCommentVNode("", true),
1008
- __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
1009
- key: 2,
1010
- class: "flex items-center gap-1"
1011
- }, [
1012
- createVNode(_component_UIcon, {
1013
- name: "i-lucide-clock",
1014
- class: "size-3.5 text-amber-500"
1015
- }),
1016
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Wasted"),
1017
- createVNode(_component_DurationValue, {
1018
- ms: __props.totalWastedTime,
1019
- class: "font-medium text-amber-600 dark:text-amber-400",
1020
- "unit-class": "opacity-60"
1021
- }, null, 8, ["ms"])
1022
- ])) : createCommentVNode("", true)
1023
- ])
1024
- ])) : createCommentVNode("", true)
1025
- ])
2013
+ __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
2014
+ key: 0,
2015
+ class: "flex items-center gap-1"
2016
+ }, [
2017
+ createVNode(_component_UIcon, {
2018
+ name: "i-lucide-gauge",
2019
+ class: "size-3.5 text-zinc-400"
2020
+ }),
2021
+ createVNode("span", { class: "text-zinc-500" }, "Avg"),
2022
+ createVNode(_component_DurationValue, {
2023
+ ms: __props.testRun.avgTestDuration,
2024
+ class: "font-medium"
2025
+ }, null, 8, ["ms"])
2026
+ ])) : createCommentVNode("", true),
2027
+ __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
2028
+ key: 1,
2029
+ class: "flex items-center gap-1"
2030
+ }, [
2031
+ createVNode(_component_UIcon, {
2032
+ name: "i-lucide-arrow-up-right",
2033
+ class: "size-3.5 text-orange-500"
2034
+ }),
2035
+ createVNode("span", { class: "text-zinc-500" }, "P90"),
2036
+ createVNode(_component_DurationValue, {
2037
+ ms: __props.testRun.p90TestDuration,
2038
+ class: "font-medium text-orange-600 dark:text-orange-400",
2039
+ "unit-class": "opacity-60"
2040
+ }, null, 8, ["ms"])
2041
+ ])) : createCommentVNode("", true),
2042
+ __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
2043
+ key: 2,
2044
+ class: "flex items-center gap-1"
2045
+ }, [
2046
+ createVNode(_component_UIcon, {
2047
+ name: "i-lucide-clock",
2048
+ class: "size-3.5 text-amber-500"
2049
+ }),
2050
+ createVNode("span", { class: "text-zinc-500" }, "Wasted"),
2051
+ createVNode(_component_DurationValue, {
2052
+ ms: __props.totalWastedTime,
2053
+ class: "font-medium text-amber-600 dark:text-amber-400",
2054
+ "unit-class": "opacity-60"
2055
+ }, null, 8, ["ms"])
2056
+ ])) : createCommentVNode("", true)
2057
+ ])
2058
+ ])) : createCommentVNode("", true)
1026
2059
  ])
1027
2060
  ];
1028
2061
  }
@@ -1030,238 +2063,108 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
1030
2063
  _: 1
1031
2064
  }, _parent2, _scopeId));
1032
2065
  _push2(`</div>`);
1033
- if (unref(showCiEnv)) {
1034
- _push2(ssrRenderComponent(_component_CiEnvCard, {
1035
- ci: __props.testRun?.metadata?.ci,
1036
- environment: __props.testRun?.environment,
1037
- "playwright-version": __props.testRun?.playwrightVersion,
1038
- "reporter-version": __props.testRun?.reporterVersion,
1039
- class: unref(blockColSpanClass)
1040
- }, null, _parent2, _scopeId));
1041
- } else {
1042
- _push2(`<!---->`);
1043
- }
1044
- if (unref(showSource)) {
1045
- _push2(ssrRenderComponent(_component_SourceInfoCard, {
1046
- scm: __props.testRun.metadata.scm,
1047
- class: unref(blockColSpanClass)
1048
- }, null, _parent2, _scopeId));
1049
- } else {
1050
- _push2(`<!---->`);
1051
- }
1052
- if (unref(showStorage)) {
1053
- _push2(ssrRenderComponent(_component_BlockCard, {
1054
- class: unref(blockColSpanClass),
1055
- title: "Storage",
1056
- icon: "i-lucide-database",
1057
- help: "run.reports",
1058
- subtitle: unref(storageStats)?.totalFiles ? `${unref(storageStats).totalFiles} files · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).totalSize)}` : void 0
1059
- }, {
1060
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1061
- if (_push3) {
1062
- if (__props.finalizing) {
1063
- _push3(`<div class="flex items-center gap-3"${_scopeId2}>`);
1064
- _push3(ssrRenderComponent(_component_UIcon, {
1065
- name: "i-lucide-upload",
1066
- class: "size-5 text-info shrink-0 animate-pulse"
1067
- }, null, _parent3, _scopeId2));
1068
- _push3(`<div class="flex-1 min-w-0"${_scopeId2}><div class="flex items-center justify-between mb-1"${_scopeId2}><span class="text-sm font-medium"${_scopeId2}>Finalizing test run</span><span class="text-xs text-zinc-500"${_scopeId2}>Uploading reports &amp; traces…</span></div>`);
1069
- _push3(ssrRenderComponent(_component_UProgress, {
1070
- value: null,
1071
- size: "sm",
1072
- color: "info",
1073
- class: "rounded-full animate-pulse"
1074
- }, null, _parent3, _scopeId2));
1075
- _push3(`</div></div>`);
1076
- } else {
1077
- _push3(`<!---->`);
1078
- }
1079
- if (unref(storageStats)?.totalFiles) {
1080
- _push3(`<div class="space-y-1.5 text-sm"${_scopeId2}><!--[-->`);
1081
- ssrRenderList(__props.allReports, (report) => {
1082
- _push3(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId2}>`);
1083
- _push3(ssrRenderComponent(_component_UButton, {
1084
- href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1085
- icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1086
- target: "_blank",
1087
- size: "xs",
1088
- variant: "outline",
1089
- class: "min-w-0",
1090
- ui: { label: "truncate" }
1091
- }, {
1092
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1093
- if (_push4) {
1094
- _push4(`${ssrInterpolate(report.label)}`);
1095
- } else {
1096
- return [
1097
- createTextVNode(toDisplayString(report.label), 1)
1098
- ];
1099
- }
1100
- }),
1101
- _: 2
1102
- }, _parent3, _scopeId2));
1103
- _push3(`<span class="text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0"${_scopeId2}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size))}</span></div>`);
1104
- });
1105
- _push3(`<!--]-->`);
1106
- if (unref(storageStats).testCaseFilesCount > 0) {
1107
- _push3(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId2}><span class="truncate"${_scopeId2}>Test files (${ssrInterpolate(unref(storageStats).testCaseFilesCount)})</span><span class="text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0"${_scopeId2}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize))}</span></div>`);
1108
- } else {
1109
- _push3(`<!---->`);
1110
- }
1111
- _push3(`</div>`);
1112
- } else {
1113
- _push3(`<!---->`);
1114
- }
1115
- } else {
1116
- return [
1117
- __props.finalizing ? (openBlock(), createBlock("div", {
1118
- key: 0,
1119
- class: "flex items-center gap-3"
1120
- }, [
1121
- createVNode(_component_UIcon, {
1122
- name: "i-lucide-upload",
1123
- class: "size-5 text-info shrink-0 animate-pulse"
1124
- }),
1125
- createVNode("div", { class: "flex-1 min-w-0" }, [
1126
- createVNode("div", { class: "flex items-center justify-between mb-1" }, [
1127
- createVNode("span", { class: "text-sm font-medium" }, "Finalizing test run"),
1128
- createVNode("span", { class: "text-xs text-zinc-500" }, "Uploading reports & traces…")
1129
- ]),
1130
- createVNode(_component_UProgress, {
1131
- value: null,
1132
- size: "sm",
1133
- color: "info",
1134
- class: "rounded-full animate-pulse"
1135
- })
1136
- ])
1137
- ])) : createCommentVNode("", true),
1138
- unref(storageStats)?.totalFiles ? (openBlock(), createBlock("div", {
1139
- key: 1,
1140
- class: "space-y-1.5 text-sm"
1141
- }, [
1142
- (openBlock(true), createBlock(Fragment, null, renderList(__props.allReports, (report) => {
1143
- return openBlock(), createBlock("div", {
1144
- key: report.label,
1145
- class: "flex items-center justify-between gap-2 min-w-0"
1146
- }, [
1147
- createVNode(_component_UButton, {
1148
- href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1149
- icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1150
- target: "_blank",
1151
- size: "xs",
1152
- variant: "outline",
1153
- class: "min-w-0",
1154
- ui: { label: "truncate" }
1155
- }, {
1156
- default: withCtx(() => [
1157
- createTextVNode(toDisplayString(report.label), 1)
1158
- ]),
1159
- _: 2
1160
- }, 1032, ["href", "icon"]),
1161
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
1162
- ]);
1163
- }), 128)),
1164
- unref(storageStats).testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
1165
- key: 0,
1166
- class: "flex items-center justify-between gap-2 min-w-0"
1167
- }, [
1168
- createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(unref(storageStats).testCaseFilesCount) + ")", 1),
1169
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize)), 1)
1170
- ])) : createCommentVNode("", true)
1171
- ])) : createCommentVNode("", true)
1172
- ];
1173
- }
1174
- }),
1175
- _: 1
1176
- }, _parent2, _scopeId));
1177
- } else {
1178
- _push2(`<!---->`);
1179
- }
1180
- if (unref(showOther)) {
1181
- _push2(ssrRenderComponent(_component_BlockCard, {
1182
- class: unref(blockColSpanClass),
1183
- title: "Other",
1184
- icon: "i-lucide-tags",
1185
- help: "run.metadata"
1186
- }, {
1187
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1188
- if (_push3) {
1189
- _push3(`<div class="space-y-3 text-sm"${_scopeId2}>`);
1190
- if (__props.testRun.metadata.tags && __props.testRun.metadata.tags.length > 0) {
1191
- _push3(`<div${_scopeId2}><div class="flex flex-wrap gap-1.5"${_scopeId2}><!--[-->`);
1192
- ssrRenderList(__props.testRun.metadata.tags, (tag) => {
1193
- _push3(ssrRenderComponent(_component_UBadge, {
1194
- key: tag,
1195
- color: "neutral",
1196
- variant: "soft",
1197
- size: "sm"
1198
- }, {
1199
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1200
- if (_push4) {
1201
- _push4(`${ssrInterpolate(tag)}`);
1202
- } else {
1203
- return [
1204
- createTextVNode(toDisplayString(tag), 1)
1205
- ];
1206
- }
1207
- }),
1208
- _: 2
1209
- }, _parent3, _scopeId2));
1210
- });
1211
- _push3(`<!--]--></div></div>`);
1212
- } else {
1213
- _push3(`<!---->`);
1214
- }
1215
- if (__props.testRun.metadata.relatedIssue) {
1216
- _push3(`<p class="flex items-center gap-1"${_scopeId2}>`);
1217
- _push3(ssrRenderComponent(_component_UIcon, {
1218
- name: "i-lucide-link",
1219
- class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1220
- }, null, _parent3, _scopeId2));
1221
- _push3(`<span${_scopeId2}>${ssrInterpolate(__props.testRun.metadata.relatedIssue)}</span></p>`);
1222
- } else {
1223
- _push3(`<!---->`);
1224
- }
1225
- _push3(ssrRenderComponent(_component_EntityLinks, {
1226
- "entity-type": "test_run",
1227
- "entity-id": __props.testRun.id,
1228
- links: __props.testRun.links ?? null,
1229
- onUpdated: ($event) => _ctx.$emit("label-updated")
1230
- }, null, _parent3, _scopeId2));
1231
- if (__props.testRun.metadata.customData) {
1232
- _push3(ssrRenderComponent(_component_UButton, {
1233
- size: "xs",
1234
- variant: "ghost",
1235
- color: "neutral",
1236
- icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1237
- onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1238
- }, {
1239
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1240
- if (_push4) {
1241
- _push4(` Custom data `);
1242
- } else {
1243
- return [
1244
- createTextVNode(" Custom data ")
1245
- ];
1246
- }
1247
- }),
1248
- _: 1
1249
- }, _parent3, _scopeId2));
1250
- } else {
1251
- _push3(`<!---->`);
1252
- }
1253
- if (__props.showCustomData && __props.testRun.metadata.customData) {
1254
- _push3(`<div${_scopeId2}><div class="bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"${_scopeId2}><pre class="m-0"${_scopeId2}>${ssrInterpolate(JSON.stringify(__props.testRun.metadata.customData, null, 2))}</pre></div></div>`);
1255
- } else {
1256
- _push3(`<!---->`);
1257
- }
1258
- _push3(`</div>`);
1259
- } else {
1260
- return [
1261
- createVNode("div", { class: "space-y-3 text-sm" }, [
1262
- __props.testRun.metadata.tags && __props.testRun.metadata.tags.length > 0 ? (openBlock(), createBlock("div", { key: 0 }, [
1263
- createVNode("div", { class: "flex flex-wrap gap-1.5" }, [
1264
- (openBlock(true), createBlock(Fragment, null, renderList(__props.testRun.metadata.tags, (tag) => {
2066
+ } else {
2067
+ return [
2068
+ createVNode("div", { class: "@container" }, [
2069
+ createVNode(_component_UCard, {
2070
+ class: "shadow-xs",
2071
+ ui: { footer: "px-4 py-2.5 sm:px-4 bg-muted/30" }
2072
+ }, {
2073
+ footer: withCtx(() => [
2074
+ createVNode(_component_SummaryMetaStrip, null, {
2075
+ default: withCtx(() => [
2076
+ unref(showCiGroup) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2077
+ key: 0,
2078
+ label: "CI & environment",
2079
+ icon: "i-lucide-cloud",
2080
+ help: "run.ci-env"
2081
+ }, {
2082
+ default: withCtx(() => [
2083
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
2084
+ key: 0,
2085
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
2086
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
2087
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
2088
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
2089
+ createVNode("span", { class: "text-dimmed" }, "·"),
2090
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
2091
+ key: 0,
2092
+ href: unref(ci).buildUrl,
2093
+ target: "_blank",
2094
+ class: "text-primary hover:underline"
2095
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
2096
+ ], 64)) : createCommentVNode("", true),
2097
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
2098
+ createVNode("span", { class: "text-dimmed" }, "·"),
2099
+ createVNode("span", { class: "text-muted" }, [
2100
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2101
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
2102
+ ], 64)) : createCommentVNode("", true),
2103
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
2104
+ createTextVNode(" · ")
2105
+ ], 64)) : createCommentVNode("", true),
2106
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
2107
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
2108
+ ], 64)) : createCommentVNode("", true)
2109
+ ])
2110
+ ], 64)) : createCommentVNode("", true)
2111
+ ]),
2112
+ _: 1
2113
+ })) : createCommentVNode("", true),
2114
+ unref(scm) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2115
+ key: 1,
2116
+ label: "Source",
2117
+ icon: "i-lucide-git-branch"
2118
+ }, {
2119
+ default: withCtx(() => [
2120
+ unref(scm).branch ? (openBlock(), createBlock("span", {
2121
+ key: 0,
2122
+ class: "font-medium"
2123
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
2124
+ unref(scm).commit ? (openBlock(), createBlock("code", {
2125
+ key: 1,
2126
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
2127
+ title: unref(scm).commit
2128
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
2129
+ unref(scm).author ? (openBlock(), createBlock("span", {
2130
+ key: 2,
2131
+ class: "text-muted"
2132
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
2133
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
2134
+ key: 3,
2135
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
2136
+ title: unref(scm).commitMessage
2137
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
2138
+ ]),
2139
+ _: 1
2140
+ })) : createCommentVNode("", true),
2141
+ unref(showVersions) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2142
+ key: 2,
2143
+ label: "Tooling versions",
2144
+ icon: "i-lucide-tag"
2145
+ }, {
2146
+ default: withCtx(() => [
2147
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
2148
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2149
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
2150
+ ], 64)) : createCommentVNode("", true),
2151
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
2152
+ createTextVNode(" · ")
2153
+ ], 64)) : createCommentVNode("", true),
2154
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
2155
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
2156
+ ], 64)) : createCommentVNode("", true)
2157
+ ])
2158
+ ]),
2159
+ _: 1
2160
+ })) : createCommentVNode("", true),
2161
+ unref(tags)?.length ? (openBlock(), createBlock(_component_MetaStripGroup, {
2162
+ key: 3,
2163
+ label: "Tags",
2164
+ icon: "i-lucide-tags"
2165
+ }, {
2166
+ default: withCtx(() => [
2167
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
1265
2168
  return openBlock(), createBlock(_component_UBadge, {
1266
2169
  key: tag,
1267
2170
  color: "neutral",
@@ -1274,190 +2177,244 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
1274
2177
  _: 2
1275
2178
  }, 1024);
1276
2179
  }), 128))
1277
- ])
1278
- ])) : createCommentVNode("", true),
1279
- __props.testRun.metadata.relatedIssue ? (openBlock(), createBlock("p", {
1280
- key: 1,
1281
- class: "flex items-center gap-1"
1282
- }, [
1283
- createVNode(_component_UIcon, {
1284
- name: "i-lucide-link",
1285
- class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1286
- }),
1287
- createVNode("span", null, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1288
- ])) : createCommentVNode("", true),
1289
- createVNode(_component_EntityLinks, {
1290
- "entity-type": "test_run",
1291
- "entity-id": __props.testRun.id,
1292
- links: __props.testRun.links ?? null,
1293
- onUpdated: ($event) => _ctx.$emit("label-updated")
1294
- }, null, 8, ["entity-id", "links", "onUpdated"]),
1295
- __props.testRun.metadata.customData ? (openBlock(), createBlock(_component_UButton, {
1296
- key: 2,
1297
- size: "xs",
1298
- variant: "ghost",
1299
- color: "neutral",
1300
- icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1301
- onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
2180
+ ]),
2181
+ _: 1
2182
+ })) : createCommentVNode("", true),
2183
+ __props.testRun?.metadata?.relatedIssue ? (openBlock(), createBlock(_component_MetaStripGroup, {
2184
+ key: 4,
2185
+ label: "Related issue",
2186
+ icon: "i-lucide-bookmark"
1302
2187
  }, {
1303
2188
  default: withCtx(() => [
1304
- createTextVNode(" Custom data ")
2189
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1305
2190
  ]),
1306
2191
  _: 1
1307
- }, 8, ["icon", "onClick"])) : createCommentVNode("", true),
1308
- __props.showCustomData && __props.testRun.metadata.customData ? (openBlock(), createBlock("div", { key: 3 }, [
1309
- createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1310
- createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(__props.testRun.metadata.customData, null, 2)), 1)
1311
- ])
1312
- ])) : createCommentVNode("", true)
2192
+ })) : createCommentVNode("", true),
2193
+ unref(showStorage) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2194
+ key: 5,
2195
+ label: "Storage"
2196
+ }, {
2197
+ default: withCtx(() => [
2198
+ createVNode(_component_RunStorageChip, {
2199
+ "storage-stats": unref(storageStats),
2200
+ reports: __props.allReports,
2201
+ finalizing: __props.finalizing
2202
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
2203
+ ]),
2204
+ _: 1
2205
+ })) : createCommentVNode("", true),
2206
+ createVNode(_component_MetaStripGroup, {
2207
+ label: "Links",
2208
+ icon: "i-lucide-link",
2209
+ help: "run.metadata"
2210
+ }, {
2211
+ default: withCtx(() => [
2212
+ createVNode(_component_EntityLinks, {
2213
+ "entity-type": "test_run",
2214
+ "entity-id": __props.testRun.id,
2215
+ links: __props.testRun.links ?? null,
2216
+ onUpdated: ($event) => _ctx.$emit("label-updated")
2217
+ }, null, 8, ["entity-id", "links", "onUpdated"])
2218
+ ]),
2219
+ _: 1
2220
+ }),
2221
+ unref(customData) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2222
+ key: 6,
2223
+ label: "Custom data"
2224
+ }, {
2225
+ default: withCtx(() => [
2226
+ createVNode(_component_UButton, {
2227
+ size: "xs",
2228
+ variant: "ghost",
2229
+ color: "neutral",
2230
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
2231
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
2232
+ }, {
2233
+ default: withCtx(() => [
2234
+ createTextVNode(" Custom data ")
2235
+ ]),
2236
+ _: 1
2237
+ }, 8, ["icon", "onClick"])
2238
+ ]),
2239
+ _: 1
2240
+ })) : createCommentVNode("", true)
2241
+ ]),
2242
+ _: 1
2243
+ }),
2244
+ __props.showCustomData && unref(customData) ? (openBlock(), createBlock("div", {
2245
+ key: 0,
2246
+ class: "mt-2"
2247
+ }, [
2248
+ createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
2249
+ createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(unref(customData), null, 2)), 1)
1313
2250
  ])
1314
- ];
1315
- }
1316
- }),
1317
- _: 1
1318
- }, _parent2, _scopeId));
1319
- } else {
1320
- _push2(`<!---->`);
1321
- }
1322
- _push2(`</div>`);
1323
- } else {
1324
- return [
1325
- createVNode("div", { class: "grid grid-cols-1 lg:grid-cols-12 gap-4" }, [
1326
- createVNode("div", { class: unref(summaryColSpanClass) }, [
1327
- createVNode(_component_UCard, { class: "shadow-xs h-full" }, {
1328
- default: withCtx(() => [
1329
- createVNode("div", { class: "space-y-3" }, [
1330
- createVNode("div", { class: "flex items-start gap-3" }, [
1331
- createVNode("div", { class: "flex items-center gap-2.5 min-w-0 flex-1" }, [
1332
- createVNode(_component_StatusBlock, {
1333
- status: __props.testRun?.status ?? "",
1334
- size: "md"
2251
+ ])) : createCommentVNode("", true)
2252
+ ]),
2253
+ default: withCtx(() => [
2254
+ createVNode("div", { class: "space-y-3" }, [
2255
+ createVNode("div", { class: "flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8" }, [
2256
+ createVNode("div", { class: "min-w-0 flex-1 basis-64" }, [
2257
+ createVNode("div", { class: "flex items-center gap-2 flex-wrap" }, [
2258
+ createVNode(_component_StatusChip, {
2259
+ status: __props.testRun?.status ?? ""
1335
2260
  }, null, 8, ["status"]),
1336
- createVNode("div", { class: "min-w-0 flex-1" }, [
1337
- createVNode("div", { class: "flex items-center gap-2" }, [
1338
- createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
1339
- createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
1340
- unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1341
- withDirectives(createVNode("input", {
1342
- ref_key: "labelInputRef",
1343
- ref: labelInputRef,
1344
- "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
1345
- type: "text",
1346
- placeholder: "Add a label...",
1347
- class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
1348
- onKeydown: onLabelKeydown,
1349
- onBlur: saveLabel
1350
- }, null, 40, ["onUpdate:modelValue"]), [
1351
- [vModelText, unref(labelInput)]
1352
- ]),
1353
- unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1354
- key: 0,
1355
- name: "i-lucide-loader-circle",
1356
- class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1357
- })) : createCommentVNode("", true)
1358
- ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
1359
- __props.testRun?.label ? (openBlock(), createBlock("span", {
1360
- key: 0,
1361
- class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
1362
- onClick: startEditLabel
1363
- }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1364
- key: 1,
1365
- class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
1366
- title: "Add a label",
1367
- onClick: startEditLabel
1368
- }, " + label "))
1369
- ], 64)),
1370
- createVNode(_component_HelpHint, { topic: "run.summary" })
2261
+ createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
2262
+ createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
2263
+ unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2264
+ withDirectives(createVNode("input", {
2265
+ ref_key: "labelInputRef",
2266
+ ref: labelInputRef,
2267
+ "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
2268
+ type: "text",
2269
+ placeholder: "Add a label...",
2270
+ class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
2271
+ onKeydown: onLabelKeydown,
2272
+ onBlur: saveLabel
2273
+ }, null, 40, ["onUpdate:modelValue"]), [
2274
+ [vModelText, unref(labelInput)]
1371
2275
  ]),
1372
- __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
2276
+ unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1373
2277
  key: 0,
1374
- color: "neutral",
1375
- variant: "soft",
1376
- size: "sm",
1377
- class: "shrink-0",
1378
- title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
1379
- }, {
1380
- default: withCtx(() => [
1381
- createVNode(_component_UIcon, {
1382
- name: "i-lucide-layout-grid",
1383
- class: "size-3 mr-1"
1384
- }),
1385
- createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
1386
- ]),
1387
- _: 1
1388
- }, 8, ["title"])) : createCommentVNode("", true),
1389
- __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
2278
+ name: "i-lucide-loader-circle",
2279
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
2280
+ })) : createCommentVNode("", true)
2281
+ ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
2282
+ __props.testRun?.label ? (openBlock(), createBlock("span", {
2283
+ key: 0,
2284
+ class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
2285
+ onClick: startEditLabel
2286
+ }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1390
2287
  key: 1,
1391
- text: `This run started after: ${__props.testRun.precedingMarker.label}`
1392
- }, {
1393
- default: withCtx(() => [
1394
- createVNode(_component_NuxtLink, {
1395
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1396
- class: "shrink-0 inline-flex items-center gap-1"
1397
- }, {
1398
- default: withCtx(() => [
1399
- createVNode("span", { class: "text-xs text-muted" }, "After"),
1400
- createVNode(_component_MarkerBadge, {
1401
- marker: __props.testRun.precedingMarker,
1402
- size: "xs"
1403
- }, null, 8, ["marker"])
1404
- ]),
1405
- _: 1
1406
- }, 8, ["to"])
1407
- ]),
1408
- _: 1
1409
- }, 8, ["text"])) : createCommentVNode("", true),
1410
- createVNode("span", { class: "text-xs text-zinc-500 ml-auto whitespace-nowrap" }, toDisplayString(__props.testRun?.project?.label ?? __props.testRun?.project?.name) + " · Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
1411
- createVNode(_component_UTooltip, {
1412
- text: unref(copied) ? "Copied!" : "Copy run summary"
2288
+ class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
2289
+ title: "Add a label",
2290
+ onClick: startEditLabel
2291
+ }, " + label "))
2292
+ ], 64)),
2293
+ createVNode(_component_HelpHint, { topic: "run.summary" })
2294
+ ]),
2295
+ __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
2296
+ key: 0,
2297
+ color: "neutral",
2298
+ variant: "soft",
2299
+ size: "sm",
2300
+ class: "shrink-0",
2301
+ title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
2302
+ }, {
2303
+ default: withCtx(() => [
2304
+ createVNode(_component_UIcon, {
2305
+ name: "i-lucide-layout-grid",
2306
+ class: "size-3 mr-1"
2307
+ }),
2308
+ createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
2309
+ ]),
2310
+ _: 1
2311
+ }, 8, ["title"])) : createCommentVNode("", true),
2312
+ __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
2313
+ key: 1,
2314
+ text: `This run started after: ${__props.testRun.precedingMarker.label}`
2315
+ }, {
2316
+ default: withCtx(() => [
2317
+ createVNode(_component_NuxtLink, {
2318
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
2319
+ class: "shrink-0 inline-flex items-center gap-1"
1413
2320
  }, {
1414
2321
  default: withCtx(() => [
1415
- createVNode(_component_UButton, {
1416
- size: "xs",
1417
- variant: "ghost",
1418
- color: "neutral",
1419
- icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
1420
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1421
- onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
1422
- }, null, 8, ["icon", "onClick"])
1423
- ]),
1424
- _: 1
1425
- }, 8, ["text"]),
1426
- unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 2 }, {
1427
- content: withCtx(() => [
1428
- createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
1429
- createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
1430
- (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
1431
- return createVNode("button", {
1432
- key: m,
1433
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
1434
- onClick: ($event) => retryMode.value = m
1435
- }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
1436
- }), 64))
1437
- ])
1438
- ]),
1439
- default: withCtx(() => [
1440
- createVNode(_component_UButton, {
1441
- size: "xs",
1442
- color: "warning",
1443
- variant: "subtle",
1444
- icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
1445
- title: unref(retryTitle),
1446
- onClick: ($event) => copyRetryCommand()
1447
- }, {
1448
- default: withCtx(() => [
1449
- createTextVNode(" Retry ")
1450
- ]),
1451
- _: 1
1452
- }, 8, ["icon", "title", "onClick"])
2322
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
2323
+ createVNode(_component_MarkerBadge, {
2324
+ marker: __props.testRun.precedingMarker,
2325
+ size: "xs"
2326
+ }, null, 8, ["marker"])
1453
2327
  ]),
1454
2328
  _: 1
1455
- })) : createCommentVNode("", true)
1456
- ])
1457
- ])
2329
+ }, 8, ["to"])
2330
+ ]),
2331
+ _: 1
2332
+ }, 8, ["text"])) : createCommentVNode("", true)
2333
+ ]),
2334
+ createVNode("p", { class: "mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap" }, [
2335
+ createVNode("span", null, "Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
2336
+ createVNode(_component_ClientOnly, null, {
2337
+ default: withCtx(() => [
2338
+ createVNode("span", { class: "text-dimmed" }, "· " + toDisplayString(("formatRelativeTime" in _ctx ? _ctx.formatRelativeTime : unref(formatRelativeTime))(__props.testRun?.startTime)), 1)
2339
+ ]),
2340
+ _: 1
2341
+ })
1458
2342
  ])
1459
2343
  ]),
1460
- createVNode("div", { class: "grid grid-cols-3 sm:grid-cols-5 gap-2" }, [
2344
+ createVNode("div", { class: "flex items-center gap-1.5 shrink-0" }, [
2345
+ createVNode(_component_UTooltip, {
2346
+ text: unref(copied) ? "Copied!" : "Copy run summary"
2347
+ }, {
2348
+ default: withCtx(() => [
2349
+ createVNode(_component_UButton, {
2350
+ size: "xs",
2351
+ variant: "ghost",
2352
+ color: "neutral",
2353
+ icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
2354
+ "aria-label": "Copy run summary",
2355
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
2356
+ onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
2357
+ }, null, 8, ["icon", "onClick"])
2358
+ ]),
2359
+ _: 1
2360
+ }, 8, ["text"]),
2361
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 0 }, {
2362
+ content: withCtx(() => [
2363
+ createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
2364
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
2365
+ (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
2366
+ return createVNode("button", {
2367
+ key: m,
2368
+ class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
2369
+ onClick: ($event) => retryMode.value = m
2370
+ }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
2371
+ }), 64))
2372
+ ])
2373
+ ]),
2374
+ default: withCtx(() => [
2375
+ createVNode(_component_UButton, {
2376
+ size: "xs",
2377
+ color: "warning",
2378
+ variant: "subtle",
2379
+ icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
2380
+ title: unref(retryTitle),
2381
+ "aria-label": "Retry",
2382
+ onClick: ($event) => copyRetryCommand()
2383
+ }, {
2384
+ default: withCtx(() => [
2385
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
2386
+ ]),
2387
+ _: 1
2388
+ }, 8, ["icon", "title", "onClick"])
2389
+ ]),
2390
+ _: 1
2391
+ })) : createCommentVNode("", true),
2392
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
2393
+ key: 1,
2394
+ "project-id": __props.testRun?.project?.id,
2395
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
2396
+ cases: unref(failedCases)
2397
+ }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true),
2398
+ unref(primaryReport) ? (openBlock(), createBlock(_component_UButton, {
2399
+ key: 2,
2400
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(unref(primaryReport).path, null, unref(config).app?.baseURL),
2401
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(unref(primaryReport).type),
2402
+ target: "_blank",
2403
+ size: "xs",
2404
+ color: "primary",
2405
+ variant: "outline",
2406
+ "aria-label": unref(primaryReport).label,
2407
+ title: unref(primaryReport).size ? `${unref(primaryReport).label} · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(primaryReport).size)}` : unref(primaryReport).label
2408
+ }, {
2409
+ default: withCtx(() => [
2410
+ createVNode("span", { class: "hidden @2xl:inline" }, toDisplayString(unref(primaryReport).label), 1)
2411
+ ]),
2412
+ _: 1
2413
+ }, 8, ["href", "icon", "aria-label", "title"])) : createCommentVNode("", true)
2414
+ ])
2415
+ ]),
2416
+ createVNode(_component_StatTileGrid, { "min-tile-width": "7.5rem" }, {
2417
+ default: withCtx(() => [
1461
2418
  createVNode("button", {
1462
2419
  class: [
1463
2420
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
@@ -1523,232 +2480,87 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
1523
2480
  title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
1524
2481
  onClick: ($event) => emit("filter-status", "didnotrun")
1525
2482
  }, [
1526
- createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, " Didn't run "),
2483
+ createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, "Didn't run"),
1527
2484
  createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
1528
2485
  ], 10, ["onClick"])
1529
2486
  ]),
1530
- createVNode("div", null, [
1531
- __props.testRun ? (openBlock(), createBlock("div", {
1532
- key: 0,
1533
- class: "flex items-center gap-3"
1534
- }, [
1535
- createVNode("div", { class: "flex-1 max-w-md" }, [
1536
- createVNode(_component_TestStatusBar, {
1537
- passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
1538
- failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
1539
- skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
1540
- flaky: __props.testRun?.flakyTests ?? 0,
1541
- "did-not-run": __props.testRun?.didNotRunTests ?? 0,
1542
- total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
1543
- }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
1544
- ]),
1545
- createVNode("div", { class: "flex items-center gap-3 text-xs shrink-0" }, [
1546
- createVNode("div", { class: "flex items-center gap-1" }, [
1547
- createVNode(_component_UIcon, {
1548
- name: "i-lucide-clock",
1549
- class: "size-3.5 text-zinc-400"
1550
- }),
1551
- createVNode(_component_DurationValue, {
1552
- ms: __props.testRun?.duration,
1553
- class: "font-medium"
1554
- }, null, 8, ["ms"])
1555
- ]),
1556
- __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
1557
- key: 0,
1558
- class: "flex items-center gap-1"
1559
- }, [
1560
- createVNode(_component_UIcon, {
1561
- name: "i-lucide-gauge",
1562
- class: "size-3.5 text-zinc-400"
1563
- }),
1564
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Avg"),
1565
- createVNode(_component_DurationValue, {
1566
- ms: __props.testRun.avgTestDuration,
1567
- class: "font-medium"
1568
- }, null, 8, ["ms"])
1569
- ])) : createCommentVNode("", true),
1570
- __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
1571
- key: 1,
1572
- class: "flex items-center gap-1"
1573
- }, [
1574
- createVNode(_component_UIcon, {
1575
- name: "i-lucide-arrow-up-right",
1576
- class: "size-3.5 text-orange-500"
1577
- }),
1578
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "P90"),
1579
- createVNode(_component_DurationValue, {
1580
- ms: __props.testRun.p90TestDuration,
1581
- class: "font-medium text-orange-600 dark:text-orange-400",
1582
- "unit-class": "opacity-60"
1583
- }, null, 8, ["ms"])
1584
- ])) : createCommentVNode("", true),
1585
- __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
1586
- key: 2,
1587
- class: "flex items-center gap-1"
1588
- }, [
1589
- createVNode(_component_UIcon, {
1590
- name: "i-lucide-clock",
1591
- class: "size-3.5 text-amber-500"
1592
- }),
1593
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Wasted"),
1594
- createVNode(_component_DurationValue, {
1595
- ms: __props.totalWastedTime,
1596
- class: "font-medium text-amber-600 dark:text-amber-400",
1597
- "unit-class": "opacity-60"
1598
- }, null, 8, ["ms"])
1599
- ])) : createCommentVNode("", true)
1600
- ])
1601
- ])) : createCommentVNode("", true)
1602
- ])
1603
- ])
1604
- ]),
1605
- _: 1
1606
- })
1607
- ], 2),
1608
- unref(showCiEnv) ? (openBlock(), createBlock(_component_CiEnvCard, {
1609
- key: 0,
1610
- ci: __props.testRun?.metadata?.ci,
1611
- environment: __props.testRun?.environment,
1612
- "playwright-version": __props.testRun?.playwrightVersion,
1613
- "reporter-version": __props.testRun?.reporterVersion,
1614
- class: unref(blockColSpanClass)
1615
- }, null, 8, ["ci", "environment", "playwright-version", "reporter-version", "class"])) : createCommentVNode("", true),
1616
- unref(showSource) ? (openBlock(), createBlock(_component_SourceInfoCard, {
1617
- key: 1,
1618
- scm: __props.testRun.metadata.scm,
1619
- class: unref(blockColSpanClass)
1620
- }, null, 8, ["scm", "class"])) : createCommentVNode("", true),
1621
- unref(showStorage) ? (openBlock(), createBlock(_component_BlockCard, {
1622
- key: 2,
1623
- class: unref(blockColSpanClass),
1624
- title: "Storage",
1625
- icon: "i-lucide-database",
1626
- help: "run.reports",
1627
- subtitle: unref(storageStats)?.totalFiles ? `${unref(storageStats).totalFiles} files · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).totalSize)}` : void 0
1628
- }, {
1629
- default: withCtx(() => [
1630
- __props.finalizing ? (openBlock(), createBlock("div", {
1631
- key: 0,
1632
- class: "flex items-center gap-3"
1633
- }, [
1634
- createVNode(_component_UIcon, {
1635
- name: "i-lucide-upload",
1636
- class: "size-5 text-info shrink-0 animate-pulse"
2487
+ _: 1
1637
2488
  }),
1638
- createVNode("div", { class: "flex-1 min-w-0" }, [
1639
- createVNode("div", { class: "flex items-center justify-between mb-1" }, [
1640
- createVNode("span", { class: "text-sm font-medium" }, "Finalizing test run"),
1641
- createVNode("span", { class: "text-xs text-zinc-500" }, "Uploading reports & traces…")
1642
- ]),
1643
- createVNode(_component_UProgress, {
1644
- value: null,
1645
- size: "sm",
1646
- color: "info",
1647
- class: "rounded-full animate-pulse"
1648
- })
1649
- ])
1650
- ])) : createCommentVNode("", true),
1651
- unref(storageStats)?.totalFiles ? (openBlock(), createBlock("div", {
1652
- key: 1,
1653
- class: "space-y-1.5 text-sm"
1654
- }, [
1655
- (openBlock(true), createBlock(Fragment, null, renderList(__props.allReports, (report) => {
1656
- return openBlock(), createBlock("div", {
1657
- key: report.label,
1658
- class: "flex items-center justify-between gap-2 min-w-0"
1659
- }, [
1660
- createVNode(_component_UButton, {
1661
- href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1662
- icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1663
- target: "_blank",
1664
- size: "xs",
1665
- variant: "outline",
1666
- class: "min-w-0",
1667
- ui: { label: "truncate" }
1668
- }, {
1669
- default: withCtx(() => [
1670
- createTextVNode(toDisplayString(report.label), 1)
1671
- ]),
1672
- _: 2
1673
- }, 1032, ["href", "icon"]),
1674
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
1675
- ]);
1676
- }), 128)),
1677
- unref(storageStats).testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
2489
+ __props.testRun ? (openBlock(), createBlock("div", {
1678
2490
  key: 0,
1679
- class: "flex items-center justify-between gap-2 min-w-0"
1680
- }, [
1681
- createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(unref(storageStats).testCaseFilesCount) + ")", 1),
1682
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize)), 1)
1683
- ])) : createCommentVNode("", true)
1684
- ])) : createCommentVNode("", true)
1685
- ]),
1686
- _: 1
1687
- }, 8, ["class", "subtitle"])) : createCommentVNode("", true),
1688
- unref(showOther) ? (openBlock(), createBlock(_component_BlockCard, {
1689
- key: 3,
1690
- class: unref(blockColSpanClass),
1691
- title: "Other",
1692
- icon: "i-lucide-tags",
1693
- help: "run.metadata"
1694
- }, {
1695
- default: withCtx(() => [
1696
- createVNode("div", { class: "space-y-3 text-sm" }, [
1697
- __props.testRun.metadata.tags && __props.testRun.metadata.tags.length > 0 ? (openBlock(), createBlock("div", { key: 0 }, [
1698
- createVNode("div", { class: "flex flex-wrap gap-1.5" }, [
1699
- (openBlock(true), createBlock(Fragment, null, renderList(__props.testRun.metadata.tags, (tag) => {
1700
- return openBlock(), createBlock(_component_UBadge, {
1701
- key: tag,
1702
- color: "neutral",
1703
- variant: "soft",
1704
- size: "sm"
1705
- }, {
1706
- default: withCtx(() => [
1707
- createTextVNode(toDisplayString(tag), 1)
1708
- ]),
1709
- _: 2
1710
- }, 1024);
1711
- }), 128))
1712
- ])
1713
- ])) : createCommentVNode("", true),
1714
- __props.testRun.metadata.relatedIssue ? (openBlock(), createBlock("p", {
1715
- key: 1,
1716
- class: "flex items-center gap-1"
2491
+ class: "flex items-center gap-x-4 gap-y-1.5 flex-wrap"
1717
2492
  }, [
1718
- createVNode(_component_UIcon, {
1719
- name: "i-lucide-link",
1720
- class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1721
- }),
1722
- createVNode("span", null, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1723
- ])) : createCommentVNode("", true),
1724
- createVNode(_component_EntityLinks, {
1725
- "entity-type": "test_run",
1726
- "entity-id": __props.testRun.id,
1727
- links: __props.testRun.links ?? null,
1728
- onUpdated: ($event) => _ctx.$emit("label-updated")
1729
- }, null, 8, ["entity-id", "links", "onUpdated"]),
1730
- __props.testRun.metadata.customData ? (openBlock(), createBlock(_component_UButton, {
1731
- key: 2,
1732
- size: "xs",
1733
- variant: "ghost",
1734
- color: "neutral",
1735
- icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1736
- onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1737
- }, {
1738
- default: withCtx(() => [
1739
- createTextVNode(" Custom data ")
2493
+ createVNode("div", { class: "flex-1 basis-60 min-w-44 max-w-xl" }, [
2494
+ createVNode(_component_TestStatusBar, {
2495
+ passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
2496
+ failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
2497
+ skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
2498
+ flaky: __props.testRun?.flakyTests ?? 0,
2499
+ "did-not-run": __props.testRun?.didNotRunTests ?? 0,
2500
+ total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
2501
+ }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
1740
2502
  ]),
1741
- _: 1
1742
- }, 8, ["icon", "onClick"])) : createCommentVNode("", true),
1743
- __props.showCustomData && __props.testRun.metadata.customData ? (openBlock(), createBlock("div", { key: 3 }, [
1744
- createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1745
- createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(__props.testRun.metadata.customData, null, 2)), 1)
2503
+ createVNode("div", { class: "flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0" }, [
2504
+ createVNode("div", { class: "flex items-center gap-1" }, [
2505
+ createVNode(_component_UIcon, {
2506
+ name: "i-lucide-clock",
2507
+ class: "size-3.5 text-zinc-400"
2508
+ }),
2509
+ createVNode(_component_DurationValue, {
2510
+ ms: __props.testRun?.duration,
2511
+ class: "font-medium"
2512
+ }, null, 8, ["ms"])
2513
+ ]),
2514
+ __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
2515
+ key: 0,
2516
+ class: "flex items-center gap-1"
2517
+ }, [
2518
+ createVNode(_component_UIcon, {
2519
+ name: "i-lucide-gauge",
2520
+ class: "size-3.5 text-zinc-400"
2521
+ }),
2522
+ createVNode("span", { class: "text-zinc-500" }, "Avg"),
2523
+ createVNode(_component_DurationValue, {
2524
+ ms: __props.testRun.avgTestDuration,
2525
+ class: "font-medium"
2526
+ }, null, 8, ["ms"])
2527
+ ])) : createCommentVNode("", true),
2528
+ __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
2529
+ key: 1,
2530
+ class: "flex items-center gap-1"
2531
+ }, [
2532
+ createVNode(_component_UIcon, {
2533
+ name: "i-lucide-arrow-up-right",
2534
+ class: "size-3.5 text-orange-500"
2535
+ }),
2536
+ createVNode("span", { class: "text-zinc-500" }, "P90"),
2537
+ createVNode(_component_DurationValue, {
2538
+ ms: __props.testRun.p90TestDuration,
2539
+ class: "font-medium text-orange-600 dark:text-orange-400",
2540
+ "unit-class": "opacity-60"
2541
+ }, null, 8, ["ms"])
2542
+ ])) : createCommentVNode("", true),
2543
+ __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
2544
+ key: 2,
2545
+ class: "flex items-center gap-1"
2546
+ }, [
2547
+ createVNode(_component_UIcon, {
2548
+ name: "i-lucide-clock",
2549
+ class: "size-3.5 text-amber-500"
2550
+ }),
2551
+ createVNode("span", { class: "text-zinc-500" }, "Wasted"),
2552
+ createVNode(_component_DurationValue, {
2553
+ ms: __props.totalWastedTime,
2554
+ class: "font-medium text-amber-600 dark:text-amber-400",
2555
+ "unit-class": "opacity-60"
2556
+ }, null, 8, ["ms"])
2557
+ ])) : createCommentVNode("", true)
1746
2558
  ])
1747
2559
  ])) : createCommentVNode("", true)
1748
2560
  ])
1749
2561
  ]),
1750
2562
  _: 1
1751
- }, 8, ["class"])) : createCommentVNode("", true)
2563
+ })
1752
2564
  ])
1753
2565
  ];
1754
2566
  }
@@ -2418,12 +3230,12 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2418
3230
  }
2419
3231
  __expose({ scrollToCase });
2420
3232
  return (_ctx, _push, _parent, _attrs) => {
2421
- const _component_FilterToolbar = __nuxt_component_4$1;
3233
+ const _component_FilterToolbar = __nuxt_component_4$3;
2422
3234
  const _component_UIcon = _sfc_main$p;
2423
3235
  const _component_HelpHint = __nuxt_component_2$2;
2424
3236
  const _component_UInput = _sfc_main$d$1;
2425
- const _component_USelect = _sfc_main$o;
2426
- const _component_UCheckbox = _sfc_main$q;
3237
+ const _component_USelect = _sfc_main$q;
3238
+ const _component_UCheckbox = _sfc_main$r;
2427
3239
  const _component_UButton = _sfc_main$k;
2428
3240
  const _component_TestCasesTree = __nuxt_component_7;
2429
3241
  const _component_ClientOnly = __nuxt_component_7$1;
@@ -2802,8 +3614,8 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
2802
3614
  return (_ctx, _push, _parent, _attrs) => {
2803
3615
  const _component_ErrorState = __nuxt_component_5$1;
2804
3616
  const _component_UButton = _sfc_main$k;
2805
- const _component_LoadingState = __nuxt_component_1$1;
2806
- const _component_EmptyState = __nuxt_component_9$2;
3617
+ const _component_LoadingState = __nuxt_component_12$2;
3618
+ const _component_EmptyState = __nuxt_component_4$2;
2807
3619
  const _component_UIcon = _sfc_main$p;
2808
3620
  const _component_HelpHint = __nuxt_component_2$2;
2809
3621
  const _component_SectionCard = __nuxt_component_11;
@@ -3830,12 +4642,12 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3830
4642
  const _component_UIcon = _sfc_main$p;
3831
4643
  const _component_HelpHint = __nuxt_component_2$2;
3832
4644
  const _component_UButton = _sfc_main$k;
3833
- const _component_UCard = _sfc_main$m;
4645
+ const _component_UCard = _sfc_main$n;
3834
4646
  const _component_TableScroller = __nuxt_component_3$2;
3835
- const _component_UTable = _sfc_main$i;
4647
+ const _component_UTable = _sfc_main$j;
3836
4648
  const _component_UBadge = _sfc_main$7$1;
3837
4649
  const _component_NuxtLink = __nuxt_component_12$1;
3838
- const _component_UModal = _sfc_main$n;
4650
+ const _component_UModal = _sfc_main$o;
3839
4651
  const _component_ClusterDiagnosis = __nuxt_component_9;
3840
4652
  _push(`<!--[--><div class="pt-4 space-y-3">`);
3841
4653
  if (unref(loading)) {
@@ -4958,13 +5770,13 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
4958
5770
  copy(context.value?.commitRange?.gitCommand);
4959
5771
  }
4960
5772
  return (_ctx, _push, _parent, _attrs) => {
4961
- const _component_LoadingState = __nuxt_component_1$1;
4962
- const _component_EmptyState = __nuxt_component_9$2;
5773
+ const _component_LoadingState = __nuxt_component_12$2;
5774
+ const _component_EmptyState = __nuxt_component_4$2;
4963
5775
  const _component_UIcon = _sfc_main$p;
4964
5776
  const _component_HelpHint = __nuxt_component_2$2;
4965
5777
  const _component_NuxtLink = __nuxt_component_12$1;
4966
5778
  const _component_UBadge = _sfc_main$7$1;
4967
- const _component_UCard = _sfc_main$m;
5779
+ const _component_UCard = _sfc_main$n;
4968
5780
  const _component_UButton = _sfc_main$k;
4969
5781
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "pt-4" }, _attrs))}>`);
4970
5782
  if (unref(loading)) {
@@ -5326,7 +6138,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
5326
6138
  const _component_HelpHint = __nuxt_component_2$2;
5327
6139
  const _component_UPopover = _sfc_main$8$1;
5328
6140
  const _component_UButton = _sfc_main$k;
5329
- const _component_UCheckbox = _sfc_main$q;
6141
+ const _component_UCheckbox = _sfc_main$r;
5330
6142
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex items-center justify-between mb-2" }, _attrs))}><span class="text-xs text-gray-500 inline-flex items-center gap-1"><span>${ssrInterpolate(__props.workerCount)} worker${ssrInterpolate(__props.workerCount > 1 ? "s" : "")} `);
5331
6143
  if (__props.shardTotal && __props.shardTotal > 1) {
5332
6144
  _push(`<!--[--> · ${ssrInterpolate(__props.shardTotal)} shard${ssrInterpolate(__props.shardTotal > 1 ? "s" : "")}<!--]-->`);
@@ -6227,15 +7039,15 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6227
7039
  }
6228
7040
  ];
6229
7041
  return (_ctx, _push, _parent, _attrs) => {
6230
- const _component_USelectMenu = _sfc_main$j;
7042
+ const _component_USelectMenu = _sfc_main$l;
6231
7043
  const _component_RunStatusBadge = __nuxt_component_13$1;
6232
7044
  const _component_UButton = _sfc_main$k;
6233
7045
  const _component_UIcon = _sfc_main$p;
6234
- const _component_UAlert = _sfc_main$l;
7046
+ const _component_UAlert = _sfc_main$m;
6235
7047
  const _component_MarkerBadge = __nuxt_component_5;
6236
7048
  const _component_UBadge = _sfc_main$7$1;
6237
7049
  const _component_TableScroller = __nuxt_component_3$2;
6238
- const _component_UTable = _sfc_main$i;
7050
+ const _component_UTable = _sfc_main$j;
6239
7051
  const _component_DurationValue = __nuxt_component_14$1;
6240
7052
  _push(`<div${ssrRenderAttrs(_attrs)}>`);
6241
7053
  if (__props.testRun && !isLive.value) {
@@ -6822,9 +7634,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6822
7634
  ];
6823
7635
  return (_ctx, _push, _parent, _attrs) => {
6824
7636
  const _component_UIcon = _sfc_main$p;
6825
- const _component_UTable = _sfc_main$i;
7637
+ const _component_UTable = _sfc_main$j;
6826
7638
  const _component_UBadge = _sfc_main$7$1;
6827
7639
  const _component_DurationValue = __nuxt_component_14$1;
7640
+ const _component_FeatureUnavailable = __nuxt_component_4$1;
6828
7641
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-col overflow-hidden" }, _attrs))}>`);
6829
7642
  if (unref(loading)) {
6830
7643
  _push(`<div class="flex-1 flex items-center justify-center text-gray-500 gap-2">`);
@@ -6957,12 +7770,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6957
7770
  _: 1
6958
7771
  }, _parent));
6959
7772
  } else {
6960
- _push(`<div class="flex-1 flex items-center justify-center text-center text-gray-500">`);
6961
- _push(ssrRenderComponent(_component_UIcon, {
6962
- name: "i-lucide-wifi-off",
6963
- class: "size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"
7773
+ _push(ssrRenderComponent(_component_FeatureUnavailable, {
7774
+ class: "flex-1",
7775
+ icon: "i-lucide-wifi-off",
7776
+ title: "No network requests captured",
7777
+ text: "Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",
7778
+ doc: "capture-fixtures"
6964
7779
  }, null, _parent));
6965
- _push(`<p> No network request data. Add the <code class="text-xs bg-gray-100 dark:bg-gray-800 px-1 rounded font-mono">@piwitests/reporter</code> fixtures to your test setup. </p></div>`);
6966
7780
  }
6967
7781
  _push(`</div>`);
6968
7782
  };
@@ -7170,11 +7984,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
7170
7984
  }
7171
7985
  return (_ctx, _push, _parent, _attrs) => {
7172
7986
  const _component_UDashboardPanel = _sfc_main$1$1;
7173
- const _component_UDashboardNavbar = _sfc_main$g;
7987
+ const _component_UDashboardNavbar = _sfc_main$h;
7174
7988
  const _component_UDashboardSidebarCollapse = _sfc_main$1$2;
7175
7989
  const _component_BreadcrumbNav = __nuxt_component_3$1;
7176
7990
  const _component_NuxtLink = __nuxt_component_12$1;
7177
- const _component_UTooltip = _sfc_main$h;
7991
+ const _component_UTooltip = _sfc_main$i;
7178
7992
  const _component_UIcon = _sfc_main$p;
7179
7993
  const _component_NavbarActions = __nuxt_component_4;
7180
7994
  const _component_DetailPageLayout = __nuxt_component_8;
@@ -7835,4 +8649,4 @@ _sfc_main.setup = (props, ctx) => {
7835
8649
  };
7836
8650
 
7837
8651
  export { _sfc_main as default };
7838
- //# sourceMappingURL=_id_-BHh65pfg.mjs.map
8652
+ //# sourceMappingURL=_id_-8cGIgeg6.mjs.map