@piwitests/server 0.18.2 → 0.20.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 (783) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{Dwws9U0D.js → -f7BAm1H.js} +1 -1
  3. package/.output/public/_nuxt/{BjCHB89N.js → 4gYNA-d4.js} +1 -1
  4. package/.output/public/_nuxt/5A6ITZXj.js +1 -0
  5. package/.output/public/_nuxt/8PUUncmO.js +44 -0
  6. package/.output/public/_nuxt/A1pj0VnG.js +1 -0
  7. package/.output/public/_nuxt/{DZ3Vfcpz.js → AbmKWFQQ.js} +1 -1
  8. package/.output/public/_nuxt/B3obW6cw.js +3 -0
  9. package/.output/public/_nuxt/{QmMoMxLM.js → B7FTvFWq.js} +3 -3
  10. package/.output/public/_nuxt/{DXbPFI1d.js → B8zkOmwo.js} +1 -1
  11. package/.output/public/_nuxt/B96M2gdj.js +1 -0
  12. package/.output/public/_nuxt/{BFP6M-20.js → B99fbi73.js} +1 -1
  13. package/.output/public/_nuxt/{DD5HpaW9.js → B9OLmp0f.js} +1 -1
  14. package/.output/public/_nuxt/BKkF4pPD.js +1 -0
  15. package/.output/public/_nuxt/BT3wGCTI.js +1 -0
  16. package/.output/public/_nuxt/BUa0V0Ly.js +1 -0
  17. package/.output/public/_nuxt/BUkim3TM.js +1 -0
  18. package/.output/public/_nuxt/BVc14Ncz.js +4 -0
  19. package/.output/public/_nuxt/BY0HxR3t.js +17 -0
  20. package/.output/public/_nuxt/B_xAMWQS.js +2 -0
  21. package/.output/public/_nuxt/BdQoBaOv.js +1 -0
  22. package/.output/public/_nuxt/{Cng9gj7q.js → BdfhYr-u.js} +1 -1
  23. package/.output/public/_nuxt/BgRu_3tT.js +1 -0
  24. package/.output/public/_nuxt/{BBK2-Krn.js → BiO7RBWb.js} +2 -2
  25. package/.output/public/_nuxt/BicAJ6U8.js +1 -0
  26. package/.output/public/_nuxt/BjaRappk.js +1 -0
  27. package/.output/public/_nuxt/Bm62iDV5.js +1 -0
  28. package/.output/public/_nuxt/{C9YzQCiq.js → BmUfSNMV.js} +1 -1
  29. package/.output/public/_nuxt/Bnxf8nbZ.js +1 -0
  30. package/.output/public/_nuxt/{CsUoYK75.js → Bow4tTR0.js} +1 -1
  31. package/.output/public/_nuxt/{B2oUeBbA.js → BrQEE053.js} +1 -1
  32. package/.output/public/_nuxt/BzRRzmwm.js +1 -0
  33. package/.output/public/_nuxt/{CN1mJlvD.js → C0_yH0N7.js} +1 -1
  34. package/.output/public/_nuxt/C1gTN4Q8.js +1 -0
  35. package/.output/public/_nuxt/{CNMoZYMv.js → C2hkrSey.js} +1 -1
  36. package/.output/public/_nuxt/{rTvJTef_.js → C8e1EbJI.js} +1 -1
  37. package/.output/public/_nuxt/CA9B2HE5.js +1 -0
  38. package/.output/public/_nuxt/{oFM1KLWA.js → CAAwCT7H.js} +1 -1
  39. package/.output/public/_nuxt/{qpI-_f9Q.js → CAvY22RE.js} +1 -1
  40. package/.output/public/_nuxt/{BLIRKrbM.js → CEfS4-oS.js} +4 -4
  41. package/.output/public/_nuxt/CIoSMkpp.js +1 -0
  42. package/.output/public/_nuxt/{hH1UFE3Z.js → CIrFl3MW.js} +1 -1
  43. package/.output/public/_nuxt/CJFtzlQ4.js +1 -0
  44. package/.output/public/_nuxt/{hgHc4teu.js → CNyV9YpI.js} +1 -1
  45. package/.output/public/_nuxt/CSJ-eOQM.js +1 -0
  46. package/.output/public/_nuxt/CTU1mrhq.js +1 -0
  47. package/.output/public/_nuxt/CXEH9OPk.js +1 -0
  48. package/.output/public/_nuxt/CahpB9Z2.js +5 -0
  49. package/.output/public/_nuxt/{C8OCrfDP.js → Cbh--1MW.js} +1 -1
  50. package/.output/public/_nuxt/CeG9pBAD.js +1 -0
  51. package/.output/public/_nuxt/{DBtBvrYc.js → CeW8v31b.js} +1 -1
  52. package/.output/public/_nuxt/{DZUgX70W.js → CjPfj7ya.js} +1 -1
  53. package/.output/public/_nuxt/Cnsmicv2.js +79 -0
  54. package/.output/public/_nuxt/CsLojMwR.js +1 -0
  55. package/.output/public/_nuxt/{BXY_PWcx.js → Cus22Ud3.js} +2 -2
  56. package/.output/public/_nuxt/{4TxgDGVa.js → CwGWJbiy.js} +1 -1
  57. package/.output/public/_nuxt/Cx6gc2VW.js +1 -0
  58. package/.output/public/_nuxt/{B1X__ilH.js → CxyAzHr3.js} +1 -1
  59. package/.output/public/_nuxt/{BJtlcTrb.js → CzAPFPpL.js} +1 -1
  60. package/.output/public/_nuxt/D--H4jLI.js +1 -0
  61. package/.output/public/_nuxt/D-c8ZSws.js +1 -0
  62. package/.output/public/_nuxt/D1POo6S4.js +10 -0
  63. package/.output/public/_nuxt/D5tke0B5.js +1 -0
  64. package/.output/public/_nuxt/D8nkF-OO.js +3 -0
  65. package/.output/public/_nuxt/DA25RkyK.js +1 -0
  66. package/.output/public/_nuxt/{DZ1zNBVM.js → DIB-5fUJ.js} +1 -1
  67. package/.output/public/_nuxt/DJmoLeVt.js +1 -0
  68. package/.output/public/_nuxt/DJxlKFGb.js +1 -0
  69. package/.output/public/_nuxt/DMec-OLo.js +1 -0
  70. package/.output/public/_nuxt/DPCxhHri.js +1 -0
  71. package/.output/public/_nuxt/{By4YL7mx.js → DSqHUrvO.js} +1 -1
  72. package/.output/public/_nuxt/DabzhQB1.js +1 -0
  73. package/.output/public/_nuxt/{D5oNv2cB.js → DdwHkKfV.js} +1 -1
  74. package/.output/public/_nuxt/{CfOLBbW9.js → DeY2JkR2.js} +1 -1
  75. package/.output/public/_nuxt/{CPLJeOCb.js → DfgOx_ou.js} +1 -1
  76. package/.output/public/_nuxt/DmkUdSS4.js +1 -0
  77. package/.output/public/_nuxt/{CUvGJXY3.js → DoIREDVb.js} +1 -1
  78. package/.output/public/_nuxt/DpZ1r1HA.js +1 -0
  79. package/.output/public/_nuxt/{BOCwBVnz.js → Dpd16JVI.js} +1 -1
  80. package/.output/public/_nuxt/DqcKngf3.js +1 -0
  81. package/.output/public/_nuxt/{xqiPI_FQ.js → DrfE8IY0.js} +1 -1
  82. package/.output/public/_nuxt/{BeFDVhpA.js → DsesNydr.js} +1 -1
  83. package/.output/public/_nuxt/{D0cnIs93.js → DtHJgCS8.js} +1 -1
  84. package/.output/public/_nuxt/Dtd4rC58.js +9 -0
  85. package/.output/public/_nuxt/Du2W7Jne.js +254 -0
  86. package/.output/public/_nuxt/DuwtTfO8.js +2 -0
  87. package/.output/public/_nuxt/Dy-TJ0Mt.js +1 -0
  88. package/.output/public/_nuxt/{BlnwU1OO.js → Dy86h-7P.js} +1 -1
  89. package/.output/public/_nuxt/{B-IcwqZ2.js → Dyeqn3aG.js} +1 -1
  90. package/.output/public/_nuxt/{BlA8mIS-.js → FaFoMVKo.js} +1 -1
  91. package/.output/public/_nuxt/GPNI1ffD.js +4 -0
  92. package/.output/public/_nuxt/{DWowvnwc.js → H94BMf3L.js} +1 -1
  93. package/.output/public/_nuxt/HPNQD6v3.js +1 -0
  94. package/.output/public/_nuxt/HXadJrHu.js +2 -0
  95. package/.output/public/_nuxt/KyA_4Ks-.js +1 -0
  96. package/.output/public/_nuxt/{e7zD3uJ0.js → L3kAWB2a.js} +1 -1
  97. package/.output/public/_nuxt/McL25vkx.js +34 -0
  98. package/.output/public/_nuxt/Nn93e_Mz.js +1 -0
  99. package/.output/public/_nuxt/TagBadge.By1E6r4y.css +1 -0
  100. package/.output/public/_nuxt/UdR3DBPS.js +1 -0
  101. package/.output/public/_nuxt/Und3xXFc.js +5 -0
  102. package/.output/public/_nuxt/_mj6CfPa.js +1 -0
  103. package/.output/public/_nuxt/b-GYfcrQ.js +1 -0
  104. package/.output/public/_nuxt/bLcjFslv.js +1 -0
  105. package/.output/public/_nuxt/builds/latest.json +1 -1
  106. package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +1 -0
  107. package/.output/public/_nuxt/entry.DmptwB51.css +1 -0
  108. package/.output/public/_nuxt/{wHnZ9OaL.js → hC_z4G8p.js} +1 -1
  109. package/.output/public/_nuxt/{DZOS7Fh7.js → hNh4CIL0.js} +1 -1
  110. package/.output/public/_nuxt/{kjYMoWWx.js → l5WKbU4h.js} +3 -3
  111. package/.output/public/_nuxt/oAClCn_h.js +1 -0
  112. package/.output/public/_nuxt/{gnCL8GjZ.js → pQqGiNch.js} +1 -1
  113. package/.output/public/_nuxt/ryMzSDUj.js +2 -0
  114. package/.output/public/demo/seed.version.json +2 -2
  115. package/.output/server/chunks/_/ai-prompt-preview.mjs +38 -0
  116. package/.output/server/chunks/_/ai-prompt-preview.mjs.map +1 -0
  117. package/.output/server/chunks/_/collect.mjs +122 -0
  118. package/.output/server/chunks/_/collect.mjs.map +1 -0
  119. package/.output/server/chunks/_/markers.mjs +1 -1
  120. package/.output/server/chunks/_/quarantine.mjs +112 -0
  121. package/.output/server/chunks/_/quarantine.mjs.map +1 -0
  122. package/.output/server/chunks/_/users.mjs +1 -1
  123. package/.output/server/chunks/build/{Alert-Bp1Wz_sq.mjs → Alert-C4xq8lao.mjs} +2 -2
  124. package/.output/server/chunks/build/Alert-C4xq8lao.mjs.map +1 -0
  125. package/.output/server/chunks/build/{Breadcrumb-C9ZPTLym.mjs → Breadcrumb-Ak2Lg3oM.mjs} +3 -3
  126. package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +1 -0
  127. package/.output/server/chunks/build/{BreadcrumbNav-C3y42Vun.mjs → BreadcrumbNav-DO7I_z-n.mjs} +3 -3
  128. package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +1 -0
  129. package/.output/server/chunks/build/{BrowserBadge-DNCp9pF-.mjs → BrowserBadge-MFvBwxmD.mjs} +67 -7
  130. package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +1 -0
  131. package/.output/server/chunks/build/{ChartCard-Fr557IbV.mjs → ChartCard-Y1UKwMsf.mjs} +2 -2
  132. package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +1 -0
  133. package/.output/server/chunks/build/{Checkbox-cVOSIY93.mjs → Checkbox-4Q5d0fa0.mjs} +8 -8
  134. package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +1 -0
  135. package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs +1492 -0
  136. package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +1 -0
  137. package/.output/server/chunks/build/{CodeBlock-BGwNmJ8J.mjs → CodeBlock-BgE-NSmE.mjs} +7 -22
  138. package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +1 -0
  139. package/.output/server/chunks/build/{DashboardNavbar-Bdp-OwTN.mjs → DashboardNavbar-BHmMSPX7.mjs} +3 -3
  140. package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +1 -0
  141. package/.output/server/chunks/build/{DashboardSidebarToggle-Ji6ADuqF.mjs → DashboardSidebarToggle-DCTnHiIv.mjs} +3 -3
  142. package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +1 -0
  143. package/.output/server/chunks/build/{DataLocationCard-D6xSOrme.mjs → DataLocationCard-B_YHdzSz.mjs} +3 -3
  144. package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +1 -0
  145. package/.output/server/chunks/build/{DiagnosisPanel-DV1xwGu4.mjs → DiagnosisPanel-CALyEmcJ.mjs} +17 -528
  146. package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.mjs.map +1 -0
  147. package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs +43 -0
  148. package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +1 -0
  149. package/.output/server/chunks/build/{EmptyState-DV3oT_xz.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-DeOP13Kr.mjs → EntityLinks-BBHWssHH.mjs} +6 -6
  152. package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +1 -0
  153. package/.output/server/chunks/build/{EnvManagedBadge-Qpn58Nmr.mjs → EnvManagedBadge-UwD2b9v2.mjs} +3 -3
  154. package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs.map +1 -0
  155. package/.output/server/chunks/build/{FormField-B-GSn_VR.mjs → FormField-B0HKsdMd.mjs} +3 -3
  156. package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +1 -0
  157. package/.output/server/chunks/build/{HelpHint-YEMWtKu1.mjs → HelpHint-DrcIv-Oj.mjs} +53 -6
  158. package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +1 -0
  159. package/.output/server/chunks/build/{Label-DBvbHd3A.mjs → Label-DYDR1Oeh.mjs} +2 -2
  160. package/.output/server/chunks/build/Label-DYDR1Oeh.mjs.map +1 -0
  161. package/.output/server/chunks/build/{MiniRunBars-C3HG-EYm.mjs → MiniRunBars-CZMugDrh.mjs} +2 -2
  162. package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +1 -0
  163. package/.output/server/chunks/build/{Modal-CfA78Hm1.mjs → Modal-pSDlXzT3.mjs} +2 -2
  164. package/.output/server/chunks/build/Modal-pSDlXzT3.mjs.map +1 -0
  165. package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs → OpenInIdeLink-CQWKKChd.mjs} +6 -6
  166. package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs.map → OpenInIdeLink-CQWKKChd.mjs.map} +1 -1
  167. package/.output/server/chunks/build/{ProjectTestCasesTable-9Ia825h8.mjs → ProjectTestCasesTable-Bo61P5K1.mjs} +120 -45
  168. package/.output/server/chunks/build/ProjectTestCasesTable-Bo61P5K1.mjs.map +1 -0
  169. package/.output/server/chunks/build/{RovingFocusItem-CxhHdNGo.mjs → RovingFocusItem--OEHI2P3.mjs} +2 -2
  170. package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +1 -0
  171. package/.output/server/chunks/build/{RunReports-BpJqLHY9.mjs → RunReports-DFLv51TX.mjs} +8 -6
  172. package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +1 -0
  173. package/.output/server/chunks/build/{RunStatusBadge-BhmJ_RKM.mjs → RunStatusBadge-FfGb6bkW.mjs} +3 -2
  174. package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +1 -0
  175. package/.output/server/chunks/build/{SectionCard-COd9TuDq.mjs → SectionCard-CN-v0FZ_.mjs} +2 -2
  176. package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +1 -0
  177. package/.output/server/chunks/build/{Select-ppPz926C.mjs → Select-5DK9frQ7.mjs} +4 -4
  178. package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +1 -0
  179. package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs → SelectMenu-D-2FSqBU.mjs} +939 -7
  180. package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs.map → SelectMenu-D-2FSqBU.mjs.map} +1 -1
  181. package/.output/server/chunks/build/{Separator-CxZdx8kw.mjs → Separator-CR4WcEKD.mjs} +2 -2
  182. package/.output/server/chunks/build/Separator-CR4WcEKD.mjs.map +1 -0
  183. package/.output/server/chunks/build/{SettingsField-DDD4oqys.mjs → SettingsField-BZfx4ma1.mjs} +6 -6
  184. package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +1 -0
  185. package/.output/server/chunks/build/{Slideover-B95Rj237.mjs → Slideover-D270EZZD.mjs} +3 -3
  186. package/.output/server/chunks/build/Slideover-D270EZZD.mjs.map +1 -0
  187. package/.output/server/chunks/build/{Switch-xQQ3_ME1.mjs → Switch-B5Fp8ULt.mjs} +5 -5
  188. package/.output/server/chunks/build/Switch-B5Fp8ULt.mjs.map +1 -0
  189. package/.output/server/chunks/build/{Table-CPhhVzDv.mjs → Table-BRk04Hd2.mjs} +3 -3
  190. package/.output/server/chunks/build/Table-BRk04Hd2.mjs.map +1 -0
  191. package/.output/server/chunks/build/{Tabs-BV9XqjoO.mjs → Tabs-BkSOnbaB.mjs} +3 -3
  192. package/.output/server/chunks/build/Tabs-BkSOnbaB.mjs.map +1 -0
  193. package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs +31 -0
  194. package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs.map +1 -0
  195. package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs +8 -0
  196. package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs.map +1 -0
  197. package/.output/server/chunks/build/{TestCaseHistoryChart-DMb-xSJa.mjs → TestCaseHistoryChart-CSi64vVA.mjs} +6 -6
  198. package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +1 -0
  199. package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs +200 -0
  200. package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +1 -0
  201. package/.output/server/chunks/build/{TestStatusBar-CEzt76wk.mjs → TestStatusBar-DX3EhlyP.mjs} +15 -15
  202. package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.mjs.map +1 -0
  203. package/.output/server/chunks/build/{Textarea-DrrqQUVG.mjs → Textarea-Dv2-lOvW.mjs} +2 -2
  204. package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +1 -0
  205. package/.output/server/chunks/build/{Tooltip-7vwuDPrZ.mjs → Tooltip-Dv4htNP6.mjs} +3 -3
  206. package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs.map +1 -0
  207. package/.output/server/chunks/build/{VisuallyHiddenInput-C9eJVpPW.mjs → VisuallyHiddenInput-BHvzNumK.mjs} +2 -2
  208. package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +1 -0
  209. package/.output/server/chunks/build/{_id_-CE0Gso6i.mjs → _id_-BdG37K7s.mjs} +91 -42
  210. package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +1 -0
  211. package/.output/server/chunks/build/{_id_-bWcP2xFl.mjs → _id_-BdJs7BJZ.mjs} +719 -448
  212. package/.output/server/chunks/build/_id_-BdJs7BJZ.mjs.map +1 -0
  213. package/.output/server/chunks/build/{_id_-B2yirIuA.mjs → _id_-BxA6IgWr.mjs} +831 -368
  214. package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +1 -0
  215. package/.output/server/chunks/build/{_id_-B4V5fop6.mjs → _id_-C_uSBiyU.mjs} +296 -60
  216. package/.output/server/chunks/build/{_id_-B4V5fop6.mjs.map → _id_-C_uSBiyU.mjs.map} +1 -1
  217. package/.output/server/chunks/build/{about-CoJjvUwM.mjs → about-BE0UV-8-.mjs} +456 -61
  218. package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +1 -0
  219. package/.output/server/chunks/build/{account-Cn-eZqXM.mjs → account-DAfvaD-F.mjs} +21 -9
  220. package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +1 -0
  221. package/.output/server/chunks/build/{ai-7jdaPOmj.mjs → ai-Cn05ch0u.mjs} +45 -23
  222. package/.output/server/chunks/build/{ai-7jdaPOmj.mjs.map → ai-Cn05ch0u.mjs.map} +1 -1
  223. package/.output/server/chunks/build/{analytics-B276WPeU.mjs → analytics-Bo_B_jko.mjs} +66 -41
  224. package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +1 -0
  225. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  226. package/.output/server/chunks/build/compare-RxHSOdsO.mjs +12 -0
  227. package/.output/server/chunks/build/{db.client-aHcD0wyX.mjs → db.client-CQoVTYB9.mjs} +83 -5
  228. package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +1 -0
  229. package/.output/server/chunks/build/{default-BSzdkM_L.mjs → default-CbNHaFsy.mjs} +622 -78
  230. package/.output/server/chunks/build/default-CbNHaFsy.mjs.map +1 -0
  231. package/.output/server/chunks/build/{docs-BN_x1OW3.mjs → docs-B_llWMxx.mjs} +30 -49
  232. package/.output/server/chunks/build/{docs-BN_x1OW3.mjs.map → docs-B_llWMxx.mjs.map} +1 -1
  233. package/.output/server/chunks/build/{edit-C9Z7oZeu.mjs → edit-J0asTFg8.mjs} +29 -18
  234. package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +1 -0
  235. package/.output/server/chunks/build/{fetch-8kznMtBM.mjs → fetch-B4FwBOzu.mjs} +3 -3
  236. package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +1 -0
  237. package/.output/server/chunks/build/{forgot-password-BqPF4Rxs.mjs → forgot-password-CC__1OnV.mjs} +17 -5
  238. package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +1 -0
  239. package/.output/server/chunks/build/{help-content-DmFnuhNu.mjs → help-content-C876a9WD.mjs} +37 -8
  240. package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +1 -0
  241. package/.output/server/chunks/build/import-CS9oylTN.mjs +1021 -0
  242. package/.output/server/chunks/build/import-CS9oylTN.mjs.map +1 -0
  243. package/.output/server/chunks/build/{index-CULN3-en.mjs → index-CU2nZhAa.mjs} +113 -42
  244. package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +1 -0
  245. package/.output/server/chunks/build/{index-BR9hw6qk.mjs → index-DE45ycdZ.mjs} +51 -31
  246. package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +1 -0
  247. package/.output/server/chunks/build/{index-BK9PTRpd.mjs → index-e9skCi-V.mjs} +85 -69
  248. package/.output/server/chunks/build/{index-BK9PTRpd.mjs.map → index-e9skCi-V.mjs.map} +1 -1
  249. package/.output/server/chunks/build/{index-DVUtBexc.mjs → index-hGHlmyxj.mjs} +1520 -288
  250. package/.output/server/chunks/build/index-hGHlmyxj.mjs.map +1 -0
  251. package/.output/server/chunks/build/{index-Ba-Fifra.mjs → index-tR6owKzj.mjs} +18 -6
  252. package/.output/server/chunks/build/index-tR6owKzj.mjs.map +1 -0
  253. package/.output/server/chunks/build/{isValueEqualOrExist-DBZjbD_3.mjs → isValueEqualOrExist-D2qw9YEr.mjs} +3 -3
  254. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs.map +1 -0
  255. package/.output/server/chunks/build/{login-D2XZDuek.mjs → login-Da4u1IlW.mjs} +19 -7
  256. package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +1 -0
  257. package/.output/server/chunks/build/{mcp-_o6cMS6m.mjs → mcp-uhVCCwQM.mjs} +359 -24
  258. package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +1 -0
  259. package/.output/server/chunks/build/{notifications-Dzm9c0u_.mjs → notifications-fx_qnKGA.mjs} +27 -21
  260. package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +1 -0
  261. package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs +368 -0
  262. package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +1 -0
  263. package/.output/server/chunks/build/{reset-password-gpFzIEDj.mjs → reset-password-BmrUS4ZD.mjs} +17 -5
  264. package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +1 -0
  265. package/.output/server/chunks/build/server.mjs +238 -36
  266. package/.output/server/chunks/build/{settings-pNyPBXVa.mjs → settings-CCYe7rsc.mjs} +23 -10
  267. package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +1 -0
  268. package/.output/server/chunks/build/{settings-metadata-B0wo5R-W.mjs → settings-metadata-DrEqWcW-.mjs} +11 -2
  269. package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +1 -0
  270. package/.output/server/chunks/build/{storage-XelzuyPy.mjs → storage-CJEmviCD.mjs} +41 -31
  271. package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +1 -0
  272. package/.output/server/chunks/build/styles.mjs +1 -0
  273. package/.output/server/chunks/build/{tags-DrCQ7QSw.mjs → tags-DauTe_F-.mjs} +22 -10
  274. package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +1 -0
  275. package/.output/server/chunks/build/{test-cases-pmOxi-AN.mjs → test-cases-thBbAykw.mjs} +38 -24
  276. package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +1 -0
  277. package/.output/server/chunks/build/{timeout-hygiene-CNs71Iah.mjs → timeout-hygiene-CbnSaVbK.mjs} +20 -8
  278. package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +1 -0
  279. package/.output/server/chunks/build/{useAiStatus-ZO987RY7.mjs → useAiStatus-CxjMmDDY.mjs} +89 -89
  280. package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +1 -0
  281. package/.output/server/chunks/build/{useCopy-BQQKcwlq.mjs → useCopy-CeKWgHyT.mjs} +2 -2
  282. package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +1 -0
  283. package/.output/server/chunks/build/{PageStateCard-Bwee6JTk.mjs → useCopyRich-RJKhWoyj.mjs} +472 -63
  284. package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +1 -0
  285. package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs +46 -0
  286. package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +1 -0
  287. package/.output/server/chunks/build/{useFormControl-BLpq1s4O.mjs → useFormControl-CZ9So7iX.mjs} +2 -2
  288. package/.output/server/chunks/build/useFormControl-CZ9So7iX.mjs.map +1 -0
  289. package/.output/server/chunks/build/{useOpenInIde-kMZ7Jw5c.mjs → useOpenInIde-BbTnPhFA.mjs} +3 -3
  290. package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +1 -0
  291. package/.output/server/chunks/build/{useSettingsNav-NjI2seBy.mjs → useSettingsNav-DnQKacz8.mjs} +6 -6
  292. package/.output/server/chunks/build/useSettingsNav-DnQKacz8.mjs.map +1 -0
  293. package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs +11 -0
  294. package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs.map +1 -0
  295. package/.output/server/chunks/build/{useTreeViewCookie-DVYpxW-p.mjs → useTreeViewCookie-CQjQdTkH.mjs} +2 -2
  296. package/.output/server/chunks/build/useTreeViewCookie-CQjQdTkH.mjs.map +1 -0
  297. package/.output/server/chunks/build/{users-NmAUZs3i.mjs → users-CTUqXyGh.mjs} +22 -10
  298. package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +1 -0
  299. package/.output/server/chunks/build/{wasted-time-CguAF9zc.mjs → wasted-time-BNTPIyrC.mjs} +26 -14
  300. package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +1 -0
  301. package/.output/server/chunks/nitro/nitro.mjs +6438 -1964
  302. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  303. package/.output/server/chunks/routes/__piwi/session.get.mjs +13 -1
  304. package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +12 -0
  306. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/admin/stats.get.mjs +12 -0
  308. package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
  309. package/.output/server/chunks/routes/api/ai/status.get.mjs +12 -0
  310. package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
  311. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +12 -0
  312. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
  313. package/.output/server/chunks/routes/api/auth/change-password.post.mjs +12 -0
  314. package/.output/server/chunks/routes/api/auth/change-password.post.mjs.map +1 -1
  315. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +12 -0
  316. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/auth/login.post.mjs +12 -0
  318. package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -1
  319. package/.output/server/chunks/routes/api/auth/logout.post.mjs +12 -0
  320. package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
  321. package/.output/server/chunks/routes/api/auth/me.get.mjs +12 -0
  322. package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
  323. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +12 -0
  324. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
  325. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +12 -0
  326. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
  327. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +12 -0
  328. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +12 -0
  330. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +12 -0
  332. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/auth/setup.get.mjs +12 -0
  334. package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
  335. package/.output/server/chunks/routes/api/auth/setup.post.mjs +12 -0
  336. package/.output/server/chunks/routes/api/auth/setup.post.mjs.map +1 -1
  337. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +12 -0
  338. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
  339. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +12 -0
  340. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
  341. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +12 -0
  342. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
  343. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +12 -0
  344. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
  345. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +12 -0
  346. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
  347. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +88 -0
  348. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -0
  349. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +12 -0
  350. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
  351. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +13 -1
  352. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
  353. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +13 -1
  354. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
  355. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +13 -1
  356. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +13 -1
  358. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
  359. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +24 -1
  360. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
  361. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +13 -1
  362. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
  363. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +13 -1
  364. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
  365. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +13 -1
  366. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
  367. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +13 -1
  368. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
  369. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +64 -0
  370. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -0
  371. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +13 -1
  372. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
  373. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +56 -0
  374. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -0
  375. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +13 -1
  376. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
  377. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +13 -1
  378. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
  379. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +13 -1
  380. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
  381. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +13 -32
  382. package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
  383. package/.output/server/chunks/routes/api/health.get.mjs +13 -1
  384. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  385. package/.output/server/chunks/routes/api/index.get.mjs +12 -0
  386. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  387. package/.output/server/chunks/routes/api/index.get2.mjs +13 -1
  388. package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
  389. package/.output/server/chunks/routes/api/index.get3.mjs +13 -1
  390. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  391. package/.output/server/chunks/routes/api/index.get4.mjs +13 -1
  392. package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
  393. package/.output/server/chunks/routes/api/index.get5.mjs +12 -0
  394. package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
  395. package/.output/server/chunks/routes/api/index.post.mjs +12 -0
  396. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  397. package/.output/server/chunks/routes/api/index.post2.mjs +13 -1
  398. package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
  399. package/.output/server/chunks/routes/api/index.post3.mjs +13 -1
  400. package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
  401. package/.output/server/chunks/routes/api/index.post4.mjs +13 -1
  402. package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
  403. package/.output/server/chunks/routes/api/index.post5.mjs +13 -1
  404. package/.output/server/chunks/routes/api/index.post5.mjs.map +1 -1
  405. package/.output/server/chunks/routes/api/index.post6.mjs +12 -0
  406. package/.output/server/chunks/routes/api/index.post6.mjs.map +1 -1
  407. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +13 -1
  408. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
  409. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +13 -1
  410. package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
  411. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +13 -1
  412. package/.output/server/chunks/routes/api/links/_id_.patch.mjs.map +1 -1
  413. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +13 -1
  414. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
  415. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +13 -1
  416. package/.output/server/chunks/routes/api/markers/_id_.put.mjs.map +1 -1
  417. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +13 -1
  418. package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
  419. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +13 -1
  420. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
  421. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +13 -1
  422. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
  423. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +13 -1
  424. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
  425. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +22 -2
  426. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
  427. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +13 -1
  428. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
  429. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +13 -1
  430. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
  431. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +13 -1
  432. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs.map +1 -1
  433. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +13 -1
  434. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
  435. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +13 -1
  436. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs.map +1 -1
  437. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +13 -1
  438. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
  439. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +58 -0
  440. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -0
  441. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +57 -0
  442. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -0
  443. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +72 -0
  444. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -0
  445. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +13 -1
  446. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
  447. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +13 -1
  448. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
  449. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +13 -1
  450. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
  451. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +13 -1
  452. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
  453. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +13 -1
  454. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
  455. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +13 -1
  456. package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
  457. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +13 -1
  458. package/.output/server/chunks/routes/api/projects/_id_.put.mjs.map +1 -1
  459. package/.output/server/chunks/routes/api/projects/menu.get.mjs +13 -1
  460. package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
  461. package/.output/server/chunks/routes/api/projects/overview.get.mjs +13 -1
  462. package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
  463. package/.output/server/chunks/routes/api/projects.get.mjs +13 -1
  464. package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
  465. package/.output/server/chunks/routes/api/search.get.mjs +13 -1
  466. package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
  467. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +13 -1
  468. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
  469. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +13 -1
  470. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
  471. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +12 -0
  472. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
  473. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +13 -1
  474. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
  475. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +13 -1
  476. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
  477. package/.output/server/chunks/routes/api/settings/ai.get.mjs +13 -1
  478. package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
  479. package/.output/server/chunks/routes/api/settings/ai.put.mjs +13 -1
  480. package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
  481. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +57 -0
  482. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -0
  483. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +63 -0
  484. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -0
  485. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +12 -0
  486. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs.map +1 -1
  487. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +13 -1
  488. package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
  489. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +13 -1
  490. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
  491. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +13 -1
  492. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
  493. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +13 -1
  494. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
  495. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +13 -1
  496. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
  497. package/.output/server/chunks/routes/api/stream.get.mjs +13 -1
  498. package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
  499. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +13 -1
  500. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
  501. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +13 -1
  502. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs.map +1 -1
  503. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +13 -1
  504. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
  505. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +13 -1
  506. package/.output/server/chunks/routes/api/tags/_id_.put.mjs.map +1 -1
  507. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +13 -1
  508. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
  509. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +13 -1
  510. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
  511. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +13 -1
  512. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
  513. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +13 -1
  514. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
  515. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +25 -3
  516. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +13 -1
  518. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
  519. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +60 -0
  520. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -0
  521. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +13 -1
  522. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +13 -1
  524. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
  525. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +13 -1
  526. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
  527. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +13 -1
  528. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
  529. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +17 -3
  530. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +13 -1
  532. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
  533. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +13 -1
  534. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
  535. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +13 -1
  536. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
  537. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +13 -1
  538. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
  539. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +13 -1
  540. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
  541. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +13 -1
  542. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
  543. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +13 -1
  544. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
  545. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +13 -1
  546. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
  547. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +13 -1
  548. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
  549. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +15 -1
  550. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
  551. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +196 -0
  552. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -0
  553. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +13 -1
  554. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
  555. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +13 -1
  556. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
  557. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +13 -1
  558. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
  559. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +13 -1
  560. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
  561. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +13 -1
  562. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
  563. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +13 -1
  564. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
  565. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +13 -1
  566. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
  567. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +13 -1
  568. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
  569. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +13 -1
  570. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
  571. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +77 -0
  572. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -0
  573. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +77 -0
  574. package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -0
  575. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +13 -1
  576. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
  577. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +13 -1
  578. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
  579. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +13 -1
  580. package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
  581. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +32 -15
  582. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  583. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +21 -6
  584. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  585. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +156 -3
  586. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  587. package/.output/server/chunks/routes/api/traces/check.post.mjs +13 -1
  588. package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
  589. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +12 -0
  590. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
  591. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +12 -0
  592. package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
  593. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +13 -1
  594. package/.output/server/chunks/routes/api/users/_id/index.post.mjs.map +1 -1
  595. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +13 -1
  596. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
  597. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +13 -1
  598. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
  599. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +13 -1
  600. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs.map +1 -1
  601. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +12 -0
  602. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  603. package/.output/server/chunks/routes/api/users/_id_.patch.mjs +12 -0
  604. package/.output/server/chunks/routes/api/users/_id_.patch.mjs.map +1 -1
  605. package/.output/server/chunks/routes/api/version.get.mjs +13 -1
  606. package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
  607. package/.output/server/chunks/routes/mcp.post.mjs +13 -1
  608. package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
  609. package/.output/server/chunks/routes/renderer.mjs +1 -1
  610. package/.output/server/chunks/tasks/sweep.mjs +12 -0
  611. package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
  612. package/.output/server/chunks/tasks/sweep2.mjs +12 -0
  613. package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
  614. package/.output/server/database/migrations/0039_remarkable_jean_grey.sql +2 -0
  615. package/.output/server/database/migrations/0040_organic_phalanx.sql +8 -0
  616. package/.output/server/database/migrations/0041_tense_gravity.sql +5 -0
  617. package/.output/server/database/migrations/0042_burly_hemingway.sql +19 -0
  618. package/.output/server/database/migrations/meta/0039_snapshot.json +3403 -0
  619. package/.output/server/database/migrations/meta/0040_snapshot.json +3457 -0
  620. package/.output/server/database/migrations/meta/0041_snapshot.json +3492 -0
  621. package/.output/server/database/migrations/meta/0042_snapshot.json +3618 -0
  622. package/.output/server/database/migrations/meta/_journal.json +28 -0
  623. package/.output/server/database/migrations-pg/0040_lazy_layla_miller.sql +2 -0
  624. package/.output/server/database/migrations-pg/0041_light_screwball.sql +8 -0
  625. package/.output/server/database/migrations-pg/0042_serious_layla_miller.sql +5 -0
  626. package/.output/server/database/migrations-pg/0043_wonderful_mordo.sql +19 -0
  627. package/.output/server/database/migrations-pg/meta/0040_snapshot.json +4060 -0
  628. package/.output/server/database/migrations-pg/meta/0041_snapshot.json +4123 -0
  629. package/.output/server/database/migrations-pg/meta/0042_snapshot.json +4153 -0
  630. package/.output/server/database/migrations-pg/meta/0043_snapshot.json +4308 -0
  631. package/.output/server/database/migrations-pg/meta/_journal.json +28 -0
  632. package/.output/server/index.mjs +13 -1
  633. package/.output/server/index.mjs.map +1 -1
  634. package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
  635. package/.output/server/node_modules/fflate/package.json +128 -0
  636. package/.output/server/node_modules/highlight.js/es/languages/yaml.js +213 -0
  637. package/.output/server/node_modules/marked/lib/marked.esm.js +72 -0
  638. package/.output/server/node_modules/marked/package.json +103 -0
  639. package/.output/server/package.json +3 -1
  640. package/package.json +2 -2
  641. package/.output/public/_nuxt/9-wVZMur.js +0 -4
  642. package/.output/public/_nuxt/B-5GukRk.js +0 -1
  643. package/.output/public/_nuxt/B1G3GGhQ.js +0 -1
  644. package/.output/public/_nuxt/B1zMFx24.js +0 -1
  645. package/.output/public/_nuxt/B4jvLMfS.js +0 -1
  646. package/.output/public/_nuxt/BBnX5xw4.js +0 -2
  647. package/.output/public/_nuxt/BHpUiv6j.js +0 -3
  648. package/.output/public/_nuxt/BLOUs6AE.js +0 -5
  649. package/.output/public/_nuxt/BT6p4Pgt.js +0 -2
  650. package/.output/public/_nuxt/BUXSUkJ_.js +0 -1
  651. package/.output/public/_nuxt/BVf6Yx9V.js +0 -26
  652. package/.output/public/_nuxt/BbS6Bwby.js +0 -1
  653. package/.output/public/_nuxt/Bd3HqPMF.js +0 -1
  654. package/.output/public/_nuxt/BeKvLsja.js +0 -2
  655. package/.output/public/_nuxt/BeUm5UNV.js +0 -1
  656. package/.output/public/_nuxt/BfV444H3.js +0 -3
  657. package/.output/public/_nuxt/BjKamgHq.js +0 -1
  658. package/.output/public/_nuxt/BoJdjCVl.js +0 -4
  659. package/.output/public/_nuxt/BreO2PiA.js +0 -1
  660. package/.output/public/_nuxt/BvIDC_R-.js +0 -1
  661. package/.output/public/_nuxt/ByuJWADR.js +0 -34
  662. package/.output/public/_nuxt/C1dyLp_j.js +0 -1
  663. package/.output/public/_nuxt/CAUgpKsF.js +0 -2
  664. package/.output/public/_nuxt/CL9-VLTJ.js +0 -1
  665. package/.output/public/_nuxt/CazDIG_m.js +0 -1
  666. package/.output/public/_nuxt/CcXaak_K.js +0 -1
  667. package/.output/public/_nuxt/CdMuck_X.js +0 -1
  668. package/.output/public/_nuxt/CfPSts5n.js +0 -1
  669. package/.output/public/_nuxt/CfROFPse.js +0 -1
  670. package/.output/public/_nuxt/Cnapl7lZ.js +0 -1
  671. package/.output/public/_nuxt/CscWZxCi.js +0 -1
  672. package/.output/public/_nuxt/CuicKV-B.js +0 -34
  673. package/.output/public/_nuxt/Cyiu1VQD.js +0 -1
  674. package/.output/public/_nuxt/D6PUPmRC.js +0 -1
  675. package/.output/public/_nuxt/DCl2yo4g.js +0 -8
  676. package/.output/public/_nuxt/DHXWp5yD.js +0 -1
  677. package/.output/public/_nuxt/DHltYerF.js +0 -114
  678. package/.output/public/_nuxt/DLXydYJb.js +0 -47
  679. package/.output/public/_nuxt/DRPSi76A.js +0 -1
  680. package/.output/public/_nuxt/DS53kyHJ.js +0 -1
  681. package/.output/public/_nuxt/DWhBqv_7.js +0 -1
  682. package/.output/public/_nuxt/Dd0kK5WH.js +0 -1
  683. package/.output/public/_nuxt/Df7kUO0m.js +0 -1
  684. package/.output/public/_nuxt/Dga3Av-m.js +0 -1
  685. package/.output/public/_nuxt/DgwTpwfB.js +0 -1
  686. package/.output/public/_nuxt/DkI145a5.js +0 -1
  687. package/.output/public/_nuxt/DoFBTaDR.js +0 -1
  688. package/.output/public/_nuxt/Dr_dI5hB.js +0 -1
  689. package/.output/public/_nuxt/EPZOxdgq.js +0 -1
  690. package/.output/public/_nuxt/R1nNqTru.js +0 -1
  691. package/.output/public/_nuxt/S5DLdEpg.js +0 -4
  692. package/.output/public/_nuxt/builds/meta/7caf3cb3-d272-4dbd-bb3f-1eeb64fab5d1.json +0 -1
  693. package/.output/public/_nuxt/entry.ChQMshd4.css +0 -1
  694. package/.output/public/_nuxt/gCELhaU9.js +0 -1
  695. package/.output/public/_nuxt/ipDzNHcs.js +0 -5
  696. package/.output/public/_nuxt/kS3boz40.js +0 -1
  697. package/.output/public/_nuxt/qH_j2A3a.js +0 -1
  698. package/.output/public/_nuxt/r3SBLxtE.js +0 -1
  699. package/.output/public/_nuxt/rsiRgrVM.js +0 -1
  700. package/.output/public/_nuxt/swrbBdtB.js +0 -1
  701. package/.output/public/sw.js +0 -1
  702. package/.output/public/workbox-2fbc6a65.js +0 -1
  703. package/.output/server/chunks/build/Alert-Bp1Wz_sq.mjs.map +0 -1
  704. package/.output/server/chunks/build/Breadcrumb-C9ZPTLym.mjs.map +0 -1
  705. package/.output/server/chunks/build/BreadcrumbNav-C3y42Vun.mjs.map +0 -1
  706. package/.output/server/chunks/build/BrowserBadge-DNCp9pF-.mjs.map +0 -1
  707. package/.output/server/chunks/build/ChartCard-Fr557IbV.mjs.map +0 -1
  708. package/.output/server/chunks/build/Checkbox-cVOSIY93.mjs.map +0 -1
  709. package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.mjs +0 -640
  710. package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.mjs.map +0 -1
  711. package/.output/server/chunks/build/CodeBlock-BGwNmJ8J.mjs.map +0 -1
  712. package/.output/server/chunks/build/DashboardNavbar-Bdp-OwTN.mjs.map +0 -1
  713. package/.output/server/chunks/build/DashboardSidebarToggle-Ji6ADuqF.mjs.map +0 -1
  714. package/.output/server/chunks/build/DataLocationCard-D6xSOrme.mjs.map +0 -1
  715. package/.output/server/chunks/build/DiagnosisPanel-DV1xwGu4.mjs.map +0 -1
  716. package/.output/server/chunks/build/EmptyState-DV3oT_xz.mjs.map +0 -1
  717. package/.output/server/chunks/build/EntityLinks-DeOP13Kr.mjs.map +0 -1
  718. package/.output/server/chunks/build/EnvManagedBadge-Qpn58Nmr.mjs.map +0 -1
  719. package/.output/server/chunks/build/FormField-B-GSn_VR.mjs.map +0 -1
  720. package/.output/server/chunks/build/HelpHint-YEMWtKu1.mjs.map +0 -1
  721. package/.output/server/chunks/build/Label-DBvbHd3A.mjs.map +0 -1
  722. package/.output/server/chunks/build/MiniRunBars-C3HG-EYm.mjs.map +0 -1
  723. package/.output/server/chunks/build/Modal-CfA78Hm1.mjs.map +0 -1
  724. package/.output/server/chunks/build/PageStateCard-Bwee6JTk.mjs.map +0 -1
  725. package/.output/server/chunks/build/ProjectTestCasesTable-9Ia825h8.mjs.map +0 -1
  726. package/.output/server/chunks/build/RovingFocusItem-CxhHdNGo.mjs.map +0 -1
  727. package/.output/server/chunks/build/RunReports-BpJqLHY9.mjs.map +0 -1
  728. package/.output/server/chunks/build/RunStatusBadge-BhmJ_RKM.mjs.map +0 -1
  729. package/.output/server/chunks/build/SectionCard-COd9TuDq.mjs.map +0 -1
  730. package/.output/server/chunks/build/Select-ppPz926C.mjs.map +0 -1
  731. package/.output/server/chunks/build/Separator-CxZdx8kw.mjs.map +0 -1
  732. package/.output/server/chunks/build/SettingsField-DDD4oqys.mjs.map +0 -1
  733. package/.output/server/chunks/build/Slideover-B95Rj237.mjs.map +0 -1
  734. package/.output/server/chunks/build/Switch-xQQ3_ME1.mjs.map +0 -1
  735. package/.output/server/chunks/build/Table-CPhhVzDv.mjs.map +0 -1
  736. package/.output/server/chunks/build/Tabs-BV9XqjoO.mjs.map +0 -1
  737. package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs +0 -47
  738. package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs.map +0 -1
  739. package/.output/server/chunks/build/TestCaseHistoryChart-DMb-xSJa.mjs.map +0 -1
  740. package/.output/server/chunks/build/TestStatusBar-CEzt76wk.mjs.map +0 -1
  741. package/.output/server/chunks/build/Textarea-DrrqQUVG.mjs.map +0 -1
  742. package/.output/server/chunks/build/Tooltip-7vwuDPrZ.mjs.map +0 -1
  743. package/.output/server/chunks/build/VisuallyHiddenInput-C9eJVpPW.mjs.map +0 -1
  744. package/.output/server/chunks/build/_id_-B2yirIuA.mjs.map +0 -1
  745. package/.output/server/chunks/build/_id_-CE0Gso6i.mjs.map +0 -1
  746. package/.output/server/chunks/build/_id_-bWcP2xFl.mjs.map +0 -1
  747. package/.output/server/chunks/build/about-CoJjvUwM.mjs.map +0 -1
  748. package/.output/server/chunks/build/account-Cn-eZqXM.mjs.map +0 -1
  749. package/.output/server/chunks/build/analytics-B276WPeU.mjs.map +0 -1
  750. package/.output/server/chunks/build/db.client-aHcD0wyX.mjs.map +0 -1
  751. package/.output/server/chunks/build/default-BSzdkM_L.mjs.map +0 -1
  752. package/.output/server/chunks/build/edit-C9Z7oZeu.mjs.map +0 -1
  753. package/.output/server/chunks/build/fetch-8kznMtBM.mjs.map +0 -1
  754. package/.output/server/chunks/build/forgot-password-BqPF4Rxs.mjs.map +0 -1
  755. package/.output/server/chunks/build/help-content-DmFnuhNu.mjs.map +0 -1
  756. package/.output/server/chunks/build/index-BR9hw6qk.mjs.map +0 -1
  757. package/.output/server/chunks/build/index-Ba-Fifra.mjs.map +0 -1
  758. package/.output/server/chunks/build/index-CULN3-en.mjs.map +0 -1
  759. package/.output/server/chunks/build/index-DVUtBexc.mjs.map +0 -1
  760. package/.output/server/chunks/build/isValueEqualOrExist-DBZjbD_3.mjs.map +0 -1
  761. package/.output/server/chunks/build/login-D2XZDuek.mjs.map +0 -1
  762. package/.output/server/chunks/build/mcp-_o6cMS6m.mjs.map +0 -1
  763. package/.output/server/chunks/build/notifications-Dzm9c0u_.mjs.map +0 -1
  764. package/.output/server/chunks/build/reset-password-gpFzIEDj.mjs.map +0 -1
  765. package/.output/server/chunks/build/settings-metadata-B0wo5R-W.mjs.map +0 -1
  766. package/.output/server/chunks/build/settings-pNyPBXVa.mjs.map +0 -1
  767. package/.output/server/chunks/build/storage-XelzuyPy.mjs.map +0 -1
  768. package/.output/server/chunks/build/tags-DrCQ7QSw.mjs.map +0 -1
  769. package/.output/server/chunks/build/test-cases-pmOxi-AN.mjs.map +0 -1
  770. package/.output/server/chunks/build/timeout-hygiene-CNs71Iah.mjs.map +0 -1
  771. package/.output/server/chunks/build/useAiStatus-ZO987RY7.mjs.map +0 -1
  772. package/.output/server/chunks/build/useCopy-BQQKcwlq.mjs.map +0 -1
  773. package/.output/server/chunks/build/useFormControl-BLpq1s4O.mjs.map +0 -1
  774. package/.output/server/chunks/build/useOpenInIde-kMZ7Jw5c.mjs.map +0 -1
  775. package/.output/server/chunks/build/useSettingsNav-NjI2seBy.mjs.map +0 -1
  776. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +0 -7
  777. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +0 -1
  778. package/.output/server/chunks/build/useTreeViewCookie-DVYpxW-p.mjs.map +0 -1
  779. package/.output/server/chunks/build/users-NmAUZs3i.mjs.map +0 -1
  780. package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs +0 -940
  781. package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs.map +0 -1
  782. package/.output/server/chunks/build/wasted-time-CguAF9zc.mjs.map +0 -1
  783. /package/.output/public/_nuxt/{PageStateCard.BrM5HWjY.css → useCopyRich.BrM5HWjY.css} +0 -0
@@ -1,41 +1,44 @@
1
- import { _ as _sfc_main$1$1, a as _sfc_main$f } from './DashboardNavbar-Bdp-OwTN.mjs';
2
- import { _ as _sfc_main$1$2 } from './Breadcrumb-C9ZPTLym.mjs';
3
- import { _ as __nuxt_component_3$1 } from './BreadcrumbNav-C3y42Vun.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, p as __nuxt_component_12$1, o as _sfc_main$p, w as __nuxt_component_7, _ as _sfc_main$d$1, q as _sfc_main$8$1, G as _sfc_main$j$1 } from './server.mjs';
5
- import { _ as _sfc_main$g } from './Tooltip-7vwuDPrZ.mjs';
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-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_12$2, b as __nuxt_component_13$3, d as __nuxt_component_14$1 } from './CiEnvCard-DXPOhdSG.mjs';
8
- import { a as useDetailGrid, _ as __nuxt_component_0$1 } from './useAiStatus-ZO987RY7.mjs';
9
- import { _ as __nuxt_component_13$2 } from './TestStatusBar-CEzt76wk.mjs';
10
- import { _ as _sfc_main$l } from './Card-BQP_oZkQ.mjs';
11
- import { _ as __nuxt_component_2$1 } from './HelpHint-YEMWtKu1.mjs';
7
+ import { _ as __nuxt_component_8, b as __nuxt_component_1$2, a as __nuxt_component_13$2, d as __nuxt_component_14$3, c as __nuxt_component_15$1, e as __nuxt_component_16$1 } from './CiEnvCard-DB5DvBh1.mjs';
8
+ import { u as useDetailGrid, _ as __nuxt_component_0$1 } from './useAiStatus-CxjMmDDY.mjs';
9
+ import { _ as __nuxt_component_14$2 } from './TestStatusBar-DX3EhlyP.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';
12
13
  import { _ as __nuxt_component_5 } from './MarkerBadge-D7meXy4u.mjs';
13
- import { _ as __nuxt_component_16$1 } from './EntityLinks-DeOP13Kr.mjs';
14
- import { a as formatDuration, p as prettyDateFormat, j as getStatusColor, f as formatRelativeTime, d as copyPreview, h as clusterStatusColor, g as clusterErrorTypeColor, q as formatBytes, x as reportIcon, o as getFileApiPath, u as createSortHeader, b as formatStatusLabel } from './index-CULN3-en.mjs';
14
+ import { _ as __nuxt_component_18$1 } from './EntityLinks-BBHWssHH.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 { aa as formatBytes, bM as DEFAULT_WASTED_WAIT_PATTERNS, dH as isWastedWait } from '../nitro/nitro.mjs';
15
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';
16
18
  import { ssrRenderComponent, ssrInterpolate, ssrRenderAttrs, ssrRenderClass, ssrRenderList, ssrRenderStyle, ssrRenderAttr, ssrRenderTeleport, ssrIncludeBooleanAttr } from 'vue/server-renderer';
17
- import { b as buildRetryCommand } from './useOpenInIde-kMZ7Jw5c.mjs';
18
- import { u as useCopy } from './useCopy-BQQKcwlq.mjs';
19
- import { _ as __nuxt_component_4$1 } from './FilterToolbar-BwXy8xSk.mjs';
20
- import { _ as _sfc_main$n } from './Select-ppPz926C.mjs';
21
- import { _ as _sfc_main$o } from './Checkbox-cVOSIY93.mjs';
22
- import { _ as __nuxt_component_1$3 } from './OpenInIdeLink-B92wosXu.mjs';
23
- import { u as useTreeViewCookie } from './useTreeViewCookie-DVYpxW-p.mjs';
19
+ import { b as buildRetryCommand } from './useOpenInIde-BbTnPhFA.mjs';
20
+ import { u as useCopy } from './useCopy-CeKWgHyT.mjs';
21
+ import { _ as __nuxt_component_4$2 } from './FilterToolbar-BwXy8xSk.mjs';
22
+ import { _ as _sfc_main$o } from './Select-5DK9frQ7.mjs';
23
+ import { _ as _sfc_main$q } from './Checkbox-4Q5d0fa0.mjs';
24
+ import { _ as __nuxt_component_1$3 } from './OpenInIdeLink-CQWKKChd.mjs';
25
+ import { _ as __nuxt_component_2$3 } from './TestMetaBadges-D5_yUtIP.mjs';
26
+ import { _ as __nuxt_component_3$3 } from './BrowserBadge-MFvBwxmD.mjs';
27
+ import { u as useTreeViewCookie } from './useTreeViewCookie-CQjQdTkH.mjs';
24
28
  import { _ as __nuxt_component_5$1 } from './ErrorState-CktYyeEZ.mjs';
25
29
  import { _ as __nuxt_component_1$1 } from './LoadingState-C3pBSuOO.mjs';
26
- import { _ as __nuxt_component_8$1 } from './EmptyState-DV3oT_xz.mjs';
27
- import { _ as __nuxt_component_11 } from './SectionCard-COd9TuDq.mjs';
30
+ import { _ as __nuxt_component_4$1 } from './EmptyState-DC2q_7TD.mjs';
31
+ import { _ as __nuxt_component_11 } from './SectionCard-CN-v0FZ_.mjs';
28
32
  import { _ as __nuxt_component_3$2 } from './TableScroller-DMcdCVrH.mjs';
29
- import { _ as _sfc_main$h } from './Table-CPhhVzDv.mjs';
30
- import { _ as _sfc_main$m } from './Modal-CfA78Hm1.mjs';
31
- import { _ as __nuxt_component_0$2 } from './DiagnosisPanel-DV1xwGu4.mjs';
32
- import { u as useFetch } from './fetch-8kznMtBM.mjs';
33
- import { bm as DEFAULT_WASTED_WAIT_PATTERNS, de as isWastedWait } from '../nitro/nitro.mjs';
34
- import { _ as _sfc_main$i } from './SelectMenu-799c_Ils.mjs';
35
- import { _ as __nuxt_component_13$1 } from './RunStatusBadge-BhmJ_RKM.mjs';
36
- import { _ as _sfc_main$j } from './Alert-Bp1Wz_sq.mjs';
33
+ import { _ as _sfc_main$i } from './Table-BRk04Hd2.mjs';
34
+ import { _ as _sfc_main$n } from './Modal-pSDlXzT3.mjs';
35
+ import { _ as __nuxt_component_0$2 } from './DiagnosisPanel-CALyEmcJ.mjs';
36
+ import { u as useFetch } from './fetch-B4FwBOzu.mjs';
37
+ import { _ as _sfc_main$j } from './SelectMenu-D-2FSqBU.mjs';
38
+ import { _ as __nuxt_component_13$1 } from './RunStatusBadge-FfGb6bkW.mjs';
39
+ import { _ as _sfc_main$l } from './Alert-C4xq8lao.mjs';
37
40
  import { u as useRunComparison } from './useRunComparison-CiMBLpe2.mjs';
38
- import './DashboardSidebarToggle-Ji6ADuqF.mjs';
41
+ import './DashboardSidebarToggle-DCTnHiIv.mjs';
39
42
  import 'vue-router';
40
43
  import '@iconify/vue';
41
44
  import 'tailwindcss/colors';
@@ -56,6 +59,18 @@ import 'path';
56
59
  import 'fs/promises';
57
60
  import 'zlib';
58
61
  import 'util';
62
+ import 'marked';
63
+ import 'highlight.js/lib/core';
64
+ import 'highlight.js/lib/languages/bash';
65
+ import 'highlight.js/lib/languages/css';
66
+ import 'highlight.js/lib/languages/diff';
67
+ import 'highlight.js/lib/languages/javascript';
68
+ import 'highlight.js/lib/languages/json';
69
+ import 'highlight.js/lib/languages/python';
70
+ import 'highlight.js/lib/languages/typescript';
71
+ import 'highlight.js/lib/languages/xml';
72
+ import 'highlight.js/lib/languages/yaml';
73
+ import 'fflate';
59
74
  import 'pixelmatch';
60
75
  import 'sharp';
61
76
  import '@anthropic-ai/sdk';
@@ -79,36 +94,28 @@ import 'node:zlib';
79
94
  import 'consola';
80
95
  import 'node:url';
81
96
  import '@iconify/utils';
82
- import './Tabs-BV9XqjoO.mjs';
83
- import './RovingFocusItem-CxhHdNGo.mjs';
84
- import './BrowserBadge-DNCp9pF-.mjs';
85
- import 'highlight.js/lib/core';
86
- import 'highlight.js/lib/languages/javascript';
87
- import 'highlight.js/lib/languages/typescript';
88
- import 'highlight.js/lib/languages/python';
89
- import 'highlight.js/lib/languages/bash';
90
- import 'highlight.js/lib/languages/json';
91
- import 'highlight.js/lib/languages/css';
92
- import 'highlight.js/lib/languages/xml';
93
- import 'highlight.js/lib/languages/diff';
94
- import './CodeBlock-BGwNmJ8J.mjs';
95
- import './Textarea-DrrqQUVG.mjs';
96
- import './help-content-DmFnuhNu.mjs';
97
+ import './FormField-B0HKsdMd.mjs';
98
+ import './Label-DYDR1Oeh.mjs';
99
+ import './Switch-B5Fp8ULt.mjs';
100
+ import './useFormControl-CZ9So7iX.mjs';
101
+ import './useForwardScopeId-D0ameaSU.mjs';
102
+ import './VisuallyHiddenInput-BHvzNumK.mjs';
103
+ import './CodeBlock-BgE-NSmE.mjs';
104
+ import './useTauri-Kf3HE_42.mjs';
105
+ import './Tabs-BkSOnbaB.mjs';
106
+ import './RovingFocusItem--OEHI2P3.mjs';
107
+ import './Textarea-Dv2-lOvW.mjs';
108
+ import './help-content-C876a9WD.mjs';
97
109
  import '../_/marker-categories.mjs';
98
110
  import 'date-fns';
99
- import './useFormControl-BLpq1s4O.mjs';
100
111
  import './handleAndDispatchCustomEvent-Bk_AVSSo.mjs';
101
- import './isValueEqualOrExist-DBZjbD_3.mjs';
102
- import './useForwardScopeId-D0ameaSU.mjs';
103
- import './VisuallyHiddenInput-C9eJVpPW.mjs';
104
- import './Label-DBvbHd3A.mjs';
105
- import './Separator-CxZdx8kw.mjs';
112
+ import './isValueEqualOrExist-D2qw9YEr.mjs';
113
+ import './Separator-CR4WcEKD.mjs';
106
114
  import '@tanstack/vue-table';
107
115
  import '@tanstack/vue-virtual';
108
116
  import '@vue/shared';
109
- import './virtualizer-ZaqK4guJ.mjs';
110
117
 
111
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
118
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
112
119
  __name: "RunSummary",
113
120
  __ssrInlineRender: true,
114
121
  props: {
@@ -125,6 +132,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
125
132
  const props = __props;
126
133
  const emit = __emit;
127
134
  const toast = useToast();
135
+ const config = useRuntimeConfig();
128
136
  const storageStats = computed(() => props.testRun?.storageStats);
129
137
  const showCiEnv = computed(
130
138
  () => !!(props.testRun?.metadata?.ci || props.testRun?.environment || props.testRun?.playwrightVersion || props.testRun?.reporterVersion)
@@ -234,19 +242,21 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
234
242
  const _component_StatusBlock = __nuxt_component_1$2;
235
243
  const _component_UIcon = _sfc_main$p;
236
244
  const _component_UBadge = _sfc_main$7$1;
237
- const _component_TestStatusBar = __nuxt_component_13$2;
238
- const _component_UCard = _sfc_main$l;
239
- const _component_HelpHint = __nuxt_component_2$1;
240
- const _component_UTooltip = _sfc_main$g;
245
+ const _component_TestStatusBar = __nuxt_component_14$2;
246
+ const _component_DurationValue = __nuxt_component_14$1;
247
+ const _component_UCard = _sfc_main$m;
248
+ const _component_HelpHint = __nuxt_component_2$2;
249
+ const _component_UTooltip = _sfc_main$h;
241
250
  const _component_NuxtLink = __nuxt_component_12$1;
242
251
  const _component_MarkerBadge = __nuxt_component_5;
243
252
  const _component_UButton = _sfc_main$k;
244
253
  const _component_UPopover = _sfc_main$8$1;
245
- const _component_CiEnvCard = __nuxt_component_12$2;
246
- const _component_SourceInfoCard = __nuxt_component_13$3;
247
- const _component_BlockCard = __nuxt_component_14$1;
254
+ const _component_DesktopRunLocallyButton = __nuxt_component_13$2;
255
+ const _component_CiEnvCard = __nuxt_component_14$3;
256
+ const _component_SourceInfoCard = __nuxt_component_15$1;
257
+ const _component_BlockCard = __nuxt_component_16$1;
248
258
  const _component_UProgress = _sfc_main$j$1;
249
- const _component_EntityLinks = __nuxt_component_16$1;
259
+ const _component_EntityLinks = __nuxt_component_18$1;
250
260
  _push(ssrRenderComponent(_component_FoldableSummary, mergeProps({ "storage-key": "test-run" }, _attrs), {
251
261
  folded: withCtx((_, _push2, _parent2, _scopeId) => {
252
262
  if (_push2) {
@@ -257,11 +267,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
257
267
  }, null, _parent2, _scopeId));
258
268
  _push2(`<span class="text-sm font-semibold truncate flex items-center gap-1"${_scopeId}> Run #${ssrInterpolate(__props.testRun?.id)} `);
259
269
  if (unref(editingLabel)) {
260
- _push2(`<!--[--><input${ssrRenderAttr("value", unref(labelInput))} type="text" placeholder="Add a label..." class="inline-block w-40 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId}>`);
270
+ _push2(`<!--[--><input${ssrRenderAttr("value", unref(labelInput))} type="text" placeholder="Add a label..." class="inline-block w-40 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId}>`);
261
271
  if (unref(savingLabel)) {
262
272
  _push2(ssrRenderComponent(_component_UIcon, {
263
273
  name: "i-lucide-loader-circle",
264
- class: "size-3.5 text-gray-400 animate-spin shrink-0"
274
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
265
275
  }, null, _parent2, _scopeId));
266
276
  } else {
267
277
  _push2(`<!---->`);
@@ -270,9 +280,9 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
270
280
  } else {
271
281
  _push2(`<!--[-->`);
272
282
  if (__props.testRun?.label) {
273
- _push2(`<span class="font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400"${_scopeId}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
283
+ _push2(`<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"${_scopeId}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
274
284
  } else {
275
- _push2(`<button class="text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1" title="Add a label"${_scopeId}> + label </button>`);
285
+ _push2(`<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" title="Add a label"${_scopeId}> + label </button>`);
276
286
  }
277
287
  _push2(`<!--]-->`);
278
288
  }
@@ -307,7 +317,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
307
317
  } else {
308
318
  _push2(`<!---->`);
309
319
  }
310
- _push2(`</div><div class="flex items-center gap-3 shrink-0 max-sm:hidden"${_scopeId}><span class="text-xs text-gray-500 tabular-nums whitespace-nowrap"${_scopeId}> T: <strong class="text-gray-700 dark:text-gray-300"${_scopeId}>${ssrInterpolate(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0)}</strong></span><span class="text-xs text-green-600 dark:text-green-400 tabular-nums whitespace-nowrap"${_scopeId}> P: <strong${_scopeId}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</strong></span><span class="text-xs text-red-600 dark:text-red-400 tabular-nums whitespace-nowrap"${_scopeId}> F: <strong${_scopeId}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</strong></span><span class="text-xs text-gray-500 tabular-nums whitespace-nowrap"${_scopeId}> S: <strong${_scopeId}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</strong></span><span class="text-xs text-amber-600 dark:text-amber-400 tabular-nums whitespace-nowrap" title="Tests that never ran (maxFailures cutoff or a serial-group failure)"${_scopeId}> DNR: <strong${_scopeId}>${ssrInterpolate(__props.testRun?.didNotRunTests ?? 0)}</strong></span><span class="text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"${_scopeId}> Fl: <strong${_scopeId}>${ssrInterpolate(__props.testRun?.flakyTests ?? 0)}</strong></span>`);
320
+ _push2(`</div><div class="flex items-center gap-3 shrink-0 max-sm:hidden"${_scopeId}><span class="text-xs text-zinc-500 tabular-nums whitespace-nowrap"${_scopeId}> T: <strong class="text-zinc-700 dark:text-zinc-300"${_scopeId}>${ssrInterpolate(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0)}</strong></span><span class="text-xs text-emerald-600 dark:text-emerald-400 tabular-nums whitespace-nowrap"${_scopeId}> P: <strong${_scopeId}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</strong></span><span class="text-xs text-rose-600 dark:text-rose-400 tabular-nums whitespace-nowrap"${_scopeId}> F: <strong${_scopeId}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</strong></span><span class="text-xs text-zinc-500 tabular-nums whitespace-nowrap"${_scopeId}> S: <strong${_scopeId}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</strong></span><span class="text-xs text-amber-600 dark:text-amber-400 tabular-nums whitespace-nowrap" title="Tests that never ran (maxFailures cutoff or a serial-group failure)"${_scopeId}> DNR: <strong${_scopeId}>${ssrInterpolate(__props.testRun?.didNotRunTests ?? 0)}</strong></span><span class="text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"${_scopeId}> Fl: <strong${_scopeId}>${ssrInterpolate(__props.testRun?.flakyTests ?? 0)}</strong></span>`);
311
321
  _push2(ssrRenderComponent(_component_TestStatusBar, {
312
322
  passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
313
323
  failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
@@ -316,7 +326,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
316
326
  "did-not-run": __props.testRun?.didNotRunTests ?? 0,
317
327
  total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
318
328
  }, null, _parent2, _scopeId));
319
- _push2(`<span class="text-xs text-gray-400 tabular-nums whitespace-nowrap"${_scopeId}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun?.duration))}</span></div></div>`);
329
+ _push2(ssrRenderComponent(_component_DurationValue, {
330
+ ms: __props.testRun?.duration,
331
+ class: "text-xs text-zinc-400"
332
+ }, null, _parent2, _scopeId));
333
+ _push2(`</div></div>`);
320
334
  } else {
321
335
  return [
322
336
  createVNode("div", { class: "flex items-center gap-3 flex-1 min-w-0 justify-between" }, [
@@ -334,7 +348,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
334
348
  "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
335
349
  type: "text",
336
350
  placeholder: "Add a label...",
337
- class: "inline-block w-40 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
351
+ class: "inline-block w-40 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
338
352
  onKeydown: onLabelKeydown,
339
353
  onBlur: saveLabel
340
354
  }, null, 40, ["onUpdate:modelValue"]), [
@@ -343,16 +357,16 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
343
357
  unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
344
358
  key: 0,
345
359
  name: "i-lucide-loader-circle",
346
- class: "size-3.5 text-gray-400 animate-spin shrink-0"
360
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
347
361
  })) : createCommentVNode("", true)
348
362
  ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
349
363
  __props.testRun?.label ? (openBlock(), createBlock("span", {
350
364
  key: 0,
351
- class: "font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",
365
+ 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",
352
366
  onClick: startEditLabel
353
367
  }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
354
368
  key: 1,
355
- class: "text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1",
369
+ 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",
356
370
  title: "Add a label",
357
371
  onClick: startEditLabel
358
372
  }, " + label "))
@@ -377,19 +391,19 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
377
391
  }, 8, ["title"])) : createCommentVNode("", true)
378
392
  ]),
379
393
  createVNode("div", { class: "flex items-center gap-3 shrink-0 max-sm:hidden" }, [
380
- createVNode("span", { class: "text-xs text-gray-500 tabular-nums whitespace-nowrap" }, [
394
+ createVNode("span", { class: "text-xs text-zinc-500 tabular-nums whitespace-nowrap" }, [
381
395
  createTextVNode(" T: "),
382
- createVNode("strong", { class: "text-gray-700 dark:text-gray-300" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
396
+ createVNode("strong", { class: "text-zinc-700 dark:text-zinc-300" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
383
397
  ]),
384
- createVNode("span", { class: "text-xs text-green-600 dark:text-green-400 tabular-nums whitespace-nowrap" }, [
398
+ createVNode("span", { class: "text-xs text-emerald-600 dark:text-emerald-400 tabular-nums whitespace-nowrap" }, [
385
399
  createTextVNode(" P: "),
386
400
  createVNode("strong", null, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
387
401
  ]),
388
- createVNode("span", { class: "text-xs text-red-600 dark:text-red-400 tabular-nums whitespace-nowrap" }, [
402
+ createVNode("span", { class: "text-xs text-rose-600 dark:text-rose-400 tabular-nums whitespace-nowrap" }, [
389
403
  createTextVNode(" F: "),
390
404
  createVNode("strong", null, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
391
405
  ]),
392
- createVNode("span", { class: "text-xs text-gray-500 tabular-nums whitespace-nowrap" }, [
406
+ createVNode("span", { class: "text-xs text-zinc-500 tabular-nums whitespace-nowrap" }, [
393
407
  createTextVNode(" S: "),
394
408
  createVNode("strong", null, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
395
409
  ]),
@@ -412,7 +426,10 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
412
426
  "did-not-run": __props.testRun?.didNotRunTests ?? 0,
413
427
  total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
414
428
  }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"]),
415
- createVNode("span", { class: "text-xs text-gray-400 tabular-nums whitespace-nowrap" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun?.duration)), 1)
429
+ createVNode(_component_DurationValue, {
430
+ ms: __props.testRun?.duration,
431
+ class: "text-xs text-zinc-400"
432
+ }, null, 8, ["ms"])
416
433
  ])
417
434
  ])
418
435
  ];
@@ -431,11 +448,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
431
448
  }, null, _parent3, _scopeId2));
432
449
  _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)} `);
433
450
  if (unref(editingLabel)) {
434
- _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-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId2}>`);
451
+ _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}>`);
435
452
  if (unref(savingLabel)) {
436
453
  _push3(ssrRenderComponent(_component_UIcon, {
437
454
  name: "i-lucide-loader-circle",
438
- class: "size-3.5 text-gray-400 animate-spin shrink-0"
455
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
439
456
  }, null, _parent3, _scopeId2));
440
457
  } else {
441
458
  _push3(`<!---->`);
@@ -444,9 +461,9 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
444
461
  } else {
445
462
  _push3(`<!--[-->`);
446
463
  if (__props.testRun?.label) {
447
- _push3(`<span class="font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400"${_scopeId2}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
464
+ _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>`);
448
465
  } else {
449
- _push3(`<button class="text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1.5" title="Add a label"${_scopeId2}> + label </button>`);
466
+ _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>`);
450
467
  }
451
468
  _push3(`<!--]-->`);
452
469
  }
@@ -534,7 +551,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
534
551
  } else {
535
552
  _push3(`<!---->`);
536
553
  }
537
- _push3(`<span class="text-xs text-gray-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>`);
554
+ _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>`);
538
555
  _push3(ssrRenderComponent(_component_UTooltip, {
539
556
  text: unref(copied) ? "Copied!" : "Copy run summary"
540
557
  }, {
@@ -545,7 +562,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
545
562
  variant: "ghost",
546
563
  color: "neutral",
547
564
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
548
- class: "shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",
565
+ class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
549
566
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
550
567
  }, null, _parent4, _scopeId3));
551
568
  } else {
@@ -555,7 +572,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
555
572
  variant: "ghost",
556
573
  color: "neutral",
557
574
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
558
- class: "shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",
575
+ class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
559
576
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
560
577
  }, null, 8, ["icon", "onClick"])
561
578
  ];
@@ -567,19 +584,19 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
567
584
  _push3(ssrRenderComponent(_component_UPopover, null, {
568
585
  content: withCtx((_3, _push4, _parent4, _scopeId3) => {
569
586
  if (_push4) {
570
- _push4(`<div class="p-2 space-y-1 min-w-32"${_scopeId3}><p class="text-xs font-medium text-gray-500 px-2 py-1"${_scopeId3}>Mode</p><!--[-->`);
587
+ _push4(`<div class="p-2 space-y-1 min-w-32"${_scopeId3}><p class="text-xs font-medium text-zinc-500 px-2 py-1"${_scopeId3}>Mode</p><!--[-->`);
571
588
  ssrRenderList(["file-line", "grep", "file"], (m) => {
572
- _push4(`<button class="${ssrRenderClass([unref(retryMode) === m ? "bg-primary/10 text-primary" : "", "w-full text-left px-2 py-1 text-sm rounded hover:bg-gray-100 dark:hover:bg-gray-800"])}"${_scopeId3}>${ssrInterpolate(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only")}</button>`);
589
+ _push4(`<button class="${ssrRenderClass([unref(retryMode) === m ? "bg-primary/10 text-primary" : "", "w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800"])}"${_scopeId3}>${ssrInterpolate(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only")}</button>`);
573
590
  });
574
591
  _push4(`<!--]--></div>`);
575
592
  } else {
576
593
  return [
577
594
  createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
578
- createVNode("p", { class: "text-xs font-medium text-gray-500 px-2 py-1" }, "Mode"),
595
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
579
596
  (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
580
597
  return createVNode("button", {
581
598
  key: m,
582
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-gray-100 dark:hover:bg-gray-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
599
+ 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" : ""],
583
600
  onClick: ($event) => retryMode.value = m
584
601
  }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
585
602
  }), 64))
@@ -631,13 +648,22 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
631
648
  } else {
632
649
  _push3(`<!---->`);
633
650
  }
651
+ if (unref(failedCases).length > 0) {
652
+ _push3(ssrRenderComponent(_component_DesktopRunLocallyButton, {
653
+ "project-id": __props.testRun?.project?.id,
654
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
655
+ cases: unref(failedCases)
656
+ }, null, _parent3, _scopeId2));
657
+ } else {
658
+ _push3(`<!---->`);
659
+ }
634
660
  _push3(`</div></div></div></div><div class="grid grid-cols-3 sm:grid-cols-5 gap-2"${_scopeId2}><button class="${ssrRenderClass([
635
- __props.activeFilter === "all" ? "bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500" : "bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800",
661
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
636
662
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
637
- ])}"${_scopeId2}><p class="text-xs font-medium text-gray-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([
638
- __props.activeFilter === "passed" ? "bg-green-100 dark:bg-green-900/30 ring-2 ring-green-400 dark:ring-green-600" : "bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30",
663
+ ])}"${_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([
664
+ __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",
639
665
  "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer"
640
- ])}"${_scopeId2}><p class="text-xs font-medium text-green-700 dark:text-green-400 uppercase tracking-wider"${_scopeId2}>Passed</p><p class="text-xl font-bold mt-0.5 text-green-600 dark:text-green-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</p></button>`);
666
+ ])}"${_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>`);
641
667
  if ((__props.testRun?.flakyTests ?? 0) > 0) {
642
668
  _push3(`<button class="${ssrRenderClass([
643
669
  __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",
@@ -652,12 +678,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
652
678
  _push3(`<!---->`);
653
679
  }
654
680
  _push3(`</div><button class="${ssrRenderClass([
655
- __props.activeFilter === "failed" ? "bg-red-100 dark:bg-red-900/30 ring-2 ring-red-400 dark:ring-red-600" : "bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30",
681
+ __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",
656
682
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
657
- ])}"${_scopeId2}><p class="text-xs font-medium text-red-700 dark:text-red-400 uppercase tracking-wider"${_scopeId2}>Failed</p><p class="text-xl font-bold mt-0.5 text-red-600 dark:text-red-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</p></button><button class="${ssrRenderClass([
658
- __props.activeFilter === "skipped" ? "bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500" : "bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800",
683
+ ])}"${_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([
684
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
659
685
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
660
- ])}"${_scopeId2}><p class="text-xs font-medium text-gray-500 uppercase tracking-wider"${_scopeId2}>Skipped</p><p class="text-xl font-bold mt-0.5 text-gray-600 dark:text-gray-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</p></button><button class="${ssrRenderClass([
686
+ ])}"${_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([
661
687
  __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",
662
688
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
663
689
  ])}" 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}>`);
@@ -674,16 +700,25 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
674
700
  _push3(`</div><div class="flex items-center gap-3 text-xs shrink-0"${_scopeId2}><div class="flex items-center gap-1"${_scopeId2}>`);
675
701
  _push3(ssrRenderComponent(_component_UIcon, {
676
702
  name: "i-lucide-clock",
677
- class: "size-3.5 text-gray-400"
703
+ class: "size-3.5 text-zinc-400"
704
+ }, null, _parent3, _scopeId2));
705
+ _push3(ssrRenderComponent(_component_DurationValue, {
706
+ ms: __props.testRun?.duration,
707
+ class: "font-medium"
678
708
  }, null, _parent3, _scopeId2));
679
- _push3(`<span class="font-medium tabular-nums"${_scopeId2}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun?.duration))}</span></div>`);
709
+ _push3(`</div>`);
680
710
  if (__props.testRun?.avgTestDuration) {
681
711
  _push3(`<div class="flex items-center gap-1"${_scopeId2}>`);
682
712
  _push3(ssrRenderComponent(_component_UIcon, {
683
713
  name: "i-lucide-gauge",
684
- class: "size-3.5 text-gray-400"
714
+ class: "size-3.5 text-zinc-400"
715
+ }, null, _parent3, _scopeId2));
716
+ _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>Avg</span>`);
717
+ _push3(ssrRenderComponent(_component_DurationValue, {
718
+ ms: __props.testRun.avgTestDuration,
719
+ class: "font-medium"
685
720
  }, null, _parent3, _scopeId2));
686
- _push3(`<span class="text-gray-500 hidden sm:inline"${_scopeId2}>Avg</span><span class="font-medium tabular-nums"${_scopeId2}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun.avgTestDuration))}</span></div>`);
721
+ _push3(`</div>`);
687
722
  } else {
688
723
  _push3(`<!---->`);
689
724
  }
@@ -693,7 +728,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
693
728
  name: "i-lucide-arrow-up-right",
694
729
  class: "size-3.5 text-orange-500"
695
730
  }, null, _parent3, _scopeId2));
696
- _push3(`<span class="text-gray-500 hidden sm:inline"${_scopeId2}>P90</span><span class="font-medium tabular-nums text-orange-600 dark:text-orange-400"${_scopeId2}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun.p90TestDuration))}</span></div>`);
731
+ _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>P90</span>`);
732
+ _push3(ssrRenderComponent(_component_DurationValue, {
733
+ ms: __props.testRun.p90TestDuration,
734
+ class: "font-medium text-orange-600 dark:text-orange-400",
735
+ "unit-class": "opacity-60"
736
+ }, null, _parent3, _scopeId2));
737
+ _push3(`</div>`);
697
738
  } else {
698
739
  _push3(`<!---->`);
699
740
  }
@@ -703,7 +744,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
703
744
  name: "i-lucide-clock",
704
745
  class: "size-3.5 text-amber-500"
705
746
  }, null, _parent3, _scopeId2));
706
- _push3(`<span class="text-gray-500 hidden sm:inline"${_scopeId2}>Wasted</span><span class="font-medium tabular-nums text-amber-600 dark:text-amber-400"${_scopeId2}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.totalWastedTime))}</span></div>`);
747
+ _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>Wasted</span>`);
748
+ _push3(ssrRenderComponent(_component_DurationValue, {
749
+ ms: __props.totalWastedTime,
750
+ class: "font-medium text-amber-600 dark:text-amber-400",
751
+ "unit-class": "opacity-60"
752
+ }, null, _parent3, _scopeId2));
753
+ _push3(`</div>`);
707
754
  } else {
708
755
  _push3(`<!---->`);
709
756
  }
@@ -732,7 +779,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
732
779
  "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
733
780
  type: "text",
734
781
  placeholder: "Add a label...",
735
- class: "inline-block w-48 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
782
+ 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",
736
783
  onKeydown: onLabelKeydown,
737
784
  onBlur: saveLabel
738
785
  }, null, 40, ["onUpdate:modelValue"]), [
@@ -741,16 +788,16 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
741
788
  unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
742
789
  key: 0,
743
790
  name: "i-lucide-loader-circle",
744
- class: "size-3.5 text-gray-400 animate-spin shrink-0"
791
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
745
792
  })) : createCommentVNode("", true)
746
793
  ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
747
794
  __props.testRun?.label ? (openBlock(), createBlock("span", {
748
795
  key: 0,
749
- class: "font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",
796
+ 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",
750
797
  onClick: startEditLabel
751
798
  }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
752
799
  key: 1,
753
- class: "text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1.5",
800
+ 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",
754
801
  title: "Add a label",
755
802
  onClick: startEditLabel
756
803
  }, " + label "))
@@ -795,7 +842,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
795
842
  ]),
796
843
  _: 1
797
844
  }, 8, ["text"])) : createCommentVNode("", true),
798
- createVNode("span", { class: "text-xs text-gray-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),
845
+ 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),
799
846
  createVNode(_component_UTooltip, {
800
847
  text: unref(copied) ? "Copied!" : "Copy run summary"
801
848
  }, {
@@ -805,7 +852,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
805
852
  variant: "ghost",
806
853
  color: "neutral",
807
854
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
808
- class: "shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",
855
+ class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
809
856
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
810
857
  }, null, 8, ["icon", "onClick"])
811
858
  ]),
@@ -814,11 +861,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
814
861
  unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 2 }, {
815
862
  content: withCtx(() => [
816
863
  createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
817
- createVNode("p", { class: "text-xs font-medium text-gray-500 px-2 py-1" }, "Mode"),
864
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
818
865
  (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
819
866
  return createVNode("button", {
820
867
  key: m,
821
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-gray-100 dark:hover:bg-gray-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
868
+ 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" : ""],
822
869
  onClick: ($event) => retryMode.value = m
823
870
  }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
824
871
  }), 64))
@@ -840,7 +887,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
840
887
  }, 8, ["icon", "title", "onClick"])
841
888
  ]),
842
889
  _: 1
843
- })) : createCommentVNode("", true)
890
+ })) : createCommentVNode("", true),
891
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
892
+ key: 3,
893
+ "project-id": __props.testRun?.project?.id,
894
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
895
+ cases: unref(failedCases)
896
+ }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true)
844
897
  ])
845
898
  ])
846
899
  ])
@@ -849,23 +902,23 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
849
902
  createVNode("button", {
850
903
  class: [
851
904
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
852
- __props.activeFilter === "all" ? "bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500" : "bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"
905
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
853
906
  ],
854
907
  onClick: ($event) => emit("filter-status", "all")
855
908
  }, [
856
- createVNode("p", { class: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "Total"),
909
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
857
910
  createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
858
911
  ], 10, ["onClick"]),
859
912
  createVNode("div", { class: "relative" }, [
860
913
  createVNode("button", {
861
914
  class: [
862
915
  "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
863
- __props.activeFilter === "passed" ? "bg-green-100 dark:bg-green-900/30 ring-2 ring-green-400 dark:ring-green-600" : "bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30"
916
+ __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"
864
917
  ],
865
918
  onClick: ($event) => emit("filter-status", "passed")
866
919
  }, [
867
- createVNode("p", { class: "text-xs font-medium text-green-700 dark:text-green-400 uppercase tracking-wider" }, "Passed"),
868
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-green-600 dark:text-green-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
920
+ createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
921
+ 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)
869
922
  ], 10, ["onClick"]),
870
923
  (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
871
924
  key: 0,
@@ -886,22 +939,22 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
886
939
  createVNode("button", {
887
940
  class: [
888
941
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
889
- __props.activeFilter === "failed" ? "bg-red-100 dark:bg-red-900/30 ring-2 ring-red-400 dark:ring-red-600" : "bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30"
942
+ __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"
890
943
  ],
891
944
  onClick: ($event) => emit("filter-status", "failed")
892
945
  }, [
893
- createVNode("p", { class: "text-xs font-medium text-red-700 dark:text-red-400 uppercase tracking-wider" }, "Failed"),
894
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-red-600 dark:text-red-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
946
+ createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
947
+ 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)
895
948
  ], 10, ["onClick"]),
896
949
  createVNode("button", {
897
950
  class: [
898
951
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
899
- __props.activeFilter === "skipped" ? "bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500" : "bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"
952
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
900
953
  ],
901
954
  onClick: ($event) => emit("filter-status", "skipped")
902
955
  }, [
903
- createVNode("p", { class: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "Skipped"),
904
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-gray-600 dark:text-gray-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
956
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
957
+ 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)
905
958
  ], 10, ["onClick"]),
906
959
  createVNode("button", {
907
960
  class: [
@@ -934,9 +987,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
934
987
  createVNode("div", { class: "flex items-center gap-1" }, [
935
988
  createVNode(_component_UIcon, {
936
989
  name: "i-lucide-clock",
937
- class: "size-3.5 text-gray-400"
990
+ class: "size-3.5 text-zinc-400"
938
991
  }),
939
- createVNode("span", { class: "font-medium tabular-nums" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun?.duration)), 1)
992
+ createVNode(_component_DurationValue, {
993
+ ms: __props.testRun?.duration,
994
+ class: "font-medium"
995
+ }, null, 8, ["ms"])
940
996
  ]),
941
997
  __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
942
998
  key: 0,
@@ -944,10 +1000,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
944
1000
  }, [
945
1001
  createVNode(_component_UIcon, {
946
1002
  name: "i-lucide-gauge",
947
- class: "size-3.5 text-gray-400"
1003
+ class: "size-3.5 text-zinc-400"
948
1004
  }),
949
- createVNode("span", { class: "text-gray-500 hidden sm:inline" }, "Avg"),
950
- createVNode("span", { class: "font-medium tabular-nums" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun.avgTestDuration)), 1)
1005
+ createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Avg"),
1006
+ createVNode(_component_DurationValue, {
1007
+ ms: __props.testRun.avgTestDuration,
1008
+ class: "font-medium"
1009
+ }, null, 8, ["ms"])
951
1010
  ])) : createCommentVNode("", true),
952
1011
  __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
953
1012
  key: 1,
@@ -957,8 +1016,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
957
1016
  name: "i-lucide-arrow-up-right",
958
1017
  class: "size-3.5 text-orange-500"
959
1018
  }),
960
- createVNode("span", { class: "text-gray-500 hidden sm:inline" }, "P90"),
961
- createVNode("span", { class: "font-medium tabular-nums text-orange-600 dark:text-orange-400" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun.p90TestDuration)), 1)
1019
+ createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "P90"),
1020
+ createVNode(_component_DurationValue, {
1021
+ ms: __props.testRun.p90TestDuration,
1022
+ class: "font-medium text-orange-600 dark:text-orange-400",
1023
+ "unit-class": "opacity-60"
1024
+ }, null, 8, ["ms"])
962
1025
  ])) : createCommentVNode("", true),
963
1026
  __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
964
1027
  key: 2,
@@ -968,8 +1031,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
968
1031
  name: "i-lucide-clock",
969
1032
  class: "size-3.5 text-amber-500"
970
1033
  }),
971
- createVNode("span", { class: "text-gray-500 hidden sm:inline" }, "Wasted"),
972
- createVNode("span", { class: "font-medium tabular-nums text-amber-600 dark:text-amber-400" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.totalWastedTime)), 1)
1034
+ createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Wasted"),
1035
+ createVNode(_component_DurationValue, {
1036
+ ms: __props.totalWastedTime,
1037
+ class: "font-medium text-amber-600 dark:text-amber-400",
1038
+ "unit-class": "opacity-60"
1039
+ }, null, 8, ["ms"])
973
1040
  ])) : createCommentVNode("", true)
974
1041
  ])
975
1042
  ])) : createCommentVNode("", true)
@@ -1016,7 +1083,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1016
1083
  name: "i-lucide-upload",
1017
1084
  class: "size-5 text-info shrink-0 animate-pulse"
1018
1085
  }, null, _parent3, _scopeId2));
1019
- _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-gray-500"${_scopeId2}>Uploading reports &amp; traces…</span></div>`);
1086
+ _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>`);
1020
1087
  _push3(ssrRenderComponent(_component_UProgress, {
1021
1088
  value: null,
1022
1089
  size: "sm",
@@ -1032,7 +1099,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1032
1099
  ssrRenderList(__props.allReports, (report) => {
1033
1100
  _push3(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId2}>`);
1034
1101
  _push3(ssrRenderComponent(_component_UButton, {
1035
- href: `/api/files/${("getFileApiPath" in _ctx ? _ctx.getFileApiPath : unref(getFileApiPath))(report.path)}`,
1102
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1036
1103
  icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1037
1104
  target: "_blank",
1038
1105
  size: "xs",
@@ -1051,11 +1118,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1051
1118
  }),
1052
1119
  _: 2
1053
1120
  }, _parent3, _scopeId2));
1054
- _push3(`<span class="text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"${_scopeId2}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size))}</span></div>`);
1121
+ _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>`);
1055
1122
  });
1056
1123
  _push3(`<!--]-->`);
1057
1124
  if (unref(storageStats).testCaseFilesCount > 0) {
1058
- _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-gray-400 dark:text-gray-500 shrink-0"${_scopeId2}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize))}</span></div>`);
1125
+ _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>`);
1059
1126
  } else {
1060
1127
  _push3(`<!---->`);
1061
1128
  }
@@ -1076,7 +1143,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1076
1143
  createVNode("div", { class: "flex-1 min-w-0" }, [
1077
1144
  createVNode("div", { class: "flex items-center justify-between mb-1" }, [
1078
1145
  createVNode("span", { class: "text-sm font-medium" }, "Finalizing test run"),
1079
- createVNode("span", { class: "text-xs text-gray-500" }, "Uploading reports & traces…")
1146
+ createVNode("span", { class: "text-xs text-zinc-500" }, "Uploading reports & traces…")
1080
1147
  ]),
1081
1148
  createVNode(_component_UProgress, {
1082
1149
  value: null,
@@ -1096,7 +1163,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1096
1163
  class: "flex items-center justify-between gap-2 min-w-0"
1097
1164
  }, [
1098
1165
  createVNode(_component_UButton, {
1099
- href: `/api/files/${("getFileApiPath" in _ctx ? _ctx.getFileApiPath : unref(getFileApiPath))(report.path)}`,
1166
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1100
1167
  icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1101
1168
  target: "_blank",
1102
1169
  size: "xs",
@@ -1109,7 +1176,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1109
1176
  ]),
1110
1177
  _: 2
1111
1178
  }, 1032, ["href", "icon"]),
1112
- createVNode("span", { class: "text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
1179
+ 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)
1113
1180
  ]);
1114
1181
  }), 128)),
1115
1182
  unref(storageStats).testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
@@ -1117,7 +1184,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1117
1184
  class: "flex items-center justify-between gap-2 min-w-0"
1118
1185
  }, [
1119
1186
  createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(unref(storageStats).testCaseFilesCount) + ")", 1),
1120
- createVNode("span", { class: "text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize)), 1)
1187
+ 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)
1121
1188
  ])) : createCommentVNode("", true)
1122
1189
  ])) : createCommentVNode("", true)
1123
1190
  ];
@@ -1167,7 +1234,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1167
1234
  _push3(`<p class="flex items-center gap-1"${_scopeId2}>`);
1168
1235
  _push3(ssrRenderComponent(_component_UIcon, {
1169
1236
  name: "i-lucide-link",
1170
- class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1237
+ class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1171
1238
  }, null, _parent3, _scopeId2));
1172
1239
  _push3(`<span${_scopeId2}>${ssrInterpolate(__props.testRun.metadata.relatedIssue)}</span></p>`);
1173
1240
  } else {
@@ -1202,7 +1269,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1202
1269
  _push3(`<!---->`);
1203
1270
  }
1204
1271
  if (__props.showCustomData && __props.testRun.metadata.customData) {
1205
- _push3(`<div${_scopeId2}><div class="bg-gray-50 dark:bg-gray-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>`);
1272
+ _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>`);
1206
1273
  } else {
1207
1274
  _push3(`<!---->`);
1208
1275
  }
@@ -1233,7 +1300,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1233
1300
  }, [
1234
1301
  createVNode(_component_UIcon, {
1235
1302
  name: "i-lucide-link",
1236
- class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1303
+ class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1237
1304
  }),
1238
1305
  createVNode("span", null, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1239
1306
  ])) : createCommentVNode("", true),
@@ -1257,7 +1324,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1257
1324
  _: 1
1258
1325
  }, 8, ["icon", "onClick"])) : createCommentVNode("", true),
1259
1326
  __props.showCustomData && __props.testRun.metadata.customData ? (openBlock(), createBlock("div", { key: 3 }, [
1260
- createVNode("div", { class: "bg-gray-50 dark:bg-gray-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1327
+ 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" }, [
1261
1328
  createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(__props.testRun.metadata.customData, null, 2)), 1)
1262
1329
  ])
1263
1330
  ])) : createCommentVNode("", true)
@@ -1295,7 +1362,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1295
1362
  "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
1296
1363
  type: "text",
1297
1364
  placeholder: "Add a label...",
1298
- class: "inline-block w-48 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
1365
+ 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",
1299
1366
  onKeydown: onLabelKeydown,
1300
1367
  onBlur: saveLabel
1301
1368
  }, null, 40, ["onUpdate:modelValue"]), [
@@ -1304,16 +1371,16 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1304
1371
  unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1305
1372
  key: 0,
1306
1373
  name: "i-lucide-loader-circle",
1307
- class: "size-3.5 text-gray-400 animate-spin shrink-0"
1374
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1308
1375
  })) : createCommentVNode("", true)
1309
1376
  ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
1310
1377
  __props.testRun?.label ? (openBlock(), createBlock("span", {
1311
1378
  key: 0,
1312
- class: "font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",
1379
+ 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",
1313
1380
  onClick: startEditLabel
1314
1381
  }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1315
1382
  key: 1,
1316
- class: "text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1.5",
1383
+ 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",
1317
1384
  title: "Add a label",
1318
1385
  onClick: startEditLabel
1319
1386
  }, " + label "))
@@ -1358,7 +1425,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1358
1425
  ]),
1359
1426
  _: 1
1360
1427
  }, 8, ["text"])) : createCommentVNode("", true),
1361
- createVNode("span", { class: "text-xs text-gray-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),
1428
+ 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),
1362
1429
  createVNode(_component_UTooltip, {
1363
1430
  text: unref(copied) ? "Copied!" : "Copy run summary"
1364
1431
  }, {
@@ -1368,7 +1435,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1368
1435
  variant: "ghost",
1369
1436
  color: "neutral",
1370
1437
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
1371
- class: "shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",
1438
+ class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1372
1439
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
1373
1440
  }, null, 8, ["icon", "onClick"])
1374
1441
  ]),
@@ -1377,11 +1444,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1377
1444
  unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 2 }, {
1378
1445
  content: withCtx(() => [
1379
1446
  createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
1380
- createVNode("p", { class: "text-xs font-medium text-gray-500 px-2 py-1" }, "Mode"),
1447
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
1381
1448
  (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
1382
1449
  return createVNode("button", {
1383
1450
  key: m,
1384
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-gray-100 dark:hover:bg-gray-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
1451
+ 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" : ""],
1385
1452
  onClick: ($event) => retryMode.value = m
1386
1453
  }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
1387
1454
  }), 64))
@@ -1403,7 +1470,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1403
1470
  }, 8, ["icon", "title", "onClick"])
1404
1471
  ]),
1405
1472
  _: 1
1406
- })) : createCommentVNode("", true)
1473
+ })) : createCommentVNode("", true),
1474
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
1475
+ key: 3,
1476
+ "project-id": __props.testRun?.project?.id,
1477
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
1478
+ cases: unref(failedCases)
1479
+ }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true)
1407
1480
  ])
1408
1481
  ])
1409
1482
  ])
@@ -1412,23 +1485,23 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1412
1485
  createVNode("button", {
1413
1486
  class: [
1414
1487
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1415
- __props.activeFilter === "all" ? "bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500" : "bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"
1488
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1416
1489
  ],
1417
1490
  onClick: ($event) => emit("filter-status", "all")
1418
1491
  }, [
1419
- createVNode("p", { class: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "Total"),
1492
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
1420
1493
  createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
1421
1494
  ], 10, ["onClick"]),
1422
1495
  createVNode("div", { class: "relative" }, [
1423
1496
  createVNode("button", {
1424
1497
  class: [
1425
1498
  "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
1426
- __props.activeFilter === "passed" ? "bg-green-100 dark:bg-green-900/30 ring-2 ring-green-400 dark:ring-green-600" : "bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30"
1499
+ __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"
1427
1500
  ],
1428
1501
  onClick: ($event) => emit("filter-status", "passed")
1429
1502
  }, [
1430
- createVNode("p", { class: "text-xs font-medium text-green-700 dark:text-green-400 uppercase tracking-wider" }, "Passed"),
1431
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-green-600 dark:text-green-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1503
+ createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
1504
+ 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)
1432
1505
  ], 10, ["onClick"]),
1433
1506
  (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
1434
1507
  key: 0,
@@ -1449,22 +1522,22 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1449
1522
  createVNode("button", {
1450
1523
  class: [
1451
1524
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1452
- __props.activeFilter === "failed" ? "bg-red-100 dark:bg-red-900/30 ring-2 ring-red-400 dark:ring-red-600" : "bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30"
1525
+ __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"
1453
1526
  ],
1454
1527
  onClick: ($event) => emit("filter-status", "failed")
1455
1528
  }, [
1456
- createVNode("p", { class: "text-xs font-medium text-red-700 dark:text-red-400 uppercase tracking-wider" }, "Failed"),
1457
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-red-600 dark:text-red-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
1529
+ createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
1530
+ 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)
1458
1531
  ], 10, ["onClick"]),
1459
1532
  createVNode("button", {
1460
1533
  class: [
1461
1534
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1462
- __props.activeFilter === "skipped" ? "bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500" : "bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"
1535
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1463
1536
  ],
1464
1537
  onClick: ($event) => emit("filter-status", "skipped")
1465
1538
  }, [
1466
- createVNode("p", { class: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "Skipped"),
1467
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-gray-600 dark:text-gray-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
1539
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
1540
+ 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)
1468
1541
  ], 10, ["onClick"]),
1469
1542
  createVNode("button", {
1470
1543
  class: [
@@ -1497,9 +1570,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1497
1570
  createVNode("div", { class: "flex items-center gap-1" }, [
1498
1571
  createVNode(_component_UIcon, {
1499
1572
  name: "i-lucide-clock",
1500
- class: "size-3.5 text-gray-400"
1573
+ class: "size-3.5 text-zinc-400"
1501
1574
  }),
1502
- createVNode("span", { class: "font-medium tabular-nums" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun?.duration)), 1)
1575
+ createVNode(_component_DurationValue, {
1576
+ ms: __props.testRun?.duration,
1577
+ class: "font-medium"
1578
+ }, null, 8, ["ms"])
1503
1579
  ]),
1504
1580
  __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
1505
1581
  key: 0,
@@ -1507,10 +1583,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1507
1583
  }, [
1508
1584
  createVNode(_component_UIcon, {
1509
1585
  name: "i-lucide-gauge",
1510
- class: "size-3.5 text-gray-400"
1586
+ class: "size-3.5 text-zinc-400"
1511
1587
  }),
1512
- createVNode("span", { class: "text-gray-500 hidden sm:inline" }, "Avg"),
1513
- createVNode("span", { class: "font-medium tabular-nums" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun.avgTestDuration)), 1)
1588
+ createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Avg"),
1589
+ createVNode(_component_DurationValue, {
1590
+ ms: __props.testRun.avgTestDuration,
1591
+ class: "font-medium"
1592
+ }, null, 8, ["ms"])
1514
1593
  ])) : createCommentVNode("", true),
1515
1594
  __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
1516
1595
  key: 1,
@@ -1520,8 +1599,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1520
1599
  name: "i-lucide-arrow-up-right",
1521
1600
  class: "size-3.5 text-orange-500"
1522
1601
  }),
1523
- createVNode("span", { class: "text-gray-500 hidden sm:inline" }, "P90"),
1524
- createVNode("span", { class: "font-medium tabular-nums text-orange-600 dark:text-orange-400" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.testRun.p90TestDuration)), 1)
1602
+ createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "P90"),
1603
+ createVNode(_component_DurationValue, {
1604
+ ms: __props.testRun.p90TestDuration,
1605
+ class: "font-medium text-orange-600 dark:text-orange-400",
1606
+ "unit-class": "opacity-60"
1607
+ }, null, 8, ["ms"])
1525
1608
  ])) : createCommentVNode("", true),
1526
1609
  __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
1527
1610
  key: 2,
@@ -1531,8 +1614,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1531
1614
  name: "i-lucide-clock",
1532
1615
  class: "size-3.5 text-amber-500"
1533
1616
  }),
1534
- createVNode("span", { class: "text-gray-500 hidden sm:inline" }, "Wasted"),
1535
- createVNode("span", { class: "font-medium tabular-nums text-amber-600 dark:text-amber-400" }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(__props.totalWastedTime)), 1)
1617
+ createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Wasted"),
1618
+ createVNode(_component_DurationValue, {
1619
+ ms: __props.totalWastedTime,
1620
+ class: "font-medium text-amber-600 dark:text-amber-400",
1621
+ "unit-class": "opacity-60"
1622
+ }, null, 8, ["ms"])
1536
1623
  ])) : createCommentVNode("", true)
1537
1624
  ])
1538
1625
  ])) : createCommentVNode("", true)
@@ -1575,7 +1662,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1575
1662
  createVNode("div", { class: "flex-1 min-w-0" }, [
1576
1663
  createVNode("div", { class: "flex items-center justify-between mb-1" }, [
1577
1664
  createVNode("span", { class: "text-sm font-medium" }, "Finalizing test run"),
1578
- createVNode("span", { class: "text-xs text-gray-500" }, "Uploading reports & traces…")
1665
+ createVNode("span", { class: "text-xs text-zinc-500" }, "Uploading reports & traces…")
1579
1666
  ]),
1580
1667
  createVNode(_component_UProgress, {
1581
1668
  value: null,
@@ -1595,7 +1682,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1595
1682
  class: "flex items-center justify-between gap-2 min-w-0"
1596
1683
  }, [
1597
1684
  createVNode(_component_UButton, {
1598
- href: `/api/files/${("getFileApiPath" in _ctx ? _ctx.getFileApiPath : unref(getFileApiPath))(report.path)}`,
1685
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1599
1686
  icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1600
1687
  target: "_blank",
1601
1688
  size: "xs",
@@ -1608,7 +1695,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1608
1695
  ]),
1609
1696
  _: 2
1610
1697
  }, 1032, ["href", "icon"]),
1611
- createVNode("span", { class: "text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
1698
+ 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)
1612
1699
  ]);
1613
1700
  }), 128)),
1614
1701
  unref(storageStats).testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
@@ -1616,7 +1703,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1616
1703
  class: "flex items-center justify-between gap-2 min-w-0"
1617
1704
  }, [
1618
1705
  createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(unref(storageStats).testCaseFilesCount) + ")", 1),
1619
- createVNode("span", { class: "text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize)), 1)
1706
+ 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)
1620
1707
  ])) : createCommentVNode("", true)
1621
1708
  ])) : createCommentVNode("", true)
1622
1709
  ]),
@@ -1654,7 +1741,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1654
1741
  }, [
1655
1742
  createVNode(_component_UIcon, {
1656
1743
  name: "i-lucide-link",
1657
- class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1744
+ class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1658
1745
  }),
1659
1746
  createVNode("span", null, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1660
1747
  ])) : createCommentVNode("", true),
@@ -1678,7 +1765,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1678
1765
  _: 1
1679
1766
  }, 8, ["icon", "onClick"])) : createCommentVNode("", true),
1680
1767
  __props.showCustomData && __props.testRun.metadata.customData ? (openBlock(), createBlock("div", { key: 3 }, [
1681
- createVNode("div", { class: "bg-gray-50 dark:bg-gray-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1768
+ 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" }, [
1682
1769
  createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(__props.testRun.metadata.customData, null, 2)), 1)
1683
1770
  ])
1684
1771
  ])) : createCommentVNode("", true)
@@ -1695,36 +1782,27 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1695
1782
  };
1696
1783
  }
1697
1784
  });
1698
- const _sfc_setup$e = _sfc_main$e.setup;
1699
- _sfc_main$e.setup = (props, ctx) => {
1785
+ const _sfc_setup$f = _sfc_main$f.setup;
1786
+ _sfc_main$f.setup = (props, ctx) => {
1700
1787
  const ssrContext = useSSRContext();
1701
1788
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/run/RunSummary.vue");
1702
- return _sfc_setup$e ? _sfc_setup$e(props, ctx) : void 0;
1789
+ return _sfc_setup$f ? _sfc_setup$f(props, ctx) : void 0;
1703
1790
  };
1704
- const __nuxt_component_9$1 = Object.assign(_sfc_main$e, { __name: "RunSummary" });
1705
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
1706
- __name: "TestCasesTree",
1791
+ const __nuxt_component_9$1 = Object.assign(_sfc_main$f, { __name: "RunSummary" });
1792
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
1793
+ __name: "TestRowBadges",
1707
1794
  __ssrInlineRender: true,
1708
1795
  props: {
1709
- testCases: {},
1710
- suites: {},
1711
- hasFilter: { type: Boolean },
1712
- highlightedCaseId: {},
1713
- projectKey: {},
1714
- projectName: {}
1796
+ mode: { default: null },
1797
+ isNewRegression: { type: [Boolean, null], default: false },
1798
+ isNewFlaky: { type: [Boolean, null], default: false },
1799
+ annotations: { default: null },
1800
+ tags: { default: null },
1801
+ meta: { default: null },
1802
+ maxTags: { default: 0 }
1715
1803
  },
1716
1804
  setup(__props) {
1717
1805
  const props = __props;
1718
- const suiteLookup = computed(() => {
1719
- const map = /* @__PURE__ */ new Map();
1720
- for (const s of props.suites) {
1721
- map.set(`${s.filePath}${s.suitePath.join("")}`, s);
1722
- }
1723
- return map;
1724
- });
1725
- function normalizeStatus(s) {
1726
- return s === "timedOut" || s === "timedout" ? "failed" : s;
1727
- }
1728
1806
  function annotationColor(type) {
1729
1807
  if (type === "fixme" || type === "slow") return "warning";
1730
1808
  if (type === "fail") return "error";
@@ -1751,6 +1829,193 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
1751
1829
  function annotationLabel(ann) {
1752
1830
  return ann.type === "tag" ? ann.description ?? ann.type : ann.type;
1753
1831
  }
1832
+ const marks = computed(() => (props.annotations ?? []).filter((ann) => !isPiwiAnnotation(ann.type)));
1833
+ const hasMeta = computed(
1834
+ () => Boolean(
1835
+ (props.tags?.length ?? 0) > 0 || props.meta?.owner || props.meta?.priority || props.meta?.feature || props.meta?.link
1836
+ )
1837
+ );
1838
+ const hasAnything = computed(
1839
+ () => props.mode === "parallel" || props.mode === "serial" || Boolean(props.isNewRegression) || Boolean(props.isNewFlaky) || marks.value.length > 0 || hasMeta.value
1840
+ );
1841
+ return (_ctx, _push, _parent, _attrs) => {
1842
+ const _component_UBadge = _sfc_main$7$1;
1843
+ const _component_UIcon = _sfc_main$p;
1844
+ const _component_TestMetaBadges = __nuxt_component_2$3;
1845
+ if (unref(hasAnything)) {
1846
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "inline-flex items-center gap-1 flex-wrap" }, _attrs))}>`);
1847
+ if (__props.mode === "parallel") {
1848
+ _push(ssrRenderComponent(_component_UBadge, {
1849
+ color: "success",
1850
+ variant: "soft",
1851
+ size: "xs",
1852
+ class: "shrink-0"
1853
+ }, {
1854
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1855
+ if (_push2) {
1856
+ _push2(`parallel`);
1857
+ } else {
1858
+ return [
1859
+ createTextVNode("parallel")
1860
+ ];
1861
+ }
1862
+ }),
1863
+ _: 1
1864
+ }, _parent));
1865
+ } else {
1866
+ _push(`<!---->`);
1867
+ }
1868
+ if (__props.mode === "serial") {
1869
+ _push(ssrRenderComponent(_component_UBadge, {
1870
+ color: "warning",
1871
+ variant: "soft",
1872
+ size: "xs",
1873
+ class: "shrink-0"
1874
+ }, {
1875
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1876
+ if (_push2) {
1877
+ _push2(`serial`);
1878
+ } else {
1879
+ return [
1880
+ createTextVNode("serial")
1881
+ ];
1882
+ }
1883
+ }),
1884
+ _: 1
1885
+ }, _parent));
1886
+ } else {
1887
+ _push(`<!---->`);
1888
+ }
1889
+ if (__props.isNewRegression) {
1890
+ _push(ssrRenderComponent(_component_UBadge, {
1891
+ color: "error",
1892
+ variant: "solid",
1893
+ size: "xs",
1894
+ class: "uppercase tracking-wider shrink-0",
1895
+ title: "First run in which this test failed"
1896
+ }, {
1897
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1898
+ if (_push2) {
1899
+ _push2(` NEW `);
1900
+ } else {
1901
+ return [
1902
+ createTextVNode(" NEW ")
1903
+ ];
1904
+ }
1905
+ }),
1906
+ _: 1
1907
+ }, _parent));
1908
+ } else {
1909
+ _push(`<!---->`);
1910
+ }
1911
+ if (__props.isNewFlaky) {
1912
+ _push(ssrRenderComponent(_component_UBadge, {
1913
+ color: "info",
1914
+ variant: "solid",
1915
+ size: "xs",
1916
+ class: "uppercase tracking-wider shrink-0",
1917
+ title: "First run in which this test was flaky"
1918
+ }, {
1919
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1920
+ if (_push2) {
1921
+ _push2(` FLAKY `);
1922
+ } else {
1923
+ return [
1924
+ createTextVNode(" FLAKY ")
1925
+ ];
1926
+ }
1927
+ }),
1928
+ _: 1
1929
+ }, _parent));
1930
+ } else {
1931
+ _push(`<!---->`);
1932
+ }
1933
+ _push(`<!--[-->`);
1934
+ ssrRenderList(unref(marks), (ann) => {
1935
+ _push(ssrRenderComponent(_component_UBadge, {
1936
+ key: `${ann.type}:${ann.description ?? ""}`,
1937
+ color: annotationColor(ann.type),
1938
+ variant: "soft",
1939
+ size: "xs",
1940
+ title: ann.type !== "tag" ? ann.description ?? void 0 : void 0,
1941
+ class: "shrink-0 gap-1"
1942
+ }, {
1943
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1944
+ if (_push2) {
1945
+ if (annotationIcon(ann.type)) {
1946
+ _push2(ssrRenderComponent(_component_UIcon, {
1947
+ name: annotationIcon(ann.type),
1948
+ class: "size-2.5 shrink-0"
1949
+ }, null, _parent2, _scopeId));
1950
+ } else {
1951
+ _push2(`<!---->`);
1952
+ }
1953
+ _push2(` ${ssrInterpolate(annotationLabel(ann))}`);
1954
+ } else {
1955
+ return [
1956
+ annotationIcon(ann.type) ? (openBlock(), createBlock(_component_UIcon, {
1957
+ key: 0,
1958
+ name: annotationIcon(ann.type),
1959
+ class: "size-2.5 shrink-0"
1960
+ }, null, 8, ["name"])) : createCommentVNode("", true),
1961
+ createTextVNode(" " + toDisplayString(annotationLabel(ann)), 1)
1962
+ ];
1963
+ }
1964
+ }),
1965
+ _: 2
1966
+ }, _parent));
1967
+ });
1968
+ _push(`<!--]-->`);
1969
+ _push(ssrRenderComponent(_component_TestMetaBadges, {
1970
+ tags: __props.tags,
1971
+ meta: __props.meta,
1972
+ "max-tags": __props.maxTags
1973
+ }, null, _parent));
1974
+ _push(`</div>`);
1975
+ } else {
1976
+ _push(`<!---->`);
1977
+ }
1978
+ };
1979
+ }
1980
+ });
1981
+ const _sfc_setup$e = _sfc_main$e.setup;
1982
+ _sfc_main$e.setup = (props, ctx) => {
1983
+ const ssrContext = useSSRContext();
1984
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/TestRowBadges.vue");
1985
+ return _sfc_setup$e ? _sfc_setup$e(props, ctx) : void 0;
1986
+ };
1987
+ const __nuxt_component_2$1 = Object.assign(_sfc_main$e, { __name: "TestRowBadges" });
1988
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
1989
+ __name: "TestCasesTree",
1990
+ __ssrInlineRender: true,
1991
+ props: {
1992
+ testCases: {},
1993
+ suites: {},
1994
+ hasFilter: { type: Boolean },
1995
+ highlightedCaseId: {},
1996
+ projectKey: {},
1997
+ projectName: {}
1998
+ },
1999
+ setup(__props) {
2000
+ const props = __props;
2001
+ const suiteLookup = computed(() => {
2002
+ const map = /* @__PURE__ */ new Map();
2003
+ for (const s of props.suites) {
2004
+ map.set(`${s.filePath}${s.suitePath.join("")}`, s);
2005
+ }
2006
+ return map;
2007
+ });
2008
+ function normalizeStatus(s) {
2009
+ return s === "timedOut" || s === "timedout" ? "failed" : s;
2010
+ }
2011
+ const GROUP_STAT_KEYS = ["failed", "passed", "skipped", "didnotrun", "running"];
2012
+ function visibleStats(stats) {
2013
+ return GROUP_STAT_KEYS.filter((key) => stats[key] > 0).map((key) => ({
2014
+ key,
2015
+ count: stats[key],
2016
+ label: formatStatusLabel(key)
2017
+ }));
2018
+ }
1754
2019
  function computeStats(tests) {
1755
2020
  const stats = { passed: 0, failed: 0, skipped: 0, didnotrun: 0, running: 0, total: 0 };
1756
2021
  for (const t of tests) {
@@ -1816,9 +2081,11 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
1816
2081
  return (_ctx, _push, _parent, _attrs) => {
1817
2082
  const _component_UIcon = _sfc_main$p;
1818
2083
  const _component_OpenInIdeLink = __nuxt_component_1$3;
2084
+ const _component_TestRowBadges = __nuxt_component_2$1;
2085
+ const _component_BrowserBadge = __nuxt_component_3$3;
2086
+ const _component_DurationValue = __nuxt_component_14$1;
1819
2087
  const _component_UBadge = _sfc_main$7$1;
1820
- const _component_UButton = _sfc_main$k;
1821
- _push(`<div${ssrRenderAttrs(mergeProps({ class: "rounded-lg border border-default text-sm flex flex-col flex-1 min-h-0" }, _attrs))}><div class="flex items-center justify-end px-3 py-1.5 border-b border-default bg-elevated shrink-0"><button class="${ssrRenderClass([__props.hasFilter ? "text-muted cursor-not-allowed opacity-50" : "text-muted hover:text-default", "flex items-center gap-1 text-xs transition-colors"])}"${ssrIncludeBooleanAttr(__props.hasFilter) ? " disabled" : ""}${ssrRenderAttr("title", __props.hasFilter ? "Clear filters to collapse/expand" : isAllExpanded.value ? "Collapse all" : "Expand all")}>`);
2088
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "rounded-lg border border-default bg-default text-sm flex flex-col flex-1 min-h-0" }, _attrs))}><div class="flex items-center justify-end px-3 py-1.5 border-b border-default bg-elevated shrink-0"><button class="${ssrRenderClass([__props.hasFilter ? "text-muted cursor-not-allowed opacity-50" : "text-muted hover:text-default", "flex items-center gap-1 text-xs transition-colors"])}"${ssrIncludeBooleanAttr(__props.hasFilter) ? " disabled" : ""}${ssrRenderAttr("title", __props.hasFilter ? "Clear filters to collapse/expand" : isAllExpanded.value ? "Collapse all" : "Expand all")}>`);
1822
2089
  _push(ssrRenderComponent(_component_UIcon, {
1823
2090
  name: isAllExpanded.value ? "i-lucide-fold-vertical" : "i-lucide-unfold-vertical",
1824
2091
  class: "size-3.5"
@@ -1853,177 +2120,55 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
1853
2120
  _push(`<span class="font-medium truncate min-w-0 text-muted">${ssrInterpolate(row.label)}</span>`);
1854
2121
  }
1855
2122
  if (row.depth > 0) {
1856
- _push(`<div class="flex items-center gap-1 shrink-0">`);
1857
- if (row.mode === "parallel") {
1858
- _push(ssrRenderComponent(_component_UBadge, {
1859
- color: "success",
1860
- variant: "soft",
1861
- size: "xs"
1862
- }, {
1863
- default: withCtx((_, _push2, _parent2, _scopeId) => {
1864
- if (_push2) {
1865
- _push2(`parallel`);
1866
- } else {
1867
- return [
1868
- createTextVNode("parallel")
1869
- ];
1870
- }
1871
- }),
1872
- _: 2
1873
- }, _parent));
1874
- } else {
1875
- _push(`<!---->`);
1876
- }
1877
- if (row.mode === "serial") {
1878
- _push(ssrRenderComponent(_component_UBadge, {
1879
- color: "warning",
1880
- variant: "soft",
1881
- size: "xs"
1882
- }, {
1883
- default: withCtx((_, _push2, _parent2, _scopeId) => {
1884
- if (_push2) {
1885
- _push2(`serial`);
1886
- } else {
1887
- return [
1888
- createTextVNode("serial")
1889
- ];
1890
- }
1891
- }),
1892
- _: 2
1893
- }, _parent));
1894
- } else {
1895
- _push(`<!---->`);
1896
- }
1897
- _push(`<!--[-->`);
1898
- ssrRenderList(row.annotations, (ann) => {
1899
- _push(ssrRenderComponent(_component_UBadge, {
1900
- key: `${ann.type}:${ann.description ?? ""}`,
1901
- color: annotationColor(ann.type),
1902
- variant: "soft",
1903
- size: "xs",
1904
- title: ann.type !== "tag" ? ann.description ?? void 0 : void 0,
1905
- class: "gap-1"
1906
- }, {
1907
- default: withCtx((_, _push2, _parent2, _scopeId) => {
1908
- if (_push2) {
1909
- if (annotationIcon(ann.type)) {
1910
- _push2(ssrRenderComponent(_component_UIcon, {
1911
- name: annotationIcon(ann.type),
1912
- class: "size-2.5 shrink-0"
1913
- }, null, _parent2, _scopeId));
1914
- } else {
1915
- _push2(`<!---->`);
1916
- }
1917
- _push2(` ${ssrInterpolate(annotationLabel(ann))}`);
1918
- } else {
1919
- return [
1920
- annotationIcon(ann.type) ? (openBlock(), createBlock(_component_UIcon, {
1921
- key: 0,
1922
- name: annotationIcon(ann.type),
1923
- class: "size-2.5 shrink-0"
1924
- }, null, 8, ["name"])) : createCommentVNode("", true),
1925
- createTextVNode(" " + toDisplayString(annotationLabel(ann)), 1)
1926
- ];
1927
- }
1928
- }),
1929
- _: 2
1930
- }, _parent));
1931
- });
1932
- _push(`<!--]--></div>`);
1933
- } else {
1934
- _push(`<!---->`);
1935
- }
1936
- _push(`<div class="flex-1"></div><div class="flex items-center gap-2 shrink-0 tabular-nums">`);
1937
- if (row.stats.failed > 0) {
1938
- _push(`<span class="text-xs text-red-600 dark:text-red-400 font-medium">${ssrInterpolate(row.stats.failed)} failed </span>`);
1939
- } else {
1940
- _push(`<!---->`);
1941
- }
1942
- if (row.stats.passed > 0) {
1943
- _push(`<span class="text-xs text-green-600 dark:text-green-400">${ssrInterpolate(row.stats.passed)} passed </span>`);
1944
- } else {
1945
- _push(`<!---->`);
1946
- }
1947
- if (row.stats.skipped > 0) {
1948
- _push(`<span class="text-xs text-muted">${ssrInterpolate(row.stats.skipped)} skipped</span>`);
1949
- } else {
1950
- _push(`<!---->`);
1951
- }
1952
- if (row.stats.didnotrun > 0) {
1953
- _push(`<span class="text-xs text-amber-600 dark:text-amber-400">${ssrInterpolate(row.stats.didnotrun)} didn&#39;t run </span>`);
1954
- } else {
1955
- _push(`<!---->`);
1956
- }
1957
- if (row.stats.running > 0) {
1958
- _push(`<span class="text-xs text-info">${ssrInterpolate(row.stats.running)} running</span>`);
2123
+ _push(ssrRenderComponent(_component_TestRowBadges, {
2124
+ mode: row.mode,
2125
+ annotations: row.annotations,
2126
+ class: "shrink-0"
2127
+ }, null, _parent));
1959
2128
  } else {
1960
2129
  _push(`<!---->`);
1961
2130
  }
1962
- _push(`</div></div>`);
2131
+ _push(`<div class="flex-1"></div><div class="flex items-center gap-1.5 sm:gap-2 shrink-0 tabular-nums"><!--[-->`);
2132
+ ssrRenderList(visibleStats(row.stats), (stat) => {
2133
+ _push(`<span class="${ssrRenderClass([[("getStatusTextClass" in _ctx ? _ctx.getStatusTextClass : unref(getStatusTextClass))(stat.key), stat.key === "failed" ? "font-medium" : ""], "text-xs inline-flex items-center gap-0.5"])}"${ssrRenderAttr("title", `${stat.count} ${stat.label}`)}>`);
2134
+ _push(ssrRenderComponent(_component_UIcon, {
2135
+ name: ("getStatusIcon" in _ctx ? _ctx.getStatusIcon : unref(getStatusIcon))(stat.key),
2136
+ class: "size-3 shrink-0 sm:hidden"
2137
+ }, null, _parent));
2138
+ _push(` ${ssrInterpolate(stat.count)}<span class="max-sm:sr-only">${ssrInterpolate(stat.label)}</span></span>`);
2139
+ });
2140
+ _push(`<!--]--></div></div>`);
1963
2141
  } else {
1964
- _push(`<div class="${ssrRenderClass([__props.highlightedCaseId === row.test.id ? "animate-pulse bg-yellow-100 dark:bg-yellow-900/30" : "", "flex items-center gap-2 pr-3 py-1.5 border-b border-default last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-900/40 transition-colors"])}" style="${ssrRenderStyle({ paddingLeft: `${row.depth * 20 + 12}px` })}">`);
2142
+ _push(`<div class="${ssrRenderClass([__props.highlightedCaseId === row.test.id ? "animate-pulse bg-yellow-100 dark:bg-yellow-900/30" : "", "flex flex-wrap items-center gap-x-2 gap-y-1 pr-3 py-2 sm:py-1.5 border-b border-default last:border-b-0 hover:bg-zinc-50 dark:hover:bg-zinc-900/40 transition-colors"])}" style="${ssrRenderStyle({ paddingLeft: `${row.depth * 20 + 12}px` })}">`);
2143
+ _push(ssrRenderComponent(_component_BrowserBadge, {
2144
+ browser: row.test.browser,
2145
+ size: "sm"
2146
+ }, null, _parent));
1965
2147
  _push(ssrRenderComponent(_component_UIcon, {
1966
- name: "i-lucide-flask-conical",
1967
- class: "size-3.5 text-muted shrink-0"
2148
+ name: ("getStatusIcon" in _ctx ? _ctx.getStatusIcon : unref(getStatusIcon))(row.test.status),
2149
+ class: ["size-4 shrink-0", [("getStatusTextClass" in _ctx ? _ctx.getStatusTextClass : unref(getStatusTextClass))(row.test.status), ("isStatusInFlight" in _ctx ? _ctx.isStatusInFlight : unref(isStatusInFlight))(row.test.status) ? "animate-spin" : ""]],
2150
+ role: "img",
2151
+ "aria-label": `Status: ${("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(row.test.status)}`,
2152
+ title: ("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(row.test.status)
1968
2153
  }, null, _parent));
1969
- _push(ssrRenderComponent(_component_UBadge, {
1970
- color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(
1971
- row.test.status === "timedOut" || row.test.status === "timedout" ? "failed" : row.test.status
1972
- ),
1973
- size: "xs",
1974
- class: "capitalize shrink-0"
1975
- }, {
1976
- default: withCtx((_, _push2, _parent2, _scopeId) => {
1977
- if (_push2) {
1978
- _push2(`${ssrInterpolate(("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(row.test.status))}`);
1979
- } else {
1980
- return [
1981
- createTextVNode(toDisplayString(("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(row.test.status)), 1)
1982
- ];
1983
- }
1984
- }),
1985
- _: 2
1986
- }, _parent));
1987
- _push(`<!--[-->`);
1988
- ssrRenderList(row.test.testAnnotations ?? [], (ann) => {
1989
- _push(ssrRenderComponent(_component_UBadge, {
1990
- key: `${ann.type}:${ann.description ?? ""}`,
1991
- color: annotationColor(ann.type),
1992
- variant: "soft",
1993
- size: "xs",
1994
- title: ann.type !== "tag" ? ann.description ?? void 0 : void 0,
1995
- class: "shrink-0 gap-1"
1996
- }, {
1997
- default: withCtx((_, _push2, _parent2, _scopeId) => {
1998
- if (_push2) {
1999
- if (annotationIcon(ann.type)) {
2000
- _push2(ssrRenderComponent(_component_UIcon, {
2001
- name: annotationIcon(ann.type),
2002
- class: "size-2.5 shrink-0"
2003
- }, null, _parent2, _scopeId));
2004
- } else {
2005
- _push2(`<!---->`);
2006
- }
2007
- _push2(` ${ssrInterpolate(annotationLabel(ann))}`);
2008
- } else {
2009
- return [
2010
- annotationIcon(ann.type) ? (openBlock(), createBlock(_component_UIcon, {
2011
- key: 0,
2012
- name: annotationIcon(ann.type),
2013
- class: "size-2.5 shrink-0"
2014
- }, null, 8, ["name"])) : createCommentVNode("", true),
2015
- createTextVNode(" " + toDisplayString(annotationLabel(ann)), 1)
2016
- ];
2017
- }
2018
- }),
2019
- _: 2
2020
- }, _parent));
2021
- });
2022
- _push(`<!--]--><a${ssrRenderAttr("href", `/test-run-cases/${row.test.id}`)} class="text-primary hover:underline truncate flex-1 min-w-0">${ssrInterpolate(row.test.title)}</a><div class="flex items-center gap-2 shrink-0">`);
2154
+ _push(`<a${ssrRenderAttr("href", `/test-run-cases/${row.test.id}`)} class="text-highlighted hover:text-primary hover:underline min-w-32 self-stretch flex items-center"${ssrRenderAttr("title", row.test.title)}><span class="truncate">${ssrInterpolate(row.test.title)}</span></a>`);
2155
+ _push(ssrRenderComponent(_component_TestRowBadges, {
2156
+ "is-new-regression": Boolean(row.test.isNewRegression),
2157
+ "is-new-flaky": Boolean(row.test.isNewFlaky),
2158
+ annotations: row.test.testAnnotations,
2159
+ tags: row.test.tags,
2160
+ meta: row.test.testMeta,
2161
+ "max-tags": 3,
2162
+ class: "shrink-0"
2163
+ }, null, _parent));
2164
+ _push(`<div class="flex items-center gap-1.5 sm:gap-2 shrink-0 ml-auto">`);
2023
2165
  if (row.test.status === "running") {
2024
2166
  _push(`<span class="text-xs text-info">In progress...</span>`);
2025
2167
  } else if (row.test.duration) {
2026
- _push(`<span class="text-xs text-muted tabular-nums">${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.test.duration))}</span>`);
2168
+ _push(ssrRenderComponent(_component_DurationValue, {
2169
+ ms: row.test.duration,
2170
+ class: "text-xs text-muted"
2171
+ }, null, _parent));
2027
2172
  } else {
2028
2173
  _push(`<!---->`);
2029
2174
  }
@@ -2069,22 +2214,21 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
2069
2214
  } else {
2070
2215
  _push(`<!---->`);
2071
2216
  }
2072
- _push(ssrRenderComponent(_component_UButton, {
2073
- to: `/test-run-cases/${row.test.id}`,
2074
- size: "xs",
2075
- variant: "outline"
2076
- }, {
2077
- default: withCtx((_, _push2, _parent2, _scopeId) => {
2078
- if (_push2) {
2079
- _push2(` View `);
2080
- } else {
2081
- return [
2082
- createTextVNode(" View ")
2083
- ];
2084
- }
2085
- }),
2086
- _: 2
2087
- }, _parent));
2217
+ if (row.test.wastedTimeMs) {
2218
+ _push(`<span class="inline-flex items-center gap-0.5 text-xs text-amber-600 dark:text-amber-400" title="Wasted in fixed waits">`);
2219
+ _push(ssrRenderComponent(_component_UIcon, {
2220
+ name: "i-lucide-hourglass",
2221
+ class: "size-3 shrink-0"
2222
+ }, null, _parent));
2223
+ _push(ssrRenderComponent(_component_DurationValue, {
2224
+ ms: row.test.wastedTimeMs,
2225
+ "unit-class": "opacity-60",
2226
+ "no-title": ""
2227
+ }, null, _parent));
2228
+ _push(`</span>`);
2229
+ } else {
2230
+ _push(`<!---->`);
2231
+ }
2088
2232
  _push(`</div></div>`);
2089
2233
  }
2090
2234
  _push(`<!--]-->`);
@@ -2094,7 +2238,7 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
2094
2238
  _push(`<div class="text-center py-8 text-muted">`);
2095
2239
  _push(ssrRenderComponent(_component_UIcon, {
2096
2240
  name: "i-lucide-search-x",
2097
- class: "size-6 mx-auto mb-2 text-gray-300 dark:text-gray-600"
2241
+ class: "size-6 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"
2098
2242
  }, null, _parent));
2099
2243
  _push(`<p class="text-sm">No test cases match your filters.</p></div>`);
2100
2244
  } else {
@@ -2110,7 +2254,8 @@ _sfc_main$d.setup = (props, ctx) => {
2110
2254
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/run/TestCasesTree.vue");
2111
2255
  return _sfc_setup$d ? _sfc_setup$d(props, ctx) : void 0;
2112
2256
  };
2113
- const __nuxt_component_6 = Object.assign(_sfc_main$d, { __name: "TestCasesTree" });
2257
+ const __nuxt_component_7 = Object.assign(_sfc_main$d, { __name: "TestCasesTree" });
2258
+ const NATURAL_ORDER = "natural";
2114
2259
  const _sfc_main$c = /* @__PURE__ */ defineComponent({
2115
2260
  __name: "TestCasesList",
2116
2261
  __ssrInlineRender: true,
@@ -2246,11 +2391,21 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2246
2391
  if (hasWastedTime.value) {
2247
2392
  cols.push({ key: "wastedTimeMs", label: "Wasted", sortable: true, width: "6rem", align: "left" });
2248
2393
  }
2249
- cols.push({ key: "actions", label: "Actions", sortable: false, width: "7.5rem", align: "right" });
2250
2394
  return cols;
2251
2395
  });
2396
+ const sortOptions = computed(() => [
2397
+ { label: "Run order", value: NATURAL_ORDER },
2398
+ ...columns.value.map((c) => ({ label: c.label, value: c.key }))
2399
+ ]);
2400
+ const mobileSortKey = computed({
2401
+ get: () => sortKey.value ?? NATURAL_ORDER,
2402
+ set: (value) => {
2403
+ sortKey.value = value === NATURAL_ORDER ? null : value;
2404
+ if (value !== NATURAL_ORDER) sortDir.value = "asc";
2405
+ }
2406
+ });
2252
2407
  const gridTemplate = computed(() => columns.value.map((c) => c.width).join(" "));
2253
- const gridMinWidth = computed(() => hasWastedTime.value ? "55rem" : "49rem");
2408
+ const gridMinWidth = computed(() => hasWastedTime.value ? "47.5rem" : "41.5rem");
2254
2409
  const hasFilter = computed(
2255
2410
  () => testCaseSearch.value !== "" || activeStatuses.value.length > 0 || testCaseBrowserFilter.value !== "all" || props.failureClusterFilter != null
2256
2411
  );
@@ -2287,14 +2442,15 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2287
2442
  }
2288
2443
  __expose({ scrollToCase });
2289
2444
  return (_ctx, _push, _parent, _attrs) => {
2290
- const _component_FilterToolbar = __nuxt_component_4$1;
2445
+ const _component_FilterToolbar = __nuxt_component_4$2;
2291
2446
  const _component_UIcon = _sfc_main$p;
2292
- const _component_HelpHint = __nuxt_component_2$1;
2447
+ const _component_HelpHint = __nuxt_component_2$2;
2293
2448
  const _component_UInput = _sfc_main$d$1;
2294
- const _component_USelect = _sfc_main$n;
2295
- const _component_UCheckbox = _sfc_main$o;
2296
- const _component_TestCasesTree = __nuxt_component_6;
2297
- const _component_ClientOnly = __nuxt_component_7;
2449
+ const _component_USelect = _sfc_main$o;
2450
+ const _component_UCheckbox = _sfc_main$q;
2451
+ const _component_UButton = _sfc_main$k;
2452
+ const _component_TestCasesTree = __nuxt_component_7;
2453
+ const _component_ClientOnly = __nuxt_component_7$1;
2298
2454
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-col min-h-0" }, _attrs))}>`);
2299
2455
  _push(ssrRenderComponent(_component_FilterToolbar, { class: "mb-4 shrink-0" }, {
2300
2456
  start: withCtx((_, _push2, _parent2, _scopeId) => {
@@ -2311,11 +2467,11 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2311
2467
  }, null, _parent2, _scopeId));
2312
2468
  _push2(`</button></div>`);
2313
2469
  if (__props.isLive) {
2314
- _push2(`<span class="text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"${_scopeId}>${ssrInterpolate(__props.testCases.length)} completed `);
2470
+ _push2(`<span class="text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"${_scopeId}>${ssrInterpolate(__props.testCases.length)} completed `);
2315
2471
  _push2(ssrRenderComponent(_component_HelpHint, { topic: "run.live" }, null, _parent2, _scopeId));
2316
2472
  _push2(`</span>`);
2317
2473
  } else {
2318
- _push2(`<span class="text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"${_scopeId}>${ssrInterpolate(sortedTestCases.value.length)}${ssrInterpolate(sortedTestCases.value.length !== __props.testCases.length ? ` / ${__props.testCases.length}` : "")} cases `);
2474
+ _push2(`<span class="text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"${_scopeId}>${ssrInterpolate(sortedTestCases.value.length)}${ssrInterpolate(sortedTestCases.value.length !== __props.testCases.length ? ` / ${__props.testCases.length}` : "")} cases `);
2319
2475
  _push2(ssrRenderComponent(_component_HelpHint, { topic: "run.test-cases" }, null, _parent2, _scopeId));
2320
2476
  _push2(`</span>`);
2321
2477
  }
@@ -2345,13 +2501,13 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2345
2501
  ]),
2346
2502
  __props.isLive ? (openBlock(), createBlock("span", {
2347
2503
  key: 0,
2348
- class: "text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"
2504
+ class: "text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"
2349
2505
  }, [
2350
2506
  createTextVNode(toDisplayString(__props.testCases.length) + " completed ", 1),
2351
2507
  createVNode(_component_HelpHint, { topic: "run.live" })
2352
2508
  ])) : (openBlock(), createBlock("span", {
2353
2509
  key: 1,
2354
- class: "text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"
2510
+ class: "text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"
2355
2511
  }, [
2356
2512
  createTextVNode(toDisplayString(sortedTestCases.value.length) + toDisplayString(sortedTestCases.value.length !== __props.testCases.length ? ` / ${__props.testCases.length}` : "") + " cases ", 1),
2357
2513
  createVNode(_component_HelpHint, { topic: "run.test-cases" })
@@ -2372,10 +2528,10 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2372
2528
  _push2(`<div class="flex flex-wrap items-center gap-1"${_scopeId}><!--[-->`);
2373
2529
  ssrRenderList(STATUS_OPTIONS, (opt) => {
2374
2530
  _push2(`<button class="${ssrRenderClass([
2375
- activeStatuses.value.includes(opt.value) ? opt.color === "green" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : opt.color === "red" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : opt.color === "orange" ? "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400" : "bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300" : "bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700",
2531
+ activeStatuses.value.includes(opt.value) ? opt.color === "green" ? "bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400" : opt.color === "red" ? "bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400" : opt.color === "orange" ? "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400" : "bg-zinc-200 text-zinc-700 dark:bg-zinc-700 dark:text-zinc-300" : "bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 hover:bg-zinc-200 dark:hover:bg-zinc-700",
2376
2532
  "inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap"
2377
2533
  ])}"${_scopeId}><span class="${ssrRenderClass([
2378
- opt.color === "green" ? "bg-green-500" : opt.color === "red" ? "bg-red-500" : opt.color === "orange" ? "bg-orange-500" : "bg-gray-400",
2534
+ opt.color === "green" ? "bg-emerald-500" : opt.color === "red" ? "bg-rose-500" : opt.color === "orange" ? "bg-orange-500" : "bg-zinc-400",
2379
2535
  "size-2 rounded-full shrink-0"
2380
2536
  ])}"${_scopeId}></span> ${ssrInterpolate(opt.label)}</button>`);
2381
2537
  });
@@ -2407,6 +2563,30 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2407
2563
  } else {
2408
2564
  _push2(`<!---->`);
2409
2565
  }
2566
+ if (!unref(treeView)) {
2567
+ _push2(`<div class="flex items-center gap-1 md:hidden"${_scopeId}>`);
2568
+ _push2(ssrRenderComponent(_component_USelect, {
2569
+ modelValue: mobileSortKey.value,
2570
+ "onUpdate:modelValue": ($event) => mobileSortKey.value = $event,
2571
+ items: sortOptions.value,
2572
+ size: "sm",
2573
+ class: "w-32",
2574
+ "aria-label": "Sort cases by"
2575
+ }, null, _parent2, _scopeId));
2576
+ _push2(ssrRenderComponent(_component_UButton, {
2577
+ size: "sm",
2578
+ variant: "outline",
2579
+ color: "neutral",
2580
+ disabled: sortKey.value === null,
2581
+ icon: sortDir.value === "asc" ? "i-lucide-arrow-up-narrow-wide" : "i-lucide-arrow-down-wide-narrow",
2582
+ title: sortDir.value === "asc" ? "Sorted ascending" : "Sorted descending",
2583
+ "aria-label": sortDir.value === "asc" ? "Sorted ascending" : "Sorted descending",
2584
+ onClick: ($event) => sortDir.value = sortDir.value === "asc" ? "desc" : "asc"
2585
+ }, null, _parent2, _scopeId));
2586
+ _push2(`</div>`);
2587
+ } else {
2588
+ _push2(`<!---->`);
2589
+ }
2410
2590
  } else {
2411
2591
  return [
2412
2592
  createVNode(_component_UInput, {
@@ -2423,14 +2603,14 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2423
2603
  key: opt.value,
2424
2604
  class: [
2425
2605
  "inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap",
2426
- activeStatuses.value.includes(opt.value) ? opt.color === "green" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : opt.color === "red" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : opt.color === "orange" ? "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400" : "bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300" : "bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700"
2606
+ activeStatuses.value.includes(opt.value) ? opt.color === "green" ? "bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400" : opt.color === "red" ? "bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400" : opt.color === "orange" ? "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400" : "bg-zinc-200 text-zinc-700 dark:bg-zinc-700 dark:text-zinc-300" : "bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 hover:bg-zinc-200 dark:hover:bg-zinc-700"
2427
2607
  ],
2428
2608
  onClick: ($event) => toggleStatus(opt.value)
2429
2609
  }, [
2430
2610
  createVNode("span", {
2431
2611
  class: [
2432
2612
  "size-2 rounded-full shrink-0",
2433
- opt.color === "green" ? "bg-green-500" : opt.color === "red" ? "bg-red-500" : opt.color === "orange" ? "bg-orange-500" : "bg-gray-400"
2613
+ opt.color === "green" ? "bg-emerald-500" : opt.color === "red" ? "bg-rose-500" : opt.color === "orange" ? "bg-orange-500" : "bg-zinc-400"
2434
2614
  ]
2435
2615
  }, null, 2),
2436
2616
  createTextVNode(" " + toDisplayString(opt.label), 1)
@@ -2457,7 +2637,30 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2457
2637
  "onUpdate:modelValue": ($event) => showNewFlakyOnly.value = $event,
2458
2638
  label: "New flaky",
2459
2639
  size: "sm"
2460
- }, null, 8, ["modelValue", "onUpdate:modelValue"])) : createCommentVNode("", true)
2640
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])) : createCommentVNode("", true),
2641
+ !unref(treeView) ? (openBlock(), createBlock("div", {
2642
+ key: 2,
2643
+ class: "flex items-center gap-1 md:hidden"
2644
+ }, [
2645
+ createVNode(_component_USelect, {
2646
+ modelValue: mobileSortKey.value,
2647
+ "onUpdate:modelValue": ($event) => mobileSortKey.value = $event,
2648
+ items: sortOptions.value,
2649
+ size: "sm",
2650
+ class: "w-32",
2651
+ "aria-label": "Sort cases by"
2652
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "items"]),
2653
+ createVNode(_component_UButton, {
2654
+ size: "sm",
2655
+ variant: "outline",
2656
+ color: "neutral",
2657
+ disabled: sortKey.value === null,
2658
+ icon: sortDir.value === "asc" ? "i-lucide-arrow-up-narrow-wide" : "i-lucide-arrow-down-wide-narrow",
2659
+ title: sortDir.value === "asc" ? "Sorted ascending" : "Sorted descending",
2660
+ "aria-label": sortDir.value === "asc" ? "Sorted ascending" : "Sorted descending",
2661
+ onClick: ($event) => sortDir.value = sortDir.value === "asc" ? "desc" : "asc"
2662
+ }, null, 8, ["disabled", "icon", "title", "aria-label", "onClick"])
2663
+ ])) : createCommentVNode("", true)
2461
2664
  ];
2462
2665
  }
2463
2666
  }),
@@ -2476,7 +2679,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2476
2679
  } else if (!unref(treeView)) {
2477
2680
  _push(`<!--[-->`);
2478
2681
  if (sortedTestCases.value.length > 0) {
2479
- _push(`<div class="flex-1 min-h-0 max-lg:h-[70dvh] overflow-x-auto overflow-y-hidden rounded-lg border border-default"><div class="flex flex-col h-full" role="table" aria-label="Test cases"${ssrRenderAttr("aria-rowcount", sortedTestCases.value.length + 1)} style="${ssrRenderStyle({ minWidth: gridMinWidth.value })}"><div class="grid shrink-0 bg-elevated/50 border-b border-default" role="row" style="${ssrRenderStyle({ gridTemplateColumns: gridTemplate.value })}"><!--[-->`);
2682
+ _push(`<div class="flex-1 min-h-0 max-lg:h-[70dvh] md:overflow-x-auto overflow-y-hidden rounded-lg border border-default bg-default"><div class="flex flex-col h-full md:min-w-(--grid-min-width)" role="table" aria-label="Test cases"${ssrRenderAttr("aria-rowcount", sortedTestCases.value.length + 1)} style="${ssrRenderStyle({ "--grid-min-width": gridMinWidth.value })}"><div class="hidden md:grid shrink-0 bg-elevated/50 border-b border-default" role="row" style="${ssrRenderStyle({ gridTemplateColumns: gridTemplate.value })}"><!--[-->`);
2480
2683
  ssrRenderList(columns.value, (col) => {
2481
2684
  _push(`<!--[-->`);
2482
2685
  if (col.sortable) {
@@ -2503,7 +2706,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2503
2706
  _push(ssrRenderComponent(_component_ClientOnly, null, {
2504
2707
  fallback: withCtx((_, _push2, _parent2, _scopeId) => {
2505
2708
  if (_push2) {
2506
- _push2(`<div class="flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-gray-500"${_scopeId}>`);
2709
+ _push2(`<div class="flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-zinc-500"${_scopeId}>`);
2507
2710
  _push2(ssrRenderComponent(_component_UIcon, {
2508
2711
  name: "i-lucide-loader-circle",
2509
2712
  class: "size-4 mr-2 animate-spin"
@@ -2511,7 +2714,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2511
2714
  _push2(` Loading test cases… </div>`);
2512
2715
  } else {
2513
2716
  return [
2514
- createVNode("div", { class: "flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-gray-500" }, [
2717
+ createVNode("div", { class: "flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-zinc-500" }, [
2515
2718
  createVNode(_component_UIcon, {
2516
2719
  name: "i-lucide-loader-circle",
2517
2720
  class: "size-4 mr-2 animate-spin"
@@ -2524,17 +2727,17 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2524
2727
  }, _parent));
2525
2728
  _push(`</div></div>`);
2526
2729
  } else if (__props.testCases.length === 0) {
2527
- _push(`<div class="text-center py-10 text-gray-500">`);
2730
+ _push(`<div class="text-center py-10 text-zinc-500">`);
2528
2731
  _push(ssrRenderComponent(_component_UIcon, {
2529
2732
  name: "i-lucide-beaker",
2530
- class: "size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"
2733
+ class: "size-8 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"
2531
2734
  }, null, _parent));
2532
2735
  _push(`<p>No test cases recorded for this run.</p></div>`);
2533
2736
  } else {
2534
- _push(`<div class="text-center py-10 text-gray-500">`);
2737
+ _push(`<div class="text-center py-10 text-zinc-500">`);
2535
2738
  _push(ssrRenderComponent(_component_UIcon, {
2536
2739
  name: "i-lucide-search-x",
2537
- class: "size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"
2740
+ class: "size-8 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"
2538
2741
  }, null, _parent));
2539
2742
  _push(`<p>No test cases match your filters.</p></div>`);
2540
2743
  }
@@ -2624,9 +2827,9 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
2624
2827
  const _component_ErrorState = __nuxt_component_5$1;
2625
2828
  const _component_UButton = _sfc_main$k;
2626
2829
  const _component_LoadingState = __nuxt_component_1$1;
2627
- const _component_EmptyState = __nuxt_component_8$1;
2830
+ const _component_EmptyState = __nuxt_component_4$1;
2628
2831
  const _component_UIcon = _sfc_main$p;
2629
- const _component_HelpHint = __nuxt_component_2$1;
2832
+ const _component_HelpHint = __nuxt_component_2$2;
2630
2833
  const _component_SectionCard = __nuxt_component_11;
2631
2834
  const _component_NuxtLink = __nuxt_component_12$1;
2632
2835
  const _component_UBadge = _sfc_main$7$1;
@@ -3649,14 +3852,14 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3649
3852
  const totalCases = computed(() => groups.value?.reduce((sum, g) => sum + g.caseCount, 0) ?? 0);
3650
3853
  return (_ctx, _push, _parent, _attrs) => {
3651
3854
  const _component_UIcon = _sfc_main$p;
3652
- const _component_HelpHint = __nuxt_component_2$1;
3855
+ const _component_HelpHint = __nuxt_component_2$2;
3653
3856
  const _component_UButton = _sfc_main$k;
3654
- const _component_UCard = _sfc_main$l;
3857
+ const _component_UCard = _sfc_main$m;
3655
3858
  const _component_TableScroller = __nuxt_component_3$2;
3656
- const _component_UTable = _sfc_main$h;
3859
+ const _component_UTable = _sfc_main$i;
3657
3860
  const _component_UBadge = _sfc_main$7$1;
3658
3861
  const _component_NuxtLink = __nuxt_component_12$1;
3659
- const _component_UModal = _sfc_main$m;
3862
+ const _component_UModal = _sfc_main$n;
3660
3863
  const _component_ClusterDiagnosis = __nuxt_component_9;
3661
3864
  _push(`<!--[--><div class="pt-4 space-y-3">`);
3662
3865
  if (unref(loading)) {
@@ -4780,12 +4983,12 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
4780
4983
  }
4781
4984
  return (_ctx, _push, _parent, _attrs) => {
4782
4985
  const _component_LoadingState = __nuxt_component_1$1;
4783
- const _component_EmptyState = __nuxt_component_8$1;
4986
+ const _component_EmptyState = __nuxt_component_4$1;
4784
4987
  const _component_UIcon = _sfc_main$p;
4785
- const _component_HelpHint = __nuxt_component_2$1;
4988
+ const _component_HelpHint = __nuxt_component_2$2;
4786
4989
  const _component_NuxtLink = __nuxt_component_12$1;
4787
4990
  const _component_UBadge = _sfc_main$7$1;
4788
- const _component_UCard = _sfc_main$l;
4991
+ const _component_UCard = _sfc_main$m;
4789
4992
  const _component_UButton = _sfc_main$k;
4790
4993
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "pt-4" }, _attrs))}>`);
4791
4994
  if (unref(loading)) {
@@ -5144,10 +5347,10 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
5144
5347
  emits: ["reset", "toggleSpan"],
5145
5348
  setup(__props) {
5146
5349
  return (_ctx, _push, _parent, _attrs) => {
5147
- const _component_HelpHint = __nuxt_component_2$1;
5350
+ const _component_HelpHint = __nuxt_component_2$2;
5148
5351
  const _component_UPopover = _sfc_main$8$1;
5149
5352
  const _component_UButton = _sfc_main$k;
5150
- const _component_UCheckbox = _sfc_main$o;
5353
+ const _component_UCheckbox = _sfc_main$q;
5151
5354
  _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" : "")} `);
5152
5355
  if (__props.shardTotal && __props.shardTotal > 1) {
5153
5356
  _push(`<!--[--> · ${ssrInterpolate(__props.shardTotal)} shard${ssrInterpolate(__props.shardTotal > 1 ? "s" : "")}<!--]-->`);
@@ -6048,15 +6251,16 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6048
6251
  }
6049
6252
  ];
6050
6253
  return (_ctx, _push, _parent, _attrs) => {
6051
- const _component_USelectMenu = _sfc_main$i;
6254
+ const _component_USelectMenu = _sfc_main$j;
6052
6255
  const _component_RunStatusBadge = __nuxt_component_13$1;
6053
6256
  const _component_UButton = _sfc_main$k;
6054
6257
  const _component_UIcon = _sfc_main$p;
6055
- const _component_UAlert = _sfc_main$j;
6258
+ const _component_UAlert = _sfc_main$l;
6056
6259
  const _component_MarkerBadge = __nuxt_component_5;
6057
6260
  const _component_UBadge = _sfc_main$7$1;
6058
6261
  const _component_TableScroller = __nuxt_component_3$2;
6059
- const _component_UTable = _sfc_main$h;
6262
+ const _component_UTable = _sfc_main$i;
6263
+ const _component_DurationValue = __nuxt_component_14$1;
6060
6264
  _push(`<div${ssrRenderAttrs(_attrs)}>`);
6061
6265
  if (__props.testRun && !isLive.value) {
6062
6266
  _push(`<div class="space-y-4"><div class="grid grid-cols-1 md:grid-cols-2 gap-4"><div><label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Run A (baseline)</label>`);
@@ -6274,6 +6478,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6274
6478
  } else {
6275
6479
  _push3(ssrRenderComponent(_component_UBadge, {
6276
6480
  color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(row.original.statusA),
6481
+ variant: "subtle",
6277
6482
  class: "capitalize"
6278
6483
  }, {
6279
6484
  default: withCtx((_2, _push4, _parent4, _scopeId3) => {
@@ -6296,6 +6501,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6296
6501
  }, "—")) : (openBlock(), createBlock(_component_UBadge, {
6297
6502
  key: 1,
6298
6503
  color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(row.original.statusA),
6504
+ variant: "subtle",
6299
6505
  class: "capitalize"
6300
6506
  }, {
6301
6507
  default: withCtx(() => [
@@ -6313,6 +6519,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6313
6519
  } else {
6314
6520
  _push3(ssrRenderComponent(_component_UBadge, {
6315
6521
  color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(row.original.statusB),
6522
+ variant: "subtle",
6316
6523
  class: "capitalize"
6317
6524
  }, {
6318
6525
  default: withCtx((_2, _push4, _parent4, _scopeId3) => {
@@ -6335,6 +6542,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6335
6542
  }, "—")) : (openBlock(), createBlock(_component_UBadge, {
6336
6543
  key: 1,
6337
6544
  color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(row.original.statusB),
6545
+ variant: "subtle",
6338
6546
  class: "capitalize"
6339
6547
  }, {
6340
6548
  default: withCtx(() => [
@@ -6348,13 +6556,18 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6348
6556
  "durationA-cell": withCtx(({ row }, _push3, _parent3, _scopeId2) => {
6349
6557
  if (_push3) {
6350
6558
  if (row.original.durationA !== null) {
6351
- _push3(`<span${_scopeId2}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.durationA))}</span>`);
6559
+ _push3(ssrRenderComponent(_component_DurationValue, {
6560
+ ms: row.original.durationA
6561
+ }, null, _parent3, _scopeId2));
6352
6562
  } else {
6353
6563
  _push3(`<span class="text-gray-400"${_scopeId2}>—</span>`);
6354
6564
  }
6355
6565
  } else {
6356
6566
  return [
6357
- row.original.durationA !== null ? (openBlock(), createBlock("span", { key: 0 }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.durationA)), 1)) : (openBlock(), createBlock("span", {
6567
+ row.original.durationA !== null ? (openBlock(), createBlock(_component_DurationValue, {
6568
+ key: 0,
6569
+ ms: row.original.durationA
6570
+ }, null, 8, ["ms"])) : (openBlock(), createBlock("span", {
6358
6571
  key: 1,
6359
6572
  class: "text-gray-400"
6360
6573
  }, "—"))
@@ -6364,13 +6577,18 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6364
6577
  "durationB-cell": withCtx(({ row }, _push3, _parent3, _scopeId2) => {
6365
6578
  if (_push3) {
6366
6579
  if (row.original.durationB !== null) {
6367
- _push3(`<span${_scopeId2}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.durationB))}</span>`);
6580
+ _push3(ssrRenderComponent(_component_DurationValue, {
6581
+ ms: row.original.durationB
6582
+ }, null, _parent3, _scopeId2));
6368
6583
  } else {
6369
6584
  _push3(`<span class="text-gray-400"${_scopeId2}>—</span>`);
6370
6585
  }
6371
6586
  } else {
6372
6587
  return [
6373
- row.original.durationB !== null ? (openBlock(), createBlock("span", { key: 0 }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.durationB)), 1)) : (openBlock(), createBlock("span", {
6588
+ row.original.durationB !== null ? (openBlock(), createBlock(_component_DurationValue, {
6589
+ key: 0,
6590
+ ms: row.original.durationB
6591
+ }, null, 8, ["ms"])) : (openBlock(), createBlock("span", {
6374
6592
  key: 1,
6375
6593
  class: "text-gray-400"
6376
6594
  }, "—"))
@@ -6384,7 +6602,12 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6384
6602
  } else {
6385
6603
  _push3(`<span class="${ssrRenderClass(
6386
6604
  row.original.delta > 0 ? "text-red-600" : row.original.delta < 0 ? "text-green-600" : "text-gray-500"
6387
- )}"${_scopeId2}>${ssrInterpolate(row.original.delta > 0 ? "+" : "")}${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.delta))}</span>`);
6605
+ )}"${_scopeId2}>${ssrInterpolate(row.original.delta > 0 ? "+" : "")}`);
6606
+ _push3(ssrRenderComponent(_component_DurationValue, {
6607
+ ms: row.original.delta,
6608
+ "unit-class": "opacity-60"
6609
+ }, null, _parent3, _scopeId2));
6610
+ _push3(`</span>`);
6388
6611
  }
6389
6612
  } else {
6390
6613
  return [
@@ -6394,7 +6617,13 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6394
6617
  }, "—")) : (openBlock(), createBlock("span", {
6395
6618
  key: 1,
6396
6619
  class: row.original.delta > 0 ? "text-red-600" : row.original.delta < 0 ? "text-green-600" : "text-gray-500"
6397
- }, toDisplayString(row.original.delta > 0 ? "+" : "") + toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.delta)), 3))
6620
+ }, [
6621
+ createTextVNode(toDisplayString(row.original.delta > 0 ? "+" : ""), 1),
6622
+ createVNode(_component_DurationValue, {
6623
+ ms: row.original.delta,
6624
+ "unit-class": "opacity-60"
6625
+ }, null, 8, ["ms"])
6626
+ ], 2))
6398
6627
  ];
6399
6628
  }
6400
6629
  }),
@@ -6441,6 +6670,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6441
6670
  }, "—")) : (openBlock(), createBlock(_component_UBadge, {
6442
6671
  key: 1,
6443
6672
  color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(row.original.statusA),
6673
+ variant: "subtle",
6444
6674
  class: "capitalize"
6445
6675
  }, {
6446
6676
  default: withCtx(() => [
@@ -6456,6 +6686,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6456
6686
  }, "—")) : (openBlock(), createBlock(_component_UBadge, {
6457
6687
  key: 1,
6458
6688
  color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(row.original.statusB),
6689
+ variant: "subtle",
6459
6690
  class: "capitalize"
6460
6691
  }, {
6461
6692
  default: withCtx(() => [
@@ -6465,13 +6696,19 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6465
6696
  }, 1032, ["color"]))
6466
6697
  ]),
6467
6698
  "durationA-cell": withCtx(({ row }) => [
6468
- row.original.durationA !== null ? (openBlock(), createBlock("span", { key: 0 }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.durationA)), 1)) : (openBlock(), createBlock("span", {
6699
+ row.original.durationA !== null ? (openBlock(), createBlock(_component_DurationValue, {
6700
+ key: 0,
6701
+ ms: row.original.durationA
6702
+ }, null, 8, ["ms"])) : (openBlock(), createBlock("span", {
6469
6703
  key: 1,
6470
6704
  class: "text-gray-400"
6471
6705
  }, "—"))
6472
6706
  ]),
6473
6707
  "durationB-cell": withCtx(({ row }) => [
6474
- row.original.durationB !== null ? (openBlock(), createBlock("span", { key: 0 }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.durationB)), 1)) : (openBlock(), createBlock("span", {
6708
+ row.original.durationB !== null ? (openBlock(), createBlock(_component_DurationValue, {
6709
+ key: 0,
6710
+ ms: row.original.durationB
6711
+ }, null, 8, ["ms"])) : (openBlock(), createBlock("span", {
6475
6712
  key: 1,
6476
6713
  class: "text-gray-400"
6477
6714
  }, "—"))
@@ -6483,7 +6720,13 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6483
6720
  }, "—")) : (openBlock(), createBlock("span", {
6484
6721
  key: 1,
6485
6722
  class: row.original.delta > 0 ? "text-red-600" : row.original.delta < 0 ? "text-green-600" : "text-gray-500"
6486
- }, toDisplayString(row.original.delta > 0 ? "+" : "") + toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.delta)), 3))
6723
+ }, [
6724
+ createTextVNode(toDisplayString(row.original.delta > 0 ? "+" : ""), 1),
6725
+ createVNode(_component_DurationValue, {
6726
+ ms: row.original.delta,
6727
+ "unit-class": "opacity-60"
6728
+ }, null, 8, ["ms"])
6729
+ ], 2))
6487
6730
  ]),
6488
6731
  "percentChange-cell": withCtx(({ row }) => [
6489
6732
  row.original.percentChange === null ? (openBlock(), createBlock("span", {
@@ -6603,8 +6846,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6603
6846
  ];
6604
6847
  return (_ctx, _push, _parent, _attrs) => {
6605
6848
  const _component_UIcon = _sfc_main$p;
6606
- const _component_UTable = _sfc_main$h;
6849
+ const _component_UTable = _sfc_main$i;
6607
6850
  const _component_UBadge = _sfc_main$7$1;
6851
+ const _component_DurationValue = __nuxt_component_14$1;
6608
6852
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-col overflow-hidden" }, _attrs))}>`);
6609
6853
  if (unref(loading)) {
6610
6854
  _push(`<div class="flex-1 flex items-center justify-center text-gray-500 gap-2">`);
@@ -6673,12 +6917,22 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6673
6917
  if (_push2) {
6674
6918
  _push2(`<span class="${ssrRenderClass(
6675
6919
  row.original.avgDuration > 1e3 ? "text-red-600 font-medium" : row.original.avgDuration > 500 ? "text-orange-500 font-medium" : ""
6676
- )}"${_scopeId}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.avgDuration))}</span>`);
6920
+ )}"${_scopeId}>`);
6921
+ _push2(ssrRenderComponent(_component_DurationValue, {
6922
+ ms: row.original.avgDuration,
6923
+ "unit-class": "opacity-60"
6924
+ }, null, _parent2, _scopeId));
6925
+ _push2(`</span>`);
6677
6926
  } else {
6678
6927
  return [
6679
6928
  createVNode("span", {
6680
6929
  class: row.original.avgDuration > 1e3 ? "text-red-600 font-medium" : row.original.avgDuration > 500 ? "text-orange-500 font-medium" : ""
6681
- }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.avgDuration)), 3)
6930
+ }, [
6931
+ createVNode(_component_DurationValue, {
6932
+ ms: row.original.avgDuration,
6933
+ "unit-class": "opacity-60"
6934
+ }, null, 8, ["ms"])
6935
+ ], 2)
6682
6936
  ];
6683
6937
  }
6684
6938
  }),
@@ -6686,12 +6940,22 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6686
6940
  if (_push2) {
6687
6941
  _push2(`<span class="${ssrRenderClass(
6688
6942
  row.original.p90Duration > 2e3 ? "text-red-600 font-medium" : row.original.p90Duration > 1e3 ? "text-orange-500" : ""
6689
- )}"${_scopeId}>${ssrInterpolate(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.p90Duration))}</span>`);
6943
+ )}"${_scopeId}>`);
6944
+ _push2(ssrRenderComponent(_component_DurationValue, {
6945
+ ms: row.original.p90Duration,
6946
+ "unit-class": "opacity-60"
6947
+ }, null, _parent2, _scopeId));
6948
+ _push2(`</span>`);
6690
6949
  } else {
6691
6950
  return [
6692
6951
  createVNode("span", {
6693
6952
  class: row.original.p90Duration > 2e3 ? "text-red-600 font-medium" : row.original.p90Duration > 1e3 ? "text-orange-500" : ""
6694
- }, toDisplayString(("formatDuration" in _ctx ? _ctx.formatDuration : unref(formatDuration))(row.original.p90Duration)), 3)
6953
+ }, [
6954
+ createVNode(_component_DurationValue, {
6955
+ ms: row.original.p90Duration,
6956
+ "unit-class": "opacity-60"
6957
+ }, null, 8, ["ms"])
6958
+ ], 2)
6695
6959
  ];
6696
6960
  }
6697
6961
  }),
@@ -6872,15 +7136,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
6872
7136
  value: "insights",
6873
7137
  slot: "insights"
6874
7138
  },
6875
- ...hasFailures.value ? [
6876
- {
6877
- label: `Failure groups (${failureGroupCount.value})`,
6878
- icon: "i-lucide-layers",
6879
- value: "failure-groups",
6880
- slot: "failure-groups"
6881
- }
6882
- ] : [],
6883
- ...hasFailures.value ? [{ label: "Regression", icon: "i-lucide-git-pull-request-arrow", value: "regression", slot: "regression" }] : [],
7139
+ // Failure-only tabs stay visible but disabled on a green run: tabs that
7140
+ // appear and disappear shift every other tab's position between runs.
7141
+ {
7142
+ label: hasFailures.value ? `Failure groups (${failureGroupCount.value})` : "Failure groups",
7143
+ icon: "i-lucide-layers",
7144
+ value: "failure-groups",
7145
+ slot: "failure-groups",
7146
+ disabled: !hasFailures.value
7147
+ },
7148
+ {
7149
+ label: "Regression",
7150
+ icon: "i-lucide-git-pull-request-arrow",
7151
+ value: "regression",
7152
+ slot: "regression",
7153
+ disabled: !hasFailures.value
7154
+ },
6884
7155
  {
6885
7156
  label: `Timeline${uniqueWorkerCount.value > 0 ? ` (${uniqueWorkerCount.value})` : ""}`,
6886
7157
  icon: "i-lucide-timeline",
@@ -6899,7 +7170,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
6899
7170
  "test-cases": "overflow-hidden flex flex-col",
6900
7171
  endpoints: "overflow-hidden flex flex-col"
6901
7172
  };
6902
- const runTabValues = computed(() => tabItems.value.map((t) => t.value));
7173
+ const runTabValues = computed(() => tabItems.value.filter((t) => !t.disabled).map((t) => t.value));
6903
7174
  if (typeof route.query.tab === "string" && runTabValues.value.includes(route.query.tab)) {
6904
7175
  activeTab.value = route.query.tab;
6905
7176
  }
@@ -6923,11 +7194,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
6923
7194
  }
6924
7195
  return (_ctx, _push, _parent, _attrs) => {
6925
7196
  const _component_UDashboardPanel = _sfc_main$1$1;
6926
- const _component_UDashboardNavbar = _sfc_main$f;
7197
+ const _component_UDashboardNavbar = _sfc_main$g;
6927
7198
  const _component_UDashboardSidebarCollapse = _sfc_main$1$2;
6928
7199
  const _component_BreadcrumbNav = __nuxt_component_3$1;
6929
7200
  const _component_NuxtLink = __nuxt_component_12$1;
6930
- const _component_UTooltip = _sfc_main$g;
7201
+ const _component_UTooltip = _sfc_main$h;
6931
7202
  const _component_UIcon = _sfc_main$p;
6932
7203
  const _component_NavbarActions = __nuxt_component_4;
6933
7204
  const _component_DetailPageLayout = __nuxt_component_8;
@@ -6941,7 +7212,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
6941
7212
  const _component_WorkersTimeline = __nuxt_component_16;
6942
7213
  const _component_RunCompare = __nuxt_component_17;
6943
7214
  const _component_SlowEndpoints = __nuxt_component_18;
6944
- const _component_ClientOnly = __nuxt_component_7;
7215
+ const _component_ClientOnly = __nuxt_component_7$1;
6945
7216
  _push(`<!--[-->`);
6946
7217
  _push(ssrRenderComponent(_component_UDashboardPanel, { id: "test-run-detail" }, {
6947
7218
  header: withCtx((_, _push2, _parent2, _scopeId) => {
@@ -7588,4 +7859,4 @@ _sfc_main.setup = (props, ctx) => {
7588
7859
  };
7589
7860
 
7590
7861
  export { _sfc_main as default };
7591
- //# sourceMappingURL=_id_-bWcP2xFl.mjs.map
7862
+ //# sourceMappingURL=_id_-BdJs7BJZ.mjs.map