@websublime/vite-plugin-open-api-devtools 0.8.0 → 0.8.2
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-DgFhUiBH.js +750 -0
- package/dist/ModelsPage-DgFhUiBH.js.map +1 -0
- package/dist/{RoutesPage-DJQFqkO5.js → RoutesPage-DpasQCnt.js} +4 -4
- package/dist/{RoutesPage-DJQFqkO5.js.map → RoutesPage-DpasQCnt.js.map} +1 -1
- package/dist/{SimulatorPage-DAwHHeu0.js → SimulatorPage-CDTgl8ax.js} +154 -149
- package/dist/SimulatorPage-CDTgl8ax.js.map +1 -0
- package/dist/{TimelinePage-DdznQBTd.js → TimelinePage-CLlD6uZ8.js} +7 -7
- package/dist/{TimelinePage-DdznQBTd.js.map → TimelinePage-CLlD6uZ8.js.map} +1 -1
- package/dist/{check-CZ-YsL8n.js → check-D8w72KaI.js} +2 -2
- package/dist/{check-CZ-YsL8n.js.map → check-D8w72KaI.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-xvYNYz8d.js → format-Bs9S93C7.js} +2 -2
- package/dist/{format-xvYNYz8d.js.map → format-Bs9S93C7.js.map} +1 -1
- package/dist/{main-C-2gO_cM.js → main-DUNgny3E.js} +6 -6
- package/dist/{main-C-2gO_cM.js.map → main-DUNgny3E.js.map} +1 -1
- package/dist/spa/assets/ModelsPage-BslYlawu.css +1 -0
- package/dist/spa/assets/ModelsPage-Ef8Z_K5t.js +4 -0
- package/dist/spa/assets/ModelsPage-Ef8Z_K5t.js.map +1 -0
- package/dist/spa/assets/{RoutesPage-DVkEOssu.js → RoutesPage-Rs-CBlOu.js} +2 -2
- package/dist/spa/assets/{RoutesPage-DVkEOssu.js.map → RoutesPage-Rs-CBlOu.js.map} +1 -1
- package/dist/spa/assets/SimulatorPage-CNh6VflM.js +2 -0
- package/dist/spa/assets/SimulatorPage-CNh6VflM.js.map +1 -0
- package/dist/spa/assets/SimulatorPage-DGEq_rzM.css +1 -0
- package/dist/spa/assets/{TimelinePage-C_LK2wKS.js → TimelinePage-2YaDXdDB.js} +2 -2
- package/dist/spa/assets/{TimelinePage-C_LK2wKS.js.map → TimelinePage-2YaDXdDB.js.map} +1 -1
- package/dist/spa/assets/check-CLk5nWxQ.js +2 -0
- package/dist/spa/assets/{check-B_DaLrgB.js.map → check-CLk5nWxQ.js.map} +1 -1
- package/dist/spa/assets/{format-r8dlo_ab.js → format-YtVMCGJx.js} +2 -2
- package/dist/spa/assets/{format-r8dlo_ab.js.map → format-YtVMCGJx.js.map} +1 -1
- package/dist/spa/assets/index-BSvrS_tt.css +1 -0
- package/dist/spa/assets/{index-Dff2RvrN.js → index-sPgNGnaU.js} +3 -3
- package/dist/spa/assets/{index-Dff2RvrN.js.map → index-sPgNGnaU.js.map} +1 -1
- package/dist/spa/assets/{trash-2-6KJWHoOC.js → trash-2-DCsOAZPr.js} +2 -2
- package/dist/spa/assets/{trash-2-6KJWHoOC.js.map → trash-2-DCsOAZPr.js.map} +1 -1
- package/dist/spa/assets/{triangle-alert-Dx8lMHrF.js → triangle-alert-DD8Mz05K.js} +2 -2
- package/dist/spa/assets/{triangle-alert-Dx8lMHrF.js.map → triangle-alert-DD8Mz05K.js.map} +1 -1
- package/dist/spa/assets/x-5pbhNHo3.js +2 -0
- package/dist/spa/assets/{x-B6bG8oob.js.map → x-5pbhNHo3.js.map} +1 -1
- package/dist/spa/index.html +2 -2
- package/dist/{trash-2-BiCAm7lq.js → trash-2-BaiQpXqE.js} +2 -2
- package/dist/{trash-2-BiCAm7lq.js.map → trash-2-BaiQpXqE.js.map} +1 -1
- package/dist/{triangle-alert-C8PD5_Zo.js → triangle-alert-CIaC9iQP.js} +2 -2
- package/dist/{triangle-alert-C8PD5_Zo.js.map → triangle-alert-CIaC9iQP.js.map} +1 -1
- package/dist/{x-Boe7tiDp.js → x-BI73Bc0z.js} +2 -2
- package/dist/{x-Boe7tiDp.js.map → x-BI73Bc0z.js.map} +1 -1
- package/package.json +14 -14
- package/dist/ModelsPage-DEKnJYaY.js +0 -629
- package/dist/ModelsPage-DEKnJYaY.js.map +0 -1
- package/dist/SimulatorPage-DAwHHeu0.js.map +0 -1
- package/dist/spa/assets/ModelsPage-DQN_XP0u.css +0 -1
- package/dist/spa/assets/ModelsPage-Dlw4slrw.js +0 -4
- package/dist/spa/assets/ModelsPage-Dlw4slrw.js.map +0 -1
- package/dist/spa/assets/SimulatorPage-B1voZDRi.css +0 -1
- package/dist/spa/assets/SimulatorPage-C2EEtkx8.js +0 -2
- package/dist/spa/assets/SimulatorPage-C2EEtkx8.js.map +0 -1
- package/dist/spa/assets/check-B_DaLrgB.js +0 -2
- package/dist/spa/assets/index-CFIFFTBf.css +0 -1
- package/dist/spa/assets/x-B6bG8oob.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.app[data-v-0a83e2b9]{display:flex;flex-direction:column;height:100%;background-color:var(--devtools-bg)}.app-header[data-v-0a83e2b9]{display:flex;align-items:center;justify-content:space-between;height:var(--devtools-header-height);padding:0 var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border);position:sticky;top:0;z-index:100}.app-header__brand[data-v-0a83e2b9]{display:flex;align-items:center;gap:var(--devtools-space-sm)}.app-header__logo[data-v-0a83e2b9]{color:var(--devtools-primary)}.app-header__title[data-v-0a83e2b9]{font-weight:var(--font-weight-6);font-size:var(--font-size-1);color:var(--devtools-text)}.app-header__status[data-v-0a83e2b9]{display:flex;align-items:center}.app-nav[data-v-0a83e2b9]{display:flex;align-items:center;gap:var(--devtools-space-xs);height:100%}.app-nav__tab[data-v-0a83e2b9]{display:flex;align-items:center;gap:var(--devtools-space-xs);height:100%;padding:0 var(--devtools-space-md);background:none;border:none;border-bottom:2px solid transparent;color:var(--devtools-text-muted);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);font-weight:var(--font-weight-5);cursor:pointer;transition:all var(--devtools-transition-fast)}.app-nav__tab[data-v-0a83e2b9]:hover{color:var(--devtools-text);background-color:var(--devtools-surface-elevated)}.app-nav__tab[data-v-0a83e2b9]:focus{outline:none}.app-nav__tab[data-v-0a83e2b9]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px;background-color:var(--devtools-surface-elevated)}@media(forced-colors:active){.app-nav__tab[data-v-0a83e2b9]:focus-visible{outline:3px solid CanvasText;outline-offset:2px}}.app-nav__tab--active[data-v-0a83e2b9]{color:var(--devtools-primary);border-bottom-color:var(--devtools-primary)}.app-nav__tab--active[data-v-0a83e2b9]:focus-visible{outline-color:var(--devtools-primary-hover)}.app-nav__icon[data-v-0a83e2b9]{flex-shrink:0}.app-nav__label[data-v-0a83e2b9]{white-space:nowrap}.connection-status[data-v-0a83e2b9]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.connection-status__icon[data-v-0a83e2b9]{opacity:.7}.app-main[data-v-0a83e2b9]{flex:1;display:flex;flex-direction:column;overflow:hidden}.fade-enter-active,.fade-leave-active{transition:opacity var(--devtools-transition-normal)}.fade-enter-from,.fade-leave-to{opacity:0}:where(html){--font-sans:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--font-serif:ui-serif,serif;--font-mono:Dank Mono,Operator Mono,Inconsolata,Fira Mono,ui-monospace,SF Mono,Monaco,Droid Sans Mono,Source Code Pro,monospace;--font-weight-1:100;--font-weight-2:200;--font-weight-3:300;--font-weight-4:400;--font-weight-5:500;--font-weight-6:600;--font-weight-7:700;--font-weight-8:800;--font-weight-9:900;--font-lineheight-00:.95;--font-lineheight-0:1.1;--font-lineheight-1:1.25;--font-lineheight-2:1.375;--font-lineheight-3:1.5;--font-lineheight-4:1.75;--font-lineheight-5:2;--font-letterspacing-0:-.05em;--font-letterspacing-1:.025em;--font-letterspacing-2:.05em;--font-letterspacing-3:.075em;--font-letterspacing-4:.15em;--font-letterspacing-5:.5em;--font-letterspacing-6:.75em;--font-letterspacing-7:1em;--font-size-00:.5rem;--font-size-0:.75rem;--font-size-1:1rem;--font-size-2:1.1rem;--font-size-3:1.25rem;--font-size-4:1.5rem;--font-size-5:2rem;--font-size-6:2.5rem;--font-size-7:3rem;--font-size-8:3.5rem;--font-size-fluid-0:clamp(.75rem,2vw,1rem);--font-size-fluid-1:clamp(1rem,4vw,1.5rem);--font-size-fluid-2:clamp(1.5rem,6vw,2.5rem);--font-size-fluid-3:clamp(2rem,9vw,3.5rem);--size-000:-.5rem;--size-00:-.25rem;--size-1:.25rem;--size-2:.5rem;--size-3:1rem;--size-4:1.25rem;--size-5:1.5rem;--size-6:1.75rem;--size-7:2rem;--size-8:3rem;--size-9:4rem;--size-10:5rem;--size-11:7.5rem;--size-12:10rem;--size-13:15rem;--size-14:20rem;--size-15:30rem;--size-fluid-1:clamp(.5rem,1vw,1rem);--size-fluid-2:clamp(1rem,2vw,1.5rem);--size-fluid-3:clamp(1.5rem,3vw,2rem);--size-fluid-4:clamp(2rem,4vw,3rem);--size-fluid-5:clamp(4rem,5vw,5rem);--size-fluid-6:clamp(5rem,7vw,7.5rem);--size-fluid-7:clamp(7.5rem,10vw,10rem);--size-fluid-8:clamp(10rem,20vw,15rem);--size-fluid-9:clamp(15rem,30vw,20rem);--size-fluid-10:clamp(20rem,40vw,30rem);--size-content-1:20ch;--size-content-2:45ch;--size-content-3:60ch;--size-header-1:20ch;--size-header-2:25ch;--size-header-3:35ch;--size-xxs:240px;--size-xs:360px;--size-sm:480px;--size-md:768px;--size-lg:1024px;--size-xl:1440px;--size-xxl:1920px;--size-relative-000:-.5ch;--size-relative-00:-.25ch;--size-relative-1:.25ch;--size-relative-2:.5ch;--size-relative-3:1ch;--size-relative-4:1.25ch;--size-relative-5:1.5ch;--size-relative-6:1.75ch;--size-relative-7:2ch;--size-relative-8:3ch;--size-relative-9:4ch;--size-relative-10:5ch;--size-relative-11:7.5ch;--size-relative-12:10ch;--size-relative-13:15ch;--size-relative-14:20ch;--size-relative-15:30ch;--ease-1:cubic-bezier(.25,0,.5,1);--ease-2:cubic-bezier(.25,0,.4,1);--ease-3:cubic-bezier(.25,0,.3,1);--ease-4:cubic-bezier(.25,0,.2,1);--ease-5:cubic-bezier(.25,0,.1,1);--ease-in-1:cubic-bezier(.25,0,1,1);--ease-in-2:cubic-bezier(.5,0,1,1);--ease-in-3:cubic-bezier(.7,0,1,1);--ease-in-4:cubic-bezier(.9,0,1,1);--ease-in-5:cubic-bezier(1,0,1,1);--ease-out-1:cubic-bezier(0,0,.75,1);--ease-out-2:cubic-bezier(0,0,.5,1);--ease-out-3:cubic-bezier(0,0,.3,1);--ease-out-4:cubic-bezier(0,0,.1,1);--ease-out-5:cubic-bezier(0,0,0,1);--ease-in-out-1:cubic-bezier(.1,0,.9,1);--ease-in-out-2:cubic-bezier(.3,0,.7,1);--ease-in-out-3:cubic-bezier(.5,0,.5,1);--ease-in-out-4:cubic-bezier(.7,0,.3,1);--ease-in-out-5:cubic-bezier(.9,0,.1,1);--ease-elastic-out-1:cubic-bezier(.5,.75,.75,1.25);--ease-elastic-out-2:cubic-bezier(.5,1,.75,1.25);--ease-elastic-out-3:cubic-bezier(.5,1.25,.75,1.25);--ease-elastic-out-4:cubic-bezier(.5,1.5,.75,1.25);--ease-elastic-out-5:cubic-bezier(.5,1.75,.75,1.25);--ease-elastic-in-1:cubic-bezier(.5,-.25,.75,1);--ease-elastic-in-2:cubic-bezier(.5,-.5,.75,1);--ease-elastic-in-3:cubic-bezier(.5,-.75,.75,1);--ease-elastic-in-4:cubic-bezier(.5,-1,.75,1);--ease-elastic-in-5:cubic-bezier(.5,-1.25,.75,1);--ease-elastic-in-out-1:cubic-bezier(.5,-.1,.1,1.5);--ease-elastic-in-out-2:cubic-bezier(.5,-.3,.1,1.5);--ease-elastic-in-out-3:cubic-bezier(.5,-.5,.1,1.5);--ease-elastic-in-out-4:cubic-bezier(.5,-.7,.1,1.5);--ease-elastic-in-out-5:cubic-bezier(.5,-.9,.1,1.5);--ease-step-1:steps(2);--ease-step-2:steps(3);--ease-step-3:steps(4);--ease-step-4:steps(7);--ease-step-5:steps(10);--ease-elastic-1:var(--ease-elastic-out-1);--ease-elastic-2:var(--ease-elastic-out-2);--ease-elastic-3:var(--ease-elastic-out-3);--ease-elastic-4:var(--ease-elastic-out-4);--ease-elastic-5:var(--ease-elastic-out-5);--ease-squish-1:var(--ease-elastic-in-out-1);--ease-squish-2:var(--ease-elastic-in-out-2);--ease-squish-3:var(--ease-elastic-in-out-3);--ease-squish-4:var(--ease-elastic-in-out-4);--ease-squish-5:var(--ease-elastic-in-out-5);--ease-spring-1:linear(0,.006,.025 2.8%,.101 6.1%,.539 18.9%,.721 25.3%,.849 31.5%,.937 38.1%,.968 41.8%,.991 45.7%,1.006 50.1%,1.015 55%,1.017 63.9%,1.001);--ease-spring-2:linear(0,.007,.029 2.2%,.118 4.7%,.625 14.4%,.826 19%,.902,.962,1.008 26.1%,1.041 28.7%,1.064 32.1%,1.07 36%,1.061 40.5%,1.015 53.4%,.999 61.6%,.995 71.2%,1);--ease-spring-3:linear(0,.009,.035 2.1%,.141 4.4%,.723 12.9%,.938 16.7%,1.017,1.077,1.121,1.149 24.3%,1.159,1.163,1.161,1.154 29.9%,1.129 32.8%,1.051 39.6%,1.017 43.1%,.991,.977 51%,.974 53.8%,.975 57.1%,.997 69.8%,1.003 76.9%,1);--ease-spring-4:linear(0,.009,.037 1.7%,.153 3.6%,.776 10.3%,1.001,1.142 16%,1.185,1.209 19%,1.215 19.9% 20.8%,1.199,1.165 25%,1.056 30.3%,1.008 33%,.973,.955 39.2%,.953 41.1%,.957 43.3%,.998 53.3%,1.009 59.1% 63.7%,.998 78.9%,1);--ease-spring-5:linear(0,.01,.04 1.6%,.161 3.3%,.816 9.4%,1.046,1.189 14.4%,1.231,1.254 17%,1.259,1.257 18.6%,1.236,1.194 22.3%,1.057 27%,.999 29.4%,.955 32.1%,.942,.935 34.9%,.933,.939 38.4%,1 47.3%,1.011,1.017 52.6%,1.016 56.4%,1 65.2%,.996 70.2%,1.001 87.2%,1);--ease-bounce-1:linear(0,.004,.016,.035,.063,.098,.141,.191,.25,.316,.391 36.8%,.563,.766,1 58.8%,.946,.908 69.1%,.895,.885,.879,.878,.879,.885,.895,.908 89.7%,.946,1);--ease-bounce-2:linear(0,.004,.016,.035,.063,.098,.141 15.1%,.25,.391,.562,.765,1,.892 45.2%,.849,.815,.788,.769,.757,.753,.757,.769,.788,.815,.85,.892 75.2%,1 80.2%,.973,.954,.943,.939,.943,.954,.973,1);--ease-bounce-3:linear(0,.004,.016,.035,.062,.098,.141 11.4%,.25,.39,.562,.764,1 30.3%,.847 34.8%,.787,.737,.699,.672,.655,.65,.656,.672,.699,.738,.787,.847 61.7%,1 66.2%,.946,.908,.885 74.2%,.879,.878,.879,.885 79.5%,.908,.946,1 87.4%,.981,.968,.96,.957,.96,.968,.981,1);--ease-bounce-4:linear(0,.004,.016 3%,.062,.141,.25,.391,.562 18.2%,1 24.3%,.81,.676 32.3%,.629,.595,.575,.568,.575,.595,.629,.676 48.2%,.811,1 56.2%,.918,.86,.825,.814,.825,.86,.918,1 77.2%,.94 80.6%,.925,.92,.925,.94 87.5%,1 90.9%,.974,.965,.974,1);--ease-bounce-5:linear(0,.004,.016 2.5%,.063,.141,.25 10.1%,.562,1 20.2%,.783,.627,.534 30.9%,.511,.503,.511,.534 38%,.627,.782,1 48.7%,.892,.815,.769 56.3%,.757,.753,.757,.769 61.3%,.815,.892,1 68.8%,.908 72.4%,.885,.878,.885,.908 79.4%,1 83%,.954 85.5%,.943,.939,.943,.954 90.5%,1 93%,.977,.97,.977,1);--layer-1:1;--layer-2:2;--layer-3:3;--layer-4:4;--layer-5:5;--layer-important:2147483647;--shadow-color:220 3% 15%;--shadow-strength:1%;--inner-shadow-highlight:inset 0 -.5px 0 0 #fff,inset 0 .5px 0 0 rgba(0,0,0,.067);--shadow-1:0 1px 2px -1px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%));--shadow-2:0 3px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 7px 14px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%));--shadow-3:0 -1px 3px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 1px 2px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 2px 5px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 4px 12px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 12px 15px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--shadow-4:0 -2px 5px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 1px 1px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 2px 2px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 5px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 9px 9px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 16px 16px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 6%));--shadow-5:0 -1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 2px 1px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 5px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 10px 10px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 20px 20px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 40px 40px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--shadow-6:0 -1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 3px 2px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 7px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 12px 10px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 22px 18px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 41px 33px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 6%)),0 100px 80px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--inner-shadow-0:inset 0 0 0 1px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%));--inner-shadow-1:inset 0 1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-2:inset 0 1px 4px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-3:inset 0 2px 8px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-4:inset 0 2px 14px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--ratio-square:1;--ratio-landscape:4/3;--ratio-portrait:3/4;--ratio-widescreen:16/9;--ratio-ultrawide:18/5;--ratio-golden:1.618/1;--gray-0:#f8f9fa;--gray-1:#f1f3f5;--gray-2:#e9ecef;--gray-3:#dee2e6;--gray-4:#ced4da;--gray-5:#adb5bd;--gray-6:#868e96;--gray-7:#495057;--gray-8:#343a40;--gray-9:#212529;--gray-10:#16191d;--gray-11:#0d0f12;--gray-12:#030507;--stone-0:#f8fafb;--stone-1:#f2f4f6;--stone-2:#ebedef;--stone-3:#e0e4e5;--stone-4:#d1d6d8;--stone-5:#b1b6b9;--stone-6:#979b9d;--stone-7:#7e8282;--stone-8:#666968;--stone-9:#50514f;--stone-10:#3a3a37;--stone-11:#252521;--stone-12:#121210;--red-0:#fff5f5;--red-1:#ffe3e3;--red-2:#ffc9c9;--red-3:#ffa8a8;--red-4:#ff8787;--red-5:#ff6b6b;--red-6:#fa5252;--red-7:#f03e3e;--red-8:#e03131;--red-9:#c92a2a;--red-10:#b02525;--red-11:#962020;--red-12:#7d1a1a;--pink-0:#fff0f6;--pink-1:#ffdeeb;--pink-2:#fcc2d7;--pink-3:#faa2c1;--pink-4:#f783ac;--pink-5:#f06595;--pink-6:#e64980;--pink-7:#d6336c;--pink-8:#c2255c;--pink-9:#a61e4d;--pink-10:#8c1941;--pink-11:#731536;--pink-12:#59102a;--purple-0:#f8f0fc;--purple-1:#f3d9fa;--purple-2:#eebefa;--purple-3:#e599f7;--purple-4:#da77f2;--purple-5:#cc5de8;--purple-6:#be4bdb;--purple-7:#ae3ec9;--purple-8:#9c36b5;--purple-9:#862e9c;--purple-10:#702682;--purple-11:#5a1e69;--purple-12:#44174f;--violet-0:#f3f0ff;--violet-1:#e5dbff;--violet-2:#d0bfff;--violet-3:#b197fc;--violet-4:#9775fa;--violet-5:#845ef7;--violet-6:#7950f2;--violet-7:#7048e8;--violet-8:#6741d9;--violet-9:#5f3dc4;--violet-10:#5235ab;--violet-11:#462d91;--violet-12:#3a2578;--indigo-0:#edf2ff;--indigo-1:#dbe4ff;--indigo-2:#bac8ff;--indigo-3:#91a7ff;--indigo-4:#748ffc;--indigo-5:#5c7cfa;--indigo-6:#4c6ef5;--indigo-7:#4263eb;--indigo-8:#3b5bdb;--indigo-9:#364fc7;--indigo-10:#2f44ad;--indigo-11:#283a94;--indigo-12:#21307a;--blue-0:#e7f5ff;--blue-1:#d0ebff;--blue-2:#a5d8ff;--blue-3:#74c0fc;--blue-4:#4dabf7;--blue-5:#339af0;--blue-6:#228be6;--blue-7:#1c7ed6;--blue-8:#1971c2;--blue-9:#1864ab;--blue-10:#145591;--blue-11:#114678;--blue-12:#0d375e;--cyan-0:#e3fafc;--cyan-1:#c5f6fa;--cyan-2:#99e9f2;--cyan-3:#66d9e8;--cyan-4:#3bc9db;--cyan-5:#22b8cf;--cyan-6:#15aabf;--cyan-7:#1098ad;--cyan-8:#0c8599;--cyan-9:#0b7285;--cyan-10:#095c6b;--cyan-11:#074652;--cyan-12:#053038;--teal-0:#e6fcf5;--teal-1:#c3fae8;--teal-2:#96f2d7;--teal-3:#63e6be;--teal-4:#38d9a9;--teal-5:#20c997;--teal-6:#12b886;--teal-7:#0ca678;--teal-8:#099268;--teal-9:#087f5b;--teal-10:#066649;--teal-11:#054d37;--teal-12:#033325;--green-0:#ebfbee;--green-1:#d3f9d8;--green-2:#b2f2bb;--green-3:#8ce99a;--green-4:#69db7c;--green-5:#51cf66;--green-6:#40c057;--green-7:#37b24d;--green-8:#2f9e44;--green-9:#2b8a3e;--green-10:#237032;--green-11:#1b5727;--green-12:#133d1b;--lime-0:#f4fce3;--lime-1:#e9fac8;--lime-2:#d8f5a2;--lime-3:#c0eb75;--lime-4:#a9e34b;--lime-5:#94d82d;--lime-6:#82c91e;--lime-7:#74b816;--lime-8:#66a80f;--lime-9:#5c940d;--lime-10:#4c7a0b;--lime-11:#3c6109;--lime-12:#2c4706;--yellow-0:#fff9db;--yellow-1:#fff3bf;--yellow-2:#ffec99;--yellow-3:#ffe066;--yellow-4:#ffd43b;--yellow-5:#fcc419;--yellow-6:#fab005;--yellow-7:#f59f00;--yellow-8:#f08c00;--yellow-9:#e67700;--yellow-10:#b35c00;--yellow-11:#804200;--yellow-12:#663500;--orange-0:#fff4e6;--orange-1:#ffe8cc;--orange-2:#ffd8a8;--orange-3:#ffc078;--orange-4:#ffa94d;--orange-5:#ff922b;--orange-6:#fd7e14;--orange-7:#f76707;--orange-8:#e8590c;--orange-9:#d9480f;--orange-10:#bf400d;--orange-11:#99330b;--orange-12:#802b09;--choco-0:#fff8dc;--choco-1:#fce1bc;--choco-2:#f7ca9e;--choco-3:#f1b280;--choco-4:#e99b62;--choco-5:#df8545;--choco-6:#d46e25;--choco-7:#bd5f1b;--choco-8:#a45117;--choco-9:#8a4513;--choco-10:#703a13;--choco-11:#572f12;--choco-12:#3d210d;--brown-0:#faf4eb;--brown-1:#ede0d1;--brown-2:#e0cab7;--brown-3:#d3b79e;--brown-4:#c5a285;--brown-5:#b78f6d;--brown-6:#a87c56;--brown-7:#956b47;--brown-8:#825b3a;--brown-9:#6f4b2d;--brown-10:#5e3a21;--brown-11:#4e2b15;--brown-12:#422412;--sand-0:#f8fafb;--sand-1:#e6e4dc;--sand-2:#d5cfbd;--sand-3:#c2b9a0;--sand-4:#aea58c;--sand-5:#9a9178;--sand-6:#867c65;--sand-7:#736a53;--sand-8:#5f5746;--sand-9:#4b4639;--sand-10:#38352d;--sand-11:#252521;--sand-12:#121210;--camo-0:#f9fbe7;--camo-1:#e8ed9c;--camo-2:#d2df4e;--camo-3:#c2ce34;--camo-4:#b5bb2e;--camo-5:#a7a827;--camo-6:#999621;--camo-7:#8c851c;--camo-8:#7e7416;--camo-9:#6d6414;--camo-10:#5d5411;--camo-11:#4d460e;--camo-12:#36300a;--jungle-0:#ecfeb0;--jungle-1:#def39a;--jungle-2:#d0e884;--jungle-3:#c2dd6e;--jungle-4:#b5d15b;--jungle-5:#a8c648;--jungle-6:#9bbb36;--jungle-7:#8fb024;--jungle-8:#84a513;--jungle-9:#7a9908;--jungle-10:#658006;--jungle-11:#516605;--jungle-12:#3d4d04;--gradient-1:linear-gradient(to bottom right,#1f005c,#5b0060,#870160,#ac255e,#ca485c,#e16b5c,#f39060,#ffb56b);--gradient-2:linear-gradient(to bottom right,#48005c,#8300e2,#a269ff);--gradient-3:radial-gradient(circle at top right,#0ff,rgba(0,255,255,0)),radial-gradient(circle at bottom left,#ff1492,rgba(255,20,146,0));--gradient-4:linear-gradient(to bottom right,#00f5a0,#00d9f5);--gradient-5:conic-gradient(from -270deg at 75% 110%,#f0f,#fffaf0);--gradient-6:conic-gradient(from -90deg at top left,#000,#fff);--gradient-7:linear-gradient(to bottom right,#72c6ef,#004e8f);--gradient-8:conic-gradient(from 90deg at 50% 0%,#111,50%,#222,#111);--gradient-9:conic-gradient(from .5turn at bottom center,#add8e6,#fff);--gradient-10:conic-gradient(from 90deg at 40% -25%,gold,#f79d03,#ee6907,#e6390a,#de0d0d,#d61039,#cf1261,#c71585,#cf1261,#d61039,#de0d0d,#ee6907,#f79d03,gold,gold,gold);--gradient-11:conic-gradient(at bottom left,#ff1493,cyan);--gradient-12:conic-gradient(from 90deg at 25% -10%,#ff4500,#d3f340,#7bee85,#afeeee,#7bee85);--gradient-13:radial-gradient(circle at 50% 200%,#000142,#3b0083,#b300c3,#ff059f,#ff4661,#ffad86,#fff3c7);--gradient-14:conic-gradient(at top right,lime,cyan);--gradient-15:linear-gradient(to bottom right,#c7d2fe,#fecaca,#fef3c7);--gradient-16:radial-gradient(circle at 50% -250%,#374151,#111827,#000);--gradient-17:conic-gradient(from -90deg at 50% -25%,blue,#8a2be2);--gradient-18:linear-gradient(0deg,rgba(255,0,0,.8),rgba(255,0,0,0) 75%),linear-gradient(60deg,rgba(255,255,0,.8),rgba(255,255,0,0) 75%),linear-gradient(120deg,rgba(0,255,0,.8),rgba(0,255,0,0) 75%),linear-gradient(180deg,rgba(0,255,255,.8),rgba(0,255,255,0) 75%),linear-gradient(240deg,rgba(0,0,255,.8),rgba(0,0,255,0) 75%),linear-gradient(300deg,rgba(255,0,255,.8),rgba(255,0,255,0) 75%);--gradient-19:linear-gradient(to bottom right,#ffe259,#ffa751);--gradient-20:conic-gradient(from -135deg at -10% center,orange,#ff7715,#ff522a,#ff3f47,#ff5482,#ff69b4);--gradient-21:conic-gradient(from -90deg at 25% 115%,red,#f06,#f0c,#c0f,#60f,#00f,#00f,#00f,#00f);--gradient-22:linear-gradient(to bottom right,#acb6e5,#86fde8);--gradient-23:linear-gradient(to bottom right,#536976,#292e49);--gradient-24:conic-gradient(from .5turn at 0% 0%,#00c476,10%,#82b0ff,90%,#00c476);--gradient-25:conic-gradient(at 125% 50%,#b78cf7,#ff7c94,#ffcf0d,#ff7c94,#b78cf7);--gradient-26:linear-gradient(to bottom right,#9796f0,#fbc7d4);--gradient-27:conic-gradient(from .5turn at bottom left,#ff1493,#639);--gradient-28:conic-gradient(from -90deg at 50% 105%,#fff,orchid);--gradient-29:radial-gradient(circle at top right,#bfb3ff,rgba(191,179,255,0)),radial-gradient(circle at bottom left,#86acf9,rgba(134,172,249,0));--gradient-30:radial-gradient(circle at top right,#00ff80,rgba(0,255,128,0)),radial-gradient(circle at bottom left,#adffd6,rgba(173,255,214,0));--noise-1:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.005' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-2:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 300 300' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.05' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-3:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.25' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-4:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 2056 2056' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-5:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 2056 2056' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.75' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-filter-1:contrast(300%) brightness(100%);--noise-filter-2:contrast(200%) brightness(150%);--noise-filter-3:contrast(200%) brightness(250%);--noise-filter-4:contrast(200%) brightness(500%);--noise-filter-5:contrast(200%) brightness(1000%);--animation-fade-in:fade-in .5s var(--ease-3);--animation-fade-in-bloom:fade-in-bloom 2s var(--ease-3);--animation-fade-out:fade-out .5s var(--ease-3);--animation-fade-out-bloom:fade-out-bloom 2s var(--ease-3);--animation-scale-up:scale-up .5s var(--ease-3);--animation-scale-down:scale-down .5s var(--ease-3);--animation-slide-out-up:slide-out-up .5s var(--ease-3);--animation-slide-out-down:slide-out-down .5s var(--ease-3);--animation-slide-out-right:slide-out-right .5s var(--ease-3);--animation-slide-out-left:slide-out-left .5s var(--ease-3);--animation-slide-in-up:slide-in-up .5s var(--ease-3);--animation-slide-in-down:slide-in-down .5s var(--ease-3);--animation-slide-in-right:slide-in-right .5s var(--ease-3);--animation-slide-in-left:slide-in-left .5s var(--ease-3);--animation-shake-x:shake-x .75s var(--ease-out-5);--animation-shake-y:shake-y .75s var(--ease-out-5);--animation-spin:spin 2s linear infinite;--animation-ping:ping 5s var(--ease-out-3) infinite;--animation-blink:blink 1s var(--ease-out-3) infinite;--animation-float:float 3s var(--ease-in-out-3) infinite;--animation-bounce:bounce 2s var(--ease-squish-2) infinite;--animation-pulse:pulse 2s var(--ease-out-3) infinite;--border-size-1:1px;--border-size-2:2px;--border-size-3:5px;--border-size-4:10px;--border-size-5:25px;--radius-1:2px;--radius-2:5px;--radius-3:1rem;--radius-4:2rem;--radius-5:4rem;--radius-6:8rem;--radius-round:1e5px;--radius-blob-1:30% 70% 70% 30%/53% 30% 70% 47%;--radius-blob-2:53% 47% 34% 66%/63% 46% 54% 37%;--radius-blob-3:37% 63% 56% 44%/49% 56% 44% 51%;--radius-blob-4:63% 37% 37% 63%/43% 37% 63% 57%;--radius-blob-5:49% 51% 48% 52%/57% 44% 56% 43%;--radius-conditional-1:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-1));--radius-conditional-2:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-2));--radius-conditional-3:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-3));--radius-conditional-4:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-4));--radius-conditional-5:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-5));--radius-conditional-6:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-6))}@media(prefers-color-scheme:dark){:where(html){--shadow-color:220 40% 2%;--shadow-strength:25%;--inner-shadow-highlight:inset 0 -.5px 0 0 hsla(0,0%,100%,.067),inset 0 .5px 0 0 rgba(0,0,0,.467)}}@keyframes fade-in{to{opacity:1}}@keyframes fade-in-bloom{0%{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(2) blur(10px);opacity:1}to{filter:brightness(1) blur(0);opacity:1}}@keyframes fade-out{to{opacity:0}}@keyframes fade-out-bloom{to{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(2) blur(10px);opacity:1}0%{filter:brightness(1) blur(0);opacity:1}}@keyframes scale-up{to{transform:scale(1.25)}}@keyframes scale-down{to{transform:scale(.75)}}@keyframes slide-out-up{to{transform:translateY(-100%)}}@keyframes slide-out-down{to{transform:translateY(100%)}}@keyframes slide-out-right{to{transform:translate(100%)}}@keyframes slide-out-left{to{transform:translate(-100%)}}@keyframes slide-in-up{0%{transform:translateY(100%)}}@keyframes slide-in-down{0%{transform:translateY(-100%)}}@keyframes slide-in-right{0%{transform:translate(-100%)}}@keyframes slide-in-left{0%{transform:translate(100%)}}@keyframes shake-x{0%,to{transform:translate(0)}20%{transform:translate(-5%)}40%{transform:translate(5%)}60%{transform:translate(-5%)}80%{transform:translate(5%)}}@keyframes shake-y{0%,to{transform:translateY(0)}20%{transform:translateY(-5%)}40%{transform:translateY(5%)}60%{transform:translateY(-5%)}80%{transform:translateY(5%)}}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{90%,to{opacity:0;transform:scale(2)}}@keyframes blink{0%,to{opacity:1}50%{opacity:.5}}@keyframes float{50%{transform:translateY(-25%)}}@keyframes bounce{25%{transform:translateY(-20%)}40%{transform:translateY(-3%)}0%,60%,to{transform:translateY(0)}}@keyframes pulse{50%{transform:scale(.9)}}@media(prefers-color-scheme:dark){@keyframes fade-in-bloom{0%{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(.5) blur(10px);opacity:1}to{filter:brightness(1) blur(0);opacity:1}}}@media(prefers-color-scheme:dark){@keyframes fade-out-bloom{to{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(.5) blur(10px);opacity:1}0%{filter:brightness(1) blur(0);opacity:1}}}:where(:root){color-scheme:light;--palette-hue:270;--palette-hue-rotate-by:-5;--palette-chroma:.1;--link:oklch(50% 100% var(--palette-hue));--link-visited:oklch(50% 100% calc(var(--palette-hue)*1.2));--surface-1:white;--surface-2:var(--color-1);--surface-3:var(--color-3);--surface-document:var(--color-4);--well-1:var(--color-5);--well-2:var(--color-6);--text-1:var(--color-16);--text-2:var(--color-12);--scrollthumb-color:var(--text-2)}:where(:root) :where(dialog){background-color:var(--surface-1)}:where(:root) :where(button,.btn){--_highlight:var(--_highlight-light);--_bg:var(--_bg-light);--_ink-shadow:var(--_ink-shadow-light)}:where(:root) :where(button,.btn) :where([type=reset]){--_text:var(--red-6,#fa5252);--_border:var(--red-3,#ffa8a8)}:where(:root) :where(button,.btn,input:is([type=button],[type=submit],[type=reset]))[disabled]{box-shadow:none}:where(:root) :where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--surface-2)}@media(prefers-color-scheme:dark){:where(:root){color-scheme:dark;--link:oklch(90% 80% var(--palette-hue));--link-visited:oklch(90% 80% calc(var(--palette-hue)*1.2));--surface-1:var(--color-11);--surface-2:var(--color-12);--surface-3:var(--color-13);--surface-document:var(--color-14);--well-1:var(--color-15);--well-2:var(--color-16);--text-1:var(--color-1);--text-2:var(--color-5);--scrollthumb-color:var(--text-2)}}:where(:root){scrollbar-color:var(--scrollthumb-color)transparent;accent-color:var(--brand,var(--link));caret-color:var(--brand,var(--link));color:var(--text-1);background-color:var(--surface-document)}:where(a[href]){color:var(--brand,var(--link))}:where(a[href]):where(:visited){color:var(--link-visited)}:focus-visible{outline-color:var(--brand,var(--link))}*,:before,:after{box-sizing:border-box}:where(:root){--transition-focus:outline-offset .145s var(--ease-2)}@supports (transition-timing-function:linear(0,1)){:where(:root){--transition-focus:outline-offset .145s var(--ease-spring-3)}}:where(:not(dialog)){margin:0}:where(:not(fieldset,progress,meter)){background-repeat:no-repeat;background-origin:border-box;border-style:solid;border-width:0}:where(html){font-family:var(--font-sans);-webkit-text-size-adjust:none;block-size:100%;line-height:1.5}@media(prefers-reduced-motion:no-preference){:where(html){scroll-behavior:smooth}}@media(prefers-reduced-motion:no-preference){:where(:focus-visible){transition:var(--transition-focus)}:where(:not(:active):focus-visible){transition-duration:.25s}}:where(:not(:active):focus-visible){outline-offset:5px}:where(body){min-block-size:100%}:where(h1,h2,h3,h4,h5,h6){line-height:1.25;font-weight:var(--font-weight-9);text-wrap:balance}:where(h1){font-size:var(--font-size-8);max-inline-size:var(--size-header-1)}:where(h2){font-size:var(--font-size-6);max-inline-size:var(--size-header-2)}:where(h3){font-size:var(--font-size-5)}:where(h4){font-size:var(--font-size-4)}:where(h5){font-size:var(--font-size-3)}:where(h3,h4,h5,h6,dt){max-inline-size:var(--size-header-3)}:where(p,ul,ol,dl,h6){font-size:var(--font-size-2)}:where(a,u,ins,abbr){text-underline-offset:1px}@supports ((-moz-appearance:none)){:where(a,u,ins,abbr){text-underline-offset:2px}}:where(a[href],area,button,input:not([type=text],[type=email],[type=number],[type=password],[type=""],[type=tel],[type=url]),label[for],select,summary,[tabindex]:not([tabindex*="-"])){cursor:pointer}:where(a[href],area,button,input,label[for],select,summary,textarea,[tabindex]:not([tabindex*="-"])){touch-action:manipulation;-webkit-tap-highlight-color:transparent}:where(a):where([href]){-webkit-text-decoration-color:var(--link);text-decoration-color:var(--link)}:where(a):where([href]):where(:visited){-webkit-text-decoration-color:var(--link-visited);text-decoration-color:var(--link-visited)}:where(a):where(:not(:hover)){-webkit-text-decoration:inherit;text-decoration:inherit}:where(img,svg,video,canvas,audio,iframe,embed,object){display:block}:where(img,svg,video){block-size:auto;max-inline-size:100%}:where(input,button,textarea,select){font:inherit;font-size:inherit;color:inherit;letter-spacing:inherit}:where(input[type=file])::-webkit-file-upload-button{font:inherit;font-size:inherit;color:inherit;letter-spacing:inherit}::placeholder{color:var(--color-8);opacity:.75}:where(input:not([type=range]),textarea){padding-inline:var(--size-2);padding-block:var(--size-1)}:where(select){padding-inline:var(--size-4)0;padding-block:var(--size-2);field-sizing:content}:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--well-1);border-radius:var(--radius-2)}:where(textarea){resize:block;field-sizing:content;min-block-size:3rlh;min-inline-size:var(--size-content-1);max-inline-size:var(--size-content-2);min-block-size:3lh;max-block-size:80svh}:where(input[type=checkbox],input[type=radio]){background-color:var(--well-1);block-size:var(--size-3);inline-size:var(--size-3)}:where(svg:not([width])){inline-size:var(--size-10)}:where(code,kbd,samp,pre){font-family:var(--font-mono)}:where(:not(pre)>code,kbd){white-space:nowrap}:where(pre){white-space:pre;writing-mode:lr;direction:ltr;min-inline-size:0;max-inline-size:max-content}:where(:not(pre)>code){padding:var(--size-1)var(--size-2);background:var(--surface-2);border-radius:var(--radius-2);writing-mode:lr}:where(kbd,var){padding:var(--size-1)var(--size-2);border-width:var(--border-size-1);border-color:var(--surface-4);border-radius:var(--radius-2)}:where(mark){border-radius:var(--radius-2);padding-inline:var(--size-1)}:where(ol,ul){padding-inline-start:var(--size-8)}:where(li){padding-inline-start:var(--size-2)}:where(li,dd,figcaption){max-inline-size:var(--size-content-2)}:where(p){max-inline-size:var(--size-content-3);text-wrap:pretty}:where(dt,summary){font-weight:var(--font-weight-7)}:where(dt:not(:first-of-type)){margin-block-start:var(--size-5)}:where(small){font-size:max(.5em,var(--font-size-0));max-inline-size:var(--size-content-1)}:where(hr){margin-block:var(--size-fluid-5);height:var(--border-size-2);background-color:var(--surface-3)}:where(figure){gap:var(--size-2);place-items:center;display:grid}:where(figure)>:where(figcaption){font-size:var(--font-size-1);text-wrap:balance}:where(blockquote,:not(blockquote)>cite){border-inline-start-width:var(--border-size-3)}:where(blockquote){gap:var(--size-3);padding-block:var(--size-3);padding-inline:var(--size-4);max-inline-size:var(--size-content-2);display:grid}:where(:not(blockquote)>cite){padding-inline-start:var(--size-2)}:where(summary){background:var(--surface-3);padding:var(--size-2)var(--size-3);margin:calc(var(--size-2)*-1)calc(var(--size-3)*-1);border-radius:var(--radius-2)}:where(details){padding-inline:var(--size-3);padding-block:var(--size-2);background:var(--surface-2);border-radius:var(--radius-2)}:where(details[open]>summary){margin-bottom:var(--size-2);border-end-end-radius:0;border-end-start-radius:0}:where(fieldset){border-radius:var(--radius-2);border:var(--border-size-1)solid var(--surface-4)}:where(del){background:var(--red-9,#c92a2a);color:var(--red-2,#ffc9c9)}:where(ins){background:var(--green-9,#2b8a3e);color:var(--green-1,#d3f9d8)}:where(abbr){-webkit-text-decoration-color:var(--blue-5,#339af0);text-decoration-color:var(--blue-5,#339af0)}:where(dialog){background-color:var(--surface-1);color:inherit;border-radius:var(--radius-3);box-shadow:var(--shadow-6)}:where(dialog)::backdrop{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}:where(html:has(dialog[open])){overflow:hidden}:where(menu){gap:var(--size-3);padding-inline-start:0;display:flex}:where(sup){font-size:.5em}:where(table){border:1px solid var(--surface-2);background:var(--surface-2);border-radius:var(--radius-3);--nice-inner-radius:calc(var(--radius-3) - 2px);width:-moz-fit-content;width:fit-content}:where(table:not(:has(tfoot)) tr:last-child td:first-child){border-bottom-left-radius:var(--nice-inner-radius)}:where(table:not(:has(tfoot)) tr:last-child td:last-child){border-bottom-right-radius:var(--nice-inner-radius)}:where(table thead th:first-child){border-top-left-radius:var(--nice-inner-radius)}:where(table thead th:last-child){border-top-right-radius:var(--nice-inner-radius)}:where(tfoot th:first-of-type){border-end-start-radius:var(--nice-inner-radius)}:where(tfoot th:last-of-type){border-end-end-radius:var(--nice-inner-radius)}:where(th){color:var(--text-1);background-color:var(--surface-2)}:where(table :is(a,button,[contenteditable]):focus-visible){outline-offset:-2px}:where(td){background:var(--surface-1);max-inline-size:var(--size-content-2);text-wrap:pretty}:where(td,th){text-align:left;padding:var(--size-2)}:where(:is(td,th):not([align])){text-align:center}:where(thead){border-collapse:collapse}:where(table tr:hover td),:where(tbody tr:nth-child(2n):hover td){background-color:var(--color-10)}@media(prefers-color-scheme:light){:is(:where(table tr:hover td),:where(tbody tr:nth-child(2n):hover td)){background-color:#fff}}:where(table>caption){margin:var(--size-3)}:where(tfoot button){padding-block:var(--size-1);padding-inline:var(--size-3)}@media(prefers-color-scheme:dark){:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:#171a1c}:where(dialog){background-color:var(--surface-2)}:where(html){--shadow-strength:10%;--shadow-color:220 40% 2%}::placeholder{color:var(--color-6)}}:root{--devtools-primary: var(--blue-6);--devtools-primary-hover: var(--blue-7);--devtools-primary-active: var(--blue-8);--devtools-success: var(--green-6);--devtools-warning: var(--yellow-6);--devtools-error: var(--red-6);--devtools-info: var(--cyan-6);--devtools-bg: var(--gray-0);--devtools-surface: var(--gray-1);--devtools-surface-elevated: var(--gray-2);--devtools-border: var(--gray-4);--devtools-text: var(--gray-9);--devtools-text-muted: var(--gray-6);--devtools-text-inverted: var(--gray-0);--method-get: var(--green-6);--method-post: var(--blue-6);--method-put: var(--orange-6);--method-patch: var(--yellow-6);--method-delete: var(--red-6);--method-options: var(--gray-6);--method-head: var(--cyan-6);--status-1xx: var(--gray-6);--status-2xx: var(--green-6);--status-3xx: var(--blue-6);--status-4xx: var(--orange-6);--status-5xx: var(--red-6);--devtools-space-xs: var(--size-1);--devtools-space-sm: var(--size-2);--devtools-space-md: var(--size-3);--devtools-space-lg: var(--size-4);--devtools-space-xl: var(--size-5);--devtools-font-mono: var(--font-mono);--devtools-font-sans: var(--font-sans);--devtools-radius-sm: var(--radius-2);--devtools-radius-md: var(--radius-3);--devtools-radius-lg: var(--radius-4);--devtools-shadow-sm: var(--shadow-2);--devtools-shadow-md: var(--shadow-3);--devtools-shadow-lg: var(--shadow-4);--devtools-transition-fast: .15s var(--ease-3);--devtools-transition-normal: .2s var(--ease-3);--devtools-transition-slow: .3s var(--ease-3);--devtools-header-height: 48px;--devtools-sidebar-width: 280px}@media(prefers-color-scheme:dark){:root:not(.light):not(.dark){--devtools-bg: var(--gray-9);--devtools-surface: var(--gray-8);--devtools-surface-elevated: var(--gray-7);--devtools-border: var(--gray-6);--devtools-text: var(--gray-1);--devtools-text-muted: var(--gray-4);--devtools-text-inverted: var(--gray-9)}}.light{--devtools-bg: var(--gray-0);--devtools-surface: var(--gray-1);--devtools-surface-elevated: var(--gray-2);--devtools-border: var(--gray-4);--devtools-text: var(--gray-9);--devtools-text-muted: var(--gray-6);--devtools-text-inverted: var(--gray-0)}.dark{--devtools-bg: var(--gray-9);--devtools-surface: var(--gray-8);--devtools-surface-elevated: var(--gray-7);--devtools-border: var(--gray-6);--devtools-text: var(--gray-1);--devtools-text-muted: var(--gray-4);--devtools-text-inverted: var(--gray-9)}*,*:before,*:after{box-sizing:border-box}html{height:100%}body{margin:0;padding:0;height:100%;font-family:var(--devtools-font-sans);background-color:var(--devtools-bg);color:var(--devtools-text)}#app{height:100%;display:flex;flex-direction:column}.font-mono{font-family:var(--devtools-font-mono)}.text-muted{color:var(--devtools-text-muted)}.method-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);font-weight:var(--font-weight-6);text-transform:uppercase;min-width:60px}.method-badge--get{background-color:color-mix(in srgb,var(--method-get) 15%,transparent);color:var(--method-get)}.method-badge--post{background-color:color-mix(in srgb,var(--method-post) 15%,transparent);color:var(--method-post)}.method-badge--put{background-color:color-mix(in srgb,var(--method-put) 15%,transparent);color:var(--method-put)}.method-badge--patch{background-color:color-mix(in srgb,var(--method-patch) 15%,transparent);color:var(--method-patch)}.method-badge--delete{background-color:color-mix(in srgb,var(--method-delete) 15%,transparent);color:var(--method-delete)}.method-badge--options{background-color:color-mix(in srgb,var(--method-options) 15%,transparent);color:var(--method-options)}.method-badge--head{background-color:color-mix(in srgb,var(--method-head) 15%,transparent);color:var(--method-head)}.status-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);font-weight:var(--font-weight-5);min-width:40px}.status-badge--1xx{background-color:color-mix(in srgb,var(--status-1xx) 15%,transparent);color:var(--status-1xx)}.status-badge--2xx{background-color:color-mix(in srgb,var(--status-2xx) 15%,transparent);color:var(--status-2xx)}.status-badge--3xx{background-color:color-mix(in srgb,var(--status-3xx) 15%,transparent);color:var(--status-3xx)}.status-badge--4xx{background-color:color-mix(in srgb,var(--status-4xx) 15%,transparent);color:var(--status-4xx)}.status-badge--5xx{background-color:color-mix(in srgb,var(--status-5xx) 15%,transparent);color:var(--status-5xx)}.connection-status{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0)}.connection-status__dot{width:8px;height:8px;border-radius:50%}.connection-status__dot--connected{background-color:var(--devtools-success);box-shadow:0 0 6px var(--devtools-success)}.connection-status__dot--disconnected{background-color:var(--devtools-error)}.connection-status__dot--connecting{background-color:var(--devtools-warning);animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.card{background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-md);padding:var(--devtools-space-md)}.card--elevated{background-color:var(--devtools-surface-elevated);box-shadow:var(--devtools-shadow-sm)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-sm) var(--devtools-space-md);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);cursor:pointer;transition:all var(--devtools-transition-fast)}.btn--primary{background-color:var(--devtools-primary);color:var(--devtools-text-inverted)}.btn--primary:hover{background-color:var(--devtools-primary-hover)}.btn--primary:active{background-color:var(--devtools-primary-active)}.btn--secondary{background-color:var(--devtools-surface-elevated);color:var(--devtools-text);border:1px solid var(--devtools-border)}.btn--secondary:hover{background-color:var(--devtools-border)}.btn--ghost{background-color:transparent;color:var(--devtools-text)}.btn--ghost:hover{background-color:var(--devtools-surface)}.btn--icon{padding:var(--devtools-space-sm)}.btn:disabled{opacity:.5;cursor:not-allowed}.input{display:block;width:100%;padding:var(--devtools-space-sm) var(--devtools-space-md);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-1);color:var(--devtools-text);transition:border-color var(--devtools-transition-fast)}.input:focus{outline:2px solid transparent;outline-color:var(--devtools-primary);border-color:var(--devtools-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--devtools-primary) 25%,transparent)}.input::placeholder{color:var(--devtools-text-muted)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--devtools-surface)}::-webkit-scrollbar-thumb{background:var(--devtools-border);border-radius:var(--devtools-radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--devtools-text-muted)}.flex{display:flex}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-xs{gap:var(--devtools-space-xs)}.gap-sm{gap:var(--devtools-space-sm)}.gap-md{gap:var(--devtools-space-md)}.gap-lg{gap:var(--devtools-space-lg)}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--devtools-space-xl);color:var(--devtools-text-muted);text-align:center}.empty-state__icon{width:48px;height:48px;margin-bottom:var(--devtools-space-md);opacity:.5}.empty-state__title{font-size:var(--font-size-3);font-weight:var(--font-weight-5);margin:0 0 var(--devtools-space-sm)}.empty-state__description{font-size:var(--font-size-1);margin:0}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RoutesPage-
|
|
2
|
-
import{h as P,c as v,r as D,o as ee,g as te,a as ne,b as oe,d as re,e as T,f,i as O,u as y,F as ae,j as se,k as A,n as $,t as V,l as N,w as B,m as ce,p as ie,q as le,s as k,T as ue,v as de,x as pe}from"./vue-vendor-Bkktf9yg.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const l of s.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();const j=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),fe=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase()),me=e=>{const t=fe(e);return t.charAt(0).toUpperCase()+t.slice(1)},he=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();var S={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const _e=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:o,name:s,class:l,...u},{slots:h})=>P("svg",{...S,width:e||S.width,height:e||S.height,stroke:r||S.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:he("lucide",...s?[`lucide-${j(me(s))}-icon`,`lucide-${j(s)}`]:["lucide-icon"]),...u},[...o.map(a=>P(...a)),...h.default?[h.default()]:[]]);const w=(e,t)=>(n,{slots:r})=>P(_e,{...n,iconNode:t,name:e},r);const ve=w("clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);const ye=w("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);const F=w("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);const ke=w("wifi-off",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);const ge=w("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);const H=w("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),x={path:"/_ws",reconnectDelay:2e3,maxReconnectAttempts:Number.POSITIVE_INFINITY,autoConnect:!0},d=D("disconnected"),W=D(null),b=D(0);let c=null,E=null,g={...x},I=!1;const m=new Map;function G(){return typeof window<"u"&&typeof WebSocket<"u"}function we(){return te()!==null}function be(e){return G()?`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${e}`:`ws://localhost${e}`}function J(){E!==null&&(clearTimeout(E),E=null)}function Se(e,t){const n=m.get(e);if(n)for(const o of n)try{o(t)}catch(s){console.error(`[DevTools WebSocket] Error in event handler for '${e}':`,s)}const r=m.get("*");if(r)for(const o of r)try{o({type:e,data:t})}catch(s){console.error("[DevTools WebSocket] Error in wildcard event handler:",s)}}function Ce(){d.value="connected",b.value=0,J()}function Ee(e){try{const t=JSON.parse(e.data);if(t.type==="connected"){const n=t.data;W.value=n.serverVersion}Se(t.type,t.data)}catch(t){console.error("[DevTools WebSocket] Failed to parse message:",t)}}function Te(){d.value,d.value="disconnected",c=null,b.value<g.maxReconnectAttempts&&(d.value="reconnecting",b.value++,E=setTimeout(()=>{M()},g.reconnectDelay))}function Oe(e){console.error("[DevTools WebSocket] Error:",e)}function M(){if(!G()||d.value==="connecting"||d.value==="connected"||c&&(c.readyState===WebSocket.CONNECTING||c.readyState===WebSocket.OPEN))return;K(),d.value="connecting";const e=be(g.path);try{c=new WebSocket(e),c.onopen=Ce,c.onmessage=Ee,c.onclose=Te,c.onerror=Oe}catch(t){console.error("[DevTools WebSocket] Failed to create WebSocket:",t),d.value="disconnected"}}function K(){c&&(c.onopen=null,c.onmessage=null,c.onclose=null,c.onerror=null,(c.readyState===WebSocket.OPEN||c.readyState===WebSocket.CONNECTING)&&c.close(),c=null)}function Y(){J(),K(),d.value="disconnected",b.value=0}function Ae(e){if(!c||c.readyState!==WebSocket.OPEN)return!1;try{return c.send(JSON.stringify(e)),!0}catch(t){return console.error("[DevTools WebSocket] Failed to send command:",t),!1}}function L(e,t){m.has(e)||m.set(e,new Set);const n=m.get(e);return n&&n.add(t),()=>{const r=m.get(e);r&&(r.delete(t),r.size===0&&m.delete(e))}}function R(e,t){const n=m.get(e);n&&(n.delete(t),n.size===0&&m.delete(e))}function Ne(e,t){const n=r=>{R(e,n),t(r)};return L(e,n)}function Pe(e,t){const n=r=>{t(r)===!0&&R(e,n)};return L(e,n)}function Ie(){Y(),W.value=null,m.clear(),g={...x},I=!1}function Me(e={}){(!I||d.value==="disconnected")&&(g={...x,...e},I=!0);const t=v(()=>d.value==="connected"),n=v(()=>d.value==="reconnecting");return we()&&ee(()=>{g.autoConnect&&M()}),{connectionState:v(()=>d.value),connected:t,isReconnecting:n,serverVersion:v(()=>W.value),reconnectAttempts:v(()=>b.value),connect:M,disconnect:Y,send:Ae,on:L,off:R,once:Ne,onUntil:Pe,resetState:Ie}}const De="modulepreload",xe=function(e){return"/_devtools/"+e},U={},C=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){let h=function(a){return Promise.all(a.map(p=>Promise.resolve(p).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),u=l?.nonce||l?.getAttribute("nonce");o=h(n.map(a=>{if(a=xe(a),a in U)return;U[a]=!0;const p=a.endsWith(".css"),_=p?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${a}"]${_}`))return;const i=document.createElement("link");if(i.rel=p?"stylesheet":De,p||(i.as="script"),i.crossOrigin="",i.href=a,u&&i.setAttribute("nonce",u),document.head.appendChild(i),p)return new Promise((z,X)=>{i.addEventListener("load",z),i.addEventListener("error",()=>X(new Error(`Unable to preload CSS for ${a}`)))})}))}function s(l){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=l,window.dispatchEvent(u),!u.defaultPrevented)throw l}return o.then(l=>{for(const u of l||[])u.status==="rejected"&&s(u.reason);return t().catch(s)})},Q=[{path:"/",redirect:"/routes"},{path:"/routes",name:"routes",component:()=>C(()=>import("./RoutesPage-
|
|
3
|
-
//# sourceMappingURL=index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RoutesPage-Rs-CBlOu.js","assets/format-YtVMCGJx.js","assets/vue-vendor-Bkktf9yg.js","assets/registry-DjJcdO1T.js","assets/x-5pbhNHo3.js","assets/RoutesPage-BVXzvJ2S.css","assets/TimelinePage-2YaDXdDB.js","assets/check-CLk5nWxQ.js","assets/triangle-alert-DD8Mz05K.js","assets/trash-2-DCsOAZPr.js","assets/TimelinePage-BDyp8kvu.css","assets/ModelsPage-Ef8Z_K5t.js","assets/ModelsPage-BslYlawu.css","assets/SimulatorPage-CNh6VflM.js","assets/SimulatorPage-DGEq_rzM.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{h as P,c as v,r as D,o as ee,g as te,a as ne,b as oe,d as re,e as T,f,i as O,u as y,F as ae,j as se,k as A,n as $,t as V,l as N,w as B,m as ce,p as ie,q as le,s as k,T as ue,v as de,x as pe}from"./vue-vendor-Bkktf9yg.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const l of s.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();const j=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),fe=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase()),me=e=>{const t=fe(e);return t.charAt(0).toUpperCase()+t.slice(1)},he=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();var S={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const _e=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:o,name:s,class:l,...u},{slots:h})=>P("svg",{...S,width:e||S.width,height:e||S.height,stroke:r||S.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:he("lucide",...s?[`lucide-${j(me(s))}-icon`,`lucide-${j(s)}`]:["lucide-icon"]),...u},[...o.map(a=>P(...a)),...h.default?[h.default()]:[]]);const w=(e,t)=>(n,{slots:r})=>P(_e,{...n,iconNode:t,name:e},r);const ve=w("clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);const ye=w("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);const F=w("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);const ke=w("wifi-off",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);const ge=w("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);const H=w("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),x={path:"/_ws",reconnectDelay:2e3,maxReconnectAttempts:Number.POSITIVE_INFINITY,autoConnect:!0},d=D("disconnected"),W=D(null),b=D(0);let c=null,E=null,g={...x},I=!1;const m=new Map;function G(){return typeof window<"u"&&typeof WebSocket<"u"}function we(){return te()!==null}function be(e){return G()?`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${e}`:`ws://localhost${e}`}function J(){E!==null&&(clearTimeout(E),E=null)}function Se(e,t){const n=m.get(e);if(n)for(const o of n)try{o(t)}catch(s){console.error(`[DevTools WebSocket] Error in event handler for '${e}':`,s)}const r=m.get("*");if(r)for(const o of r)try{o({type:e,data:t})}catch(s){console.error("[DevTools WebSocket] Error in wildcard event handler:",s)}}function Ce(){d.value="connected",b.value=0,J()}function Ee(e){try{const t=JSON.parse(e.data);if(t.type==="connected"){const n=t.data;W.value=n.serverVersion}Se(t.type,t.data)}catch(t){console.error("[DevTools WebSocket] Failed to parse message:",t)}}function Te(){d.value,d.value="disconnected",c=null,b.value<g.maxReconnectAttempts&&(d.value="reconnecting",b.value++,E=setTimeout(()=>{M()},g.reconnectDelay))}function Oe(e){console.error("[DevTools WebSocket] Error:",e)}function M(){if(!G()||d.value==="connecting"||d.value==="connected"||c&&(c.readyState===WebSocket.CONNECTING||c.readyState===WebSocket.OPEN))return;K(),d.value="connecting";const e=be(g.path);try{c=new WebSocket(e),c.onopen=Ce,c.onmessage=Ee,c.onclose=Te,c.onerror=Oe}catch(t){console.error("[DevTools WebSocket] Failed to create WebSocket:",t),d.value="disconnected"}}function K(){c&&(c.onopen=null,c.onmessage=null,c.onclose=null,c.onerror=null,(c.readyState===WebSocket.OPEN||c.readyState===WebSocket.CONNECTING)&&c.close(),c=null)}function Y(){J(),K(),d.value="disconnected",b.value=0}function Ae(e){if(!c||c.readyState!==WebSocket.OPEN)return!1;try{return c.send(JSON.stringify(e)),!0}catch(t){return console.error("[DevTools WebSocket] Failed to send command:",t),!1}}function L(e,t){m.has(e)||m.set(e,new Set);const n=m.get(e);return n&&n.add(t),()=>{const r=m.get(e);r&&(r.delete(t),r.size===0&&m.delete(e))}}function R(e,t){const n=m.get(e);n&&(n.delete(t),n.size===0&&m.delete(e))}function Ne(e,t){const n=r=>{R(e,n),t(r)};return L(e,n)}function Pe(e,t){const n=r=>{t(r)===!0&&R(e,n)};return L(e,n)}function Ie(){Y(),W.value=null,m.clear(),g={...x},I=!1}function Me(e={}){(!I||d.value==="disconnected")&&(g={...x,...e},I=!0);const t=v(()=>d.value==="connected"),n=v(()=>d.value==="reconnecting");return we()&&ee(()=>{g.autoConnect&&M()}),{connectionState:v(()=>d.value),connected:t,isReconnecting:n,serverVersion:v(()=>W.value),reconnectAttempts:v(()=>b.value),connect:M,disconnect:Y,send:Ae,on:L,off:R,once:Ne,onUntil:Pe,resetState:Ie}}const De="modulepreload",xe=function(e){return"/_devtools/"+e},U={},C=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){let h=function(a){return Promise.all(a.map(p=>Promise.resolve(p).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),u=l?.nonce||l?.getAttribute("nonce");o=h(n.map(a=>{if(a=xe(a),a in U)return;U[a]=!0;const p=a.endsWith(".css"),_=p?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${a}"]${_}`))return;const i=document.createElement("link");if(i.rel=p?"stylesheet":De,p||(i.as="script"),i.crossOrigin="",i.href=a,u&&i.setAttribute("nonce",u),document.head.appendChild(i),p)return new Promise((z,X)=>{i.addEventListener("load",z),i.addEventListener("error",()=>X(new Error(`Unable to preload CSS for ${a}`)))})}))}function s(l){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=l,window.dispatchEvent(u),!u.defaultPrevented)throw l}return o.then(l=>{for(const u of l||[])u.status==="rejected"&&s(u.reason);return t().catch(s)})},Q=[{path:"/",redirect:"/routes"},{path:"/routes",name:"routes",component:()=>C(()=>import("./RoutesPage-Rs-CBlOu.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{title:"Routes",icon:"route"}},{path:"/timeline",name:"timeline",component:()=>C(()=>import("./TimelinePage-2YaDXdDB.js"),__vite__mapDeps([6,2,1,7,8,4,9,10])),meta:{title:"Timeline",icon:"clock"}},{path:"/models",name:"models",component:()=>C(()=>import("./ModelsPage-Ef8Z_K5t.js"),__vite__mapDeps([11,2,7,4,9,12])),meta:{title:"Models",icon:"database"}},{path:"/simulator",name:"simulator",component:()=>C(()=>import("./SimulatorPage-CNh6VflM.js"),__vite__mapDeps([13,2,3,8,9,14])),meta:{title:"Simulator",icon:"zap"}},{path:"/:pathMatch(.*)*",name:"not-found",redirect:"/routes"}],We=ne({history:oe(),routes:Q}),Le={class:"app"},Re={class:"app-header"},ze={class:"app-header__brand"},$e={class:"app-nav",role:"tablist","aria-label":"DevTools navigation"},Ve=["aria-selected","aria-current","aria-controls","onClick"],Be={class:"app-nav__label"},je={class:"app-header__status"},Fe={class:"connection-status"},He={class:"connection-status__text"},Ue={class:"app-main"},qe=re({__name:"App",setup(e){const t=ie(),n=le(),r=v(()=>Q.filter(a=>a.name&&a.meta?.title).map(a=>({name:a.name,path:a.path,title:a.meta?.title,icon:a.meta?.icon}))),o=v(()=>t.name);function s(a){n.push(a)}const l={route:F,clock:ve,database:ye,zap:H};function u(a){return l[a]??F}const{connected:h}=Me();return(a,p)=>{const _=ce("router-view");return k(),T("div",Le,[f("header",Re,[f("div",ze,[O(y(H),{class:"app-header__logo",size:20}),p[0]||(p[0]=f("span",{class:"app-header__title"},"OpenAPI DevTools",-1))]),f("nav",$e,[(k(!0),T(ae,null,se(r.value,i=>(k(),T("button",{key:i.name,role:"tab","aria-selected":o.value===i.name,"aria-current":o.value===i.name?"true":void 0,"aria-controls":`panel-${i.name}`,tabindex:0,class:$(["app-nav__tab",{"app-nav__tab--active":o.value===i.name}]),onClick:z=>s(i.path)},[(k(),A(N(u(i.icon)),{size:16,class:"app-nav__icon"})),f("span",Be,V(i.title),1)],10,Ve))),128))]),f("div",je,[f("div",Fe,[f("span",{class:$(["connection-status__dot",y(h)?"connection-status__dot--connected":"connection-status__dot--disconnected"])},null,2),f("span",He,V(y(h)?"Connected":"Disconnected"),1),(k(),A(N(y(h)?y(ge):y(ke)),{size:14,class:"connection-status__icon"}))])])]),f("main",Ue,[O(_,null,{default:B(({Component:i})=>[O(ue,{name:"fade",mode:"out-in"},{default:B(()=>[(k(),A(N(i)))]),_:2},1024)]),_:1})])])}}}),Ze=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},Ge=Ze(qe,[["__scopeId","data-v-0a83e2b9"]]);let q=!1,Z=null;function Je(){if(q)return Z;const e=de(Ge),t=pe();return e.use(t),e.use(We),e.mount("#app"),q=!0,Z=e,e}typeof window<"u"&&document.getElementById("app")&&Je();export{ve as C,ye as D,F as R,H as Z,Ze as _,w as c,Me as u};
|
|
3
|
+
//# sourceMappingURL=index-sPgNGnaU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","defaultAttributes","Icon","size","strokeWidth","absoluteStrokeWidth","color","iconNode","name","props","slots","h","child","createLucideIcon","iconName","Clock","Database","Route","WifiOff","Wifi","Zap","DEFAULT_OPTIONS","connectionState","ref","serverVersion","reconnectAttempts","ws","reconnectTimer","currentOptions","optionsInitialized","eventHandlers","isBrowser","hasComponentContext","getCurrentInstance","buildWebSocketUrl","path","clearReconnectTimer","dispatchEvent","type","data","handlers","handler","error","wildcardHandlers","handleOpen","handleMessage","event","message","connectedData","handleClose","connect","handleError","cleanupConnection","url","disconnect","send","command","on","currentHandlers","off","once","wrappedHandler","onUntil","resetState","useWebSocket","options","connected","computed","isReconnecting","onMounted","routes","router","createRouter","createWebHashHistory","route","useRoute","useRouter","tabs","r","activeTab","navigateTo","iconMap","getIcon","isConnected","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_createVNode","_unref","_cache","_hoisted_4","_Fragment","_renderList","tab","_normalizeClass","$event","_createBlock","_resolveDynamicComponent","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_component_router_view","_withCtx","Component","_Transition","isBootstrapped","appInstance","bootstrap","app","createApp","AppComponent","pinia","createPinia"],"ignoreList":[0,1,2,3,4,5,6,7,8,9],"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/shared/src/utils.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/defaultAttributes.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/Icon.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/createLucideIcon.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/clock.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/database.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/route.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/wifi-off.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/wifi.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/zap.js","../../../src/composables/useWebSocket.ts","../../../src/router.ts","../../../src/App.vue","../../../src/main.ts"],"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\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.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\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.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 { h } from 'vue';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport defaultAttributes from './defaultAttributes.js';\n\nconst Icon = ({ size, strokeWidth = 2, absoluteStrokeWidth, color, iconNode, name, class: classes, ...props }, { slots }) => {\n return h(\n \"svg\",\n {\n ...defaultAttributes,\n width: size || defaultAttributes.width,\n height: size || defaultAttributes.height,\n stroke: color || defaultAttributes.stroke,\n \"stroke-width\": absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n class: mergeClasses(\n \"lucide\",\n ...name ? [`lucide-${toKebabCase(toPascalCase(name))}-icon`, `lucide-${toKebabCase(name)}`] : [\"lucide-icon\"]\n ),\n ...props\n },\n [...iconNode.map((child) => h(...child)), ...slots.default ? [slots.default()] : []]\n );\n};\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.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 { h } from 'vue';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => (props, { slots }) => h(\n Icon,\n {\n ...props,\n iconNode,\n name: iconName\n },\n slots\n);\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.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 Clock = createLucideIcon(\"clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.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 Database = createLucideIcon(\"database\", [\n [\"ellipse\", { cx: \"12\", cy: \"5\", rx: \"9\", ry: \"3\", key: \"msslwz\" }],\n [\"path\", { d: \"M3 5V19A9 3 0 0 0 21 19V5\", key: \"1wlel7\" }],\n [\"path\", { d: \"M3 12A9 3 0 0 0 21 12\", key: \"mv7ke4\" }]\n]);\n\nexport { Database as default };\n//# sourceMappingURL=database.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 Route = createLucideIcon(\"route\", [\n [\"circle\", { cx: \"6\", cy: \"19\", r: \"3\", key: \"1kj8tv\" }],\n [\"path\", { d: \"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\", key: \"1d8sl\" }],\n [\"circle\", { cx: \"18\", cy: \"5\", r: \"3\", key: \"gq8acd\" }]\n]);\n\nexport { Route as default };\n//# sourceMappingURL=route.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 WifiOff = createLucideIcon(\"wifi-off\", [\n [\"path\", { d: \"M12 20h.01\", key: \"zekei9\" }],\n [\"path\", { d: \"M8.5 16.429a5 5 0 0 1 7 0\", key: \"1bycff\" }],\n [\"path\", { d: \"M5 12.859a10 10 0 0 1 5.17-2.69\", key: \"1dl1wf\" }],\n [\"path\", { d: \"M19 12.859a10 10 0 0 0-2.007-1.523\", key: \"4k23kn\" }],\n [\"path\", { d: \"M2 8.82a15 15 0 0 1 4.177-2.643\", key: \"1grhjp\" }],\n [\"path\", { d: \"M22 8.82a15 15 0 0 0-11.288-3.764\", key: \"z3jwby\" }],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { WifiOff as default };\n//# sourceMappingURL=wifi-off.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 Wifi = createLucideIcon(\"wifi\", [\n [\"path\", { d: \"M12 20h.01\", key: \"zekei9\" }],\n [\"path\", { d: \"M2 8.82a15 15 0 0 1 20 0\", key: \"dnpr2z\" }],\n [\"path\", { d: \"M5 12.859a10 10 0 0 1 14 0\", key: \"1x1e6c\" }],\n [\"path\", { d: \"M8.5 16.429a5 5 0 0 1 7 0\", key: \"1bycff\" }]\n]);\n\nexport { Wifi as default };\n//# sourceMappingURL=wifi.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 Zap = createLucideIcon(\"zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * useWebSocket Composable\n *\n * What: Provides reactive WebSocket connection management for the DevTools SPA\n * How: Manages WebSocket lifecycle with auto-reconnect and event subscription\n * Why: Enables real-time communication between DevTools and the mock server\n *\n * @module composables/useWebSocket\n */\n\nimport type { ComputedRef } from 'vue';\nimport { computed, getCurrentInstance, onMounted, ref } from 'vue';\n\n/**\n * Server event types that can be received from the server\n * These match the ServerEvent types defined in @websublime/vite-plugin-open-api-core\n */\nexport type ServerEventType =\n | 'connected'\n | 'request'\n | 'response'\n | 'timeline:cleared'\n | 'store:updated'\n | 'handler:reloaded'\n | 'handlers:updated'\n | 'seed:reloaded'\n | 'seeds:updated'\n | 'simulation:active'\n | 'simulation:added'\n | 'simulation:removed'\n | 'simulations:cleared'\n | 'registry'\n | 'timeline'\n | 'store'\n | 'store:set'\n | 'store:cleared'\n | 'simulation:set'\n | 'simulation:cleared'\n | 'reseeded'\n | 'error';\n\n/**\n * Server event structure\n */\nexport interface ServerEvent<T = unknown> {\n type: ServerEventType;\n data: T;\n}\n\n/**\n * Connected event data\n */\nexport interface ConnectedEventData {\n serverVersion: string;\n}\n\n/**\n * Client command types that can be sent to the server\n */\nexport type ClientCommandType =\n | 'get:registry'\n | 'get:timeline'\n | 'get:store'\n | 'set:store'\n | 'clear:store'\n | 'set:simulation'\n | 'clear:simulation'\n | 'clear:timeline'\n | 'reseed';\n\n/**\n * Client command structure\n */\nexport interface ClientCommand<T = unknown> {\n type: ClientCommandType;\n data?: T;\n}\n\n/**\n * WebSocket connection state\n */\nexport type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';\n\n/**\n * Event handler function type\n */\nexport type EventHandler<T = unknown> = (data: T) => void;\n\n/**\n * Configuration options for useWebSocket\n */\nexport interface UseWebSocketOptions {\n /**\n * WebSocket URL path (default: '/_ws')\n */\n path?: string;\n\n /**\n * Reconnection delay in milliseconds (default: 2000)\n */\n reconnectDelay?: number;\n\n /**\n * Maximum reconnection attempts (default: Infinity)\n */\n maxReconnectAttempts?: number;\n\n /**\n * Whether to auto-connect on mount (default: true)\n */\n autoConnect?: boolean;\n}\n\n/**\n * Return type for useWebSocket composable\n *\n * Provides explicit typing for the composable return value as required by CLAUDE.md\n */\nexport interface UseWebSocketReturn {\n /** Current connection state */\n connectionState: ComputedRef<ConnectionState>;\n /** Whether the WebSocket is connected */\n connected: ComputedRef<boolean>;\n /** Whether the WebSocket is attempting to reconnect */\n isReconnecting: ComputedRef<boolean>;\n /** Server version received on connection */\n serverVersion: ComputedRef<string | null>;\n /** Number of reconnection attempts made */\n reconnectAttempts: ComputedRef<number>;\n /** Connect to the WebSocket server */\n connect: () => void;\n /** Disconnect from the WebSocket server */\n disconnect: () => void;\n /** Send a command to the server */\n send: <T = unknown>(command: ClientCommand<T>) => boolean;\n /** Subscribe to a server event */\n on: <T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>) => () => void;\n /** Unsubscribe from a server event */\n off: <T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>) => void;\n /**\n * Subscribe to an event and automatically unsubscribe after the first invocation.\n * This is a standard one-shot subscription.\n */\n once: <T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>) => () => void;\n /**\n * Subscribe to an event and unsubscribe when the handler returns true.\n * Useful for conditional one-time events where you need to wait for specific data.\n */\n onUntil: <T = unknown>(\n event: ServerEventType | '*',\n handler: (data: T) => boolean | undefined,\n ) => () => void;\n /** Reset the composable state (useful for testing) */\n resetState: () => void;\n}\n\n/**\n * Default options\n */\nconst DEFAULT_OPTIONS: Required<UseWebSocketOptions> = {\n path: '/_ws',\n reconnectDelay: 2000,\n maxReconnectAttempts: Number.POSITIVE_INFINITY,\n autoConnect: true,\n};\n\n/**\n * Singleton state for WebSocket - shared across all component instances\n */\nconst connectionState = ref<ConnectionState>('disconnected');\nconst serverVersion = ref<string | null>(null);\nconst reconnectAttempts = ref(0);\n\n/**\n * Store the WebSocket instance and configuration\n */\nlet ws: WebSocket | null = null;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet currentOptions: Required<UseWebSocketOptions> = { ...DEFAULT_OPTIONS };\n\n/**\n * Flag to track if options have been initialized\n * Options are only set on the first call to useWebSocket or when disconnected\n */\nlet optionsInitialized = false;\n\n/**\n * Event handlers map - stores handlers for each event type\n */\nconst eventHandlers = new Map<string, Set<EventHandler>>();\n\n/**\n * Check if we're running in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof WebSocket !== 'undefined';\n}\n\n/**\n * Check if we're inside a Vue component context\n */\nfunction hasComponentContext(): boolean {\n return getCurrentInstance() !== null;\n}\n\n/**\n * Build the WebSocket URL based on current location\n */\nfunction buildWebSocketUrl(path: string): string {\n if (!isBrowser()) {\n return `ws://localhost${path}`;\n }\n\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n return `${protocol}//${window.location.host}${path}`;\n}\n\n/**\n * Clear the reconnect timer if active\n */\nfunction clearReconnectTimer(): void {\n if (reconnectTimer !== null) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n}\n\n/**\n * Dispatch an event to all registered handlers\n */\nfunction dispatchEvent(type: string, data: unknown): void {\n const handlers = eventHandlers.get(type);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`[DevTools WebSocket] Error in event handler for '${type}':`, error);\n }\n }\n }\n\n // Also dispatch to wildcard handlers\n const wildcardHandlers = eventHandlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n try {\n handler({ type, data });\n } catch (error) {\n console.error('[DevTools WebSocket] Error in wildcard event handler:', error);\n }\n }\n }\n}\n\n/**\n * Handle WebSocket open event\n */\nfunction handleOpen(): void {\n connectionState.value = 'connected';\n reconnectAttempts.value = 0;\n clearReconnectTimer();\n\n if (import.meta.env.DEV) {\n console.log('[DevTools WebSocket] Connected');\n }\n}\n\n/**\n * Handle WebSocket message event\n */\nfunction handleMessage(event: MessageEvent): void {\n try {\n const message = JSON.parse(event.data) as ServerEvent;\n\n // Handle connected event specially to extract server version\n if (message.type === 'connected') {\n const connectedData = message.data as ConnectedEventData;\n serverVersion.value = connectedData.serverVersion;\n\n if (import.meta.env.DEV) {\n console.log(`[DevTools WebSocket] Server version: ${connectedData.serverVersion}`);\n }\n }\n\n // Dispatch to registered handlers\n dispatchEvent(message.type, message.data);\n } catch (error) {\n console.error('[DevTools WebSocket] Failed to parse message:', error);\n }\n}\n\n/**\n * Handle WebSocket close event\n */\nfunction handleClose(): void {\n const wasConnected = connectionState.value === 'connected';\n connectionState.value = 'disconnected';\n ws = null;\n\n if (wasConnected && import.meta.env.DEV) {\n console.log('[DevTools WebSocket] Disconnected');\n }\n\n // Attempt to reconnect if within limits\n if (reconnectAttempts.value < currentOptions.maxReconnectAttempts) {\n connectionState.value = 'reconnecting';\n reconnectAttempts.value++;\n\n if (import.meta.env.DEV) {\n console.log(\n `[DevTools WebSocket] Reconnecting in ${currentOptions.reconnectDelay}ms (attempt ${reconnectAttempts.value})`,\n );\n }\n\n reconnectTimer = setTimeout(() => {\n connect();\n }, currentOptions.reconnectDelay);\n } else if (import.meta.env.DEV) {\n console.warn('[DevTools WebSocket] Max reconnection attempts reached');\n }\n}\n\n/**\n * Handle WebSocket error event\n */\nfunction handleError(event: Event): void {\n console.error('[DevTools WebSocket] Error:', event);\n}\n\n/**\n * Connect to the WebSocket server\n */\nfunction connect(): void {\n if (!isBrowser()) {\n if (import.meta.env.DEV) {\n console.warn('[DevTools WebSocket] Cannot connect outside browser environment');\n }\n return;\n }\n\n // Don't connect if already connected or connecting\n // Check connectionState first to prevent race condition when connect() is called rapidly\n if (\n connectionState.value === 'connecting' ||\n connectionState.value === 'connected' ||\n (ws && (ws.readyState === WebSocket.CONNECTING || ws.readyState === WebSocket.OPEN))\n ) {\n return;\n }\n\n // Clean up existing connection without resetting reconnect state\n cleanupConnection();\n\n connectionState.value = 'connecting';\n const url = buildWebSocketUrl(currentOptions.path);\n\n try {\n ws = new WebSocket(url);\n ws.onopen = handleOpen;\n ws.onmessage = handleMessage;\n ws.onclose = handleClose;\n ws.onerror = handleError;\n } catch (error) {\n console.error('[DevTools WebSocket] Failed to create WebSocket:', error);\n connectionState.value = 'disconnected';\n }\n}\n\n/**\n * Clean up WebSocket connection without resetting reconnect state.\n * Used internally when reconnecting.\n */\nfunction cleanupConnection(): void {\n if (ws) {\n // Remove event handlers to prevent close handler from triggering reconnect\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close();\n }\n\n ws = null;\n }\n}\n\n/**\n * Disconnect from the WebSocket server\n */\nfunction disconnect(): void {\n clearReconnectTimer();\n cleanupConnection();\n\n connectionState.value = 'disconnected';\n reconnectAttempts.value = 0;\n}\n\n/**\n * Send a command to the server\n *\n * @param command - The command to send\n * @returns true if the command was sent, false otherwise\n */\nfunction send<T = unknown>(command: ClientCommand<T>): boolean {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n if (import.meta.env.DEV) {\n console.warn('[DevTools WebSocket] Cannot send command - not connected');\n }\n return false;\n }\n\n try {\n ws.send(JSON.stringify(command));\n return true;\n } catch (error) {\n console.error('[DevTools WebSocket] Failed to send command:', error);\n return false;\n }\n}\n\n/**\n * Subscribe to a server event\n *\n * @param event - The event type to subscribe to (or '*' for all events)\n * @param handler - The handler function to call when the event is received\n * @returns An unsubscribe function\n */\nfunction on<T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>): () => void {\n if (!eventHandlers.has(event)) {\n eventHandlers.set(event, new Set());\n }\n\n const handlers = eventHandlers.get(event);\n if (handlers) {\n handlers.add(handler as EventHandler);\n }\n\n // Return unsubscribe function\n return () => {\n const currentHandlers = eventHandlers.get(event);\n if (currentHandlers) {\n currentHandlers.delete(handler as EventHandler);\n if (currentHandlers.size === 0) {\n eventHandlers.delete(event);\n }\n }\n };\n}\n\n/**\n * Unsubscribe from a server event\n *\n * @param event - The event type to unsubscribe from\n * @param handler - The handler function to remove\n */\nfunction off<T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>): void {\n const handlers = eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n eventHandlers.delete(event);\n }\n }\n}\n\n/**\n * Subscribe to an event and automatically unsubscribe after the first invocation.\n * This is a standard one-shot subscription - the handler is called exactly once.\n *\n * @param event - The event type to subscribe to\n * @param handler - The handler function to call once\n * @returns An unsubscribe function (can be used to cancel before the event fires)\n *\n * @example\n * ```typescript\n * // Wait for the first 'connected' event\n * once('connected', (data) => {\n * console.log('Connected with version:', data.serverVersion);\n * });\n * ```\n */\nfunction once<T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>): () => void {\n const wrappedHandler: EventHandler<T> = (data) => {\n off(event, wrappedHandler);\n handler(data);\n };\n\n return on(event, wrappedHandler);\n}\n\n/**\n * Subscribe to an event and unsubscribe when the handler returns true.\n * Useful for conditional one-time events where you need to wait for specific data.\n *\n * @param event - The event type to subscribe to\n * @param handler - The handler function that returns true to unsubscribe\n * @returns An unsubscribe function\n *\n * @example\n * ```typescript\n * // Wait until we receive a response with status 200\n * onUntil('response', (data) => {\n * if (data.status === 200) {\n * console.log('Success response received');\n * return true; // Unsubscribe\n * }\n * return false; // Keep listening\n * });\n * ```\n */\nfunction onUntil<T = unknown>(\n event: ServerEventType | '*',\n handler: (data: T) => boolean | undefined,\n): () => void {\n const wrappedHandler: EventHandler<T> = (data) => {\n const result = handler(data);\n if (result === true) {\n off(event, wrappedHandler);\n }\n };\n\n return on(event, wrappedHandler);\n}\n\n/**\n * Reset the composable state (useful for testing)\n */\nfunction resetState(): void {\n disconnect();\n serverVersion.value = null;\n eventHandlers.clear();\n currentOptions = { ...DEFAULT_OPTIONS };\n optionsInitialized = false;\n}\n\n/**\n * useWebSocket composable\n *\n * Provides WebSocket connection management functionality including:\n * - Reactive connection state\n * - Auto-reconnect with configurable delay\n * - Event subscription system\n * - Command sending\n *\n * @param options - Configuration options\n * @returns WebSocket management utilities\n */\nexport function useWebSocket(options: UseWebSocketOptions = {}): UseWebSocketReturn {\n // Only merge options when not connected and not initialized, or when disconnected\n // This prevents race conditions when multiple components pass different options\n if (!optionsInitialized || connectionState.value === 'disconnected') {\n currentOptions = { ...DEFAULT_OPTIONS, ...options };\n optionsInitialized = true;\n }\n\n /**\n * Computed property indicating if the WebSocket is connected\n */\n const connected = computed(() => connectionState.value === 'connected');\n\n /**\n * Computed property indicating if the WebSocket is attempting to reconnect\n */\n const isReconnecting = computed(() => connectionState.value === 'reconnecting');\n\n // Note: We don't disconnect on component unmount because this is singleton state\n // and other components may still be using the connection.\n // The connection will be cleaned up when the page unloads.\n\n // Only register lifecycle hooks when inside a Vue component context\n if (hasComponentContext()) {\n onMounted(() => {\n if (currentOptions.autoConnect) {\n connect();\n }\n });\n }\n\n return {\n /**\n * Current connection state\n */\n connectionState: computed(() => connectionState.value),\n\n /**\n * Whether the WebSocket is connected\n */\n connected,\n\n /**\n * Whether the WebSocket is attempting to reconnect\n */\n isReconnecting,\n\n /**\n * Server version received on connection\n */\n serverVersion: computed(() => serverVersion.value),\n\n /**\n * Number of reconnection attempts made\n */\n reconnectAttempts: computed(() => reconnectAttempts.value),\n\n /**\n * Connect to the WebSocket server\n */\n connect,\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect,\n\n /**\n * Send a command to the server\n */\n send,\n\n /**\n * Subscribe to a server event\n */\n on,\n\n /**\n * Unsubscribe from a server event\n */\n off,\n\n /**\n * Subscribe to an event once (one-shot, auto-unsubscribes after first call)\n */\n once,\n\n /**\n * Subscribe to an event until handler returns true\n */\n onUntil,\n\n /**\n * Reset the composable state (useful for testing)\n */\n resetState,\n };\n}\n","/**\n * Vue Router Configuration\n *\n * What: Defines routing configuration for the DevTools SPA\n * How: Creates routes for each main page/tab in the application\n * Why: Enables navigation between different DevTools features\n */\n\nimport { createRouter, createWebHashHistory, type RouteRecordRaw } from 'vue-router';\n\n/**\n * Route definitions for the DevTools SPA\n *\n * Each route corresponds to a tab in the DevTools interface:\n * - Routes: Endpoint listing and details\n * - Timeline: Request/response log with real-time updates\n * - Models: Store data editor for viewing/modifying mock data\n * - Simulator: Error simulation controls\n */\nconst routes: RouteRecordRaw[] = [\n {\n path: '/',\n redirect: '/routes',\n },\n {\n path: '/routes',\n name: 'routes',\n component: () => import('@/pages/RoutesPage.vue'),\n meta: {\n title: 'Routes',\n icon: 'route',\n },\n },\n {\n path: '/timeline',\n name: 'timeline',\n component: () => import('@/pages/TimelinePage.vue'),\n meta: {\n title: 'Timeline',\n icon: 'clock',\n },\n },\n {\n path: '/models',\n name: 'models',\n component: () => import('@/pages/ModelsPage.vue'),\n meta: {\n title: 'Models',\n icon: 'database',\n },\n },\n {\n path: '/simulator',\n name: 'simulator',\n component: () => import('@/pages/SimulatorPage.vue'),\n meta: {\n title: 'Simulator',\n icon: 'zap',\n },\n },\n // Catch-all route for undefined paths - redirects to routes page\n {\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n redirect: '/routes',\n },\n];\n\n/**\n * Create the router instance\n *\n * Uses hash history mode for compatibility when embedded in iframes\n * or served from arbitrary paths in the dev server\n */\nconst router = createRouter({\n history: createWebHashHistory(),\n routes,\n});\n\nexport { routes };\nexport default router;\n","<!--\n App.vue - Main Application Component\n\n What: Root component for the DevTools SPA\n How: Provides the main layout with header, tab navigation, and router view\n Why: Acts as the entry point for the Vue application and defines the overall structure\n-->\n\n<script setup lang=\"ts\">\nimport { Clock, Database, Route, Wifi, WifiOff, Zap } from 'lucide-vue-next';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useWebSocket } from '@/composables/useWebSocket';\nimport { routes } from '@/router';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Navigation tabs derived from routes\nconst tabs = computed(() =>\n routes\n .filter((r) => r.name && r.meta?.title)\n .map((r) => ({\n name: r.name as string,\n path: r.path,\n title: r.meta?.title as string,\n icon: r.meta?.icon as string,\n })),\n);\n\n// Current active tab\nconst activeTab = computed(() => route.name as string);\n\n// Navigate to a tab\nfunction navigateTo(path: string): void {\n router.push(path);\n}\n\n// Icon component map\nconst iconMap: Record<string, typeof Route> = {\n route: Route,\n clock: Clock,\n database: Database,\n zap: Zap,\n};\n\n// Get icon with fallback for unknown icon names\nfunction getIcon(iconName: string): typeof Route {\n const icon = iconMap[iconName];\n if (!icon && import.meta.env.DEV) {\n console.warn(`[DevTools] Unknown icon name: \"${iconName}\". Using fallback.`);\n }\n return icon ?? Route;\n}\n\n// Connection status from WebSocket composable\nconst { connected: isConnected } = useWebSocket();\n</script>\n\n<template>\n <div class=\"app\">\n <!-- Header with branding and connection status -->\n <header class=\"app-header\">\n <div class=\"app-header__brand\">\n <Zap class=\"app-header__logo\" :size=\"20\" />\n <span class=\"app-header__title\">OpenAPI DevTools</span>\n </div>\n\n <!-- Tab Navigation -->\n <nav class=\"app-nav\" role=\"tablist\" aria-label=\"DevTools navigation\">\n <button\n v-for=\"tab in tabs\"\n :key=\"tab.name\"\n role=\"tab\"\n :aria-selected=\"activeTab === tab.name\"\n :aria-current=\"activeTab === tab.name ? 'true' : undefined\"\n :aria-controls=\"`panel-${tab.name}`\"\n :tabindex=\"0\"\n :class=\"[\n 'app-nav__tab',\n { 'app-nav__tab--active': activeTab === tab.name },\n ]\"\n @click=\"navigateTo(tab.path)\"\n >\n <component\n :is=\"getIcon(tab.icon)\"\n :size=\"16\"\n class=\"app-nav__icon\"\n />\n <span class=\"app-nav__label\">{{ tab.title }}</span>\n </button>\n </nav>\n\n <!-- Connection Status -->\n <div class=\"app-header__status\">\n <div class=\"connection-status\">\n <span\n :class=\"[\n 'connection-status__dot',\n isConnected\n ? 'connection-status__dot--connected'\n : 'connection-status__dot--disconnected',\n ]\"\n />\n <span class=\"connection-status__text\">\n {{ isConnected ? 'Connected' : 'Disconnected' }}\n </span>\n <component\n :is=\"isConnected ? Wifi : WifiOff\"\n :size=\"14\"\n class=\"connection-status__icon\"\n />\n </div>\n </div>\n </header>\n\n <!-- Main Content Area -->\n <main class=\"app-main\">\n <router-view v-slot=\"{ Component }\">\n <transition name=\"fade\" mode=\"out-in\">\n <component :is=\"Component\" />\n </transition>\n </router-view>\n </main>\n </div>\n</template>\n\n<style scoped>\n.app {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background-color: var(--devtools-bg);\n}\n\n/* Header styles */\n.app-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--devtools-header-height);\n padding: 0 var(--devtools-space-md);\n background-color: var(--devtools-surface);\n border-bottom: 1px solid var(--devtools-border);\n position: sticky;\n top: 0;\n z-index: 100;\n}\n\n.app-header__brand {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n}\n\n.app-header__logo {\n color: var(--devtools-primary);\n}\n\n.app-header__title {\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n}\n\n.app-header__status {\n display: flex;\n align-items: center;\n}\n\n/* Navigation styles */\n.app-nav {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n height: 100%;\n}\n\n.app-nav__tab {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n height: 100%;\n padding: 0 var(--devtools-space-md);\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--devtools-text-muted);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.app-nav__tab:hover {\n color: var(--devtools-text);\n background-color: var(--devtools-surface-elevated);\n}\n\n.app-nav__tab:focus {\n outline: none;\n}\n\n.app-nav__tab:focus-visible {\n outline: 2px solid var(--devtools-primary);\n outline-offset: -2px;\n background-color: var(--devtools-surface-elevated);\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .app-nav__tab:focus-visible {\n outline: 3px solid CanvasText;\n outline-offset: 2px;\n }\n}\n\n.app-nav__tab--active {\n color: var(--devtools-primary);\n border-bottom-color: var(--devtools-primary);\n}\n\n.app-nav__tab--active:focus-visible {\n outline-color: var(--devtools-primary-hover);\n}\n\n.app-nav__icon {\n flex-shrink: 0;\n}\n\n.app-nav__label {\n white-space: nowrap;\n}\n\n/* Connection status styles */\n.connection-status {\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.connection-status__icon {\n opacity: 0.7;\n}\n\n/* Main content styles */\n.app-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n</style>\n\n<style>\n/* Page transition - must be unscoped to apply to router-view children */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity var(--devtools-transition-normal);\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","/**\n * Main Entry Point for DevTools SPA\n *\n * What: Initializes and mounts the Vue application\n * How: Creates Vue app instance with Pinia and Vue Router\n * Why: Required entry point for the DevTools SPA\n */\n\nimport { createPinia } from 'pinia';\nimport type { App } from 'vue';\nimport { createApp } from 'vue';\n\nimport AppComponent from '@/App.vue';\nimport router from '@/router';\nimport { initializeStores } from '@/stores';\n\n// Import global styles\nimport '@/assets/main.css';\n\n/**\n * Module-scoped guard to ensure bootstrap only runs once\n */\nlet isBootstrapped = false;\nlet appInstance: App | null = null;\n\n/**\n * Create and configure the Vue application\n * This function is idempotent - calling it multiple times has no effect\n * after the first successful call.\n *\n * @returns The Vue app instance, or null if already bootstrapped\n */\nfunction bootstrap(): App | null {\n // Guard against multiple bootstrap calls\n if (isBootstrapped) {\n if (import.meta.env.DEV) {\n console.warn('[OpenAPI DevTools] Application already initialized, skipping bootstrap');\n }\n return appInstance;\n }\n\n // Create Vue app instance\n const app = createApp(AppComponent);\n\n // Create Pinia store instance\n const pinia = createPinia();\n\n // Install plugins\n app.use(pinia);\n app.use(router);\n\n // Initialize stores after Pinia is installed\n initializeStores();\n\n // Mount the app to the DOM\n app.mount('#app');\n\n // Mark as bootstrapped and store the instance\n isBootstrapped = true;\n appInstance = app;\n\n // Log startup info in development\n if (import.meta.env.DEV) {\n console.log('[OpenAPI DevTools] Application initialized');\n }\n\n return app;\n}\n\n// Only auto-bootstrap when running as standalone app (index.html entry)\n// When imported as a library, consumers should call bootstrap() manually\nif (typeof window !== 'undefined' && document.getElementById('app')) {\n bootstrap();\n}\n\n/**\n * Export the bootstrap function for library consumers\n * who may want to manually initialize the DevTools\n */\nexport { bootstrap };\n\nexport type {\n ClientCommand,\n ClientCommandType,\n ConnectedEventData,\n ConnectionState,\n EventHandler,\n ServerEvent,\n ServerEventType,\n ThemeMode,\n UseWebSocketOptions,\n UseWebSocketReturn,\n} from '@/composables';\n// Re-export composables for library consumers\nexport { useTheme, useWebSocket } from '@/composables';\n"],"file":"index-Dff2RvrN.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","defaultAttributes","Icon","size","strokeWidth","absoluteStrokeWidth","color","iconNode","name","props","slots","h","child","createLucideIcon","iconName","Clock","Database","Route","WifiOff","Wifi","Zap","DEFAULT_OPTIONS","connectionState","ref","serverVersion","reconnectAttempts","ws","reconnectTimer","currentOptions","optionsInitialized","eventHandlers","isBrowser","hasComponentContext","getCurrentInstance","buildWebSocketUrl","path","clearReconnectTimer","dispatchEvent","type","data","handlers","handler","error","wildcardHandlers","handleOpen","handleMessage","event","message","connectedData","handleClose","connect","handleError","cleanupConnection","url","disconnect","send","command","on","currentHandlers","off","once","wrappedHandler","onUntil","resetState","useWebSocket","options","connected","computed","isReconnecting","onMounted","routes","router","createRouter","createWebHashHistory","route","useRoute","useRouter","tabs","r","activeTab","navigateTo","iconMap","getIcon","isConnected","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_createVNode","_unref","_cache","_hoisted_4","_Fragment","_renderList","tab","_normalizeClass","$event","_createBlock","_resolveDynamicComponent","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_component_router_view","_withCtx","Component","_Transition","isBootstrapped","appInstance","bootstrap","app","createApp","AppComponent","pinia","createPinia"],"ignoreList":[0,1,2,3,4,5,6,7,8,9],"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/shared/src/utils.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/defaultAttributes.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/Icon.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/createLucideIcon.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/clock.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/database.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/route.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/wifi-off.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/wifi.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/zap.js","../../../src/composables/useWebSocket.ts","../../../src/router.ts","../../../src/App.vue","../../../src/main.ts"],"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\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.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\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.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 { h } from 'vue';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport defaultAttributes from './defaultAttributes.js';\n\nconst Icon = ({ size, strokeWidth = 2, absoluteStrokeWidth, color, iconNode, name, class: classes, ...props }, { slots }) => {\n return h(\n \"svg\",\n {\n ...defaultAttributes,\n width: size || defaultAttributes.width,\n height: size || defaultAttributes.height,\n stroke: color || defaultAttributes.stroke,\n \"stroke-width\": absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n class: mergeClasses(\n \"lucide\",\n ...name ? [`lucide-${toKebabCase(toPascalCase(name))}-icon`, `lucide-${toKebabCase(name)}`] : [\"lucide-icon\"]\n ),\n ...props\n },\n [...iconNode.map((child) => h(...child)), ...slots.default ? [slots.default()] : []]\n );\n};\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.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 { h } from 'vue';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => (props, { slots }) => h(\n Icon,\n {\n ...props,\n iconNode,\n name: iconName\n },\n slots\n);\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.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 Clock = createLucideIcon(\"clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.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 Database = createLucideIcon(\"database\", [\n [\"ellipse\", { cx: \"12\", cy: \"5\", rx: \"9\", ry: \"3\", key: \"msslwz\" }],\n [\"path\", { d: \"M3 5V19A9 3 0 0 0 21 19V5\", key: \"1wlel7\" }],\n [\"path\", { d: \"M3 12A9 3 0 0 0 21 12\", key: \"mv7ke4\" }]\n]);\n\nexport { Database as default };\n//# sourceMappingURL=database.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 Route = createLucideIcon(\"route\", [\n [\"circle\", { cx: \"6\", cy: \"19\", r: \"3\", key: \"1kj8tv\" }],\n [\"path\", { d: \"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\", key: \"1d8sl\" }],\n [\"circle\", { cx: \"18\", cy: \"5\", r: \"3\", key: \"gq8acd\" }]\n]);\n\nexport { Route as default };\n//# sourceMappingURL=route.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 WifiOff = createLucideIcon(\"wifi-off\", [\n [\"path\", { d: \"M12 20h.01\", key: \"zekei9\" }],\n [\"path\", { d: \"M8.5 16.429a5 5 0 0 1 7 0\", key: \"1bycff\" }],\n [\"path\", { d: \"M5 12.859a10 10 0 0 1 5.17-2.69\", key: \"1dl1wf\" }],\n [\"path\", { d: \"M19 12.859a10 10 0 0 0-2.007-1.523\", key: \"4k23kn\" }],\n [\"path\", { d: \"M2 8.82a15 15 0 0 1 4.177-2.643\", key: \"1grhjp\" }],\n [\"path\", { d: \"M22 8.82a15 15 0 0 0-11.288-3.764\", key: \"z3jwby\" }],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { WifiOff as default };\n//# sourceMappingURL=wifi-off.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 Wifi = createLucideIcon(\"wifi\", [\n [\"path\", { d: \"M12 20h.01\", key: \"zekei9\" }],\n [\"path\", { d: \"M2 8.82a15 15 0 0 1 20 0\", key: \"dnpr2z\" }],\n [\"path\", { d: \"M5 12.859a10 10 0 0 1 14 0\", key: \"1x1e6c\" }],\n [\"path\", { d: \"M8.5 16.429a5 5 0 0 1 7 0\", key: \"1bycff\" }]\n]);\n\nexport { Wifi as default };\n//# sourceMappingURL=wifi.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 Zap = createLucideIcon(\"zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * useWebSocket Composable\n *\n * What: Provides reactive WebSocket connection management for the DevTools SPA\n * How: Manages WebSocket lifecycle with auto-reconnect and event subscription\n * Why: Enables real-time communication between DevTools and the mock server\n *\n * @module composables/useWebSocket\n */\n\nimport type { ComputedRef } from 'vue';\nimport { computed, getCurrentInstance, onMounted, ref } from 'vue';\n\n/**\n * Server event types that can be received from the server\n * These match the ServerEvent types defined in @websublime/vite-plugin-open-api-core\n */\nexport type ServerEventType =\n | 'connected'\n | 'request'\n | 'response'\n | 'timeline:cleared'\n | 'store:updated'\n | 'handler:reloaded'\n | 'handlers:updated'\n | 'seed:reloaded'\n | 'seeds:updated'\n | 'simulation:active'\n | 'simulation:added'\n | 'simulation:removed'\n | 'simulations:cleared'\n | 'registry'\n | 'timeline'\n | 'store'\n | 'store:set'\n | 'store:cleared'\n | 'simulation:set'\n | 'simulation:cleared'\n | 'reseeded'\n | 'error';\n\n/**\n * Server event structure\n */\nexport interface ServerEvent<T = unknown> {\n type: ServerEventType;\n data: T;\n}\n\n/**\n * Connected event data\n */\nexport interface ConnectedEventData {\n serverVersion: string;\n}\n\n/**\n * Client command types that can be sent to the server\n */\nexport type ClientCommandType =\n | 'get:registry'\n | 'get:timeline'\n | 'get:store'\n | 'set:store'\n | 'clear:store'\n | 'set:simulation'\n | 'clear:simulation'\n | 'clear:timeline'\n | 'reseed';\n\n/**\n * Client command structure\n */\nexport interface ClientCommand<T = unknown> {\n type: ClientCommandType;\n data?: T;\n}\n\n/**\n * WebSocket connection state\n */\nexport type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';\n\n/**\n * Event handler function type\n */\nexport type EventHandler<T = unknown> = (data: T) => void;\n\n/**\n * Configuration options for useWebSocket\n */\nexport interface UseWebSocketOptions {\n /**\n * WebSocket URL path (default: '/_ws')\n */\n path?: string;\n\n /**\n * Reconnection delay in milliseconds (default: 2000)\n */\n reconnectDelay?: number;\n\n /**\n * Maximum reconnection attempts (default: Infinity)\n */\n maxReconnectAttempts?: number;\n\n /**\n * Whether to auto-connect on mount (default: true)\n */\n autoConnect?: boolean;\n}\n\n/**\n * Return type for useWebSocket composable\n *\n * Provides explicit typing for the composable return value as required by CLAUDE.md\n */\nexport interface UseWebSocketReturn {\n /** Current connection state */\n connectionState: ComputedRef<ConnectionState>;\n /** Whether the WebSocket is connected */\n connected: ComputedRef<boolean>;\n /** Whether the WebSocket is attempting to reconnect */\n isReconnecting: ComputedRef<boolean>;\n /** Server version received on connection */\n serverVersion: ComputedRef<string | null>;\n /** Number of reconnection attempts made */\n reconnectAttempts: ComputedRef<number>;\n /** Connect to the WebSocket server */\n connect: () => void;\n /** Disconnect from the WebSocket server */\n disconnect: () => void;\n /** Send a command to the server */\n send: <T = unknown>(command: ClientCommand<T>) => boolean;\n /** Subscribe to a server event */\n on: <T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>) => () => void;\n /** Unsubscribe from a server event */\n off: <T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>) => void;\n /**\n * Subscribe to an event and automatically unsubscribe after the first invocation.\n * This is a standard one-shot subscription.\n */\n once: <T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>) => () => void;\n /**\n * Subscribe to an event and unsubscribe when the handler returns true.\n * Useful for conditional one-time events where you need to wait for specific data.\n */\n onUntil: <T = unknown>(\n event: ServerEventType | '*',\n handler: (data: T) => boolean | undefined,\n ) => () => void;\n /** Reset the composable state (useful for testing) */\n resetState: () => void;\n}\n\n/**\n * Default options\n */\nconst DEFAULT_OPTIONS: Required<UseWebSocketOptions> = {\n path: '/_ws',\n reconnectDelay: 2000,\n maxReconnectAttempts: Number.POSITIVE_INFINITY,\n autoConnect: true,\n};\n\n/**\n * Singleton state for WebSocket - shared across all component instances\n */\nconst connectionState = ref<ConnectionState>('disconnected');\nconst serverVersion = ref<string | null>(null);\nconst reconnectAttempts = ref(0);\n\n/**\n * Store the WebSocket instance and configuration\n */\nlet ws: WebSocket | null = null;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet currentOptions: Required<UseWebSocketOptions> = { ...DEFAULT_OPTIONS };\n\n/**\n * Flag to track if options have been initialized\n * Options are only set on the first call to useWebSocket or when disconnected\n */\nlet optionsInitialized = false;\n\n/**\n * Event handlers map - stores handlers for each event type\n */\nconst eventHandlers = new Map<string, Set<EventHandler>>();\n\n/**\n * Check if we're running in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof WebSocket !== 'undefined';\n}\n\n/**\n * Check if we're inside a Vue component context\n */\nfunction hasComponentContext(): boolean {\n return getCurrentInstance() !== null;\n}\n\n/**\n * Build the WebSocket URL based on current location\n */\nfunction buildWebSocketUrl(path: string): string {\n if (!isBrowser()) {\n return `ws://localhost${path}`;\n }\n\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n return `${protocol}//${window.location.host}${path}`;\n}\n\n/**\n * Clear the reconnect timer if active\n */\nfunction clearReconnectTimer(): void {\n if (reconnectTimer !== null) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n}\n\n/**\n * Dispatch an event to all registered handlers\n */\nfunction dispatchEvent(type: string, data: unknown): void {\n const handlers = eventHandlers.get(type);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`[DevTools WebSocket] Error in event handler for '${type}':`, error);\n }\n }\n }\n\n // Also dispatch to wildcard handlers\n const wildcardHandlers = eventHandlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n try {\n handler({ type, data });\n } catch (error) {\n console.error('[DevTools WebSocket] Error in wildcard event handler:', error);\n }\n }\n }\n}\n\n/**\n * Handle WebSocket open event\n */\nfunction handleOpen(): void {\n connectionState.value = 'connected';\n reconnectAttempts.value = 0;\n clearReconnectTimer();\n\n if (import.meta.env.DEV) {\n console.log('[DevTools WebSocket] Connected');\n }\n}\n\n/**\n * Handle WebSocket message event\n */\nfunction handleMessage(event: MessageEvent): void {\n try {\n const message = JSON.parse(event.data) as ServerEvent;\n\n // Handle connected event specially to extract server version\n if (message.type === 'connected') {\n const connectedData = message.data as ConnectedEventData;\n serverVersion.value = connectedData.serverVersion;\n\n if (import.meta.env.DEV) {\n console.log(`[DevTools WebSocket] Server version: ${connectedData.serverVersion}`);\n }\n }\n\n // Dispatch to registered handlers\n dispatchEvent(message.type, message.data);\n } catch (error) {\n console.error('[DevTools WebSocket] Failed to parse message:', error);\n }\n}\n\n/**\n * Handle WebSocket close event\n */\nfunction handleClose(): void {\n const wasConnected = connectionState.value === 'connected';\n connectionState.value = 'disconnected';\n ws = null;\n\n if (wasConnected && import.meta.env.DEV) {\n console.log('[DevTools WebSocket] Disconnected');\n }\n\n // Attempt to reconnect if within limits\n if (reconnectAttempts.value < currentOptions.maxReconnectAttempts) {\n connectionState.value = 'reconnecting';\n reconnectAttempts.value++;\n\n if (import.meta.env.DEV) {\n console.log(\n `[DevTools WebSocket] Reconnecting in ${currentOptions.reconnectDelay}ms (attempt ${reconnectAttempts.value})`,\n );\n }\n\n reconnectTimer = setTimeout(() => {\n connect();\n }, currentOptions.reconnectDelay);\n } else if (import.meta.env.DEV) {\n console.warn('[DevTools WebSocket] Max reconnection attempts reached');\n }\n}\n\n/**\n * Handle WebSocket error event\n */\nfunction handleError(event: Event): void {\n console.error('[DevTools WebSocket] Error:', event);\n}\n\n/**\n * Connect to the WebSocket server\n */\nfunction connect(): void {\n if (!isBrowser()) {\n if (import.meta.env.DEV) {\n console.warn('[DevTools WebSocket] Cannot connect outside browser environment');\n }\n return;\n }\n\n // Don't connect if already connected or connecting\n // Check connectionState first to prevent race condition when connect() is called rapidly\n if (\n connectionState.value === 'connecting' ||\n connectionState.value === 'connected' ||\n (ws && (ws.readyState === WebSocket.CONNECTING || ws.readyState === WebSocket.OPEN))\n ) {\n return;\n }\n\n // Clean up existing connection without resetting reconnect state\n cleanupConnection();\n\n connectionState.value = 'connecting';\n const url = buildWebSocketUrl(currentOptions.path);\n\n try {\n ws = new WebSocket(url);\n ws.onopen = handleOpen;\n ws.onmessage = handleMessage;\n ws.onclose = handleClose;\n ws.onerror = handleError;\n } catch (error) {\n console.error('[DevTools WebSocket] Failed to create WebSocket:', error);\n connectionState.value = 'disconnected';\n }\n}\n\n/**\n * Clean up WebSocket connection without resetting reconnect state.\n * Used internally when reconnecting.\n */\nfunction cleanupConnection(): void {\n if (ws) {\n // Remove event handlers to prevent close handler from triggering reconnect\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close();\n }\n\n ws = null;\n }\n}\n\n/**\n * Disconnect from the WebSocket server\n */\nfunction disconnect(): void {\n clearReconnectTimer();\n cleanupConnection();\n\n connectionState.value = 'disconnected';\n reconnectAttempts.value = 0;\n}\n\n/**\n * Send a command to the server\n *\n * @param command - The command to send\n * @returns true if the command was sent, false otherwise\n */\nfunction send<T = unknown>(command: ClientCommand<T>): boolean {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n if (import.meta.env.DEV) {\n console.warn('[DevTools WebSocket] Cannot send command - not connected');\n }\n return false;\n }\n\n try {\n ws.send(JSON.stringify(command));\n return true;\n } catch (error) {\n console.error('[DevTools WebSocket] Failed to send command:', error);\n return false;\n }\n}\n\n/**\n * Subscribe to a server event\n *\n * @param event - The event type to subscribe to (or '*' for all events)\n * @param handler - The handler function to call when the event is received\n * @returns An unsubscribe function\n */\nfunction on<T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>): () => void {\n if (!eventHandlers.has(event)) {\n eventHandlers.set(event, new Set());\n }\n\n const handlers = eventHandlers.get(event);\n if (handlers) {\n handlers.add(handler as EventHandler);\n }\n\n // Return unsubscribe function\n return () => {\n const currentHandlers = eventHandlers.get(event);\n if (currentHandlers) {\n currentHandlers.delete(handler as EventHandler);\n if (currentHandlers.size === 0) {\n eventHandlers.delete(event);\n }\n }\n };\n}\n\n/**\n * Unsubscribe from a server event\n *\n * @param event - The event type to unsubscribe from\n * @param handler - The handler function to remove\n */\nfunction off<T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>): void {\n const handlers = eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n eventHandlers.delete(event);\n }\n }\n}\n\n/**\n * Subscribe to an event and automatically unsubscribe after the first invocation.\n * This is a standard one-shot subscription - the handler is called exactly once.\n *\n * @param event - The event type to subscribe to\n * @param handler - The handler function to call once\n * @returns An unsubscribe function (can be used to cancel before the event fires)\n *\n * @example\n * ```typescript\n * // Wait for the first 'connected' event\n * once('connected', (data) => {\n * console.log('Connected with version:', data.serverVersion);\n * });\n * ```\n */\nfunction once<T = unknown>(event: ServerEventType | '*', handler: EventHandler<T>): () => void {\n const wrappedHandler: EventHandler<T> = (data) => {\n off(event, wrappedHandler);\n handler(data);\n };\n\n return on(event, wrappedHandler);\n}\n\n/**\n * Subscribe to an event and unsubscribe when the handler returns true.\n * Useful for conditional one-time events where you need to wait for specific data.\n *\n * @param event - The event type to subscribe to\n * @param handler - The handler function that returns true to unsubscribe\n * @returns An unsubscribe function\n *\n * @example\n * ```typescript\n * // Wait until we receive a response with status 200\n * onUntil('response', (data) => {\n * if (data.status === 200) {\n * console.log('Success response received');\n * return true; // Unsubscribe\n * }\n * return false; // Keep listening\n * });\n * ```\n */\nfunction onUntil<T = unknown>(\n event: ServerEventType | '*',\n handler: (data: T) => boolean | undefined,\n): () => void {\n const wrappedHandler: EventHandler<T> = (data) => {\n const result = handler(data);\n if (result === true) {\n off(event, wrappedHandler);\n }\n };\n\n return on(event, wrappedHandler);\n}\n\n/**\n * Reset the composable state (useful for testing)\n */\nfunction resetState(): void {\n disconnect();\n serverVersion.value = null;\n eventHandlers.clear();\n currentOptions = { ...DEFAULT_OPTIONS };\n optionsInitialized = false;\n}\n\n/**\n * useWebSocket composable\n *\n * Provides WebSocket connection management functionality including:\n * - Reactive connection state\n * - Auto-reconnect with configurable delay\n * - Event subscription system\n * - Command sending\n *\n * @param options - Configuration options\n * @returns WebSocket management utilities\n */\nexport function useWebSocket(options: UseWebSocketOptions = {}): UseWebSocketReturn {\n // Only merge options when not connected and not initialized, or when disconnected\n // This prevents race conditions when multiple components pass different options\n if (!optionsInitialized || connectionState.value === 'disconnected') {\n currentOptions = { ...DEFAULT_OPTIONS, ...options };\n optionsInitialized = true;\n }\n\n /**\n * Computed property indicating if the WebSocket is connected\n */\n const connected = computed(() => connectionState.value === 'connected');\n\n /**\n * Computed property indicating if the WebSocket is attempting to reconnect\n */\n const isReconnecting = computed(() => connectionState.value === 'reconnecting');\n\n // Note: We don't disconnect on component unmount because this is singleton state\n // and other components may still be using the connection.\n // The connection will be cleaned up when the page unloads.\n\n // Only register lifecycle hooks when inside a Vue component context\n if (hasComponentContext()) {\n onMounted(() => {\n if (currentOptions.autoConnect) {\n connect();\n }\n });\n }\n\n return {\n /**\n * Current connection state\n */\n connectionState: computed(() => connectionState.value),\n\n /**\n * Whether the WebSocket is connected\n */\n connected,\n\n /**\n * Whether the WebSocket is attempting to reconnect\n */\n isReconnecting,\n\n /**\n * Server version received on connection\n */\n serverVersion: computed(() => serverVersion.value),\n\n /**\n * Number of reconnection attempts made\n */\n reconnectAttempts: computed(() => reconnectAttempts.value),\n\n /**\n * Connect to the WebSocket server\n */\n connect,\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect,\n\n /**\n * Send a command to the server\n */\n send,\n\n /**\n * Subscribe to a server event\n */\n on,\n\n /**\n * Unsubscribe from a server event\n */\n off,\n\n /**\n * Subscribe to an event once (one-shot, auto-unsubscribes after first call)\n */\n once,\n\n /**\n * Subscribe to an event until handler returns true\n */\n onUntil,\n\n /**\n * Reset the composable state (useful for testing)\n */\n resetState,\n };\n}\n","/**\n * Vue Router Configuration\n *\n * What: Defines routing configuration for the DevTools SPA\n * How: Creates routes for each main page/tab in the application\n * Why: Enables navigation between different DevTools features\n */\n\nimport { createRouter, createWebHashHistory, type RouteRecordRaw } from 'vue-router';\n\n/**\n * Route definitions for the DevTools SPA\n *\n * Each route corresponds to a tab in the DevTools interface:\n * - Routes: Endpoint listing and details\n * - Timeline: Request/response log with real-time updates\n * - Models: Store data editor for viewing/modifying mock data\n * - Simulator: Error simulation controls\n */\nconst routes: RouteRecordRaw[] = [\n {\n path: '/',\n redirect: '/routes',\n },\n {\n path: '/routes',\n name: 'routes',\n component: () => import('@/pages/RoutesPage.vue'),\n meta: {\n title: 'Routes',\n icon: 'route',\n },\n },\n {\n path: '/timeline',\n name: 'timeline',\n component: () => import('@/pages/TimelinePage.vue'),\n meta: {\n title: 'Timeline',\n icon: 'clock',\n },\n },\n {\n path: '/models',\n name: 'models',\n component: () => import('@/pages/ModelsPage.vue'),\n meta: {\n title: 'Models',\n icon: 'database',\n },\n },\n {\n path: '/simulator',\n name: 'simulator',\n component: () => import('@/pages/SimulatorPage.vue'),\n meta: {\n title: 'Simulator',\n icon: 'zap',\n },\n },\n // Catch-all route for undefined paths - redirects to routes page\n {\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n redirect: '/routes',\n },\n];\n\n/**\n * Create the router instance\n *\n * Uses hash history mode for compatibility when embedded in iframes\n * or served from arbitrary paths in the dev server\n */\nconst router = createRouter({\n history: createWebHashHistory(),\n routes,\n});\n\nexport { routes };\nexport default router;\n","<!--\n App.vue - Main Application Component\n\n What: Root component for the DevTools SPA\n How: Provides the main layout with header, tab navigation, and router view\n Why: Acts as the entry point for the Vue application and defines the overall structure\n-->\n\n<script setup lang=\"ts\">\nimport { Clock, Database, Route, Wifi, WifiOff, Zap } from 'lucide-vue-next';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useWebSocket } from '@/composables/useWebSocket';\nimport { routes } from '@/router';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Navigation tabs derived from routes\nconst tabs = computed(() =>\n routes\n .filter((r) => r.name && r.meta?.title)\n .map((r) => ({\n name: r.name as string,\n path: r.path,\n title: r.meta?.title as string,\n icon: r.meta?.icon as string,\n })),\n);\n\n// Current active tab\nconst activeTab = computed(() => route.name as string);\n\n// Navigate to a tab\nfunction navigateTo(path: string): void {\n router.push(path);\n}\n\n// Icon component map\nconst iconMap: Record<string, typeof Route> = {\n route: Route,\n clock: Clock,\n database: Database,\n zap: Zap,\n};\n\n// Get icon with fallback for unknown icon names\nfunction getIcon(iconName: string): typeof Route {\n const icon = iconMap[iconName];\n if (!icon && import.meta.env.DEV) {\n console.warn(`[DevTools] Unknown icon name: \"${iconName}\". Using fallback.`);\n }\n return icon ?? Route;\n}\n\n// Connection status from WebSocket composable\nconst { connected: isConnected } = useWebSocket();\n</script>\n\n<template>\n <div class=\"app\">\n <!-- Header with branding and connection status -->\n <header class=\"app-header\">\n <div class=\"app-header__brand\">\n <Zap class=\"app-header__logo\" :size=\"20\" />\n <span class=\"app-header__title\">OpenAPI DevTools</span>\n </div>\n\n <!-- Tab Navigation -->\n <nav class=\"app-nav\" role=\"tablist\" aria-label=\"DevTools navigation\">\n <button\n v-for=\"tab in tabs\"\n :key=\"tab.name\"\n role=\"tab\"\n :aria-selected=\"activeTab === tab.name\"\n :aria-current=\"activeTab === tab.name ? 'true' : undefined\"\n :aria-controls=\"`panel-${tab.name}`\"\n :tabindex=\"0\"\n :class=\"[\n 'app-nav__tab',\n { 'app-nav__tab--active': activeTab === tab.name },\n ]\"\n @click=\"navigateTo(tab.path)\"\n >\n <component\n :is=\"getIcon(tab.icon)\"\n :size=\"16\"\n class=\"app-nav__icon\"\n />\n <span class=\"app-nav__label\">{{ tab.title }}</span>\n </button>\n </nav>\n\n <!-- Connection Status -->\n <div class=\"app-header__status\">\n <div class=\"connection-status\">\n <span\n :class=\"[\n 'connection-status__dot',\n isConnected\n ? 'connection-status__dot--connected'\n : 'connection-status__dot--disconnected',\n ]\"\n />\n <span class=\"connection-status__text\">\n {{ isConnected ? 'Connected' : 'Disconnected' }}\n </span>\n <component\n :is=\"isConnected ? Wifi : WifiOff\"\n :size=\"14\"\n class=\"connection-status__icon\"\n />\n </div>\n </div>\n </header>\n\n <!-- Main Content Area -->\n <main class=\"app-main\">\n <router-view v-slot=\"{ Component }\">\n <transition name=\"fade\" mode=\"out-in\">\n <component :is=\"Component\" />\n </transition>\n </router-view>\n </main>\n </div>\n</template>\n\n<style scoped>\n.app {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--devtools-bg);\n}\n\n/* Header styles */\n.app-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--devtools-header-height);\n padding: 0 var(--devtools-space-md);\n background-color: var(--devtools-surface);\n border-bottom: 1px solid var(--devtools-border);\n position: sticky;\n top: 0;\n z-index: 100;\n}\n\n.app-header__brand {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n}\n\n.app-header__logo {\n color: var(--devtools-primary);\n}\n\n.app-header__title {\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n}\n\n.app-header__status {\n display: flex;\n align-items: center;\n}\n\n/* Navigation styles */\n.app-nav {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n height: 100%;\n}\n\n.app-nav__tab {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n height: 100%;\n padding: 0 var(--devtools-space-md);\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--devtools-text-muted);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.app-nav__tab:hover {\n color: var(--devtools-text);\n background-color: var(--devtools-surface-elevated);\n}\n\n.app-nav__tab:focus {\n outline: none;\n}\n\n.app-nav__tab:focus-visible {\n outline: 2px solid var(--devtools-primary);\n outline-offset: -2px;\n background-color: var(--devtools-surface-elevated);\n}\n\n/* High contrast mode support */\n@media (forced-colors: active) {\n .app-nav__tab:focus-visible {\n outline: 3px solid CanvasText;\n outline-offset: 2px;\n }\n}\n\n.app-nav__tab--active {\n color: var(--devtools-primary);\n border-bottom-color: var(--devtools-primary);\n}\n\n.app-nav__tab--active:focus-visible {\n outline-color: var(--devtools-primary-hover);\n}\n\n.app-nav__icon {\n flex-shrink: 0;\n}\n\n.app-nav__label {\n white-space: nowrap;\n}\n\n/* Connection status styles */\n.connection-status {\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.connection-status__icon {\n opacity: 0.7;\n}\n\n/* Main content styles */\n.app-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n</style>\n\n<style>\n/* Page transition - must be unscoped to apply to router-view children */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity var(--devtools-transition-normal);\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","/**\n * Main Entry Point for DevTools SPA\n *\n * What: Initializes and mounts the Vue application\n * How: Creates Vue app instance with Pinia and Vue Router\n * Why: Required entry point for the DevTools SPA\n */\n\nimport { createPinia } from 'pinia';\nimport type { App } from 'vue';\nimport { createApp } from 'vue';\n\nimport AppComponent from '@/App.vue';\nimport router from '@/router';\nimport { initializeStores } from '@/stores';\n\n// Import global styles\nimport '@/assets/main.css';\n\n/**\n * Module-scoped guard to ensure bootstrap only runs once\n */\nlet isBootstrapped = false;\nlet appInstance: App | null = null;\n\n/**\n * Create and configure the Vue application\n * This function is idempotent - calling it multiple times has no effect\n * after the first successful call.\n *\n * @returns The Vue app instance, or null if already bootstrapped\n */\nfunction bootstrap(): App | null {\n // Guard against multiple bootstrap calls\n if (isBootstrapped) {\n if (import.meta.env.DEV) {\n console.warn('[OpenAPI DevTools] Application already initialized, skipping bootstrap');\n }\n return appInstance;\n }\n\n // Create Vue app instance\n const app = createApp(AppComponent);\n\n // Create Pinia store instance\n const pinia = createPinia();\n\n // Install plugins\n app.use(pinia);\n app.use(router);\n\n // Initialize stores after Pinia is installed\n initializeStores();\n\n // Mount the app to the DOM\n app.mount('#app');\n\n // Mark as bootstrapped and store the instance\n isBootstrapped = true;\n appInstance = app;\n\n // Log startup info in development\n if (import.meta.env.DEV) {\n console.log('[OpenAPI DevTools] Application initialized');\n }\n\n return app;\n}\n\n// Only auto-bootstrap when running as standalone app (index.html entry)\n// When imported as a library, consumers should call bootstrap() manually\nif (typeof window !== 'undefined' && document.getElementById('app')) {\n bootstrap();\n}\n\n/**\n * Export the bootstrap function for library consumers\n * who may want to manually initialize the DevTools\n */\nexport { bootstrap };\n\nexport type {\n ClientCommand,\n ClientCommandType,\n ConnectedEventData,\n ConnectionState,\n EventHandler,\n ServerEvent,\n ServerEventType,\n ThemeMode,\n UseWebSocketOptions,\n UseWebSocketReturn,\n} from '@/composables';\n// Re-export composables for library consumers\nexport { useTheme, useWebSocket } from '@/composables';\n"],"file":"index-sPgNGnaU.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=trash-2-
|
|
1
|
+
import{c as e}from"./index-sPgNGnaU.js";const a=e("trash-2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);export{a as T};
|
|
2
|
+
//# sourceMappingURL=trash-2-DCsOAZPr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trash-2-
|
|
1
|
+
{"version":3,"file":"trash-2-DCsOAZPr.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/trash-2.js"],"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 Trash2 = createLucideIcon(\"trash-2\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n"],"names":["Trash2","createLucideIcon"],"mappings":"wCASK,MAACA,EAASC,EAAiB,UAAW,CACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,wCAAyC,IAAK,QAAQ,CAAE,EACtE,CAAC,OAAQ,CAAE,EAAG,qCAAsC,IAAK,QAAQ,CAAE,EACnE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,OAAO,CAAE,CACnE,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=triangle-alert-
|
|
1
|
+
import{c as e}from"./index-sPgNGnaU.js";const t=e("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);export{t as T};
|
|
2
|
+
//# sourceMappingURL=triangle-alert-DD8Mz05K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triangle-alert-
|
|
1
|
+
{"version":3,"file":"triangle-alert-DD8Mz05K.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/triangle-alert.js"],"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 TriangleAlert = createLucideIcon(\"triangle-alert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n"],"names":["TriangleAlert","createLucideIcon"],"mappings":"wCASK,MAACA,EAAgBC,EAAiB,iBAAkB,CACvD,CACE,OACA,CACE,EAAG,2EACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-
|
|
1
|
+
{"version":3,"file":"x-5pbhNHo3.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/x.js"],"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 X = createLucideIcon(\"x\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n"],"names":["X","createLucideIcon"],"mappings":"wCASK,MAACA,EAAIC,EAAiB,IAAK,CAC9B,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
|
package/dist/spa/index.html
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
<meta name="description" content="OpenAPI DevTools - Debug and inspect your mock API server" />
|
|
7
7
|
<title>OpenAPI DevTools</title>
|
|
8
8
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234f46e5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polygon points='13 2 3 14 12 14 11 22 21 10 12 10 13 2'/></svg>" />
|
|
9
|
-
<script type="module" crossorigin src="/_devtools/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/_devtools/assets/index-sPgNGnaU.js"></script>
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/_devtools/assets/vue-vendor-Bkktf9yg.js">
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/_devtools/assets/index-
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/_devtools/assets/index-BSvrS_tt.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="app"></div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as e } from "./main-
|
|
1
|
+
import { c as e } from "./main-DUNgny3E.js";
|
|
2
2
|
const a = e("trash-2", [
|
|
3
3
|
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
4
4
|
["path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6", key: "4alrt4" }],
|
|
@@ -9,4 +9,4 @@ const a = e("trash-2", [
|
|
|
9
9
|
export {
|
|
10
10
|
a as T
|
|
11
11
|
};
|
|
12
|
-
//# sourceMappingURL=trash-2-
|
|
12
|
+
//# sourceMappingURL=trash-2-BaiQpXqE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trash-2-
|
|
1
|
+
{"version":3,"file":"trash-2-BaiQpXqE.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/trash-2.js"],"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 Trash2 = createLucideIcon(\"trash-2\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n"],"names":["Trash2","createLucideIcon"],"mappings":";AASK,MAACA,IAASC,EAAiB,WAAW;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,yCAAyC,KAAK,SAAQ,CAAE;AAAA,EACtE,CAAC,QAAQ,EAAE,GAAG,sCAAsC,KAAK,SAAQ,CAAE;AAAA,EACnE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AAAA,EAClE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,QAAO,CAAE;AACnE,CAAC;","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as e } from "./main-
|
|
1
|
+
import { c as e } from "./main-DUNgny3E.js";
|
|
2
2
|
const t = e("triangle-alert", [
|
|
3
3
|
[
|
|
4
4
|
"path",
|
|
@@ -13,4 +13,4 @@ const t = e("triangle-alert", [
|
|
|
13
13
|
export {
|
|
14
14
|
t as T
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=triangle-alert-
|
|
16
|
+
//# sourceMappingURL=triangle-alert-CIaC9iQP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triangle-alert-
|
|
1
|
+
{"version":3,"file":"triangle-alert-CIaC9iQP.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/triangle-alert.js"],"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 TriangleAlert = createLucideIcon(\"triangle-alert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n"],"names":["TriangleAlert","createLucideIcon"],"mappings":";AASK,MAACA,IAAgBC,EAAiB,kBAAkB;AAAA,EACvD;AAAA,IACE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAK;AAAA,IACX;AAAA,EACA;AAAA,EACE,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAC7C,CAAC;","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as e } from "./main-
|
|
1
|
+
import { c as e } from "./main-DUNgny3E.js";
|
|
2
2
|
const c = e("x", [
|
|
3
3
|
["path", { d: "M18 6 6 18", key: "1bl5f8" }],
|
|
4
4
|
["path", { d: "m6 6 12 12", key: "d8bk6v" }]
|
|
@@ -6,4 +6,4 @@ const c = e("x", [
|
|
|
6
6
|
export {
|
|
7
7
|
c as X
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=x-
|
|
9
|
+
//# sourceMappingURL=x-BI73Bc0z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-
|
|
1
|
+
{"version":3,"file":"x-BI73Bc0z.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/x.js"],"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 X = createLucideIcon(\"x\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n"],"names":["X","createLucideIcon"],"mappings":";AASK,MAACA,IAAIC,EAAiB,KAAK;AAAA,EAC9B,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAAA,EAC3C,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAC7C,CAAC;","x_google_ignoreList":[0]}
|