@piwitests/server 0.26.0 → 0.26.1
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.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{BdQ7kfxJ.js → 1QWBzxLM.js} +4 -4
- package/.output/public/_nuxt/{CY1UsEbI.js → 4hW9LHwA.js} +1 -1
- package/.output/public/_nuxt/96uxfdYT.js +1 -0
- package/.output/public/_nuxt/{HGYIpJtg.js → AbnDY6Zr.js} +1 -1
- package/.output/public/_nuxt/{CZ6WR7uw.js → B-1zt4pp.js} +1 -1
- package/.output/public/_nuxt/{Sx5-c-bZ.js → B1iYmAt_.js} +1 -1
- package/.output/public/_nuxt/{CbzgEkmW.js → B2bxEmbR.js} +1 -1
- package/.output/public/_nuxt/B3hAvaCe.js +4 -0
- package/.output/public/_nuxt/{CyWOerIG.js → B4lvHjBe.js} +1 -1
- package/.output/public/_nuxt/B5S7BkC3.js +1 -0
- package/.output/public/_nuxt/{Bb_1uAHn.js → B6j5Ornu.js} +1 -1
- package/.output/public/_nuxt/{CrsaY0R_.js → B82vqOZe.js} +1 -1
- package/.output/public/_nuxt/{CTFUlsXp.js → B9oXlGro.js} +1 -1
- package/.output/public/_nuxt/{CsJ9Ce4U.js → BABCH5kE.js} +1 -1
- package/.output/public/_nuxt/{Gn1Ns00e.js → BF5qB58w.js} +1 -1
- package/.output/public/_nuxt/{CsGsLxHg.js → BFLa9ZEP.js} +1 -1
- package/.output/public/_nuxt/BIlohx1E.js +1 -0
- package/.output/public/_nuxt/{B6djubIK.js → BM5C-Oec.js} +1 -1
- package/.output/public/_nuxt/{CrZhoZuI.js → BOA-I6S9.js} +1 -1
- package/.output/public/_nuxt/{Bp2zrrkV.js → BQUhoGCh.js} +1 -1
- package/.output/public/_nuxt/{DUC3QnqW.js → BQYLGX9o.js} +1 -1
- package/.output/public/_nuxt/{CUjzhXN1.js → BRMeEHXd.js} +1 -1
- package/.output/public/_nuxt/{Cf_a8ynB.js → BRtaKOKv.js} +2 -2
- package/.output/public/_nuxt/{B7uPoZ7T.js → BS91Og__.js} +1 -1
- package/.output/public/_nuxt/{DKgbchez.js → BTGAvMoT.js} +1 -1
- package/.output/public/_nuxt/{BIamiwb7.js → BaLX92Wz.js} +1 -1
- package/.output/public/_nuxt/{LWIyaZKe.js → Bc6Zr-Xn.js} +1 -1
- package/.output/public/_nuxt/{R7AVOWi_.js → BceMEnJt.js} +1 -1
- package/.output/public/_nuxt/{Q2oJNyXL.js → BeCAVtCK.js} +1 -1
- package/.output/public/_nuxt/{D_SD71Qf.js → Bf119e7x.js} +1 -1
- package/.output/public/_nuxt/BfRcdz11.js +9 -0
- package/.output/public/_nuxt/{CxwnFFD0.js → Bl0xzETD.js} +1 -1
- package/.output/public/_nuxt/{C_eXufkv.js → BnUQ3i5l.js} +1 -1
- package/.output/public/_nuxt/{rPG7kzfL.js → Bp1WeQ0_.js} +1 -1
- package/.output/public/_nuxt/{BL8cYWsR.js → Bp31ZRcA.js} +1 -1
- package/.output/public/_nuxt/{Drh1_ASq.js → BrxUH8qL.js} +1 -1
- package/.output/public/_nuxt/{D72Ce8Ff.js → BsdfEbVC.js} +1 -1
- package/.output/public/_nuxt/BtGI4ZbP.js +1 -0
- package/.output/public/_nuxt/{BV8EzO8q.js → BuMX-4RF.js} +1 -1
- package/.output/public/_nuxt/{DPPhFZOr.js → BuXJR5tn.js} +1 -1
- package/.output/public/_nuxt/{Bh2WA4IJ.js → Bx_lfKHl.js} +1 -1
- package/.output/public/_nuxt/{vcSKeWsW.js → C4UKyPQn.js} +1 -1
- package/.output/public/_nuxt/{IoE3eJ9F.js → C9XCTbtQ.js} +1 -1
- package/.output/public/_nuxt/{BilJoEne.js → CEPU6VkU.js} +1 -1
- package/.output/public/_nuxt/CHz7LJIX.js +1 -0
- package/.output/public/_nuxt/{BPhGDGAR.js → CMhd8IBr.js} +1 -1
- package/.output/public/_nuxt/{C5X_N4R7.js → CN1M6i4K.js} +33 -33
- package/.output/public/_nuxt/CQLkowA3.js +1 -0
- package/.output/public/_nuxt/{DTtizz85.js → CU_2YLhT.js} +1 -1
- package/.output/public/_nuxt/{CMVTTE_g.js → CXkXHtcx.js} +1 -1
- package/.output/public/_nuxt/{igDJCTgt.js → CZeKW-zP.js} +1 -1
- package/.output/public/_nuxt/{9oKY4Zb7.js → CapSEET7.js} +1 -1
- package/.output/public/_nuxt/{j2eGYaRa.js → CeExxGSu.js} +1 -1
- package/.output/public/_nuxt/{CEgRB8H9.js → CfwpqSe7.js} +1 -1
- package/.output/public/_nuxt/{CFKbXp6V.js → ChOtLYkd.js} +1 -1
- package/.output/public/_nuxt/ChuJzPWz.js +1 -0
- package/.output/public/_nuxt/{Bo73sAu8.js → CiCUZGFZ.js} +1 -1
- package/.output/public/_nuxt/{C6R4tyud.js → CkL_oDa8.js} +1 -1
- package/.output/public/_nuxt/{DtGJeysS.js → CkhOMiiO.js} +1 -1
- package/.output/public/_nuxt/ClmHMP65.js +2 -0
- package/.output/public/_nuxt/{BtcDY0Du.js → Cnm0d_7S.js} +1 -1
- package/.output/public/_nuxt/{CK2AMqz_.js → CtQMagSz.js} +1 -1
- package/.output/public/_nuxt/{B1KjIR-q.js → Ctnn3S3-.js} +1 -1
- package/.output/public/_nuxt/{DCeZxpxe.js → CywiLuOD.js} +4 -4
- package/.output/public/_nuxt/{oA84LLqO.js → CzRkZLB4.js} +1 -1
- package/.output/public/_nuxt/CzyCEdYP.js +1 -0
- package/.output/public/_nuxt/{D56yp7m9.js → D-F0Rhjj.js} +1 -1
- package/.output/public/_nuxt/D4mPjHHR.js +2 -0
- package/.output/public/_nuxt/{BsGvSoPC.js → D4v7lLm3.js} +1 -1
- package/.output/public/_nuxt/{CxRTKV-K.js → D6B0WKO0.js} +1 -1
- package/.output/public/_nuxt/{jv8U_Tup.js → DAg6jtav.js} +1 -1
- package/.output/public/_nuxt/DBXXb0w8.js +1 -0
- package/.output/public/_nuxt/{ChlP20A5.js → DHN2t5Vt.js} +1 -1
- package/.output/public/_nuxt/{B8tezsWe.js → DJKHXfNS.js} +1 -1
- package/.output/public/_nuxt/{CFg5qdS0.js → DMqAUHFN.js} +1 -1
- package/.output/public/_nuxt/{C9A3sPDo.js → DURme_kn.js} +1 -1
- package/.output/public/_nuxt/{C2hIM5f9.js → DVo_e_uj.js} +1 -1
- package/.output/public/_nuxt/{DKhqIou2.js → DXh8q5KY.js} +1 -1
- package/.output/public/_nuxt/{CZXeJs2k.js → DXz1Kb4-.js} +1 -1
- package/.output/public/_nuxt/{CPrVhXJk.js → DYdwHaco.js} +1 -1
- package/.output/public/_nuxt/{WZXZeGYt.js → D_ZAGxCQ.js} +1 -1
- package/.output/public/_nuxt/{D5SN7rPK.js → D_dhjJvR.js} +1 -1
- package/.output/public/_nuxt/{DR1jFptD.js → DamZHy5M.js} +1 -1
- package/.output/public/_nuxt/{xKX9IHe3.js → DbtjJCra.js} +1 -1
- package/.output/public/_nuxt/{r6zkA1SE.js → DcOlL-oi.js} +1 -1
- package/.output/public/_nuxt/{CxspCKpR.js → DeQ9sIia.js} +1 -1
- package/.output/public/_nuxt/{BkHJoHpc.js → DjX1bLZD.js} +1 -1
- package/.output/public/_nuxt/{Be0bwdsi.js → Dly7wCCl.js} +1 -1
- package/.output/public/_nuxt/DmeogbGY.js +1 -0
- package/.output/public/_nuxt/{CfV2N201.js → Dn_-RkxP.js} +1 -1
- package/.output/public/_nuxt/{dg6uXTyR.js → DoDo3VF2.js} +1 -1
- package/.output/public/_nuxt/{BMlKQMjM.js → DoVHTl-K.js} +1 -1
- package/.output/public/_nuxt/DpM8IgHL.js +1 -0
- package/.output/public/_nuxt/{B4NjylBn.js → Dpwj_1H5.js} +1 -1
- package/.output/public/_nuxt/{DzJa19LG.js → DvSHenmZ.js} +1 -1
- package/.output/public/_nuxt/DvYU87_a.js +1 -0
- package/.output/public/_nuxt/{G2J1dVVb.js → Dx41arC8.js} +1 -1
- package/.output/public/_nuxt/DxBrlj7b.js +1 -0
- package/.output/public/_nuxt/{r-HZNbp3.js → JNpNdV-o.js} +1 -1
- package/.output/public/_nuxt/Lz9MmwKY.js +1 -0
- package/.output/public/_nuxt/OMI0cmZ0.js +1 -0
- package/.output/public/_nuxt/{CUWrUpTl.js → UAmyrRCI.js} +1 -1
- package/.output/public/_nuxt/{EJllK0wm.js → VBTxfbqU.js} +1 -1
- package/.output/public/_nuxt/VbedPPFH.js +1 -0
- package/.output/public/_nuxt/{BY9A1aOT.js → _okd7MfH.js} +1 -1
- package/.output/public/_nuxt/{BOn5q0rT.js → bmAf49LT.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/0174ebd8-8fa5-4698-aa79-7a8dd2f6527f.json +1 -0
- package/.output/public/_nuxt/{D0XWJGhG.js → e-GZmCeP.js} +1 -1
- package/.output/public/_nuxt/entry.Dv52uAyn.css +1 -0
- package/.output/public/_nuxt/{DVIIj6Vv.js → f9TbT3AM.js} +1 -1
- package/.output/public/_nuxt/gdlHFfN6.js +1 -0
- package/.output/public/_nuxt/{BTG_PmM5.js → huBoAZeM.js} +1 -1
- package/.output/public/_nuxt/{DadksxQ9.js → mYw4b7uY.js} +1 -1
- package/.output/public/_nuxt/{B0eHOux4.js → mi7tdFxN.js} +1 -1
- package/.output/public/_nuxt/sFe4Zr5j.js +1 -0
- package/.output/public/_nuxt/{CLrLFf3s.js → uspGXbik.js} +1 -1
- package/.output/public/_nuxt/{DLN-CQXF.js → w7KxwWEv.js} +1 -1
- package/.output/public/_nuxt/{Bp55g9gr.js → wa4k1aDz.js} +1 -1
- package/.output/public/_nuxt/{C2yZcDch.js → xuB8n0QL.js} +1 -1
- package/.output/public/favicon.ico +0 -0
- package/.output/public/trace-viewer/assets/codeMirrorModule-LEHpjmcn.js +32 -0
- package/.output/public/trace-viewer/assets/defaultSettingsView-BNmKHKpQ.js +264 -0
- package/.output/public/trace-viewer/assets/urlMatch-BYQrIQwR.js +1 -0
- package/.output/public/trace-viewer/assets/xtermModule-CsJ4vdCR.js +9 -0
- package/.output/public/trace-viewer/codeMirrorModule.DYBRYzYX.css +1 -0
- package/.output/public/trace-viewer/codicon.DCmgc-ay.ttf +0 -0
- package/.output/public/trace-viewer/defaultSettingsView.CjdS-WJx.css +1 -0
- package/.output/public/trace-viewer/index.CzXZzn5A.css +1 -0
- package/.output/public/trace-viewer/index.DMMX1gXU.js +2 -0
- package/.output/public/trace-viewer/index.html +44 -0
- package/.output/public/trace-viewer/manifest.webmanifest +16 -0
- package/.output/public/trace-viewer/playwright-logo.svg +9 -0
- package/.output/public/trace-viewer/snapshot.html +10 -0
- package/.output/public/trace-viewer/snapshot.v8KI4P3m.js +2 -0
- package/.output/public/trace-viewer/sw.bundle.js +5 -0
- package/.output/public/trace-viewer/uiMode.BZQ54Kgt.css +1 -0
- package/.output/public/trace-viewer/uiMode.Ut8wwJNp.js +6 -0
- package/.output/public/trace-viewer/uiMode.html +18 -0
- package/.output/public/trace-viewer/xtermModule.DYP7pi_n.css +32 -0
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{BreadcrumbNav-DBnGj5Jq.mjs → BreadcrumbNav-Bg4QGX0k.mjs} +11 -4
- package/.output/server/chunks/build/BreadcrumbNav-Bg4QGX0k.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-vFb1ERG_.mjs → BrowserBadge-yMgLTBUu.mjs} +17 -9
- package/.output/server/chunks/build/BrowserBadge-yMgLTBUu.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartMarkerLines-BXqUpUcs.mjs → ChartMarkerLines-D0cTRlxF.mjs} +3 -3
- package/.output/server/chunks/build/ChartMarkerLines-D0cTRlxF.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartTooltip-DoF6Smyc.mjs → ChartTooltip-B2t6VYYH.mjs} +3 -3
- package/.output/server/chunks/build/ChartTooltip-B2t6VYYH.mjs.map +1 -0
- package/.output/server/chunks/build/Checkbox-ChSYhiUz.mjs +1 -1
- package/.output/server/chunks/build/ClientDate-U97Z1p6-.mjs +32 -0
- package/.output/server/chunks/build/ClientDate-U97Z1p6-.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-CmvKHaq8.mjs → CodeBlock-DuWhmcI2.mjs} +3 -3
- package/.output/server/chunks/build/CodeBlock-DuWhmcI2.mjs.map +1 -0
- package/.output/server/chunks/build/DashboardSidebarToggle-a5KYecZ0.mjs +1 -1
- package/.output/server/chunks/build/DashboardToolbar-BZoGc0ri.mjs +72 -0
- package/.output/server/chunks/build/DashboardToolbar-BZoGc0ri.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-ChV02QJj.mjs → DataLocationCard-DCdhQBIY.mjs} +2 -2
- package/.output/server/chunks/build/DataLocationCard-DCdhQBIY.mjs.map +1 -0
- package/.output/server/chunks/build/{DesktopRunLocallyButton-BfmbZpiL.mjs → DesktopRunLocallyButton-ChHg3GqK.mjs} +5 -5
- package/.output/server/chunks/build/{DesktopRunLocallyButton-BfmbZpiL.mjs.map → DesktopRunLocallyButton-ChHg3GqK.mjs.map} +1 -1
- package/.output/server/chunks/build/{DiagnosisPanel-C_ndadzP.mjs → DiagnosisPanel-DE-r2UV8.mjs} +5 -5
- package/.output/server/chunks/build/DiagnosisPanel-DE-r2UV8.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisResult-GAjo6Lt3.mjs → DiagnosisResult-CrGK--xh.mjs} +16 -10
- package/.output/server/chunks/build/DiagnosisResult-CrGK--xh.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-CObiBDnH.mjs → DurationValue-Dn06XQk3.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-Dn06XQk3.mjs.map +1 -0
- package/.output/server/chunks/build/EntityLinks-BcpvMt_V.mjs +1 -1
- package/.output/server/chunks/build/EnvManagedBadge-_8GfjWjE.mjs +1 -1
- package/.output/server/chunks/build/{FeatureUnavailable-Buoyoqx1.mjs → FeatureUnavailable-IaBjVCqQ.mjs} +2 -2
- package/.output/server/chunks/build/FeatureUnavailable-IaBjVCqQ.mjs.map +1 -0
- package/.output/server/chunks/build/{GetStartedWizard-tL3U_qM1.mjs → GetStartedWizard-BiyxEXWP.mjs} +3 -3
- package/.output/server/chunks/build/GetStartedWizard-BiyxEXWP.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-C96TlqxY.mjs → HelpHint-CdBz6deq.mjs} +2 -2
- package/.output/server/chunks/build/HelpHint-CdBz6deq.mjs.map +1 -0
- package/.output/server/chunks/build/{MetaStripGroup-Cp2WCQf7.mjs → MetaStripGroup-CDyGlsNt.mjs} +94 -21
- package/.output/server/chunks/build/MetaStripGroup-CDyGlsNt.mjs.map +1 -0
- package/.output/server/chunks/build/{NavbarActions-VCHW0u67.mjs → NavbarActions-BTWxKCVI.mjs} +2 -2
- package/.output/server/chunks/build/NavbarActions-BTWxKCVI.mjs.map +1 -0
- package/.output/server/chunks/build/NavigationMenu-D4ZpdCm_.mjs +1 -1
- package/.output/server/chunks/build/OpenInIdeLink-Bnl-_som.mjs +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-saHYJoyQ.mjs → ProjectTestCasesTable-DJDAZ9NQ.mjs} +9 -9
- package/.output/server/chunks/build/ProjectTestCasesTable-DJDAZ9NQ.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-CKYYRC59.mjs → RunReports-BSo2cCNx.mjs} +4 -4
- package/.output/server/chunks/build/RunReports-BSo2cCNx.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-CWhmAmKb.mjs → RunStatusBadge-zfeSwcTx.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-zfeSwcTx.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-BB1O3uXd.mjs → SectionCard-CKD1s0eF.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-CKD1s0eF.mjs.map +1 -0
- package/.output/server/chunks/build/Select-COU8NARj.mjs +1 -1
- package/.output/server/chunks/build/SelectMenu-BUwwc3Qt.mjs +1 -1
- package/.output/server/chunks/build/{SettingsField-CEasBHu3.mjs → SettingsField-CDnUtiCM.mjs} +3 -3
- package/.output/server/chunks/build/SettingsField-CDnUtiCM.mjs.map +1 -0
- package/.output/server/chunks/build/Table-BET-DOtX.mjs +1 -1
- package/.output/server/chunks/build/{TestCaseHistoryChart-BgI6P_zS.mjs → TestCaseHistoryChart-Do7WK-ZY.mjs} +16 -17
- package/.output/server/chunks/build/TestCaseHistoryChart-Do7WK-ZY.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-DR8jM5th.mjs → TestStatusBar-BipoEOzd.mjs} +15 -6
- package/.output/server/chunks/build/TestStatusBar-BipoEOzd.mjs.map +1 -0
- package/.output/server/chunks/build/Tooltip-CK0ucuXC.mjs +1 -1
- package/.output/server/chunks/build/{_id_-rQhFY0fN.mjs → _id_-BLPB189b.mjs} +16 -16
- package/.output/server/chunks/build/{_id_-rQhFY0fN.mjs.map → _id_-BLPB189b.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-kkexEH_q.mjs → _id_-BeGJOSxY.mjs} +16 -16
- package/.output/server/chunks/build/_id_-BeGJOSxY.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-B7Dw490u.mjs → _id_-CfLEW45H.mjs} +472 -304
- package/.output/server/chunks/build/_id_-CfLEW45H.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-DVPb1S93.mjs → _id_-DxHe32cW.mjs} +654 -453
- package/.output/server/chunks/build/_id_-DxHe32cW.mjs.map +1 -0
- package/.output/server/chunks/build/{about-C4AbyQ4q.mjs → about-FLAssVsA.mjs} +5 -5
- package/.output/server/chunks/build/about-FLAssVsA.mjs.map +1 -0
- package/.output/server/chunks/build/{account-B45bYZd1.mjs → account-Cvz6KkYu.mjs} +4 -4
- package/.output/server/chunks/build/account-Cvz6KkYu.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-CgN9xXFf.mjs → ai-DR9Zry7B.mjs} +8 -8
- package/.output/server/chunks/build/{ai-CgN9xXFf.mjs.map → ai-DR9Zry7B.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-BRkiUpwa.mjs → analytics-CCAQayhv.mjs} +9 -9
- package/.output/server/chunks/build/{analytics-BRkiUpwa.mjs.map → analytics-CCAQayhv.mjs.map} +1 -1
- package/.output/server/chunks/build/{auto-heal-BnTdKHQq.mjs → auto-heal-ngiiiVmq.mjs} +4 -4
- package/.output/server/chunks/build/auto-heal-ngiiiVmq.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{default-BGOdM_zA.mjs → default-wYpdMMvh.mjs} +15 -13
- package/.output/server/chunks/build/{default-BGOdM_zA.mjs.map → default-wYpdMMvh.mjs.map} +1 -1
- package/.output/server/chunks/build/{docs-D7R5eJ1Z.mjs → docs-BX9DoKOI.mjs} +4 -4
- package/.output/server/chunks/build/{docs-D7R5eJ1Z.mjs.map → docs-BX9DoKOI.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-BbL3k6c3.mjs → edit-DnyBC4uC.mjs} +7 -7
- package/.output/server/chunks/build/{edit-BbL3k6c3.mjs.map → edit-DnyBC4uC.mjs.map} +1 -1
- package/.output/server/chunks/build/fetch-DOcN2mHf.mjs +1 -1
- package/.output/server/chunks/build/{help-content-BK3jcgLw.mjs → help-content-3QLSe6Vd.mjs} +3 -3
- package/.output/server/chunks/build/help-content-3QLSe6Vd.mjs.map +1 -0
- package/.output/server/chunks/build/{import-ibAn_HB9.mjs → import-S-w3MXez.mjs} +8 -8
- package/.output/server/chunks/build/import-S-w3MXez.mjs.map +1 -0
- package/.output/server/chunks/build/{index-D5A0DW7Y.mjs → index-BFr7JW_2.mjs} +4 -4
- package/.output/server/chunks/build/index-BFr7JW_2.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CqinXTVs.mjs → index-CdzYiYiu.mjs} +9 -9
- package/.output/server/chunks/build/{index-CqinXTVs.mjs.map → index-CdzYiYiu.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-DreB_S-d.mjs → index-CgYJur1z.mjs} +31 -23
- package/.output/server/chunks/build/index-CgYJur1z.mjs.map +1 -0
- package/.output/server/chunks/build/{index-2GmuPNF-.mjs → index-CjnZ521K.mjs} +22 -4
- package/.output/server/chunks/build/index-CjnZ521K.mjs.map +1 -0
- package/.output/server/chunks/build/{index-KsRegEjT.mjs → index-xgA4P1ht.mjs} +3218 -4087
- package/.output/server/chunks/build/index-xgA4P1ht.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs +1 -1
- package/.output/server/chunks/build/login-DueFS2RU.mjs +1 -1
- package/.output/server/chunks/build/{mcp-Dwj29-uG.mjs → mcp-DlZzubUF.mjs} +7 -7
- package/.output/server/chunks/build/mcp-DlZzubUF.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-CjAn5FJj.mjs → notifications-ByPVhyPX.mjs} +6 -6
- package/.output/server/chunks/build/notifications-ByPVhyPX.mjs.map +1 -0
- package/.output/server/chunks/build/{performance-DRzcu_c7.mjs → performance-Dc9FhaJr.mjs} +6 -6
- package/.output/server/chunks/build/performance-Dc9FhaJr.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-DR60oGBf.mjs → pr-feedback-5kC_UmKG.mjs} +4 -4
- package/.output/server/chunks/build/pr-feedback-5kC_UmKG.mjs.map +1 -0
- package/.output/server/chunks/build/{selections-BjjolRZ9.mjs → selections-C6J9mI0s.mjs} +9 -9
- package/.output/server/chunks/build/selections-C6J9mI0s.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +33 -33
- package/.output/server/chunks/build/{settings-B3NWV9tu.mjs → settings-DcCAv0U4.mjs} +17 -81
- package/.output/server/chunks/build/settings-DcCAv0U4.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DwJk8uSt.mjs → settings-metadata-B684YiW4.mjs} +2 -2
- package/.output/server/chunks/build/settings-metadata-B684YiW4.mjs.map +1 -0
- package/.output/server/chunks/build/{setup-BlgFTixN.mjs → setup-Cf3Mzf-W.mjs} +8 -8
- package/.output/server/chunks/build/{setup-BlgFTixN.mjs.map → setup-Cf3Mzf-W.mjs.map} +1 -1
- package/.output/server/chunks/build/{storage-C1O-FC0U.mjs → storage-B4VySiv3.mjs} +7 -7
- package/.output/server/chunks/build/storage-B4VySiv3.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-dsvYrnii.mjs → tags-BvWdsd1F.mjs} +25 -11
- package/.output/server/chunks/build/tags-BvWdsd1F.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-CFiOuyK6.mjs → test-cases-LIIu7dMu.mjs} +11 -11
- package/.output/server/chunks/build/test-cases-LIIu7dMu.mjs.map +1 -0
- package/.output/server/chunks/build/{test-functions-CbmBi6az.mjs → test-functions-Dv8nezrM.mjs} +8 -8
- package/.output/server/chunks/build/test-functions-Dv8nezrM.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-DPKZKHvZ.mjs → useCopyRich-DRRKIts2.mjs} +17 -14
- package/.output/server/chunks/build/{useCopyRich-DPKZKHvZ.mjs.map → useCopyRich-DRRKIts2.mjs.map} +1 -1
- package/.output/server/chunks/build/{useDesktopDownload-R_RWSgUV.mjs → useDesktopDownload-CK-5nATq.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-CK-5nATq.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopLocalRuns-BdELBy0Y.mjs → useDesktopLocalRuns-BHZic4MJ.mjs} +3 -3
- package/.output/server/chunks/build/useDesktopLocalRuns-BHZic4MJ.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopProjectLink-IUN7SIP2.mjs → useDesktopProjectLink-CqBvnXwG.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopProjectLink-CqBvnXwG.mjs.map +1 -0
- package/.output/server/chunks/build/useOpenInIde-DS4YXevu.mjs +1 -1
- package/.output/server/chunks/build/{useSettingsNav-Dg87E7kY.mjs → useSettingsNav-dyHz-2Bz.mjs} +2 -2
- package/.output/server/chunks/build/useSettingsNav-dyHz-2Bz.mjs.map +1 -0
- package/.output/server/chunks/build/{users-DgsoiXxQ.mjs → users-CluLB8DL.mjs} +31 -13
- package/.output/server/chunks/build/users-CluLB8DL.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +839 -680
- package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +5 -2
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +42 -26
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/routes/share/_token_.get.mjs +1 -1
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/3HmftUHT.js +0 -1
- package/.output/public/_nuxt/B7zo6PK8.js +0 -1
- package/.output/public/_nuxt/BO4sfkbw.js +0 -1
- package/.output/public/_nuxt/BdyXNI2_.js +0 -1
- package/.output/public/_nuxt/Bg63qh8W.js +0 -1
- package/.output/public/_nuxt/BnhWd06P.js +0 -1
- package/.output/public/_nuxt/CHWW6xiX.js +0 -1
- package/.output/public/_nuxt/CIPvUOic.js +0 -2
- package/.output/public/_nuxt/CVcFbORW.js +0 -9
- package/.output/public/_nuxt/CZlz5y13.js +0 -1
- package/.output/public/_nuxt/CkV_UG8j.js +0 -1
- package/.output/public/_nuxt/D0TpBpCc.js +0 -1
- package/.output/public/_nuxt/D3LyIeiJ.js +0 -1
- package/.output/public/_nuxt/DcccidY5.js +0 -4
- package/.output/public/_nuxt/DqkCbAzo.js +0 -1
- package/.output/public/_nuxt/DwH4SIZE.js +0 -1
- package/.output/public/_nuxt/DwZS0oRm.js +0 -2
- package/.output/public/_nuxt/DxPZIuWy.js +0 -1
- package/.output/public/_nuxt/Dyb1FouX.js +0 -1
- package/.output/public/_nuxt/builds/meta/a5fb24cc-65e3-4e55-aa12-038fe2de4754.json +0 -1
- package/.output/public/_nuxt/entry.BFe0Ua9k.css +0 -1
- package/.output/public/_nuxt/i7znB42v.js +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-DBnGj5Jq.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-vFb1ERG_.mjs.map +0 -1
- package/.output/server/chunks/build/ChartMarkerLines-BXqUpUcs.mjs.map +0 -1
- package/.output/server/chunks/build/ChartTooltip-DoF6Smyc.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-CmvKHaq8.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-ChV02QJj.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-C_ndadzP.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisResult-GAjo6Lt3.mjs.map +0 -1
- package/.output/server/chunks/build/DurationValue-CObiBDnH.mjs.map +0 -1
- package/.output/server/chunks/build/FeatureUnavailable-Buoyoqx1.mjs.map +0 -1
- package/.output/server/chunks/build/GetStartedWizard-tL3U_qM1.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-C96TlqxY.mjs.map +0 -1
- package/.output/server/chunks/build/MetaStripGroup-Cp2WCQf7.mjs.map +0 -1
- package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-saHYJoyQ.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-CKYYRC59.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-CWhmAmKb.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-BB1O3uXd.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-CEasBHu3.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-BgI6P_zS.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-DR8jM5th.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-B7Dw490u.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-DVPb1S93.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-kkexEH_q.mjs.map +0 -1
- package/.output/server/chunks/build/about-C4AbyQ4q.mjs.map +0 -1
- package/.output/server/chunks/build/account-B45bYZd1.mjs.map +0 -1
- package/.output/server/chunks/build/auto-heal-BnTdKHQq.mjs.map +0 -1
- package/.output/server/chunks/build/help-content-BK3jcgLw.mjs.map +0 -1
- package/.output/server/chunks/build/import-ibAn_HB9.mjs.map +0 -1
- package/.output/server/chunks/build/index-2GmuPNF-.mjs.map +0 -1
- package/.output/server/chunks/build/index-D5A0DW7Y.mjs.map +0 -1
- package/.output/server/chunks/build/index-DreB_S-d.mjs.map +0 -1
- package/.output/server/chunks/build/index-KsRegEjT.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-Dwj29-uG.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-CjAn5FJj.mjs.map +0 -1
- package/.output/server/chunks/build/performance-DRzcu_c7.mjs.map +0 -1
- package/.output/server/chunks/build/pr-feedback-DR60oGBf.mjs.map +0 -1
- package/.output/server/chunks/build/selections-BjjolRZ9.mjs.map +0 -1
- package/.output/server/chunks/build/settings-B3NWV9tu.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-DwJk8uSt.mjs.map +0 -1
- package/.output/server/chunks/build/storage-C1O-FC0U.mjs.map +0 -1
- package/.output/server/chunks/build/tags-dsvYrnii.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-CFiOuyK6.mjs.map +0 -1
- package/.output/server/chunks/build/test-functions-CbmBi6az.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopDownload-R_RWSgUV.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopLocalRuns-BdELBy0Y.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopProjectLink-IUN7SIP2.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-Dg87E7kY.mjs.map +0 -1
- package/.output/server/chunks/build/users-DgsoiXxQ.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{d as de,q as qe,O as kt,a as Ie,o,c as u,h as b,f as S,k as R,j as Le,b as t,e as V,F as ee,l as w,I as it,x as Se,g as p,z as fe,t as k,m as Re,r as J,v as z,af as tt,B as ze,G as _t,P as $t,U as Oe,ag as wt,R as ke,D as _e,_ as we,i as he,M as Ct,K as lt,ah as Pe,C as ct,a1 as nt,L as Qe,ac as Ee,H as At,V as Ne,ai as Te,S as St,ad as Tt,aj as Lt,ak as Rt,al as zt,$ as It,a0 as Pt}from"./BdQ7kfxJ.js";import{_ as Et}from"./Bh2WA4IJ.js";import{_ as Ze}from"./CZ6WR7uw.js";import{_ as Bt}from"./D0XWJGhG.js";import{_ as Ot}from"./CyWOerIG.js";import{_ as Mt}from"./CfV2N201.js";import{_ as ut}from"./CK2AMqz_.js";import{a as De,u as je}from"./DTtizz85.js";import{e as Me,a as We,w as Ut,x as Nt,y as dt,q as Ue,z as jt}from"./DwZS0oRm.js";import{_ as pt,a as Dt}from"./CrsaY0R_.js";import{_ as Kt}from"./B4NjylBn.js";import{u as Vt}from"./CsJ9Ce4U.js";import{_ as Ke}from"./BOn5q0rT.js";import{_ as Ht}from"./DadksxQ9.js";import{_ as Ft}from"./C_eXufkv.js";import{_ as qt}from"./Gn1Ns00e.js";import{u as Zt,i as Wt,b as Jt}from"./C5X_N4R7.js";import{f as Gt}from"./D-c8ZSws.js";import{_ as ft}from"./CPrVhXJk.js";import{_ as Yt}from"./HGYIpJtg.js";const Qt={key:1,class:"space-y-4"},Xt={key:1,class:"flex gap-2"},en={key:2,class:"flex items-end gap-2"},tn={key:2,class:"space-y-1.5"},nn={class:"text-xs"},on=["title"],sn=de({__name:"ShareLinksModal",props:{endpoint:{}},setup(e){const a=e,r=qe(),{copy:c}=De(),{hasRole:n}=kt(),s=ze(),l=J(!1),f=J(null),i=J([]),g=J(!1),x=J(!1),L=J(null),h=z(()=>!s.public.authEnabled||n([tt.ADMINISTRATOR,tt.REPORTER])),C=J(void 0),_=z(()=>{const A=f.value?.maxTtlDays??30,I=[1,7,30,90,365].filter(v=>A===0||v<=A),K=I.map(v=>({label:v===1?"1 day":`${v} days`,value:v}));return A===0?K.push({label:"No expiry",value:0}):I.includes(A)||K.push({label:`${A} days`,value:A}),K});Ie(l,async A=>{if(!A){L.value=null;return}g.value=!0;try{const[I,K]=await Promise.all([$fetch("/api/share-links/settings"),$fetch(a.endpoint)]);f.value=I,i.value=K.items,C.value??=I.maxTtlDays===0?0:Math.min(30,I.maxTtlDays)}catch(I){r.add({title:"Could not load share links",description:Me(I),color:"error"})}finally{g.value=!1}});async function T(){x.value=!0;try{const A=await $fetch(a.endpoint,{method:"POST",body:{ttlDays:C.value===0?null:C.value}});L.value=A.url;const I=await $fetch(a.endpoint);i.value=I.items}catch(A){r.add({title:"Could not create the share link",description:Me(A),color:"error"})}finally{x.value=!1}}async function q(A){try{await $fetch(`/api/share-links/${A.id}`,{method:"DELETE"}),r.add({title:"Share link revoked",description:`psl_${A.tokenPrefix}… no longer resolves.`,color:"success"});const I=await $fetch(a.endpoint);i.value=I.items}catch(I){r.add({title:"Could not revoke the link",description:Me(I),color:"error"})}}function U(){c(L.value,{toast:"Share link copied to clipboard"})}function G(A){return A.revokedAt?{label:"Revoked",color:"neutral"}:A.expiresAt&&new Date(A.expiresAt).getTime()<=Date.now()?{label:"Expired",color:"neutral"}:A.expiresAt?{label:`Expires ${We(A.expiresAt)}`,color:"success"}:{label:"No expiry",color:"warning"}}return(A,I)=>{const K=Le,v=Et,D=Ze,y=it,Z=Bt,M=Ot,N=Re,Q=Mt,me=ut;return o(),u(ee,null,[b(K,{icon:"i-lucide-link",size:"xs",color:"neutral",variant:"outline",title:"Hand this investigation to someone without an account",onClick:I[0]||(I[0]=te=>l.value=!0)},{default:S(()=>[...I[3]||(I[3]=[R(" Share ",-1)])]),_:1}),b(me,{open:t(l),"onUpdate:open":I[2]||(I[2]=te=>Se(l)?l.value=te:null),title:"Share links",description:"Read-only links anyone can open — no account needed."},{body:S(()=>[t(g)?(o(),V(v,{key:0,text:"Loading share links…"})):(o(),u("div",Qt,[t(f)&&!t(f).enabled?(o(),V(D,{key:0,color:"info",variant:"subtle",icon:"i-lucide-info",title:"Share links are disabled on this instance",description:"Set PIWI_SHARE_LINKS_ENABLED=true to allow minting them. Existing links stay stored but resolve to 404 while disabled."})):(o(),u(ee,{key:1},[t(L)?(o(),V(D,{key:0,color:"success",variant:"subtle",icon:"i-lucide-check",title:"Link created — copy it now",description:"For safety, the full link is shown only once. Anyone holding it can view this investigation until it expires or is revoked."})):w("",!0),t(L)?(o(),u("div",Xt,[b(y,{"model-value":t(L),readonly:"",class:"flex-1 font-mono",size:"sm"},null,8,["model-value"]),b(K,{icon:"i-lucide-copy",size:"sm",color:"neutral",variant:"outline",onClick:U},{default:S(()=>[...I[4]||(I[4]=[R("Copy",-1)])]),_:1})])):t(h)?(o(),u("div",en,[b(M,{label:"Expires after",class:"flex-1"},{default:S(()=>[b(Z,{modelValue:t(C),"onUpdate:modelValue":I[1]||(I[1]=te=>Se(C)?C.value=te:null),items:t(_),"value-key":"value",size:"sm",class:"w-full"},null,8,["modelValue","items"])]),_:1}),b(K,{icon:"i-lucide-plus",size:"sm",loading:t(x),onClick:T},{default:S(()=>[...I[5]||(I[5]=[R("Create link",-1)])]),_:1},8,["loading"])])):w("",!0)],64)),t(i).length>0?(o(),u("div",tn,[I[6]||(I[6]=p("p",{class:"text-xs font-medium text-gray-500"},"Existing links",-1)),(o(!0),u(ee,null,fe(t(i),te=>(o(),u("div",{key:te.id,class:"flex items-center gap-2 rounded-md border border-default px-2.5 py-1.5 text-sm"},[p("code",nn,"psl_"+k(te.tokenPrefix)+"…",1),b(N,{color:G(te).color,variant:"subtle",size:"sm"},{default:S(()=>[R(k(G(te).label),1)]),_:2},1032,["color"]),p("span",{class:"text-xs text-muted ml-auto",title:te.lastViewedAt??void 0},k(te.viewCount)+" "+k(te.viewCount===1?"view":"views"),9,on),t(h)&&!te.revokedAt?(o(),V(K,{key:0,icon:"i-lucide-ban",size:"xs",color:"error",variant:"ghost",title:"Revoke — the link stops resolving immediately",onClick:ce=>q(te)},null,8,["onClick"])):w("",!0)]))),128))])):t(f)?.enabled?(o(),V(Q,{key:3,text:"No share links yet for this page."})):w("",!0)]))]),_:1},8,["open"])],64)}}}),sr=Object.assign(sn,{__name:"ShareLinksModal"}),an={class:"w-64 p-1 space-y-0.5"},rn={class:"flex items-center justify-between px-2 pt-1 pb-1"},ln=de({__name:"ExportMenu",props:{endpoint:{},baseName:{}},setup(e){const a=e,{download:r}=Vt(),{copy:c}=De(),n=qe(),s=J(!1),l=J(""),f=z(()=>(ze().app?.baseURL??"/").replace(/\/$/,""));function i(C){return`${f.value}${C}`}async function g(C){s.value=!1,await r(i(`${a.endpoint}?format=${C}`),`${a.baseName}.${C}`,{binary:C==="zip"})}function x(){s.value=!1,window.open(i(`${a.endpoint}?format=html&print=1`),"_blank")}async function L(C,_,T){l.value=_;try{const q=await fetch(i(C));if(!q.ok)throw new Error(`Request failed (${q.status})`);const U=await q.text();c(T?T(U):U,{toast:`${_} copied`}),s.value=!1}catch(q){n.add({title:`Could not copy ${_.toLowerCase()}`,description:Me(q),color:"error"})}finally{l.value=""}}function h(){return L(`${a.endpoint}?format=md`,"Report")}return(C,_)=>{const T=Le,q=pt,U=Kt,G=_t;return o(),V(G,{open:t(s),"onUpdate:open":_[4]||(_[4]=A=>Se(s)?s.value=A:null)},{content:S(()=>[p("div",an,[p("div",rn,[_[6]||(_[6]=p("p",{class:"text-xs font-medium text-gray-500"},"Download",-1)),b(q,{topic:"export.offline"})]),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-code",title:"One self-contained HTML file with screenshots and video embedded",onClick:_[0]||(_[0]=A=>g("html"))},{default:S(()=>[..._[7]||(_[7]=[R(" HTML — single file ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-archive",title:"Report plus the raw artifacts, including trace archives and data.json",onClick:_[1]||(_[1]=A=>g("zip"))},{default:S(()=>[..._[8]||(_[8]=[R(" ZIP — with all evidence ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-printer",title:"Opens the report with your browser's print dialog, for Save as PDF",onClick:x},{default:S(()=>[..._[9]||(_[9]=[R(" PDF — via print ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-text",title:"The Markdown report as a file",onClick:_[2]||(_[2]=A=>g("md"))},{default:S(()=>[..._[10]||(_[10]=[R(" Markdown ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-json",title:"Everything the report contains, machine-readable",onClick:_[3]||(_[3]=A=>g("json"))},{default:S(()=>[..._[11]||(_[11]=[R(" JSON ",-1)])]),_:1}),b(U,{class:"my-1"}),_[13]||(_[13]=p("p",{class:"text-xs font-medium text-gray-500 px-2 pt-1 pb-1"},"Copy to clipboard",-1)),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-clipboard-list",loading:t(l)==="Report",title:"The whole investigation as Markdown, for an issue or a chat",onClick:h},{default:S(()=>[..._[12]||(_[12]=[R(" Report (Markdown) ",-1)])]),_:1},8,["loading"])])]),default:S(()=>[b(T,{icon:"i-lucide-share",size:"xs",color:"neutral",variant:"outline",title:"Take this investigation away"},{default:S(()=>[..._[5]||(_[5]=[R(" Export ",-1)])]),_:1})]),_:1},8,["open"])}}}),ar=Object.assign(ln,{__name:"ExportMenu"}),cn={class:"flex items-center justify-between gap-2"},un=["aria-expanded","title"],dn={class:"text-lg font-medium inline-flex items-center gap-1 shrink-0"},pn={key:2,class:"min-w-0 flex-1 truncate text-sm text-gray-500 dark:text-gray-400"},fn={key:0,class:"flex items-center gap-1 shrink-0"},mn={key:0,class:"text-sm text-gray-500 mt-1 ml-11"},gn=de({__name:"CollapsibleSectionCard",props:{title:{},icon:{},subtitle:{},count:{},iconClass:{default:"text-primary"},help:{},storageKey:{},defaultFolded:{type:Boolean,default:!0}},setup(e,{expose:a}){const r=e,{folded:c,toggle:n,setFolded:s}=Zt(`piwi-section-fold-${r.storageKey}`,r.defaultFolded),l=J(null);function f(){s(!1),Ct(()=>l.value?.scrollIntoView({behavior:"smooth",block:"start"}))}return a({setFolded:s,reveal:f}),(i,g)=>{const x=we,L=pt,h=Yt;return o(),u("div",{ref_key:"rootEl",ref:l,class:"scroll-mt-4"},[b(h,{ui:{header:"p-3 sm:px-4 sm:py-3",body:t(c)?"p-0 sm:p-0":""},class:he(t(c)&&"divide-y-0")},{header:S(()=>[p("div",cn,[p("div",{class:"flex items-center gap-2 min-w-0 flex-1 cursor-pointer select-none rounded-sm outline-none focus-visible:outline-2 focus-visible:outline-primary",role:"button",tabindex:"0","aria-expanded":!t(c),title:t(c)?"Expand section":"Collapse section",onClick:g[1]||(g[1]=(...C)=>t(n)&&t(n)(...C)),onKeydown:[g[2]||(g[2]=ke((...C)=>t(n)&&t(n)(...C),["enter"])),g[3]||(g[3]=ke(_e((...C)=>t(n)&&t(n)(...C),["prevent"]),["space"]))]},[b(x,{name:t(c)?"i-lucide-chevron-right":"i-lucide-chevron-down",class:"size-4 shrink-0 text-gray-400"},null,8,["name"]),e.icon?(o(),V(x,{key:0,name:e.icon,class:he(["size-5 shrink-0",e.iconClass])},null,8,["name","class"])):w("",!0),p("h3",dn,[R(k(e.title),1),e.count!=null?(o(),u(ee,{key:0},[R(" ("+k(e.count)+")",1)],64)):w("",!0)]),e.help?(o(),u("span",{key:1,onClick:g[0]||(g[0]=_e(()=>{},["stop"]))},[b(L,{topic:e.help},null,8,["topic"])])):w("",!0),t(c)&&i.$slots.folded?(o(),u("span",pn,[Oe(i.$slots,"folded")])):w("",!0)],40,un),i.$slots.actions?(o(),u("div",fn,[Oe(i.$slots,"actions")])):w("",!0)]),!t(c)&&(e.subtitle||i.$slots.subtitle)?(o(),u("p",mn,[Oe(i.$slots,"subtitle",{},()=>[R(k(e.subtitle),1)])])):w("",!0)]),default:S(()=>[$t(p("div",null,[Oe(i.$slots,"default")],512),[[wt,!t(c)]])]),_:3},8,["ui","class"])],512)}}}),Ve=Object.assign(gn,{__name:"CollapsibleSectionCard"}),hn=/('(?:\\.|[^'])*'|"(?:\\.|[^"])*")|([A-Za-z_$][\w$]*)(?=\s*\()|([A-Za-z_$][\w$]*)(?=\s*:)|(true|false|null|\d+)|([{}(),.])/g;function yn(e){const a=[],r=new RegExp(hn.source,"g");let c=0,n;for(;(n=r.exec(e))!==null;){n.index>c&&a.push({kind:"plain",text:e.slice(c,n.index)});const s=n[1]?"string":n[2]?"method":n[3]?"option":n[4]?"literal":"punctuation";a.push({kind:s,text:n[0]}),c=r.lastIndex}return c<e.length&&a.push({kind:"plain",text:e.slice(c)}),a}const vn=["title"],xn=de({__name:"LocatorCode",props:{locator:{},truncate:{type:Boolean,default:!1}},setup(e){const a=e,r={method:"text-violet-700 dark:text-violet-300",string:"text-green-700 dark:text-green-300",option:"text-blue-700 dark:text-blue-300",literal:"text-amber-700 dark:text-amber-300",punctuation:"text-gray-500 dark:text-gray-400",plain:""},c=z(()=>yn(a.locator));return(n,s)=>(o(),u("code",{class:he(["font-mono",e.truncate?"block truncate":"break-words"]),title:e.locator},[(o(!0),u(ee,null,fe(t(c),(l,f)=>(o(),u("span",{key:f,class:he(r[l.kind])},k(l.text),3))),128))],10,vn))}}),Xe=Object.assign(xn,{__name:"LocatorCode"}),bn={class:"overflow-x-auto text-xs font-mono"},kn=de({__name:"DiffPatch",props:{patch:{}},setup(e){return(a,r)=>(o(),u("div",bn,[(o(!0),u(ee,null,fe(("parsePatchLines"in a?a.parsePatchLines:t(Nt))(e.patch),(c,n)=>(o(),u("div",{key:n,class:he(["px-3 py-px whitespace-pre leading-5 min-w-0",("patchLineClass"in a?a.patchLineClass:t(Ut))[c.type]])},k(c.text||" "),3))),128))]))}}),_n=Object.assign(kn,{__name:"DiffPatch"}),$n=["role","aria-checked","tabindex"],wn={class:"flex-1 min-w-0"},Cn={key:0,class:"text-[11px] leading-4 text-gray-500 truncate"},An=de({__name:"LocatorAlternativeRow",props:{alt:{},note:{default:void 0},copied:{type:Boolean,default:!1},dense:{type:Boolean,default:!1},selectable:{type:Boolean,default:!1},selected:{type:Boolean,default:!1}},emits:["copy","select"],setup(e){const a=e;function r(s){return s>=80?"success":s>=50?"warning":"error"}function c(s){const{method:l,score:f,args:i}=s;return i&&(i.anchorTestId||i.anchorSelector||i.anchorRole)?"scoped to a stable ancestor — survives renames":f>=100?"most stable — purpose-built for testing":l==="getByRole"&&i&&!("name"in i)?"name-free role — survives renames":l==="getByRole"?"browser ARIA tree — semantic and stable":l==="getByLabel"?"associated <label> element":l==="getByPlaceholder"?"input placeholder":l==="getByText"?"visible text":l==="getByAltText"?"image alt text":l==="getByTitle"?"title attribute":l==="locator"&&f>=50?"stable selector":l==="locator"?"CSS class — may be fragile":""}const n=z(()=>a.note??c(a.alt));return(s,l)=>{const f=Re,i=Xe,g=we,x=Le;return o(),u("div",{class:he(["flex items-center gap-2 rounded border",[e.dense?"py-1 px-2":"py-1.5 px-2.5",e.selectable?"cursor-pointer hover:bg-elevated transition-colors focus-visible:outline-2 focus-visible:outline-primary":"",e.selectable&&e.selected?"border-primary/60 ring-1 ring-primary/50":"border-default/50"]]),role:e.selectable?"radio":void 0,"aria-checked":e.selectable?e.selected:void 0,tabindex:e.selectable?0:void 0,onClick:l[1]||(l[1]=L=>e.selectable&&s.$emit("select")),onKeydown:[l[2]||(l[2]=ke(_e(L=>e.selectable&&s.$emit("select"),["prevent"]),["enter"])),l[3]||(l[3]=ke(_e(L=>e.selectable&&s.$emit("select"),["prevent"]),["space"]))]},[b(f,{size:"xs",color:r(e.alt.score),variant:"subtle",class:he(["shrink-0 font-mono tabular-nums cursor-default text-center",e.dense?"min-w-[2.25rem]":"min-w-[2.5rem]"]),title:`Stability score: ${e.alt.score}/100`},{default:S(()=>[R(k(e.alt.score),1)]),_:1},8,["color","class","title"]),p("div",wn,[b(i,{locator:e.alt.locator,truncate:"",class:"text-xs"},null,8,["locator"]),t(n)?(o(),u("p",Cn,k(t(n)),1)):w("",!0)]),e.alt.pickedByUser&&e.dense?(o(),V(g,{key:0,name:"i-lucide-user-check",class:"size-3.5 text-primary shrink-0",title:"Confirmed with the locator picker"})):e.alt.pickedByUser?(o(),V(f,{key:1,size:"xs",color:"primary",variant:"subtle",icon:"i-lucide-user-check",class:"shrink-0",title:"Confirmed with the locator picker on the failing page"})):w("",!0),b(x,{size:"xs",variant:"ghost",color:"neutral",icon:e.copied?"i-lucide-check":"i-lucide-copy",title:e.copied?"Copied!":"Copy",class:"shrink-0",onClick:l[0]||(l[0]=_e(L=>s.$emit("copy"),["stop"]))},null,8,["icon","title"])],42,$n)}}}),mt=Object.assign(An,{__name:"LocatorAlternativeRow"}),ot={getByTestId:"testid",getByRole:"semantic",getByLabel:"label",getByPlaceholder:"label",getByText:"text",getByAltText:"text",getByTitle:"text",locator:"css","page.locator":"css"},Sn=50;function gt(e,a,r=Sn){const c=a[0]??null;if(!c)return{recommended:null,durable:null,preservesConvention:!1,hasDurableAlternative:!1,suggestAddTestId:!1};const n=e?ot[e]:void 0,s=(e?a.find(i=>i.method===e&&i.score>=r):void 0)??(n?a.find(i=>ot[i.method]===n&&i.score>=r):void 0),f=a.find(i=>i.pickedByUser)??s??c;return{recommended:f,durable:c,preservesConvention:!!s&&f===s,hasDurableAlternative:f.locator!==c.locator,suggestAddTestId:c.score<r}}const ht={a:"link",button:"button",nav:"navigation",main:"main",article:"article",section:"region",form:"form",img:"img",figure:"figure",figcaption:"caption",blockquote:"blockquote",table:"table",caption:"caption",thead:"rowgroup",tbody:"rowgroup",tfoot:"rowgroup",tr:"row",td:"cell",ul:"list",ol:"list",li:"listitem",dialog:"dialog",output:"status",progress:"progressbar",meter:"meter",textarea:"textbox",h1:"heading",h2:"heading",h3:"heading",h4:"heading",h5:"heading",h6:"heading",details:"group",summary:"button",search:"search"},Tn={button:"button",submit:"button",reset:"button",image:"button",checkbox:"checkbox",radio:"radio",range:"slider",search:"searchbox",number:"spinbutton",text:"textbox",email:"textbox",tel:"textbox",url:"textbox",password:"textbox"},Ln=["id","class","name","data-testid","placeholder","alt","title","aria-label","aria-labelledby","aria-level","role","type","href","multiple"];function Rn(e){const a=e.attributes.role;if(a)return a;const r=e.tagName;if(!r)return null;if(r==="input"){const c=(e.attributes.type??"text").toLowerCase();return Tn[c]??"textbox"}return r==="select"?e.attributes.multiple!=null?"listbox":"combobox":r==="a"?e.attributes.href!=null?"link":null:ht[r]??null}function zn(e,a){if(a!=="heading")return null;const r=e.tagName.match(/^h([1-6])$/);if(r)return Number(r[1]);const c=e.attributes["aria-level"];return c&&/^\d+$/.test(c)?Number(c):null}const Ce=(e,a)=>e.attributes[a]||null,ve=e=>e.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),Fe=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),st=e=>/^[A-Za-z][A-Za-z0-9_-]*$/.test(e);function In(e){return/[a-f0-9]{8,}/i.test(e)?10:/^(?:css|sc|emotion|styled)-/i.test(e)?15:/^(bg|text|border|shadow|opacity|font|w-|h-|m[tblrxy]?-|p[tblrxy]?-|flex|grid|gap|rounded|absolute|relative|fixed|sticky|block|inline|hidden|overflow|z-|top-|right-|bottom-|left-|inset-|justify-|items-|self-|content-|order-|col-|row-)/.test(e)?25:/__/.test(e)||/--/.test(e)?35:/^[a-z]+(-[a-z]+)+$/.test(e)||/^[a-z]+[A-Z][a-zA-Z]+$/.test(e)?40:(e.includes("_")||/^[a-z]+-[a-z0-9]{5,}$/.test(e)&&/[0-9]/.test(e),15)}function at(e){return!!(/^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/i.test(e)||/^[a-f0-9]{8,}$/i.test(e)||/^[a-z]+-\d{4,}$/.test(e)||/^(tab|panel|input|select|option|dialog|modal|popup|tooltip|menu|listbox|combobox|checkbox|radio|textarea|button|field|label|accordion|collapse|step|slider|toggle|switch|dropdown|overlay|portal|layer)-\d+$/i.test(e)||/^(emotion-|styled-|css-|sc-)/.test(e)||e.startsWith("ng-")||/^(radix-|headlessui-|mui-|mantine-|chakra-)/i.test(e)||/^:r[0-9a-z]+:$/i.test(e)||/^«r[0-9a-z]+»$/i.test(e))}const Pn=new Set(["data-test","data-test-id","data-qa","data-qa-id","data-cy","data-e2e"]);function En(e){const a=[],r=new Set,c=y=>{r.has(y.locator)||(r.add(y.locator),a.push(y))},{accessibleName:n}=e,s=e.tagName,l=Rn(e),f=e.selectorCounts,i=y=>y==null||y<=1,g=y=>y!=null&&y>1?45:0,x=e.textContent?e.textContent.replace(/\s+/g," ").trim():null,L=Ce(e,"data-testid");L&&i(f?.testId)&&c({locator:`getByTestId('${ve(L)}')`,method:"getByTestId",args:{testId:L},score:100});const h=zn(e,l),C=h!=null?`, level: ${h}`:"",_=y=>h!=null?{...y,level:h}:y;l&&n&&c({locator:`getByRole('${l}', { name: '${ve(n)}'${C} })`,method:"getByRole",args:_({role:l,name:n}),score:90-g(f?.roleName)});const T=Ce(e,"aria-label");if(l&&T&&T!==n&&c({locator:`getByRole('${l}', { name: '${ve(T)}'${C} })`,method:"getByRole",args:_({role:l,name:T}),score:85-g(f?.roleName)}),n&&["input","select","textarea"].includes(s)){const y=Ce(e,"aria-label");(e.hasLabel===void 0||e.hasLabel===!0||y===n)&&c({locator:`getByLabel('${ve(n)}')`,method:"getByLabel",args:{label:n},score:85})}const q=Ce(e,"placeholder");q&&c({locator:`getByPlaceholder('${ve(q)}')`,method:"getByPlaceholder",args:{placeholder:q},score:80-g(f?.placeholder)}),x&&x.length<80&&c({locator:`getByText('${ve(x)}')`,method:"getByText",args:{text:x},score:75-g(f?.text)});const U=Ce(e,"id");if(U&&!at(U)&&i(f?.id)){const y=st(U)?`#${U}`:`[id="${Fe(U)}"]`;c({locator:`locator('${ve(y)}')`,method:"locator",args:{selector:y},score:65})}const G=Ce(e,"name");if(G&&i(f?.name)){const y=`[name="${Fe(G)}"]`;c({locator:`locator('${ve(y)}')`,method:"locator",args:{selector:y},score:60})}const A=Ce(e,"alt");A&&c({locator:`getByAltText('${ve(A)}')`,method:"getByAltText",args:{text:A},score:60-g(f?.alt)});const I=Ce(e,"title");I&&c({locator:`getByTitle('${ve(I)}')`,method:"getByTitle",args:{title:I},score:50-g(f?.title)});const K=!!(L&&i(f?.testId)),v=(y,Z,M)=>{let N=!1,Q=!1,me=!1,te=!1,ce=!1;for(const X of e.ancestors??[]){if(Z(X)!==1)continue;if(!N&&X.testId&&X.testIdCount===1&&(N=!0,c({locator:`getByTestId('${ve(X.testId)}').${y.expr}`,method:y.method,args:{...y.args,anchorTestId:X.testId},score:M.testId})),!Q&&X.id&&!at(X.id)&&X.idCount===1){Q=!0;const j=st(X.id)?`#${X.id}`:`[id="${Fe(X.id)}"]`;c({locator:`locator('${ve(j)}').${y.expr}`,method:y.method,args:{...y.args,anchorSelector:j},score:M.id})}if(!te&&X.dataAttr&&X.dataAttrCount===1){te=!0;const{name:j,value:oe}=X.dataAttr,W=`[${j}="${Fe(oe)}"]`;c({locator:`locator('${ve(W)}').${y.expr}`,method:y.method,args:{...y.args,anchorSelector:W},score:Pn.has(j)?M.testData:M.data})}const pe=X.role||ht[X.tag]||null;!me&&pe&&pe!==y.role&&X.roleCount===1&&(me=!0,c({locator:`getByRole('${ve(pe)}').${y.expr}`,method:y.method,args:{...y.args,anchorRole:pe},score:M.role})),!ce&&pe&&X.filterText&&X.filterRoleCount===1&&(ce=!0,c({locator:`getByRole('${ve(pe)}').filter({ hasText: '${ve(X.filterText)}' }).${y.expr}`,method:y.method,args:{...y.args,anchorRole:pe,anchorHasText:X.filterText},score:M.filter}))}};if(l&&!K){const y=h!=null?`'${l}', { level: ${h} }`:`'${l}'`,Z=_({role:l});v({expr:`getByRole(${y})`,method:"getByRole",args:Z,role:l},N=>N.scopedRoleCount,{testId:72,testData:70,id:64,data:60,role:55,filter:53});const M=e.rolePosition;M&&M.role===l&&(M.count===1||h!=null&&M.levelCount===1)&&c({locator:`getByRole(${y})`,method:"getByRole",args:Z,score:58})}else!l&&x&&x.length<80&&!K&&v({expr:`getByText('${ve(x)}')`,method:"getByText",args:{text:x},role:null},y=>y.scopedTextCount,{testId:68,testData:66,id:60,data:56,role:51,filter:49});const D=Ce(e,"class");if(D){const y=f?.classes,Z=D.split(/\s+/).filter(M=>M.length>1&&/^[A-Za-z_-][A-Za-z0-9_-]*$/.test(M)&&i(y?.[M])).map(M=>({cls:M,score:In(M)})).sort((M,N)=>N.score-M.score).slice(0,3);for(const{cls:M,score:N}of Z)c({locator:`locator('.${ve(M)}')`,method:"locator",args:{selector:`.${M}`},score:N})}return a.sort((y,Z)=>Z.score-y.score)}function Bn(e){const a=e.attributes,r=a["aria-label"];if(r)return r;if(e.textContent)return e.textContent;const c=a.title;if(c)return c;const n=a.placeholder;return n||null}function On(e,a){const{keep:r,tagRoles:c,inputRoles:n,roleSources:s,includeStructural:l,includeLabelText:f}=a,i={};for(const T of r){const q=e.getAttribute(T)??e[T];i[T]=typeof q=="string"?q.slice(0,200):q?String(q).slice(0,200):null}const g=e.getBoundingClientRect(),x={};try{const T=e.ownerDocument,q=A=>T.defaultView.CSS.escape(A),U=A=>{try{return T.querySelectorAll(A).length}catch{return}};i["data-testid"]&&(x.testId=U(`[data-testid=${JSON.stringify(i["data-testid"])}]`)),i.id&&(x.id=U(`#${q(i.id)}`)),i.name&&(x.name=U(`[name=${JSON.stringify(i.name)}]`)),i.placeholder&&(x.placeholder=U(`[placeholder=${JSON.stringify(i.placeholder)}]`)),i.alt&&(x.alt=U(`[alt=${JSON.stringify(i.alt)}]`)),i.title&&(x.title=U(`[title=${JSON.stringify(i.title)}]`));const G=(i.class||"").split(/\s+/).filter(A=>A.length>1).slice(0,10);if(G.length>0){const A={};for(const I of G){const K=U(`.${q(I)}`);K!==void 0&&(A[I]=K)}x.classes=A}}catch{}let L=null;const h=[];if(l&&c&&n&&s)try{const T=e.ownerDocument,q=j=>T.defaultView.CSS.escape(j),U=j=>{try{return T.querySelectorAll(j).length}catch{return}},G=new Map,A=new Map,I=j=>{const oe=G.get(j);if(oe!==void 0)return oe;let W;const E=j.getAttribute("role");if(E)W=E;else{const d=(j.tagName||"").toLowerCase();d==="input"?W=n[(j.getAttribute("type")||"text").toLowerCase()]??"textbox":d==="select"?W=j.getAttribute("multiple")!=null?"listbox":"combobox":d==="a"?W=j.getAttribute("href")!=null?"link":null:W=c[d]??null}return G.set(j,W),W},K=j=>{const oe=/^h([1-6])$/.exec((j.tagName||"").toLowerCase());if(oe)return Number(oe[1]);const W=j.getAttribute("aria-level");return W&&/^\d+$/.test(W)?Number(W):null},v=I(e),D=v==="heading"?K(e):null,y=j=>{const oe=j.getAttribute("aria-label");if(oe)return oe;const W=(j.textContent||"").replace(/\s+/g," ").trim();return W||j.getAttribute("title")||j.getAttribute("placeholder")||null},Z=y(e),M=(e.textContent||"").replace(/\s+/g," ").trim(),N=M?M.toLowerCase():null,Q=j=>{const oe=A.get(j);if(oe!==void 0)return oe;const W=(j.textContent||"").replace(/\s+/g," ").trim().toLowerCase();return A.set(j,W),W},me=2,te=(j,oe)=>{if(!N)return-1;const W=j.querySelectorAll("*");if(W.length>oe)return-1;let E=0;for(let d=0;d<W.length;d++){const ne=W[d];if(Q(ne).indexOf(N)===-1)continue;let m=!1;const B=ne.children;for(let H=0;H<B.length;H++)if(Q(B[H]).indexOf(N)!==-1){m=!0;break}if(m||E++,E>=me)return E}return E},ce=T.querySelectorAll(s),X=ce.length<=4e3,pe=!!v&&X;if(pe){let j=0,oe=-1,W=0,E=0;for(let d=0;d<ce.length;d++){const ne=ce[d];I(ne)===v&&(ne===e&&(oe=j),j++,D!=null&&K(ne)===D&&W++,Z!=null&&y(ne)===Z&&E++)}Z!=null&&(x.roleName=E),oe!==-1&&(L={role:v,count:j,index:oe,...D!=null?{levelCount:W}:{}})}if(N){const j=te(T.body||T.documentElement,4e3);j>=0&&(x.text=j)}if(pe||N){const j=["form","nav","main","article","section","dialog","table","li","tr"],oe=/^data-(v-[0-9a-f]+|reactid|react-checksum|svelte-\w+|ng-\w+|ember\w*)$/i,W=/^data-(index|idx|i|key|row|rownum|col|column|position|pos|order|sort|offset|page)$/i,E=["data-test","data-test-id","data-qa","data-qa-id","data-cy","data-e2e"],d=(O,Y)=>!O||O.slice(0,5)!=="data-"||O==="data-testid"||oe.test(O)||W.test(O)?!1:!!Y&&Y.length<=120,ne=O=>{const Y=O.attributes;if(!Y)return null;let le=null;for(let ge=0;ge<Y.length;ge++){const ue=Y[ge].name,ye=Y[ge].value;if(d(ue,ye)){if(E.indexOf(ue.toLowerCase())!==-1)return{name:ue,value:ye};le||(le={name:ue,value:ye})}}return le},m=O=>{let Y=0;for(let le=0;le<ce.length;le++)I(ce[le])===O&&Y++;return Y},B=O=>(O.textContent||"").replace(/\s+/g," ").trim(),H=O=>{const Y=O.replace(/[^A-Za-z]/g,"").length;return Y<2?!1:O.replace(/[^0-9]/g,"").length<=Y},F=O=>!!O&&O.length<=60&&O!==M&&H(O),re=O=>{const Y=O.querySelector('h1,h2,h3,h4,h5,h6,[role="heading"]');if(Y){const ge=B(Y);if(F(ge))return ge}const le=O.querySelectorAll("*");if(le.length>200)return null;for(let ge=0;ge<le.length;ge++){const ue=le[ge];if(ue===e||ue.children.length>0)continue;const ye=B(ue);if(F(ye))return ye}return null},se=(O,Y)=>{const le=Y.toLowerCase();let ge=0;for(let ue=0;ue<ce.length;ue++)I(ce[ue])===O&&Q(ce[ue]).indexOf(le)!==-1&&ge++;return ge};let ae=e.parentElement,$e=0;for(;ae&&$e<12&&h.length<4;){$e++;const O=(ae.tagName||"").toLowerCase();if(O==="body"||O==="html")break;const Y=ae.getAttribute("data-testid"),le=ae.getAttribute("id"),ge=ae.getAttribute("role"),ue=ae.getAttribute("aria-label"),ye=ge||(j.includes(O)?c[O]:null)||null,Ae=ne(ae);if(Y||le||ye||ue||Ae){let P=-1;if(pe){const xe=ae.querySelectorAll(s);if(xe.length<=2e3){P=0;for(let Be=0;Be<xe.length;Be++){const He=xe[Be];I(He)===v&&(D!=null&&K(He)!==D||P++)}}}const $=te(ae,2e3);let ie=null;try{ye&&X&&(ie=re(ae))}catch{ie=null}h.push({tag:O,depth:$e,testId:Y||null,id:le||null,role:ge||null,ariaLabel:ue||null,...P>=0?{scopedRoleCount:P}:{},...$>=0?{scopedTextCount:$}:{},...Y?{testIdCount:U(`[data-testid=${JSON.stringify(Y)}]`)}:{},...le?{idCount:U(`#${q(le)}`)}:{},...ye&&X?{roleCount:m(ye)}:{},...ie?{filterText:ie,filterRoleCount:se(ye,ie)}:{},...Ae?{dataAttr:Ae,dataAttrCount:U(`[${Ae.name}=${JSON.stringify(Ae.value)}]`)}:{}})}ae=ae.parentElement}}}catch{}const C=!!(e.labels&&e.labels.length>0);let _;if(f){_=null;try{const T=C?e.labels[0]:null;_=(T&&T.textContent||"").replace(/\s+/g," ").trim().slice(0,120)||null}catch{_=null}}return{tagName:e.tagName?.toLowerCase?.()??"unknown",attributes:i,textContent:(e.textContent||"").replace(/\s+/g," ").trim().slice(0,80),center:{x:Math.round(g.x+g.width/2),y:Math.round(g.y+g.height/2)},hasLabel:C,...f?{labelText:_}:{},selectorCounts:x,...l?{rolePosition:L,ancestors:h}:{}}}function Mn(e){const a=globalThis,r=a.document;if(!r||!r.body){e.transport==="postMessage"?a.parent.postMessage({type:"pickerClosed"},"*"):a.__piwiPickState="skipped";return}const c=2147483600,n=r.createElement("div");n.id="__piwi_picker_highlight",n.style.cssText=`position:fixed;pointer-events:none;z-index:${c};display:none;box-sizing:border-box;border:2px solid #a855f7;background:rgba(168,85,247,.14);border-radius:4px;box-shadow:0 0 0 1px rgba(255,255,255,.9),0 0 0 3px rgba(59,7,100,.55),inset 0 0 0 1px rgba(255,255,255,.5);`;const s=r.createElement("div");s.id="__piwi_picker_banner",s.style.cssText=`position:fixed;top:12px;left:50%;transform:translateX(-50%);z-index:${c+2};background:#111827;color:#f9fafb;font:13px/1.5 system-ui,sans-serif;border:1px solid #312e81;padding:10px 16px;border-radius:10px;box-shadow:0 4px 24px rgba(0,0,0,.5);max-width:min(680px,86vw);`;const l=m=>{const B=ae=>ae.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),H=/('(?:\\.|[^'])*'|"(?:\\.|[^"])*")|([A-Za-z_$][\w$]*)(?=\s*\()|([A-Za-z_$][\w$]*)(?=\s*:)|(true|false|null|\d+)|([{}(),.])/g;let F="",re=0,se;for(;(se=H.exec(m))!==null;){se.index>re&&(F+=B(m.slice(re,se.index)));const ae=se[1]?"#86efac":se[2]?"#d8b4fe":se[3]?"#93c5fd":se[4]?"#fcd34d":"#9ca3af";F+=`<span style="color:${ae}">${B(se[0])}</span>`,re=H.lastIndex}return re<m.length&&(F+=B(m.slice(re))),F},f="ui-monospace,SFMono-Regular,Menlo,Consolas,monospace",i=m=>`<code style="font-family:${f}">${l(m)}</code>`,g=r.createElement("div");g.innerHTML=e.transport==="postMessage"?"Click an element to generate locators":e.failing?`Piwi locator picker — click the element that should replace ${i(e.failing)}`:"Piwi inspector — click any element to generate locators for it";const x=r.createElement("div");x.id="__piwi_picker_locator",x.style.cssText=`display:none;margin-top:7px;padding:5px 9px;border-radius:7px;background:#0b1120;border:1px solid #4c1d95;font:13.5px/1.55 ${f};word-break:break-word;overflow-wrap:anywhere;`;const L=r.createElement("div");L.id="__piwi_picker_foot",L.style.cssText="color:#9ca3af;margin-top:6px;font-size:12px;",L.textContent="↑ parent · ↓ child · Esc skip",s.appendChild(g),s.appendChild(x),s.appendChild(L);const h=r.createElement("div");h.id="__piwi_picker_label",h.style.cssText=`position:fixed;pointer-events:none;z-index:${c+1};display:none;box-sizing:border-box;max-width:min(620px,92vw);background:#0b1120;color:#f9fafb;border:1px solid #7c3aed;border-radius:7px;padding:4px 8px;font:12.5px/1.45 ${f};white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-shadow:0 4px 18px rgba(0,0,0,.5);`,r.body.appendChild(n),r.body.appendChild(h),r.body.appendChild(s);const C=m=>m.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),_=m=>{const B=(m.tagName||"?").toLowerCase(),H=m.getAttribute&&m.getAttribute("data-testid");if(H)return`getByTestId('${C(H)}')`;if(m.labels&&m.labels.length>0){const O=(m.labels[0].textContent||"").replace(/\s+/g," ").trim().slice(0,80);if(O)return`getByLabel('${C(O)}')`}const F=m.getAttribute&&m.getAttribute("aria-label");if(F)return`getByLabel('${C(F)}')`;const re=m.getAttribute&&m.getAttribute("placeholder");if(re)return`getByPlaceholder('${C(re)}')`;const se=m.getAttribute&&m.getAttribute("alt");if(se)return`getByAltText('${C(se)}')`;const ae=m.getAttribute&&m.getAttribute("title");if(ae)return`getByTitle('${C(ae)}')`;if(m.id)return`locator('#${C(m.id)}')`;const $e=(m.getAttribute&&m.getAttribute("class")||"").split(/\s+/).find(O=>O.length>1);return $e?`locator('.${C($e)}')`:B},T=m=>{const B=[];let H=m;for(;H&&B.length<15;){const F=(H.tagName||"").toLowerCase();if(F==="body"||F==="html")break;B.push(H),H=H.parentElement}return B.length?B:[m]},q=["button","a","input","select","textarea","summary","option"],U=m=>{for(let B=0;B<Math.min(m.length,4);B++){const H=m[B],F=(H.tagName||"").toLowerCase();if(q.includes(F)||H.getAttribute&&(H.getAttribute("role")||H.getAttribute("data-testid")))return B}return 0},G=m=>{const B=a.__piwiDescribeElement;if(typeof B=="function")try{const H=B(m);if(typeof H=="string"&&H)return H}catch{}return _(m)};let A=[],I=0,K=null,v=null;const D=m=>{h.style.display="block";const B=h.getBoundingClientRect(),H=a.innerWidth||r.documentElement.clientWidth||0,F=a.innerHeight||r.documentElement.clientHeight||0;let re=m.top-B.height-6;re<4&&(re=m.bottom+6),re+B.height>F-4&&(re=Math.max(4,F-B.height-4));let se=m.left;se+B.width>H-6&&(se=H-B.width-6),se<6&&(se=6),h.style.left=se+"px",h.style.top=re+"px"},y=()=>A[I]??null,Z=()=>{const m=y();if(!m){n.style.display="none",h.style.display="none";return}const B=m.getBoundingClientRect();if(n.style.display="block",n.style.left=B.left+"px",n.style.top=B.top+"px",n.style.width=B.width+"px",n.style.height=B.height+"px",m!==v){v=m;const H=(m.tagName||"?").toLowerCase(),F=l(G(m));h.innerHTML=`<span style="color:#c4b5fd"><${H}></span> ${F}`,x.innerHTML=F,x.style.display="block"}D(B),L.textContent="click to pick · ↑ parent · ↓ child · Esc skip"},M=m=>{m.preventDefault(),m.stopImmediatePropagation()},N=m=>m===s||m===n||m===h||s.contains&&s.contains(m)||!!(m&&m.__piwiHint);let Q="top";const me=m=>{Q!==m&&(Q=m,m==="bottom"?(s.style.top="auto",s.style.bottom="12px"):(s.style.top="12px",s.style.bottom="auto"))},te=m=>{const B=m.target;if(!B||N(B)){n.style.display="none",h.style.display="none";return}B!==K&&(K=B,A=T(B),I=U(A)),Z();const H=y();if(H){const F=H.getBoundingClientRect(),re=s.getBoundingClientRect(),se=8;F.left<re.right+se&&F.right>re.left-se&&F.top<re.bottom+se&&F.bottom>re.top-se&&me(Q==="top"?"bottom":"top")}},ce=["mousedown","mouseup","pointerdown","pointerup","auxclick","dblclick"],X=()=>{r.removeEventListener("mousemove",te,!0),r.removeEventListener("click",E,!0),r.removeEventListener("keydown",d,!0),e.transport==="postMessage"&&a.removeEventListener("message",ne,!1)},pe=()=>{for(const m of ce)r.removeEventListener(m,M,!0)},j=()=>{n.remove(),h.remove(),s.remove()},oe=m=>{if(X(),n.style.display="none",h.style.display="none",e.transport==="postMessage"){const B=a.__piwiProbe,H=typeof B=="function"?B(m,e.probeArg):null;a.__piwiSnapshotExtras?.onPick?.(),r.addEventListener("click",M,!0),r.addEventListener("keydown",M,!0),L.textContent="Analyzing element…",a.parent.postMessage({type:"elementPicked",attrs:H},"*")}else pe(),a.__piwiPickedElement=m,a.__piwiPickState="picked",L.textContent="Analyzing element…"},W=()=>{X(),e.transport==="postMessage"?(r.removeEventListener("click",M,!0),r.removeEventListener("keydown",M,!0),pe(),a.__piwiSnapshotExtras?.onClose?.(),j(),a.parent.postMessage({type:"pickerClosed"},"*")):(pe(),a.__piwiPickState="skipped",j())},E=m=>{M(m);const B=y();!B||N(m.target)||oe(B)},d=m=>{if(m.key==="Escape"){M(m),W();return}(m.key==="ArrowUp"||m.key==="ArrowDown")&&(M(m),m.key==="ArrowUp"?I=Math.min(I+1,A.length-1):I=Math.max(I-1,0),Z())},ne=m=>{const B=m.data;!B||typeof B.type!="string"||B.type!=="piwiPickerKey"||typeof B.key!="string"||d({key:B.key,preventDefault(){},stopImmediatePropagation(){}})};a.__piwiPickCleanup=j,r.addEventListener("mousemove",te,!0),r.addEventListener("click",E,!0),r.addEventListener("keydown",d,!0);for(const m of ce)r.addEventListener(m,M,!0);e.transport==="postMessage"&&(a.addEventListener("message",ne,!1),a.parent.postMessage({type:"pickerReady"},"*"))}function Un(){var e=document,a=window,r=2147483600,c=[];function n(){for(var v=0;v<c.length;v++)c[v].parentNode&&c[v].parentNode.removeChild(c[v]);c=[]}function s(v){return(v||"").replace(/\s+/g," ").trim().toLowerCase()}function l(v){var D=s(v);if(D.length<2)return[];for(var y=e.querySelectorAll("button,a,[role],h1,h2,h3,h4,h5,h6,label,summary,input,textarea,select,option,span,li,td,th,p"),Z=[],M=[],N=0;N<y.length;N++){var Q=y[N],me=s(Q.textContent);if(!me){var te=s(Q.getAttribute&&(Q.getAttribute("placeholder")||Q.getAttribute("aria-label"))||"");te&&(te===D||te.indexOf(D)!==-1)&&Z.push(Q);continue}me.length>120||(me===D?Z.push(Q):me.indexOf(D)!==-1&&me.length<D.length+30&&M.push(Q))}return Z.concat(M)}function f(v,D){var y=v.getBoundingClientRect();if(y.width===0&&y.height===0)return null;var Z=e.createElement("div");return Z.__piwiHint=!0,Z.style.cssText="position:fixed;pointer-events:none;z-index:"+(r+1)+";box-sizing:border-box;border-radius:3px;transition:opacity .3s;border:2px solid "+D+";box-shadow:0 0 0 3px "+D+"55;left:"+y.left+"px;top:"+y.top+"px;width:"+y.width+"px;height:"+y.height+"px;",e.body.appendChild(Z),c.push(Z),Z}function i(v){var D=v.getBoundingClientRect();a.parent.postMessage({type:"piwiScrollTo",y:D.top},"*")}function g(v){if(n(),!(!v||!v.length)){for(var D=null,y=0;y<v.length;y++)for(var Z=v[y],M=l(Z&&Z.text),N=0;N<Math.min(M.length,3);N++)f(M[N],"#f59e0b"),D||(D=M[N]);D&&i(D),setTimeout(function(){for(var Q=0;Q<c.length;Q++)c[Q].style.opacity="0"},2600),setTimeout(n,3e3)}}var x=[],L=0;function h(){a.parent.postMessage({type:"piwiSearchResult",count:x.length,index:x.length?L:-1},"*")}function C(){n();var v=x[L];v&&(f(v,"#7c3aed"),i(v),h())}function _(v){if(x=l(v),L=0,!x.length){n(),h();return}C()}function T(){x.length&&(L=(L+1)%x.length,C())}function q(v){var D=v.data;if(!(!D||typeof D.type!="string")){if(D.type==="piwiHighlight")try{g(D.hints)}catch{}else if(D.type==="piwiSearch")try{_(D.q)}catch{}else if(D.type==="piwiSearchNext")try{T()}catch{}else if(D.type==="piwiClearHints")try{n()}catch{}}}a.addEventListener("message",q,!1);function U(v){v.preventDefault(),v.stopImmediatePropagation()}for(var G=["mousedown","mouseup","pointerdown","pointerup","auxclick","dblclick","contextmenu","submit","beforeinput","input","change","paste","cut","drop","dragstart","keypress","keyup","touchstart","touchend"],A=0;A<G.length;A++)e.addEventListener(G[A],U,!0);a.__piwiSnapshotExtras={onPick:function(){n()},onClose:function(){n(),a.removeEventListener("message",q,!1);for(var v=0;v<G.length;v++)e.removeEventListener(G[v],U,!0)}};function I(){var v=Math.max(e.documentElement?e.documentElement.scrollHeight:0,e.body?e.body.scrollHeight:0);v>0&&a.parent.postMessage({type:"piwiContentHeight",height:v},"*")}I();try{if(a.ResizeObserver){var K=new a.ResizeObserver(I);e.documentElement&&K.observe(e.documentElement),e.body&&K.observe(e.body)}}catch{}}function Nn(e){const a=[],r=new Set,c=s=>{if(typeof s!="string")return;const l=s.trim();if(l.length<2||l.length>80)return;const f=l.toLowerCase();r.has(f)||(r.add(f),a.push({text:l}))},n=s=>s&&(s.name??s.text??s.label??s.placeholder??s.alt??s.title);c(n(e.failingLocator?.args));for(const s of e.fromElementMatch??[])c(n(s.args));for(const s of e.fromAriaSnapshot??[])c(n(s.args));return a.slice(0,6)}const Ge=e=>e.replace(/<\/(script)/gi,"<\\/$1");function jn(e){const r={transport:"postMessage",probeArg:{keep:e.probedAttrs,includeStructural:!1,includeLabelText:!0}},c=Ge(String(On)),n=Ge(String(Un)),s=Ge(String(Mn));return`<script>globalThis.__piwiProbe = (${c});(${n})();(${s})(${JSON.stringify(r)});<\/script>`}function Dn(e){return e.replace(/<base\b[^>]*>/gi,"")}function Kn(e,a){return Dn(e)+jn(a)}const Vn={key:0,class:"flex items-center justify-center py-20"},Hn={key:1,class:"py-8 text-center"},Fn={class:"text-xs text-gray-400 mt-1"},qn={key:2,class:"py-8 text-center"},Zn={class:"mb-2 flex items-center gap-2 flex-wrap"},Wn={key:1,class:"ml-auto inline-flex rounded-md border border-default overflow-hidden text-xs"},Jn={key:0,class:"flex items-center gap-1 mb-1.5 text-xs text-gray-500"},Gn={class:"tabular-nums w-11 text-center select-none"},Yn={class:"ml-auto text-gray-400 tabular-nums"},Qn={key:1,class:"flex items-center gap-2 mb-1.5"},Xn={key:0,class:"text-xs text-gray-500 tabular-nums"},eo={key:1,class:"text-xs text-gray-400"},to={key:0,class:"absolute inset-0 flex items-center justify-center bg-white dark:bg-gray-900 z-10"},no=["src"],oo={key:2,class:"mt-4 space-y-3"},so={class:"flex items-center gap-3 bg-elevated rounded-lg p-3"},ao={class:"flex-1 min-w-0"},ro={class:"text-sm font-medium"},io={class:"text-xs"},lo={key:0,class:"text-xs text-gray-400 ml-1"},co={key:0,class:"text-xs text-gray-500 mt-0.5 truncate"},uo={class:"space-y-1",role:"radiogroup","aria-label":"Alternative locators"},po={class:"flex-1 min-w-0"},fo={class:"text-xs font-medium text-primary"},mo={class:"flex justify-between w-full"},go={key:1},ho={class:"flex gap-2"},yo=de({__name:"SnapshotLocatorPicker",props:Qe({runId:{},testRunsCaseId:{},failingLocator:{},healing:{}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:Qe(["close","confirmed"],["update:open"]),setup(e,{emit:a}){const r=e,c=a,n=lt(e,"open"),s=J(!1),l=J(null),f=J(null),i=J(void 0);async function g(){s.value=!0,f.value=null;try{const P=new URLSearchParams({inlineStyles:"1"});i.value&&P.set("source",i.value);const $=`?${P.toString()}`;l.value=await $fetch(`/api/test-run-cases/${r.testRunsCaseId}/dom-snapshot${$}`),l.value?.source&&(i.value=l.value.source)}catch(P){f.value=P instanceof Error?P.message:"Unknown error"}finally{s.value=!1}}const x=z(()=>l.value?.availableSources??[]);function L(P){P===i.value||s.value||(i.value=P,_.value=!1,h.value="pick-element",K.value=0,D.value=!1,T.value=null,q.value=[],F.value=null,W.value="",E.value=0,d.value=-1,g())}Ie(n,P=>{P&&(l.value=null,_.value=!1,h.value="pick-element",K.value=0,D.value=!1,i.value=void 0,T.value=null,q.value=[],F.value=null,W.value="",E.value=0,d.value=-1,g())});const h=J("pick-element"),C=J(null),_=J(!1),T=J(null),q=J([]),U=J(void 0);function G(P){return URL.createObjectURL(new Blob([Kn(P,{probedAttrs:Ln})],{type:"text/html"}))}Ie(()=>l.value?.html,P=>{U.value&&(URL.revokeObjectURL(U.value),U.value=void 0),P&&(U.value=G(P))},{immediate:!0});const A=J(null),I=J(0),K=J(0),v=J(1),D=J(!1),y=z(()=>l.value?.viewport??null),Z=z(()=>{const P=y.value;return!P?.width||!I.value?1:Math.min(I.value/P.width,1)}),M=z(()=>{const P=y.value;if(!P)return{width:"100%",height:K.value?`${K.value}px`:"100%"};const $=K.value||P.height;return{width:`${Math.round(P.width*v.value)}px`,height:`${Math.round($*v.value)}px`}}),N=z(()=>{const P=y.value;if(!P)return{width:"100%",height:K.value?`${K.value}px`:"100%",border:"0"};const $=K.value||P.height;return{width:`${P.width}px`,height:`${$}px`,transform:`scale(${v.value})`,transformOrigin:"top left",border:"0"}}),Q=z(()=>Math.round(v.value*100)),me=P=>Math.min(4,Math.max(.1,P));function te(P){D.value=!0,v.value=me(v.value*P)}function ce(){D.value=!1,v.value=Z.value}Ie([Z,y],()=>{D.value||(v.value=Z.value)});let X=null;Ie(A,P=>{X?.disconnect(),P&&(I.value=P.clientWidth,X=new ResizeObserver($=>{for(const ie of $)I.value=ie.contentRect.width}),X.observe(P))}),Pe(()=>{X?.disconnect()}),Pe(()=>{U.value&&URL.revokeObjectURL(U.value)});function pe(P){if(!C.value||P.source!==C.value.contentWindow)return;const $=P.data;if($?.type==="pickerReady"){_.value=!0,oe();return}if($?.type==="piwiContentHeight"&&typeof $.height=="number"){K.value=Math.max($.height,y.value?.height??0);return}if($?.type==="piwiScrollTo"&&typeof $.y=="number"){const ie=A.value;ie&&ie.scrollTo({top:Math.max(0,$.y*v.value-80),behavior:"smooth"});return}if($?.type==="piwiSearchResult"){E.value=typeof $.count=="number"?$.count:0,d.value=typeof $.index=="number"?$.index:-1;return}if($?.type==="elementPicked"&&$.attrs){const{labelText:ie,...xe}=$.attrs;T.value={...xe,accessibleName:ie??Bn(xe)},q.value=En(T.value),F.value=null,h.value="review"}$?.type==="pickerClosed"&&Y()}function j(P){C.value?.contentWindow?.postMessage(P,"*")}function oe(){const P=Nn({failingLocator:r.failingLocator,fromElementMatch:r.healing?.fromElementMatch??null,fromAriaSnapshot:r.healing?.fromAriaSnapshot??null});P.length&&j({type:"piwiHighlight",hints:P})}const W=J(""),E=J(0),d=J(-1);let ne=null;Ie(W,P=>{ne&&clearTimeout(ne),ne=setTimeout(()=>j({type:"piwiSearch",q:P}),180)});function m(){j({type:"piwiSearchNext"})}Pe(()=>{ne&&clearTimeout(ne)});function B(P){if(!n.value||h.value!=="pick-element"||!_.value||P.key!=="ArrowUp"&&P.key!=="ArrowDown")return;const $=(document.activeElement?.tagName??"").toLowerCase();if($==="input"||$==="textarea")return;const ie=C.value?.contentWindow;ie&&(P.preventDefault(),ie.postMessage({type:"piwiPickerKey",key:P.key},"*"))}function H(){C.value&&(C.value.src="about:blank")}ct(()=>{window.addEventListener("message",pe),window.addEventListener("keydown",B,!0)}),Pe(()=>{window.removeEventListener("message",pe),window.removeEventListener("keydown",B,!0)});const F=J(null),re=J(!1);function se(P){F.value=P}const ae=z(()=>gt(r.failingLocator.method,q.value)),$e=qe();async function O(){if(F.value){re.value=!0;try{(await $fetch(`/api/test-run-cases/${r.testRunsCaseId}/locator-pick`,{method:"POST",body:{failingLocator:r.failingLocator,pickedLocator:F.value,element:T.value}})).status==="ok"?c("confirmed",F.value):$e.add({title:"Pick not saved",description:"This failure has no call-site or locator signature to attach the pick to.",color:"warning",icon:"i-lucide-alert-triangle"}),n.value=!1}catch(P){$e.add({title:"Could not save the pick",description:Me(P),color:"error",icon:"i-lucide-alert-triangle"})}finally{re.value=!1}}}function Y(){H(),n.value=!1}function le(){T.value=null,q.value=[],F.value=null,h.value="pick-element",_.value=!1,W.value="",E.value=0,d.value=-1;const P=l.value?.html;P&&(U.value&&URL.revokeObjectURL(U.value),U.value=G(P))}const{copy:ge}=De(),ue=J(null);let ye=null;function Ae(P,$){ge(P,{toast:"Locator copied"}),ue.value=$,ye&&clearTimeout(ye),ye=setTimeout(()=>{ue.value=null},2e3)}return Pe(()=>{ye&&clearTimeout(ye)}),(P,$)=>{const ie=we,xe=Le,Be=it,He=Re,vt=Xe,xt=ut;return o(),V(xt,{open:n.value,"onUpdate:open":$[8]||($[8]=be=>n.value=be),ui:{content:"max-w-6xl w-[95vw]"},onAfterLeave:Y},{header:S(()=>[...$[9]||($[9]=[p("div",null,[p("h3",{class:"text-lg font-medium"},"Pick a locator from the DOM snapshot"),p("p",{class:"text-sm text-gray-500 mt-0.5"}," Click the element the failing locator should target. Use ↑↓ to walk the DOM tree. ")],-1)])]),body:S(()=>[t(s)?(o(),u("div",Vn,[b(ie,{name:"i-lucide-loader",class:"size-6 animate-spin text-gray-400"}),$[10]||($[10]=p("span",{class:"ml-2 text-sm text-gray-500"},"Loading DOM snapshot...",-1))])):t(f)?(o(),u("div",Hn,[b(ie,{name:"i-lucide-alert-triangle",class:"size-8 text-red-300 mx-auto mb-2"}),$[12]||($[12]=p("p",{class:"text-sm text-red-500"},"Failed to load snapshot",-1)),p("p",Fn,k(t(f)),1),b(xe,{size:"xs",variant:"outline",color:"neutral",class:"mt-3",onClick:g},{default:S(()=>[...$[11]||($[11]=[R("Retry",-1)])]),_:1})])):t(l)?.status!=="ok"||!t(l).html?(o(),u("div",qn,[b(ie,{name:"i-lucide-file-x",class:"size-8 text-gray-300 mx-auto mb-2"}),$[13]||($[13]=p("p",{class:"text-sm text-gray-500"},"No DOM snapshot or ARIA data available for this execution",-1)),$[14]||($[14]=p("p",{class:"text-xs text-gray-400 mt-1"},"This test run has no stored trace or ARIA snapshot to pick from.",-1))])):(o(),u(ee,{key:3},[p("div",Zn,[t(l).source?(o(),u("div",{key:0,class:he(["text-xs flex items-center gap-1",t(l).source==="aria"?"text-amber-600 dark:text-amber-400":"text-green-600 dark:text-green-400"])},[b(ie,{name:t(l).source==="aria"?"i-lucide-accessibility":"i-lucide-check",class:"size-3.5 shrink-0"},null,8,["name"]),t(l).source==="aria"?(o(),u(ee,{key:0},[R(" Accessibility tree from the failure-time ARIA snapshot — element styles are approximate ")],64)):(o(),u(ee,{key:1},[R(" Rendered from the failure-time DOM snapshot ")],64))],2)):w("",!0),t(x).length>1?(o(),u("div",Wn,[p("button",{type:"button",class:he(["px-2 py-1 flex items-center gap-1 transition-colors",t(i)==="dom"?"bg-primary/10 text-primary font-medium":"text-gray-500 hover:bg-elevated"]),title:"Rendered page from the trace",onClick:$[0]||($[0]=be=>L("dom"))},[b(ie,{name:"i-lucide-layout-panel-top",class:"size-3.5"}),$[15]||($[15]=R(" DOM ",-1))],2),p("button",{type:"button",class:he(["px-2 py-1 flex items-center gap-1 border-l border-default transition-colors",t(i)==="aria"?"bg-primary/10 text-primary font-medium":"text-gray-500 hover:bg-elevated"]),title:"Accessibility tree from the ARIA snapshot",onClick:$[1]||($[1]=be=>L("aria"))},[b(ie,{name:"i-lucide-accessibility",class:"size-3.5"}),$[16]||($[16]=R(" Tree ",-1))],2)])):w("",!0)]),t(y)?(o(),u("div",Jn,[b(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-zoom-out",title:"Zoom out",onClick:$[2]||($[2]=be=>te(1/1.25))}),p("span",Gn,k(t(Q))+"%",1),b(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-zoom-in",title:"Zoom in",onClick:$[3]||($[3]=be=>te(1.25))}),b(xe,{size:"xs",variant:"outline",color:"neutral",class:"ml-1",onClick:ce},{default:S(()=>[...$[17]||($[17]=[R("Fit",-1)])]),_:1}),p("span",Yn,k(t(y).width)+"×"+k(t(y).height),1)])):w("",!0),t(h)==="pick-element"?(o(),u("div",Qn,[b(Be,{modelValue:t(W),"onUpdate:modelValue":$[4]||($[4]=be=>Se(W)?W.value=be:null),size:"xs",icon:"i-lucide-search",placeholder:"Find an element by its text…",class:"max-w-xs",onKeydown:ke(_e(m,["prevent"]),["enter"])},null,8,["modelValue","onKeydown"]),t(W)&&t(E)>0?(o(),u("span",Xn,k(t(d)+1)+"/"+k(t(E)),1)):t(W)?(o(),u("span",eo,"no matches")):w("",!0),t(E)>1?(o(),V(xe,{key:2,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-chevron-down",title:"Next match (Enter)",onClick:m})):w("",!0)])):w("",!0),p("div",{ref_key:"stageRef",ref:A,class:he(["relative border border-default rounded-lg overflow-auto",[t(h)==="pick-element"?"h-[75vh]":"h-80",t(y)?"bg-gray-100 dark:bg-gray-800":""]])},[t(_)?w("",!0):(o(),u("div",to,[b(ie,{name:"i-lucide-loader",class:"size-5 animate-spin text-gray-400"}),$[18]||($[18]=p("span",{class:"ml-2 text-sm text-gray-500"},"Initializing picker...",-1))])),p("div",{style:nt(t(M))},[p("iframe",{ref_key:"iframeRef",ref:C,src:t(U),style:nt(t(N)),class:"bg-white",sandbox:"allow-scripts",title:"DOM snapshot"},null,12,no)],4)],2),t(h)==="review"&&t(T)?(o(),u("div",oo,[p("div",so,[b(ie,{name:"i-lucide-crosshair",class:"size-5 text-primary shrink-0"}),p("div",ao,[p("p",ro,[$[19]||($[19]=R(" Picked: ",-1)),p("code",io,k(t(T).tagName),1),t(T).attributes.id?(o(),u("code",lo,"#"+k(t(T).attributes.id),1)):w("",!0),t(T).attributes["data-testid"]?(o(),V(He,{key:1,size:"xs",color:"primary",variant:"subtle",class:"ml-1"},{default:S(()=>[R(k(t(T).attributes["data-testid"]),1)]),_:1})):w("",!0)]),t(T).textContent?(o(),u("p",co,' "'+k(t(T).textContent)+'" ',1)):w("",!0)]),b(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-rotate-ccw",title:"Pick a different element",onClick:le})]),p("div",uo,[(o(!0),u(ee,null,fe(t(q),(be,Je)=>(o(),V(mt,{key:Je,alt:be,copied:t(ue)===`picked-${Je}`,dense:!0,selectable:!0,selected:t(F)?.locator===be.locator,onCopy:bt=>Ae(be.locator,`picked-${Je}`),onSelect:bt=>se(be)},null,8,["alt","copied","selected","onCopy","onSelect"]))),128))]),t(ae).recommended?(o(),u("div",{key:0,class:"rounded-lg border border-primary/40 bg-primary/5 p-3 flex items-center gap-3 cursor-pointer",role:"button",tabindex:"0",title:"Select this locator for Confirm",onClick:$[6]||($[6]=be=>se(t(ae).recommended)),onKeydown:$[7]||($[7]=ke(_e(be=>se(t(ae).recommended),["prevent"]),["enter"]))},[b(ie,{name:"i-lucide-star",class:"size-5 text-primary shrink-0"}),p("div",po,[p("p",fo," Recommended (score: "+k(t(ae).recommended.score)+") ",1),b(vt,{locator:t(ae).recommended.locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"])]),b(xe,{size:"sm",color:"primary",variant:"solid","trailing-icon":t(ue)==="rec"?"i-lucide-check":"i-lucide-copy",onClick:$[5]||($[5]=_e(be=>Ae(t(ae).recommended.locator,"rec"),["stop"]))},{default:S(()=>[...$[20]||($[20]=[R(" Copy ",-1)])]),_:1},8,["trailing-icon"])],32)):w("",!0)])):w("",!0)],64))]),footer:S(()=>[p("div",mo,[t(h)==="review"?(o(),V(xe,{key:0,size:"sm",variant:"outline",color:"neutral",icon:"i-lucide-rotate-ccw",onClick:le},{default:S(()=>[...$[21]||($[21]=[R(" Pick a different element ",-1)])]),_:1})):(o(),u("div",go)),p("div",ho,[b(xe,{size:"sm",variant:"outline",color:"neutral",onClick:Y},{default:S(()=>[...$[22]||($[22]=[R("Cancel",-1)])]),_:1}),t(h)==="review"?(o(),V(xe,{key:0,size:"sm",color:"primary",loading:t(re),disabled:!t(F),onClick:O},{default:S(()=>[...$[23]||($[23]=[R(" Confirm pick ",-1)])]),_:1},8,["loading","disabled"])):w("",!0)])])]),_:1},8,["open"])}}}),vo=Object.assign(yo,{__name:"SnapshotLocatorPicker"});function xo(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function bo(e,a){let r=0,c=null;for(let n=a;n<e.length;n++){const s=e[n];if(c){if(s==="\\"){n++;continue}s===c&&(c=null);continue}if(s==="'"||s==='"'||s==="`"){c=s;continue}if(s==="(")r++;else if(s===")"&&(r--,r===0))return n}return-1}function ko(e,a,r){if(!e||!a||!r)return null;const c=new RegExp(`${xo(a)}\\s*\\(`,"g");let n;for(;(n=c.exec(e))!==null;){const s=n.index,l=s>0?e[s-1]:"";if(l&&/[A-Za-z0-9_$]/.test(l))continue;const f=s+n[0].lastIndexOf("("),i=bo(e,f);if(i===-1)return null;const g=e.slice(0,s)+r+e.slice(i+1);return g===e?null:{old:e,new:g}}return null}function _o(e,a){return`${a?`@@ ${a} @@
|
|
1
|
+
import{d as de,q as qe,O as kt,a as Ie,o,c as u,h as b,f as S,k as R,j as Le,b as t,e as V,F as ee,l as w,I as rt,x as Se,g as p,z as fe,t as k,m as Re,r as J,v as z,af as tt,B as ze,G as _t,P as $t,U as Oe,ag as wt,R as ke,D as _e,_ as we,i as he,M as Ct,K as lt,ah as Pe,C as ct,a1 as nt,L as Qe,ac as Ee,H as At,V as Ne,ai as Te,S as St,ad as Tt,aj as Lt,ak as Rt,al as zt,$ as It,a0 as Pt}from"./1QWBzxLM.js";import{_ as Et}from"./Bx_lfKHl.js";import{_ as Ze}from"./B-1zt4pp.js";import{_ as Bt}from"./e-GZmCeP.js";import{_ as Ot}from"./B4lvHjBe.js";import{_ as Mt}from"./Dn_-RkxP.js";import{_ as ut}from"./CtQMagSz.js";import{a as De,u as je}from"./CU_2YLhT.js";import{e as Me,a as We,y as Ut,z as Nt,A as dt,u as Ue,B as jt}from"./D4mPjHHR.js";import{_ as pt,a as Dt}from"./B82vqOZe.js";import{_ as Kt}from"./Dpwj_1H5.js";import{u as Vt}from"./BABCH5kE.js";import{_ as Ke}from"./bmAf49LT.js";import{_ as Ht}from"./mYw4b7uY.js";import{_ as Ft}from"./BnUQ3i5l.js";import{_ as qt}from"./BF5qB58w.js";import{u as Zt,i as Wt,b as Jt}from"./CN1M6i4K.js";import{f as Gt}from"./D-c8ZSws.js";import{_ as ft}from"./DYdwHaco.js";import{_ as Yt}from"./AbnDY6Zr.js";const Qt={key:1,class:"space-y-4"},Xt={key:1,class:"flex gap-2"},en={key:2,class:"flex items-end gap-2"},tn={key:2,class:"space-y-1.5"},nn={class:"text-xs"},on=["title"],sn=de({__name:"ShareLinksModal",props:{endpoint:{}},setup(e){const a=e,i=qe(),{copy:c}=De(),{hasRole:n}=kt(),s=ze(),l=J(!1),f=J(null),r=J([]),g=J(!1),x=J(!1),L=J(null),h=z(()=>!s.public.authEnabled||n([tt.ADMINISTRATOR,tt.REPORTER])),C=J(void 0),_=z(()=>{const A=f.value?.maxTtlDays??30,I=[1,7,30,90,365].filter(v=>A===0||v<=A),K=I.map(v=>({label:v===1?"1 day":`${v} days`,value:v}));return A===0?K.push({label:"No expiry",value:0}):I.includes(A)||K.push({label:`${A} days`,value:A}),K});Ie(l,async A=>{if(!A){L.value=null;return}g.value=!0;try{const[I,K]=await Promise.all([$fetch("/api/share-links/settings"),$fetch(a.endpoint)]);f.value=I,r.value=K.items,C.value??=I.maxTtlDays===0?0:Math.min(30,I.maxTtlDays)}catch(I){i.add({title:"Could not load share links",description:Me(I),color:"error"})}finally{g.value=!1}});async function T(){x.value=!0;try{const A=await $fetch(a.endpoint,{method:"POST",body:{ttlDays:C.value===0?null:C.value}});L.value=A.url;const I=await $fetch(a.endpoint);r.value=I.items}catch(A){i.add({title:"Could not create the share link",description:Me(A),color:"error"})}finally{x.value=!1}}async function q(A){try{await $fetch(`/api/share-links/${A.id}`,{method:"DELETE"}),i.add({title:"Share link revoked",description:`psl_${A.tokenPrefix}… no longer resolves.`,color:"success"});const I=await $fetch(a.endpoint);r.value=I.items}catch(I){i.add({title:"Could not revoke the link",description:Me(I),color:"error"})}}function U(){c(L.value,{toast:"Share link copied to clipboard"})}function G(A){return A.revokedAt?{label:"Revoked",color:"neutral"}:A.expiresAt&&new Date(A.expiresAt).getTime()<=Date.now()?{label:"Expired",color:"neutral"}:A.expiresAt?{label:`Expires ${We(A.expiresAt)}`,color:"success"}:{label:"No expiry",color:"warning"}}return(A,I)=>{const K=Le,v=Et,D=Ze,y=rt,Z=Bt,M=Ot,N=Re,Q=Mt,me=ut;return o(),u(ee,null,[b(K,{icon:"i-lucide-link",size:"xs",color:"neutral",variant:"outline",title:"Hand this investigation to someone without an account",onClick:I[0]||(I[0]=te=>l.value=!0)},{default:S(()=>[...I[3]||(I[3]=[R(" Share ",-1)])]),_:1}),b(me,{open:t(l),"onUpdate:open":I[2]||(I[2]=te=>Se(l)?l.value=te:null),title:"Share links",description:"Read-only links anyone can open — no account needed."},{body:S(()=>[t(g)?(o(),V(v,{key:0,text:"Loading share links…"})):(o(),u("div",Qt,[t(f)&&!t(f).enabled?(o(),V(D,{key:0,color:"info",variant:"subtle",icon:"i-lucide-info",title:"Share links are disabled on this instance",description:"Set PIWI_SHARE_LINKS_ENABLED=true to allow minting them. Existing links stay stored but resolve to 404 while disabled."})):(o(),u(ee,{key:1},[t(L)?(o(),V(D,{key:0,color:"success",variant:"subtle",icon:"i-lucide-check",title:"Link created — copy it now",description:"For safety, the full link is shown only once. Anyone holding it can view this investigation until it expires or is revoked."})):w("",!0),t(L)?(o(),u("div",Xt,[b(y,{"model-value":t(L),readonly:"",class:"flex-1 font-mono",size:"sm"},null,8,["model-value"]),b(K,{icon:"i-lucide-copy",size:"sm",color:"neutral",variant:"outline",onClick:U},{default:S(()=>[...I[4]||(I[4]=[R("Copy",-1)])]),_:1})])):t(h)?(o(),u("div",en,[b(M,{label:"Expires after",class:"flex-1"},{default:S(()=>[b(Z,{modelValue:t(C),"onUpdate:modelValue":I[1]||(I[1]=te=>Se(C)?C.value=te:null),items:t(_),"value-key":"value",size:"sm",class:"w-full"},null,8,["modelValue","items"])]),_:1}),b(K,{icon:"i-lucide-plus",size:"sm",loading:t(x),onClick:T},{default:S(()=>[...I[5]||(I[5]=[R("Create link",-1)])]),_:1},8,["loading"])])):w("",!0)],64)),t(r).length>0?(o(),u("div",tn,[I[6]||(I[6]=p("p",{class:"text-xs font-medium text-gray-500"},"Existing links",-1)),(o(!0),u(ee,null,fe(t(r),te=>(o(),u("div",{key:te.id,class:"flex items-center gap-2 rounded-md border border-default px-2.5 py-1.5 text-sm"},[p("code",nn,"psl_"+k(te.tokenPrefix)+"…",1),b(N,{color:G(te).color,variant:"subtle",size:"sm"},{default:S(()=>[R(k(G(te).label),1)]),_:2},1032,["color"]),p("span",{class:"text-xs text-muted ml-auto",title:te.lastViewedAt??void 0},k(te.viewCount)+" "+k(te.viewCount===1?"view":"views"),9,on),t(h)&&!te.revokedAt?(o(),V(K,{key:0,icon:"i-lucide-ban",size:"xs",color:"error",variant:"ghost",title:"Revoke — the link stops resolving immediately",onClick:ce=>q(te)},null,8,["onClick"])):w("",!0)]))),128))])):t(f)?.enabled?(o(),V(Q,{key:3,text:"No share links yet for this page."})):w("",!0)]))]),_:1},8,["open"])],64)}}}),si=Object.assign(sn,{__name:"ShareLinksModal"}),an={class:"w-64 p-1 space-y-0.5"},rn={class:"flex items-center justify-between px-2 pt-1 pb-1"},ln=de({__name:"ExportMenu",props:{endpoint:{},baseName:{}},setup(e){const a=e,{download:i}=Vt(),{copy:c}=De(),n=qe(),s=J(!1),l=J(""),f=z(()=>(ze().app?.baseURL??"/").replace(/\/$/,""));function r(C){return`${f.value}${C}`}async function g(C){s.value=!1,await i(r(`${a.endpoint}?format=${C}`),`${a.baseName}.${C}`,{binary:C==="zip"})}function x(){s.value=!1,window.open(r(`${a.endpoint}?format=html&print=1`),"_blank")}async function L(C,_,T){l.value=_;try{const q=await fetch(r(C));if(!q.ok)throw new Error(`Request failed (${q.status})`);const U=await q.text();c(T?T(U):U,{toast:`${_} copied`}),s.value=!1}catch(q){n.add({title:`Could not copy ${_.toLowerCase()}`,description:Me(q),color:"error"})}finally{l.value=""}}function h(){return L(`${a.endpoint}?format=md`,"Report")}return(C,_)=>{const T=Le,q=pt,U=Kt,G=_t;return o(),V(G,{open:t(s),"onUpdate:open":_[4]||(_[4]=A=>Se(s)?s.value=A:null)},{content:S(()=>[p("div",an,[p("div",rn,[_[6]||(_[6]=p("p",{class:"text-xs font-medium text-gray-500"},"Download",-1)),b(q,{topic:"export.offline"})]),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-code",title:"One self-contained HTML file with screenshots and video embedded",onClick:_[0]||(_[0]=A=>g("html"))},{default:S(()=>[..._[7]||(_[7]=[R(" HTML — single file ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-archive",title:"Report plus the raw artifacts, including trace archives and data.json",onClick:_[1]||(_[1]=A=>g("zip"))},{default:S(()=>[..._[8]||(_[8]=[R(" ZIP — with all evidence ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-printer",title:"Opens the report with your browser's print dialog, for Save as PDF",onClick:x},{default:S(()=>[..._[9]||(_[9]=[R(" PDF — via print ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-text",title:"The Markdown report as a file",onClick:_[2]||(_[2]=A=>g("md"))},{default:S(()=>[..._[10]||(_[10]=[R(" Markdown ",-1)])]),_:1}),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-json",title:"Everything the report contains, machine-readable",onClick:_[3]||(_[3]=A=>g("json"))},{default:S(()=>[..._[11]||(_[11]=[R(" JSON ",-1)])]),_:1}),b(U,{class:"my-1"}),_[13]||(_[13]=p("p",{class:"text-xs font-medium text-gray-500 px-2 pt-1 pb-1"},"Copy to clipboard",-1)),b(T,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-clipboard-list",loading:t(l)==="Report",title:"The whole investigation as Markdown, for an issue or a chat",onClick:h},{default:S(()=>[..._[12]||(_[12]=[R(" Report (Markdown) ",-1)])]),_:1},8,["loading"])])]),default:S(()=>[b(T,{icon:"i-lucide-share",size:"xs",color:"neutral",variant:"outline",title:"Take this investigation away"},{default:S(()=>[..._[5]||(_[5]=[R(" Export ",-1)])]),_:1})]),_:1},8,["open"])}}}),ai=Object.assign(ln,{__name:"ExportMenu"}),cn={class:"flex items-center justify-between gap-2"},un=["aria-expanded","title"],dn={class:"text-lg font-medium inline-flex items-center gap-1 shrink-0"},pn={key:2,class:"min-w-0 flex-1 truncate text-sm text-gray-500 dark:text-gray-400"},fn={key:0,class:"flex items-center gap-1 shrink-0"},mn={key:0,class:"text-sm text-gray-500 mt-1 ml-11"},gn=de({__name:"CollapsibleSectionCard",props:{title:{},icon:{},subtitle:{},count:{},iconClass:{default:"text-primary"},help:{},storageKey:{},defaultFolded:{type:Boolean,default:!0}},setup(e,{expose:a}){const i=e,{folded:c,toggle:n,setFolded:s}=Zt(`piwi-section-fold-${i.storageKey}`,i.defaultFolded),l=J(null);function f(){s(!1),Ct(()=>l.value?.scrollIntoView({behavior:"smooth",block:"start"}))}return a({setFolded:s,reveal:f}),(r,g)=>{const x=we,L=pt,h=Yt;return o(),u("div",{ref_key:"rootEl",ref:l,class:"scroll-mt-4"},[b(h,{ui:{header:"p-3 sm:px-4 sm:py-3",body:t(c)?"p-0 sm:p-0":""},class:he(t(c)&&"divide-y-0")},{header:S(()=>[p("div",cn,[p("div",{class:"flex items-center gap-2 min-w-0 flex-1 cursor-pointer select-none rounded-sm outline-none focus-visible:outline-2 focus-visible:outline-primary",role:"button",tabindex:"0","aria-expanded":!t(c),title:t(c)?"Expand section":"Collapse section",onClick:g[1]||(g[1]=(...C)=>t(n)&&t(n)(...C)),onKeydown:[g[2]||(g[2]=ke((...C)=>t(n)&&t(n)(...C),["enter"])),g[3]||(g[3]=ke(_e((...C)=>t(n)&&t(n)(...C),["prevent"]),["space"]))]},[b(x,{name:t(c)?"i-lucide-chevron-right":"i-lucide-chevron-down",class:"size-4 shrink-0 text-gray-400"},null,8,["name"]),e.icon?(o(),V(x,{key:0,name:e.icon,class:he(["size-5 shrink-0",e.iconClass])},null,8,["name","class"])):w("",!0),p("h3",dn,[R(k(e.title),1),e.count!=null?(o(),u(ee,{key:0},[R(" ("+k(e.count)+")",1)],64)):w("",!0)]),e.help?(o(),u("span",{key:1,onClick:g[0]||(g[0]=_e(()=>{},["stop"]))},[b(L,{topic:e.help},null,8,["topic"])])):w("",!0),t(c)&&r.$slots.folded?(o(),u("span",pn,[Oe(r.$slots,"folded")])):w("",!0)],40,un),r.$slots.actions?(o(),u("div",fn,[Oe(r.$slots,"actions")])):w("",!0)]),!t(c)&&(e.subtitle||r.$slots.subtitle)?(o(),u("p",mn,[Oe(r.$slots,"subtitle",{},()=>[R(k(e.subtitle),1)])])):w("",!0)]),default:S(()=>[$t(p("div",null,[Oe(r.$slots,"default")],512),[[wt,!t(c)]])]),_:3},8,["ui","class"])],512)}}}),Ve=Object.assign(gn,{__name:"CollapsibleSectionCard"}),hn=/('(?:\\.|[^'])*'|"(?:\\.|[^"])*")|([A-Za-z_$][\w$]*)(?=\s*\()|([A-Za-z_$][\w$]*)(?=\s*:)|(true|false|null|\d+)|([{}(),.])/g;function yn(e){const a=[],i=new RegExp(hn.source,"g");let c=0,n;for(;(n=i.exec(e))!==null;){n.index>c&&a.push({kind:"plain",text:e.slice(c,n.index)});const s=n[1]?"string":n[2]?"method":n[3]?"option":n[4]?"literal":"punctuation";a.push({kind:s,text:n[0]}),c=i.lastIndex}return c<e.length&&a.push({kind:"plain",text:e.slice(c)}),a}const vn=["title"],xn=de({__name:"LocatorCode",props:{locator:{},truncate:{type:Boolean,default:!1}},setup(e){const a=e,i={method:"text-violet-700 dark:text-violet-300",string:"text-green-700 dark:text-green-300",option:"text-blue-700 dark:text-blue-300",literal:"text-amber-700 dark:text-amber-300",punctuation:"text-gray-500 dark:text-gray-400",plain:""},c=z(()=>yn(a.locator));return(n,s)=>(o(),u("code",{class:he(["font-mono",e.truncate?"block truncate":"break-words"]),title:e.locator},[(o(!0),u(ee,null,fe(t(c),(l,f)=>(o(),u("span",{key:f,class:he(i[l.kind])},k(l.text),3))),128))],10,vn))}}),Xe=Object.assign(xn,{__name:"LocatorCode"}),bn={class:"overflow-x-auto text-xs font-mono"},kn=de({__name:"DiffPatch",props:{patch:{}},setup(e){return(a,i)=>(o(),u("div",bn,[(o(!0),u(ee,null,fe(("parsePatchLines"in a?a.parsePatchLines:t(Nt))(e.patch),(c,n)=>(o(),u("div",{key:n,class:he(["px-3 py-px whitespace-pre leading-5 min-w-0",("patchLineClass"in a?a.patchLineClass:t(Ut))[c.type]])},k(c.text||" "),3))),128))]))}}),_n=Object.assign(kn,{__name:"DiffPatch"}),$n=["role","aria-checked","tabindex"],wn={class:"flex-1 min-w-0"},Cn={key:0,class:"text-[11px] leading-4 text-gray-500 truncate"},An=de({__name:"LocatorAlternativeRow",props:{alt:{},note:{default:void 0},copied:{type:Boolean,default:!1},dense:{type:Boolean,default:!1},selectable:{type:Boolean,default:!1},selected:{type:Boolean,default:!1}},emits:["copy","select"],setup(e){const a=e;function i(s){return s>=80?"success":s>=50?"warning":"error"}function c(s){const{method:l,score:f,args:r}=s;return r&&(r.anchorTestId||r.anchorSelector||r.anchorRole)?"scoped to a stable ancestor — survives renames":f>=100?"most stable — purpose-built for testing":l==="getByRole"&&r&&!("name"in r)?"name-free role — survives renames":l==="getByRole"?"browser ARIA tree — semantic and stable":l==="getByLabel"?"associated <label> element":l==="getByPlaceholder"?"input placeholder":l==="getByText"?"visible text":l==="getByAltText"?"image alt text":l==="getByTitle"?"title attribute":l==="locator"&&f>=50?"stable selector":l==="locator"?"CSS class — may be fragile":""}const n=z(()=>a.note??c(a.alt));return(s,l)=>{const f=Re,r=Xe,g=we,x=Le;return o(),u("div",{class:he(["flex items-center gap-2 rounded border",[e.dense?"py-1 px-2":"py-1.5 px-2.5",e.selectable?"cursor-pointer hover:bg-elevated transition-colors focus-visible:outline-2 focus-visible:outline-primary":"",e.selectable&&e.selected?"border-primary/60 ring-1 ring-primary/50":"border-default/50"]]),role:e.selectable?"radio":void 0,"aria-checked":e.selectable?e.selected:void 0,tabindex:e.selectable?0:void 0,onClick:l[1]||(l[1]=L=>e.selectable&&s.$emit("select")),onKeydown:[l[2]||(l[2]=ke(_e(L=>e.selectable&&s.$emit("select"),["prevent"]),["enter"])),l[3]||(l[3]=ke(_e(L=>e.selectable&&s.$emit("select"),["prevent"]),["space"]))]},[b(f,{size:"xs",color:i(e.alt.score),variant:"subtle",class:he(["shrink-0 font-mono tabular-nums cursor-default text-center",e.dense?"min-w-[2.25rem]":"min-w-[2.5rem]"]),title:`Stability score: ${e.alt.score}/100`},{default:S(()=>[R(k(e.alt.score),1)]),_:1},8,["color","class","title"]),p("div",wn,[b(r,{locator:e.alt.locator,truncate:"",class:"text-xs"},null,8,["locator"]),t(n)?(o(),u("p",Cn,k(t(n)),1)):w("",!0)]),e.alt.pickedByUser&&e.dense?(o(),V(g,{key:0,name:"i-lucide-user-check",class:"size-3.5 text-primary shrink-0",title:"Confirmed with the locator picker"})):e.alt.pickedByUser?(o(),V(f,{key:1,size:"xs",color:"primary",variant:"subtle",icon:"i-lucide-user-check",class:"shrink-0",title:"Confirmed with the locator picker on the failing page"})):w("",!0),b(x,{size:"xs",variant:"ghost",color:"neutral",icon:e.copied?"i-lucide-check":"i-lucide-copy",title:e.copied?"Copied!":"Copy",class:"shrink-0",onClick:l[0]||(l[0]=_e(L=>s.$emit("copy"),["stop"]))},null,8,["icon","title"])],42,$n)}}}),mt=Object.assign(An,{__name:"LocatorAlternativeRow"}),ot={getByTestId:"testid",getByRole:"semantic",getByLabel:"label",getByPlaceholder:"label",getByText:"text",getByAltText:"text",getByTitle:"text",locator:"css","page.locator":"css"},Sn=50;function gt(e,a,i=Sn){const c=a[0]??null;if(!c)return{recommended:null,durable:null,preservesConvention:!1,hasDurableAlternative:!1,suggestAddTestId:!1};const n=e?ot[e]:void 0,s=(e?a.find(r=>r.method===e&&r.score>=i):void 0)??(n?a.find(r=>ot[r.method]===n&&r.score>=i):void 0),f=a.find(r=>r.pickedByUser)??s??c;return{recommended:f,durable:c,preservesConvention:!!s&&f===s,hasDurableAlternative:f.locator!==c.locator,suggestAddTestId:c.score<i}}const ht={a:"link",button:"button",nav:"navigation",main:"main",article:"article",section:"region",form:"form",img:"img",figure:"figure",figcaption:"caption",blockquote:"blockquote",table:"table",caption:"caption",thead:"rowgroup",tbody:"rowgroup",tfoot:"rowgroup",tr:"row",td:"cell",ul:"list",ol:"list",li:"listitem",dialog:"dialog",output:"status",progress:"progressbar",meter:"meter",textarea:"textbox",h1:"heading",h2:"heading",h3:"heading",h4:"heading",h5:"heading",h6:"heading",details:"group",summary:"button",search:"search"},Tn={button:"button",submit:"button",reset:"button",image:"button",checkbox:"checkbox",radio:"radio",range:"slider",search:"searchbox",number:"spinbutton",text:"textbox",email:"textbox",tel:"textbox",url:"textbox",password:"textbox"},Ln=["id","class","name","data-testid","placeholder","alt","title","aria-label","aria-labelledby","aria-level","role","type","href","multiple"];function Rn(e){const a=e.attributes.role;if(a)return a;const i=e.tagName;if(!i)return null;if(i==="input"){const c=(e.attributes.type??"text").toLowerCase();return Tn[c]??"textbox"}return i==="select"?e.attributes.multiple!=null?"listbox":"combobox":i==="a"?e.attributes.href!=null?"link":null:ht[i]??null}function zn(e,a){if(a!=="heading")return null;const i=e.tagName.match(/^h([1-6])$/);if(i)return Number(i[1]);const c=e.attributes["aria-level"];return c&&/^\d+$/.test(c)?Number(c):null}const Ce=(e,a)=>e.attributes[a]||null,ve=e=>e.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),Fe=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),st=e=>/^[A-Za-z][A-Za-z0-9_-]*$/.test(e);function In(e){return/[a-f0-9]{8,}/i.test(e)?10:/^(?:css|sc|emotion|styled)-/i.test(e)?15:/^(bg|text|border|shadow|opacity|font|w-|h-|m[tblrxy]?-|p[tblrxy]?-|flex|grid|gap|rounded|absolute|relative|fixed|sticky|block|inline|hidden|overflow|z-|top-|right-|bottom-|left-|inset-|justify-|items-|self-|content-|order-|col-|row-)/.test(e)?25:/__/.test(e)||/--/.test(e)?35:/^[a-z]+(-[a-z]+)+$/.test(e)||/^[a-z]+[A-Z][a-zA-Z]+$/.test(e)?40:(e.includes("_")||/^[a-z]+-[a-z0-9]{5,}$/.test(e)&&/[0-9]/.test(e),15)}function at(e){return!!(/^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/i.test(e)||/^[a-f0-9]{8,}$/i.test(e)||/^[a-z]+-\d{4,}$/.test(e)||/^(tab|panel|input|select|option|dialog|modal|popup|tooltip|menu|listbox|combobox|checkbox|radio|textarea|button|field|label|accordion|collapse|step|slider|toggle|switch|dropdown|overlay|portal|layer)-\d+$/i.test(e)||/^(emotion-|styled-|css-|sc-)/.test(e)||e.startsWith("ng-")||/^(radix-|headlessui-|mui-|mantine-|chakra-)/i.test(e)||/^:r[0-9a-z]+:$/i.test(e)||/^«r[0-9a-z]+»$/i.test(e))}const Pn=new Set(["data-test","data-test-id","data-qa","data-qa-id","data-cy","data-e2e"]);function En(e){const a=[],i=new Set,c=y=>{i.has(y.locator)||(i.add(y.locator),a.push(y))},{accessibleName:n}=e,s=e.tagName,l=Rn(e),f=e.selectorCounts,r=y=>y==null||y<=1,g=y=>y!=null&&y>1?45:0,x=e.textContent?e.textContent.replace(/\s+/g," ").trim():null,L=Ce(e,"data-testid");L&&r(f?.testId)&&c({locator:`getByTestId('${ve(L)}')`,method:"getByTestId",args:{testId:L},score:100});const h=zn(e,l),C=h!=null?`, level: ${h}`:"",_=y=>h!=null?{...y,level:h}:y;l&&n&&c({locator:`getByRole('${l}', { name: '${ve(n)}'${C} })`,method:"getByRole",args:_({role:l,name:n}),score:90-g(f?.roleName)});const T=Ce(e,"aria-label");if(l&&T&&T!==n&&c({locator:`getByRole('${l}', { name: '${ve(T)}'${C} })`,method:"getByRole",args:_({role:l,name:T}),score:85-g(f?.roleName)}),n&&["input","select","textarea"].includes(s)){const y=Ce(e,"aria-label");(e.hasLabel===void 0||e.hasLabel===!0||y===n)&&c({locator:`getByLabel('${ve(n)}')`,method:"getByLabel",args:{label:n},score:85})}const q=Ce(e,"placeholder");q&&c({locator:`getByPlaceholder('${ve(q)}')`,method:"getByPlaceholder",args:{placeholder:q},score:80-g(f?.placeholder)}),x&&x.length<80&&c({locator:`getByText('${ve(x)}')`,method:"getByText",args:{text:x},score:75-g(f?.text)});const U=Ce(e,"id");if(U&&!at(U)&&r(f?.id)){const y=st(U)?`#${U}`:`[id="${Fe(U)}"]`;c({locator:`locator('${ve(y)}')`,method:"locator",args:{selector:y},score:65})}const G=Ce(e,"name");if(G&&r(f?.name)){const y=`[name="${Fe(G)}"]`;c({locator:`locator('${ve(y)}')`,method:"locator",args:{selector:y},score:60})}const A=Ce(e,"alt");A&&c({locator:`getByAltText('${ve(A)}')`,method:"getByAltText",args:{text:A},score:60-g(f?.alt)});const I=Ce(e,"title");I&&c({locator:`getByTitle('${ve(I)}')`,method:"getByTitle",args:{title:I},score:50-g(f?.title)});const K=!!(L&&r(f?.testId)),v=(y,Z,M)=>{let N=!1,Q=!1,me=!1,te=!1,ce=!1;for(const X of e.ancestors??[]){if(Z(X)!==1)continue;if(!N&&X.testId&&X.testIdCount===1&&(N=!0,c({locator:`getByTestId('${ve(X.testId)}').${y.expr}`,method:y.method,args:{...y.args,anchorTestId:X.testId},score:M.testId})),!Q&&X.id&&!at(X.id)&&X.idCount===1){Q=!0;const j=st(X.id)?`#${X.id}`:`[id="${Fe(X.id)}"]`;c({locator:`locator('${ve(j)}').${y.expr}`,method:y.method,args:{...y.args,anchorSelector:j},score:M.id})}if(!te&&X.dataAttr&&X.dataAttrCount===1){te=!0;const{name:j,value:oe}=X.dataAttr,W=`[${j}="${Fe(oe)}"]`;c({locator:`locator('${ve(W)}').${y.expr}`,method:y.method,args:{...y.args,anchorSelector:W},score:Pn.has(j)?M.testData:M.data})}const pe=X.role||ht[X.tag]||null;!me&&pe&&pe!==y.role&&X.roleCount===1&&(me=!0,c({locator:`getByRole('${ve(pe)}').${y.expr}`,method:y.method,args:{...y.args,anchorRole:pe},score:M.role})),!ce&&pe&&X.filterText&&X.filterRoleCount===1&&(ce=!0,c({locator:`getByRole('${ve(pe)}').filter({ hasText: '${ve(X.filterText)}' }).${y.expr}`,method:y.method,args:{...y.args,anchorRole:pe,anchorHasText:X.filterText},score:M.filter}))}};if(l&&!K){const y=h!=null?`'${l}', { level: ${h} }`:`'${l}'`,Z=_({role:l});v({expr:`getByRole(${y})`,method:"getByRole",args:Z,role:l},N=>N.scopedRoleCount,{testId:72,testData:70,id:64,data:60,role:55,filter:53});const M=e.rolePosition;M&&M.role===l&&(M.count===1||h!=null&&M.levelCount===1)&&c({locator:`getByRole(${y})`,method:"getByRole",args:Z,score:58})}else!l&&x&&x.length<80&&!K&&v({expr:`getByText('${ve(x)}')`,method:"getByText",args:{text:x},role:null},y=>y.scopedTextCount,{testId:68,testData:66,id:60,data:56,role:51,filter:49});const D=Ce(e,"class");if(D){const y=f?.classes,Z=D.split(/\s+/).filter(M=>M.length>1&&/^[A-Za-z_-][A-Za-z0-9_-]*$/.test(M)&&r(y?.[M])).map(M=>({cls:M,score:In(M)})).sort((M,N)=>N.score-M.score).slice(0,3);for(const{cls:M,score:N}of Z)c({locator:`locator('.${ve(M)}')`,method:"locator",args:{selector:`.${M}`},score:N})}return a.sort((y,Z)=>Z.score-y.score)}function Bn(e){const a=e.attributes,i=a["aria-label"];if(i)return i;if(e.textContent)return e.textContent;const c=a.title;if(c)return c;const n=a.placeholder;return n||null}function On(e,a){const{keep:i,tagRoles:c,inputRoles:n,roleSources:s,includeStructural:l,includeLabelText:f}=a,r={};for(const T of i){const q=e.getAttribute(T)??e[T];r[T]=typeof q=="string"?q.slice(0,200):q?String(q).slice(0,200):null}const g=e.getBoundingClientRect(),x={};try{const T=e.ownerDocument,q=A=>T.defaultView.CSS.escape(A),U=A=>{try{return T.querySelectorAll(A).length}catch{return}};r["data-testid"]&&(x.testId=U(`[data-testid=${JSON.stringify(r["data-testid"])}]`)),r.id&&(x.id=U(`#${q(r.id)}`)),r.name&&(x.name=U(`[name=${JSON.stringify(r.name)}]`)),r.placeholder&&(x.placeholder=U(`[placeholder=${JSON.stringify(r.placeholder)}]`)),r.alt&&(x.alt=U(`[alt=${JSON.stringify(r.alt)}]`)),r.title&&(x.title=U(`[title=${JSON.stringify(r.title)}]`));const G=(r.class||"").split(/\s+/).filter(A=>A.length>1).slice(0,10);if(G.length>0){const A={};for(const I of G){const K=U(`.${q(I)}`);K!==void 0&&(A[I]=K)}x.classes=A}}catch{}let L=null;const h=[];if(l&&c&&n&&s)try{const T=e.ownerDocument,q=j=>T.defaultView.CSS.escape(j),U=j=>{try{return T.querySelectorAll(j).length}catch{return}},G=new Map,A=new Map,I=j=>{const oe=G.get(j);if(oe!==void 0)return oe;let W;const E=j.getAttribute("role");if(E)W=E;else{const d=(j.tagName||"").toLowerCase();d==="input"?W=n[(j.getAttribute("type")||"text").toLowerCase()]??"textbox":d==="select"?W=j.getAttribute("multiple")!=null?"listbox":"combobox":d==="a"?W=j.getAttribute("href")!=null?"link":null:W=c[d]??null}return G.set(j,W),W},K=j=>{const oe=/^h([1-6])$/.exec((j.tagName||"").toLowerCase());if(oe)return Number(oe[1]);const W=j.getAttribute("aria-level");return W&&/^\d+$/.test(W)?Number(W):null},v=I(e),D=v==="heading"?K(e):null,y=j=>{const oe=j.getAttribute("aria-label");if(oe)return oe;const W=(j.textContent||"").replace(/\s+/g," ").trim();return W||j.getAttribute("title")||j.getAttribute("placeholder")||null},Z=y(e),M=(e.textContent||"").replace(/\s+/g," ").trim(),N=M?M.toLowerCase():null,Q=j=>{const oe=A.get(j);if(oe!==void 0)return oe;const W=(j.textContent||"").replace(/\s+/g," ").trim().toLowerCase();return A.set(j,W),W},me=2,te=(j,oe)=>{if(!N)return-1;const W=j.querySelectorAll("*");if(W.length>oe)return-1;let E=0;for(let d=0;d<W.length;d++){const ne=W[d];if(Q(ne).indexOf(N)===-1)continue;let m=!1;const B=ne.children;for(let H=0;H<B.length;H++)if(Q(B[H]).indexOf(N)!==-1){m=!0;break}if(m||E++,E>=me)return E}return E},ce=T.querySelectorAll(s),X=ce.length<=4e3,pe=!!v&&X;if(pe){let j=0,oe=-1,W=0,E=0;for(let d=0;d<ce.length;d++){const ne=ce[d];I(ne)===v&&(ne===e&&(oe=j),j++,D!=null&&K(ne)===D&&W++,Z!=null&&y(ne)===Z&&E++)}Z!=null&&(x.roleName=E),oe!==-1&&(L={role:v,count:j,index:oe,...D!=null?{levelCount:W}:{}})}if(N){const j=te(T.body||T.documentElement,4e3);j>=0&&(x.text=j)}if(pe||N){const j=["form","nav","main","article","section","dialog","table","li","tr"],oe=/^data-(v-[0-9a-f]+|reactid|react-checksum|svelte-\w+|ng-\w+|ember\w*)$/i,W=/^data-(index|idx|i|key|row|rownum|col|column|position|pos|order|sort|offset|page)$/i,E=["data-test","data-test-id","data-qa","data-qa-id","data-cy","data-e2e"],d=(O,Y)=>!O||O.slice(0,5)!=="data-"||O==="data-testid"||oe.test(O)||W.test(O)?!1:!!Y&&Y.length<=120,ne=O=>{const Y=O.attributes;if(!Y)return null;let le=null;for(let ge=0;ge<Y.length;ge++){const ue=Y[ge].name,ye=Y[ge].value;if(d(ue,ye)){if(E.indexOf(ue.toLowerCase())!==-1)return{name:ue,value:ye};le||(le={name:ue,value:ye})}}return le},m=O=>{let Y=0;for(let le=0;le<ce.length;le++)I(ce[le])===O&&Y++;return Y},B=O=>(O.textContent||"").replace(/\s+/g," ").trim(),H=O=>{const Y=O.replace(/[^A-Za-z]/g,"").length;return Y<2?!1:O.replace(/[^0-9]/g,"").length<=Y},F=O=>!!O&&O.length<=60&&O!==M&&H(O),ie=O=>{const Y=O.querySelector('h1,h2,h3,h4,h5,h6,[role="heading"]');if(Y){const ge=B(Y);if(F(ge))return ge}const le=O.querySelectorAll("*");if(le.length>200)return null;for(let ge=0;ge<le.length;ge++){const ue=le[ge];if(ue===e||ue.children.length>0)continue;const ye=B(ue);if(F(ye))return ye}return null},se=(O,Y)=>{const le=Y.toLowerCase();let ge=0;for(let ue=0;ue<ce.length;ue++)I(ce[ue])===O&&Q(ce[ue]).indexOf(le)!==-1&&ge++;return ge};let ae=e.parentElement,$e=0;for(;ae&&$e<12&&h.length<4;){$e++;const O=(ae.tagName||"").toLowerCase();if(O==="body"||O==="html")break;const Y=ae.getAttribute("data-testid"),le=ae.getAttribute("id"),ge=ae.getAttribute("role"),ue=ae.getAttribute("aria-label"),ye=ge||(j.includes(O)?c[O]:null)||null,Ae=ne(ae);if(Y||le||ye||ue||Ae){let P=-1;if(pe){const xe=ae.querySelectorAll(s);if(xe.length<=2e3){P=0;for(let Be=0;Be<xe.length;Be++){const He=xe[Be];I(He)===v&&(D!=null&&K(He)!==D||P++)}}}const $=te(ae,2e3);let re=null;try{ye&&X&&(re=ie(ae))}catch{re=null}h.push({tag:O,depth:$e,testId:Y||null,id:le||null,role:ge||null,ariaLabel:ue||null,...P>=0?{scopedRoleCount:P}:{},...$>=0?{scopedTextCount:$}:{},...Y?{testIdCount:U(`[data-testid=${JSON.stringify(Y)}]`)}:{},...le?{idCount:U(`#${q(le)}`)}:{},...ye&&X?{roleCount:m(ye)}:{},...re?{filterText:re,filterRoleCount:se(ye,re)}:{},...Ae?{dataAttr:Ae,dataAttrCount:U(`[${Ae.name}=${JSON.stringify(Ae.value)}]`)}:{}})}ae=ae.parentElement}}}catch{}const C=!!(e.labels&&e.labels.length>0);let _;if(f){_=null;try{const T=C?e.labels[0]:null;_=(T&&T.textContent||"").replace(/\s+/g," ").trim().slice(0,120)||null}catch{_=null}}return{tagName:e.tagName?.toLowerCase?.()??"unknown",attributes:r,textContent:(e.textContent||"").replace(/\s+/g," ").trim().slice(0,80),center:{x:Math.round(g.x+g.width/2),y:Math.round(g.y+g.height/2)},hasLabel:C,...f?{labelText:_}:{},selectorCounts:x,...l?{rolePosition:L,ancestors:h}:{}}}function Mn(e){const a=globalThis,i=a.document;if(!i||!i.body){e.transport==="postMessage"?a.parent.postMessage({type:"pickerClosed"},"*"):a.__piwiPickState="skipped";return}const c=2147483600,n=i.createElement("div");n.id="__piwi_picker_highlight",n.style.cssText=`position:fixed;pointer-events:none;z-index:${c};display:none;box-sizing:border-box;border:2px solid #a855f7;background:rgba(168,85,247,.14);border-radius:4px;box-shadow:0 0 0 1px rgba(255,255,255,.9),0 0 0 3px rgba(59,7,100,.55),inset 0 0 0 1px rgba(255,255,255,.5);`;const s=i.createElement("div");s.id="__piwi_picker_banner",s.style.cssText=`position:fixed;top:12px;left:50%;transform:translateX(-50%);z-index:${c+2};background:#111827;color:#f9fafb;font:13px/1.5 system-ui,sans-serif;border:1px solid #312e81;padding:10px 16px;border-radius:10px;box-shadow:0 4px 24px rgba(0,0,0,.5);max-width:min(680px,86vw);`;const l=m=>{const B=ae=>ae.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),H=/('(?:\\.|[^'])*'|"(?:\\.|[^"])*")|([A-Za-z_$][\w$]*)(?=\s*\()|([A-Za-z_$][\w$]*)(?=\s*:)|(true|false|null|\d+)|([{}(),.])/g;let F="",ie=0,se;for(;(se=H.exec(m))!==null;){se.index>ie&&(F+=B(m.slice(ie,se.index)));const ae=se[1]?"#86efac":se[2]?"#d8b4fe":se[3]?"#93c5fd":se[4]?"#fcd34d":"#9ca3af";F+=`<span style="color:${ae}">${B(se[0])}</span>`,ie=H.lastIndex}return ie<m.length&&(F+=B(m.slice(ie))),F},f="ui-monospace,SFMono-Regular,Menlo,Consolas,monospace",r=m=>`<code style="font-family:${f}">${l(m)}</code>`,g=i.createElement("div");g.innerHTML=e.transport==="postMessage"?"Click an element to generate locators":e.failing?`Piwi locator picker — click the element that should replace ${r(e.failing)}`:"Piwi inspector — click any element to generate locators for it";const x=i.createElement("div");x.id="__piwi_picker_locator",x.style.cssText=`display:none;margin-top:7px;padding:5px 9px;border-radius:7px;background:#0b1120;border:1px solid #4c1d95;font:13.5px/1.55 ${f};word-break:break-word;overflow-wrap:anywhere;`;const L=i.createElement("div");L.id="__piwi_picker_foot",L.style.cssText="color:#9ca3af;margin-top:6px;font-size:12px;",L.textContent="↑ parent · ↓ child · Esc skip",s.appendChild(g),s.appendChild(x),s.appendChild(L);const h=i.createElement("div");h.id="__piwi_picker_label",h.style.cssText=`position:fixed;pointer-events:none;z-index:${c+1};display:none;box-sizing:border-box;max-width:min(620px,92vw);background:#0b1120;color:#f9fafb;border:1px solid #7c3aed;border-radius:7px;padding:4px 8px;font:12.5px/1.45 ${f};white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-shadow:0 4px 18px rgba(0,0,0,.5);`,i.body.appendChild(n),i.body.appendChild(h),i.body.appendChild(s);const C=m=>m.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),_=m=>{const B=(m.tagName||"?").toLowerCase(),H=m.getAttribute&&m.getAttribute("data-testid");if(H)return`getByTestId('${C(H)}')`;if(m.labels&&m.labels.length>0){const O=(m.labels[0].textContent||"").replace(/\s+/g," ").trim().slice(0,80);if(O)return`getByLabel('${C(O)}')`}const F=m.getAttribute&&m.getAttribute("aria-label");if(F)return`getByLabel('${C(F)}')`;const ie=m.getAttribute&&m.getAttribute("placeholder");if(ie)return`getByPlaceholder('${C(ie)}')`;const se=m.getAttribute&&m.getAttribute("alt");if(se)return`getByAltText('${C(se)}')`;const ae=m.getAttribute&&m.getAttribute("title");if(ae)return`getByTitle('${C(ae)}')`;if(m.id)return`locator('#${C(m.id)}')`;const $e=(m.getAttribute&&m.getAttribute("class")||"").split(/\s+/).find(O=>O.length>1);return $e?`locator('.${C($e)}')`:B},T=m=>{const B=[];let H=m;for(;H&&B.length<15;){const F=(H.tagName||"").toLowerCase();if(F==="body"||F==="html")break;B.push(H),H=H.parentElement}return B.length?B:[m]},q=["button","a","input","select","textarea","summary","option"],U=m=>{for(let B=0;B<Math.min(m.length,4);B++){const H=m[B],F=(H.tagName||"").toLowerCase();if(q.includes(F)||H.getAttribute&&(H.getAttribute("role")||H.getAttribute("data-testid")))return B}return 0},G=m=>{const B=a.__piwiDescribeElement;if(typeof B=="function")try{const H=B(m);if(typeof H=="string"&&H)return H}catch{}return _(m)};let A=[],I=0,K=null,v=null;const D=m=>{h.style.display="block";const B=h.getBoundingClientRect(),H=a.innerWidth||i.documentElement.clientWidth||0,F=a.innerHeight||i.documentElement.clientHeight||0;let ie=m.top-B.height-6;ie<4&&(ie=m.bottom+6),ie+B.height>F-4&&(ie=Math.max(4,F-B.height-4));let se=m.left;se+B.width>H-6&&(se=H-B.width-6),se<6&&(se=6),h.style.left=se+"px",h.style.top=ie+"px"},y=()=>A[I]??null,Z=()=>{const m=y();if(!m){n.style.display="none",h.style.display="none";return}const B=m.getBoundingClientRect();if(n.style.display="block",n.style.left=B.left+"px",n.style.top=B.top+"px",n.style.width=B.width+"px",n.style.height=B.height+"px",m!==v){v=m;const H=(m.tagName||"?").toLowerCase(),F=l(G(m));h.innerHTML=`<span style="color:#c4b5fd"><${H}></span> ${F}`,x.innerHTML=F,x.style.display="block"}D(B),L.textContent="click to pick · ↑ parent · ↓ child · Esc skip"},M=m=>{m.preventDefault(),m.stopImmediatePropagation()},N=m=>m===s||m===n||m===h||s.contains&&s.contains(m)||!!(m&&m.__piwiHint);let Q="top";const me=m=>{Q!==m&&(Q=m,m==="bottom"?(s.style.top="auto",s.style.bottom="12px"):(s.style.top="12px",s.style.bottom="auto"))},te=m=>{const B=m.target;if(!B||N(B)){n.style.display="none",h.style.display="none";return}B!==K&&(K=B,A=T(B),I=U(A)),Z();const H=y();if(H){const F=H.getBoundingClientRect(),ie=s.getBoundingClientRect(),se=8;F.left<ie.right+se&&F.right>ie.left-se&&F.top<ie.bottom+se&&F.bottom>ie.top-se&&me(Q==="top"?"bottom":"top")}},ce=["mousedown","mouseup","pointerdown","pointerup","auxclick","dblclick"],X=()=>{i.removeEventListener("mousemove",te,!0),i.removeEventListener("click",E,!0),i.removeEventListener("keydown",d,!0),e.transport==="postMessage"&&a.removeEventListener("message",ne,!1)},pe=()=>{for(const m of ce)i.removeEventListener(m,M,!0)},j=()=>{n.remove(),h.remove(),s.remove()},oe=m=>{if(X(),n.style.display="none",h.style.display="none",e.transport==="postMessage"){const B=a.__piwiProbe,H=typeof B=="function"?B(m,e.probeArg):null;a.__piwiSnapshotExtras?.onPick?.(),i.addEventListener("click",M,!0),i.addEventListener("keydown",M,!0),L.textContent="Analyzing element…",a.parent.postMessage({type:"elementPicked",attrs:H},"*")}else pe(),a.__piwiPickedElement=m,a.__piwiPickState="picked",L.textContent="Analyzing element…"},W=()=>{X(),e.transport==="postMessage"?(i.removeEventListener("click",M,!0),i.removeEventListener("keydown",M,!0),pe(),a.__piwiSnapshotExtras?.onClose?.(),j(),a.parent.postMessage({type:"pickerClosed"},"*")):(pe(),a.__piwiPickState="skipped",j())},E=m=>{M(m);const B=y();!B||N(m.target)||oe(B)},d=m=>{if(m.key==="Escape"){M(m),W();return}(m.key==="ArrowUp"||m.key==="ArrowDown")&&(M(m),m.key==="ArrowUp"?I=Math.min(I+1,A.length-1):I=Math.max(I-1,0),Z())},ne=m=>{const B=m.data;!B||typeof B.type!="string"||B.type!=="piwiPickerKey"||typeof B.key!="string"||d({key:B.key,preventDefault(){},stopImmediatePropagation(){}})};a.__piwiPickCleanup=j,i.addEventListener("mousemove",te,!0),i.addEventListener("click",E,!0),i.addEventListener("keydown",d,!0);for(const m of ce)i.addEventListener(m,M,!0);e.transport==="postMessage"&&(a.addEventListener("message",ne,!1),a.parent.postMessage({type:"pickerReady"},"*"))}function Un(){var e=document,a=window,i=2147483600,c=[];function n(){for(var v=0;v<c.length;v++)c[v].parentNode&&c[v].parentNode.removeChild(c[v]);c=[]}function s(v){return(v||"").replace(/\s+/g," ").trim().toLowerCase()}function l(v){var D=s(v);if(D.length<2)return[];for(var y=e.querySelectorAll("button,a,[role],h1,h2,h3,h4,h5,h6,label,summary,input,textarea,select,option,span,li,td,th,p"),Z=[],M=[],N=0;N<y.length;N++){var Q=y[N],me=s(Q.textContent);if(!me){var te=s(Q.getAttribute&&(Q.getAttribute("placeholder")||Q.getAttribute("aria-label"))||"");te&&(te===D||te.indexOf(D)!==-1)&&Z.push(Q);continue}me.length>120||(me===D?Z.push(Q):me.indexOf(D)!==-1&&me.length<D.length+30&&M.push(Q))}return Z.concat(M)}function f(v,D){var y=v.getBoundingClientRect();if(y.width===0&&y.height===0)return null;var Z=e.createElement("div");return Z.__piwiHint=!0,Z.style.cssText="position:fixed;pointer-events:none;z-index:"+(i+1)+";box-sizing:border-box;border-radius:3px;transition:opacity .3s;border:2px solid "+D+";box-shadow:0 0 0 3px "+D+"55;left:"+y.left+"px;top:"+y.top+"px;width:"+y.width+"px;height:"+y.height+"px;",e.body.appendChild(Z),c.push(Z),Z}function r(v){var D=v.getBoundingClientRect();a.parent.postMessage({type:"piwiScrollTo",y:D.top},"*")}function g(v){if(n(),!(!v||!v.length)){for(var D=null,y=0;y<v.length;y++)for(var Z=v[y],M=l(Z&&Z.text),N=0;N<Math.min(M.length,3);N++)f(M[N],"#f59e0b"),D||(D=M[N]);D&&r(D),setTimeout(function(){for(var Q=0;Q<c.length;Q++)c[Q].style.opacity="0"},2600),setTimeout(n,3e3)}}var x=[],L=0;function h(){a.parent.postMessage({type:"piwiSearchResult",count:x.length,index:x.length?L:-1},"*")}function C(){n();var v=x[L];v&&(f(v,"#7c3aed"),r(v),h())}function _(v){if(x=l(v),L=0,!x.length){n(),h();return}C()}function T(){x.length&&(L=(L+1)%x.length,C())}function q(v){var D=v.data;if(!(!D||typeof D.type!="string")){if(D.type==="piwiHighlight")try{g(D.hints)}catch{}else if(D.type==="piwiSearch")try{_(D.q)}catch{}else if(D.type==="piwiSearchNext")try{T()}catch{}else if(D.type==="piwiClearHints")try{n()}catch{}}}a.addEventListener("message",q,!1);function U(v){v.preventDefault(),v.stopImmediatePropagation()}for(var G=["mousedown","mouseup","pointerdown","pointerup","auxclick","dblclick","contextmenu","submit","beforeinput","input","change","paste","cut","drop","dragstart","keypress","keyup","touchstart","touchend"],A=0;A<G.length;A++)e.addEventListener(G[A],U,!0);a.__piwiSnapshotExtras={onPick:function(){n()},onClose:function(){n(),a.removeEventListener("message",q,!1);for(var v=0;v<G.length;v++)e.removeEventListener(G[v],U,!0)}};function I(){var v=Math.max(e.documentElement?e.documentElement.scrollHeight:0,e.body?e.body.scrollHeight:0);v>0&&a.parent.postMessage({type:"piwiContentHeight",height:v},"*")}I();try{if(a.ResizeObserver){var K=new a.ResizeObserver(I);e.documentElement&&K.observe(e.documentElement),e.body&&K.observe(e.body)}}catch{}}function Nn(e){const a=[],i=new Set,c=s=>{if(typeof s!="string")return;const l=s.trim();if(l.length<2||l.length>80)return;const f=l.toLowerCase();i.has(f)||(i.add(f),a.push({text:l}))},n=s=>s&&(s.name??s.text??s.label??s.placeholder??s.alt??s.title);c(n(e.failingLocator?.args));for(const s of e.fromElementMatch??[])c(n(s.args));for(const s of e.fromAriaSnapshot??[])c(n(s.args));return a.slice(0,6)}const Ge=e=>e.replace(/<\/(script)/gi,"<\\/$1");function jn(e){const i={transport:"postMessage",probeArg:{keep:e.probedAttrs,includeStructural:!1,includeLabelText:!0}},c=Ge(String(On)),n=Ge(String(Un)),s=Ge(String(Mn));return`<script>globalThis.__piwiProbe = (${c});(${n})();(${s})(${JSON.stringify(i)});<\/script>`}function Dn(e){return e.replace(/<base\b[^>]*>/gi,"")}function Kn(e,a){return Dn(e)+jn(a)}const Vn={key:0,class:"flex items-center justify-center py-20"},Hn={key:1,class:"py-8 text-center"},Fn={class:"text-xs text-gray-400 mt-1"},qn={key:2,class:"py-8 text-center"},Zn={class:"mb-2 flex items-center gap-2 flex-wrap"},Wn={key:1,class:"ml-auto inline-flex rounded-md border border-default overflow-hidden text-xs"},Jn={key:0,class:"flex items-center gap-1 mb-1.5 text-xs text-gray-500"},Gn={class:"tabular-nums w-11 text-center select-none"},Yn={class:"ml-auto text-gray-400 tabular-nums"},Qn={key:1,class:"flex items-center gap-2 mb-1.5"},Xn={key:0,class:"text-xs text-gray-500 tabular-nums"},eo={key:1,class:"text-xs text-gray-400"},to={key:0,class:"absolute inset-0 flex items-center justify-center bg-white dark:bg-gray-900 z-10"},no=["src"],oo={key:2,class:"mt-4 space-y-3"},so={class:"flex items-center gap-3 bg-elevated rounded-lg p-3"},ao={class:"flex-1 min-w-0"},io={class:"text-sm font-medium"},ro={class:"text-xs"},lo={key:0,class:"text-xs text-gray-400 ml-1"},co={key:0,class:"text-xs text-gray-500 mt-0.5 truncate"},uo={class:"space-y-1",role:"radiogroup","aria-label":"Alternative locators"},po={class:"flex-1 min-w-0"},fo={class:"text-xs font-medium text-primary"},mo={class:"flex justify-between w-full"},go={key:1},ho={class:"flex gap-2"},yo=de({__name:"SnapshotLocatorPicker",props:Qe({runId:{},testRunsCaseId:{},failingLocator:{},healing:{}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:Qe(["close","confirmed"],["update:open"]),setup(e,{emit:a}){const i=e,c=a,n=lt(e,"open"),s=J(!1),l=J(null),f=J(null),r=J(void 0);async function g(){s.value=!0,f.value=null;try{const P=new URLSearchParams({inlineStyles:"1"});r.value&&P.set("source",r.value);const $=`?${P.toString()}`;l.value=await $fetch(`/api/test-run-cases/${i.testRunsCaseId}/dom-snapshot${$}`),l.value?.source&&(r.value=l.value.source)}catch(P){f.value=P instanceof Error?P.message:"Unknown error"}finally{s.value=!1}}const x=z(()=>l.value?.availableSources??[]);function L(P){P===r.value||s.value||(r.value=P,_.value=!1,h.value="pick-element",K.value=0,D.value=!1,T.value=null,q.value=[],F.value=null,W.value="",E.value=0,d.value=-1,g())}Ie(n,P=>{P&&(l.value=null,_.value=!1,h.value="pick-element",K.value=0,D.value=!1,r.value=void 0,T.value=null,q.value=[],F.value=null,W.value="",E.value=0,d.value=-1,g())});const h=J("pick-element"),C=J(null),_=J(!1),T=J(null),q=J([]),U=J(void 0);function G(P){return URL.createObjectURL(new Blob([Kn(P,{probedAttrs:Ln})],{type:"text/html"}))}Ie(()=>l.value?.html,P=>{U.value&&(URL.revokeObjectURL(U.value),U.value=void 0),P&&(U.value=G(P))},{immediate:!0});const A=J(null),I=J(0),K=J(0),v=J(1),D=J(!1),y=z(()=>l.value?.viewport??null),Z=z(()=>{const P=y.value;return!P?.width||!I.value?1:Math.min(I.value/P.width,1)}),M=z(()=>{const P=y.value;if(!P)return{width:"100%",height:K.value?`${K.value}px`:"100%"};const $=K.value||P.height;return{width:`${Math.round(P.width*v.value)}px`,height:`${Math.round($*v.value)}px`}}),N=z(()=>{const P=y.value;if(!P)return{width:"100%",height:K.value?`${K.value}px`:"100%",border:"0"};const $=K.value||P.height;return{width:`${P.width}px`,height:`${$}px`,transform:`scale(${v.value})`,transformOrigin:"top left",border:"0"}}),Q=z(()=>Math.round(v.value*100)),me=P=>Math.min(4,Math.max(.1,P));function te(P){D.value=!0,v.value=me(v.value*P)}function ce(){D.value=!1,v.value=Z.value}Ie([Z,y],()=>{D.value||(v.value=Z.value)});let X=null;Ie(A,P=>{X?.disconnect(),P&&(I.value=P.clientWidth,X=new ResizeObserver($=>{for(const re of $)I.value=re.contentRect.width}),X.observe(P))}),Pe(()=>{X?.disconnect()}),Pe(()=>{U.value&&URL.revokeObjectURL(U.value)});function pe(P){if(!C.value||P.source!==C.value.contentWindow)return;const $=P.data;if($?.type==="pickerReady"){_.value=!0,oe();return}if($?.type==="piwiContentHeight"&&typeof $.height=="number"){K.value=Math.max($.height,y.value?.height??0);return}if($?.type==="piwiScrollTo"&&typeof $.y=="number"){const re=A.value;re&&re.scrollTo({top:Math.max(0,$.y*v.value-80),behavior:"smooth"});return}if($?.type==="piwiSearchResult"){E.value=typeof $.count=="number"?$.count:0,d.value=typeof $.index=="number"?$.index:-1;return}if($?.type==="elementPicked"&&$.attrs){const{labelText:re,...xe}=$.attrs;T.value={...xe,accessibleName:re??Bn(xe)},q.value=En(T.value),F.value=null,h.value="review"}$?.type==="pickerClosed"&&Y()}function j(P){C.value?.contentWindow?.postMessage(P,"*")}function oe(){const P=Nn({failingLocator:i.failingLocator,fromElementMatch:i.healing?.fromElementMatch??null,fromAriaSnapshot:i.healing?.fromAriaSnapshot??null});P.length&&j({type:"piwiHighlight",hints:P})}const W=J(""),E=J(0),d=J(-1);let ne=null;Ie(W,P=>{ne&&clearTimeout(ne),ne=setTimeout(()=>j({type:"piwiSearch",q:P}),180)});function m(){j({type:"piwiSearchNext"})}Pe(()=>{ne&&clearTimeout(ne)});function B(P){if(!n.value||h.value!=="pick-element"||!_.value||P.key!=="ArrowUp"&&P.key!=="ArrowDown")return;const $=(document.activeElement?.tagName??"").toLowerCase();if($==="input"||$==="textarea")return;const re=C.value?.contentWindow;re&&(P.preventDefault(),re.postMessage({type:"piwiPickerKey",key:P.key},"*"))}function H(){C.value&&(C.value.src="about:blank")}ct(()=>{window.addEventListener("message",pe),window.addEventListener("keydown",B,!0)}),Pe(()=>{window.removeEventListener("message",pe),window.removeEventListener("keydown",B,!0)});const F=J(null),ie=J(!1);function se(P){F.value=P}const ae=z(()=>gt(i.failingLocator.method,q.value)),$e=qe();async function O(){if(F.value){ie.value=!0;try{(await $fetch(`/api/test-run-cases/${i.testRunsCaseId}/locator-pick`,{method:"POST",body:{failingLocator:i.failingLocator,pickedLocator:F.value,element:T.value}})).status==="ok"?c("confirmed",F.value):$e.add({title:"Pick not saved",description:"This failure has no call-site or locator signature to attach the pick to.",color:"warning",icon:"i-lucide-alert-triangle"}),n.value=!1}catch(P){$e.add({title:"Could not save the pick",description:Me(P),color:"error",icon:"i-lucide-alert-triangle"})}finally{ie.value=!1}}}function Y(){H(),n.value=!1}function le(){T.value=null,q.value=[],F.value=null,h.value="pick-element",_.value=!1,W.value="",E.value=0,d.value=-1;const P=l.value?.html;P&&(U.value&&URL.revokeObjectURL(U.value),U.value=G(P))}const{copy:ge}=De(),ue=J(null);let ye=null;function Ae(P,$){ge(P,{toast:"Locator copied"}),ue.value=$,ye&&clearTimeout(ye),ye=setTimeout(()=>{ue.value=null},2e3)}return Pe(()=>{ye&&clearTimeout(ye)}),(P,$)=>{const re=we,xe=Le,Be=rt,He=Re,vt=Xe,xt=ut;return o(),V(xt,{open:n.value,"onUpdate:open":$[8]||($[8]=be=>n.value=be),ui:{content:"max-w-6xl w-[95vw]"},onAfterLeave:Y},{header:S(()=>[...$[9]||($[9]=[p("div",null,[p("h3",{class:"text-lg font-medium"},"Pick a locator from the DOM snapshot"),p("p",{class:"text-sm text-gray-500 mt-0.5"}," Click the element the failing locator should target. Use ↑↓ to walk the DOM tree. ")],-1)])]),body:S(()=>[t(s)?(o(),u("div",Vn,[b(re,{name:"i-lucide-loader",class:"size-6 animate-spin text-gray-400"}),$[10]||($[10]=p("span",{class:"ml-2 text-sm text-gray-500"},"Loading DOM snapshot...",-1))])):t(f)?(o(),u("div",Hn,[b(re,{name:"i-lucide-alert-triangle",class:"size-8 text-red-300 mx-auto mb-2"}),$[12]||($[12]=p("p",{class:"text-sm text-red-500"},"Failed to load snapshot",-1)),p("p",Fn,k(t(f)),1),b(xe,{size:"xs",variant:"outline",color:"neutral",class:"mt-3",onClick:g},{default:S(()=>[...$[11]||($[11]=[R("Retry",-1)])]),_:1})])):t(l)?.status!=="ok"||!t(l).html?(o(),u("div",qn,[b(re,{name:"i-lucide-file-x",class:"size-8 text-gray-300 mx-auto mb-2"}),$[13]||($[13]=p("p",{class:"text-sm text-gray-500"},"No DOM snapshot or ARIA data available for this execution",-1)),$[14]||($[14]=p("p",{class:"text-xs text-gray-400 mt-1"},"This test run has no stored trace or ARIA snapshot to pick from.",-1))])):(o(),u(ee,{key:3},[p("div",Zn,[t(l).source?(o(),u("div",{key:0,class:he(["text-xs flex items-center gap-1",t(l).source==="aria"?"text-amber-600 dark:text-amber-400":"text-green-600 dark:text-green-400"])},[b(re,{name:t(l).source==="aria"?"i-lucide-accessibility":"i-lucide-check",class:"size-3.5 shrink-0"},null,8,["name"]),t(l).source==="aria"?(o(),u(ee,{key:0},[R(" Accessibility tree from the failure-time ARIA snapshot — element styles are approximate ")],64)):(o(),u(ee,{key:1},[R(" Rendered from the failure-time DOM snapshot ")],64))],2)):w("",!0),t(x).length>1?(o(),u("div",Wn,[p("button",{type:"button",class:he(["px-2 py-1 flex items-center gap-1 transition-colors",t(r)==="dom"?"bg-primary/10 text-primary font-medium":"text-gray-500 hover:bg-elevated"]),title:"Rendered page from the trace",onClick:$[0]||($[0]=be=>L("dom"))},[b(re,{name:"i-lucide-layout-panel-top",class:"size-3.5"}),$[15]||($[15]=R(" DOM ",-1))],2),p("button",{type:"button",class:he(["px-2 py-1 flex items-center gap-1 border-l border-default transition-colors",t(r)==="aria"?"bg-primary/10 text-primary font-medium":"text-gray-500 hover:bg-elevated"]),title:"Accessibility tree from the ARIA snapshot",onClick:$[1]||($[1]=be=>L("aria"))},[b(re,{name:"i-lucide-accessibility",class:"size-3.5"}),$[16]||($[16]=R(" Tree ",-1))],2)])):w("",!0)]),t(y)?(o(),u("div",Jn,[b(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-zoom-out",title:"Zoom out",onClick:$[2]||($[2]=be=>te(1/1.25))}),p("span",Gn,k(t(Q))+"%",1),b(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-zoom-in",title:"Zoom in",onClick:$[3]||($[3]=be=>te(1.25))}),b(xe,{size:"xs",variant:"outline",color:"neutral",class:"ml-1",onClick:ce},{default:S(()=>[...$[17]||($[17]=[R("Fit",-1)])]),_:1}),p("span",Yn,k(t(y).width)+"×"+k(t(y).height),1)])):w("",!0),t(h)==="pick-element"?(o(),u("div",Qn,[b(Be,{modelValue:t(W),"onUpdate:modelValue":$[4]||($[4]=be=>Se(W)?W.value=be:null),size:"xs",icon:"i-lucide-search",placeholder:"Find an element by its text…",class:"max-w-xs",onKeydown:ke(_e(m,["prevent"]),["enter"])},null,8,["modelValue","onKeydown"]),t(W)&&t(E)>0?(o(),u("span",Xn,k(t(d)+1)+"/"+k(t(E)),1)):t(W)?(o(),u("span",eo,"no matches")):w("",!0),t(E)>1?(o(),V(xe,{key:2,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-chevron-down",title:"Next match (Enter)",onClick:m})):w("",!0)])):w("",!0),p("div",{ref_key:"stageRef",ref:A,class:he(["relative border border-default rounded-lg overflow-auto",[t(h)==="pick-element"?"h-[75vh]":"h-80",t(y)?"bg-gray-100 dark:bg-gray-800":""]])},[t(_)?w("",!0):(o(),u("div",to,[b(re,{name:"i-lucide-loader",class:"size-5 animate-spin text-gray-400"}),$[18]||($[18]=p("span",{class:"ml-2 text-sm text-gray-500"},"Initializing picker...",-1))])),p("div",{style:nt(t(M))},[p("iframe",{ref_key:"iframeRef",ref:C,src:t(U),style:nt(t(N)),class:"bg-white",sandbox:"allow-scripts",title:"DOM snapshot"},null,12,no)],4)],2),t(h)==="review"&&t(T)?(o(),u("div",oo,[p("div",so,[b(re,{name:"i-lucide-crosshair",class:"size-5 text-primary shrink-0"}),p("div",ao,[p("p",io,[$[19]||($[19]=R(" Picked: ",-1)),p("code",ro,k(t(T).tagName),1),t(T).attributes.id?(o(),u("code",lo,"#"+k(t(T).attributes.id),1)):w("",!0),t(T).attributes["data-testid"]?(o(),V(He,{key:1,size:"xs",color:"primary",variant:"subtle",class:"ml-1"},{default:S(()=>[R(k(t(T).attributes["data-testid"]),1)]),_:1})):w("",!0)]),t(T).textContent?(o(),u("p",co,' "'+k(t(T).textContent)+'" ',1)):w("",!0)]),b(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-rotate-ccw",title:"Pick a different element",onClick:le})]),p("div",uo,[(o(!0),u(ee,null,fe(t(q),(be,Je)=>(o(),V(mt,{key:Je,alt:be,copied:t(ue)===`picked-${Je}`,dense:!0,selectable:!0,selected:t(F)?.locator===be.locator,onCopy:bt=>Ae(be.locator,`picked-${Je}`),onSelect:bt=>se(be)},null,8,["alt","copied","selected","onCopy","onSelect"]))),128))]),t(ae).recommended?(o(),u("div",{key:0,class:"rounded-lg border border-primary/40 bg-primary/5 p-3 flex items-center gap-3 cursor-pointer",role:"button",tabindex:"0",title:"Select this locator for Confirm",onClick:$[6]||($[6]=be=>se(t(ae).recommended)),onKeydown:$[7]||($[7]=ke(_e(be=>se(t(ae).recommended),["prevent"]),["enter"]))},[b(re,{name:"i-lucide-star",class:"size-5 text-primary shrink-0"}),p("div",po,[p("p",fo," Recommended (score: "+k(t(ae).recommended.score)+") ",1),b(vt,{locator:t(ae).recommended.locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"])]),b(xe,{size:"sm",color:"primary",variant:"solid","trailing-icon":t(ue)==="rec"?"i-lucide-check":"i-lucide-copy",onClick:$[5]||($[5]=_e(be=>Ae(t(ae).recommended.locator,"rec"),["stop"]))},{default:S(()=>[...$[20]||($[20]=[R(" Copy ",-1)])]),_:1},8,["trailing-icon"])],32)):w("",!0)])):w("",!0)],64))]),footer:S(()=>[p("div",mo,[t(h)==="review"?(o(),V(xe,{key:0,size:"sm",variant:"outline",color:"neutral",icon:"i-lucide-rotate-ccw",onClick:le},{default:S(()=>[...$[21]||($[21]=[R(" Pick a different element ",-1)])]),_:1})):(o(),u("div",go)),p("div",ho,[b(xe,{size:"sm",variant:"outline",color:"neutral",onClick:Y},{default:S(()=>[...$[22]||($[22]=[R("Cancel",-1)])]),_:1}),t(h)==="review"?(o(),V(xe,{key:0,size:"sm",color:"primary",loading:t(ie),disabled:!t(F),onClick:O},{default:S(()=>[...$[23]||($[23]=[R(" Confirm pick ",-1)])]),_:1},8,["loading","disabled"])):w("",!0)])])]),_:1},8,["open"])}}}),vo=Object.assign(yo,{__name:"SnapshotLocatorPicker"});function xo(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function bo(e,a){let i=0,c=null;for(let n=a;n<e.length;n++){const s=e[n];if(c){if(s==="\\"){n++;continue}s===c&&(c=null);continue}if(s==="'"||s==='"'||s==="`"){c=s;continue}if(s==="(")i++;else if(s===")"&&(i--,i===0))return n}return-1}function ko(e,a,i){if(!e||!a||!i)return null;const c=new RegExp(`${xo(a)}\\s*\\(`,"g");let n;for(;(n=c.exec(e))!==null;){const s=n.index,l=s>0?e[s-1]:"";if(l&&/[A-Za-z0-9_$]/.test(l))continue;const f=s+n[0].lastIndexOf("("),r=bo(e,f);if(r===-1)return null;const g=e.slice(0,s)+i+e.slice(r+1);return g===e?null:{old:e,new:g}}return null}function _o(e,a){return`${a?`@@ ${a} @@
|
|
2
2
|
`:""}-${e.old.trimEnd()}
|
|
3
|
-
+${e.new.trimEnd()}`}function $o(e,a){const
|
|
4
|
-
`)}const Co={key:1},Ao={class:"flex items-center gap-1"},So=["href"],To={key:2,class:"rounded-lg border border-primary/50 bg-primary/10 p-3 mb-3 flex items-center gap-3"},Lo={class:"flex-1 min-w-0"},Ro={class:"text-xs font-medium text-primary flex items-center gap-1.5"},zo={key:3,class:"bg-elevated rounded p-2 mb-3 border border-red-200 dark:border-red-800"},Io={class:"flex items-center gap-2"},Po={class:"text-xs font-mono text-red-600 dark:text-red-400 flex-1 truncate"},Eo={key:0,class:"flex items-center gap-2 mt-1.5 pl-6"},Bo={class:"text-xs text-gray-500"},Oo={class:"font-medium text-gray-700 dark:text-gray-300"},Mo={key:5,class:"rounded-lg border border-primary/40 bg-primary/5 p-3 mb-3 space-y-2"},Uo={class:"flex items-center gap-2 min-w-0"},No={key:0,class:"text-[11px] text-gray-500 truncate min-w-0"},jo={key:0,class:"rounded border border-default overflow-hidden bg-default"},Do={key:0,class:"text-xs flex flex-wrap items-center gap-x-1.5 gap-y-0.5"},Ko={class:"font-mono text-gray-500"},Vo={key:0,class:"font-mono text-red-500 line-through"},Ho={key:1,class:"text-gray-400"},Fo={key:2,class:"font-mono text-green-600 dark:text-green-400"},qo={key:3,class:"text-gray-400"},Zo={key:2,class:"text-xs text-gray-500"},Wo={key:3,class:"text-xs text-primary/90 flex items-center gap-1"},Jo={class:"flex items-center gap-2"},Go={key:6,class:"rounded-lg border border-default bg-elevated p-3 mb-3 flex items-center gap-3"},Yo={class:"flex-1 min-w-0"},Qo={class:"text-xs font-medium text-success-600 dark:text-success-400"},Xo={class:"space-y-2"},es={key:7,class:"mt-3"},ts={class:"space-y-2"},ns={class:"flex items-center gap-1"},rt=3,os=de({__name:"LocatorHealingPanel",props:{runId:{},testRunsCaseId:{},storageKey:{},affectedCount:{},aiIntents:{}},setup(e){const a=e,r=z(()=>a.storageKey?Ve:Ke),c=z(()=>a.storageKey?{storageKey:a.storageKey}:{}),{data:n,pending:s,error:l}=je(()=>`/api/test-run-cases/${a.testRunsCaseId}/locator-healing`,{lazy:!0},"$Zgad3xb7ix"),f=z(()=>!!n.value&&n.value.source!=="none"&&!!(n.value.fromElementMatch?.length||n.value.fromPriorSuccess?.length||n.value.fromAriaSnapshot?.length)),i=z(()=>n.value?n.value.fromElementMatch??n.value.fromPriorSuccess??n.value.fromAriaSnapshot??[]:[]),g=z(()=>i.value.find(E=>E.pickedByUser)??null),x=z(()=>n.value?.recommendation?n.value.recommendation:n.value?.priorNameMayBeStale||!i.value.length?null:gt(n.value?.failingLocator?.method,i.value)),L=z(()=>n.value?.priorNameMayBeStale&&n.value.fromPriorSuccess?.length?n.value.fromAriaSnapshot??[]:[]),h=z(()=>{const E=x.value;return E?.recommended?E.recommended.pickedByUser?"Confirmed with the locator picker on the failing page":E.preservesConvention?"Keeps your original locator style — minimal, idiomatic edit":E.suggestAddTestId?"Most stable available, but still fragile":"Most stable available — a sturdier style than the original":""}),C=z(()=>{const E=n.value?.priorNameMayBeStale,d=(()=>{switch(n.value?.source){case"prior-run":return E?"Pre-captured from the last passing run — the element looks changed since":"Pre-captured from the last passing run — highest confidence";case"element-match":return"The element looks renamed or moved — these are fresh locators for its current identity on the failing page";case"fingerprint":return"Matched by locator signature (line numbers shifted)";case"cross-test":return"Captured by another test in this project that uses the same locator";case"aria-snapshot":return"Generated from the failure-time ARIA snapshot — limited, no HTML attributes";default:return""}})(),ne=n.value?.capturedAt;return ne?`${d} · captured ${We(ne)}`:d}),_=z(()=>{if(n.value?.priorNameMayBeStale)return"text-warning-600 dark:text-warning-400";switch(n.value?.source){case"prior-run":case"fingerprint":case"cross-test":return"text-success-600 dark:text-success-400";case"element-match":return"text-primary-600 dark:text-primary-400";default:return"text-warning-600 dark:text-warning-400"}}),T=z(()=>{const E=n.value?.failingLocator;return E?`${E.method}(${JSON.stringify(E.args)})`:""});function q(E){return E.toLowerCase().replace(/[\s'"`{}[\]]/g,"")}const U=z(()=>{if(!a.aiIntents?.length||!T.value)return null;const E=q(T.value);return a.aiIntents.find(d=>q(d.locator)===E)??null}),G=ze(),{data:A}=je(()=>`/api/test-run-cases/${a.testRunsCaseId}/traces`,{lazy:!0,transform:E=>E.items},"$eLKRphd7VZ"),I=z(()=>{const E=A.value?.[0];if(!E)return null;const d=!!G.public.demoMode&&E.filePath.startsWith("demo/");return dt(E.filePath,G.app?.baseURL,d)}),K=J(!1);async function v(){await St(`/api/test-run-cases/${a.testRunsCaseId}/locator-healing`)}const{copy:D}=De(),y=J(null);let Z=null;function M(E,d,ne){D(E,{toast:ne}),y.value=d,Z&&clearTimeout(Z),Z=setTimeout(()=>{y.value=null},2e3)}function N(E,d){M(E,d,"Locator copied")}Pe(()=>{Z&&clearTimeout(Z)});const Q=z(()=>x.value?.recommended??null),me=z(()=>a.affectedCount&&a.affectedCount>1&&Q.value?`Same break affects ${a.affectedCount} tests in this cluster — one fix`:""),te=z(()=>{if(Q.value?.pickedByUser)return"your confirmed pick";switch(n.value?.source){case"prior-run":return"from the last passing run";case"fingerprint":return"from a prior run (line shifted)";case"cross-test":return"from another test in this project";case"element-match":return"from the current failing page";case"aria-snapshot":return"from the ARIA snapshot";default:return""}}),ce=z(()=>{const E=n.value?.sourceLine,d=Q.value;if(!E||!d)return null;const ne=ko(E.text,n.value?.failingLocator?.method,d.locator);return ne?{edit:ne,patch:_o(ne,n.value?.location??null)}:null}),X=z(()=>{if(ce.value)return[];const E=n.value?.failingLocator,d=Q.value;return!E||!d||d.method!==E.method?[]:$o(E.args,d.args)});function pe(){const E=Q.value;!E||!n.value||M(wo({location:n.value.location??null,sourceLine:n.value.sourceLine??null,failing:T.value,recommended:E.locator}),"fix-prompt","Fix prompt copied")}function j(){const E=n.value?.edit?.unifiedDiff;E&&M(E,"git-apply","Patch copied")}const oe=J(!1),W=z(()=>oe.value?i.value:i.value.slice(0,rt));return(E,d)=>{const ne=Xe,m=Le,B=At,H=Ze,F=we,re=Re,se=_n,ae=mt,$e=Dt;return o(),u(ee,null,[!t(s)&&!t(l)&&t(f)?(o(),V(Te(t(r)),Ne({key:0},t(c),{"data-shot":"alternative-locators",icon:"i-lucide-bandage",title:"Alternative locators",count:t(i).length,help:"locator-healing"}),Ee({subtitle:S(()=>[p("span",{class:he(t(_))},k(t(C)),3)]),default:S(()=>[t(n)?.healedInRunId?(o(),V(H,{key:0,class:"mb-3",color:"success",icon:"i-lucide-circle-check",variant:"subtle",title:"Locator healed"},{description:S(()=>[d[11]||(d[11]=R(" The recommended locator now passes at this call site — ",-1)),b(B,{to:`/test-runs/${t(n).healedInRunId}`,class:"underline font-medium"},{default:S(()=>[R(" see run #"+k(t(n).healedInRunId),1)]),_:1},8,["to"]),d[12]||(d[12]=R(". ",-1))]),_:1})):w("",!0),t(n)?.healAction?(o(),V(H,{key:1,class:"mb-3",color:t(n).healAction.status==="opened"?"primary":"neutral",icon:"i-lucide-bandage",variant:"subtle",title:t(n).healAction.status==="opened"?"Piwi opened a heal PR":"Heal PR queued"},{description:S(()=>[t(n).healAction.status==="opened"&&t(n).healAction.prUrl?(o(),u(ee,{key:0},[d[13]||(d[13]=R(" Auto-heal opened ",-1)),p("a",{href:t(n).healAction.prUrl,target:"_blank",rel:"noopener",class:"underline font-medium"}," PR #"+k(t(n).healAction.prNumber),9,So),d[14]||(d[14]=R(" to rewrite this locator. ",-1))],64)):(o(),u(ee,{key:1},[d[15]||(d[15]=R(" Auto-heal has queued a fix for this locator on branch ",-1)),p("code",null,k(t(n).healAction.branch),1),d[16]||(d[16]=R(". ",-1))],64))]),_:1},8,["color","title"])):w("",!0),t(g)?(o(),u("div",To,[b(F,{name:"i-lucide-user-check",class:"size-5 text-primary shrink-0"}),p("div",Lo,[p("p",Ro,[d[18]||(d[18]=R(" Your pick ",-1)),b(re,{size:"sm",color:"primary",variant:"subtle"},{default:S(()=>[...d[17]||(d[17]=[R("confirmed on the failing page",-1)])]),_:1})]),b(ne,{locator:t(g).locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"])]),b(m,{size:"sm",color:"primary",variant:"solid","trailing-icon":t(y)==="user-pick"?"i-lucide-check":"i-lucide-copy",onClick:d[1]||(d[1]=O=>N(t(g).locator,"user-pick"))},{default:S(()=>[...d[19]||(d[19]=[R(" Copy ",-1)])]),_:1},8,["trailing-icon"])])):w("",!0),t(n)?.failingLocator?(o(),u("div",zo,[p("div",Io,[b(F,{name:"i-lucide-x-circle",class:"size-4 text-red-500 shrink-0"}),p("code",Po,k(t(T)),1),b(m,{size:"xs",variant:"ghost",color:"neutral",icon:t(y)==="failing"?"i-lucide-check":"i-lucide-copy",title:t(y)==="failing"?"Copied!":"Copy",onClick:d[2]||(d[2]=O=>N(t(T),"failing"))},null,8,["icon","title"])]),t(U)?(o(),u("div",Eo,[b(F,{name:"i-lucide-wand-sparkles",class:"size-3.5 text-primary shrink-0"}),p("span",Bo,[d[23]||(d[23]=R(" Compiled from prompt ",-1)),p("span",Oo,"“"+k(t(U).template)+"”",1),t(U).kind==="run"?(o(),u(ee,{key:0},[d[20]||(d[20]=R(" (a ",-1)),d[21]||(d[21]=p("code",{class:"text-xs"},"piwiRun",-1)),d[22]||(d[22]=R(" flow step)",-1))],64)):w("",!0)])])):w("",!0)])):w("",!0),t(n)?.priorNameMayBeStale?(o(),V(H,{key:4,class:"mb-3",color:"warning",icon:"i-lucide-alert-triangle",variant:"subtle",title:"The element's name looks changed",description:"The captured accessible name no longer appears on the failing page, so name-based alternatives (and the failing locator itself) probably no longer match. Prefer the structural options, or the failing-page candidates below."})):w("",!0),t(Q)?(o(),u("div",Mo,[p("div",Uo,[b(F,{name:"i-lucide-star",class:"size-4 text-primary shrink-0"}),d[24]||(d[24]=p("p",{class:"text-xs font-medium text-primary shrink-0"},"Recommended fix",-1)),t(te)?(o(),u("span",No," · "+k(t(te)),1)):w("",!0),d[25]||(d[25]=p("span",{class:"flex-1"},null,-1)),b(re,{size:"xs",color:"primary",variant:"subtle",class:"font-mono tabular-nums shrink-0"},{default:S(()=>[R(k(t(Q).score),1)]),_:1})]),t(ce)?(o(),u("div",jo,[b(se,{patch:t(ce).patch},null,8,["patch"])])):(o(),u(ee,{key:1},[b(ne,{locator:t(Q).locator,truncate:"",class:"text-sm"},null,8,["locator"]),t(X).length?(o(),u("p",Do,[(o(!0),u(ee,null,fe(t(X),(O,Y)=>(o(),u(ee,{key:Y},[p("span",Ko,k(O.key)+":",1),O.from?(o(),u("span",Vo,k(O.from),1)):(o(),u("span",Ho,"—")),b(F,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),O.to?(o(),u("span",Fo,k(O.to),1)):(o(),u("span",qo,"removed"))],64))),128))])):w("",!0)],64)),t(h)?(o(),u("p",Zo,k(t(h)),1)):w("",!0),t(me)?(o(),u("p",Wo,[b(F,{name:"i-lucide-layers",class:"size-3 shrink-0"}),R(k(t(me)),1)])):w("",!0),p("div",Jo,[b(m,{size:"xs",color:"primary",variant:"solid","trailing-icon":t(y)==="top"?"i-lucide-check":"i-lucide-copy",onClick:d[3]||(d[3]=O=>N(t(Q).locator,"top"))},{default:S(()=>[...d[26]||(d[26]=[R(" Copy locator ",-1)])]),_:1},8,["trailing-icon"]),b(m,{size:"xs",color:"neutral",variant:"outline",icon:t(y)==="fix-prompt"?"i-lucide-check":"i-lucide-sparkles",title:"Copy an instruction an AI coding agent can apply directly to the test",onClick:pe},{default:S(()=>[...d[27]||(d[27]=[R(" Copy fix prompt ",-1)])]),_:1},8,["icon"]),t(n)?.edit?.unifiedDiff?(o(),V(m,{key:0,size:"xs",color:"neutral",variant:"outline",icon:t(y)==="git-apply"?"i-lucide-check":"i-lucide-copy",title:"Copy a git apply patch that rewrites the failing locator line",onClick:j},{default:S(()=>[...d[28]||(d[28]=[R(" Copy patch ",-1)])]),_:1},8,["icon"])):w("",!0)])])):w("",!0),t(x)?.hasDurableAlternative&&t(x).durable?(o(),u("div",Go,[b(F,{name:"i-lucide-shield-check",class:"size-5 text-success shrink-0"}),p("div",Yo,[p("p",Qo," Most stable option (score: "+k(t(x).durable.score)+") ",1),b(ne,{locator:t(x).durable.locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"]),d[29]||(d[29]=p("p",{class:"text-xs text-gray-500 mt-0.5"},"Sturdier, but changes the locator style",-1))]),b(m,{size:"sm",color:"neutral",variant:"outline","trailing-icon":t(y)==="durable"?"i-lucide-check":"i-lucide-copy",onClick:d[4]||(d[4]=O=>N(t(x).durable.locator,"durable"))},{default:S(()=>[...d[30]||(d[30]=[R(" Copy ",-1)])]),_:1},8,["trailing-icon"])])):w("",!0),p("div",Xo,[d[31]||(d[31]=p("p",{class:"text-xs font-medium text-gray-500"},"All alternatives",-1)),(o(!0),u(ee,null,fe(t(W),(O,Y)=>(o(),V(ae,{key:Y,alt:O,copied:t(y)===`alt-${Y}`,onCopy:le=>N(O.locator,`alt-${Y}`)},null,8,["alt","copied","onCopy"]))),128)),t(i).length>rt?(o(),V(m,{key:0,size:"xs",variant:"ghost",color:"neutral",block:"",icon:t(oe)?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:d[5]||(d[5]=O=>oe.value=!t(oe))},{default:S(()=>[R(k(t(oe)?"Show fewer":`Show all ${t(i).length} alternatives`),1)]),_:1},8,["icon"])):w("",!0)]),t(L).length?(o(),u("div",es,[d[32]||(d[32]=p("p",{class:"text-xs font-medium text-gray-500 mb-2"},"From the failing page",-1)),p("div",ts,[(o(!0),u(ee,null,fe(t(L),(O,Y)=>(o(),V(ae,{key:Y,alt:O,note:"candidate from the failure-time ARIA snapshot",copied:t(y)===`supp-${Y}`,onCopy:le=>N(O.locator,`supp-${Y}`)},null,8,["alt","copied","onCopy"]))),128))])])):w("",!0),t(x)?.suggestAddTestId?(o(),V(H,{key:8,class:"mt-3",color:"warning",icon:"i-lucide-info",variant:"subtle",title:"All alternatives are fragile",description:"Every captured locator scores below 50. Add a stable data-testid attribute to this element in the app for a durable fix."})):w("",!0),t(n)?.source==="aria-snapshot"?(o(),V(H,{key:9,class:"mt-3",color:"info",icon:"i-lucide-info",variant:"subtle"},{description:S(()=>[d[34]||(d[34]=R(" No HTML attributes were available. ",-1)),b($e,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:S(()=>[...d[33]||(d[33]=[R("Enable Piwi fixture capture",-1)])]),_:1}),d[35]||(d[35]=R(" for full alternatives including data-testid and CSS selectors. ",-1))]),_:1})):w("",!0)]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[t(x)?.recommended?(o(),V(ne,{key:0,locator:t(x).recommended.locator,class:"text-xs"},null,8,["locator"])):(o(),u("span",Co,k(t(i).length)+" alternative"+k(t(i).length===1?"":"s"),1))]),key:"0"}:void 0,t(I)||t(n)?.failingLocator?{name:"actions",fn:S(()=>[p("div",Ao,[t(n)?.failingLocator?(o(),V(m,{key:0,size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-mouse-pointer",title:"Open the failure-time DOM snapshot and click the element to pick a locator",onClick:d[0]||(d[0]=O=>K.value=!0)},{default:S(()=>[...d[9]||(d[9]=[R(" Pick from snapshot ",-1)])]),_:1})):w("",!0),t(I)?(o(),V(m,{key:1,to:t(I),target:"_blank",size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-crosshair",title:"Open the failure trace in the trace viewer — its Pick locator tool works on the recorded page snapshots"},{default:S(()=>[...d[10]||(d[10]=[R(" Pick from trace ",-1)])]),_:1},8,["to"])):w("",!0)])]),key:"1"}:void 0]),1040,["count"])):!t(s)&&!t(l)&&!t(f)?(o(),V(Te(t(r)),Ne({key:1},t(c),{icon:"i-lucide-bandage",title:"Alternative locators",subtitle:"No alternatives available",help:"locator-healing"}),Ee({default:S(()=>[b(H,{color:"neutral",icon:"i-lucide-info",variant:"subtle"},{description:S(()=>[d[40]||(d[40]=R(" No pre-captured alternatives — this locator has never passed in a previous run. ",-1)),b($e,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:S(()=>[...d[39]||(d[39]=[R("Enable Piwi dashboard fixtures",-1)])]),_:1}),d[41]||(d[41]=R(" to capture element attributes at test time, or use “Pick from snapshot” above to choose a locator by hand on the failure-time page. ",-1))]),_:1})]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[d[36]||(d[36]=p("span",null,"No alternatives available",-1))]),key:"0"}:void 0,t(I)||t(n)?.failingLocator?{name:"actions",fn:S(()=>[p("div",ns,[t(n)?.failingLocator?(o(),V(m,{key:0,size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-mouse-pointer",title:"Open the failure-time DOM snapshot and click the element to pick a locator",onClick:d[6]||(d[6]=O=>K.value=!0)},{default:S(()=>[...d[37]||(d[37]=[R(" Pick from snapshot ",-1)])]),_:1})):w("",!0),t(I)?(o(),V(m,{key:1,to:t(I),target:"_blank",size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-crosshair",title:"Open the failure trace in the trace viewer — its Pick locator tool works on the recorded page snapshots"},{default:S(()=>[...d[38]||(d[38]=[R(" Pick from trace ",-1)])]),_:1},8,["to"])):w("",!0)])]),key:"1"}:void 0]),1040)):w("",!0),t(n)?.failingLocator?(o(),V(vo,{key:2,open:t(K),"onUpdate:open":d[7]||(d[7]=O=>Se(K)?K.value=O:null),"run-id":e.runId,"test-runs-case-id":e.testRunsCaseId,"failing-locator":t(n).failingLocator,healing:t(n),onConfirmed:v,onClose:d[8]||(d[8]=O=>K.value=!1)},null,8,["open","run-id","test-runs-case-id","failing-locator","healing"])):w("",!0)],64)}}}),rr=Object.assign(os,{__name:"LocatorHealingPanel"}),ss={key:1,class:"space-y-2"},as={class:"text-xs font-medium text-gray-500 dark:text-gray-400 sm:w-40 shrink-0"},rs={class:"flex flex-wrap items-center gap-1.5 min-w-0 text-xs font-mono"},is={class:"rounded bg-red-50 px-1.5 py-0.5 text-red-700 dark:bg-red-950/30 dark:text-red-400 break-all"},ls={class:"rounded bg-green-50 px-1.5 py-0.5 text-green-700 dark:bg-green-950/30 dark:text-green-400 break-all"},cs={key:0,class:"text-xs text-gray-400 dark:text-gray-500"},us={key:0},ds=de({__name:"EnvironmentDiffCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:a}){const r=e,c=z(()=>r.storageKey?Ve:Ke),n=z(()=>r.storageKey?{storageKey:r.storageKey}:{}),{data:s,pending:l,error:f}=je(()=>`/api/test-run-cases/${r.testRunsCaseId}/environment-diff`,{lazy:!0},"$0pD8W6UYqF"),i=z(()=>s.value?.entries??[]),g=z(()=>i.value.filter(_=>!_.informational)),x=z(()=>i.value.filter(_=>_.informational)),L=z(()=>{const _=s.value?.baseline;if(!_)return"";const T=_.startTime?` · ${We(new Date(_.startTime))}`:"";return`vs last pass in run #${_.runId}${T}`}),h=z(()=>{if(s.value?.status!=="ok")return"No passing baseline to compare against";const _=g.value.length;return _===0?"Identical to last pass — no environment drift":`${_} change${_===1?"":"s"}: ${g.value.map(T=>T.label).join(", ")}`}),C=J(null);return a({reveal:()=>C.value?.reveal?.()}),(_,T)=>{const q=Ze,U=we;return!t(l)&&!t(f)&&t(s)?.status==="ok"?(o(),V(Te(t(c)),Ne({key:0,ref_key:"card",ref:C},t(n),{icon:"i-lucide-git-compare-arrows",title:"Environment diff",count:t(g).length||void 0,help:"environment-diff",subtitle:t(L)}),Ee({default:S(()=>[t(i).length===0?(o(),V(q,{key:0,color:"success",icon:"i-lucide-check-circle",variant:"subtle",description:"The environment is identical to the last passing run — environment drift is unlikely to explain this failure."})):(o(),u("div",ss,[(o(!0),u(ee,null,fe(t(g),G=>(o(),u("div",{key:G.key,class:"rounded-lg border border-default p-3 flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3"},[p("span",as,k(G.label),1),p("div",rs,[p("code",is,k(G.failing??"(unset)"),1),b(U,{name:"i-lucide-arrow-left",class:"size-3 shrink-0 text-gray-400"}),p("code",ls,k(G.baseline??"(unset)"),1)])]))),128)),t(x).length>0?(o(),u("p",cs,[T[0]||(T[0]=R(" Also changed (varies naturally between runs): ",-1)),(o(!0),u(ee,null,fe(t(x),(G,A)=>(o(),u("span",{key:G.key},[R(k(G.label.toLowerCase())+" "+k(G.baseline??"—")+" → "+k(G.failing??"—"),1),A<t(x).length-1?(o(),u("span",us,", ")):w("",!0)]))),128))])):w("",!0)]))]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[p("span",null,k(t(h)),1)]),key:"0"}:void 0]),1040,["count","subtitle"])):w("",!0)}}}),ir=Object.assign(ds,{__name:"EnvironmentDiffCard"}),ps={class:"absolute top-4 left-4 text-white/70 text-sm font-medium"},fs=["src","alt"],ms=de({__name:"ScreenshotLightbox",props:{images:{},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:a}){const r=e,c=a,n=z(()=>r.modelValue!==null);function s(){c("update:modelValue",null)}function l(){r.modelValue!==null&&r.modelValue>0&&c("update:modelValue",r.modelValue-1)}function f(){r.modelValue!==null&&r.modelValue<r.images.length-1&&c("update:modelValue",r.modelValue+1)}const i=z(()=>r.modelValue===null?null:r.images[r.modelValue]??null);function g(x){n.value&&(x.key==="Escape"&&s(),x.key==="ArrowLeft"&&l(),x.key==="ArrowRight"&&f())}return ct(()=>window.addEventListener("keydown",g)),Tt(()=>window.removeEventListener("keydown",g)),(x,L)=>{const h=we;return o(),V(Lt,{to:"body"},[b(Rt,{name:"lightbox"},{default:S(()=>[n.value?(o(),u("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/90",onClick:_e(s,["self"])},[p("button",{class:"absolute top-4 right-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:s},[b(h,{name:"i-lucide-x",class:"size-6"})]),p("div",ps,k((e.modelValue??0)+1)+" / "+k(e.images.length),1),e.images.length>1&&(e.modelValue??0)>0?(o(),u("button",{key:0,class:"absolute left-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:l},[b(h,{name:"i-lucide-chevron-left",class:"size-6"})])):w("",!0),i.value?(o(),u("img",{key:1,src:i.value.src,alt:i.value.name,class:"max-h-[90vh] max-w-[90vw] object-contain rounded-lg",onClick:L[0]||(L[0]=_e(()=>{},["stop"]))},null,8,fs)):w("",!0),e.images.length>1&&(e.modelValue??0)<e.images.length-1?(o(),u("button",{key:2,class:"absolute right-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:f},[b(h,{name:"i-lucide-chevron-right",class:"size-6"})])):w("",!0)])):w("",!0)]),_:1})])}}}),yt=Object.assign(zt(ms,[["__scopeId","data-v-c02b1e9b"]]),{__name:"ScreenshotLightbox"}),gs={class:"flex justify-end mb-2"},hs={key:1,class:"rounded overflow-hidden border border-default bg-gray-50 dark:bg-gray-900"},ys=["src"],vs={key:2,class:"grid grid-cols-1 sm:grid-cols-2 gap-2"},xs={class:"rounded overflow-hidden border border-red-200 dark:border-red-900 bg-gray-50 dark:bg-gray-900"},bs=["src"],ks={class:"rounded overflow-hidden border border-green-200 dark:border-green-900 bg-gray-50 dark:bg-gray-900"},_s={class:"px-2 py-1 text-[10px] font-medium text-green-600 dark:text-green-400"},$s=["src"],ws=de({__name:"VisualDiffCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:a}){const r=e,c=z(()=>r.storageKey?Ve:Ke),n=z(()=>r.storageKey?{storageKey:r.storageKey}:{}),s=ze(),{data:l,pending:f,error:i}=je(()=>`/api/test-run-cases/${r.testRunsCaseId}/visual-diff`,{lazy:!0},"$QAhY8Q5pJg"),g=z(()=>l.value?.status==="ok"?l.value.diff??null:null),x=J("overlay"),L=[{label:"Overlay",value:"overlay"},{label:"Side by side",value:"side-by-side"}],h=z(()=>g.value?Ue(g.value.path,"image/png",s.app?.baseURL):""),C=z(()=>g.value?Ue(g.value.failingPath,null,s.app?.baseURL):""),_=z(()=>g.value?Ue(g.value.baselinePath,null,s.app?.baseURL):""),T=z(()=>g.value?(g.value.changedPixelRatio*100).toFixed(2):"0"),q=z(()=>{const K=g.value?.changedPixelRatio??0;return K>.1?"error":K>.01?"warning":"success"}),U=z(()=>g.value?g.value.dimensionMismatch?`${T.value}% changed — dimensions differ, unreliable`:`${T.value}% of pixels changed vs last pass`:"No comparable screenshots"),G=z(()=>g.value?[{src:C.value,name:"Failing screenshot"},{src:_.value,name:"Last passing screenshot"},{src:h.value,name:"Diff overlay"}]:[]),A=J(null),I=J(null);return a({reveal:()=>I.value?.reveal?.()}),(K,v)=>{const D=Re,y=Ze,Z=Ht,M=yt;return!t(f)&&!t(i)&&t(g)?(o(),V(Te(t(c)),Ne({key:0,ref_key:"card",ref:I},t(n),{icon:"i-lucide-images",title:"Visual diff",help:"visual-diff"}),Ee({subtitle:S(()=>[p("span",null,"vs last pass in run #"+k(t(g).baselineRunId),1)]),actions:S(()=>[b(D,{color:t(q),variant:"subtle",size:"sm",class:"font-mono tabular-nums"},{default:S(()=>[R(k(t(T))+"% changed ",1)]),_:1},8,["color"])]),default:S(()=>[t(g).dimensionMismatch?(o(),V(y,{key:0,class:"mb-3",color:"warning",icon:"i-lucide-alert-triangle",variant:"subtle",title:"Screenshot dimensions differ",description:"The failing and passing screenshots have different sizes (viewport change?). They are compared on a padded canvas, so the changed-pixel ratio is inflated and unreliable."})):w("",!0),p("div",gs,[b(Z,{modelValue:t(x),"onUpdate:modelValue":v[0]||(v[0]=N=>Se(x)?x.value=N:null),items:L,size:"xs",content:!1,ui:{list:"overflow-x-auto",trigger:"shrink-0"}},null,8,["modelValue"])]),t(x)==="overlay"?(o(),u("div",hs,[p("img",{src:t(h),alt:"Diff overlay (red = changed pixels)",class:"w-full max-h-96 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open diff overlay in lightbox",onClick:v[1]||(v[1]=N=>A.value=2),onKeydown:[v[2]||(v[2]=ke(N=>A.value=2,["enter"])),v[3]||(v[3]=ke(_e(N=>A.value=2,["prevent"]),["space"]))]},null,40,ys),v[11]||(v[11]=p("p",{class:"px-2 py-1 text-[10px] text-gray-500"},"Red pixels mark differences against the last passing run",-1))])):(o(),u("div",vs,[p("div",xs,[v[12]||(v[12]=p("p",{class:"px-2 py-1 text-[10px] font-medium text-red-600 dark:text-red-400"},"Failing",-1)),p("img",{src:t(C),alt:"Failing screenshot",class:"w-full max-h-80 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open failing screenshot in lightbox",onClick:v[4]||(v[4]=N=>A.value=0),onKeydown:[v[5]||(v[5]=ke(N=>A.value=0,["enter"])),v[6]||(v[6]=ke(_e(N=>A.value=0,["prevent"]),["space"]))]},null,40,bs)]),p("div",ks,[p("p",_s," Last pass (run #"+k(t(g).baselineRunId)+") ",1),p("img",{src:t(_),alt:"Last passing screenshot",class:"w-full max-h-80 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open last passing screenshot in lightbox",onClick:v[7]||(v[7]=N=>A.value=1),onKeydown:[v[8]||(v[8]=ke(N=>A.value=1,["enter"])),v[9]||(v[9]=ke(_e(N=>A.value=1,["prevent"]),["space"]))]},null,40,$s)])])),b(M,{modelValue:t(A),"onUpdate:modelValue":v[10]||(v[10]=N=>Se(A)?A.value=N:null),images:t(G)},null,8,["modelValue","images"])]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[p("span",null,k(t(U)),1)]),key:"0"}:void 0]),1040)):w("",!0)}}}),lr=Object.assign(ws,{__name:"VisualDiffCard"}),Cs={class:"max-h-96 overflow-y-auto"},As={key:0,class:"mt-2 text-xs text-gray-400 dark:text-gray-500"},Ye=2e4,Ss=de({__name:"DomSnapshotCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:a}){const r=e,c=z(()=>r.storageKey?Ve:Ke),n=z(()=>r.storageKey?{storageKey:r.storageKey}:{}),{data:s,pending:l,error:f}=je(()=>`/api/test-run-cases/${r.testRunsCaseId}/dom-snapshot`,{lazy:!0},"$rAu-vOWv77"),i=z(()=>(s.value?.html??"").slice(0,Ye)),g=z(()=>(s.value?.html?.length??0)>Ye),x=z(()=>{const _=s.value;return!_||_.status!=="ok"?"":`${Math.round((_.html?.length??0)/1024)} KB · rendered from the uploaded trace${_.snapshotName?` (${_.snapshotName})`:""}`}),{copy:L,copied:h}=De(),C=J(null);return a({reveal:()=>C.value?.reveal?.()}),(_,T)=>{const q=Le,U=Ft,G=qt;return!t(l)&&!t(f)&&t(s)?.status==="ok"&&t(s).html?(o(),V(Te(t(c)),Ne({key:0,ref_key:"card",ref:C},t(n),{icon:"i-lucide-file-code",title:"DOM snapshot",help:"dom-snapshot",subtitle:t(x)}),Ee({actions:S(()=>[b(U,{text:t(h)?"Copied!":"Copy full HTML"},{default:S(()=>[b(q,{size:"xs",variant:"ghost",color:"neutral",icon:t(h)?"i-lucide-check":"i-lucide-clipboard",onClick:T[0]||(T[0]=A=>t(L)(t(s).html))},null,8,["icon"])]),_:1},8,["text"])]),default:S(()=>[p("div",Cs,[b(G,{code:t(i),lang:"xml"},null,8,["code"])]),t(g)||t(s).truncated?(o(),u("p",As,[t(g)?(o(),u(ee,{key:0},[R("Showing the first "+k(Math.round(Ye/1e3))+"k characters — use Copy for the full document.",1)],64)):(o(),u(ee,{key:1},[R("The snapshot was truncated to its size cap.")],64))])):w("",!0)]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[p("span",null,"Failure-time HTML extracted from the trace — "+k(Math.round((t(s).html.length??0)/1024))+" KB",1)]),key:"0"}:void 0]),1040,["subtitle"])):w("",!0)}}}),cr=Object.assign(Ss,{__name:"DomSnapshotCard"}),Ts={class:"rounded-md border border-default overflow-hidden"},Ls={class:"text-xs font-semibold text-gray-600 dark:text-gray-300 flex-1"},Rs={key:0,class:"text-gray-400 font-normal ml-1"},zs={key:0},Is=de({__name:"TestEvidenceSection",props:Qe({icon:{},label:{},count:{},collapsible:{type:Boolean}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(e){const a=e,r=lt(e,"open"),c=z(()=>a.collapsible===!1||r.value);return(n,s)=>{const l=we;return o(),u("div",Ts,[(o(),V(Te(e.collapsible===!1?"div":"button"),{class:he(["w-full flex items-center gap-1.5 px-3 py-2 bg-elevated border-b border-default text-left",e.collapsible!==!1&&"hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer"]),onClick:s[0]||(s[0]=f=>e.collapsible!==!1&&(r.value=!r.value))},{default:S(()=>[b(l,{name:e.icon,class:"size-3.5 shrink-0 text-primary/70"},null,8,["name"]),p("span",Ls,[R(k(e.label),1),e.count!=null?(o(),u("span",Rs,"("+k(e.count)+")",1)):w("",!0)]),e.collapsible!==!1?(o(),V(l,{key:0,name:r.value?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400"},null,8,["name"])):w("",!0)]),_:1},8,["class"])),t(c)?(o(),u("div",zs,[Oe(n.$slots,"default")])):w("",!0)])}}}),et=Object.assign(Is,{__name:"TestEvidenceSection"}),Ps={class:"grid grid-cols-2 gap-2 p-2 bg-gray-50 dark:bg-gray-900"},Es=["aria-label","onClick","onKeydown"],Bs=["src","alt"],Os={class:"absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-black/30"},Ms={class:"absolute bottom-0 inset-x-0 px-1.5 py-0.5 text-[10px] text-white bg-black/50 truncate"},Us=de({__name:"TestEvidenceScreenshots",props:{attachments:{}},setup(e){const a=e,r=ze();function c(l){return l.split("/").pop()||l}const n=z(()=>a.attachments.filter(l=>Wt(l.path,l.contentType)).map(l=>({src:Ue(l.path,l.contentType,r.app?.baseURL),name:l.name||c(l.path)}))),s=J(null);return(l,f)=>{const i=we,g=yt,x=et;return t(n).length>0?(o(),V(x,{key:0,icon:"i-lucide-image",label:"Screenshots",count:t(n).length,collapsible:!1},{default:S(()=>[p("div",Ps,[(o(!0),u(ee,null,fe(t(n),(L,h)=>(o(),u("div",{key:L.src,class:"relative group cursor-pointer rounded overflow-hidden border border-default outline-none focus-visible:outline-2 focus-visible:outline-primary",role:"button",tabindex:"0","aria-label":`View screenshot ${L.name}`,onClick:C=>s.value=h,onKeydown:[ke(C=>s.value=h,["enter"]),ke(_e(C=>s.value=h,["prevent"]),["space"])]},[p("img",{src:L.src,alt:L.name,class:"w-full h-28 object-cover object-top transition-opacity group-hover:opacity-80",loading:"lazy"},null,8,Bs),p("div",Os,[b(i,{name:"i-lucide-zoom-in",class:"size-5 text-white"})]),p("p",Ms,k(L.name),1)],40,Es))),128))]),b(g,{modelValue:t(s),"onUpdate:modelValue":f[0]||(f[0]=L=>Se(s)?s.value=L:null),images:t(n)},null,8,["modelValue","images"])]),_:1},8,["count"])):w("",!0)}}}),ur=Object.assign(Us,{__name:"TestEvidenceScreenshots"}),Ns={class:"m-0"},js={class:"bg-black rounded overflow-hidden"},Ds=["src"],Ks=["title"],Vs=de({__name:"VideoPlayer",props:{src:{},label:{}},setup(e){return(a,r)=>(o(),u("figure",Ns,[p("div",js,[p("video",{src:e.src,controls:"",preload:"metadata",class:"w-full max-h-96"}," Your browser does not support the video tag. ",8,Ds)]),e.label?(o(),u("figcaption",{key:0,class:"mt-1 text-xs text-gray-400 truncate",title:e.label},k(e.label),9,Ks)):w("",!0)]))}}),Hs=Object.assign(Vs,{__name:"VideoPlayer"}),Fs={class:"space-y-2 p-2 bg-gray-50 dark:bg-gray-900"},qs=de({__name:"TestEvidenceVideos",props:{attachments:{}},setup(e){const a=e,r=ze();function c(s){return s.split("/").pop()||s}const n=z(()=>a.attachments.filter(s=>Jt(s.path,s.contentType)).map(s=>({src:Ue(s.path,s.contentType,r.app?.baseURL),name:s.name||c(s.path)})));return(s,l)=>{const f=Hs,i=et;return t(n).length>0?(o(),V(i,{key:0,icon:"i-lucide-video",label:"Videos",count:t(n).length,collapsible:!1},{default:S(()=>[p("div",Fs,[(o(!0),u(ee,null,fe(t(n),g=>(o(),V(f,{key:g.src,src:g.src,label:g.name},null,8,["src","label"]))),128))])]),_:1},8,["count"])):w("",!0)}}}),dr=Object.assign(qs,{__name:"TestEvidenceVideos"}),Zs={class:"flex items-center justify-between gap-2"},Ws={class:"flex items-center gap-2 min-w-0"},Js={class:"text-sm truncate"},Gs={key:0,class:"text-xs text-gray-400 shrink-0"},Ys={key:1,class:"text-xs text-gray-400 shrink-0"},Qs={class:"flex items-center gap-1.5 shrink-0"},Xs=de({__name:"TraceListItem",props:{trace:{},showTime:{type:Boolean,default:!0}},setup(e){const a=e,r=ze(),c=z(()=>(r.app?.baseURL??"/").replace(/\/$/,"")),n=z(()=>!!r.public.demoMode&&a.trace.filePath.startsWith("demo/")),s=z(()=>a.trace.filePath.split("/").pop()||a.trace.filePath),l=z(()=>dt(a.trace.filePath,r.app?.baseURL,n.value)),f=z(()=>n.value?`${c.value}/${a.trace.filePath}`:`${c.value}/api/files/${jt(a.trace.filePath)}`);return(i,g)=>{const x=we,L=Le;return o(),u("div",Zs,[p("div",Ws,[b(x,{name:"i-lucide-file-archive",class:"size-4 text-gray-400 shrink-0"}),p("span",Js,k(t(s)),1),e.trace.size?(o(),u("span",Gs,k(("formatBytes"in i?i.formatBytes:t(Gt))(e.trace.size)),1)):w("",!0),e.showTime?(o(),u("span",Ys,k(("formatRelativeTime"in i?i.formatRelativeTime:t(We))(e.trace.createdAt)),1)):w("",!0)]),p("div",Qs,[b(L,{to:t(l),target:"_blank",icon:"i-lucide-bug-play",size:"xs",label:"View trace"},null,8,["to"]),b(L,{to:t(f),target:"_blank",icon:"i-lucide-download",size:"xs",color:"neutral",variant:"soft",label:"Download"},null,8,["to"])])])}}}),ea=Object.assign(Xs,{__name:"TraceListItem"}),ta={key:0,class:"flex items-center justify-center py-4"},na={key:1,class:"divide-y divide-default"},oa=de({__name:"TestEvidenceTraces",props:{traces:{},loading:{type:Boolean}},setup(e){return(a,r)=>{const c=we,n=ea,s=et;return e.loading||e.traces.length>0?(o(),V(s,{key:0,icon:"i-lucide-bug-play",label:"Traces",count:e.traces.length||null,collapsible:!1},{default:S(()=>[e.loading&&!e.traces.length?(o(),u("div",ta,[b(c,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):(o(),u("div",na,[(o(!0),u(ee,null,fe(e.traces,l=>(o(),V(n,{key:l.id,trace:l,class:"px-3 py-2"},null,8,["trace"]))),128))]))]),_:1},8,["count"])):w("",!0)}}}),pr=Object.assign(oa,{__name:"TestEvidenceTraces"}),sa={class:"space-y-2"},aa={key:0,class:"rounded-lg border border-default overflow-hidden"},ra=["title"],ia={key:2,class:"truncate text-gray-400 dark:text-gray-500"},la={class:"font-mono"},ca={key:0,class:"overflow-x-auto text-xs font-mono leading-relaxed py-1"},ua={class:"min-w-max"},da={key:1,class:"rounded-lg border border-dashed border-default"},pa=["onClick"],fa={key:0,class:"px-3 pb-2 space-y-1"},ma=["title"],ga={key:0,class:"truncate font-mono shrink-0"},ha=de({__name:"TraceCallStack",props:{frames:{},projectKey:{},projectName:{}},setup(e){const a=e,r=z(()=>{if(!a.frames.some(L=>L.inProject))return a.frames.map((L,h)=>({kind:"frame",frame:L,frameIndex:h}));const i=[];let g=[];const x=()=>{g.length!==0&&(i.push({kind:"group",frames:g,key:`group-${i.length}`}),g=[])};return a.frames.forEach((L,h)=>{L.inProject?(x(),i.push({kind:"frame",frame:L,frameIndex:h})):g.push(L)}),x(),i}),c=z(()=>{const f=a.frames.findIndex(i=>i.inProject);return f>=0?f:0}),n=J(new Set);function s(f){const i=new Set(n.value);i.has(f)?i.delete(f):i.add(f),n.value=i}function l(f){return f.source?f.source.lines.map((i,g)=>{const x=f.source.startLine+g;return{lineNo:x,text:i,failing:x===f.line}}):[]}return(f,i)=>{const g=we,x=ft,L=Re;return o(),u("div",sa,[(o(!0),u(ee,null,fe(t(r),h=>(o(),u(ee,{key:h.kind==="frame"?`f-${h.frameIndex}`:h.key},[h.kind==="frame"?(o(),u("div",aa,[p("div",{class:he(["flex items-center gap-2 px-3 py-1.5 bg-elevated/40 text-xs",h.frame.source?"border-b border-default":""])},[b(g,{name:h.frameIndex===t(c)?"i-lucide-circle-x":"i-lucide-corner-left-up",class:he([h.frameIndex===t(c)?"text-red-500":"text-gray-400","size-3.5 shrink-0"])},null,8,["name","class"]),h.frame.inProject?(o(),V(x,{key:0,"file-path":h.frame.file,line:h.frame.line,column:h.frame.column,"project-key":e.projectKey,"project-name":e.projectName,class:"min-w-0"},null,8,["file-path","line","column","project-key","project-name"])):(o(),u("code",{key:1,class:"truncate text-gray-500 dark:text-gray-400",title:h.frame.absFile||h.frame.file},k(h.frame.file)+":"+k(h.frame.line),9,ra)),h.frame.functionName?(o(),u("span",ia,[i[0]||(i[0]=R(" in ",-1)),p("span",la,k(h.frame.functionName),1)])):w("",!0),b(L,{color:h.frameIndex===t(c)?"error":"neutral",variant:"subtle",size:"xs",class:"ml-auto shrink-0"},{default:S(()=>[R(k(h.frameIndex===t(c)?"Failed here":"Caller"),1)]),_:2},1032,["color"])],2),h.frame.source?(o(),u("div",ca,[p("div",ua,[(o(!0),u(ee,null,fe(l(h.frame),C=>(o(),u("div",{key:C.lineNo,class:he(["px-3 whitespace-pre flex",C.failing?"bg-red-50 dark:bg-red-950/30 text-red-700 dark:text-red-300 font-medium":"text-gray-600 dark:text-gray-400"])},[p("span",{class:he(["w-10 shrink-0 text-right pr-3 tabular-nums select-none",C.failing?"text-red-400 dark:text-red-500":"text-gray-300 dark:text-gray-600"])},k(C.lineNo),3),p("span",null,k(C.text),1)],2))),128))])])):w("",!0)])):(o(),u("div",da,[p("button",{type:"button",class:"w-full flex items-center gap-2 px-3 py-1.5 text-xs text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300",onClick:C=>s(h.key)},[b(g,{name:t(n).has(h.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 shrink-0"},null,8,["name"]),R(" "+k(h.frames.length)+" frame"+k(h.frames.length===1?"":"s")+" in dependencies ",1)],8,pa),t(n).has(h.key)?(o(),u("div",fa,[(o(!0),u(ee,null,fe(h.frames,(C,_)=>(o(),u("div",{key:_,class:"flex items-center gap-2 text-xs text-gray-400 dark:text-gray-500 min-w-0"},[b(g,{name:"i-lucide-corner-left-up",class:"size-3 shrink-0"}),p("code",{class:"truncate",title:C.absFile||C.file},k(C.file)+":"+k(C.line),9,ma),C.functionName?(o(),u("span",ga,k(C.functionName),1)):w("",!0)]))),128))])):w("",!0)]))],64))),128))])}}}),fr=Object.assign(ha,{__name:"TraceCallStack"}),ya={class:"space-y-2"},va={class:"flex items-center gap-2 px-3 py-1.5 bg-elevated/40 border-b border-default text-xs"},xa={class:"overflow-x-auto text-xs font-mono leading-relaxed py-1"},ba={class:"min-w-max"},ka=de({__name:"TestSourceStack",props:{frames:{},projectKey:{},projectName:{}},setup(e){function a(r){return r.split(`
|
|
5
|
-
`).map(c=>({text:c,failing:c.startsWith(">")}))}return(
|
|
3
|
+
+${e.new.trimEnd()}`}function $o(e,a){const i=e??{},c=a??{},n=l=>l==null?null:typeof l=="string"?l:JSON.stringify(l),s=[];for(const l of new Set([...Object.keys(i),...Object.keys(c)])){const f=n(i[l]),r=n(c[l]);f!==r&&s.push({key:l,from:f,to:r})}return s}function wo(e){const i=[`In ${e.location??(e.sourceLine?`line ${e.sourceLine.line}`:"the failing test")}, the Playwright locator \`${e.failing}\` no longer matches its element.`,`Replace it with \`${e.recommended}\`.`];return e.sourceLine&&i.push("","Current line:",e.sourceLine.text.trim()),i.join(`
|
|
4
|
+
`)}const Co={key:1},Ao={class:"flex items-center gap-1"},So=["href"],To={key:2,class:"rounded-lg border border-primary/50 bg-primary/10 p-3 mb-3 flex items-center gap-3"},Lo={class:"flex-1 min-w-0"},Ro={class:"text-xs font-medium text-primary flex items-center gap-1.5"},zo={key:3,class:"bg-elevated rounded p-2 mb-3 border border-red-200 dark:border-red-800"},Io={class:"flex items-center gap-2"},Po={class:"text-xs font-mono text-red-600 dark:text-red-400 flex-1 truncate"},Eo={key:0,class:"flex items-center gap-2 mt-1.5 pl-6"},Bo={class:"text-xs text-gray-500"},Oo={class:"font-medium text-gray-700 dark:text-gray-300"},Mo={key:5,class:"rounded-lg border border-primary/40 bg-primary/5 p-3 mb-3 space-y-2"},Uo={class:"flex items-center gap-2 min-w-0"},No={key:0,class:"text-[11px] text-gray-500 truncate min-w-0"},jo={key:0,class:"rounded border border-default overflow-hidden bg-default"},Do={key:0,class:"text-xs flex flex-wrap items-center gap-x-1.5 gap-y-0.5"},Ko={class:"font-mono text-gray-500"},Vo={key:0,class:"font-mono text-red-500 line-through"},Ho={key:1,class:"text-gray-400"},Fo={key:2,class:"font-mono text-green-600 dark:text-green-400"},qo={key:3,class:"text-gray-400"},Zo={key:2,class:"text-xs text-gray-500"},Wo={key:3,class:"text-xs text-primary/90 flex items-center gap-1"},Jo={class:"flex items-center gap-2"},Go={key:6,class:"rounded-lg border border-default bg-elevated p-3 mb-3 flex items-center gap-3"},Yo={class:"flex-1 min-w-0"},Qo={class:"text-xs font-medium text-success-600 dark:text-success-400"},Xo={class:"space-y-2"},es={key:7,class:"mt-3"},ts={class:"space-y-2"},ns={class:"flex items-center gap-1"},it=3,os=de({__name:"LocatorHealingPanel",props:{runId:{},testRunsCaseId:{},storageKey:{},affectedCount:{},aiIntents:{}},setup(e){const a=e,i=z(()=>a.storageKey?Ve:Ke),c=z(()=>a.storageKey?{storageKey:a.storageKey}:{}),{data:n,pending:s,error:l}=je(()=>`/api/test-run-cases/${a.testRunsCaseId}/locator-healing`,{lazy:!0},"$Zgad3xb7ix"),f=z(()=>!!n.value&&n.value.source!=="none"&&!!(n.value.fromElementMatch?.length||n.value.fromPriorSuccess?.length||n.value.fromAriaSnapshot?.length)),r=z(()=>n.value?n.value.fromElementMatch??n.value.fromPriorSuccess??n.value.fromAriaSnapshot??[]:[]),g=z(()=>r.value.find(E=>E.pickedByUser)??null),x=z(()=>n.value?.recommendation?n.value.recommendation:n.value?.priorNameMayBeStale||!r.value.length?null:gt(n.value?.failingLocator?.method,r.value)),L=z(()=>n.value?.priorNameMayBeStale&&n.value.fromPriorSuccess?.length?n.value.fromAriaSnapshot??[]:[]),h=z(()=>{const E=x.value;return E?.recommended?E.recommended.pickedByUser?"Confirmed with the locator picker on the failing page":E.preservesConvention?"Keeps your original locator style — minimal, idiomatic edit":E.suggestAddTestId?"Most stable available, but still fragile":"Most stable available — a sturdier style than the original":""}),C=z(()=>{const E=n.value?.priorNameMayBeStale,d=(()=>{switch(n.value?.source){case"prior-run":return E?"Pre-captured from the last passing run — the element looks changed since":"Pre-captured from the last passing run — highest confidence";case"element-match":return"The element looks renamed or moved — these are fresh locators for its current identity on the failing page";case"fingerprint":return"Matched by locator signature (line numbers shifted)";case"cross-test":return"Captured by another test in this project that uses the same locator";case"aria-snapshot":return"Generated from the failure-time ARIA snapshot — limited, no HTML attributes";default:return""}})(),ne=n.value?.capturedAt;return ne?`${d} · captured ${We(ne)}`:d}),_=z(()=>{if(n.value?.priorNameMayBeStale)return"text-warning-600 dark:text-warning-400";switch(n.value?.source){case"prior-run":case"fingerprint":case"cross-test":return"text-success-600 dark:text-success-400";case"element-match":return"text-primary-600 dark:text-primary-400";default:return"text-warning-600 dark:text-warning-400"}}),T=z(()=>{const E=n.value?.failingLocator;return E?`${E.method}(${JSON.stringify(E.args)})`:""});function q(E){return E.toLowerCase().replace(/[\s'"`{}[\]]/g,"")}const U=z(()=>{if(!a.aiIntents?.length||!T.value)return null;const E=q(T.value);return a.aiIntents.find(d=>q(d.locator)===E)??null}),G=ze(),{data:A}=je(()=>`/api/test-run-cases/${a.testRunsCaseId}/traces`,{lazy:!0,transform:E=>E.items},"$eLKRphd7VZ"),I=z(()=>{const E=A.value?.[0];if(!E)return null;const d=!!G.public.demoMode&&E.filePath.startsWith("demo/");return dt(E.filePath,G.app?.baseURL,d)}),K=J(!1);async function v(){await St(`/api/test-run-cases/${a.testRunsCaseId}/locator-healing`)}const{copy:D}=De(),y=J(null);let Z=null;function M(E,d,ne){D(E,{toast:ne}),y.value=d,Z&&clearTimeout(Z),Z=setTimeout(()=>{y.value=null},2e3)}function N(E,d){M(E,d,"Locator copied")}Pe(()=>{Z&&clearTimeout(Z)});const Q=z(()=>x.value?.recommended??null),me=z(()=>a.affectedCount&&a.affectedCount>1&&Q.value?`Same break affects ${a.affectedCount} tests in this cluster — one fix`:""),te=z(()=>{if(Q.value?.pickedByUser)return"your confirmed pick";switch(n.value?.source){case"prior-run":return"from the last passing run";case"fingerprint":return"from a prior run (line shifted)";case"cross-test":return"from another test in this project";case"element-match":return"from the current failing page";case"aria-snapshot":return"from the ARIA snapshot";default:return""}}),ce=z(()=>{const E=n.value?.sourceLine,d=Q.value;if(!E||!d)return null;const ne=ko(E.text,n.value?.failingLocator?.method,d.locator);return ne?{edit:ne,patch:_o(ne,n.value?.location??null)}:null}),X=z(()=>{if(ce.value)return[];const E=n.value?.failingLocator,d=Q.value;return!E||!d||d.method!==E.method?[]:$o(E.args,d.args)});function pe(){const E=Q.value;!E||!n.value||M(wo({location:n.value.location??null,sourceLine:n.value.sourceLine??null,failing:T.value,recommended:E.locator}),"fix-prompt","Fix prompt copied")}function j(){const E=n.value?.edit?.unifiedDiff;E&&M(E,"git-apply","Patch copied")}const oe=J(!1),W=z(()=>oe.value?r.value:r.value.slice(0,it));return(E,d)=>{const ne=Xe,m=Le,B=At,H=Ze,F=we,ie=Re,se=_n,ae=mt,$e=Dt;return o(),u(ee,null,[!t(s)&&!t(l)&&t(f)?(o(),V(Te(t(i)),Ne({key:0},t(c),{"data-shot":"alternative-locators",icon:"i-lucide-bandage",title:"Alternative locators",count:t(r).length,help:"locator-healing"}),Ee({subtitle:S(()=>[p("span",{class:he(t(_))},k(t(C)),3)]),default:S(()=>[t(n)?.healedInRunId?(o(),V(H,{key:0,class:"mb-3",color:"success",icon:"i-lucide-circle-check",variant:"subtle",title:"Locator healed"},{description:S(()=>[d[11]||(d[11]=R(" The recommended locator now passes at this call site — ",-1)),b(B,{to:`/test-runs/${t(n).healedInRunId}`,class:"underline font-medium"},{default:S(()=>[R(" see run #"+k(t(n).healedInRunId),1)]),_:1},8,["to"]),d[12]||(d[12]=R(". ",-1))]),_:1})):w("",!0),t(n)?.healAction?(o(),V(H,{key:1,class:"mb-3",color:t(n).healAction.status==="opened"?"primary":"neutral",icon:"i-lucide-bandage",variant:"subtle",title:t(n).healAction.status==="opened"?"Piwi opened a heal PR":"Heal PR queued"},{description:S(()=>[t(n).healAction.status==="opened"&&t(n).healAction.prUrl?(o(),u(ee,{key:0},[d[13]||(d[13]=R(" Auto-heal opened ",-1)),p("a",{href:t(n).healAction.prUrl,target:"_blank",rel:"noopener",class:"underline font-medium"}," PR #"+k(t(n).healAction.prNumber),9,So),d[14]||(d[14]=R(" to rewrite this locator. ",-1))],64)):(o(),u(ee,{key:1},[d[15]||(d[15]=R(" Auto-heal has queued a fix for this locator on branch ",-1)),p("code",null,k(t(n).healAction.branch),1),d[16]||(d[16]=R(". ",-1))],64))]),_:1},8,["color","title"])):w("",!0),t(g)?(o(),u("div",To,[b(F,{name:"i-lucide-user-check",class:"size-5 text-primary shrink-0"}),p("div",Lo,[p("p",Ro,[d[18]||(d[18]=R(" Your pick ",-1)),b(ie,{size:"sm",color:"primary",variant:"subtle"},{default:S(()=>[...d[17]||(d[17]=[R("confirmed on the failing page",-1)])]),_:1})]),b(ne,{locator:t(g).locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"])]),b(m,{size:"sm",color:"primary",variant:"solid","trailing-icon":t(y)==="user-pick"?"i-lucide-check":"i-lucide-copy",onClick:d[1]||(d[1]=O=>N(t(g).locator,"user-pick"))},{default:S(()=>[...d[19]||(d[19]=[R(" Copy ",-1)])]),_:1},8,["trailing-icon"])])):w("",!0),t(n)?.failingLocator?(o(),u("div",zo,[p("div",Io,[b(F,{name:"i-lucide-x-circle",class:"size-4 text-red-500 shrink-0"}),p("code",Po,k(t(T)),1),b(m,{size:"xs",variant:"ghost",color:"neutral",icon:t(y)==="failing"?"i-lucide-check":"i-lucide-copy",title:t(y)==="failing"?"Copied!":"Copy",onClick:d[2]||(d[2]=O=>N(t(T),"failing"))},null,8,["icon","title"])]),t(U)?(o(),u("div",Eo,[b(F,{name:"i-lucide-wand-sparkles",class:"size-3.5 text-primary shrink-0"}),p("span",Bo,[d[23]||(d[23]=R(" Compiled from prompt ",-1)),p("span",Oo,"“"+k(t(U).template)+"”",1),t(U).kind==="run"?(o(),u(ee,{key:0},[d[20]||(d[20]=R(" (a ",-1)),d[21]||(d[21]=p("code",{class:"text-xs"},"piwiRun",-1)),d[22]||(d[22]=R(" flow step)",-1))],64)):w("",!0)])])):w("",!0)])):w("",!0),t(n)?.priorNameMayBeStale?(o(),V(H,{key:4,class:"mb-3",color:"warning",icon:"i-lucide-alert-triangle",variant:"subtle",title:"The element's name looks changed",description:"The captured accessible name no longer appears on the failing page, so name-based alternatives (and the failing locator itself) probably no longer match. Prefer the structural options, or the failing-page candidates below."})):w("",!0),t(Q)?(o(),u("div",Mo,[p("div",Uo,[b(F,{name:"i-lucide-star",class:"size-4 text-primary shrink-0"}),d[24]||(d[24]=p("p",{class:"text-xs font-medium text-primary shrink-0"},"Recommended fix",-1)),t(te)?(o(),u("span",No," · "+k(t(te)),1)):w("",!0),d[25]||(d[25]=p("span",{class:"flex-1"},null,-1)),b(ie,{size:"xs",color:"primary",variant:"subtle",class:"font-mono tabular-nums shrink-0"},{default:S(()=>[R(k(t(Q).score),1)]),_:1})]),t(ce)?(o(),u("div",jo,[b(se,{patch:t(ce).patch},null,8,["patch"])])):(o(),u(ee,{key:1},[b(ne,{locator:t(Q).locator,truncate:"",class:"text-sm"},null,8,["locator"]),t(X).length?(o(),u("p",Do,[(o(!0),u(ee,null,fe(t(X),(O,Y)=>(o(),u(ee,{key:Y},[p("span",Ko,k(O.key)+":",1),O.from?(o(),u("span",Vo,k(O.from),1)):(o(),u("span",Ho,"—")),b(F,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),O.to?(o(),u("span",Fo,k(O.to),1)):(o(),u("span",qo,"removed"))],64))),128))])):w("",!0)],64)),t(h)?(o(),u("p",Zo,k(t(h)),1)):w("",!0),t(me)?(o(),u("p",Wo,[b(F,{name:"i-lucide-layers",class:"size-3 shrink-0"}),R(k(t(me)),1)])):w("",!0),p("div",Jo,[b(m,{size:"xs",color:"primary",variant:"solid","trailing-icon":t(y)==="top"?"i-lucide-check":"i-lucide-copy",onClick:d[3]||(d[3]=O=>N(t(Q).locator,"top"))},{default:S(()=>[...d[26]||(d[26]=[R(" Copy locator ",-1)])]),_:1},8,["trailing-icon"]),b(m,{size:"xs",color:"neutral",variant:"outline",icon:t(y)==="fix-prompt"?"i-lucide-check":"i-lucide-sparkles",title:"Copy an instruction an AI coding agent can apply directly to the test",onClick:pe},{default:S(()=>[...d[27]||(d[27]=[R(" Copy fix prompt ",-1)])]),_:1},8,["icon"]),t(n)?.edit?.unifiedDiff?(o(),V(m,{key:0,size:"xs",color:"neutral",variant:"outline",icon:t(y)==="git-apply"?"i-lucide-check":"i-lucide-copy",title:"Copy a git apply patch that rewrites the failing locator line",onClick:j},{default:S(()=>[...d[28]||(d[28]=[R(" Copy patch ",-1)])]),_:1},8,["icon"])):w("",!0)])])):w("",!0),t(x)?.hasDurableAlternative&&t(x).durable?(o(),u("div",Go,[b(F,{name:"i-lucide-shield-check",class:"size-5 text-success shrink-0"}),p("div",Yo,[p("p",Qo," Most stable option (score: "+k(t(x).durable.score)+") ",1),b(ne,{locator:t(x).durable.locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"]),d[29]||(d[29]=p("p",{class:"text-xs text-gray-500 mt-0.5"},"Sturdier, but changes the locator style",-1))]),b(m,{size:"sm",color:"neutral",variant:"outline","trailing-icon":t(y)==="durable"?"i-lucide-check":"i-lucide-copy",onClick:d[4]||(d[4]=O=>N(t(x).durable.locator,"durable"))},{default:S(()=>[...d[30]||(d[30]=[R(" Copy ",-1)])]),_:1},8,["trailing-icon"])])):w("",!0),p("div",Xo,[d[31]||(d[31]=p("p",{class:"text-xs font-medium text-gray-500"},"All alternatives",-1)),(o(!0),u(ee,null,fe(t(W),(O,Y)=>(o(),V(ae,{key:Y,alt:O,copied:t(y)===`alt-${Y}`,onCopy:le=>N(O.locator,`alt-${Y}`)},null,8,["alt","copied","onCopy"]))),128)),t(r).length>it?(o(),V(m,{key:0,size:"xs",variant:"ghost",color:"neutral",block:"",icon:t(oe)?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:d[5]||(d[5]=O=>oe.value=!t(oe))},{default:S(()=>[R(k(t(oe)?"Show fewer":`Show all ${t(r).length} alternatives`),1)]),_:1},8,["icon"])):w("",!0)]),t(L).length?(o(),u("div",es,[d[32]||(d[32]=p("p",{class:"text-xs font-medium text-gray-500 mb-2"},"From the failing page",-1)),p("div",ts,[(o(!0),u(ee,null,fe(t(L),(O,Y)=>(o(),V(ae,{key:Y,alt:O,note:"candidate from the failure-time ARIA snapshot",copied:t(y)===`supp-${Y}`,onCopy:le=>N(O.locator,`supp-${Y}`)},null,8,["alt","copied","onCopy"]))),128))])])):w("",!0),t(x)?.suggestAddTestId?(o(),V(H,{key:8,class:"mt-3",color:"warning",icon:"i-lucide-info",variant:"subtle",title:"All alternatives are fragile",description:"Every captured locator scores below 50. Add a stable data-testid attribute to this element in the app for a durable fix."})):w("",!0),t(n)?.source==="aria-snapshot"?(o(),V(H,{key:9,class:"mt-3",color:"info",icon:"i-lucide-info",variant:"subtle"},{description:S(()=>[d[34]||(d[34]=R(" No HTML attributes were available. ",-1)),b($e,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:S(()=>[...d[33]||(d[33]=[R("Enable Piwi fixture capture",-1)])]),_:1}),d[35]||(d[35]=R(" for full alternatives including data-testid and CSS selectors. ",-1))]),_:1})):w("",!0)]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[t(x)?.recommended?(o(),V(ne,{key:0,locator:t(x).recommended.locator,class:"text-xs"},null,8,["locator"])):(o(),u("span",Co,k(t(r).length)+" alternative"+k(t(r).length===1?"":"s"),1))]),key:"0"}:void 0,t(I)||t(n)?.failingLocator?{name:"actions",fn:S(()=>[p("div",Ao,[t(n)?.failingLocator?(o(),V(m,{key:0,size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-mouse-pointer",title:"Open the failure-time DOM snapshot and click the element to pick a locator",onClick:d[0]||(d[0]=O=>K.value=!0)},{default:S(()=>[...d[9]||(d[9]=[R(" Pick from snapshot ",-1)])]),_:1})):w("",!0),t(I)?(o(),V(m,{key:1,to:t(I),target:"_blank",size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-crosshair",title:"Open the failure trace in the trace viewer — its Pick locator tool works on the recorded page snapshots"},{default:S(()=>[...d[10]||(d[10]=[R(" Pick from trace ",-1)])]),_:1},8,["to"])):w("",!0)])]),key:"1"}:void 0]),1040,["count"])):!t(s)&&!t(l)&&!t(f)?(o(),V(Te(t(i)),Ne({key:1},t(c),{icon:"i-lucide-bandage",title:"Alternative locators",subtitle:"No alternatives available",help:"locator-healing"}),Ee({default:S(()=>[b(H,{color:"neutral",icon:"i-lucide-info",variant:"subtle"},{description:S(()=>[d[40]||(d[40]=R(" No pre-captured alternatives — this locator has never passed in a previous run. ",-1)),b($e,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:S(()=>[...d[39]||(d[39]=[R("Enable Piwi dashboard fixtures",-1)])]),_:1}),d[41]||(d[41]=R(" to capture element attributes at test time, or use “Pick from snapshot” above to choose a locator by hand on the failure-time page. ",-1))]),_:1})]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[d[36]||(d[36]=p("span",null,"No alternatives available",-1))]),key:"0"}:void 0,t(I)||t(n)?.failingLocator?{name:"actions",fn:S(()=>[p("div",ns,[t(n)?.failingLocator?(o(),V(m,{key:0,size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-mouse-pointer",title:"Open the failure-time DOM snapshot and click the element to pick a locator",onClick:d[6]||(d[6]=O=>K.value=!0)},{default:S(()=>[...d[37]||(d[37]=[R(" Pick from snapshot ",-1)])]),_:1})):w("",!0),t(I)?(o(),V(m,{key:1,to:t(I),target:"_blank",size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-crosshair",title:"Open the failure trace in the trace viewer — its Pick locator tool works on the recorded page snapshots"},{default:S(()=>[...d[38]||(d[38]=[R(" Pick from trace ",-1)])]),_:1},8,["to"])):w("",!0)])]),key:"1"}:void 0]),1040)):w("",!0),t(n)?.failingLocator?(o(),V(vo,{key:2,open:t(K),"onUpdate:open":d[7]||(d[7]=O=>Se(K)?K.value=O:null),"run-id":e.runId,"test-runs-case-id":e.testRunsCaseId,"failing-locator":t(n).failingLocator,healing:t(n),onConfirmed:v,onClose:d[8]||(d[8]=O=>K.value=!1)},null,8,["open","run-id","test-runs-case-id","failing-locator","healing"])):w("",!0)],64)}}}),ii=Object.assign(os,{__name:"LocatorHealingPanel"}),ss={key:1,class:"space-y-2"},as={class:"text-xs font-medium text-gray-500 dark:text-gray-400 sm:w-40 shrink-0"},is={class:"flex flex-wrap items-center gap-1.5 min-w-0 text-xs font-mono"},rs={class:"rounded bg-red-50 px-1.5 py-0.5 text-red-700 dark:bg-red-950/30 dark:text-red-400 break-all"},ls={class:"rounded bg-green-50 px-1.5 py-0.5 text-green-700 dark:bg-green-950/30 dark:text-green-400 break-all"},cs={key:0,class:"text-xs text-gray-400 dark:text-gray-500"},us={key:0},ds=de({__name:"EnvironmentDiffCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:a}){const i=e,c=z(()=>i.storageKey?Ve:Ke),n=z(()=>i.storageKey?{storageKey:i.storageKey}:{}),{data:s,pending:l,error:f}=je(()=>`/api/test-run-cases/${i.testRunsCaseId}/environment-diff`,{lazy:!0},"$0pD8W6UYqF"),r=z(()=>s.value?.entries??[]),g=z(()=>r.value.filter(_=>!_.informational)),x=z(()=>r.value.filter(_=>_.informational)),L=z(()=>{const _=s.value?.baseline;if(!_)return"";const T=_.startTime?` · ${We(new Date(_.startTime))}`:"";return`vs last passing run of this test (run #${_.runId}${T})`}),h=z(()=>{if(s.value?.status!=="ok")return"No passing baseline to compare against";const _=g.value.length;return _===0?"Identical to last pass — no environment drift":`${_} change${_===1?"":"s"}: ${g.value.map(T=>T.label).join(", ")}`}),C=J(null);return a({reveal:()=>C.value?.reveal?.()}),(_,T)=>{const q=Ze,U=we;return!t(l)&&!t(f)&&t(s)?.status==="ok"?(o(),V(Te(t(c)),Ne({key:0,ref_key:"card",ref:C},t(n),{icon:"i-lucide-git-compare-arrows",title:"Environment diff",count:t(g).length||void 0,help:"environment-diff",subtitle:t(L)}),Ee({default:S(()=>[t(r).length===0?(o(),V(q,{key:0,color:"success",icon:"i-lucide-check-circle",variant:"subtle",description:"The environment is identical to the last passing run — environment drift is unlikely to explain this failure."})):(o(),u("div",ss,[(o(!0),u(ee,null,fe(t(g),G=>(o(),u("div",{key:G.key,class:"rounded-lg border border-default p-3 flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3"},[p("span",as,k(G.label),1),p("div",is,[p("code",rs,k(G.failing??"(unset)"),1),b(U,{name:"i-lucide-arrow-left",class:"size-3 shrink-0 text-gray-400"}),p("code",ls,k(G.baseline??"(unset)"),1)])]))),128)),t(x).length>0?(o(),u("p",cs,[T[0]||(T[0]=R(" Also changed (varies naturally between runs): ",-1)),(o(!0),u(ee,null,fe(t(x),(G,A)=>(o(),u("span",{key:G.key},[R(k(G.label.toLowerCase())+" "+k(G.baseline??"—")+" → "+k(G.failing??"—"),1),A<t(x).length-1?(o(),u("span",us,", ")):w("",!0)]))),128))])):w("",!0)]))]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[p("span",null,k(t(h)),1)]),key:"0"}:void 0]),1040,["count","subtitle"])):w("",!0)}}}),ri=Object.assign(ds,{__name:"EnvironmentDiffCard"}),ps={class:"absolute top-4 left-4 text-white/70 text-sm font-medium"},fs=["src","alt"],ms=de({__name:"ScreenshotLightbox",props:{images:{},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:a}){const i=e,c=a,n=z(()=>i.modelValue!==null);function s(){c("update:modelValue",null)}function l(){i.modelValue!==null&&i.modelValue>0&&c("update:modelValue",i.modelValue-1)}function f(){i.modelValue!==null&&i.modelValue<i.images.length-1&&c("update:modelValue",i.modelValue+1)}const r=z(()=>i.modelValue===null?null:i.images[i.modelValue]??null);function g(x){n.value&&(x.key==="Escape"&&s(),x.key==="ArrowLeft"&&l(),x.key==="ArrowRight"&&f())}return ct(()=>window.addEventListener("keydown",g)),Tt(()=>window.removeEventListener("keydown",g)),(x,L)=>{const h=we;return o(),V(Lt,{to:"body"},[b(Rt,{name:"lightbox"},{default:S(()=>[n.value?(o(),u("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/90",onClick:_e(s,["self"])},[p("button",{class:"absolute top-4 right-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:s},[b(h,{name:"i-lucide-x",class:"size-6"})]),p("div",ps,k((e.modelValue??0)+1)+" / "+k(e.images.length),1),e.images.length>1&&(e.modelValue??0)>0?(o(),u("button",{key:0,class:"absolute left-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:l},[b(h,{name:"i-lucide-chevron-left",class:"size-6"})])):w("",!0),r.value?(o(),u("img",{key:1,src:r.value.src,alt:r.value.name,class:"max-h-[90vh] max-w-[90vw] object-contain rounded-lg",onClick:L[0]||(L[0]=_e(()=>{},["stop"]))},null,8,fs)):w("",!0),e.images.length>1&&(e.modelValue??0)<e.images.length-1?(o(),u("button",{key:2,class:"absolute right-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:f},[b(h,{name:"i-lucide-chevron-right",class:"size-6"})])):w("",!0)])):w("",!0)]),_:1})])}}}),yt=Object.assign(zt(ms,[["__scopeId","data-v-c02b1e9b"]]),{__name:"ScreenshotLightbox"}),gs={class:"flex justify-end mb-2"},hs={key:1,class:"rounded overflow-hidden border border-default bg-gray-50 dark:bg-gray-900"},ys=["src"],vs={key:2,class:"grid grid-cols-1 sm:grid-cols-2 gap-2"},xs={class:"rounded overflow-hidden border border-red-200 dark:border-red-900 bg-gray-50 dark:bg-gray-900"},bs=["src"],ks={class:"rounded overflow-hidden border border-green-200 dark:border-green-900 bg-gray-50 dark:bg-gray-900"},_s={class:"px-2 py-1 text-[10px] font-medium text-green-600 dark:text-green-400"},$s=["src"],ws=de({__name:"VisualDiffCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:a}){const i=e,c=z(()=>i.storageKey?Ve:Ke),n=z(()=>i.storageKey?{storageKey:i.storageKey}:{}),s=ze(),{data:l,pending:f,error:r}=je(()=>`/api/test-run-cases/${i.testRunsCaseId}/visual-diff`,{lazy:!0},"$QAhY8Q5pJg"),g=z(()=>l.value?.status==="ok"?l.value.diff??null:null),x=J("overlay"),L=[{label:"Overlay",value:"overlay"},{label:"Side by side",value:"side-by-side"}],h=z(()=>g.value?Ue(g.value.path,"image/png",s.app?.baseURL):""),C=z(()=>g.value?Ue(g.value.failingPath,null,s.app?.baseURL):""),_=z(()=>g.value?Ue(g.value.baselinePath,null,s.app?.baseURL):""),T=z(()=>g.value?(g.value.changedPixelRatio*100).toFixed(2):"0"),q=z(()=>{const K=g.value?.changedPixelRatio??0;return K>.1?"error":K>.01?"warning":"success"}),U=z(()=>g.value?g.value.dimensionMismatch?`${T.value}% changed — dimensions differ, unreliable`:`${T.value}% of pixels changed vs visual baseline`:"No comparable screenshots"),G=z(()=>g.value?[{src:C.value,name:"Failing screenshot"},{src:_.value,name:"Last passing screenshot"},{src:h.value,name:"Diff overlay"}]:[]),A=J(null),I=J(null);return a({reveal:()=>I.value?.reveal?.()}),(K,v)=>{const D=Re,y=Ze,Z=Ht,M=yt;return!t(f)&&!t(r)&&t(g)?(o(),V(Te(t(c)),Ne({key:0,ref_key:"card",ref:I},t(n),{icon:"i-lucide-images",title:"Visual diff",help:"visual-diff"}),Ee({subtitle:S(()=>[p("span",null,"vs visual baseline (run #"+k(t(g).baselineRunId)+")",1)]),actions:S(()=>[b(D,{color:t(q),variant:"subtle",size:"sm",class:"font-mono tabular-nums"},{default:S(()=>[R(k(t(T))+"% changed ",1)]),_:1},8,["color"])]),default:S(()=>[t(g).dimensionMismatch?(o(),V(y,{key:0,class:"mb-3",color:"warning",icon:"i-lucide-alert-triangle",variant:"subtle",title:"Screenshot dimensions differ",description:"The failing and passing screenshots have different sizes (viewport change?). They are compared on a padded canvas, so the changed-pixel ratio is inflated and unreliable."})):w("",!0),p("div",gs,[b(Z,{modelValue:t(x),"onUpdate:modelValue":v[0]||(v[0]=N=>Se(x)?x.value=N:null),items:L,size:"xs",content:!1,ui:{list:"overflow-x-auto",trigger:"shrink-0"}},null,8,["modelValue"])]),t(x)==="overlay"?(o(),u("div",hs,[p("img",{src:t(h),alt:"Diff overlay (red = changed pixels)",class:"w-full max-h-96 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open diff overlay in lightbox",onClick:v[1]||(v[1]=N=>A.value=2),onKeydown:[v[2]||(v[2]=ke(N=>A.value=2,["enter"])),v[3]||(v[3]=ke(_e(N=>A.value=2,["prevent"]),["space"]))]},null,40,ys),v[11]||(v[11]=p("p",{class:"px-2 py-1 text-[10px] text-gray-500"},"Red pixels mark differences against the last passing run",-1))])):(o(),u("div",vs,[p("div",xs,[v[12]||(v[12]=p("p",{class:"px-2 py-1 text-[10px] font-medium text-red-600 dark:text-red-400"},"Failing",-1)),p("img",{src:t(C),alt:"Failing screenshot",class:"w-full max-h-80 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open failing screenshot in lightbox",onClick:v[4]||(v[4]=N=>A.value=0),onKeydown:[v[5]||(v[5]=ke(N=>A.value=0,["enter"])),v[6]||(v[6]=ke(_e(N=>A.value=0,["prevent"]),["space"]))]},null,40,bs)]),p("div",ks,[p("p",_s," Visual baseline (run #"+k(t(g).baselineRunId)+") ",1),p("img",{src:t(_),alt:"Last passing screenshot",class:"w-full max-h-80 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open last passing screenshot in lightbox",onClick:v[7]||(v[7]=N=>A.value=1),onKeydown:[v[8]||(v[8]=ke(N=>A.value=1,["enter"])),v[9]||(v[9]=ke(_e(N=>A.value=1,["prevent"]),["space"]))]},null,40,$s)])])),b(M,{modelValue:t(A),"onUpdate:modelValue":v[10]||(v[10]=N=>Se(A)?A.value=N:null),images:t(G)},null,8,["modelValue","images"])]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[p("span",null,k(t(U)),1)]),key:"0"}:void 0]),1040)):w("",!0)}}}),li=Object.assign(ws,{__name:"VisualDiffCard"}),Cs={class:"max-h-96 overflow-y-auto"},As={key:0,class:"mt-2 text-xs text-gray-400 dark:text-gray-500"},Ye=2e4,Ss=de({__name:"DomSnapshotCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:a}){const i=e,c=z(()=>i.storageKey?Ve:Ke),n=z(()=>i.storageKey?{storageKey:i.storageKey}:{}),{data:s,pending:l,error:f}=je(()=>`/api/test-run-cases/${i.testRunsCaseId}/dom-snapshot`,{lazy:!0},"$rAu-vOWv77"),r=z(()=>(s.value?.html??"").slice(0,Ye)),g=z(()=>(s.value?.html?.length??0)>Ye),x=z(()=>{const _=s.value;return!_||_.status!=="ok"?"":`${Math.round((_.html?.length??0)/1024)} KB · rendered from the uploaded trace${_.snapshotName?` (${_.snapshotName})`:""}`}),{copy:L,copied:h}=De(),C=J(null);return a({reveal:()=>C.value?.reveal?.()}),(_,T)=>{const q=Le,U=Ft,G=qt;return!t(l)&&!t(f)&&t(s)?.status==="ok"&&t(s).html?(o(),V(Te(t(c)),Ne({key:0,ref_key:"card",ref:C},t(n),{icon:"i-lucide-file-code",title:"DOM snapshot",help:"dom-snapshot",subtitle:t(x)}),Ee({actions:S(()=>[b(U,{text:t(h)?"Copied!":"Copy full HTML"},{default:S(()=>[b(q,{size:"xs",variant:"ghost",color:"neutral",icon:t(h)?"i-lucide-check":"i-lucide-clipboard","aria-label":"Copy full HTML",onClick:T[0]||(T[0]=A=>t(L)(t(s).html))},null,8,["icon"])]),_:1},8,["text"])]),default:S(()=>[p("div",Cs,[b(G,{code:t(r),lang:"xml"},null,8,["code"])]),t(g)||t(s).truncated?(o(),u("p",As,[t(g)?(o(),u(ee,{key:0},[R("Showing the first "+k(Math.round(Ye/1e3))+"k characters — use Copy for the full document.",1)],64)):(o(),u(ee,{key:1},[R("The snapshot was truncated to its size cap.")],64))])):w("",!0)]),_:2},[e.storageKey?{name:"folded",fn:S(()=>[p("span",null,"Failure-time HTML extracted from the trace — "+k(Math.round((t(s).html.length??0)/1024))+" KB",1)]),key:"0"}:void 0]),1040,["subtitle"])):w("",!0)}}}),ci=Object.assign(Ss,{__name:"DomSnapshotCard"}),Ts={class:"rounded-md border border-default overflow-hidden"},Ls={class:"text-xs font-semibold text-gray-600 dark:text-gray-300 flex-1"},Rs={key:0,class:"text-gray-400 font-normal ml-1"},zs={key:0},Is=de({__name:"TestEvidenceSection",props:Qe({icon:{},label:{},count:{},collapsible:{type:Boolean}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(e){const a=e,i=lt(e,"open"),c=z(()=>a.collapsible===!1||i.value);return(n,s)=>{const l=we;return o(),u("div",Ts,[(o(),V(Te(e.collapsible===!1?"div":"button"),{class:he(["w-full flex items-center gap-1.5 px-3 py-2 bg-elevated border-b border-default text-left",e.collapsible!==!1&&"hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer"]),onClick:s[0]||(s[0]=f=>e.collapsible!==!1&&(i.value=!i.value))},{default:S(()=>[b(l,{name:e.icon,class:"size-3.5 shrink-0 text-primary/70"},null,8,["name"]),p("span",Ls,[R(k(e.label),1),e.count!=null?(o(),u("span",Rs,"("+k(e.count)+")",1)):w("",!0)]),e.collapsible!==!1?(o(),V(l,{key:0,name:i.value?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400"},null,8,["name"])):w("",!0)]),_:1},8,["class"])),t(c)?(o(),u("div",zs,[Oe(n.$slots,"default")])):w("",!0)])}}}),et=Object.assign(Is,{__name:"TestEvidenceSection"}),Ps={class:"grid grid-cols-2 gap-2 p-2 bg-gray-50 dark:bg-gray-900"},Es=["aria-label","onClick","onKeydown"],Bs=["src","alt"],Os={class:"absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-black/30"},Ms={class:"absolute bottom-0 inset-x-0 px-1.5 py-0.5 text-[10px] text-white bg-black/50 truncate"},Us=de({__name:"TestEvidenceScreenshots",props:{attachments:{}},setup(e){const a=e,i=ze();function c(l){return l.split("/").pop()||l}const n=z(()=>a.attachments.filter(l=>Wt(l.path,l.contentType)).map(l=>({src:Ue(l.path,l.contentType,i.app?.baseURL),name:l.name||c(l.path)}))),s=J(null);return(l,f)=>{const r=we,g=yt,x=et;return t(n).length>0?(o(),V(x,{key:0,icon:"i-lucide-image",label:"Screenshots",count:t(n).length,collapsible:!1},{default:S(()=>[p("div",Ps,[(o(!0),u(ee,null,fe(t(n),(L,h)=>(o(),u("div",{key:L.src,class:"relative group cursor-pointer rounded overflow-hidden border border-default outline-none focus-visible:outline-2 focus-visible:outline-primary",role:"button",tabindex:"0","aria-label":`View screenshot ${L.name}`,onClick:C=>s.value=h,onKeydown:[ke(C=>s.value=h,["enter"]),ke(_e(C=>s.value=h,["prevent"]),["space"])]},[p("img",{src:L.src,alt:L.name,class:"w-full h-28 object-cover object-top transition-opacity group-hover:opacity-80",loading:"lazy"},null,8,Bs),p("div",Os,[b(r,{name:"i-lucide-zoom-in",class:"size-5 text-white"})]),p("p",Ms,k(L.name),1)],40,Es))),128))]),b(g,{modelValue:t(s),"onUpdate:modelValue":f[0]||(f[0]=L=>Se(s)?s.value=L:null),images:t(n)},null,8,["modelValue","images"])]),_:1},8,["count"])):w("",!0)}}}),ui=Object.assign(Us,{__name:"TestEvidenceScreenshots"}),Ns={class:"m-0"},js={class:"bg-black rounded overflow-hidden"},Ds=["src"],Ks=["title"],Vs=de({__name:"VideoPlayer",props:{src:{},label:{}},setup(e){return(a,i)=>(o(),u("figure",Ns,[p("div",js,[p("video",{src:e.src,controls:"",preload:"metadata",class:"w-full max-h-96"}," Your browser does not support the video tag. ",8,Ds)]),e.label?(o(),u("figcaption",{key:0,class:"mt-1 text-xs text-gray-400 truncate",title:e.label},k(e.label),9,Ks)):w("",!0)]))}}),Hs=Object.assign(Vs,{__name:"VideoPlayer"}),Fs={class:"space-y-2 p-2 bg-gray-50 dark:bg-gray-900"},qs=de({__name:"TestEvidenceVideos",props:{attachments:{}},setup(e){const a=e,i=ze();function c(s){return s.split("/").pop()||s}const n=z(()=>a.attachments.filter(s=>Jt(s.path,s.contentType)).map(s=>({src:Ue(s.path,s.contentType,i.app?.baseURL),name:s.name||c(s.path)})));return(s,l)=>{const f=Hs,r=et;return t(n).length>0?(o(),V(r,{key:0,icon:"i-lucide-video",label:"Videos",count:t(n).length,collapsible:!1},{default:S(()=>[p("div",Fs,[(o(!0),u(ee,null,fe(t(n),g=>(o(),V(f,{key:g.src,src:g.src,label:g.name},null,8,["src","label"]))),128))])]),_:1},8,["count"])):w("",!0)}}}),di=Object.assign(qs,{__name:"TestEvidenceVideos"}),Zs={class:"flex items-center justify-between gap-2"},Ws={class:"flex items-center gap-2 min-w-0"},Js={class:"text-sm truncate"},Gs={key:0,class:"text-xs text-gray-400 shrink-0"},Ys={key:1,class:"text-xs text-gray-400 shrink-0"},Qs={class:"flex items-center gap-1.5 shrink-0"},Xs=de({__name:"TraceListItem",props:{trace:{},showTime:{type:Boolean,default:!0}},setup(e){const a=e,i=ze(),c=z(()=>(i.app?.baseURL??"/").replace(/\/$/,"")),n=z(()=>!!i.public.demoMode&&a.trace.filePath.startsWith("demo/")),s=z(()=>a.trace.filePath.split("/").pop()||a.trace.filePath),l=z(()=>dt(a.trace.filePath,i.app?.baseURL,n.value)),f=z(()=>n.value?`${c.value}/${a.trace.filePath}`:`${c.value}/api/files/${jt(a.trace.filePath)}`);return(r,g)=>{const x=we,L=Le;return o(),u("div",Zs,[p("div",Ws,[b(x,{name:"i-lucide-file-archive",class:"size-4 text-gray-400 shrink-0"}),p("span",Js,k(t(s)),1),e.trace.size?(o(),u("span",Gs,k(("formatBytes"in r?r.formatBytes:t(Gt))(e.trace.size)),1)):w("",!0),e.showTime?(o(),u("span",Ys,k(("formatRelativeTime"in r?r.formatRelativeTime:t(We))(e.trace.createdAt)),1)):w("",!0)]),p("div",Qs,[b(L,{to:t(l),target:"_blank",icon:"i-lucide-bug-play",size:"xs",label:"View trace"},null,8,["to"]),b(L,{to:t(f),target:"_blank",icon:"i-lucide-download",size:"xs",color:"neutral",variant:"soft",label:"Download"},null,8,["to"])])])}}}),ea=Object.assign(Xs,{__name:"TraceListItem"}),ta={key:0,class:"flex items-center justify-center py-4"},na={key:1,class:"divide-y divide-default"},oa=de({__name:"TestEvidenceTraces",props:{traces:{},loading:{type:Boolean}},setup(e){return(a,i)=>{const c=we,n=ea,s=et;return e.loading||e.traces.length>0?(o(),V(s,{key:0,icon:"i-lucide-bug-play",label:"Traces",count:e.traces.length||null,collapsible:!1},{default:S(()=>[e.loading&&!e.traces.length?(o(),u("div",ta,[b(c,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):(o(),u("div",na,[(o(!0),u(ee,null,fe(e.traces,l=>(o(),V(n,{key:l.id,trace:l,class:"px-3 py-2"},null,8,["trace"]))),128))]))]),_:1},8,["count"])):w("",!0)}}}),pi=Object.assign(oa,{__name:"TestEvidenceTraces"}),sa={class:"space-y-2"},aa={key:0,class:"rounded-lg border border-default overflow-hidden"},ia=["title"],ra={key:2,class:"truncate text-gray-400 dark:text-gray-500"},la={class:"font-mono"},ca={key:0,class:"overflow-x-auto text-xs font-mono leading-relaxed py-1"},ua={class:"min-w-max"},da={key:1,class:"rounded-lg border border-dashed border-default"},pa=["onClick"],fa={key:0,class:"px-3 pb-2 space-y-1"},ma=["title"],ga={key:0,class:"truncate font-mono shrink-0"},ha=de({__name:"TraceCallStack",props:{frames:{},projectKey:{},projectName:{}},setup(e){const a=e,i=z(()=>{if(!a.frames.some(L=>L.inProject))return a.frames.map((L,h)=>({kind:"frame",frame:L,frameIndex:h}));const r=[];let g=[];const x=()=>{g.length!==0&&(r.push({kind:"group",frames:g,key:`group-${r.length}`}),g=[])};return a.frames.forEach((L,h)=>{L.inProject?(x(),r.push({kind:"frame",frame:L,frameIndex:h})):g.push(L)}),x(),r}),c=z(()=>{const f=a.frames.findIndex(r=>r.inProject);return f>=0?f:0}),n=J(new Set);function s(f){const r=new Set(n.value);r.has(f)?r.delete(f):r.add(f),n.value=r}function l(f){return f.source?f.source.lines.map((r,g)=>{const x=f.source.startLine+g;return{lineNo:x,text:r,failing:x===f.line}}):[]}return(f,r)=>{const g=we,x=ft,L=Re;return o(),u("div",sa,[(o(!0),u(ee,null,fe(t(i),h=>(o(),u(ee,{key:h.kind==="frame"?`f-${h.frameIndex}`:h.key},[h.kind==="frame"?(o(),u("div",aa,[p("div",{class:he(["flex items-center gap-2 px-3 py-1.5 bg-elevated/40 text-xs",h.frame.source?"border-b border-default":""])},[b(g,{name:h.frameIndex===t(c)?"i-lucide-circle-x":"i-lucide-corner-left-up",class:he([h.frameIndex===t(c)?"text-red-500":"text-gray-400","size-3.5 shrink-0"])},null,8,["name","class"]),h.frame.inProject?(o(),V(x,{key:0,"file-path":h.frame.file,line:h.frame.line,column:h.frame.column,"project-key":e.projectKey,"project-name":e.projectName,class:"min-w-0"},null,8,["file-path","line","column","project-key","project-name"])):(o(),u("code",{key:1,class:"truncate text-gray-500 dark:text-gray-400",title:h.frame.absFile||h.frame.file},k(h.frame.file)+":"+k(h.frame.line),9,ia)),h.frame.functionName?(o(),u("span",ra,[r[0]||(r[0]=R(" in ",-1)),p("span",la,k(h.frame.functionName),1)])):w("",!0),b(L,{color:h.frameIndex===t(c)?"error":"neutral",variant:"subtle",size:"xs",class:"ml-auto shrink-0"},{default:S(()=>[R(k(h.frameIndex===t(c)?"Failed here":"Caller"),1)]),_:2},1032,["color"])],2),h.frame.source?(o(),u("div",ca,[p("div",ua,[(o(!0),u(ee,null,fe(l(h.frame),C=>(o(),u("div",{key:C.lineNo,class:he(["px-3 whitespace-pre flex",C.failing?"bg-red-50 dark:bg-red-950/30 text-red-700 dark:text-red-300 font-medium":"text-gray-600 dark:text-gray-400"])},[p("span",{class:he(["w-10 shrink-0 text-right pr-3 tabular-nums select-none",C.failing?"text-red-400 dark:text-red-500":"text-gray-300 dark:text-gray-600"])},k(C.lineNo),3),p("span",null,k(C.text),1)],2))),128))])])):w("",!0)])):(o(),u("div",da,[p("button",{type:"button",class:"w-full flex items-center gap-2 px-3 py-1.5 text-xs text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300",onClick:C=>s(h.key)},[b(g,{name:t(n).has(h.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 shrink-0"},null,8,["name"]),R(" "+k(h.frames.length)+" frame"+k(h.frames.length===1?"":"s")+" in dependencies ",1)],8,pa),t(n).has(h.key)?(o(),u("div",fa,[(o(!0),u(ee,null,fe(h.frames,(C,_)=>(o(),u("div",{key:_,class:"flex items-center gap-2 text-xs text-gray-400 dark:text-gray-500 min-w-0"},[b(g,{name:"i-lucide-corner-left-up",class:"size-3 shrink-0"}),p("code",{class:"truncate",title:C.absFile||C.file},k(C.file)+":"+k(C.line),9,ma),C.functionName?(o(),u("span",ga,k(C.functionName),1)):w("",!0)]))),128))])):w("",!0)]))],64))),128))])}}}),fi=Object.assign(ha,{__name:"TraceCallStack"}),ya={class:"space-y-2"},va={class:"flex items-center gap-2 px-3 py-1.5 bg-elevated/40 border-b border-default text-xs"},xa={class:"overflow-x-auto text-xs font-mono leading-relaxed py-1"},ba={class:"min-w-max"},ka=de({__name:"TestSourceStack",props:{frames:{},projectKey:{},projectName:{}},setup(e){function a(i){return i.split(`
|
|
5
|
+
`).map(c=>({text:c,failing:c.startsWith(">")}))}return(i,c)=>{const n=we,s=ft,l=Re;return o(),u("div",ya,[(o(!0),u(ee,null,fe(e.frames,(f,r)=>(o(),u("div",{key:`${f.file}:${f.line}:${r}`,class:"rounded-lg border border-default overflow-hidden"},[p("div",va,[b(n,{name:r===0?"i-lucide-circle-x":"i-lucide-corner-left-up",class:he([r===0?"text-red-500":"text-gray-400","size-3.5 shrink-0"])},null,8,["name","class"]),b(s,{"file-path":f.file,line:f.line,"project-key":e.projectKey,"project-name":e.projectName,class:"min-w-0"},null,8,["file-path","line","project-key","project-name"]),b(l,{color:r===0?"error":"neutral",variant:"subtle",size:"xs",class:"ml-auto shrink-0"},{default:S(()=>[R(k(r===0?"Failed here":"Caller"),1)]),_:2},1032,["color"])]),p("div",xa,[p("div",ba,[(o(!0),u(ee,null,fe(a(f.snippet),(g,x)=>(o(),u("div",{key:x,class:he(["px-3 whitespace-pre",g.failing?"bg-red-50 dark:bg-red-950/30 text-red-700 dark:text-red-300 font-medium":"text-gray-600 dark:text-gray-400"])},k(g.text),3))),128))])])]))),128))])}}}),mi=Object.assign(ka,{__name:"TestSourceStack"}),_a={class:"space-y-3 text-sm"},$a={key:0,class:"flex flex-col gap-0.5"},wa={class:"text-xs font-mono break-all"},Ca={key:1,class:"flex flex-col gap-0.5"},Aa={class:"text-xs font-mono break-all"},Sa={class:"grid grid-cols-1 gap-3 sm:grid-cols-2"},Ta={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},La={key:0,class:"text-xs text-gray-400"},Ra={key:1,class:"mt-1 space-y-0.5"},za={class:"text-gray-400"},Ia={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},Pa={key:0,class:"text-xs text-gray-400"},Ea={key:1,class:"mt-1 space-y-0.5"},Ba={key:0,class:"text-gray-400"},Oa={class:"text-gray-400"},Ma=de({__name:"PageStateCard",props:{pageState:{},storageKey:{},plain:{type:Boolean}},setup(e){const a=e,i=z(()=>a.plain?"div":a.storageKey?Ve:Ke),c=z(()=>a.plain?{}:{icon:"i-lucide-database",title:"App state at test end",help:"page-state",...a.storageKey?{storageKey:a.storageKey}:{}}),n=l=>[l.httpOnly?"HttpOnly":null,l.secure?"Secure":null,l.sameSite??null].filter(Boolean).join(", "),s=z(()=>{const l=a.pageState;return[`${l.localStorage.length} localStorage`,`${l.sessionStorage.length} sessionStorage`,`${l.cookies.length} cookie${l.cookies.length===1?"":"s"}`].join(" · ")});return(l,f)=>(o(),V(Te(t(i)),It(Pt(t(c))),Ee({default:S(()=>[p("div",_a,[e.pageState.url?(o(),u("div",$a,[f[0]||(f[0]=p("span",{class:"text-xs font-medium text-gray-500 dark:text-gray-400"},"URL",-1)),p("code",wa,k(e.pageState.url)+k(e.pageState.hash??""),1)])):w("",!0),e.pageState.historyState?(o(),u("div",Ca,[f[1]||(f[1]=p("span",{class:"text-xs font-medium text-gray-500 dark:text-gray-400"},"History state",-1)),p("code",Aa,k(e.pageState.historyState),1)])):w("",!0),p("div",Sa,[(o(!0),u(ee,null,fe({localStorage:e.pageState.localStorage,sessionStorage:e.pageState.sessionStorage},(r,g)=>(o(),u("div",{key:g},[p("span",Ta,k(g)+" ("+k(r.length)+")",1),r.length===0?(o(),u("p",La,"empty")):(o(),u("ul",Ra,[(o(!0),u(ee,null,fe(r,x=>(o(),u("li",{key:x.key,class:"text-xs font-mono truncate"},[R(k(x.key)+" ",1),p("span",za,"("+k(x.length)+" ch)",1)]))),128))]))]))),128))]),p("div",null,[p("span",Ia,"Cookies ("+k(e.pageState.cookies.length)+")",1),e.pageState.cookies.length===0?(o(),u("p",Pa,"none")):(o(),u("ul",Ea,[(o(!0),u(ee,null,fe(e.pageState.cookies,r=>(o(),u("li",{key:r.name+r.domain,class:"text-xs font-mono truncate"},[R(k(r.name)+" ",1),n(r)?(o(),u("span",Ba,"["+k(n(r))+"]",1)):w("",!0),p("span",Oa,"· "+k(r.domain),1)]))),128))]))]),f[2]||(f[2]=p("p",{class:"text-[11px] text-gray-400 dark:text-gray-500"}," Storage values and cookie values are never captured — key names, lengths and flags only. ",-1))])]),_:2},[e.storageKey&&!e.plain?{name:"folded",fn:S(()=>[p("span",null,k(t(s)),1)]),key:"0"}:void 0]),1040))}}),gi=Object.assign(Ma,{__name:"PageStateCard"});function hi(e={}){const a=J(!1),i=qe();let c=null;async function n(s,l,f={}){try{typeof ClipboardItem<"u"?await navigator.clipboard.write([new ClipboardItem({"text/plain":new Blob([s],{type:"text/plain"}),"text/html":new Blob([l],{type:"text/html"})})]):await navigator.clipboard.writeText(s),a.value=!0,c&&clearTimeout(c),c=setTimeout(()=>{a.value=!1,c=null},e.duration??2e3),f.toast&&i.add({title:typeof f.toast=="string"?f.toast:"Copied to clipboard",icon:"i-lucide-check",color:"success",duration:2e3})}catch{}}return{copyRich:n,copied:a}}export{et as _,ui as a,di as b,pi as c,fi as d,mi as e,gi as f,_n as g,Ve as h,ii as i,ri as j,li as k,ci as l,si as m,ai as n,ea as o,Hs as p,yt as q,hi as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as g,o as s,c as a,F as l,z as o,e as p,H as f,i as b,b as y,a1 as _,v as k}from"./
|
|
1
|
+
import{d as g,o as s,c as a,F as l,z as o,e as p,H as f,i as b,b as y,a1 as _,v as k}from"./1QWBzxLM.js";const x=g({__name:"MiniRunBars",props:{runs:{},height:{default:28},maxBars:{default:20}},setup(n){const r=n;function u(t){return["running","initializing","finalizing"].includes(t.status)?"bg-blue-400 dark:bg-blue-500":t.flakyTests>0&&t.status==="passed"?"bg-amber-400 dark:bg-amber-400":t.status==="passed"?"bg-green-500":["failed","timedout","interrupted"].includes(t.status)?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function c(t){const i=[`Run #${t.id}`,`Status: ${t.status}`,`${t.passedTests}/${t.totalTests} passed`];return t.flakyTests>0&&i.push(`${t.flakyTests} flaky`),i.join(" · ")}const d=k(()=>Math.max(0,r.maxBars-r.runs.length));return(t,i)=>{const m=f;return s(),a("div",{class:"flex items-stretch gap-px",style:_({height:`${n.height}px`})},[(s(!0),a(l,null,o(n.runs,e=>(s(),p(m,{key:e.id,to:`/test-runs/${e.id}`,title:c(e),class:b(["flex-1 rounded-sm transition-opacity hover:opacity-70 min-w-0",u(e)])},null,8,["to","title","class"]))),128)),(s(!0),a(l,null,o(y(d),e=>(s(),a("div",{key:`empty-${e}`,class:"flex-1 rounded-sm bg-gray-100 dark:bg-gray-800 min-w-0"}))),128))],4)}}}),$=Object.assign(x,{__name:"MiniRunBars"});export{$ as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{B as o}from"./1QWBzxLM.js";function n(){const t=o();return String(t.public.desktop)==="true"}export{n as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as a,o as n,c as i,U as o,a1 as r}from"./
|
|
1
|
+
import{d as a,o as n,c as i,U as o,a1 as r}from"./1QWBzxLM.js";const s=a({__name:"StatTileGrid",props:{minTileWidth:{default:"8.5rem"}},setup(e){return(t,l)=>(n(),i("div",{class:"grid gap-3",style:r({gridTemplateColumns:`repeat(auto-fit, minmax(min(${e.minTileWidth}, 100%), 1fr))`})},[o(t.$slots,"default")],4))}}),c=Object.assign(s,{__name:"StatTileGrid"});export{c as _};
|