@websublime/vite-plugin-open-api-devtools 0.9.0-next.0 → 0.9.0-next.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/dist/ModelsPage-OOYQ3USo.js +798 -0
- package/dist/ModelsPage-OOYQ3USo.js.map +1 -0
- package/dist/{RoutesPage-DmXBJ4J5.js → RoutesPage-BgsspZkr.js} +191 -191
- package/dist/RoutesPage-BgsspZkr.js.map +1 -0
- package/dist/SimulatorPage-g9fGUP4F.js +436 -0
- package/dist/SimulatorPage-g9fGUP4F.js.map +1 -0
- package/dist/TimelinePage-D_GD3OjL.js +861 -0
- package/dist/TimelinePage-D_GD3OjL.js.map +1 -0
- package/dist/{check-BdvaZxRt.js → check-B4mNtdMg.js} +2 -2
- package/dist/{check-BdvaZxRt.js.map → check-B4mNtdMg.js.map} +1 -1
- package/dist/devtools.css +1 -1
- package/dist/devtools.js +1 -1
- package/dist/devtools.umd.cjs +3 -3
- package/dist/devtools.umd.cjs.map +1 -1
- package/dist/{format-Cj8p3HJO.js → format-Dj37a-xS.js} +2 -2
- package/dist/{format-Cj8p3HJO.js.map → format-Dj37a-xS.js.map} +1 -1
- package/dist/{main-HjHdsAps.js → main-CWgkFc8w.js} +8 -7
- package/dist/{main-HjHdsAps.js.map → main-CWgkFc8w.js.map} +1 -1
- package/dist/registry-SW4SCwV5.js +216 -0
- package/dist/registry-SW4SCwV5.js.map +1 -0
- package/dist/spa/assets/{ModelsPage-8zCKSqIw.css → ModelsPage-CrseRvBH.css} +1 -1
- package/dist/spa/assets/ModelsPage-CxzHlUKB.js +4 -0
- package/dist/spa/assets/ModelsPage-CxzHlUKB.js.map +1 -0
- package/dist/spa/assets/RoutesPage-BchriFi3.js +2 -0
- package/dist/spa/assets/RoutesPage-BchriFi3.js.map +1 -0
- package/dist/spa/assets/{RoutesPage-BVXzvJ2S.css → RoutesPage-Wp_sf4Io.css} +1 -1
- package/dist/spa/assets/SimulatorPage-CHGPhn5Y.js +2 -0
- package/dist/spa/assets/SimulatorPage-CHGPhn5Y.js.map +1 -0
- package/dist/spa/assets/SimulatorPage-p6R5JJTE.css +1 -0
- package/dist/spa/assets/{TimelinePage-BDyp8kvu.css → TimelinePage-ED20f46Y.css} +1 -1
- package/dist/spa/assets/TimelinePage-zBBJCjLX.js +2 -0
- package/dist/spa/assets/TimelinePage-zBBJCjLX.js.map +1 -0
- package/dist/spa/assets/check-CDp1nxJT.js +2 -0
- package/dist/spa/assets/{check-9axZ93X-.js.map → check-CDp1nxJT.js.map} +1 -1
- package/dist/spa/assets/{format-CB-GiJ6N.js → format-DA0n5kox.js} +2 -2
- package/dist/spa/assets/{format-CB-GiJ6N.js.map → format-DA0n5kox.js.map} +1 -1
- package/dist/spa/assets/{index-BQr16DJ3.js → index-Ddu0x8qb.js} +3 -3
- package/dist/spa/assets/{index-BQr16DJ3.js.map → index-Ddu0x8qb.js.map} +1 -1
- package/dist/spa/assets/registry-CKvK0Ln5.js +2 -0
- package/dist/spa/assets/registry-CKvK0Ln5.js.map +1 -0
- package/dist/spa/assets/{trash-2-Cj6nHRK8.js → trash-2-B1UuFJDm.js} +2 -2
- package/dist/spa/assets/{trash-2-Cj6nHRK8.js.map → trash-2-B1UuFJDm.js.map} +1 -1
- package/dist/spa/assets/{triangle-alert-BXnev_tx.js → triangle-alert-ITT7135L.js} +2 -2
- package/dist/spa/assets/{triangle-alert-BXnev_tx.js.map → triangle-alert-ITT7135L.js.map} +1 -1
- package/dist/spa/assets/x-YOimnrsL.js +2 -0
- package/dist/spa/assets/{x-9zeMJ8Mo.js.map → x-YOimnrsL.js.map} +1 -1
- package/dist/spa/index.html +1 -1
- package/dist/{trash-2-unSVE8Jc.js → trash-2-CDLzu4_Y.js} +2 -2
- package/dist/{trash-2-unSVE8Jc.js.map → trash-2-CDLzu4_Y.js.map} +1 -1
- package/dist/{triangle-alert-B1V6ucAg.js → triangle-alert-BP3-t-po.js} +2 -2
- package/dist/{triangle-alert-B1V6ucAg.js.map → triangle-alert-BP3-t-po.js.map} +1 -1
- package/dist/{x-DWlhu3h-.js → x-BZzigrBR.js} +2 -2
- package/dist/{x-DWlhu3h-.js.map → x-BZzigrBR.js.map} +1 -1
- package/package.json +13 -13
- package/dist/ModelsPage-DoqfBilK.js +0 -757
- package/dist/ModelsPage-DoqfBilK.js.map +0 -1
- package/dist/RoutesPage-DmXBJ4J5.js.map +0 -1
- package/dist/SimulatorPage-BmM-ExQg.js +0 -430
- package/dist/SimulatorPage-BmM-ExQg.js.map +0 -1
- package/dist/TimelinePage-Dnh_47wz.js +0 -849
- package/dist/TimelinePage-Dnh_47wz.js.map +0 -1
- package/dist/registry-BQhccWMq.js +0 -153
- package/dist/registry-BQhccWMq.js.map +0 -1
- package/dist/spa/assets/ModelsPage-_etl-kz9.js +0 -4
- package/dist/spa/assets/ModelsPage-_etl-kz9.js.map +0 -1
- package/dist/spa/assets/RoutesPage-BN_Lo8uo.js +0 -2
- package/dist/spa/assets/RoutesPage-BN_Lo8uo.js.map +0 -1
- package/dist/spa/assets/SimulatorPage-BF4VLn5k.js +0 -2
- package/dist/spa/assets/SimulatorPage-BF4VLn5k.js.map +0 -1
- package/dist/spa/assets/SimulatorPage-DGEq_rzM.css +0 -1
- package/dist/spa/assets/TimelinePage-7OqKgItP.js +0 -2
- package/dist/spa/assets/TimelinePage-7OqKgItP.js.map +0 -1
- package/dist/spa/assets/check-9axZ93X-.js +0 -2
- package/dist/spa/assets/registry-DAv66ZPp.js +0 -2
- package/dist/spa/assets/registry-DAv66ZPp.js.map +0 -1
- package/dist/spa/assets/x-9zeMJ8Mo.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{g as q,C as B,a as Y,S as T,F as tt,b as et}from"./format-DA0n5kox.js";import{c as b,_ as E,u as st,a as nt,R as ot}from"./index-Ddu0x8qb.js";import{e as F,f as o,j as l,i as t,u as e,n as g,t as c,z as p,c as H,A as x,F as k,k as S,v as n,B as it,l as G,m as P,C as at,o as dt,D as lt,E as rt,r as V}from"./vue-vendor-D62nux6V.js";import{u as ct}from"./registry-CKvK0Ln5.js";import{X as j}from"./x-YOimnrsL.js";const R=b("code",[["path",{d:"m16 18 6-6-6-6",key:"eg8j8"}],["path",{d:"m8 6-6 6 6 6",key:"ppft3o"}]]);const M=b("file-json",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1",key:"1oajmo"}],["path",{d:"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1",key:"mpwhp6"}]]);const ut=b("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);const pt=b("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);const w=b("sprout",[["path",{d:"M7 20h10",key:"e6iznv"}],["path",{d:"M10 20c5.5-2.5.8-6.4 3-10",key:"161w41"}],["path",{d:"M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z",key:"9gtqwd"}],["path",{d:"M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z",key:"bkxnd2"}]]);const _t=b("tag",[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]]),ht={class:"endpoint-detail"},yt={key:0,class:"endpoint-detail__empty"},mt={key:1,class:"endpoint-detail__content"},gt={class:"endpoint-detail__header"},vt={class:"endpoint-detail__path font-mono"},ft={class:"endpoint-detail__status"},kt={key:0,class:"endpoint-detail__status-item endpoint-detail__status-item--handler"},bt={key:1,class:"endpoint-detail__status-item endpoint-detail__status-item--seed"},$t={key:2,class:"endpoint-detail__status-item endpoint-detail__status-item--security"},St={key:3,class:"endpoint-detail__status-item endpoint-detail__status-item--auto"},Ct={class:"endpoint-detail__sections"},zt={class:"endpoint-detail__section"},xt={class:"endpoint-detail__section-content font-mono"},Mt={key:0,class:"endpoint-detail__section"},Ht={class:"endpoint-detail__section-title"},Et={class:"endpoint-detail__tags"},Ft={key:1,class:"endpoint-detail__section"},Rt={class:"endpoint-detail__section-content"},wt={key:2,class:"endpoint-detail__section"},It={class:"endpoint-detail__section-content endpoint-detail__description"},Dt={key:3,class:"endpoint-detail__section"},Lt={class:"endpoint-detail__section-title"},Nt={class:"endpoint-detail__section-content font-mono"},At={key:4,class:"endpoint-detail__section"},Tt={class:"endpoint-detail__section-title"},Vt={class:"endpoint-detail__security"},jt={class:"endpoint-detail__security-name font-mono"},qt={class:"endpoint-detail__security-scopes text-muted"},Bt=F({__name:"EndpointDetail",props:{endpoint:{}},setup(d){const s=d,v=H(()=>s.endpoint?.security&&s.endpoint.security.length>0),f=H(()=>s.endpoint?.security?s.endpoint.security.map(y=>({name:y.name,scopes:y.scopes.length>0?y.scopes.join(", "):"No scopes"})):[]);return(y,i)=>(n(),o("div",ht,[d.endpoint?(n(),o("div",mt,[t("header",gt,[t("span",{class:g(["method-badge","method-badge--large",`method-badge--${d.endpoint.method}`])},c(e(q)(d.endpoint.method)),3),t("h2",vt,c(d.endpoint.path),1)]),t("div",ft,[d.endpoint.hasHandler?(n(),o("div",kt,[l(e(R),{size:14}),i[2]||(i[2]=t("span",null,"Has custom handler",-1))])):p("",!0),d.endpoint.hasSeed?(n(),o("div",bt,[l(e(w),{size:14}),i[3]||(i[3]=t("span",null,"Has seed data",-1))])):p("",!0),v.value?(n(),o("div",$t,[l(e(ut),{size:14}),i[4]||(i[4]=t("span",null,"Requires authentication",-1))])):p("",!0),!d.endpoint.hasHandler&&!d.endpoint.hasSeed?(n(),o("div",St,[l(e(M),{size:14}),i[5]||(i[5]=t("span",null,"Auto-generated response",-1))])):p("",!0)]),t("div",Ct,[t("section",zt,[i[6]||(i[6]=t("h3",{class:"endpoint-detail__section-title"},"Operation",-1)),t("p",xt,c(d.endpoint.operationId),1)]),d.endpoint.tags.length>0?(n(),o("section",Mt,[t("h3",Ht,[l(e(_t),{size:14}),i[7]||(i[7]=x(" Tags ",-1))]),t("div",Et,[(n(!0),o(k,null,S(d.endpoint.tags,_=>(n(),o("span",{key:_,class:"endpoint-detail__tag"},c(_),1))),128))])])):p("",!0),d.endpoint.summary?(n(),o("section",Ft,[i[8]||(i[8]=t("h3",{class:"endpoint-detail__section-title"},"Summary",-1)),t("p",Rt,c(d.endpoint.summary),1)])):p("",!0),d.endpoint.description?(n(),o("section",wt,[i[9]||(i[9]=t("h3",{class:"endpoint-detail__section-title"},"Description",-1)),t("p",It,c(d.endpoint.description),1)])):p("",!0),d.endpoint.responseSchema?(n(),o("section",Dt,[t("h3",Lt,[l(e(M),{size:14}),i[10]||(i[10]=x(" Response Schema ",-1))]),t("p",Nt,c(d.endpoint.responseSchema),1)])):p("",!0),v.value?(n(),o("section",At,[t("h3",Tt,[l(e(pt),{size:14}),i[11]||(i[11]=x(" Security ",-1))]),t("div",Vt,[(n(!0),o(k,null,S(f.value,_=>(n(),o("div",{key:_.name,class:"endpoint-detail__security-item"},[t("span",jt,c(_.name),1),t("span",qt,c(_.scopes),1)]))),128))])])):p("",!0)])])):(n(),o("div",yt,[l(e(M),{size:48,class:"endpoint-detail__empty-icon"}),i[0]||(i[0]=t("h3",{class:"endpoint-detail__empty-title"},"No endpoint selected",-1)),i[1]||(i[1]=t("p",{class:"endpoint-detail__empty-text text-muted"}," Select an endpoint from the list to view its details ",-1))]))]))}}),Gt=E(Bt,[["__scopeId","data-v-c66a0f52"]]),Pt={class:"endpoint-list"},Qt={key:0,class:"endpoint-list__empty"},Kt={key:1,class:"endpoint-list__groups"},Ut=["aria-expanded","aria-controls","onClick"],Ot={class:"endpoint-group__tag"},Jt={class:"endpoint-group__count text-muted"},Wt=["id","aria-label"],Xt=["aria-selected","onClick"],Zt={class:"endpoint-item__path font-mono"},Yt={class:"endpoint-item__indicators"},te={key:0,class:"endpoint-item__indicator endpoint-item__indicator--handler",title:"Has custom handler"},ee={key:1,class:"endpoint-item__indicator endpoint-item__indicator--seed",title:"Has seed data"},se=F({__name:"EndpointList",props:{groups:{},selectedKey:{}},emits:["select","toggle-group"],setup(d,{emit:s}){const v=d,f=s;function y(m){f("select",m.key)}function i(m){f("toggle-group",m)}function _(m){return v.selectedKey===m.key}return(m,C)=>(n(),o("div",Pt,[d.groups.length===0?(n(),o("div",Qt,[...C[0]||(C[0]=[t("p",{class:"text-muted"},"No endpoints found",-1)])])):(n(),o("div",Kt,[(n(!0),o(k,null,S(d.groups,u=>(n(),o("div",{key:u.tag,class:"endpoint-group"},[t("button",{type:"button",class:"endpoint-group__header","aria-expanded":u.isExpanded,"aria-controls":`group-${u.tag}`,onClick:h=>i(u.tag)},[(n(),G(P(u.isExpanded?e(B):e(Y)),{size:16,class:"endpoint-group__chevron"})),t("span",Ot,c(u.tag),1),t("span",Jt," ("+c(u.endpoints.length)+") ",1)],8,Ut),it(t("div",{id:`group-${u.tag}`,class:"endpoint-group__items",role:"group","aria-label":`${u.tag} endpoints`},[(n(!0),o(k,null,S(u.endpoints,h=>(n(),o("button",{key:h.key,type:"button",class:g(["endpoint-item",{"endpoint-item--selected":_(h)}]),"aria-selected":_(h),onClick:I=>y(h)},[t("span",{class:g(["method-badge",`method-badge--${h.method}`])},c(e(q)(h.method)),3),t("span",Zt,c(h.path),1),t("div",Yt,[h.hasHandler?(n(),o("span",te,[l(e(R),{size:12})])):p("",!0),h.hasSeed?(n(),o("span",ee,[l(e(w),{size:12})])):p("",!0)])],10,Xt))),128))],8,Wt),[[at,u.isExpanded]])]))),128))]))]))}}),ne=E(se,[["__scopeId","data-v-554ffe63"]]),oe={class:"routes-page"},ie={class:"routes-toolbar"},ae={class:"routes-search"},de=["value"],le=["aria-expanded"],re={key:0,class:"routes-filter-toggle__badge"},ce={class:"routes-stats"},ue={class:"routes-stats__item"},pe={class:"routes-stats__item"},_e={key:0,class:"routes-filters"},he={class:"routes-filters__section"},ye={class:"routes-filters__methods"},me=["onClick"],ge={class:"routes-filters__section"},ve={class:"routes-filters__status"},fe={key:0,class:"routes-filters__actions"},ke={class:"routes-content"},be={key:0,class:"routes-loading"},$e={key:1,class:"routes-error"},Se={class:"routes-error__message"},Ce={key:2,class:"routes-empty empty-state"},ze={key:3,class:"routes-empty empty-state"},xe={class:"routes-list-panel"},Me={class:"routes-detail-panel"},He=F({__name:"RoutesPage",setup(d){const s=ct(),v=st(),{send:f,on:y,connected:i}=nt(),_=V(!1),m=V(null),C=["get","post","put","patch","delete","options","head","trace"];function u(){i.value&&(s.setLoading(!0),f({type:"get:registry"}))}function h(r){s.setRegistryData(v.specIds[0]??"default",r),s.setLoading(!1)}function I(r){s.selectEndpoint(r)}function Q(r){s.toggleGroup(r)}function K(r){const a=r.target;s.setSearchQuery(a.value)}function U(){s.setSearchQuery(""),m.value?.focus()}function O(r){s.toggleMethodFilter(r)}function J(r){return s.filter.methods.includes(r)}function W(){const r=s.filter.hasHandler;s.setHandlerFilter(r===!0?null:!0)}function X(){const r=s.filter.hasSeed;s.setSeedFilter(r===!0?null:!0)}function D(){s.clearFilters()}function Z(){_.value=!_.value}const z=H(()=>s.hasActiveFilters());let L=null,N=null,A=null;return dt(()=>{L=y("registry",h),N=y("handlers:updated",()=>u()),A=y("seeds:updated",()=>u()),i.value&&u()}),lt(()=>{L?.(),N?.(),A?.()}),rt(i,r=>{r&&u()}),(r,a)=>(n(),o("div",oe,[t("div",ie,[t("div",ae,[l(e(T),{size:16,class:"routes-search__icon"}),t("input",{ref_key:"searchInputRef",ref:m,type:"text",class:"routes-search__input input",placeholder:"Search endpoints...",value:e(s).searchQuery,onInput:K},null,40,de),e(s).searchQuery?(n(),o("button",{key:0,type:"button",class:"routes-search__clear btn btn--ghost btn--icon",title:"Clear search",onClick:U},[l(e(j),{size:14})])):p("",!0)]),t("button",{type:"button",class:g(["routes-filter-toggle btn btn--secondary",{"routes-filter-toggle--active":z.value}]),"aria-expanded":_.value,onClick:Z},[l(e(tt),{size:16}),a[0]||(a[0]=t("span",null,"Filters",-1)),z.value?(n(),o("span",re,c(e(s).filter.methods.length+(e(s).filter.hasHandler?1:0)+(e(s).filter.hasSeed?1:0)),1)):p("",!0),(n(),G(P(_.value?e(et):e(B)),{size:14}))],10,le),t("div",ce,[t("span",ue,c(e(s).filteredEndpoints.length)+" endpoints ",1),a[1]||(a[1]=t("span",{class:"routes-stats__separator"},"|",-1)),t("span",pe,c(e(s).allTags.length)+" tags ",1)])]),_.value?(n(),o("div",_e,[t("div",he,[a[2]||(a[2]=t("h4",{class:"routes-filters__title"},"Methods",-1)),t("div",ye,[(n(),o(k,null,S(C,$=>t("button",{key:$,type:"button",class:g(["method-badge",`method-badge--${$}`,{"method-badge--inactive":!J($)&&e(s).filter.methods.length>0}]),onClick:Ee=>O($)},c($.toUpperCase()),11,me)),64))])]),t("div",ge,[a[5]||(a[5]=t("h4",{class:"routes-filters__title"},"Status",-1)),t("div",ve,[t("button",{type:"button",class:g(["routes-filters__status-btn",{"routes-filters__status-btn--active":e(s).filter.hasHandler}]),onClick:W},[l(e(R),{size:14}),a[3]||(a[3]=t("span",null,"Has Handler",-1))],2),t("button",{type:"button",class:g(["routes-filters__status-btn",{"routes-filters__status-btn--active":e(s).filter.hasSeed}]),onClick:X},[l(e(w),{size:14}),a[4]||(a[4]=t("span",null,"Has Seed",-1))],2)])]),z.value?(n(),o("div",fe,[t("button",{type:"button",class:"btn btn--ghost",onClick:D},[l(e(j),{size:14}),a[6]||(a[6]=x(" Clear all filters ",-1))])])):p("",!0)])):p("",!0),t("div",ke,[e(s).isLoading?(n(),o("div",be,[...a[7]||(a[7]=[t("div",{class:"routes-loading__spinner"},null,-1),t("span",{class:"text-muted"},"Loading endpoints...",-1)])])):e(s).error?(n(),o("div",$e,[t("p",Se,c(e(s).error),1),t("button",{type:"button",class:"btn btn--primary",onClick:u}," Retry ")])):e(s).endpoints.length===0?(n(),o("div",Ce,[l(e(ot),{size:48,class:"empty-state__icon"}),a[8]||(a[8]=t("h3",{class:"empty-state__title"},"No endpoints found",-1)),a[9]||(a[9]=t("p",{class:"empty-state__description"}," No API endpoints are available. Make sure your OpenAPI spec is loaded. ",-1))])):e(s).filteredEndpoints.length===0?(n(),o("div",ze,[l(e(T),{size:48,class:"empty-state__icon"}),a[10]||(a[10]=t("h3",{class:"empty-state__title"},"No matching endpoints",-1)),a[11]||(a[11]=t("p",{class:"empty-state__description"}," Try adjusting your search or filters. ",-1)),z.value?(n(),o("button",{key:0,type:"button",class:"btn btn--secondary",onClick:D}," Clear filters ")):p("",!0)])):(n(),o(k,{key:4},[t("div",xe,[l(ne,{groups:e(s).groupedEndpoints,"selected-key":e(s).selectedEndpointKey,onSelect:I,onToggleGroup:Q},null,8,["groups","selected-key"])]),t("div",Me,[l(Gt,{endpoint:e(s).selectedEndpoint},null,8,["endpoint"])])],64))])]))}}),Le=E(He,[["__scopeId","data-v-c32ae519"]]);export{Le as default};
|
|
2
|
+
//# sourceMappingURL=RoutesPage-BchriFi3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutesPage-BchriFi3.js","sources":["../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/code.js","../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/file-json.js","../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/lock.js","../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/shield.js","../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/sprout.js","../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/tag.js","../../../src/components/EndpointDetail.vue","../../../src/components/EndpointList.vue","../../../src/pages/RoutesPage.vue"],"sourcesContent":["/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Code = createLucideIcon(\"code\", [\n [\"path\", { d: \"m16 18 6-6-6-6\", key: \"eg8j8\" }],\n [\"path\", { d: \"m8 6-6 6 6 6\", key: \"ppft3o\" }]\n]);\n\nexport { Code as default };\n//# sourceMappingURL=code.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileJson = createLucideIcon(\"file-json\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\n \"path\",\n { d: \"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\", key: \"1oajmo\" }\n ],\n [\n \"path\",\n { d: \"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\", key: \"mpwhp6\" }\n ]\n]);\n\nexport { FileJson as default };\n//# sourceMappingURL=file-json.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sprout = createLucideIcon(\"sprout\", [\n [\"path\", { d: \"M7 20h10\", key: \"e6iznv\" }],\n [\"path\", { d: \"M10 20c5.5-2.5.8-6.4 3-10\", key: \"161w41\" }],\n [\n \"path\",\n {\n d: \"M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z\",\n key: \"9gtqwd\"\n }\n ],\n [\n \"path\",\n {\n d: \"M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z\",\n key: \"bkxnd2\"\n }\n ]\n]);\n\nexport { Sprout as default };\n//# sourceMappingURL=sprout.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Tag = createLucideIcon(\"tag\", [\n [\n \"path\",\n {\n d: \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n key: \"vktsd0\"\n }\n ],\n [\"circle\", { cx: \"7.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"kqv944\" }]\n]);\n\nexport { Tag as default };\n//# sourceMappingURL=tag.js.map\n","<!--\n EndpointDetail.vue - Endpoint Detail Panel Component\n\n What: Displays detailed information about a selected API endpoint\n How: Shows method, path, operation ID, tags, summary, description, and status indicators\n Why: Provides comprehensive endpoint information for developers using the DevTools\n-->\n\n<script setup lang=\"ts\">\nimport { Code, FileJson, Lock, Shield, Sprout, Tag } from 'lucide-vue-next';\nimport { computed } from 'vue';\n\nimport type { EndpointEntry } from '@/stores/registry';\nimport { getMethodLabel } from '@/utils/format';\n\n/**\n * Component props\n */\ninterface Props {\n /** Endpoint to display details for */\n endpoint: EndpointEntry | null;\n}\n\nconst props = defineProps<Props>();\n\n/**\n * Check if endpoint has security requirements\n */\nconst hasSecurity = computed(() => {\n return props.endpoint?.security && props.endpoint.security.length > 0;\n});\n\n/**\n * Format security requirements for display\n */\nconst securityDisplay = computed(() => {\n if (!props.endpoint?.security) return [];\n return props.endpoint.security.map((sec) => ({\n name: sec.name,\n scopes: sec.scopes.length > 0 ? sec.scopes.join(', ') : 'No scopes',\n }));\n});\n</script>\n\n<template>\n <div class=\"endpoint-detail\">\n <!-- Empty state when no endpoint selected -->\n <div v-if=\"!endpoint\" class=\"endpoint-detail__empty\">\n <FileJson :size=\"48\" class=\"endpoint-detail__empty-icon\" />\n <h3 class=\"endpoint-detail__empty-title\">No endpoint selected</h3>\n <p class=\"endpoint-detail__empty-text text-muted\">\n Select an endpoint from the list to view its details\n </p>\n </div>\n\n <!-- Endpoint details -->\n <div v-else class=\"endpoint-detail__content\">\n <!-- Header with method and path -->\n <header class=\"endpoint-detail__header\">\n <span\n :class=\"[\n 'method-badge',\n 'method-badge--large',\n `method-badge--${endpoint.method}`\n ]\"\n >\n {{ getMethodLabel(endpoint.method) }}\n </span>\n <h2 class=\"endpoint-detail__path font-mono\">\n {{ endpoint.path }}\n </h2>\n </header>\n\n <!-- Status indicators -->\n <div class=\"endpoint-detail__status\">\n <div\n v-if=\"endpoint.hasHandler\"\n class=\"endpoint-detail__status-item endpoint-detail__status-item--handler\"\n >\n <Code :size=\"14\" />\n <span>Has custom handler</span>\n </div>\n <div\n v-if=\"endpoint.hasSeed\"\n class=\"endpoint-detail__status-item endpoint-detail__status-item--seed\"\n >\n <Sprout :size=\"14\" />\n <span>Has seed data</span>\n </div>\n <div\n v-if=\"hasSecurity\"\n class=\"endpoint-detail__status-item endpoint-detail__status-item--security\"\n >\n <Lock :size=\"14\" />\n <span>Requires authentication</span>\n </div>\n <div\n v-if=\"!endpoint.hasHandler && !endpoint.hasSeed\"\n class=\"endpoint-detail__status-item endpoint-detail__status-item--auto\"\n >\n <FileJson :size=\"14\" />\n <span>Auto-generated response</span>\n </div>\n </div>\n\n <!-- Info sections -->\n <div class=\"endpoint-detail__sections\">\n <!-- Operation ID -->\n <section class=\"endpoint-detail__section\">\n <h3 class=\"endpoint-detail__section-title\">Operation</h3>\n <p class=\"endpoint-detail__section-content font-mono\">\n {{ endpoint.operationId }}\n </p>\n </section>\n\n <!-- Tags -->\n <section v-if=\"endpoint.tags.length > 0\" class=\"endpoint-detail__section\">\n <h3 class=\"endpoint-detail__section-title\">\n <Tag :size=\"14\" />\n Tags\n </h3>\n <div class=\"endpoint-detail__tags\">\n <span\n v-for=\"tag in endpoint.tags\"\n :key=\"tag\"\n class=\"endpoint-detail__tag\"\n >\n {{ tag }}\n </span>\n </div>\n </section>\n\n <!-- Summary -->\n <section v-if=\"endpoint.summary\" class=\"endpoint-detail__section\">\n <h3 class=\"endpoint-detail__section-title\">Summary</h3>\n <p class=\"endpoint-detail__section-content\">\n {{ endpoint.summary }}\n </p>\n </section>\n\n <!-- Description -->\n <section v-if=\"endpoint.description\" class=\"endpoint-detail__section\">\n <h3 class=\"endpoint-detail__section-title\">Description</h3>\n <p class=\"endpoint-detail__section-content endpoint-detail__description\">\n {{ endpoint.description }}\n </p>\n </section>\n\n <!-- Response Schema -->\n <section v-if=\"endpoint.responseSchema\" class=\"endpoint-detail__section\">\n <h3 class=\"endpoint-detail__section-title\">\n <FileJson :size=\"14\" />\n Response Schema\n </h3>\n <p class=\"endpoint-detail__section-content font-mono\">\n {{ endpoint.responseSchema }}\n </p>\n </section>\n\n <!-- Security -->\n <section v-if=\"hasSecurity\" class=\"endpoint-detail__section\">\n <h3 class=\"endpoint-detail__section-title\">\n <Shield :size=\"14\" />\n Security\n </h3>\n <div class=\"endpoint-detail__security\">\n <div\n v-for=\"sec in securityDisplay\"\n :key=\"sec.name\"\n class=\"endpoint-detail__security-item\"\n >\n <span class=\"endpoint-detail__security-name font-mono\">\n {{ sec.name }}\n </span>\n <span class=\"endpoint-detail__security-scopes text-muted\">\n {{ sec.scopes }}\n </span>\n </div>\n </div>\n </section>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.endpoint-detail {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n/* Empty state */\n.endpoint-detail__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: var(--devtools-space-xl);\n text-align: center;\n}\n\n.endpoint-detail__empty-icon {\n color: var(--devtools-text-muted);\n opacity: 0.5;\n margin-bottom: var(--devtools-space-md);\n}\n\n.endpoint-detail__empty-title {\n font-size: var(--font-size-2);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n margin: 0 0 var(--devtools-space-sm);\n}\n\n.endpoint-detail__empty-text {\n font-size: var(--font-size-1);\n margin: 0;\n}\n\n/* Content */\n.endpoint-detail__content {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow-y: auto;\n padding: var(--devtools-space-md);\n}\n\n/* Header */\n.endpoint-detail__header {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-md);\n margin-bottom: var(--devtools-space-md);\n padding-bottom: var(--devtools-space-md);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.endpoint-detail__path {\n font-size: var(--font-size-2);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n margin: 0;\n word-break: break-all;\n}\n\n/* Large method badge */\n.method-badge--large {\n font-size: var(--font-size-0);\n padding: var(--devtools-space-sm) var(--devtools-space-md);\n min-width: 70px;\n}\n\n/* Status indicators */\n.endpoint-detail__status {\n display: flex;\n flex-wrap: wrap;\n gap: var(--devtools-space-sm);\n margin-bottom: var(--devtools-space-md);\n}\n\n.endpoint-detail__status-item {\n display: inline-flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n}\n\n.endpoint-detail__status-item--handler {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n color: var(--devtools-info);\n}\n\n.endpoint-detail__status-item--seed {\n background-color: color-mix(in srgb, var(--devtools-success) 15%, transparent);\n color: var(--devtools-success);\n}\n\n.endpoint-detail__status-item--security {\n background-color: color-mix(in srgb, var(--devtools-warning) 15%, transparent);\n color: var(--devtools-warning);\n}\n\n.endpoint-detail__status-item--auto {\n background-color: color-mix(in srgb, var(--devtools-text-muted) 15%, transparent);\n color: var(--devtools-text-muted);\n}\n\n/* Sections */\n.endpoint-detail__sections {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-md);\n}\n\n.endpoint-detail__section {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n.endpoint-detail__section-title {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-6);\n color: var(--devtools-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin: 0;\n}\n\n.endpoint-detail__section-content {\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n margin: 0;\n line-height: var(--font-lineheight-3);\n}\n\n.endpoint-detail__description {\n white-space: pre-wrap;\n}\n\n/* Tags */\n.endpoint-detail__tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--devtools-space-xs);\n}\n\n.endpoint-detail__tag {\n display: inline-flex;\n align-items: center;\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background-color: var(--devtools-surface-elevated);\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n color: var(--devtools-text);\n}\n\n/* Security */\n.endpoint-detail__security {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n.endpoint-detail__security-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: var(--devtools-space-sm);\n background-color: var(--devtools-surface-elevated);\n border-radius: var(--devtools-radius-sm);\n}\n\n.endpoint-detail__security-name {\n font-size: var(--font-size-1);\n font-weight: var(--font-weight-5);\n}\n\n.endpoint-detail__security-scopes {\n font-size: var(--font-size-0);\n}\n</style>\n","<!--\n EndpointList.vue - Grouped Endpoint Listing Component\n\n What: Displays a list of API endpoints grouped by tags with collapsible sections\n How: Renders endpoint groups from registry store with method badges and selection support\n Why: Provides organized navigation through available mock endpoints\n-->\n\n<script setup lang=\"ts\">\nimport { ChevronDown, ChevronRight, Code, Sprout } from 'lucide-vue-next';\n\nimport type { EndpointEntry, EndpointGroup } from '@/stores/registry';\nimport { getMethodLabel } from '@/utils/format';\n\n/**\n * Component props\n */\ninterface Props {\n /** Grouped endpoints to display */\n groups: EndpointGroup[];\n /** Currently selected endpoint key */\n selectedKey: string | null;\n}\n\nconst props = defineProps<Props>();\n\n/**\n * Component events\n */\nconst emit = defineEmits<{\n /** Emitted when an endpoint is selected */\n (e: 'select', key: string): void;\n /** Emitted when a group is toggled */\n (e: 'toggle-group', tag: string): void;\n}>();\n\n/**\n * Handle endpoint click\n */\nfunction handleEndpointClick(endpoint: EndpointEntry): void {\n emit('select', endpoint.key);\n}\n\n/**\n * Handle group toggle\n */\nfunction handleGroupToggle(tag: string): void {\n emit('toggle-group', tag);\n}\n\n/**\n * Check if endpoint is selected\n */\nfunction isSelected(endpoint: EndpointEntry): boolean {\n return props.selectedKey === endpoint.key;\n}\n</script>\n\n<template>\n <div class=\"endpoint-list\">\n <!-- Empty state -->\n <div v-if=\"groups.length === 0\" class=\"endpoint-list__empty\">\n <p class=\"text-muted\">No endpoints found</p>\n </div>\n\n <!-- Endpoint groups -->\n <div v-else class=\"endpoint-list__groups\">\n <div\n v-for=\"group in groups\"\n :key=\"group.tag\"\n class=\"endpoint-group\"\n >\n <!-- Group header -->\n <button\n type=\"button\"\n class=\"endpoint-group__header\"\n :aria-expanded=\"group.isExpanded\"\n :aria-controls=\"`group-${group.tag}`\"\n @click=\"handleGroupToggle(group.tag)\"\n >\n <component\n :is=\"group.isExpanded ? ChevronDown : ChevronRight\"\n :size=\"16\"\n class=\"endpoint-group__chevron\"\n />\n <span class=\"endpoint-group__tag\">{{ group.tag }}</span>\n <span class=\"endpoint-group__count text-muted\">\n ({{ group.endpoints.length }})\n </span>\n </button>\n\n <!-- Group endpoints -->\n <div\n v-show=\"group.isExpanded\"\n :id=\"`group-${group.tag}`\"\n class=\"endpoint-group__items\"\n role=\"group\"\n :aria-label=\"`${group.tag} endpoints`\"\n >\n <button\n v-for=\"endpoint in group.endpoints\"\n :key=\"endpoint.key\"\n type=\"button\"\n :class=\"[\n 'endpoint-item',\n { 'endpoint-item--selected': isSelected(endpoint) }\n ]\"\n :aria-selected=\"isSelected(endpoint)\"\n @click=\"handleEndpointClick(endpoint)\"\n >\n <!-- Method badge -->\n <span\n :class=\"[\n 'method-badge',\n `method-badge--${endpoint.method}`\n ]\"\n >\n {{ getMethodLabel(endpoint.method) }}\n </span>\n\n <!-- Path -->\n <span class=\"endpoint-item__path font-mono\">\n {{ endpoint.path }}\n </span>\n\n <!-- Status indicators -->\n <div class=\"endpoint-item__indicators\">\n <span\n v-if=\"endpoint.hasHandler\"\n class=\"endpoint-item__indicator endpoint-item__indicator--handler\"\n title=\"Has custom handler\"\n >\n <Code :size=\"12\" />\n </span>\n <span\n v-if=\"endpoint.hasSeed\"\n class=\"endpoint-item__indicator endpoint-item__indicator--seed\"\n title=\"Has seed data\"\n >\n <Sprout :size=\"12\" />\n </span>\n </div>\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.endpoint-list {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n.endpoint-list__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--devtools-space-lg);\n}\n\n.endpoint-list__groups {\n flex: 1;\n overflow-y: auto;\n padding: var(--devtools-space-xs);\n}\n\n/* Group styles */\n.endpoint-group {\n margin-bottom: var(--devtools-space-xs);\n}\n\n.endpoint-group__header {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n width: 100%;\n padding: var(--devtools-space-sm) var(--devtools-space-sm);\n background: none;\n border: none;\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-1);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n text-align: left;\n cursor: pointer;\n transition: background-color var(--devtools-transition-fast);\n}\n\n.endpoint-group__header:hover {\n background-color: var(--devtools-surface-elevated);\n}\n\n.endpoint-group__header:focus {\n outline: none;\n}\n\n.endpoint-group__header:focus-visible {\n outline: 2px solid var(--devtools-primary);\n outline-offset: -2px;\n}\n\n.endpoint-group__chevron {\n flex-shrink: 0;\n color: var(--devtools-text-muted);\n}\n\n.endpoint-group__tag {\n flex: 1;\n text-transform: capitalize;\n}\n\n.endpoint-group__count {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-4);\n}\n\n.endpoint-group__items {\n padding-left: var(--devtools-space-md);\n}\n\n/* Endpoint item styles */\n.endpoint-item {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n width: 100%;\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background: none;\n border: none;\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-sans);\n text-align: left;\n cursor: pointer;\n transition: background-color var(--devtools-transition-fast);\n}\n\n.endpoint-item:hover {\n background-color: var(--devtools-surface-elevated);\n}\n\n.endpoint-item:focus {\n outline: none;\n}\n\n.endpoint-item:focus-visible {\n outline: 2px solid var(--devtools-primary);\n outline-offset: -2px;\n}\n\n.endpoint-item--selected {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n}\n\n.endpoint-item--selected:hover {\n background-color: color-mix(in srgb, var(--devtools-primary) 20%, transparent);\n}\n\n.endpoint-item__path {\n flex: 1;\n font-size: var(--font-size-0);\n color: var(--devtools-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.endpoint-item__indicators {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n}\n\n.endpoint-item__indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: var(--devtools-radius-sm);\n}\n\n.endpoint-item__indicator--handler {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n color: var(--devtools-info);\n}\n\n.endpoint-item__indicator--seed {\n background-color: color-mix(in srgb, var(--devtools-success) 15%, transparent);\n color: var(--devtools-success);\n}\n</style>\n","<!--\n RoutesPage.vue - Endpoint Listing Page\n\n What: Displays a list of all available API endpoints from the OpenAPI spec\n How: Fetches endpoint data via WebSocket and displays in a searchable/filterable list\n Why: Allows developers to quickly browse and inspect available mock endpoints\n-->\n\n<script setup lang=\"ts\">\nimport { ChevronDown, ChevronUp, Code, Filter, Route, Search, Sprout, X } from 'lucide-vue-next';\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue';\n\nimport EndpointDetail from '@/components/EndpointDetail.vue';\nimport EndpointList from '@/components/EndpointList.vue';\nimport { useWebSocket } from '@/composables/useWebSocket';\nimport { type HttpMethod, type RegistryData, useRegistryStore } from '@/stores/registry';\nimport { useSpecsStore } from '@/stores/specs';\n\n// Store and WebSocket\nconst registryStore = useRegistryStore();\nconst specsStore = useSpecsStore();\nconst { send, on, connected } = useWebSocket();\n\n// Local UI state\nconst showFilters = ref(false);\nconst searchInputRef = ref<HTMLInputElement | null>(null);\n\n// HTTP methods for filter (matches HttpMethod type from registry store)\nconst httpMethods: HttpMethod[] = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'options',\n 'head',\n 'trace',\n];\n\n/**\n * Fetch registry data when connected\n */\nfunction fetchRegistry(): void {\n if (connected.value) {\n registryStore.setLoading(true);\n send({ type: 'get:registry' });\n }\n}\n\n/**\n * Handle registry data from server\n */\nfunction handleRegistryData(data: RegistryData): void {\n // TODO(d6w.5): extract specId from event data when page is multi-spec aware\n registryStore.setRegistryData(specsStore.specIds[0] ?? 'default', data);\n registryStore.setLoading(false);\n}\n\n/**\n * Handle endpoint selection\n */\nfunction handleSelectEndpoint(key: string): void {\n registryStore.selectEndpoint(key);\n}\n\n/**\n * Handle group toggle\n */\nfunction handleToggleGroup(tag: string): void {\n registryStore.toggleGroup(tag);\n}\n\n/**\n * Handle search input\n */\nfunction handleSearchInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n registryStore.setSearchQuery(target.value);\n}\n\n/**\n * Clear search\n */\nfunction clearSearch(): void {\n registryStore.setSearchQuery('');\n searchInputRef.value?.focus();\n}\n\n/**\n * Toggle method filter\n */\nfunction toggleMethod(method: HttpMethod): void {\n registryStore.toggleMethodFilter(method);\n}\n\n/**\n * Check if method is active in filter\n */\nfunction isMethodActive(method: HttpMethod): boolean {\n return registryStore.filter.methods.includes(method);\n}\n\n/**\n * Toggle handler filter\n */\nfunction toggleHandlerFilter(): void {\n const current = registryStore.filter.hasHandler;\n registryStore.setHandlerFilter(current === true ? null : true);\n}\n\n/**\n * Toggle seed filter\n */\nfunction toggleSeedFilter(): void {\n const current = registryStore.filter.hasSeed;\n registryStore.setSeedFilter(current === true ? null : true);\n}\n\n/**\n * Clear all filters\n */\nfunction clearAllFilters(): void {\n registryStore.clearFilters();\n}\n\n/**\n * Toggle filter panel visibility\n */\nfunction toggleFilters(): void {\n showFilters.value = !showFilters.value;\n}\n\n/**\n * Computed: Has active filters\n */\nconst hasActiveFilters = computed(() => registryStore.hasActiveFilters());\n\n// Event cleanup functions for WebSocket subscriptions\nlet unsubRegistry: (() => void) | null = null;\nlet unsubHandlers: (() => void) | null = null;\nlet unsubSeeds: (() => void) | null = null;\n\n// Subscribe to registry events and setup cleanup\nonMounted(() => {\n // Subscribe to WebSocket events (on() returns unsubscribe function)\n unsubRegistry = on<RegistryData>('registry', handleRegistryData);\n unsubHandlers = on('handlers:updated', () => fetchRegistry());\n unsubSeeds = on('seeds:updated', () => fetchRegistry());\n\n // Fetch registry when already connected\n if (connected.value) {\n fetchRegistry();\n }\n});\n\n// Cleanup event subscriptions on unmount to prevent memory leaks\nonUnmounted(() => {\n unsubRegistry?.();\n unsubHandlers?.();\n unsubSeeds?.();\n});\n\n// Re-fetch when connection is established\nwatch(connected, (isConnected) => {\n if (isConnected) {\n fetchRegistry();\n }\n});\n</script>\n\n<template>\n <div class=\"routes-page\">\n <!-- Toolbar -->\n <div class=\"routes-toolbar\">\n <!-- Search -->\n <div class=\"routes-search\">\n <Search :size=\"16\" class=\"routes-search__icon\" />\n <input\n ref=\"searchInputRef\"\n type=\"text\"\n class=\"routes-search__input input\"\n placeholder=\"Search endpoints...\"\n :value=\"registryStore.searchQuery\"\n @input=\"handleSearchInput\"\n />\n <button\n v-if=\"registryStore.searchQuery\"\n type=\"button\"\n class=\"routes-search__clear btn btn--ghost btn--icon\"\n title=\"Clear search\"\n @click=\"clearSearch\"\n >\n <X :size=\"14\" />\n </button>\n </div>\n\n <!-- Filter toggle -->\n <button\n type=\"button\"\n :class=\"[\n 'routes-filter-toggle btn btn--secondary',\n { 'routes-filter-toggle--active': hasActiveFilters }\n ]\"\n :aria-expanded=\"showFilters\"\n @click=\"toggleFilters\"\n >\n <Filter :size=\"16\" />\n <span>Filters</span>\n <span v-if=\"hasActiveFilters\" class=\"routes-filter-toggle__badge\">\n {{ registryStore.filter.methods.length +\n (registryStore.filter.hasHandler ? 1 : 0) +\n (registryStore.filter.hasSeed ? 1 : 0) }}\n </span>\n <component :is=\"showFilters ? ChevronUp : ChevronDown\" :size=\"14\" />\n </button>\n\n <!-- Stats -->\n <div class=\"routes-stats\">\n <span class=\"routes-stats__item\">\n {{ registryStore.filteredEndpoints.length }} endpoints\n </span>\n <span class=\"routes-stats__separator\">|</span>\n <span class=\"routes-stats__item\">\n {{ registryStore.allTags.length }} tags\n </span>\n </div>\n </div>\n\n <!-- Filter panel -->\n <div v-if=\"showFilters\" class=\"routes-filters\">\n <!-- Method filters -->\n <div class=\"routes-filters__section\">\n <h4 class=\"routes-filters__title\">Methods</h4>\n <div class=\"routes-filters__methods\">\n <button\n v-for=\"method in httpMethods\"\n :key=\"method\"\n type=\"button\"\n :class=\"[\n 'method-badge',\n `method-badge--${method}`,\n { 'method-badge--inactive': !isMethodActive(method) && registryStore.filter.methods.length > 0 }\n ]\"\n @click=\"toggleMethod(method)\"\n >\n {{ method.toUpperCase() }}\n </button>\n </div>\n </div>\n\n <!-- Status filters -->\n <div class=\"routes-filters__section\">\n <h4 class=\"routes-filters__title\">Status</h4>\n <div class=\"routes-filters__status\">\n <button\n type=\"button\"\n :class=\"[\n 'routes-filters__status-btn',\n { 'routes-filters__status-btn--active': registryStore.filter.hasHandler }\n ]\"\n @click=\"toggleHandlerFilter\"\n >\n <Code :size=\"14\" />\n <span>Has Handler</span>\n </button>\n <button\n type=\"button\"\n :class=\"[\n 'routes-filters__status-btn',\n { 'routes-filters__status-btn--active': registryStore.filter.hasSeed }\n ]\"\n @click=\"toggleSeedFilter\"\n >\n <Sprout :size=\"14\" />\n <span>Has Seed</span>\n </button>\n </div>\n </div>\n\n <!-- Clear filters -->\n <div v-if=\"hasActiveFilters\" class=\"routes-filters__actions\">\n <button\n type=\"button\"\n class=\"btn btn--ghost\"\n @click=\"clearAllFilters\"\n >\n <X :size=\"14\" />\n Clear all filters\n </button>\n </div>\n </div>\n\n <!-- Main content: split panel -->\n <div class=\"routes-content\">\n <!-- Loading state -->\n <div v-if=\"registryStore.isLoading\" class=\"routes-loading\">\n <div class=\"routes-loading__spinner\" />\n <span class=\"text-muted\">Loading endpoints...</span>\n </div>\n\n <!-- Error state -->\n <div v-else-if=\"registryStore.error\" class=\"routes-error\">\n <p class=\"routes-error__message\">{{ registryStore.error }}</p>\n <button type=\"button\" class=\"btn btn--primary\" @click=\"fetchRegistry\">\n Retry\n </button>\n </div>\n\n <!-- Empty state -->\n <div v-else-if=\"registryStore.endpoints.length === 0\" class=\"routes-empty empty-state\">\n <Route :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">No endpoints found</h3>\n <p class=\"empty-state__description\">\n No API endpoints are available. Make sure your OpenAPI spec is loaded.\n </p>\n </div>\n\n <!-- No results state -->\n <div v-else-if=\"registryStore.filteredEndpoints.length === 0\" class=\"routes-empty empty-state\">\n <Search :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">No matching endpoints</h3>\n <p class=\"empty-state__description\">\n Try adjusting your search or filters.\n </p>\n <button\n v-if=\"hasActiveFilters\"\n type=\"button\"\n class=\"btn btn--secondary\"\n @click=\"clearAllFilters\"\n >\n Clear filters\n </button>\n </div>\n\n <!-- Split panel layout -->\n <template v-else>\n <!-- Endpoint list panel -->\n <div class=\"routes-list-panel\">\n <EndpointList\n :groups=\"registryStore.groupedEndpoints\"\n :selected-key=\"registryStore.selectedEndpointKey\"\n @select=\"handleSelectEndpoint\"\n @toggle-group=\"handleToggleGroup\"\n />\n </div>\n\n <!-- Endpoint detail panel -->\n <div class=\"routes-detail-panel\">\n <EndpointDetail :endpoint=\"registryStore.selectedEndpoint\" />\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n.routes-page {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n/* Toolbar */\n.routes-toolbar {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-md);\n background-color: var(--devtools-surface);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.routes-search {\n position: relative;\n flex: 1;\n max-width: 400px;\n}\n\n.routes-search__icon {\n position: absolute;\n left: var(--devtools-space-sm);\n top: 50%;\n transform: translateY(-50%);\n color: var(--devtools-text-muted);\n pointer-events: none;\n}\n\n.routes-search__input {\n padding-left: calc(var(--devtools-space-sm) + 24px);\n padding-right: calc(var(--devtools-space-sm) + 24px);\n}\n\n.routes-search__clear {\n position: absolute;\n right: var(--devtools-space-xs);\n top: 50%;\n transform: translateY(-50%);\n padding: var(--devtools-space-xs);\n}\n\n.routes-filter-toggle {\n flex-shrink: 0;\n}\n\n.routes-filter-toggle--active {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n border-color: var(--devtools-primary);\n color: var(--devtools-primary);\n}\n\n.routes-filter-toggle__badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 var(--devtools-space-xs);\n background-color: var(--devtools-primary);\n color: var(--devtools-text-inverted);\n border-radius: 9px;\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-6);\n}\n\n.routes-stats {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n margin-left: auto;\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n}\n\n.routes-stats__separator {\n opacity: 0.5;\n}\n\n/* Filter panel */\n.routes-filters {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--devtools-space-lg);\n padding: var(--devtools-space-md);\n background-color: var(--devtools-surface-elevated);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.routes-filters__section {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-sm);\n}\n\n.routes-filters__title {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-6);\n color: var(--devtools-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin: 0;\n}\n\n.routes-filters__methods {\n display: flex;\n flex-wrap: wrap;\n gap: var(--devtools-space-xs);\n}\n\n.routes-filters__methods .method-badge {\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.routes-filters__methods .method-badge--inactive {\n opacity: 0.4;\n}\n\n.routes-filters__status {\n display: flex;\n gap: var(--devtools-space-sm);\n}\n\n.routes-filters__status-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background-color: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.routes-filters__status-btn:hover {\n background-color: var(--devtools-surface-elevated);\n color: var(--devtools-text);\n}\n\n.routes-filters__status-btn--active {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n border-color: var(--devtools-primary);\n color: var(--devtools-primary);\n}\n\n.routes-filters__actions {\n display: flex;\n align-items: flex-end;\n margin-left: auto;\n}\n\n/* Main content */\n.routes-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n/* Loading state */\n.routes-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n gap: var(--devtools-space-md);\n}\n\n.routes-loading__spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--devtools-border);\n border-top-color: var(--devtools-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Error state */\n.routes-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-xl);\n}\n\n.routes-error__message {\n color: var(--devtools-error);\n margin: 0;\n}\n\n/* Empty state */\n.routes-empty {\n width: 100%;\n}\n\n/* Split panels */\n.routes-list-panel {\n width: var(--devtools-sidebar-width);\n min-width: 200px;\n max-width: 400px;\n border-right: 1px solid var(--devtools-border);\n background-color: var(--devtools-surface);\n overflow: hidden;\n}\n\n.routes-detail-panel {\n flex: 1;\n overflow: hidden;\n background-color: var(--devtools-bg);\n}\n</style>\n"],"names":["Code","createLucideIcon","FileJson","Lock","Shield","Sprout","Tag","props","__props","hasSecurity","computed","securityDisplay","sec","_openBlock","_createElementBlock","_hoisted_1","_hoisted_3","_createElementVNode","_hoisted_4","_normalizeClass","_unref","getMethodLabel","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_createVNode","_cache","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_Fragment","_renderList","tag","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_2","emit","__emit","handleEndpointClick","endpoint","handleGroupToggle","isSelected","group","$event","_createBlock","_resolveDynamicComponent","ChevronDown","ChevronRight","_vShow","registryStore","useRegistryStore","specsStore","useSpecsStore","send","on","connected","useWebSocket","showFilters","ref","searchInputRef","httpMethods","fetchRegistry","handleRegistryData","data","handleSelectEndpoint","key","handleToggleGroup","handleSearchInput","event","target","clearSearch","toggleMethod","method","isMethodActive","toggleHandlerFilter","current","toggleSeedFilter","clearAllFilters","toggleFilters","hasActiveFilters","unsubRegistry","unsubHandlers","unsubSeeds","onMounted","onUnmounted","watch","isConnected","Search","X","Filter","ChevronUp","Route","EndpointList","EndpointDetail"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.endpoint-detail[data-v-c66a0f52]{display:flex;flex-direction:column;height:100%;overflow:hidden}.endpoint-detail__empty[data-v-c66a0f52]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:var(--devtools-space-xl);text-align:center}.endpoint-detail__empty-icon[data-v-c66a0f52]{color:var(--devtools-text-muted);opacity:.5;margin-bottom:var(--devtools-space-md)}.endpoint-detail__empty-title[data-v-c66a0f52]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);margin:0 0 var(--devtools-space-sm)}.endpoint-detail__empty-text[data-v-c66a0f52]{font-size:var(--font-size-1);margin:0}.endpoint-detail__content[data-v-c66a0f52]{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:var(--devtools-space-md)}.endpoint-detail__header[data-v-c66a0f52]{display:flex;align-items:center;gap:var(--devtools-space-md);margin-bottom:var(--devtools-space-md);padding-bottom:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border)}.endpoint-detail__path[data-v-c66a0f52]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);margin:0;word-break:break-all}.method-badge--large[data-v-c66a0f52]{font-size:var(--font-size-0);padding:var(--devtools-space-sm) var(--devtools-space-md);min-width:70px}.endpoint-detail__status[data-v-c66a0f52]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-sm);margin-bottom:var(--devtools-space-md)}.endpoint-detail__status-item[data-v-c66a0f52]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5)}.endpoint-detail__status-item--handler[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.endpoint-detail__status-item--seed[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.endpoint-detail__status-item--security[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.endpoint-detail__status-item--auto[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.endpoint-detail__sections[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-md)}.endpoint-detail__section[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.endpoint-detail__section-title[data-v-c66a0f52]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.endpoint-detail__section-content[data-v-c66a0f52]{font-size:var(--font-size-1);color:var(--devtools-text);margin:0;line-height:var(--font-lineheight-3)}.endpoint-detail__description[data-v-c66a0f52]{white-space:pre-wrap}.endpoint-detail__tags[data-v-c66a0f52]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.endpoint-detail__tag[data-v-c66a0f52]{display:inline-flex;align-items:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);color:var(--devtools-text)}.endpoint-detail__security[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.endpoint-detail__security-item[data-v-c66a0f52]{display:flex;flex-direction:column;gap:2px;padding:var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm)}.endpoint-detail__security-name[data-v-c66a0f52]{font-size:var(--font-size-1);font-weight:var(--font-weight-5)}.endpoint-detail__security-scopes[data-v-c66a0f52]{font-size:var(--font-size-0)}.endpoint-list[data-v-554ffe63]{display:flex;flex-direction:column;height:100%;overflow:hidden}.endpoint-list__empty[data-v-554ffe63]{display:flex;align-items:center;justify-content:center;padding:var(--devtools-space-lg)}.endpoint-list__groups[data-v-554ffe63]{flex:1;overflow-y:auto;padding:var(--devtools-space-xs)}.endpoint-group[data-v-554ffe63]{margin-bottom:var(--devtools-space-xs)}.endpoint-group__header[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-xs);width:100%;padding:var(--devtools-space-sm) var(--devtools-space-sm);background:none;border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);color:var(--devtools-text);text-align:left;cursor:pointer;transition:background-color var(--devtools-transition-fast)}.endpoint-group__header[data-v-554ffe63]:hover{background-color:var(--devtools-surface-elevated)}.endpoint-group__header[data-v-554ffe63]:focus{outline:none}.endpoint-group__header[data-v-554ffe63]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.endpoint-group__chevron[data-v-554ffe63]{flex-shrink:0;color:var(--devtools-text-muted)}.endpoint-group__tag[data-v-554ffe63]{flex:1;text-transform:capitalize}.endpoint-group__count[data-v-554ffe63]{font-size:var(--font-size-0);font-weight:var(--font-weight-4)}.endpoint-group__items[data-v-554ffe63]{padding-left:var(--devtools-space-md)}.endpoint-item[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-sm);width:100%;padding:var(--devtools-space-xs) var(--devtools-space-sm);background:none;border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);text-align:left;cursor:pointer;transition:background-color var(--devtools-transition-fast)}.endpoint-item[data-v-554ffe63]:hover{background-color:var(--devtools-surface-elevated)}.endpoint-item[data-v-554ffe63]:focus{outline:none}.endpoint-item[data-v-554ffe63]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.endpoint-item--selected[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.endpoint-item--selected[data-v-554ffe63]:hover{background-color:color-mix(in srgb,var(--devtools-primary) 20%,transparent)}.endpoint-item__path[data-v-554ffe63]{flex:1;font-size:var(--font-size-0);color:var(--devtools-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.endpoint-item__indicators[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-xs)}.endpoint-item__indicator[data-v-554ffe63]{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:var(--devtools-radius-sm)}.endpoint-item__indicator--handler[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.endpoint-item__indicator--seed[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.routes-page[data-v-bdd419e3]{display:flex;flex-direction:column;height:100%;overflow:hidden}.routes-toolbar[data-v-bdd419e3]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.routes-search[data-v-bdd419e3]{position:relative;flex:1;max-width:400px}.routes-search__icon[data-v-bdd419e3]{position:absolute;left:var(--devtools-space-sm);top:50%;transform:translateY(-50%);color:var(--devtools-text-muted);pointer-events:none}.routes-search__input[data-v-bdd419e3]{padding-left:calc(var(--devtools-space-sm) + 24px);padding-right:calc(var(--devtools-space-sm) + 24px)}.routes-search__clear[data-v-bdd419e3]{position:absolute;right:var(--devtools-space-xs);top:50%;transform:translateY(-50%);padding:var(--devtools-space-xs)}.routes-filter-toggle[data-v-bdd419e3]{flex-shrink:0}.routes-filter-toggle--active[data-v-bdd419e3]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.routes-filter-toggle__badge[data-v-bdd419e3]{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-primary);color:var(--devtools-text-inverted);border-radius:9px;font-size:var(--font-size-0);font-weight:var(--font-weight-6)}.routes-stats[data-v-bdd419e3]{display:flex;align-items:center;gap:var(--devtools-space-sm);margin-left:auto;font-size:var(--font-size-0);color:var(--devtools-text-muted)}.routes-stats__separator[data-v-bdd419e3]{opacity:.5}.routes-filters[data-v-bdd419e3]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--devtools-space-lg);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.routes-filters__section[data-v-bdd419e3]{display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.routes-filters__title[data-v-bdd419e3]{font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.routes-filters__methods[data-v-bdd419e3]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.routes-filters__methods .method-badge[data-v-bdd419e3]{cursor:pointer;transition:all var(--devtools-transition-fast)}.routes-filters__methods .method-badge--inactive[data-v-bdd419e3]{opacity:.4}.routes-filters__status[data-v-bdd419e3]{display:flex;gap:var(--devtools-space-sm)}.routes-filters__status-btn[data-v-bdd419e3]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);color:var(--devtools-text-muted);cursor:pointer;transition:all var(--devtools-transition-fast)}.routes-filters__status-btn[data-v-bdd419e3]:hover{background-color:var(--devtools-surface-elevated);color:var(--devtools-text)}.routes-filters__status-btn--active[data-v-bdd419e3]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.routes-filters__actions[data-v-bdd419e3]{display:flex;align-items:flex-end;margin-left:auto}.routes-content[data-v-bdd419e3]{flex:1;display:flex;overflow:hidden}.routes-loading[data-v-bdd419e3]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md)}.routes-loading__spinner[data-v-bdd419e3]{width:32px;height:32px;border:3px solid var(--devtools-border);border-top-color:var(--devtools-primary);border-radius:50%;animation:spin-bdd419e3 1s linear infinite}@keyframes spin-bdd419e3{to{transform:rotate(360deg)}}.routes-error[data-v-bdd419e3]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md);padding:var(--devtools-space-xl)}.routes-error__message[data-v-bdd419e3]{color:var(--devtools-error);margin:0}.routes-empty[data-v-bdd419e3]{width:100%}.routes-list-panel[data-v-bdd419e3]{width:var(--devtools-sidebar-width);min-width:200px;max-width:400px;border-right:1px solid var(--devtools-border);background-color:var(--devtools-surface);overflow:hidden}.routes-detail-panel[data-v-bdd419e3]{flex:1;overflow:hidden;background-color:var(--devtools-bg)}
|
|
1
|
+
.endpoint-detail[data-v-c66a0f52]{display:flex;flex-direction:column;height:100%;overflow:hidden}.endpoint-detail__empty[data-v-c66a0f52]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:var(--devtools-space-xl);text-align:center}.endpoint-detail__empty-icon[data-v-c66a0f52]{color:var(--devtools-text-muted);opacity:.5;margin-bottom:var(--devtools-space-md)}.endpoint-detail__empty-title[data-v-c66a0f52]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);margin:0 0 var(--devtools-space-sm)}.endpoint-detail__empty-text[data-v-c66a0f52]{font-size:var(--font-size-1);margin:0}.endpoint-detail__content[data-v-c66a0f52]{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:var(--devtools-space-md)}.endpoint-detail__header[data-v-c66a0f52]{display:flex;align-items:center;gap:var(--devtools-space-md);margin-bottom:var(--devtools-space-md);padding-bottom:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border)}.endpoint-detail__path[data-v-c66a0f52]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);margin:0;word-break:break-all}.method-badge--large[data-v-c66a0f52]{font-size:var(--font-size-0);padding:var(--devtools-space-sm) var(--devtools-space-md);min-width:70px}.endpoint-detail__status[data-v-c66a0f52]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-sm);margin-bottom:var(--devtools-space-md)}.endpoint-detail__status-item[data-v-c66a0f52]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5)}.endpoint-detail__status-item--handler[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.endpoint-detail__status-item--seed[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.endpoint-detail__status-item--security[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.endpoint-detail__status-item--auto[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.endpoint-detail__sections[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-md)}.endpoint-detail__section[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.endpoint-detail__section-title[data-v-c66a0f52]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.endpoint-detail__section-content[data-v-c66a0f52]{font-size:var(--font-size-1);color:var(--devtools-text);margin:0;line-height:var(--font-lineheight-3)}.endpoint-detail__description[data-v-c66a0f52]{white-space:pre-wrap}.endpoint-detail__tags[data-v-c66a0f52]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.endpoint-detail__tag[data-v-c66a0f52]{display:inline-flex;align-items:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);color:var(--devtools-text)}.endpoint-detail__security[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.endpoint-detail__security-item[data-v-c66a0f52]{display:flex;flex-direction:column;gap:2px;padding:var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm)}.endpoint-detail__security-name[data-v-c66a0f52]{font-size:var(--font-size-1);font-weight:var(--font-weight-5)}.endpoint-detail__security-scopes[data-v-c66a0f52]{font-size:var(--font-size-0)}.endpoint-list[data-v-554ffe63]{display:flex;flex-direction:column;height:100%;overflow:hidden}.endpoint-list__empty[data-v-554ffe63]{display:flex;align-items:center;justify-content:center;padding:var(--devtools-space-lg)}.endpoint-list__groups[data-v-554ffe63]{flex:1;overflow-y:auto;padding:var(--devtools-space-xs)}.endpoint-group[data-v-554ffe63]{margin-bottom:var(--devtools-space-xs)}.endpoint-group__header[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-xs);width:100%;padding:var(--devtools-space-sm) var(--devtools-space-sm);background:none;border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);color:var(--devtools-text);text-align:left;cursor:pointer;transition:background-color var(--devtools-transition-fast)}.endpoint-group__header[data-v-554ffe63]:hover{background-color:var(--devtools-surface-elevated)}.endpoint-group__header[data-v-554ffe63]:focus{outline:none}.endpoint-group__header[data-v-554ffe63]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.endpoint-group__chevron[data-v-554ffe63]{flex-shrink:0;color:var(--devtools-text-muted)}.endpoint-group__tag[data-v-554ffe63]{flex:1;text-transform:capitalize}.endpoint-group__count[data-v-554ffe63]{font-size:var(--font-size-0);font-weight:var(--font-weight-4)}.endpoint-group__items[data-v-554ffe63]{padding-left:var(--devtools-space-md)}.endpoint-item[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-sm);width:100%;padding:var(--devtools-space-xs) var(--devtools-space-sm);background:none;border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);text-align:left;cursor:pointer;transition:background-color var(--devtools-transition-fast)}.endpoint-item[data-v-554ffe63]:hover{background-color:var(--devtools-surface-elevated)}.endpoint-item[data-v-554ffe63]:focus{outline:none}.endpoint-item[data-v-554ffe63]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.endpoint-item--selected[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.endpoint-item--selected[data-v-554ffe63]:hover{background-color:color-mix(in srgb,var(--devtools-primary) 20%,transparent)}.endpoint-item__path[data-v-554ffe63]{flex:1;font-size:var(--font-size-0);color:var(--devtools-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.endpoint-item__indicators[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-xs)}.endpoint-item__indicator[data-v-554ffe63]{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:var(--devtools-radius-sm)}.endpoint-item__indicator--handler[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.endpoint-item__indicator--seed[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.routes-page[data-v-c32ae519]{display:flex;flex-direction:column;height:100%;overflow:hidden}.routes-toolbar[data-v-c32ae519]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.routes-search[data-v-c32ae519]{position:relative;flex:1;max-width:400px}.routes-search__icon[data-v-c32ae519]{position:absolute;left:var(--devtools-space-sm);top:50%;transform:translateY(-50%);color:var(--devtools-text-muted);pointer-events:none}.routes-search__input[data-v-c32ae519]{padding-left:calc(var(--devtools-space-sm) + 24px);padding-right:calc(var(--devtools-space-sm) + 24px)}.routes-search__clear[data-v-c32ae519]{position:absolute;right:var(--devtools-space-xs);top:50%;transform:translateY(-50%);padding:var(--devtools-space-xs)}.routes-filter-toggle[data-v-c32ae519]{flex-shrink:0}.routes-filter-toggle--active[data-v-c32ae519]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.routes-filter-toggle__badge[data-v-c32ae519]{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-primary);color:var(--devtools-text-inverted);border-radius:9px;font-size:var(--font-size-0);font-weight:var(--font-weight-6)}.routes-stats[data-v-c32ae519]{display:flex;align-items:center;gap:var(--devtools-space-sm);margin-left:auto;font-size:var(--font-size-0);color:var(--devtools-text-muted)}.routes-stats__separator[data-v-c32ae519]{opacity:.5}.routes-filters[data-v-c32ae519]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--devtools-space-lg);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.routes-filters__section[data-v-c32ae519]{display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.routes-filters__title[data-v-c32ae519]{font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.routes-filters__methods[data-v-c32ae519]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.routes-filters__methods .method-badge[data-v-c32ae519]{cursor:pointer;transition:all var(--devtools-transition-fast)}.routes-filters__methods .method-badge--inactive[data-v-c32ae519]{opacity:.4}.routes-filters__status[data-v-c32ae519]{display:flex;gap:var(--devtools-space-sm)}.routes-filters__status-btn[data-v-c32ae519]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);color:var(--devtools-text-muted);cursor:pointer;transition:all var(--devtools-transition-fast)}.routes-filters__status-btn[data-v-c32ae519]:hover{background-color:var(--devtools-surface-elevated);color:var(--devtools-text)}.routes-filters__status-btn--active[data-v-c32ae519]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.routes-filters__actions[data-v-c32ae519]{display:flex;align-items:flex-end;margin-left:auto}.routes-content[data-v-c32ae519]{flex:1;display:flex;overflow:hidden}.routes-loading[data-v-c32ae519]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md)}.routes-loading__spinner[data-v-c32ae519]{width:32px;height:32px;border:3px solid var(--devtools-border);border-top-color:var(--devtools-primary);border-radius:50%;animation:spin-c32ae519 1s linear infinite}@keyframes spin-c32ae519{to{transform:rotate(360deg)}}.routes-error[data-v-c32ae519]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md);padding:var(--devtools-space-xl)}.routes-error__message[data-v-c32ae519]{color:var(--devtools-error);margin:0}.routes-empty[data-v-c32ae519]{width:100%}.routes-list-panel[data-v-c32ae519]{width:var(--devtools-sidebar-width);min-width:200px;max-width:400px;border-right:1px solid var(--devtools-border);background-color:var(--devtools-surface);overflow:hidden}.routes-detail-panel[data-v-c32ae519]{flex:1;overflow:hidden;background-color:var(--devtools-bg)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as se,c as v,r as y,e as oe,o as ae,D as le,E as ne,f as d,i as l,j as M,u as r,z as U,B as V,M as G,F,k as N,t as g,N as ie,n as W,l as Z,m as j,v as i}from"./vue-vendor-D62nux6V.js";import{c as re,u as Y,a as ue,Z as K,C as J,_ as de}from"./index-Ddu0x8qb.js";import{u as ce}from"./registry-CKvK0Ln5.js";import{T as Q}from"./triangle-alert-ITT7135L.js";import{T as X}from"./trash-2-B1UuFJDm.js";const me=re("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),q=[{id:"slow-network",label:"Slow Network",description:"3000ms delay (3G simulation)",type:"delay",status:200,delay:3e3},{id:"server-error",label:"Server Error",description:"Returns HTTP 500",type:"error",status:500,body:{error:"Internal Server Error",message:"Simulated server error"}},{id:"rate-limit",label:"Rate Limited",description:"Returns HTTP 429",type:"error",status:429,body:{error:"Too Many Requests",message:"Rate limit exceeded"}},{id:"not-found",label:"Not Found",description:"Returns HTTP 404",type:"error",status:404,body:{error:"Not Found",message:"Resource not found"}},{id:"request-timeout",label:"Request Timeout",description:"30000ms delay (simulates timeout)",type:"delay",status:200,delay:3e4},{id:"empty-response",label:"Empty Response",description:"Returns HTTP 200 with empty body",type:"empty",status:200,body:null},{id:"unauthorized",label:"Unauthorized",description:"Returns HTTP 401",type:"error",status:401,body:{error:"Unauthorized",message:"Authentication required"}}],pe=se("simulation",()=>{const O=Y(),s=y(new Map),f=y(new Map),b=y(!1),m=y(null),c=v(()=>{const e=Array.from(s.value.values()),n=O.activeSpecFilter;return n?e.filter(u=>u.specId===n):e}),P=v(()=>c.value.length),S=v(()=>q),k=v(()=>c.value.length>0),h=v(()=>{const e={delay:[],error:[],empty:[]};for(const n of c.value){const u=H(n);e[u].push(n)}return e}),_=v(()=>s.value.size);function H(e){const n=e.presetId?q.find(u=>u.id===e.presetId):null;return n?n.type:e.delay&&e.delay>0?"delay":e.body===null?"empty":"error"}function z(e){s.value.clear();for(const n of e)s.value.set(n.path,n);m.value=null}function L(e,n=!1){if(n){const u=s.value.get(e.path)||null;f.value.set(e.path,u)}s.value.set(e.path,e)}function E(e,n=!1){if(n){const u=s.value.get(e)||null;f.value.set(e,u)}return s.value.delete(e)}function w(){s.value.clear()}function B(e){return s.value.get(e)}function T(e){return s.value.has(e)}function $(e){return q.find(n=>n.id===e)}function D(e,n,u,te){const R=$(u);return R?{path:n,operationId:te,status:R.status,delay:R.delay,body:R.body,presetId:R.id,specId:e}:(m.value=`Preset not found: ${u}`,null)}function A(e){b.value=e}function I(e){m.value=e,b.value=!1}function x(){m.value=null}function C(e){if(!f.value.has(e))return;const n=f.value.get(e);n==null?s.value.delete(e):s.value.set(e,n),f.value.delete(e)}function t(e){console.log("[Simulation] Added:",e.path)}function a(e){E(e.path),console.log("[Simulation] Removed:",e.path)}function o(e){w(),console.log("[Simulation] Cleared all:",e.count)}function p(e){e.success?(f.value.delete(e.path),console.log("[Simulation] Set successfully:",e.path)):(C(e.path),I(`Failed to set simulation for ${e.path}`)),A(!1)}function ee(e){e.success?(f.value.delete(e.path),console.log("[Simulation] Cleared successfully:",e.path)):(C(e.path),I(`Failed to clear simulation for ${e.path}`)),A(!1)}return{simulations:s,isLoading:b,error:m,activeSimulations:c,count:P,globalCount:_,presets:S,hasActiveSimulations:k,simulationsByType:h,setSimulations:z,addSimulationLocal:L,removeSimulationLocal:E,clearSimulationsLocal:w,getSimulation:B,hasSimulation:T,getPreset:$,createSimulationFromPreset:D,setLoading:A,setError:I,clearError:x,rollbackSimulation:C,handleSimulationAdded:t,handleSimulationRemoved:a,handleSimulationsCleared:o,handleSimulationSet:p,handleSimulationCleared:ee}}),ve={class:"simulator-page"},fe={class:"simulator-form card"},he={class:"simulator-form__header"},ye={class:"simulator-form__body"},Se={key:0,class:"simulator-form__row"},_e=["value"],ge={class:"simulator-form__row"},be=["value"],ke={class:"simulator-presets"},Te=["title","onClick"],Ce={class:"simulator-preset__label"},Pe=["disabled"],Le={class:"simulator-active"},Ee={class:"simulator-active__header"},we={class:"simulator-active__title"},Ae=["disabled"],Ie={class:"simulator-active__list"},Re={class:"simulator-simulation__info"},Me={class:"simulator-simulation__path font-mono"},ze={class:"simulator-simulation__preset"},$e={key:0,class:"text-muted"},xe=["disabled","onClick"],Ue={key:0,class:"empty-state"},Fe=oe({__name:"SimulatorPage",setup(O){const s=pe(),f=Y(),b=ce(),{send:m,on:c,connected:P}=ue(),S=y(""),k=y("GET"),h=y(null),_=y(null),H=["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"];let z=[];const L=y(new Set),E=v(()=>b.endpoints.map(t=>({key:t.key,label:`${t.method.toUpperCase()} ${t.path}`,method:t.method.toUpperCase(),path:t.path,operationId:t.operationId}))),w=v(()=>{const t=S.value.trim()!=="",a=h.value!==null;return t&&a}),B=v(()=>s.activeSimulations.map(t=>{const a=t.presetId?s.getPreset(t.presetId):null;return{...t,preset:a}})),T=v(()=>s.count);function $(){if(!w.value||!h.value||!s.getPreset(h.value))return;const a=S.value.trim();if(!a.startsWith("/")){s.setError("Path must start with /");return}if(a.length>500){s.setError("Path is too long (max 500 characters)");return}if(!/^\/[\w\-/{}:.]*$/.test(a)){s.setError("Path contains invalid characters");return}const o=`${k.value.toLowerCase()}:${a}`,p=s.createSimulationFromPreset(f.specIds[0]??"default",o,h.value,void 0);p&&(s.addSimulationLocal(p,!0),s.setLoading(!0),m({type:"set:simulation",data:{path:p.path,status:p.status,delay:p.delay,body:p.body}}),S.value="",h.value=null,_.value=null)}function D(t){s.removeSimulationLocal(t,!0),s.setLoading(!0),m({type:"clear:simulation",data:{path:t}})}function A(){if(T.value!==0){for(const t of s.activeSimulations)L.value.add(t.path),s.removeSimulationLocal(t.path,!0),m({type:"clear:simulation",data:{path:t.path}});s.setLoading(!0)}}function I(){if(!_.value)return;const t=b.endpoints.find(a=>a.key===_.value);t&&(k.value=t.method.toUpperCase(),S.value=t.path)}function x(){_.value=null}function C(){P.value&&(s.setLoading(!0),m({type:"get:registry"}))}return ae(()=>{z=[c("simulation:active",t=>{s.setSimulations(t.simulations),s.setLoading(!1)}),c("simulation:added",t=>{s.handleSimulationAdded(t)}),c("simulation:removed",t=>{s.handleSimulationRemoved(t)}),c("simulations:cleared",t=>{s.handleSimulationsCleared(t)}),c("simulation:set",t=>{s.handleSimulationSet(t)}),c("simulation:cleared",t=>{L.value.has(t.path)&&L.value.delete(t.path),s.handleSimulationCleared(t)})],P.value&&C()}),le(()=>{for(const t of z)t()}),ne(P,t=>{t?C():s.setLoading(!1)}),(t,a)=>(i(),d("div",ve,[l("div",fe,[l("div",he,[M(r(K),{size:18}),a[3]||(a[3]=l("span",null,"Add Simulation",-1))]),l("div",ye,[E.value.length>0?(i(),d("div",Se,[a[5]||(a[5]=l("label",{class:"simulator-form__label"},"Select Endpoint (optional):",-1)),V(l("select",{"onUpdate:modelValue":a[0]||(a[0]=o=>_.value=o),class:"input",onChange:I},[a[4]||(a[4]=l("option",{value:null},"Manual entry...",-1)),(i(!0),d(F,null,N(E.value,o=>(i(),d("option",{key:o.key,value:o.key},g(o.label),9,_e))),128))],544),[[G,_.value]])])):U("",!0),l("div",ge,[V(l("select",{"onUpdate:modelValue":a[1]||(a[1]=o=>k.value=o),class:"simulator-form__method input",onChange:x},[(i(),d(F,null,N(H,o=>l("option",{key:o,value:o},g(o),9,be)),64))],544),[[G,k.value]]),V(l("input",{"onUpdate:modelValue":a[2]||(a[2]=o=>S.value=o),type:"text",class:"simulator-form__path input",placeholder:"/api/path",onInput:x},null,544),[[ie,S.value]])]),l("div",ke,[(i(!0),d(F,null,N(r(s).presets,o=>(i(),d("button",{key:o.id,class:W(["simulator-preset",{"simulator-preset--selected":h.value===o.id},`simulator-preset--${o.type}`]),title:o.description,onClick:p=>h.value=o.id},[(i(),Z(j(o.type==="delay"?r(J):r(Q)),{size:14})),l("span",Ce,g(o.label),1)],10,Te))),128))]),l("button",{class:"btn btn--primary",disabled:!w.value||r(s).isLoading,onClick:$},[M(r(me),{size:16}),a[6]||(a[6]=l("span",null,"Add Simulation",-1))],8,Pe)])]),l("div",Le,[l("div",Ee,[l("span",we," Active Simulations ("+g(T.value)+") ",1),T.value>0?(i(),d("button",{key:0,class:"btn btn--ghost",disabled:r(s).isLoading,onClick:A},[M(r(X),{size:14}),a[7]||(a[7]=l("span",null,"Clear All",-1))],8,Ae)):U("",!0)]),l("div",Ie,[(i(!0),d(F,null,N(B.value,o=>(i(),d("div",{key:o.path,class:"simulator-simulation card"},[l("div",Re,[l("span",Me,g(o.path),1)]),l("div",ze,[(i(),Z(j(o.preset?.type==="delay"?r(J):r(Q)),{size:14,class:W({"text-warning":o.preset?.type==="delay","text-error":o.preset?.type==="error","text-muted":o.preset?.type==="empty"})},null,8,["class"])),l("span",null,g(o.preset?.label||`HTTP ${o.status}`),1),o.delay?(i(),d("span",$e," ("+g(o.delay)+"ms) ",1)):U("",!0)]),l("button",{class:"btn btn--ghost btn--icon",title:"Remove simulation",disabled:r(s).isLoading,onClick:p=>D(o.path)},[M(r(X),{size:14})],8,xe)]))),128)),T.value===0?(i(),d("div",Ue,[M(r(K),{size:48,class:"empty-state__icon"}),a[8]||(a[8]=l("h3",{class:"empty-state__title"},"No active simulations",-1)),a[9]||(a[9]=l("p",{class:"empty-state__description"}," Add a simulation above to test error handling and slow responses. ",-1))])):U("",!0)])])]))}}),qe=de(Fe,[["__scopeId","data-v-71832998"]]);export{qe as default};
|
|
2
|
+
//# sourceMappingURL=SimulatorPage-CHGPhn5Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimulatorPage-CHGPhn5Y.js","sources":["../../../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/plus.js","../../../src/stores/simulation.ts","../../../src/pages/SimulatorPage.vue"],"sourcesContent":["/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * Simulation Store\n *\n * What: Pinia store for managing error and delay simulations\n * How: Manages simulation state and communicates with server via WebSocket\n * Why: Enables developers to test error handling and loading states\n *\n * Multi-spec: Simulations carry specId. Computed views respect\n * the activeSpecFilter from the specs store.\n *\n * @module stores/simulation\n */\n\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\nimport { useSpecsStore } from './specs';\n\n/**\n * Simulation preset type\n */\nexport type SimulationPresetType = 'delay' | 'error' | 'empty';\n\n/**\n * Simulation preset definition\n */\nexport interface SimulationPreset {\n id: string;\n label: string;\n description: string;\n type: SimulationPresetType;\n status: number;\n delay?: number;\n body?: unknown;\n}\n\n/**\n * Active simulation state\n */\nexport interface ActiveSimulation {\n path: string;\n operationId?: string;\n status: number;\n delay?: number;\n body?: unknown;\n presetId?: string;\n /** Which spec this simulation belongs to */\n specId: string;\n}\n\n/**\n * Preset definitions matching PRD FR-104 requirements\n */\nexport const SIMULATION_PRESETS: SimulationPreset[] = [\n {\n id: 'slow-network',\n label: 'Slow Network',\n description: '3000ms delay (3G simulation)',\n type: 'delay',\n status: 200,\n delay: 3000,\n },\n {\n id: 'server-error',\n label: 'Server Error',\n description: 'Returns HTTP 500',\n type: 'error',\n status: 500,\n body: { error: 'Internal Server Error', message: 'Simulated server error' },\n },\n {\n id: 'rate-limit',\n label: 'Rate Limited',\n description: 'Returns HTTP 429',\n type: 'error',\n status: 429,\n body: { error: 'Too Many Requests', message: 'Rate limit exceeded' },\n },\n {\n id: 'not-found',\n label: 'Not Found',\n description: 'Returns HTTP 404',\n type: 'error',\n status: 404,\n body: { error: 'Not Found', message: 'Resource not found' },\n },\n {\n id: 'request-timeout',\n label: 'Request Timeout',\n description: '30000ms delay (simulates timeout)',\n type: 'delay',\n status: 200,\n delay: 30000,\n },\n {\n id: 'empty-response',\n label: 'Empty Response',\n description: 'Returns HTTP 200 with empty body',\n type: 'empty',\n status: 200,\n body: null,\n },\n {\n id: 'unauthorized',\n label: 'Unauthorized',\n description: 'Returns HTTP 401',\n type: 'error',\n status: 401,\n body: { error: 'Unauthorized', message: 'Authentication required' },\n },\n];\n\n/**\n * Simulation store for managing endpoint simulations\n *\n * Provides:\n * - Active simulations storage and retrieval (per-spec)\n * - Preset definitions and lookup\n * - WebSocket command integration\n * - Simulation count and status tracking\n * - Spec-filtered views via activeSpecFilter\n */\nexport const useSimulationStore = defineStore('simulation', () => {\n const specsStore = useSpecsStore();\n\n // ==========================================================================\n // State\n // ==========================================================================\n\n /**\n * Active simulations keyed by path\n * One simulation per path (enforced by Map)\n */\n const simulations = ref<Map<string, ActiveSimulation>>(new Map());\n\n /**\n * Previous simulation state for rollback on failure\n * Keyed by path, stores the simulation before optimistic update\n */\n const previousSimulations = ref<Map<string, ActiveSimulation | null>>(new Map());\n\n /**\n * Loading state for async operations\n */\n const isLoading = ref(false);\n\n /**\n * Error state\n */\n const error = ref<string | null>(null);\n\n // ==========================================================================\n // Getters / Computed\n // ==========================================================================\n\n /**\n * All active simulations as an array, respecting activeSpecFilter\n */\n const activeSimulations = computed(() => {\n const all = Array.from(simulations.value.values());\n const specFilter = specsStore.activeSpecFilter;\n if (!specFilter) return all;\n return all.filter((s) => s.specId === specFilter);\n });\n\n /**\n * Count of active simulations (respects spec filter)\n */\n const count = computed(() => activeSimulations.value.length);\n\n /**\n * Available presets\n */\n const presets = computed(() => SIMULATION_PRESETS);\n\n /**\n * Check if any simulations are active (respects spec filter)\n */\n const hasActiveSimulations = computed(() => activeSimulations.value.length > 0);\n\n /**\n * Get simulations grouped by type (respects spec filter)\n */\n const simulationsByType = computed(() => {\n const grouped = {\n delay: [] as ActiveSimulation[],\n error: [] as ActiveSimulation[],\n empty: [] as ActiveSimulation[],\n };\n\n for (const simulation of activeSimulations.value) {\n const type = getSimulationType(simulation);\n grouped[type].push(simulation);\n }\n\n return grouped;\n });\n\n /**\n * Total count of simulations across ALL specs (ignores filter)\n */\n const globalCount = computed(() => simulations.value.size);\n\n /**\n * Determine simulation type from simulation config\n */\n function getSimulationType(simulation: ActiveSimulation): SimulationPresetType {\n const preset = simulation.presetId\n ? SIMULATION_PRESETS.find((p) => p.id === simulation.presetId)\n : null;\n\n if (preset) {\n return preset.type;\n }\n\n if (simulation.delay && simulation.delay > 0) {\n return 'delay';\n }\n\n if (simulation.body === null) {\n return 'empty';\n }\n\n return 'error';\n }\n\n // ==========================================================================\n // Actions\n // ==========================================================================\n\n /**\n * Set active simulations from server (e.g., on 'simulation:active' event)\n */\n function setSimulations(newSimulations: ActiveSimulation[]): void {\n simulations.value.clear();\n for (const simulation of newSimulations) {\n simulations.value.set(simulation.path, simulation);\n }\n error.value = null;\n }\n\n /**\n * Add a new simulation locally\n * Note: This updates local state only. Use addSimulation() to sync with server.\n * @param storeForRollback - If true, stores previous state for rollback\n */\n function addSimulationLocal(simulation: ActiveSimulation, storeForRollback = false): void {\n if (storeForRollback) {\n // Store previous state (null if didn't exist)\n const previous = simulations.value.get(simulation.path) || null;\n previousSimulations.value.set(simulation.path, previous);\n }\n simulations.value.set(simulation.path, simulation);\n }\n\n /**\n * Remove a simulation locally by path\n * Note: This updates local state only. Use removeSimulation() to sync with server.\n * @param storeForRollback - If true, stores previous state for rollback\n */\n function removeSimulationLocal(path: string, storeForRollback = false): boolean {\n if (storeForRollback) {\n // Store previous state before removing\n const previous = simulations.value.get(path) || null;\n previousSimulations.value.set(path, previous);\n }\n return simulations.value.delete(path);\n }\n\n /**\n * Clear all simulations locally\n * Note: This updates local state only. Use clearSimulations() to sync with server.\n */\n function clearSimulationsLocal(): void {\n simulations.value.clear();\n }\n\n /**\n * Get a simulation by path\n */\n function getSimulation(path: string): ActiveSimulation | undefined {\n return simulations.value.get(path);\n }\n\n /**\n * Check if a simulation exists for a path\n */\n function hasSimulation(path: string): boolean {\n return simulations.value.has(path);\n }\n\n /**\n * Get a preset by ID\n */\n function getPreset(id: string): SimulationPreset | undefined {\n return SIMULATION_PRESETS.find((p) => p.id === id);\n }\n\n /**\n * Create a simulation from a preset\n */\n function createSimulationFromPreset(\n specId: string,\n path: string,\n presetId: string,\n operationId?: string,\n ): ActiveSimulation | null {\n const preset = getPreset(presetId);\n if (!preset) {\n error.value = `Preset not found: ${presetId}`;\n return null;\n }\n\n return {\n path,\n operationId,\n status: preset.status,\n delay: preset.delay,\n body: preset.body,\n presetId: preset.id,\n specId,\n };\n }\n\n /**\n * Set loading state\n */\n function setLoading(loading: boolean): void {\n isLoading.value = loading;\n }\n\n /**\n * Set error state\n */\n function setError(errorMessage: string): void {\n error.value = errorMessage;\n isLoading.value = false;\n }\n\n /**\n * Clear error state\n */\n function clearError(): void {\n error.value = null;\n }\n\n /**\n * Rollback a simulation to its previous state\n * @param path - The path of the simulation to rollback\n */\n function rollbackSimulation(path: string): void {\n if (!previousSimulations.value.has(path)) {\n return;\n }\n\n const previous = previousSimulations.value.get(path);\n if (previous === null || previous === undefined) {\n // Was added optimistically, remove it\n simulations.value.delete(path);\n } else {\n // Restore previous state\n simulations.value.set(path, previous);\n }\n\n // Clear rollback data\n previousSimulations.value.delete(path);\n }\n\n /**\n * Handle simulation:added event from server\n */\n function handleSimulationAdded(data: { path: string }): void {\n // Server will send 'simulation:active' event with full state\n // This event is just a notification\n console.log('[Simulation] Added:', data.path);\n }\n\n /**\n * Handle simulation:removed event from server\n */\n function handleSimulationRemoved(data: { path: string }): void {\n removeSimulationLocal(data.path);\n console.log('[Simulation] Removed:', data.path);\n }\n\n /**\n * Handle simulations:cleared event from server\n */\n function handleSimulationsCleared(data: { count: number }): void {\n clearSimulationsLocal();\n console.log('[Simulation] Cleared all:', data.count);\n }\n\n /**\n * Handle simulation:set response from server\n */\n function handleSimulationSet(data: { path: string; success: boolean }): void {\n if (data.success) {\n // Clear rollback data on success\n previousSimulations.value.delete(data.path);\n console.log('[Simulation] Set successfully:', data.path);\n } else {\n // Rollback optimistic update on failure\n rollbackSimulation(data.path);\n setError(`Failed to set simulation for ${data.path}`);\n }\n setLoading(false);\n }\n\n /**\n * Handle simulation:cleared response from server\n */\n function handleSimulationCleared(data: { path: string; success: boolean }): void {\n if (data.success) {\n // Clear rollback data on success\n previousSimulations.value.delete(data.path);\n console.log('[Simulation] Cleared successfully:', data.path);\n } else {\n // Rollback optimistic removal on failure\n rollbackSimulation(data.path);\n setError(`Failed to clear simulation for ${data.path}`);\n }\n setLoading(false);\n }\n\n // ==========================================================================\n // Return\n // ==========================================================================\n\n return {\n // State\n simulations,\n isLoading,\n error,\n\n // Getters\n activeSimulations,\n count,\n globalCount,\n presets,\n hasActiveSimulations,\n simulationsByType,\n\n // Actions\n setSimulations,\n addSimulationLocal,\n removeSimulationLocal,\n clearSimulationsLocal,\n getSimulation,\n hasSimulation,\n getPreset,\n createSimulationFromPreset,\n setLoading,\n setError,\n clearError,\n rollbackSimulation,\n\n // Event handlers\n handleSimulationAdded,\n handleSimulationRemoved,\n handleSimulationsCleared,\n handleSimulationSet,\n handleSimulationCleared,\n };\n});\n","<!--\n SimulatorPage.vue - Error Simulation Controls Page\n\n What: Provides controls for simulating various API error conditions\n How: Manages simulation state via simulation store and WebSocket commands\n Why: Allows developers to test error handling without modifying backend code\n-->\n\n<script setup lang=\"ts\">\nimport { AlertTriangle, Clock, Plus, Trash2, Zap } from 'lucide-vue-next';\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useWebSocket } from '../composables/useWebSocket';\nimport { useRegistryStore } from '../stores/registry';\nimport type { ActiveSimulation } from '../stores/simulation';\nimport { useSimulationStore } from '../stores/simulation';\nimport { useSpecsStore } from '../stores/specs';\n\n// ==========================================================================\n// Types\n// ==========================================================================\n\ninterface SimulationActiveEvent {\n simulations: ActiveSimulation[];\n}\n\ninterface SimulationPathEvent {\n path: string;\n}\n\ninterface SimulationsClearedEvent {\n count: number;\n}\n\ninterface SimulationSetEvent {\n path: string;\n success: boolean;\n}\n\ninterface SimulationClearedEvent {\n path: string;\n success: boolean;\n}\n\n// ==========================================================================\n// Composables\n// ==========================================================================\n\nconst simulationStore = useSimulationStore();\nconst specsStore = useSpecsStore();\nconst registryStore = useRegistryStore();\nconst { send, on, connected } = useWebSocket();\n\n// ==========================================================================\n// State\n// ==========================================================================\n\n/** Path input for new simulation */\nconst newSimulationPath = ref('');\n\n/** Method input for new simulation */\nconst newSimulationMethod = ref('GET');\n\n/** Selected preset ID */\nconst selectedPresetId = ref<string | null>(null);\n\n/** Selected endpoint key (for dropdown selection) */\nconst selectedEndpointKey = ref<string | null>(null);\n\n/** Available HTTP methods */\nconst httpMethods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'];\n\n/** WebSocket event unsubscribe functions (populated in onMounted) */\nlet unsubscribers: Array<() => void> = [];\n\n/** Simulations pending clear (for rollback on partial failures) */\nconst pendingClears = ref<Set<string>>(new Set());\n\n// ==========================================================================\n// Computed\n// ==========================================================================\n\n/**\n * Available endpoints for selection\n */\nconst availableEndpoints = computed(() => {\n return registryStore.endpoints.map((e) => ({\n key: e.key,\n label: `${e.method.toUpperCase()} ${e.path}`,\n method: e.method.toUpperCase(),\n path: e.path,\n operationId: e.operationId,\n }));\n});\n\n/**\n * Check if we can add a new simulation\n */\nconst canAddSimulation = computed(() => {\n const hasPath = newSimulationPath.value.trim() !== '';\n const hasPreset = selectedPresetId.value !== null;\n return hasPath && hasPreset;\n});\n\n/**\n * Active simulations for display\n */\nconst activeSimulations = computed(() => {\n return simulationStore.activeSimulations.map((sim) => {\n const preset = sim.presetId ? simulationStore.getPreset(sim.presetId) : null;\n return {\n ...sim,\n preset,\n };\n });\n});\n\n/**\n * Simulation count\n */\nconst simulationCount = computed(() => simulationStore.count);\n\n// ==========================================================================\n// Methods\n// ==========================================================================\n\n/**\n * Add a new simulation\n */\nfunction addSimulation(): void {\n if (!canAddSimulation.value || !selectedPresetId.value) return;\n\n const preset = simulationStore.getPreset(selectedPresetId.value);\n if (!preset) return;\n\n // Validate path input\n const trimmedPath = newSimulationPath.value.trim();\n\n // Path must start with /\n if (!trimmedPath.startsWith('/')) {\n simulationStore.setError('Path must start with /');\n return;\n }\n\n // Path must not be too long (reasonable limit)\n if (trimmedPath.length > 500) {\n simulationStore.setError('Path is too long (max 500 characters)');\n return;\n }\n\n // Path should only contain valid URL path characters\n if (!/^\\/[\\w\\-/{}:.]*$/.test(trimmedPath)) {\n simulationStore.setError('Path contains invalid characters');\n return;\n }\n\n // Combine method and path to create endpoint key (e.g., \"get:/pets\")\n const pathWithMethod = `${newSimulationMethod.value.toLowerCase()}:${trimmedPath}`;\n // TODO(d6w.8): use proper spec selection when page is multi-spec aware\n const simulation = simulationStore.createSimulationFromPreset(\n specsStore.specIds[0] ?? 'default',\n pathWithMethod,\n selectedPresetId.value,\n undefined,\n );\n\n if (!simulation) return;\n\n // Optimistically add to local state (store previous state for rollback)\n simulationStore.addSimulationLocal(simulation, true);\n simulationStore.setLoading(true);\n\n // Send command to server\n send({\n type: 'set:simulation',\n data: {\n path: simulation.path,\n status: simulation.status,\n delay: simulation.delay,\n body: simulation.body,\n },\n });\n\n // Reset form\n newSimulationPath.value = '';\n selectedPresetId.value = null;\n selectedEndpointKey.value = null;\n}\n\n/**\n * Remove an active simulation\n */\nfunction removeSimulation(path: string): void {\n // Optimistically remove from local state (store previous state for rollback)\n simulationStore.removeSimulationLocal(path, true);\n simulationStore.setLoading(true);\n\n // Send command to server\n send({\n type: 'clear:simulation',\n data: { path },\n });\n}\n\n/**\n * Clear all simulations\n */\nfunction clearAllSimulations(): void {\n if (simulationCount.value === 0) return;\n\n // Mark each simulation as pending clear and store for rollback\n for (const simulation of simulationStore.activeSimulations) {\n pendingClears.value.add(simulation.path);\n\n // Store previous state for rollback\n simulationStore.removeSimulationLocal(simulation.path, true);\n\n // Send clear command to server\n send({\n type: 'clear:simulation',\n data: { path: simulation.path },\n });\n }\n\n simulationStore.setLoading(true);\n\n // Note: Individual simulations will be removed from local state\n // only when we receive the corresponding \"simulation:cleared\" event\n // with success: true. Failed clears will be rolled back automatically.\n}\n\n/**\n * Handle endpoint selection from dropdown\n */\nfunction handleEndpointSelect(): void {\n if (!selectedEndpointKey.value) return;\n\n const endpoint = registryStore.endpoints.find((e) => e.key === selectedEndpointKey.value);\n if (!endpoint) return;\n\n newSimulationMethod.value = endpoint.method.toUpperCase();\n newSimulationPath.value = endpoint.path;\n}\n\n/**\n * Handle manual path/method input\n */\nfunction handleManualInput(): void {\n // Clear endpoint selection when user types manually\n selectedEndpointKey.value = null;\n}\n\n// ==========================================================================\n// Data Fetching\n// ==========================================================================\n\n/**\n * Fetch current simulations from server via get:registry command\n * (server responds with simulation:active event containing current simulations)\n */\nfunction fetchSimulations(): void {\n if (connected.value) {\n simulationStore.setLoading(true);\n send({ type: 'get:registry' });\n }\n}\n\n// ==========================================================================\n// Lifecycle\n// ==========================================================================\n\nonMounted(() => {\n // Subscribe to simulation events and collect unsubscribe functions\n unsubscribers = [\n on('simulation:active', (data: SimulationActiveEvent) => {\n simulationStore.setSimulations(data.simulations);\n simulationStore.setLoading(false);\n }),\n\n on('simulation:added', (data: SimulationPathEvent) => {\n simulationStore.handleSimulationAdded(data);\n }),\n\n on('simulation:removed', (data: SimulationPathEvent) => {\n simulationStore.handleSimulationRemoved(data);\n }),\n\n on('simulations:cleared', (data: SimulationsClearedEvent) => {\n simulationStore.handleSimulationsCleared(data);\n }),\n\n on('simulation:set', (data: SimulationSetEvent) => {\n simulationStore.handleSimulationSet(data);\n }),\n\n on('simulation:cleared', (data: SimulationClearedEvent) => {\n // Remove from pending clears if it was part of clearAll\n if (pendingClears.value.has(data.path)) {\n pendingClears.value.delete(data.path);\n }\n\n // Delegate to store handler (handles success/failure and rollback)\n simulationStore.handleSimulationCleared(data);\n }),\n ];\n\n // Fetch current simulations if already connected\n if (connected.value) {\n fetchSimulations();\n }\n});\n\n// Cleanup on unmount to prevent memory leaks\nonUnmounted(() => {\n for (const unsub of unsubscribers) {\n unsub();\n }\n});\n\n// Re-fetch simulations when connection is (re)established, clear loading on disconnect\nwatch(connected, (isConnected) => {\n if (isConnected) {\n fetchSimulations();\n } else {\n simulationStore.setLoading(false);\n }\n});\n</script>\n\n<template>\n <div class=\"simulator-page\">\n <!-- Add Simulation Form -->\n <div class=\"simulator-form card\">\n <div class=\"simulator-form__header\">\n <Zap :size=\"18\" />\n <span>Add Simulation</span>\n </div>\n\n <div class=\"simulator-form__body\">\n <!-- Endpoint Selector (optional) -->\n <div v-if=\"availableEndpoints.length > 0\" class=\"simulator-form__row\">\n <label class=\"simulator-form__label\">Select Endpoint (optional):</label>\n <select\n v-model=\"selectedEndpointKey\"\n class=\"input\"\n @change=\"handleEndpointSelect\"\n >\n <option :value=\"null\">Manual entry...</option>\n <option\n v-for=\"endpoint in availableEndpoints\"\n :key=\"endpoint.key\"\n :value=\"endpoint.key\"\n >\n {{ endpoint.label }}\n </option>\n </select>\n </div>\n\n <!-- Method and Path -->\n <div class=\"simulator-form__row\">\n <select\n v-model=\"newSimulationMethod\"\n class=\"simulator-form__method input\"\n @change=\"handleManualInput\"\n >\n <option v-for=\"method in httpMethods\" :key=\"method\" :value=\"method\">\n {{ method }}\n </option>\n </select>\n <input\n v-model=\"newSimulationPath\"\n type=\"text\"\n class=\"simulator-form__path input\"\n placeholder=\"/api/path\"\n @input=\"handleManualInput\"\n />\n </div>\n\n <!-- Preset Selection -->\n <div class=\"simulator-presets\">\n <button\n v-for=\"preset in simulationStore.presets\"\n :key=\"preset.id\"\n :class=\"[\n 'simulator-preset',\n { 'simulator-preset--selected': selectedPresetId === preset.id },\n `simulator-preset--${preset.type}`,\n ]\"\n :title=\"preset.description\"\n @click=\"selectedPresetId = preset.id\"\n >\n <component\n :is=\"preset.type === 'delay' ? Clock : AlertTriangle\"\n :size=\"14\"\n />\n <span class=\"simulator-preset__label\">{{ preset.label }}</span>\n </button>\n </div>\n\n <!-- Add Button -->\n <button\n class=\"btn btn--primary\"\n :disabled=\"!canAddSimulation || simulationStore.isLoading\"\n @click=\"addSimulation\"\n >\n <Plus :size=\"16\" />\n <span>Add Simulation</span>\n </button>\n </div>\n </div>\n\n <!-- Active Simulations -->\n <div class=\"simulator-active\">\n <div class=\"simulator-active__header\">\n <span class=\"simulator-active__title\">\n Active Simulations ({{ simulationCount }})\n </span>\n <button\n v-if=\"simulationCount > 0\"\n class=\"btn btn--ghost\"\n :disabled=\"simulationStore.isLoading\"\n @click=\"clearAllSimulations\"\n >\n <Trash2 :size=\"14\" />\n <span>Clear All</span>\n </button>\n </div>\n\n <div class=\"simulator-active__list\">\n <div\n v-for=\"simulation in activeSimulations\"\n :key=\"simulation.path\"\n class=\"simulator-simulation card\"\n >\n <div class=\"simulator-simulation__info\">\n <span class=\"simulator-simulation__path font-mono\">\n {{ simulation.path }}\n </span>\n </div>\n <div class=\"simulator-simulation__preset\">\n <component\n :is=\"simulation.preset?.type === 'delay' ? Clock : AlertTriangle\"\n :size=\"14\"\n :class=\"{\n 'text-warning': simulation.preset?.type === 'delay',\n 'text-error': simulation.preset?.type === 'error',\n 'text-muted': simulation.preset?.type === 'empty',\n }\"\n />\n <span>\n {{ simulation.preset?.label || `HTTP ${simulation.status}` }}\n </span>\n <span v-if=\"simulation.delay\" class=\"text-muted\">\n ({{ simulation.delay }}ms)\n </span>\n </div>\n <button\n class=\"btn btn--ghost btn--icon\"\n title=\"Remove simulation\"\n :disabled=\"simulationStore.isLoading\"\n @click=\"removeSimulation(simulation.path)\"\n >\n <Trash2 :size=\"14\" />\n </button>\n </div>\n\n <!-- Empty State -->\n <div v-if=\"simulationCount === 0\" class=\"empty-state\">\n <Zap :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">No active simulations</h3>\n <p class=\"empty-state__description\">\n Add a simulation above to test error handling and slow responses.\n </p>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.simulator-page {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-lg);\n height: 100%;\n padding: var(--devtools-space-md);\n overflow-y: auto;\n}\n\n/* Form */\n.simulator-form {\n flex-shrink: 0;\n}\n\n.simulator-form__header {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n padding-bottom: var(--devtools-space-md);\n margin-bottom: var(--devtools-space-md);\n border-bottom: 1px solid var(--devtools-border);\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n}\n\n.simulator-form__body {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-md);\n}\n\n.simulator-form__row {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n.simulator-form__row:has(.simulator-form__method) {\n flex-direction: row;\n gap: var(--devtools-space-sm);\n}\n\n.simulator-form__label {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n}\n\n.simulator-form__method {\n width: 100px;\n flex-shrink: 0;\n}\n\n.simulator-form__path {\n flex: 1;\n}\n\n/* Presets */\n.simulator-presets {\n display: flex;\n flex-wrap: wrap;\n gap: var(--devtools-space-xs);\n}\n\n.simulator-preset {\n display: inline-flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background-color: var(--devtools-surface-elevated);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-0);\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.simulator-preset:hover {\n background-color: var(--devtools-border);\n}\n\n.simulator-preset--selected {\n border-color: var(--devtools-primary);\n background-color: color-mix(\n in srgb,\n var(--devtools-primary) 15%,\n transparent\n );\n}\n\n.simulator-preset--delay {\n color: var(--devtools-warning);\n}\n\n.simulator-preset--error {\n color: var(--devtools-error);\n}\n\n.simulator-preset--empty {\n color: var(--devtools-text-muted);\n}\n\n.simulator-preset__label {\n color: var(--devtools-text);\n}\n\n/* Active Simulations */\n.simulator-active {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.simulator-active__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--devtools-space-md);\n}\n\n.simulator-active__title {\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n}\n\n.simulator-active__list {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n/* Simulation Item */\n.simulator-simulation {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-sm) var(--devtools-space-md);\n}\n\n.simulator-simulation__info {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n flex: 1;\n}\n\n.simulator-simulation__path {\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n}\n\n.simulator-simulation__preset {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n}\n\n/* Color utilities */\n.text-warning {\n color: var(--devtools-warning);\n}\n\n.text-error {\n color: var(--devtools-error);\n}\n\n.text-muted {\n color: var(--devtools-text-muted);\n}\n</style>\n"],"names":["Plus","createLucideIcon","SIMULATION_PRESETS","useSimulationStore","defineStore","specsStore","useSpecsStore","simulations","ref","previousSimulations","isLoading","error","activeSimulations","computed","all","specFilter","s","count","presets","hasActiveSimulations","simulationsByType","grouped","simulation","type","getSimulationType","globalCount","preset","p","setSimulations","newSimulations","addSimulationLocal","storeForRollback","previous","removeSimulationLocal","path","clearSimulationsLocal","getSimulation","hasSimulation","getPreset","id","createSimulationFromPreset","specId","presetId","operationId","setLoading","loading","setError","errorMessage","clearError","rollbackSimulation","handleSimulationAdded","data","handleSimulationRemoved","handleSimulationsCleared","handleSimulationSet","handleSimulationCleared","simulationStore","registryStore","useRegistryStore","send","on","connected","useWebSocket","newSimulationPath","newSimulationMethod","selectedPresetId","selectedEndpointKey","httpMethods","unsubscribers","pendingClears","availableEndpoints","e","canAddSimulation","hasPath","hasPreset","sim","simulationCount","addSimulation","trimmedPath","pathWithMethod","removeSimulation","clearAllSimulations","handleEndpointSelect","endpoint","handleManualInput","fetchSimulations","onMounted","onUnmounted","unsub","watch","isConnected","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_createVNode","_unref","Zap","_cache","_hoisted_4","_hoisted_5","$event","_Fragment","_renderList","_toDisplayString","_hoisted_6","_hoisted_7","method","_hoisted_8","_hoisted_9","_normalizeClass","_createBlock","_resolveDynamicComponent","Clock","AlertTriangle","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","Trash2","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_23"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.simulator-page[data-v-71832998]{display:flex;flex-direction:column;gap:var(--devtools-space-lg);height:100%;padding:var(--devtools-space-md);overflow-y:auto}.simulator-form[data-v-71832998]{flex-shrink:0}.simulator-form__header[data-v-71832998]{display:flex;align-items:center;gap:var(--devtools-space-sm);padding-bottom:var(--devtools-space-md);margin-bottom:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border);font-weight:var(--font-weight-6);font-size:var(--font-size-1)}.simulator-form__body[data-v-71832998]{display:flex;flex-direction:column;gap:var(--devtools-space-md)}.simulator-form__row[data-v-71832998]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.simulator-form__row[data-v-71832998]:has(.simulator-form__method){flex-direction:row;gap:var(--devtools-space-sm)}.simulator-form__label[data-v-71832998]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text)}.simulator-form__method[data-v-71832998]{width:100px;flex-shrink:0}.simulator-form__path[data-v-71832998]{flex:1}.simulator-presets[data-v-71832998]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.simulator-preset[data-v-71832998]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);cursor:pointer;transition:all var(--devtools-transition-fast)}.simulator-preset[data-v-71832998]:hover{background-color:var(--devtools-border)}.simulator-preset--selected[data-v-71832998]{border-color:var(--devtools-primary);background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.simulator-preset--delay[data-v-71832998]{color:var(--devtools-warning)}.simulator-preset--error[data-v-71832998]{color:var(--devtools-error)}.simulator-preset--empty[data-v-71832998]{color:var(--devtools-text-muted)}.simulator-preset__label[data-v-71832998]{color:var(--devtools-text)}.simulator-active[data-v-71832998]{flex:1;display:flex;flex-direction:column;min-height:0}.simulator-active__header[data-v-71832998]{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--devtools-space-md)}.simulator-active__title[data-v-71832998]{font-weight:var(--font-weight-6);font-size:var(--font-size-1)}.simulator-active__list[data-v-71832998]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.simulator-simulation[data-v-71832998]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-sm) var(--devtools-space-md)}.simulator-simulation__info[data-v-71832998]{display:flex;align-items:center;gap:var(--devtools-space-sm);flex:1}.simulator-simulation__path[data-v-71832998]{font-size:var(--font-size-1);color:var(--devtools-text)}.simulator-simulation__preset[data-v-71832998]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.text-warning[data-v-71832998]{color:var(--devtools-warning)}.text-error[data-v-71832998]{color:var(--devtools-error)}.text-muted[data-v-71832998]{color:var(--devtools-text-muted)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.timeline-detail[data-v-b4bdd2d2]{display:flex;flex-direction:column;height:100%;overflow:hidden}.timeline-detail__empty[data-v-b4bdd2d2]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:var(--devtools-space-xl);text-align:center}.timeline-detail__empty-icon[data-v-b4bdd2d2]{color:var(--devtools-text-muted);opacity:.5;margin-bottom:var(--devtools-space-md)}.timeline-detail__empty-title[data-v-b4bdd2d2]{font-size:var(--font-size-3);font-weight:var(--font-weight-6);color:var(--devtools-text);margin:0 0 var(--devtools-space-sm) 0}.timeline-detail__empty-description[data-v-b4bdd2d2]{font-size:var(--font-size-1);color:var(--devtools-text-muted);margin:0}.timeline-detail__content[data-v-b4bdd2d2]{display:flex;flex-direction:column;height:100%;overflow-y:auto}.timeline-detail__header[data-v-b4bdd2d2]{display:flex;flex-direction:column;gap:var(--devtools-space-sm);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.timeline-detail__summary[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-sm)}.timeline-detail__path[data-v-b4bdd2d2]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);word-break:break-all}.timeline-detail__meta[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-md)}.timeline-detail__duration[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.timeline-detail__simulated[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-warning)}.timeline-detail__actions[data-v-b4bdd2d2]{display:flex;gap:var(--devtools-space-sm)}.timeline-detail__info[data-v-b4bdd2d2]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.timeline-detail__info-item[data-v-b4bdd2d2]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.timeline-detail__info-label[data-v-b4bdd2d2]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em}.timeline-detail__info-value[data-v-b4bdd2d2]{font-size:var(--font-size-1);color:var(--devtools-text)}.timeline-detail__section[data-v-b4bdd2d2]{padding:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border)}.timeline-detail__section[data-v-b4bdd2d2]:last-child{border-bottom:none}.timeline-detail__section-title[data-v-b4bdd2d2]{font-size:var(--font-size-1);font-weight:var(--font-weight-6);color:var(--devtools-text);margin:0 0 var(--devtools-space-md) 0;text-transform:uppercase;letter-spacing:.05em}.timeline-detail__subsection[data-v-b4bdd2d2]{margin-bottom:var(--devtools-space-sm)}.timeline-detail__subsection[data-v-b4bdd2d2]:last-child{margin-bottom:0}.timeline-detail__subsection-header[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);width:100%;padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm)}.timeline-detail__subsection-toggle[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);flex:1;padding:0;background:none;border:none;font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);color:var(--devtools-text);text-align:left;cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-detail__subsection-toggle[data-v-b4bdd2d2]:hover{color:var(--devtools-text-hover)}.timeline-detail__subsection-content[data-v-b4bdd2d2]{margin-top:var(--devtools-space-xs);padding:var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm)}.timeline-detail__kv-row[data-v-b4bdd2d2]{display:grid;grid-template-columns:minmax(120px,auto) 1fr;gap:var(--devtools-space-md);padding:var(--devtools-space-xs) 0;border-bottom:1px solid var(--devtools-border)}.timeline-detail__kv-row[data-v-b4bdd2d2]:last-child{border-bottom:none}.timeline-detail__kv-key[data-v-b4bdd2d2]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text-muted);word-break:break-all}.timeline-detail__kv-value[data-v-b4bdd2d2]{font-size:var(--font-size-0);color:var(--devtools-text);word-break:break-all}.timeline-detail__json[data-v-b4bdd2d2]{margin:0;padding:var(--devtools-space-sm);background-color:var(--devtools-bg);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);color:var(--devtools-text);white-space:pre-wrap;word-break:break-all;overflow-x:auto}.status-badge[data-v-b4bdd2d2]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:2px var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5);font-family:var(--devtools-font-mono)}.status-badge--pending[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.status-badge--1xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--2xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.status-badge--3xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--4xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.status-badge--5xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);color:var(--devtools-error)}.timeline-detail__pending[data-v-b4bdd2d2]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--devtools-space-sm);padding:var(--devtools-space-lg)}.timeline-detail__pending-icon[data-v-b4bdd2d2]{color:var(--devtools-text-muted);animation:pulse-b4bdd2d2 2s ease-in-out infinite}@keyframes pulse-b4bdd2d2{0%,to{opacity:1}50%{opacity:.5}}.timeline-entry[data-v-a073dbdf]{display:grid;grid-template-columns:100px 80px 1fr auto 80px auto;align-items:center;gap:var(--devtools-space-md);width:100%;padding:var(--devtools-space-sm) var(--devtools-space-md);background:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);text-align:left;cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-entry[data-v-a073dbdf]:hover{background-color:var(--devtools-surface-elevated);border-color:var(--devtools-border-hover)}.timeline-entry[data-v-a073dbdf]:focus{outline:none}.timeline-entry[data-v-a073dbdf]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.timeline-entry--selected[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-primary) 10%,transparent);border-color:var(--devtools-primary)}.timeline-entry--selected[data-v-a073dbdf]:hover{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.timeline-entry--pending[data-v-a073dbdf]{opacity:.7}.timeline-entry--simulated[data-v-a073dbdf]{border-left:3px solid var(--devtools-warning)}.timeline-entry__time[data-v-a073dbdf]{font-size:var(--font-size-0)}.timeline-entry__path[data-v-a073dbdf]{font-size:var(--font-size-1);color:var(--devtools-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-entry__status[data-v-a073dbdf]{display:flex;align-items:center}.status-badge[data-v-a073dbdf]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:2px var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5);font-family:var(--devtools-font-mono)}.status-badge--pending[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.status-badge--1xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--2xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.status-badge--3xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--4xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.status-badge--5xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);color:var(--devtools-error)}.timeline-entry__duration[data-v-a073dbdf]{font-size:var(--font-size-0);text-align:right}.timeline-entry__simulated[data-v-a073dbdf]{display:flex;align-items:center;justify-content:center;color:var(--devtools-warning)}.timeline-page[data-v-a5c73778]{display:flex;flex-direction:column;height:100%;overflow:hidden}.timeline-toolbar[data-v-a5c73778]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.timeline-search[data-v-a5c73778]{position:relative;flex:1;max-width:400px}.timeline-search__icon[data-v-a5c73778]{position:absolute;left:var(--devtools-space-sm);top:50%;transform:translateY(-50%);color:var(--devtools-text-muted);pointer-events:none}.timeline-search__input[data-v-a5c73778]{padding-left:calc(var(--devtools-space-sm) + 24px);padding-right:calc(var(--devtools-space-sm) + 24px)}.timeline-search__clear[data-v-a5c73778]{position:absolute;right:var(--devtools-space-xs);top:50%;transform:translateY(-50%);padding:var(--devtools-space-xs)}.timeline-filter-toggle[data-v-a5c73778]{flex-shrink:0}.timeline-filter-toggle--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.timeline-filter-toggle__badge[data-v-a5c73778]{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-primary);color:var(--devtools-text-inverted);border-radius:9px;font-size:var(--font-size-0);font-weight:var(--font-weight-6)}.timeline-stats[data-v-a5c73778]{display:flex;align-items:center;gap:var(--devtools-space-sm);margin-left:auto;font-size:var(--font-size-0);color:var(--devtools-text-muted)}.timeline-stats__separator[data-v-a5c73778]{opacity:.5}.timeline-filters[data-v-a5c73778]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--devtools-space-lg);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.timeline-filters__section[data-v-a5c73778]{display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.timeline-filters__title[data-v-a5c73778]{font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.timeline-filters__methods[data-v-a5c73778]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.timeline-filters__methods .method-badge[data-v-a5c73778]{cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-filters__methods .method-badge--inactive[data-v-a5c73778]{opacity:.4}.timeline-filters__status[data-v-a5c73778],.timeline-filters__type[data-v-a5c73778]{display:flex;gap:var(--devtools-space-sm)}.timeline-filters__status-btn[data-v-a5c73778]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);color:var(--devtools-text-muted);cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-filters__status-btn[data-v-a5c73778]:hover{background-color:var(--devtools-surface-elevated);color:var(--devtools-text)}.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.timeline-filters__status-btn--2xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);border-color:var(--devtools-success);color:var(--devtools-success)}.timeline-filters__status-btn--3xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);border-color:var(--devtools-info);color:var(--devtools-info)}.timeline-filters__status-btn--4xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);border-color:var(--devtools-warning);color:var(--devtools-warning)}.timeline-filters__status-btn--5xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);border-color:var(--devtools-error);color:var(--devtools-error)}.timeline-filters__status-count[data-v-a5c73778]{font-size:var(--font-size-00);opacity:.7}.timeline-filters__actions[data-v-a5c73778]{display:flex;align-items:flex-end;margin-left:auto}.timeline-content[data-v-a5c73778]{flex:1;display:flex;overflow:hidden}.timeline-loading[data-v-a5c73778]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md)}.timeline-loading__spinner[data-v-a5c73778]{width:32px;height:32px;border:3px solid var(--devtools-border);border-top-color:var(--devtools-primary);border-radius:50%;animation:spin-a5c73778 1s linear infinite}@keyframes spin-a5c73778{to{transform:rotate(360deg)}}.timeline-error[data-v-a5c73778]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md);padding:var(--devtools-space-xl)}.timeline-error__message[data-v-a5c73778]{color:var(--devtools-error);margin:0}.timeline-empty[data-v-a5c73778]{width:100%}.timeline-list-panel[data-v-a5c73778]{width:50%;min-width:300px;max-width:600px;border-right:1px solid var(--devtools-border);background-color:var(--devtools-bg);overflow:hidden;display:flex;flex-direction:column}.timeline-list[data-v-a5c73778]{flex:1;overflow-y:auto;padding:var(--devtools-space-sm);display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.timeline-detail-panel[data-v-a5c73778]{flex:1;overflow:hidden;background-color:var(--devtools-bg)}
|
|
1
|
+
.timeline-detail[data-v-b4bdd2d2]{display:flex;flex-direction:column;height:100%;overflow:hidden}.timeline-detail__empty[data-v-b4bdd2d2]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:var(--devtools-space-xl);text-align:center}.timeline-detail__empty-icon[data-v-b4bdd2d2]{color:var(--devtools-text-muted);opacity:.5;margin-bottom:var(--devtools-space-md)}.timeline-detail__empty-title[data-v-b4bdd2d2]{font-size:var(--font-size-3);font-weight:var(--font-weight-6);color:var(--devtools-text);margin:0 0 var(--devtools-space-sm) 0}.timeline-detail__empty-description[data-v-b4bdd2d2]{font-size:var(--font-size-1);color:var(--devtools-text-muted);margin:0}.timeline-detail__content[data-v-b4bdd2d2]{display:flex;flex-direction:column;height:100%;overflow-y:auto}.timeline-detail__header[data-v-b4bdd2d2]{display:flex;flex-direction:column;gap:var(--devtools-space-sm);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.timeline-detail__summary[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-sm)}.timeline-detail__path[data-v-b4bdd2d2]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);word-break:break-all}.timeline-detail__meta[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-md)}.timeline-detail__duration[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.timeline-detail__simulated[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-warning)}.timeline-detail__actions[data-v-b4bdd2d2]{display:flex;gap:var(--devtools-space-sm)}.timeline-detail__info[data-v-b4bdd2d2]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.timeline-detail__info-item[data-v-b4bdd2d2]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.timeline-detail__info-label[data-v-b4bdd2d2]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em}.timeline-detail__info-value[data-v-b4bdd2d2]{font-size:var(--font-size-1);color:var(--devtools-text)}.timeline-detail__section[data-v-b4bdd2d2]{padding:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border)}.timeline-detail__section[data-v-b4bdd2d2]:last-child{border-bottom:none}.timeline-detail__section-title[data-v-b4bdd2d2]{font-size:var(--font-size-1);font-weight:var(--font-weight-6);color:var(--devtools-text);margin:0 0 var(--devtools-space-md) 0;text-transform:uppercase;letter-spacing:.05em}.timeline-detail__subsection[data-v-b4bdd2d2]{margin-bottom:var(--devtools-space-sm)}.timeline-detail__subsection[data-v-b4bdd2d2]:last-child{margin-bottom:0}.timeline-detail__subsection-header[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);width:100%;padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm)}.timeline-detail__subsection-toggle[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);flex:1;padding:0;background:none;border:none;font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);color:var(--devtools-text);text-align:left;cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-detail__subsection-toggle[data-v-b4bdd2d2]:hover{color:var(--devtools-text-hover)}.timeline-detail__subsection-content[data-v-b4bdd2d2]{margin-top:var(--devtools-space-xs);padding:var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm)}.timeline-detail__kv-row[data-v-b4bdd2d2]{display:grid;grid-template-columns:minmax(120px,auto) 1fr;gap:var(--devtools-space-md);padding:var(--devtools-space-xs) 0;border-bottom:1px solid var(--devtools-border)}.timeline-detail__kv-row[data-v-b4bdd2d2]:last-child{border-bottom:none}.timeline-detail__kv-key[data-v-b4bdd2d2]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text-muted);word-break:break-all}.timeline-detail__kv-value[data-v-b4bdd2d2]{font-size:var(--font-size-0);color:var(--devtools-text);word-break:break-all}.timeline-detail__json[data-v-b4bdd2d2]{margin:0;padding:var(--devtools-space-sm);background-color:var(--devtools-bg);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);color:var(--devtools-text);white-space:pre-wrap;word-break:break-all;overflow-x:auto}.status-badge[data-v-b4bdd2d2]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:2px var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5);font-family:var(--devtools-font-mono)}.status-badge--pending[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.status-badge--1xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--2xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.status-badge--3xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--4xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.status-badge--5xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);color:var(--devtools-error)}.timeline-detail__pending[data-v-b4bdd2d2]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--devtools-space-sm);padding:var(--devtools-space-lg)}.timeline-detail__pending-icon[data-v-b4bdd2d2]{color:var(--devtools-text-muted);animation:pulse-b4bdd2d2 2s ease-in-out infinite}@keyframes pulse-b4bdd2d2{0%,to{opacity:1}50%{opacity:.5}}.timeline-entry[data-v-a073dbdf]{display:grid;grid-template-columns:100px 80px 1fr auto 80px auto;align-items:center;gap:var(--devtools-space-md);width:100%;padding:var(--devtools-space-sm) var(--devtools-space-md);background:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);text-align:left;cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-entry[data-v-a073dbdf]:hover{background-color:var(--devtools-surface-elevated);border-color:var(--devtools-border-hover)}.timeline-entry[data-v-a073dbdf]:focus{outline:none}.timeline-entry[data-v-a073dbdf]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.timeline-entry--selected[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-primary) 10%,transparent);border-color:var(--devtools-primary)}.timeline-entry--selected[data-v-a073dbdf]:hover{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.timeline-entry--pending[data-v-a073dbdf]{opacity:.7}.timeline-entry--simulated[data-v-a073dbdf]{border-left:3px solid var(--devtools-warning)}.timeline-entry__time[data-v-a073dbdf]{font-size:var(--font-size-0)}.timeline-entry__path[data-v-a073dbdf]{font-size:var(--font-size-1);color:var(--devtools-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-entry__status[data-v-a073dbdf]{display:flex;align-items:center}.status-badge[data-v-a073dbdf]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:2px var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5);font-family:var(--devtools-font-mono)}.status-badge--pending[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.status-badge--1xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--2xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.status-badge--3xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--4xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.status-badge--5xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);color:var(--devtools-error)}.timeline-entry__duration[data-v-a073dbdf]{font-size:var(--font-size-0);text-align:right}.timeline-entry__simulated[data-v-a073dbdf]{display:flex;align-items:center;justify-content:center;color:var(--devtools-warning)}.timeline-page[data-v-a88e616b]{display:flex;flex-direction:column;height:100%;overflow:hidden}.timeline-toolbar[data-v-a88e616b]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.timeline-search[data-v-a88e616b]{position:relative;flex:1;max-width:400px}.timeline-search__icon[data-v-a88e616b]{position:absolute;left:var(--devtools-space-sm);top:50%;transform:translateY(-50%);color:var(--devtools-text-muted);pointer-events:none}.timeline-search__input[data-v-a88e616b]{padding-left:calc(var(--devtools-space-sm) + 24px);padding-right:calc(var(--devtools-space-sm) + 24px)}.timeline-search__clear[data-v-a88e616b]{position:absolute;right:var(--devtools-space-xs);top:50%;transform:translateY(-50%);padding:var(--devtools-space-xs)}.timeline-filter-toggle[data-v-a88e616b]{flex-shrink:0}.timeline-filter-toggle--active[data-v-a88e616b]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.timeline-filter-toggle__badge[data-v-a88e616b]{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-primary);color:var(--devtools-text-inverted);border-radius:9px;font-size:var(--font-size-0);font-weight:var(--font-weight-6)}.timeline-stats[data-v-a88e616b]{display:flex;align-items:center;gap:var(--devtools-space-sm);margin-left:auto;font-size:var(--font-size-0);color:var(--devtools-text-muted)}.timeline-stats__separator[data-v-a88e616b]{opacity:.5}.timeline-filters[data-v-a88e616b]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--devtools-space-lg);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.timeline-filters__section[data-v-a88e616b]{display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.timeline-filters__title[data-v-a88e616b]{font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.timeline-filters__methods[data-v-a88e616b]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.timeline-filters__methods .method-badge[data-v-a88e616b]{cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-filters__methods .method-badge--inactive[data-v-a88e616b]{opacity:.4}.timeline-filters__status[data-v-a88e616b],.timeline-filters__type[data-v-a88e616b]{display:flex;gap:var(--devtools-space-sm)}.timeline-filters__status-btn[data-v-a88e616b]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);color:var(--devtools-text-muted);cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-filters__status-btn[data-v-a88e616b]:hover{background-color:var(--devtools-surface-elevated);color:var(--devtools-text)}.timeline-filters__status-btn--active[data-v-a88e616b]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.timeline-filters__status-btn--2xx.timeline-filters__status-btn--active[data-v-a88e616b]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);border-color:var(--devtools-success);color:var(--devtools-success)}.timeline-filters__status-btn--3xx.timeline-filters__status-btn--active[data-v-a88e616b]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);border-color:var(--devtools-info);color:var(--devtools-info)}.timeline-filters__status-btn--4xx.timeline-filters__status-btn--active[data-v-a88e616b]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);border-color:var(--devtools-warning);color:var(--devtools-warning)}.timeline-filters__status-btn--5xx.timeline-filters__status-btn--active[data-v-a88e616b]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);border-color:var(--devtools-error);color:var(--devtools-error)}.timeline-filters__status-count[data-v-a88e616b]{font-size:var(--font-size-00);opacity:.7}.timeline-filters__actions[data-v-a88e616b]{display:flex;align-items:flex-end;margin-left:auto}.timeline-content[data-v-a88e616b]{flex:1;display:flex;overflow:hidden}.timeline-loading[data-v-a88e616b]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md)}.timeline-loading__spinner[data-v-a88e616b]{width:32px;height:32px;border:3px solid var(--devtools-border);border-top-color:var(--devtools-primary);border-radius:50%;animation:spin-a88e616b 1s linear infinite}@keyframes spin-a88e616b{to{transform:rotate(360deg)}}.timeline-error[data-v-a88e616b]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md);padding:var(--devtools-space-xl)}.timeline-error__message[data-v-a88e616b]{color:var(--devtools-error);margin:0}.timeline-empty[data-v-a88e616b]{width:100%}.timeline-list-panel[data-v-a88e616b]{width:50%;min-width:300px;max-width:600px;border-right:1px solid var(--devtools-border);background-color:var(--devtools-bg);overflow:hidden;display:flex;flex-direction:column}.timeline-list[data-v-a88e616b]{flex:1;overflow-y:auto;padding:var(--devtools-space-sm);display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.timeline-detail-panel[data-v-a88e616b]{flex:1;overflow:hidden;background-color:var(--devtools-bg)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as qe,c as f,r as F,e as ce,f as r,j as q,i as e,u as i,n as O,t as m,z as C,A as M,l as B,m as w,B as W,C as G,F as A,k as j,G as ye,v as a,o as Ce,D as $e,E as Se}from"./vue-vendor-D62nux6V.js";import{g as pe,C as N,a as Z,S as _e,F as Te,b as Be}from"./format-DA0n5kox.js";import{c as ve,u as he,C as P,Z as ge,_ as me,a as Ie}from"./index-Ddu0x8qb.js";import{C as ue}from"./check-CDp1nxJT.js";import{T as Ee}from"./triangle-alert-ITT7135L.js";import{X as fe}from"./x-YOimnrsL.js";import{T as we}from"./trash-2-B1UuFJDm.js";const Fe=ve("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);const de=ve("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),ze=qe("timeline",()=>{const u=he(),t=F([]),o=F(!1),b=F(null),c=F({methods:[],statusCodes:[],searchQuery:"",simulatedOnly:null}),$=F(null),g=F(500),p=new Map;function D(s){return s<200?"1xx":s<300?"2xx":s<400?"3xx":s<500?"4xx":"5xx"}const T=f(()=>{const s=u.activeSpecFilter;return s?t.value.filter(n=>n.specId===s):t.value}),z=f(()=>{let s=T.value;if(c.value.searchQuery.trim()){const n=c.value.searchQuery.toLowerCase().trim();s=s.filter(d=>d.request.path.toLowerCase().includes(n)||d.request.operationId.toLowerCase().includes(n))}return c.value.methods.length>0&&(s=s.filter(n=>c.value.methods.includes(n.request.method.toUpperCase()))),c.value.statusCodes.length>0&&(s=s.filter(n=>{if(n.status===null)return!1;const d=D(n.status);return c.value.statusCodes.includes(d)})),c.value.simulatedOnly!==null&&(s=s.filter(n=>n.simulated===c.value.simulatedOnly)),s}),H=f(()=>$.value?t.value.find(s=>s.id===$.value)??null:null),Q=f(()=>T.value.length),R=f(()=>T.value.filter(s=>s.response!==null).length),L=f(()=>T.value.filter(s=>s.response===null).length),U=f(()=>{const s={"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0};for(const n of T.value)if(n.status!==null){const d=D(n.status);s[d]++}return s}),x=f(()=>{const s=T.value.filter(d=>d.duration!==null);if(s.length===0)return 0;const n=s.reduce((d,S)=>d+(S.duration??0),0);return Math.round(n/s.length)});function l(s,n){const d={id:s.id,request:s,response:null,status:null,duration:null,simulated:!1,specId:n},S=p.get(s.id);S&&(k(d,S),p.delete(s.id)),t.value.unshift(d),t.value.length>g.value&&(t.value=t.value.slice(0,g.value))}function v(s){const n=t.value.find(d=>d.id===s.requestId);if(n)k(n,s),p.delete(s.requestId);else if(p.set(s.requestId,s),p.size>100){const d=J(s);t.value.unshift(d),p.delete(s.requestId),t.value.length>g.value&&(t.value=t.value.slice(0,g.value))}}function k(s,n){s.response=n,s.status=n.status,s.duration=n.duration,s.simulated=n.simulated}function J(s,n="unknown"){const d={id:s.requestId,method:"UNKNOWN",path:"/unknown",operationId:"unknown",timestamp:Date.now(),headers:{},query:{},body:void 0};return{id:s.requestId,request:d,response:s,status:s.status,duration:s.duration,simulated:s.simulated,specId:n}}function ie(s){for(const[n,d]of p){const S=s.get(n);S?(k(S,d),p.delete(n)):(s.set(n,J(d)),p.delete(n))}}function le(s,n){for(const[d,S]of n){const ne=s.get(d);ne?k(ne,S):p.set(d,S)}}function ae(s){for(const[n,d]of p)s.has(n)||(s.set(n,J(d)),p.delete(n))}function K(s,n){const d=new Map,S=new Map;for(const I of s.entries)if(I.type==="request"){const E=I.data;d.set(E.id,{id:E.id,request:E,response:null,status:null,duration:null,simulated:!1,specId:n})}else if(I.type==="response"){const E=I.data;S.set(E.requestId,E)}ie(d),le(d,S),ae(d);const ne=Array.from(d.values()).sort((I,E)=>E.request.timestamp-I.request.timestamp),xe=t.value.filter(I=>I.specId!==n),ke=[...ne,...xe].sort((I,E)=>E.request.timestamp-I.request.timestamp);t.value=ke.slice(0,g.value),b.value=null}function oe(s){s?t.value=t.value.filter(n=>n.specId!==s):(t.value=[],p.clear()),$.value=null}function V(s){o.value=s}function X(s){b.value=s,o.value=!1}function Y(){b.value=null}function ee(s){c.value.searchQuery=s}function te(s){const n=c.value.methods.indexOf(s);n===-1?c.value.methods.push(s):c.value.methods.splice(n,1)}function se(s){const n=c.value.statusCodes.indexOf(s);n===-1?c.value.statusCodes.push(s):c.value.statusCodes.splice(n,1)}function y(s){c.value.simulatedOnly=s}function _(){c.value={methods:[],statusCodes:[],searchQuery:"",simulatedOnly:null}}function h(){return c.value.searchQuery.trim()!==""||c.value.methods.length>0||c.value.statusCodes.length>0||c.value.simulatedOnly!==null}function re(s){$.value=s}function be(s){const n=Math.max(1,s);g.value=n,t.value.length>n&&(t.value=t.value.slice(0,n))}return{entries:t,isLoading:o,error:b,filter:c,selectedEntryId:$,maxEntries:g,filteredEntries:z,selectedEntry:H,totalCount:Q,completedCount:R,pendingCount:L,statusCounts:U,averageDuration:x,addRequest:l,addResponse:v,setTimelineData:K,clearTimeline:oe,setLoading:V,setError:X,clearError:Y,setSearchQuery:ee,toggleMethodFilter:te,toggleStatusFilter:se,setSimulatedFilter:y,clearFilters:_,hasActiveFilters:h,selectEntry:re,setMaxEntries:be}}),Re={class:"timeline-detail"},Oe={key:0,class:"timeline-detail__empty"},De={key:1,class:"timeline-detail__content"},He={class:"timeline-detail__header"},Qe={class:"timeline-detail__summary"},Le={class:"timeline-detail__path font-mono"},Ae={class:"timeline-detail__meta"},Me={key:1,class:"status-badge status-badge--pending"},Ne={class:"timeline-detail__duration"},je={key:2,class:"timeline-detail__simulated",title:"Simulated response"},Pe={class:"timeline-detail__actions"},Ue={class:"timeline-detail__info"},Je={class:"timeline-detail__info-item"},Ve={class:"timeline-detail__info-value font-mono"},We={class:"timeline-detail__info-item"},Ge={class:"timeline-detail__info-value font-mono"},Ze={class:"timeline-detail__info-item"},Ke={class:"timeline-detail__info-value font-mono"},Xe={class:"timeline-detail__section"},Ye={key:0,class:"timeline-detail__subsection"},et=["aria-expanded"],tt={class:"text-muted"},st={id:"requestQuery-panel",class:"timeline-detail__subsection-content"},nt={class:"timeline-detail__kv-key font-mono"},it={class:"timeline-detail__kv-value font-mono"},lt={key:1,class:"timeline-detail__subsection"},at=["aria-expanded"],ot={class:"text-muted"},rt={id:"requestHeaders-panel",class:"timeline-detail__subsection-content"},ut={class:"timeline-detail__kv-key font-mono"},dt={class:"timeline-detail__kv-value font-mono"},ct={key:2,class:"timeline-detail__subsection"},mt={class:"timeline-detail__subsection-header",role:"group"},yt=["aria-expanded"],_t={id:"requestBody-panel",class:"timeline-detail__subsection-content"},ft={class:"timeline-detail__json"},pt={key:0,class:"timeline-detail__section"},vt={key:0,class:"timeline-detail__subsection"},ht=["aria-expanded"],gt={class:"text-muted"},bt={id:"responseHeaders-panel",class:"timeline-detail__subsection-content"},xt={class:"timeline-detail__kv-key font-mono"},kt={class:"timeline-detail__kv-value font-mono"},qt={key:1,class:"timeline-detail__subsection"},Ct={class:"timeline-detail__subsection-header",role:"group"},$t=["aria-expanded"],St={id:"responseBody-panel",class:"timeline-detail__subsection-content"},Tt={class:"timeline-detail__json"},Bt={key:1,class:"timeline-detail__section timeline-detail__section--pending"},It={class:"timeline-detail__pending"},Et=ce({__name:"TimelineDetail",props:{entry:{}},setup(u){const t=u,o=F({requestHeaders:!0,requestQuery:!0,requestBody:!0,responseHeaders:!0,responseBody:!0}),b=F(null),c=f(()=>t.entry?new Date(t.entry.request.timestamp).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,hour12:!1}):""),$=f(()=>t.entry?.duration==null?"pending...":t.entry.duration<1e3?`${t.entry.duration}ms`:`${(t.entry.duration/1e3).toFixed(2)}s`),g=f(()=>t.entry?.status?t.entry.status<200?"status-badge--1xx":t.entry.status<300?"status-badge--2xx":t.entry.status<400?"status-badge--3xx":t.entry.status<500?"status-badge--4xx":"status-badge--5xx":"status-badge--pending"),p=f(()=>t.entry?.request.query?Object.keys(t.entry.request.query).length>0:!1),D=f(()=>t.entry?.request.headers?Object.keys(t.entry.request.headers).length>0:!1),T=f(()=>t.entry?.request.body!==void 0&&t.entry?.request.body!==null),z=f(()=>t.entry?.response?.headers?Object.keys(t.entry.response.headers).length>0:!1),H=f(()=>t.entry?.response?.body!==void 0&&t.entry?.response?.body!==null);function Q(x){try{return JSON.stringify(x,null,2)}catch{return String(x)}}function R(x){o.value[x]=!o.value[x]}async function L(x,l){try{await navigator.clipboard.writeText(x),b.value=l,setTimeout(()=>{b.value=null},2e3)}catch(v){console.error("Failed to copy:",v)}}async function U(){if(!t.entry)return;const x={request:t.entry.request,response:t.entry.response};await L(JSON.stringify(x,null,2),"full")}return(x,l)=>(a(),r("div",Re,[u.entry?(a(),r("div",De,[e("div",He,[e("div",Qe,[e("span",{class:O(["method-badge",`method-badge--${u.entry.request.method.toLowerCase()}`])},m(i(pe)(u.entry.request.method)),3),e("span",Le,m(u.entry.request.path),1)]),e("div",Ae,[u.entry.status!==null?(a(),r("span",{key:0,class:O(["status-badge",g.value])},m(u.entry.status),3)):(a(),r("span",Me,"pending")),e("span",Ne,[q(i(P),{size:14}),M(" "+m($.value),1)]),u.entry.simulated?(a(),r("span",je,[q(i(ge),{size:14}),l[9]||(l[9]=M(" Simulated ",-1))])):C("",!0)]),e("div",Pe,[e("button",{type:"button",class:"btn btn--ghost btn--sm",title:"Copy as JSON",onClick:U},[(a(),B(w(b.value==="full"?i(ue):i(de)),{size:14})),M(" "+m(b.value==="full"?"Copied!":"Copy JSON"),1)])])]),e("div",Ue,[e("div",Je,[l[10]||(l[10]=e("span",{class:"timeline-detail__info-label"},"Timestamp",-1)),e("span",Ve,m(c.value),1)]),e("div",We,[l[11]||(l[11]=e("span",{class:"timeline-detail__info-label"},"Operation ID",-1)),e("span",Ge,m(u.entry.request.operationId),1)]),e("div",Ze,[l[12]||(l[12]=e("span",{class:"timeline-detail__info-label"},"Request ID",-1)),e("span",Ke,m(u.entry.id),1)])]),e("div",Xe,[l[16]||(l[16]=e("h3",{class:"timeline-detail__section-title"},"Request",-1)),p.value?(a(),r("div",Ye,[e("button",{type:"button",class:"timeline-detail__subsection-header","aria-expanded":o.value.requestQuery,"aria-controls":"requestQuery-panel",onClick:l[0]||(l[0]=v=>R("requestQuery"))},[(a(),B(w(o.value.requestQuery?i(N):i(Z)),{size:16})),l[13]||(l[13]=e("span",null,"Query Parameters",-1)),e("span",tt,"("+m(Object.keys(u.entry.request.query).length)+")",1)],8,et),W(e("div",st,[(a(!0),r(A,null,j(u.entry.request.query,(v,k)=>(a(),r("div",{key:k,class:"timeline-detail__kv-row"},[e("span",nt,m(k),1),e("span",it,m(Array.isArray(v)?v.join(", "):v),1)]))),128))],512),[[G,o.value.requestQuery]])])):C("",!0),D.value?(a(),r("div",lt,[e("button",{type:"button",class:"timeline-detail__subsection-header","aria-expanded":o.value.requestHeaders,"aria-controls":"requestHeaders-panel",onClick:l[1]||(l[1]=v=>R("requestHeaders"))},[(a(),B(w(o.value.requestHeaders?i(N):i(Z)),{size:16})),l[14]||(l[14]=e("span",null,"Headers",-1)),e("span",ot,"("+m(Object.keys(u.entry.request.headers).length)+")",1)],8,at),W(e("div",rt,[(a(!0),r(A,null,j(u.entry.request.headers,(v,k)=>(a(),r("div",{key:k,class:"timeline-detail__kv-row"},[e("span",ut,m(k),1),e("span",dt,m(v),1)]))),128))],512),[[G,o.value.requestHeaders]])])):C("",!0),T.value?(a(),r("div",ct,[e("div",mt,[e("button",{type:"button",class:"timeline-detail__subsection-toggle","aria-expanded":o.value.requestBody,"aria-controls":"requestBody-panel",onClick:l[2]||(l[2]=v=>R("requestBody"))},[(a(),B(w(o.value.requestBody?i(N):i(Z)),{size:16})),l[15]||(l[15]=e("span",null,"Body",-1))],8,yt),e("button",{type:"button",class:"btn btn--ghost btn--icon btn--sm",title:"Copy body",onClick:l[3]||(l[3]=ye(v=>L(Q(u.entry.request.body),"reqBody"),["stop"]))},[(a(),B(w(b.value==="reqBody"?i(ue):i(de)),{size:12}))])]),W(e("div",_t,[e("pre",ft,m(Q(u.entry.request.body)),1)],512),[[G,o.value.requestBody]])])):C("",!0)]),u.entry.response?(a(),r("div",pt,[l[19]||(l[19]=e("h3",{class:"timeline-detail__section-title"},"Response",-1)),z.value?(a(),r("div",vt,[e("button",{type:"button",class:"timeline-detail__subsection-header","aria-expanded":o.value.responseHeaders,"aria-controls":"responseHeaders-panel",onClick:l[4]||(l[4]=v=>R("responseHeaders"))},[(a(),B(w(o.value.responseHeaders?i(N):i(Z)),{size:16})),l[17]||(l[17]=e("span",null,"Headers",-1)),e("span",gt,"("+m(Object.keys(u.entry.response.headers).length)+")",1)],8,ht),W(e("div",bt,[(a(!0),r(A,null,j(u.entry.response.headers,(v,k)=>(a(),r("div",{key:k,class:"timeline-detail__kv-row"},[e("span",xt,m(k),1),e("span",kt,m(v),1)]))),128))],512),[[G,o.value.responseHeaders]])])):C("",!0),H.value?(a(),r("div",qt,[e("div",Ct,[e("button",{type:"button",class:"timeline-detail__subsection-toggle","aria-expanded":o.value.responseBody,"aria-controls":"responseBody-panel",onClick:l[5]||(l[5]=v=>R("responseBody"))},[(a(),B(w(o.value.responseBody?i(N):i(Z)),{size:16})),l[18]||(l[18]=e("span",null,"Body",-1))],8,$t),e("button",{type:"button",class:"btn btn--ghost btn--icon btn--sm",title:"Copy body",onClick:l[6]||(l[6]=ye(v=>L(Q(u.entry.response.body),"resBody"),["stop"]))},[(a(),B(w(b.value==="resBody"?i(ue):i(de)),{size:12}))])]),W(e("div",St,[e("pre",Tt,m(Q(u.entry.response.body)),1)],512),[[G,o.value.responseBody]])])):C("",!0)])):(a(),r("div",Bt,[l[21]||(l[21]=e("h3",{class:"timeline-detail__section-title"},"Response",-1)),e("div",It,[q(i(P),{size:24,class:"timeline-detail__pending-icon"}),l[20]||(l[20]=e("span",{class:"text-muted"},"Waiting for response...",-1))])]))])):(a(),r("div",Oe,[q(i(P),{size:48,class:"timeline-detail__empty-icon"}),l[7]||(l[7]=e("h3",{class:"timeline-detail__empty-title"},"Select an entry",-1)),l[8]||(l[8]=e("p",{class:"timeline-detail__empty-description"}," Click on a timeline entry to view its details. ",-1))]))]))}}),wt=me(Et,[["__scopeId","data-v-b4bdd2d2"]]),Ft={class:"timeline-entry__time font-mono text-muted"},zt={class:"timeline-entry__method"},Rt={class:"timeline-entry__path font-mono"},Ot={class:"timeline-entry__status"},Dt={key:1,class:"status-badge status-badge--pending"},Ht={class:"timeline-entry__duration font-mono text-muted"},Qt={key:0,class:"timeline-entry__simulated",title:"Simulated response"},Lt=ce({__name:"TimelineEntry",props:{entry:{},isSelected:{type:Boolean,default:!1}},emits:["select"],setup(u,{emit:t}){const o=u,b=t,c=f(()=>new Date(o.entry.request.timestamp).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3})),$=f(()=>o.entry.duration===null?"pending...":o.entry.duration<1e3?`${o.entry.duration}ms`:`${(o.entry.duration/1e3).toFixed(2)}s`),g=f(()=>o.entry.status===null?"status-badge--pending":o.entry.status<200?"status-badge--1xx":o.entry.status<300?"status-badge--2xx":o.entry.status<400?"status-badge--3xx":o.entry.status<500?"status-badge--4xx":"status-badge--5xx"),p=f(()=>o.entry.status===null?P:o.entry.status<400?Fe:Ee),D=f(()=>o.entry.response===null);function T(){b("select",o.entry.id)}return(z,H)=>(a(),r("button",{type:"button",class:O(["timeline-entry",{"timeline-entry--selected":u.isSelected},{"timeline-entry--pending":D.value},{"timeline-entry--simulated":u.entry.simulated}]),onClick:T},[e("div",Ft,m(c.value),1),e("div",zt,[e("span",{class:O(["method-badge",`method-badge--${u.entry.request.method.toLowerCase()}`])},m(i(pe)(u.entry.request.method)),3)]),e("div",Rt,m(u.entry.request.path),1),e("div",Ot,[u.entry.status!==null?(a(),r("span",{key:0,class:O(["status-badge",g.value])},[(a(),B(w(p.value),{size:12})),M(" "+m(u.entry.status),1)],2)):(a(),r("span",Dt,[q(i(P),{size:12}),H[0]||(H[0]=M(" pending ",-1))]))]),e("div",Ht,m($.value),1),u.entry.simulated?(a(),r("div",Qt,[q(i(ge),{size:14})])):C("",!0)],2))}}),At=me(Lt,[["__scopeId","data-v-a073dbdf"]]),Mt={class:"timeline-page"},Nt={class:"timeline-toolbar"},jt={class:"timeline-search"},Pt=["value"],Ut=["aria-expanded"],Jt={key:0,class:"timeline-filter-toggle__badge"},Vt={class:"timeline-stats"},Wt={class:"timeline-stats__item"},Gt={key:0,class:"timeline-stats__separator"},Zt={key:1,class:"timeline-stats__item"},Kt=["disabled"],Xt={key:0,class:"timeline-filters"},Yt={class:"timeline-filters__section"},es={class:"timeline-filters__methods"},ts=["onClick"],ss={class:"timeline-filters__section"},ns={class:"timeline-filters__status"},is=["onClick"],ls={class:"timeline-filters__status-count"},as={class:"timeline-filters__section"},os={class:"timeline-filters__type"},rs={key:0,class:"timeline-filters__actions"},us={class:"timeline-content"},ds={key:0,class:"timeline-loading"},cs={key:1,class:"timeline-error"},ms={class:"timeline-error__message"},ys={key:2,class:"timeline-empty empty-state"},_s={key:3,class:"timeline-empty empty-state"},fs={class:"timeline-list-panel"},ps={class:"timeline-list"},vs={class:"timeline-detail-panel"},hs=ce({__name:"TimelinePage",setup(u){const t=ze(),o=he(),{send:b,on:c,connected:$}=Ie(),g=F(!1),p=F(null),D=["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD","TRACE"],T=["2xx","3xx","4xx","5xx"];function z(){$.value&&(t.setLoading(!0),b({type:"get:timeline"}))}function H(y){t.setTimelineData(y,o.specIds[0]??"default"),t.setLoading(!1)}function Q(y){t.addRequest(y,o.specIds[0]??"default")}function R(y){t.addResponse(y)}function L(){t.clearTimeline()}function U(){b({type:"clear:timeline"}),t.clearTimeline()}function x(y){t.selectEntry(y)}function l(y){const _=y.target;t.setSearchQuery(_.value)}function v(){t.setSearchQuery(""),p.value?.focus()}function k(y){t.toggleMethodFilter(y)}function J(y){return t.filter.methods.includes(y)}function ie(y){t.toggleStatusFilter(y)}function le(y){return t.filter.statusCodes.includes(y)}function ae(){const y=t.filter.simulatedOnly;t.setSimulatedFilter(y===!0?null:!0)}function K(){t.clearFilters()}function oe(){g.value=!g.value}const V=f(()=>t.hasActiveFilters()),X=f(()=>t.filter.methods.length+t.filter.statusCodes.length+(t.filter.simulatedOnly!==null?1:0));let Y=null,ee=null,te=null,se=null;return Ce(()=>{Y=c("timeline",H),ee=c("request",Q),te=c("response",R),se=c("timeline:cleared",L),$.value&&z()}),$e(()=>{Y?.(),ee?.(),te?.(),se?.()}),Se($,y=>{y&&z()}),(y,_)=>(a(),r("div",Mt,[e("div",Nt,[e("div",jt,[q(i(_e),{size:16,class:"timeline-search__icon"}),e("input",{ref_key:"searchInputRef",ref:p,type:"text",class:"timeline-search__input input",placeholder:"Search by path or operation...",value:i(t).filter.searchQuery,onInput:l},null,40,Pt),i(t).filter.searchQuery?(a(),r("button",{key:0,type:"button",class:"timeline-search__clear btn btn--ghost btn--icon",title:"Clear search",onClick:v},[q(i(fe),{size:14})])):C("",!0)]),e("button",{type:"button",class:O(["timeline-filter-toggle btn btn--secondary",{"timeline-filter-toggle--active":V.value}]),"aria-expanded":g.value,onClick:oe},[q(i(Te),{size:16}),_[0]||(_[0]=e("span",null,"Filters",-1)),X.value>0?(a(),r("span",Jt,m(X.value),1)):C("",!0),(a(),B(w(g.value?i(Be):i(N)),{size:14}))],10,Ut),e("div",Vt,[e("span",Wt,m(i(t).filteredEntries.length)+" requests ",1),i(t).averageDuration>0?(a(),r("span",Gt,"|")):C("",!0),i(t).averageDuration>0?(a(),r("span",Zt," avg "+m(i(t).averageDuration)+"ms ",1)):C("",!0)]),e("button",{type:"button",class:"btn btn--secondary btn--icon",title:"Clear timeline",disabled:i(t).entries.length===0,onClick:U},[q(i(we),{size:16})],8,Kt)]),g.value?(a(),r("div",Xt,[e("div",Yt,[_[1]||(_[1]=e("h4",{class:"timeline-filters__title"},"Methods",-1)),e("div",es,[(a(),r(A,null,j(D,h=>e("button",{key:h,type:"button",class:O(["method-badge",`method-badge--${h.toLowerCase()}`,{"method-badge--inactive":!J(h)&&i(t).filter.methods.length>0}]),onClick:re=>k(h)},m(h),11,ts)),64))])]),e("div",ss,[_[2]||(_[2]=e("h4",{class:"timeline-filters__title"},"Status",-1)),e("div",ns,[(a(),r(A,null,j(T,h=>e("button",{key:h,type:"button",class:O(["timeline-filters__status-btn",`timeline-filters__status-btn--${h}`,{"timeline-filters__status-btn--active":le(h)}]),onClick:re=>ie(h)},[M(m(h)+" ",1),e("span",ls," ("+m(i(t).statusCounts[h])+") ",1)],10,is)),64))])]),e("div",as,[_[3]||(_[3]=e("h4",{class:"timeline-filters__title"},"Type",-1)),e("div",os,[e("button",{type:"button",class:O(["timeline-filters__status-btn",{"timeline-filters__status-btn--active":i(t).filter.simulatedOnly}]),onClick:ae}," Simulated only ",2)])]),V.value?(a(),r("div",rs,[e("button",{type:"button",class:"btn btn--ghost",onClick:K},[q(i(fe),{size:14}),_[4]||(_[4]=M(" Clear all filters ",-1))])])):C("",!0)])):C("",!0),e("div",us,[i(t).isLoading?(a(),r("div",ds,[..._[5]||(_[5]=[e("div",{class:"timeline-loading__spinner"},null,-1),e("span",{class:"text-muted"},"Loading timeline...",-1)])])):i(t).error?(a(),r("div",cs,[e("p",ms,m(i(t).error),1),e("button",{type:"button",class:"btn btn--primary",onClick:z}," Retry ")])):i(t).entries.length===0?(a(),r("div",ys,[q(i(P),{size:48,class:"empty-state__icon"}),_[6]||(_[6]=e("h3",{class:"empty-state__title"},"No requests yet",-1)),_[7]||(_[7]=e("p",{class:"empty-state__description"}," API requests will appear here in real-time as they are made. ",-1))])):i(t).filteredEntries.length===0?(a(),r("div",_s,[q(i(_e),{size:48,class:"empty-state__icon"}),_[8]||(_[8]=e("h3",{class:"empty-state__title"},"No matching requests",-1)),_[9]||(_[9]=e("p",{class:"empty-state__description"}," Try adjusting your search or filters. ",-1)),V.value?(a(),r("button",{key:0,type:"button",class:"btn btn--secondary",onClick:K}," Clear filters ")):C("",!0)])):(a(),r(A,{key:4},[e("div",fs,[e("div",ps,[(a(!0),r(A,null,j(i(t).filteredEntries,h=>(a(),B(At,{key:h.id,entry:h,"is-selected":i(t).selectedEntryId===h.id,onSelect:x},null,8,["entry","is-selected"]))),128))])]),e("div",vs,[q(wt,{entry:i(t).selectedEntry},null,8,["entry"])])],64))])]))}}),Ss=me(hs,[["__scopeId","data-v-a88e616b"]]);export{Ss as default};
|
|
2
|
+
//# sourceMappingURL=TimelinePage-zBBJCjLX.js.map
|