loki-mode 6.41.0 → 6.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,Cascadia Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.terminal-scroll::-webkit-scrollbar{width:6px}.terminal-scroll::-webkit-scrollbar-track{background:transparent}.terminal-scroll::-webkit-scrollbar-thumb{background:#553de933;border-radius:3px}.terminal-scroll::-webkit-scrollbar-thumb:hover{background:#553de959}.card{background:#fff;border:1px solid #ECEAE3;border-radius:5px;box-shadow:0 1px 3px #0000000f}.card:hover,.card-hover:hover{box-shadow:0 5px 10px #00000014}.pattern-nodes{position:absolute;top:0;right:0;bottom:0;left:0;opacity:.04;pointer-events:none;background-image:radial-gradient(circle at 10% 20%,#553DE9 1px,transparent 1px),radial-gradient(circle at 30% 60%,#553DE9 1px,transparent 1px),radial-gradient(circle at 50% 40%,#553DE9 1px,transparent 1px),radial-gradient(circle at 70% 80%,#553DE9 1px,transparent 1px),radial-gradient(circle at 90% 30%,#553DE9 1px,transparent 1px);background-size:200px 200px}*:focus-visible{outline:2px solid #553DE9;outline-offset:2px}::-moz-selection{background:#e8e4fd;color:#201515}::selection{background:#e8e4fd;color:#201515}@media(prefers-reduced-motion:reduce){.phase-active{animation:none}}@keyframes phase-pulse{0%,to{opacity:1}50%{opacity:.5}}.phase-active{animation:phase-pulse 2s ease-in-out infinite}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:0}}.terminal-cursor:after{content:"";display:inline-block;width:8px;height:16px;background:#553de9;animation:cursor-blink 1s step-end infinite;margin-left:2px;vertical-align:text-bottom}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\!visible{visibility:visible!important}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-3{left:.75rem}.right-0{right:0}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-5{grid-column:span 5 / span 5}.col-span-6{grid-column:span 6 / span 6}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-28{height:7rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-64{max-height:16rem}.max-h-\[400px\]{max-height:400px}.min-h-0{min-height:0px}.min-h-\[280px\]{min-height:280px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[160px\]{min-width:160px}.max-w-3xl{max-width:48rem}.max-w-\[1400px\]{max-width:1400px}.max-w-\[1920px\]{max-width:1920px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[80\%\]{max-width:80%}.max-w-\[800px\]{max-width:800px}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[3px\]{border-radius:3px}.rounded-\[5px\]{border-radius:5px}.rounded-btn{border-radius:4px}.rounded-card{border-radius:5px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-t-card{border-top-left-radius:5px;border-top-right-radius:5px}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-\[\#553DE9\]{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.border-\[\#553DE9\]\/30{border-color:#553de94d}.border-\[\#C45B5B\]\/20{border-color:#c45b5b33}.border-\[\#ECEAE3\],.border-border{--tw-border-opacity: 1;border-color:rgb(236 234 227 / var(--tw-border-opacity, 1))}.border-border-light{--tw-border-opacity: 1;border-color:rgb(197 192 177 / var(--tw-border-opacity, 1))}.border-border\/50{border-color:#eceae380}.border-danger\/20{border-color:#c45b5b33}.border-muted\/20{border-color:#93908433}.border-primary{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.border-primary\/20{border-color:#553de933}.border-primary\/30{border-color:#553de94d}.border-primary\/40{border-color:#553de966}.border-success\/20{border-color:#1fc5a833}.border-transparent{border-color:transparent}.border-warning\/10{border-color:#d4a03c1a}.border-warning\/20{border-color:#d4a03c33}.border-warning\/30{border-color:#d4a03c4d}.border-warning\/40{border-color:#d4a03c66}.border-t-transparent{border-top-color:transparent}.bg-\[\#1FC5A8\]{--tw-bg-opacity: 1;background-color:rgb(31 197 168 / var(--tw-bg-opacity, 1))}.bg-\[\#1FC5A8\]\/10{background-color:#1fc5a81a}.bg-\[\#553DE9\]{--tw-bg-opacity: 1;background-color:rgb(85 61 233 / var(--tw-bg-opacity, 1))}.bg-\[\#553DE9\]\/10{background-color:#553de91a}.bg-\[\#C45B5B\]{--tw-bg-opacity: 1;background-color:rgb(196 91 91 / var(--tw-bg-opacity, 1))}.bg-\[\#C45B5B\]\/10{background-color:#c45b5b1a}.bg-\[\#D4A03C\]\/10{background-color:#d4a03c1a}.bg-\[\#F8F4F0\]{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.bg-\[\#FAF9F6\]{--tw-bg-opacity: 1;background-color:rgb(250 249 246 / var(--tw-bg-opacity, 1))}.bg-background{--tw-bg-opacity: 1;background-color:rgb(255 254 251 / var(--tw-bg-opacity, 1))}.bg-black\/30{background-color:#0000004d}.bg-black\/5{background-color:#0000000d}.bg-border{--tw-bg-opacity: 1;background-color:rgb(236 234 227 / var(--tw-bg-opacity, 1))}.bg-border\/30{background-color:#eceae34d}.bg-card{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-current{background-color:currentColor}.bg-danger{--tw-bg-opacity: 1;background-color:rgb(196 91 91 / var(--tw-bg-opacity, 1))}.bg-danger\/10{background-color:#c45b5b1a}.bg-hover{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.bg-info{--tw-bg-opacity: 1;background-color:rgb(47 113 227 / var(--tw-bg-opacity, 1))}.bg-ink\/\[0\.03\]{background-color:#20151508}.bg-muted{--tw-bg-opacity: 1;background-color:rgb(147 144 132 / var(--tw-bg-opacity, 1))}.bg-muted\/10{background-color:#9390841a}.bg-muted\/30{background-color:#9390844d}.bg-muted\/40{background-color:#93908466}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(85 61 233 / var(--tw-bg-opacity, 1))}.bg-primary\/10{background-color:#553de91a}.bg-success{--tw-bg-opacity: 1;background-color:rgb(31 197 168 / var(--tw-bg-opacity, 1))}.bg-success\/10{background-color:#1fc5a81a}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:rgb(212 160 60 / var(--tw-bg-opacity, 1))}.bg-warning\/10{background-color:#d4a03c1a}.bg-warning\/5{background-color:#d4a03c0d}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.fill-ink{fill:#201515}.fill-primary{fill:#553de9}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2\.5{padding-bottom:.625rem}.pl-9{padding-left:2.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-\[20vh\]{padding-top:20vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-heading{font-family:DM Serif Display,Georgia,Times New Roman,serif}.font-mono{font-family:JetBrains Mono,Fira Code,Cascadia Code,monospace}.font-sans{font-family:Inter,system-ui,-apple-system,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-h1{font-size:2.5rem;line-height:1;letter-spacing:-.01em}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#1FC5A8\]{--tw-text-opacity: 1;color:rgb(31 197 168 / var(--tw-text-opacity, 1))}.text-\[\#36342E\]{--tw-text-opacity: 1;color:rgb(54 52 46 / var(--tw-text-opacity, 1))}.text-\[\#553DE9\]{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.text-\[\#6B6960\]{--tw-text-opacity: 1;color:rgb(107 105 96 / var(--tw-text-opacity, 1))}.text-\[\#939084\]{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.text-\[\#C45B5B\]{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.text-\[\#D4A03C\]{--tw-text-opacity: 1;color:rgb(212 160 60 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-danger{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-info{--tw-text-opacity: 1;color:rgb(47 113 227 / var(--tw-text-opacity, 1))}.text-ink{--tw-text-opacity: 1;color:rgb(32 21 21 / var(--tw-text-opacity, 1))}.text-ink\/60{color:#20151599}.text-ink\/70{color:#201515b3}.text-ink\/80{color:#201515cc}.text-muted{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.text-muted-accessible{--tw-text-opacity: 1;color:rgb(107 105 96 / var(--tw-text-opacity, 1))}.text-muted\/30{color:#9390844d}.text-muted\/40{color:#93908466}.text-muted\/50{color:#93908480}.text-muted\/60{color:#93908499}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.text-primary\/60{color:#553de999}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(31 197 168 / var(--tw-text-opacity, 1))}.text-warning{--tw-text-opacity: 1;color:rgb(212 160 60 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-button{--tw-shadow: 0 1px 3px rgba(0,0,0,.08);--tw-shadow-colored: 0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-card{--tw-shadow: 0 1px 3px rgba(0,0,0,.06);--tw-shadow-colored: 0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-card-hover{--tw-shadow: 0 5px 10px rgba(0,0,0,.08);--tw-shadow-colored: 0 5px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[\#553DE9\]\/20{--tw-shadow-color: rgb(85 61 233 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-card{--tw-shadow-color: #FFFFFF;--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-\[\#553DE9\]{--tw-ring-opacity: 1;--tw-ring-color: rgb(85 61 233 / var(--tw-ring-opacity, 1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.placeholder\:text-\[\#939084\]::-moz-placeholder{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.placeholder\:text-\[\#939084\]::placeholder{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.placeholder\:text-primary\/60::-moz-placeholder{color:#553de999}.placeholder\:text-primary\/60::placeholder{color:#553de999}.hover\:border-primary\/30:hover{border-color:#553de94d}.hover\:bg-\[\#4432c4\]:hover{--tw-bg-opacity: 1;background-color:rgb(68 50 196 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#553DE9\]\/5:hover{background-color:#553de90d}.hover\:bg-\[\#553DE9\]\/90:hover{background-color:#553de9e6}.hover\:bg-\[\#C45B5B\]\/20:hover{background-color:#c45b5b33}.hover\:bg-\[\#E8E4FD\]:hover{--tw-bg-opacity: 1;background-color:rgb(232 228 253 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#ECEAE3\]:hover{--tw-bg-opacity: 1;background-color:rgb(236 234 227 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#F8F4F0\]:hover{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.hover\:bg-card:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-danger\/10:hover{background-color:#c45b5b1a}.hover\:bg-danger\/20:hover{background-color:#c45b5b33}.hover\:bg-hover:hover{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.hover\:bg-primary\/20:hover{background-color:#553de933}.hover\:bg-primary\/30:hover{background-color:#553de94d}.hover\:bg-primary\/5:hover{background-color:#553de90d}.hover\:bg-primary\/90:hover{background-color:#553de9e6}.hover\:bg-warning\/10:hover{background-color:#d4a03c1a}.hover\:text-\[\#36342E\]:hover{--tw-text-opacity: 1;color:rgb(54 52 46 / var(--tw-text-opacity, 1))}.hover\:text-danger:hover{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.hover\:text-ink:hover{--tw-text-opacity: 1;color:rgb(32 21 21 / var(--tw-text-opacity, 1))}.hover\:text-primary:hover{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.hover\:text-primary\/80:hover{color:#553de9cc}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-card-hover:hover{--tw-shadow: 0 5px 10px rgba(0,0,0,.08);--tw-shadow-colored: 0 5px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:absolute:focus{position:absolute}.focus\:left-2:focus{left:.5rem}.focus\:top-2:focus{top:.5rem}.focus\:z-50:focus{z-index:50}.focus\:rounded-\[3px\]:focus{border-radius:3px}.focus\:border-\[\#553DE9\]:focus{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.focus\:border-primary:focus{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.focus\:border-primary\/30:focus{border-color:#553de94d}.focus\:bg-white:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.focus\:px-4:focus{padding-left:1rem;padding-right:1rem}.focus\:py-2:focus{padding-top:.5rem;padding-bottom:.5rem}.focus\:text-\[\#553DE9\]:focus{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.focus\:shadow-card:focus{--tw-shadow: 0 1px 3px rgba(0,0,0,.06);--tw-shadow-colored: 0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-shadow-color: #FFFFFF;--tw-shadow: var(--tw-shadow-colored)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[\#553DE9\]\/20:focus{--tw-ring-color: rgb(85 61 233 / .2)}.focus\:ring-primary\/20:focus{--tw-ring-color: rgb(85 61 233 / .2)}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-primary{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.group\/file:hover .group-hover\/file\:opacity-100{opacity:1}@media(prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
@@ -7,11 +7,11 @@
7
7
  <title>Purple Lab -- Powered by Loki Mode</title>
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-DpAb7DLD.js"></script>
12
- <link rel="stylesheet" crossorigin href="/assets/index-0s7NNF9k.css">
10
+ <link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
11
+ <script type="module" crossorigin src="/assets/index-ABzvlaPu.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-C-IWanPu.css">
13
13
  </head>
14
- <body class="bg-background text-charcoal font-sans antialiased">
14
+ <body class="bg-background text-ink font-sans antialiased">
15
15
  <div id="root"></div>
16
16
  </body>
17
17
  </html>
package/web-app/server.py CHANGED
@@ -109,6 +109,44 @@ class SessionState:
109
109
  self.log_lines = []
110
110
 
111
111
 
112
+ def _kill_orphan_loki_processes(project_dir: str = "") -> None:
113
+ """Kill any orphaned loki-run processes."""
114
+ import subprocess as _sp
115
+ patterns: list[str] = []
116
+ if project_dir:
117
+ patterns.append(f"loki-run.*{project_dir}")
118
+ patterns.append("loki-run-")
119
+
120
+ killed_pids: set[int] = set()
121
+ for pattern in patterns:
122
+ try:
123
+ result = _sp.run(
124
+ ["pgrep", "-f", pattern],
125
+ capture_output=True, text=True, timeout=5,
126
+ )
127
+ if result.returncode == 0:
128
+ for pid_str in result.stdout.strip().splitlines():
129
+ try:
130
+ pid = int(pid_str.strip())
131
+ if pid not in killed_pids:
132
+ os.kill(pid, signal.SIGTERM)
133
+ killed_pids.add(pid)
134
+ except (ValueError, ProcessLookupError, PermissionError):
135
+ pass
136
+ except Exception:
137
+ pass
138
+
139
+ # Wait briefly then SIGKILL any survivors
140
+ if killed_pids:
141
+ import time as _time
142
+ _time.sleep(2)
143
+ for pid in killed_pids:
144
+ try:
145
+ os.kill(pid, signal.SIGKILL)
146
+ except (ProcessLookupError, PermissionError, OSError):
147
+ pass
148
+
149
+
112
150
  session = SessionState()
113
151
 
114
152
  # ---------------------------------------------------------------------------
@@ -160,6 +198,11 @@ class DirectoryCreateRequest(BaseModel):
160
198
  class FileDeleteRequest(BaseModel):
161
199
  path: str
162
200
 
201
+
202
+ class ChatRequest(BaseModel):
203
+ message: str
204
+ mode: str = "quick" # "quick" or "standard"
205
+
163
206
  # ---------------------------------------------------------------------------
164
207
  # Helpers
165
208
  # ---------------------------------------------------------------------------
@@ -197,6 +240,20 @@ def _safe_resolve(base: Path, requested: str) -> Optional[Path]:
197
240
  return None
198
241
 
199
242
 
243
+ def _find_session_dir(session_id: str) -> Optional[Path]:
244
+ """Find a session's project directory by ID."""
245
+ search_dirs = [
246
+ Path.home() / "purple-lab-projects",
247
+ Path.home() / ".loki-sessions",
248
+ Path.home() / ".loki" / "sessions",
249
+ ]
250
+ for base_dir in search_dirs:
251
+ candidate = base_dir / session_id
252
+ if candidate.is_dir():
253
+ return candidate
254
+ return None
255
+
256
+
200
257
  async def _broadcast(msg: dict) -> None:
201
258
  """Send a JSON message to all connected WebSocket clients."""
202
259
  data = json.dumps(msg)
@@ -425,11 +482,68 @@ async def stop_session() -> JSONResponse:
425
482
  except Exception:
426
483
  pass
427
484
 
485
+ # Kill any orphaned loki-run processes for this project
486
+ if session.project_dir:
487
+ _kill_orphan_loki_processes(session.project_dir)
488
+
428
489
  await _broadcast({"type": "session_end", "data": {"message": "Session stopped by user"}})
429
490
 
430
491
  return JSONResponse(content={"stopped": True, "message": "Session stopped"})
431
492
 
432
493
 
494
+ @app.on_event("shutdown")
495
+ async def shutdown_event():
496
+ """Clean up any running session when Purple Lab shuts down."""
497
+ if not session.running or session.process is None:
498
+ return
499
+
500
+ project_dir = session.project_dir
501
+ session.running = False
502
+ await session.cleanup()
503
+
504
+ proc = session.process
505
+ if proc and proc.poll() is None:
506
+ if sys.platform != "win32":
507
+ try:
508
+ pgid = os.getpgid(proc.pid)
509
+ os.killpg(pgid, signal.SIGTERM)
510
+ except (ProcessLookupError, PermissionError, OSError):
511
+ try:
512
+ proc.terminate()
513
+ except Exception:
514
+ pass
515
+ else:
516
+ try:
517
+ proc.terminate()
518
+ except Exception:
519
+ pass
520
+ try:
521
+ proc.wait(timeout=5)
522
+ except subprocess.TimeoutExpired:
523
+ if sys.platform != "win32":
524
+ try:
525
+ pgid = os.getpgid(proc.pid)
526
+ os.killpg(pgid, signal.SIGKILL)
527
+ except (ProcessLookupError, PermissionError, OSError):
528
+ try:
529
+ proc.kill()
530
+ except Exception:
531
+ pass
532
+ else:
533
+ try:
534
+ proc.kill()
535
+ except Exception:
536
+ pass
537
+ try:
538
+ proc.wait(timeout=3)
539
+ except Exception:
540
+ pass
541
+
542
+ # Kill any orphaned loki-run processes for this project
543
+ if project_dir:
544
+ _kill_orphan_loki_processes(project_dir)
545
+
546
+
433
547
  @app.get("/api/session/status")
434
548
  async def get_status() -> JSONResponse:
435
549
  """Get current session status."""
@@ -649,15 +763,43 @@ async def resume_session() -> JSONResponse:
649
763
 
650
764
  @app.get("/api/templates")
651
765
  async def get_templates() -> JSONResponse:
652
- """List available PRD templates."""
766
+ """List available PRD templates with description and category."""
653
767
  templates_dir = PROJECT_ROOT / "templates"
654
768
  if not templates_dir.is_dir():
655
769
  return JSONResponse(content=[])
656
770
 
771
+ # Category mapping from filename
772
+ _category_map = {
773
+ 'static-landing-page': 'Website', 'blog-platform': 'Website', 'e-commerce': 'Website',
774
+ 'full-stack-demo': 'Website', 'dashboard': 'Website',
775
+ 'rest-api': 'API', 'rest-api-auth': 'API', 'api-only': 'API', 'microservice': 'API',
776
+ 'cli-tool': 'CLI', 'npm-library': 'CLI',
777
+ 'discord-bot': 'Bot', 'slack-bot': 'Bot', 'ai-chatbot': 'Bot',
778
+ 'data-pipeline': 'Data', 'web-scraper': 'Data',
779
+ }
780
+
657
781
  templates = []
658
782
  for f in sorted(templates_dir.glob("*.md")):
659
783
  name = f.stem.replace("-", " ").replace("_", " ").title()
660
- templates.append({"name": name, "filename": f.name})
784
+ # Extract description: first non-heading, non-blank paragraph
785
+ description = ""
786
+ try:
787
+ text = f.read_text(errors="replace")
788
+ for line in text.splitlines():
789
+ stripped = line.strip()
790
+ if not stripped or stripped.startswith("#"):
791
+ continue
792
+ description = stripped[:200]
793
+ break
794
+ except OSError:
795
+ pass
796
+ category = _category_map.get(f.stem, "Other")
797
+ templates.append({
798
+ "name": name,
799
+ "filename": f.name,
800
+ "description": description,
801
+ "category": category,
802
+ })
661
803
  return JSONResponse(content=templates)
662
804
 
663
805
 
@@ -1405,6 +1547,114 @@ async def onboard_session(req: OnboardRequest) -> JSONResponse:
1405
1547
  })
1406
1548
 
1407
1549
 
1550
+ # ---------------------------------------------------------------------------
1551
+ # CLI feature endpoints (chat, review, test, explain, export)
1552
+ # ---------------------------------------------------------------------------
1553
+
1554
+
1555
+ @app.post("/api/sessions/{session_id}/chat")
1556
+ async def chat_session(session_id: str, req: ChatRequest) -> JSONResponse:
1557
+ """Run iterative chat command on a project."""
1558
+ import re
1559
+ if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
1560
+ return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
1561
+
1562
+ # Find project directory
1563
+ target = _find_session_dir(session_id)
1564
+
1565
+ if target is None:
1566
+ return JSONResponse(status_code=404, content={"error": "Session not found"})
1567
+
1568
+ # Build command based on mode
1569
+ if req.mode == "quick":
1570
+ cmd_args = ["quick", req.message]
1571
+ else:
1572
+ cmd_args = ["start", "--provider", "claude", str(target / "PRD.md")]
1573
+
1574
+ rc, output = await asyncio.get_running_loop().run_in_executor(
1575
+ None, lambda: _run_loki_cmd(cmd_args, cwd=str(target), timeout=300)
1576
+ )
1577
+
1578
+ # Detect changed files
1579
+ files_changed: list[str] = []
1580
+ try:
1581
+ import subprocess as _sp
1582
+ result = _sp.run(
1583
+ ["git", "diff", "--name-only", "HEAD~1"],
1584
+ cwd=str(target), capture_output=True, text=True, timeout=10
1585
+ )
1586
+ if result.returncode == 0:
1587
+ files_changed = [f for f in result.stdout.strip().splitlines() if f]
1588
+ except Exception:
1589
+ pass
1590
+
1591
+ return JSONResponse(content={
1592
+ "output": output,
1593
+ "files_changed": files_changed,
1594
+ "returncode": rc,
1595
+ })
1596
+
1597
+
1598
+ @app.post("/api/sessions/{session_id}/review")
1599
+ async def review_session(session_id: str) -> JSONResponse:
1600
+ """Run loki review on a project."""
1601
+ import re
1602
+ if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
1603
+ return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
1604
+ target = _find_session_dir(session_id)
1605
+ if target is None:
1606
+ return JSONResponse(status_code=404, content={"error": "Session not found"})
1607
+ rc, output = await asyncio.get_running_loop().run_in_executor(
1608
+ None, lambda: _run_loki_cmd(["review", str(target)], cwd=str(target), timeout=120)
1609
+ )
1610
+ return JSONResponse(content={"output": output, "returncode": rc})
1611
+
1612
+
1613
+ @app.post("/api/sessions/{session_id}/test")
1614
+ async def test_session(session_id: str) -> JSONResponse:
1615
+ """Run loki test on a project."""
1616
+ import re
1617
+ if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
1618
+ return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
1619
+ target = _find_session_dir(session_id)
1620
+ if target is None:
1621
+ return JSONResponse(status_code=404, content={"error": "Session not found"})
1622
+ rc, output = await asyncio.get_running_loop().run_in_executor(
1623
+ None, lambda: _run_loki_cmd(["test", "--dir", str(target)], cwd=str(target), timeout=120)
1624
+ )
1625
+ return JSONResponse(content={"output": output, "returncode": rc})
1626
+
1627
+
1628
+ @app.post("/api/sessions/{session_id}/explain")
1629
+ async def explain_session(session_id: str) -> JSONResponse:
1630
+ """Run loki explain on a project."""
1631
+ import re
1632
+ if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
1633
+ return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
1634
+ target = _find_session_dir(session_id)
1635
+ if target is None:
1636
+ return JSONResponse(status_code=404, content={"error": "Session not found"})
1637
+ rc, output = await asyncio.get_running_loop().run_in_executor(
1638
+ None, lambda: _run_loki_cmd(["explain", str(target)], cwd=str(target), timeout=120)
1639
+ )
1640
+ return JSONResponse(content={"output": output, "returncode": rc})
1641
+
1642
+
1643
+ @app.post("/api/sessions/{session_id}/export")
1644
+ async def export_session(session_id: str) -> JSONResponse:
1645
+ """Run loki export json on a project."""
1646
+ import re
1647
+ if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
1648
+ return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
1649
+ target = _find_session_dir(session_id)
1650
+ if target is None:
1651
+ return JSONResponse(status_code=404, content={"error": "Session not found"})
1652
+ rc, output = await asyncio.get_running_loop().run_in_executor(
1653
+ None, lambda: _run_loki_cmd(["export", "json"], cwd=str(target), timeout=60)
1654
+ )
1655
+ return JSONResponse(content={"output": output, "returncode": rc})
1656
+
1657
+
1408
1658
  # ---------------------------------------------------------------------------
1409
1659
  # Health check
1410
1660
  # ---------------------------------------------------------------------------
@@ -1,11 +0,0 @@
1
- var ot=e=>{throw TypeError(e)};var at=(e,t,n)=>t.has(e)||ot("Cannot "+n);var we=(e,t,n)=>(at(e,t,"read from private field"),n?n.call(e):t.get(e)),it=(e,t,n)=>t.has(e)?ot("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),st=(e,t,n,r)=>(at(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);import{r as u,W as ge,j as f,a as ne,u as on,b as an,H as Ae,E as sn}from"./index-DpAb7DLD.js";function lt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function ln(e){if(Array.isArray(e))return e}function cn(e,t,n){return(t=gn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function un(e,t){var n=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(n!=null){var r,o,i,l,a=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,t!==0)for(;!(s=(r=i.call(n)).done)&&(a.push(r.value),a.length!==t);s=!0);}catch(d){c=!0,o=d}finally{try{if(!s&&n.return!=null&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw o}}return a}}function dn(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ct(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function ut(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?ct(Object(n),!0).forEach(function(r){cn(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ct(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function fn(e,t){if(e==null)return{};var n,r,o=pn(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function pn(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function hn(e,t){return ln(e)||un(e,t)||vn(e,t)||dn()}function mn(e,t){if(typeof e!="object"||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function gn(e){var t=mn(e,"string");return typeof t=="symbol"?t:t+""}function vn(e,t){if(e){if(typeof e=="string")return lt(e,t);var n={}.toString.call(e).slice(8,-1);return n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set"?Array.from(e):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?lt(e,t):void 0}}function xn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function dt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function ft(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?dt(Object(n),!0).forEach(function(r){xn(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):dt(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function yn(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(r){return t.reduceRight(function(o,i){return i(o)},r)}}function Se(e){return function t(){for(var n=this,r=arguments.length,o=new Array(r),i=0;i<r;i++)o[i]=arguments[i];return o.length>=e.length?e.apply(this,o):function(){for(var l=arguments.length,a=new Array(l),s=0;s<l;s++)a[s]=arguments[s];return t.apply(n,[].concat(o,a))}}}function $e(e){return{}.toString.call(e).includes("Object")}function bn(e){return!Object.keys(e).length}function Pe(e){return typeof e=="function"}function wn(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Sn(e,t){return $e(t)||oe("changeType"),Object.keys(t).some(function(n){return!wn(e,n)})&&oe("changeField"),t}function zn(e){Pe(e)||oe("selectorType")}function jn(e){Pe(e)||$e(e)||oe("handlerType"),$e(e)&&Object.values(e).some(function(t){return!Pe(t)})&&oe("handlersType")}function Cn(e){e||oe("initialIsRequired"),$e(e)||oe("initialType"),bn(e)&&oe("initialContent")}function Pn(e,t){throw new Error(e[t]||e.default)}var kn={initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"},oe=Se(Pn)(kn),Le={changes:Sn,selector:zn,handler:jn,initial:Cn};function En(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};Le.initial(e),Le.handler(t);var n={current:e},r=Se(On)(n,t),o=Se(Ln)(n),i=Se(Le.changes)(e),l=Se(Mn)(n);function a(){var c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(d){return d};return Le.selector(c),c(n.current)}function s(c){yn(r,o,i,l)(c)}return[a,s]}function Mn(e,t){return Pe(t)?t(e.current):t}function Ln(e,t){return e.current=ft(ft({},e.current),t),t}function On(e,t,n){return Pe(t)?t(e.current):Object.keys(n).forEach(function(r){var o;return(o=t[r])===null||o===void 0?void 0:o.call(t,e.current[r])}),n}var Nn={create:En},Rn={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs"}};function Dn(e){return function t(){for(var n=this,r=arguments.length,o=new Array(r),i=0;i<r;i++)o[i]=arguments[i];return o.length>=e.length?e.apply(this,o):function(){for(var l=arguments.length,a=new Array(l),s=0;s<l;s++)a[s]=arguments[s];return t.apply(n,[].concat(o,a))}}}function In(e){return{}.toString.call(e).includes("Object")}function $n(e){return e||pt("configIsRequired"),In(e)||pt("configType"),e.urls?(Tn(),{paths:{vs:e.urls.monacoBase}}):e}function Tn(){console.warn(Lt.deprecation)}function Fn(e,t){throw new Error(e[t]||e.default)}var Lt={configIsRequired:"the configuration object is required",configType:"the configuration object should be an object",default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:`Deprecation warning!
3
- You are using deprecated way of configuration.
4
-
5
- Instead of using
6
- monaco.config({ urls: { monacoBase: '...' } })
7
- use
8
- monaco.config({ paths: { vs: '...' } })
9
-
10
- For more please check the link https://github.com/suren-atoyan/monaco-loader#config
11
- `},pt=Dn(Fn)(Lt),An={config:$n},Bn=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(o){return n.reduceRight(function(i,l){return l(i)},o)}};function Ot(e,t){return Object.keys(t).forEach(function(n){t[n]instanceof Object&&e[n]&&Object.assign(t[n],Ot(e[n],t[n]))}),ut(ut({},e),t)}var Wn={type:"cancelation",msg:"operation is manually canceled"};function Be(e){var t=!1,n=new Promise(function(r,o){e.then(function(i){return t?o(Wn):r(i)}),e.catch(o)});return n.cancel=function(){return t=!0},n}var Hn=["monaco"],Vn=Nn.create({config:Rn,isInitialized:!1,resolve:null,reject:null,monaco:null}),Nt=hn(Vn,2),Ee=Nt[0],Te=Nt[1];function Gn(e){var t=An.config(e),n=t.monaco,r=fn(t,Hn);Te(function(o){return{config:Ot(o.config,r),monaco:n}})}function Un(){var e=Ee(function(t){var n=t.monaco,r=t.isInitialized,o=t.resolve;return{monaco:n,isInitialized:r,resolve:o}});if(!e.isInitialized){if(Te({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),Be(We);if(window.monaco&&window.monaco.editor)return Rt(window.monaco),e.resolve(window.monaco),Be(We);Bn(qn,Xn)(Yn)}return Be(We)}function qn(e){return document.body.appendChild(e)}function Kn(e){var t=document.createElement("script");return e&&(t.src=e),t}function Xn(e){var t=Ee(function(r){var o=r.config,i=r.reject;return{config:o,reject:i}}),n=Kn("".concat(t.config.paths.vs,"/loader.js"));return n.onload=function(){return e()},n.onerror=t.reject,n}function Yn(){var e=Ee(function(n){var r=n.config,o=n.resolve,i=n.reject;return{config:r,resolve:o,reject:i}}),t=window.require;t.config(e.config),t(["vs/editor/editor.main"],function(n){var r=n.m||n;Rt(r),e.resolve(r)},function(n){e.reject(n)})}function Rt(e){Ee().monaco||Te({monaco:e})}function _n(){return Ee(function(e){var t=e.monaco;return t})}var We=new Promise(function(e,t){return Te({resolve:e,reject:t})}),Dt={config:Gn,init:Un,__getMonacoInstance:_n},Jn={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},He=Jn,Qn={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},Zn=Qn;function er({children:e}){return ge.createElement("div",{style:Zn.container},e)}var tr=er,nr=tr;function rr({width:e,height:t,isEditorReady:n,loading:r,_ref:o,className:i,wrapperProps:l}){return ge.createElement("section",{style:{...He.wrapper,width:e,height:t},...l},!n&&ge.createElement(nr,null,r),ge.createElement("div",{ref:o,style:{...He.fullWidth,...!n&&He.hide},className:i}))}var or=rr,It=u.memo(or);function ar(e){u.useEffect(e,[])}var $t=ar;function ir(e,t,n=!0){let r=u.useRef(!0);u.useEffect(r.current||!n?()=>{r.current=!1}:e,t)}var K=ir;function je(){}function he(e,t,n,r){return sr(e,r)||lr(e,t,n,r)}function sr(e,t){return e.editor.getModel(Tt(e,t))}function lr(e,t,n,r){return e.editor.createModel(t,n,r?Tt(e,r):void 0)}function Tt(e,t){return e.Uri.parse(t)}function cr({original:e,modified:t,language:n,originalLanguage:r,modifiedLanguage:o,originalModelPath:i,modifiedModelPath:l,keepCurrentOriginalModel:a=!1,keepCurrentModifiedModel:s=!1,theme:c="light",loading:d="Loading...",options:v={},height:g="100%",width:M="100%",className:w,wrapperProps:m={},beforeMount:b=je,onMount:x=je}){let[p,z]=u.useState(!1),[S,h]=u.useState(!0),P=u.useRef(null),C=u.useRef(null),D=u.useRef(null),F=u.useRef(x),L=u.useRef(b),k=u.useRef(!1);$t(()=>{let j=Dt.init();return j.then(R=>(C.current=R)&&h(!1)).catch(R=>(R==null?void 0:R.type)!=="cancelation"&&console.error("Monaco initialization: error:",R)),()=>P.current?A():j.cancel()}),K(()=>{if(P.current&&C.current){let j=P.current.getOriginalEditor(),R=he(C.current,e||"",r||n||"text",i||"");R!==j.getModel()&&j.setModel(R)}},[i],p),K(()=>{if(P.current&&C.current){let j=P.current.getModifiedEditor(),R=he(C.current,t||"",o||n||"text",l||"");R!==j.getModel()&&j.setModel(R)}},[l],p),K(()=>{let j=P.current.getModifiedEditor();j.getOption(C.current.editor.EditorOption.readOnly)?j.setValue(t||""):t!==j.getValue()&&(j.executeEdits("",[{range:j.getModel().getFullModelRange(),text:t||"",forceMoveMarkers:!0}]),j.pushUndoStop())},[t],p),K(()=>{var j,R;(R=(j=P.current)==null?void 0:j.getModel())==null||R.original.setValue(e||"")},[e],p),K(()=>{let{original:j,modified:R}=P.current.getModel();C.current.editor.setModelLanguage(j,r||n||"text"),C.current.editor.setModelLanguage(R,o||n||"text")},[n,r,o],p),K(()=>{var j;(j=C.current)==null||j.editor.setTheme(c)},[c],p),K(()=>{var j;(j=P.current)==null||j.updateOptions(v)},[v],p);let E=u.useCallback(()=>{var H;if(!C.current)return;L.current(C.current);let j=he(C.current,e||"",r||n||"text",i||""),R=he(C.current,t||"",o||n||"text",l||"");(H=P.current)==null||H.setModel({original:j,modified:R})},[n,t,o,e,r,i,l]),$=u.useCallback(()=>{var j;!k.current&&D.current&&(P.current=C.current.editor.createDiffEditor(D.current,{automaticLayout:!0,...v}),E(),(j=C.current)==null||j.editor.setTheme(c),z(!0),k.current=!0)},[v,c,E]);u.useEffect(()=>{p&&F.current(P.current,C.current)},[p]),u.useEffect(()=>{!S&&!p&&$()},[S,p,$]);function A(){var R,H,G,X;let j=(R=P.current)==null?void 0:R.getModel();a||((H=j==null?void 0:j.original)==null||H.dispose()),s||((G=j==null?void 0:j.modified)==null||G.dispose()),(X=P.current)==null||X.dispose()}return ge.createElement(It,{width:M,height:g,isEditorReady:p,loading:d,_ref:D,className:w,wrapperProps:m})}var ur=cr;u.memo(ur);function dr(e){let t=u.useRef();return u.useEffect(()=>{t.current=e},[e]),t.current}var fr=dr,Oe=new Map;function pr({defaultValue:e,defaultLanguage:t,defaultPath:n,value:r,language:o,path:i,theme:l="light",line:a,loading:s="Loading...",options:c={},overrideServices:d={},saveViewState:v=!0,keepCurrentModel:g=!1,width:M="100%",height:w="100%",className:m,wrapperProps:b={},beforeMount:x=je,onMount:p=je,onChange:z,onValidate:S=je}){let[h,P]=u.useState(!1),[C,D]=u.useState(!0),F=u.useRef(null),L=u.useRef(null),k=u.useRef(null),E=u.useRef(p),$=u.useRef(x),A=u.useRef(),j=u.useRef(r),R=fr(i),H=u.useRef(!1),G=u.useRef(!1);$t(()=>{let O=Dt.init();return O.then(I=>(F.current=I)&&D(!1)).catch(I=>(I==null?void 0:I.type)!=="cancelation"&&console.error("Monaco initialization: error:",I)),()=>L.current?_():O.cancel()}),K(()=>{var I,V,ee,J;let O=he(F.current,e||r||"",t||o||"",i||n||"");O!==((I=L.current)==null?void 0:I.getModel())&&(v&&Oe.set(R,(V=L.current)==null?void 0:V.saveViewState()),(ee=L.current)==null||ee.setModel(O),v&&((J=L.current)==null||J.restoreViewState(Oe.get(i))))},[i],h),K(()=>{var O;(O=L.current)==null||O.updateOptions(c)},[c],h),K(()=>{!L.current||r===void 0||(L.current.getOption(F.current.editor.EditorOption.readOnly)?L.current.setValue(r):r!==L.current.getValue()&&(G.current=!0,L.current.executeEdits("",[{range:L.current.getModel().getFullModelRange(),text:r,forceMoveMarkers:!0}]),L.current.pushUndoStop(),G.current=!1))},[r],h),K(()=>{var I,V;let O=(I=L.current)==null?void 0:I.getModel();O&&o&&((V=F.current)==null||V.editor.setModelLanguage(O,o))},[o],h),K(()=>{var O;a!==void 0&&((O=L.current)==null||O.revealLine(a))},[a],h),K(()=>{var O;(O=F.current)==null||O.editor.setTheme(l)},[l],h);let X=u.useCallback(()=>{var O;if(!(!k.current||!F.current)&&!H.current){$.current(F.current);let I=i||n,V=he(F.current,r||e||"",t||o||"",I||"");L.current=(O=F.current)==null?void 0:O.editor.create(k.current,{model:V,automaticLayout:!0,...c},d),v&&L.current.restoreViewState(Oe.get(I)),F.current.editor.setTheme(l),a!==void 0&&L.current.revealLine(a),P(!0),H.current=!0}},[e,t,n,r,o,i,c,d,v,l,a]);u.useEffect(()=>{h&&E.current(L.current,F.current)},[h]),u.useEffect(()=>{!C&&!h&&X()},[C,h,X]),j.current=r,u.useEffect(()=>{var O,I;h&&z&&((O=A.current)==null||O.dispose(),A.current=(I=L.current)==null?void 0:I.onDidChangeModelContent(V=>{G.current||z(L.current.getValue(),V)}))},[h,z]),u.useEffect(()=>{if(h){let O=F.current.editor.onDidChangeMarkers(I=>{var ee;let V=(ee=L.current.getModel())==null?void 0:ee.uri;if(V&&I.find(J=>J.path===V.path)){let J=F.current.editor.getModelMarkers({resource:V});S==null||S(J)}});return()=>{O==null||O.dispose()}}return()=>{}},[h,S]);function _(){var O,I;(O=A.current)==null||O.dispose(),g?v&&Oe.set(i,L.current.saveViewState()):(I=L.current.getModel())==null||I.dispose(),L.current.dispose()}return ge.createElement(It,{width:M,height:w,isEditorReady:h,loading:s,_ref:k,className:m,wrapperProps:b})}var hr=pr,mr=u.memo(hr),gr=mr;function vr(e,t){const n=getComputedStyle(e),r=parseFloat(n.fontSize);return t*r}function xr(e,t){const n=getComputedStyle(e.ownerDocument.body),r=parseFloat(n.fontSize);return t*r}function yr(e){return e/100*window.innerHeight}function br(e){return e/100*window.innerWidth}function wr(e){switch(typeof e){case"number":return[e,"px"];case"string":{const t=parseFloat(e);return e.endsWith("%")?[t,"%"]:e.endsWith("px")?[t,"px"]:e.endsWith("rem")?[t,"rem"]:e.endsWith("em")?[t,"em"]:e.endsWith("vh")?[t,"vh"]:e.endsWith("vw")?[t,"vw"]:[t,"%"]}}}function ze({groupSize:e,panelElement:t,styleProp:n}){let r;const[o,i]=wr(n);switch(i){case"%":{r=o/100*e;break}case"px":{r=o;break}case"rem":{r=xr(t,o);break}case"em":{r=vr(t,o);break}case"vh":{r=yr(o);break}case"vw":{r=br(o);break}}return r}function q(e){return parseFloat(e.toFixed(3))}function ye({group:e}){const{orientation:t,panels:n}=e;return n.reduce((r,o)=>(r+=t==="horizontal"?o.element.offsetWidth:o.element.offsetHeight,r),0)}function Ge(e){const{panels:t}=e,n=ye({group:e});return n===0?t.map(r=>({groupResizeBehavior:r.panelConstraints.groupResizeBehavior,collapsedSize:0,collapsible:r.panelConstraints.collapsible===!0,defaultSize:void 0,disabled:r.panelConstraints.disabled,minSize:0,maxSize:100,panelId:r.id})):t.map(r=>{const{element:o,panelConstraints:i}=r;let l=0;if(i.collapsedSize!==void 0){const d=ze({groupSize:n,panelElement:o,styleProp:i.collapsedSize});l=q(d/n*100)}let a;if(i.defaultSize!==void 0){const d=ze({groupSize:n,panelElement:o,styleProp:i.defaultSize});a=q(d/n*100)}let s=0;if(i.minSize!==void 0){const d=ze({groupSize:n,panelElement:o,styleProp:i.minSize});s=q(d/n*100)}let c=100;if(i.maxSize!==void 0){const d=ze({groupSize:n,panelElement:o,styleProp:i.maxSize});c=q(d/n*100)}return{groupResizeBehavior:i.groupResizeBehavior,collapsedSize:l,collapsible:i.collapsible===!0,defaultSize:a,disabled:i.disabled,minSize:s,maxSize:c,panelId:r.id}})}function T(e,t="Assertion error"){if(!e)throw Error(t)}function Ue(e,t){return Array.from(t).sort(e==="horizontal"?Sr:zr)}function Sr(e,t){const n=e.element.offsetLeft-t.element.offsetLeft;return n!==0?n:e.element.offsetWidth-t.element.offsetWidth}function zr(e,t){const n=e.element.offsetTop-t.element.offsetTop;return n!==0?n:e.element.offsetHeight-t.element.offsetHeight}function Ft(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function At(e,t){return{x:e.x>=t.left&&e.x<=t.right?0:Math.min(Math.abs(e.x-t.left),Math.abs(e.x-t.right)),y:e.y>=t.top&&e.y<=t.bottom?0:Math.min(Math.abs(e.y-t.top),Math.abs(e.y-t.bottom))}}function jr({orientation:e,rects:t,targetRect:n}){const r={x:n.x+n.width/2,y:n.y+n.height/2};let o,i=Number.MAX_VALUE;for(const l of t){const{x:a,y:s}=At(r,l),c=e==="horizontal"?a:s;c<i&&(i=c,o=l)}return T(o,"No rect found"),o}let Ne;function Cr(){return Ne===void 0&&(typeof matchMedia=="function"?Ne=!!matchMedia("(pointer:coarse)").matches:Ne=!1),Ne}function Bt(e){const{element:t,orientation:n,panels:r,separators:o}=e,i=Ue(n,Array.from(t.children).filter(Ft).map(w=>({element:w}))).map(({element:w})=>w),l=[];let a=!1,s=!1,c=-1,d=-1,v=0,g,M=[];{let w=-1;for(const m of i)m.hasAttribute("data-panel")&&(w++,m.ariaDisabled===null&&(v++,c===-1&&(c=w),d=w))}if(v>1){let w=-1;for(const m of i)if(m.hasAttribute("data-panel")){w++;const b=r.find(x=>x.element===m);if(b){if(g){const x=g.element.getBoundingClientRect(),p=m.getBoundingClientRect();let z;if(s){const S=n==="horizontal"?new DOMRect(x.right,x.top,0,x.height):new DOMRect(x.left,x.bottom,x.width,0),h=n==="horizontal"?new DOMRect(p.left,p.top,0,p.height):new DOMRect(p.left,p.top,p.width,0);switch(M.length){case 0:{z=[S,h];break}case 1:{const P=M[0],C=jr({orientation:n,rects:[x,p],targetRect:P.element.getBoundingClientRect()});z=[P,C===x?h:S];break}default:{z=M;break}}}else M.length?z=M:z=[n==="horizontal"?new DOMRect(x.right,p.top,p.left-x.right,p.height):new DOMRect(p.left,x.bottom,p.width,p.top-x.bottom)];for(const S of z){let h="width"in S?S:S.element.getBoundingClientRect();const P=Cr()?e.resizeTargetMinimumSize.coarse:e.resizeTargetMinimumSize.fine;if(h.width<P){const D=P-h.width;h=new DOMRect(h.x-D/2,h.y,h.width+D,h.height)}if(h.height<P){const D=P-h.height;h=new DOMRect(h.x,h.y-D/2,h.width,h.height+D)}const C=w<=c||w>d;!a&&!C&&l.push({group:e,groupSize:ye({group:e}),panels:[g,b],separator:"width"in S?void 0:S,rect:h}),a=!1}}s=!1,g=b,M=[]}}else if(m.hasAttribute("data-separator")){m.ariaDisabled!==null&&(a=!0);const b=o.find(x=>x.element===m);b?M.push(b):(g=void 0,M=[])}else s=!0}return l}var re;class Wt{constructor(){it(this,re,{})}addListener(t,n){const r=we(this,re)[t];return r===void 0?we(this,re)[t]=[n]:r.includes(n)||r.push(n),()=>{this.removeListener(t,n)}}emit(t,n){const r=we(this,re)[t];if(r!==void 0)if(r.length===1)r[0].call(null,n);else{let o=!1,i=null;const l=Array.from(r);for(let a=0;a<l.length;a++){const s=l[a];try{s.call(null,n)}catch(c){i===null&&(o=!0,i=c)}}if(o)throw i}}removeAllListeners(){st(this,re,{})}removeListener(t,n){const r=we(this,re)[t];if(r!==void 0){const o=r.indexOf(n);o>=0&&r.splice(o,1)}}}re=new WeakMap;let Z=new Map;const Ht=new Wt;function Pr(e){Z=new Map(Z),Z.delete(e)}function ht(e,t){for(const[n]of Z)if(n.id===e)return n}function ae(e,t){for(const[n,r]of Z)if(n.id===e)return r;if(t)throw Error(`Could not find data for Group with id ${e}`)}function de(){return Z}function Ye(e,t){return Ht.addListener("groupChange",n=>{n.group.id===e&&t(n)})}function te(e,t){const n=Z.get(e);Z=new Map(Z),Z.set(e,t),Ht.emit("groupChange",{group:e,prev:n,next:t})}function kr(e,t,n){let r,o={x:1/0,y:1/0};for(const i of t){const l=At(n,i.rect);switch(e){case"horizontal":{l.x<=o.x&&(r=i,o=l);break}case"vertical":{l.y<=o.y&&(r=i,o=l);break}}}return r?{distance:o,hitRegion:r}:void 0}function Er(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function Mr(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:vt(e),b:vt(t)};let r;for(;n.a.at(-1)===n.b.at(-1);)r=n.a.pop(),n.b.pop();T(r,"Stacking order can only be calculated for elements with a common ancestor");const o={a:gt(mt(n.a)),b:gt(mt(n.b))};if(o.a===o.b){const i=r.childNodes,l={a:n.a.at(-1),b:n.b.at(-1)};let a=i.length;for(;a--;){const s=i[a];if(s===l.a)return 1;if(s===l.b)return-1}}return Math.sign(o.a-o.b)}const Lr=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function Or(e){const t=getComputedStyle(Vt(e)??e).display;return t==="flex"||t==="inline-flex"}function Nr(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||Or(e))||+t.opacity<1||"transform"in t&&t.transform!=="none"||"webkitTransform"in t&&t.webkitTransform!=="none"||"mixBlendMode"in t&&t.mixBlendMode!=="normal"||"filter"in t&&t.filter!=="none"||"webkitFilter"in t&&t.webkitFilter!=="none"||"isolation"in t&&t.isolation==="isolate"||Lr.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function mt(e){let t=e.length;for(;t--;){const n=e[t];if(T(n,"Missing node"),Nr(n))return n}return null}function gt(e){return e&&Number(getComputedStyle(e).zIndex)||0}function vt(e){const t=[];for(;e;)t.push(e),e=Vt(e);return t}function Vt(e){const{parentNode:t}=e;return Er(t)?t.host:t}function Rr(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function Dr({groupElement:e,hitRegion:t,pointerEventTarget:n}){if(!Ft(n)||n.contains(e)||e.contains(n))return!0;if(Mr(n,e)>0){let r=n;for(;r;){if(r.contains(e))return!0;if(Rr(r.getBoundingClientRect(),t))return!1;r=r.parentElement}}return!0}function _e(e,t){const n=[];return t.forEach((r,o)=>{if(o.disabled)return;const i=Bt(o),l=kr(o.orientation,i,{x:e.clientX,y:e.clientY});l&&l.distance.x<=0&&l.distance.y<=0&&Dr({groupElement:o.element,hitRegion:l.hitRegion.rect,pointerEventTarget:e.target})&&n.push(l.hitRegion)}),n}function Ir(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0}function U(e,t,n=0){return Math.abs(q(e)-q(t))<=n}function Q(e,t){return U(e,t)?0:e>t?1:-1}function me({overrideDisabledPanels:e,panelConstraints:t,prevSize:n,size:r}){const{collapsedSize:o=0,collapsible:i,disabled:l,maxSize:a=100,minSize:s=0}=t;if(l&&!e)return n;if(Q(r,s)<0)if(i){const c=(o+s)/2;Q(r,c)<0?r=o:r=s}else r=s;return r=Math.min(a,r),r=q(r),r}function ke({delta:e,initialLayout:t,panelConstraints:n,pivotIndices:r,prevLayout:o,trigger:i}){if(U(e,0))return t;const l=i==="imperative-api",a=Object.values(t),s=Object.values(o),c=[...a],[d,v]=r;T(d!=null,"Invalid first pivot index"),T(v!=null,"Invalid second pivot index");let g=0;switch(i){case"keyboard":{{const m=e<0?v:d,b=n[m];T(b,`Panel constraints not found for index ${m}`);const{collapsedSize:x=0,collapsible:p,minSize:z=0}=b;if(p){const S=a[m];if(T(S!=null,`Previous layout not found for panel index ${m}`),U(S,x)){const h=z-S;Q(h,Math.abs(e))>0&&(e=e<0?0-h:h)}}}{const m=e<0?d:v,b=n[m];T(b,`No panel constraints found for index ${m}`);const{collapsedSize:x=0,collapsible:p,minSize:z=0}=b;if(p){const S=a[m];if(T(S!=null,`Previous layout not found for panel index ${m}`),U(S,z)){const h=S-x;Q(h,Math.abs(e))>0&&(e=e<0?0-h:h)}}}break}default:{const m=e<0?v:d,b=n[m];T(b,`Panel constraints not found for index ${m}`);const x=a[m],{collapsible:p,collapsedSize:z,minSize:S}=b;if(p&&Q(x,S)<0)if(e>0){const h=S-z,P=h/2,C=x+e;Q(C,S)<0&&(e=Q(e,P)<=0?0:h)}else{const h=S-z,P=100-h/2,C=x-e;Q(C,S)<0&&(e=Q(100+e,P)>0?0:-h)}break}}{const m=e<0?1:-1;let b=e<0?v:d,x=0;for(;;){const z=a[b];T(z!=null,`Previous layout not found for panel index ${b}`);const S=me({overrideDisabledPanels:l,panelConstraints:n[b],prevSize:z,size:100})-z;if(x+=S,b+=m,b<0||b>=n.length)break}const p=Math.min(Math.abs(e),Math.abs(x));e=e<0?0-p:p}{let m=e<0?d:v;for(;m>=0&&m<n.length;){const b=Math.abs(e)-Math.abs(g),x=a[m];T(x!=null,`Previous layout not found for panel index ${m}`);const p=x-b,z=me({overrideDisabledPanels:l,panelConstraints:n[m],prevSize:x,size:p});if(!U(x,z)&&(g+=x-z,c[m]=z,g.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?m--:m++}}if(Ir(s,c))return o;{const m=e<0?v:d,b=a[m];T(b!=null,`Previous layout not found for panel index ${m}`);const x=b+g,p=me({overrideDisabledPanels:l,panelConstraints:n[m],prevSize:b,size:x});if(c[m]=p,!U(p,x)){let z=x-p,S=e<0?v:d;for(;S>=0&&S<n.length;){const h=c[S];T(h!=null,`Previous layout not found for panel index ${S}`);const P=h+z,C=me({overrideDisabledPanels:l,panelConstraints:n[S],prevSize:h,size:P});if(U(h,C)||(z-=C-h,c[S]=C),U(z,0))break;e>0?S--:S++}}}const M=Object.values(c).reduce((m,b)=>b+m,0);if(!U(M,100,.1))return o;const w=Object.keys(o);return c.reduce((m,b,x)=>(m[w[x]]=b,m),{})}function le(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(t[n]===void 0||Q(e[n],t[n])!==0)return!1;return!0}function ce({layout:e,panelConstraints:t}){const n=Object.values(e),r=[...n],o=r.reduce((a,s)=>a+s,0);if(r.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${r.map(a=>`${a}%`).join(", ")}`);if(!U(o,100)&&r.length>0)for(let a=0;a<t.length;a++){const s=r[a];T(s!=null,`No layout data found for index ${a}`);const c=100/o*s;r[a]=c}let i=0;for(let a=0;a<t.length;a++){const s=n[a];T(s!=null,`No layout data found for index ${a}`);const c=r[a];T(c!=null,`No layout data found for index ${a}`);const d=me({overrideDisabledPanels:!0,panelConstraints:t[a],prevSize:s,size:c});c!=d&&(i+=c-d,r[a]=d)}if(!U(i,0))for(let a=0;a<t.length;a++){const s=r[a];T(s!=null,`No layout data found for index ${a}`);const c=s+i,d=me({overrideDisabledPanels:!0,panelConstraints:t[a],prevSize:s,size:c});if(s!==d&&(i-=d-s,r[a]=d,U(i,0)))break}const l=Object.keys(e);return r.reduce((a,s,c)=>(a[l[c]]=s,a),{})}function Gt({groupId:e,panelId:t}){const n=()=>{const a=de();for(const[s,{defaultLayoutDeferred:c,derivedPanelConstraints:d,layout:v,groupSize:g,separatorToPanels:M}]of a)if(s.id===e)return{defaultLayoutDeferred:c,derivedPanelConstraints:d,group:s,groupSize:g,layout:v,separatorToPanels:M};throw Error(`Group ${e} not found`)},r=()=>{const a=n().derivedPanelConstraints.find(s=>s.panelId===t);if(a!==void 0)return a;throw Error(`Panel constraints not found for Panel ${t}`)},o=()=>{const a=n().group.panels.find(s=>s.id===t);if(a!==void 0)return a;throw Error(`Layout not found for Panel ${t}`)},i=()=>{const a=n().layout[t];if(a!==void 0)return a;throw Error(`Layout not found for Panel ${t}`)},l=a=>{const s=i();if(a===s)return;const{defaultLayoutDeferred:c,derivedPanelConstraints:d,group:v,groupSize:g,layout:M,separatorToPanels:w}=n(),m=v.panels.findIndex(z=>z.id===t),b=m===v.panels.length-1,x=ke({delta:b?s-a:a-s,initialLayout:M,panelConstraints:d,pivotIndices:b?[m-1,m]:[m,m+1],prevLayout:M,trigger:"imperative-api"}),p=ce({layout:x,panelConstraints:d});le(M,p)||te(v,{defaultLayoutDeferred:c,derivedPanelConstraints:d,groupSize:g,layout:p,separatorToPanels:w})};return{collapse:()=>{const{collapsible:a,collapsedSize:s}=r(),{mutableValues:c}=o(),d=i();a&&d!==s&&(c.expandToSize=d,l(s))},expand:()=>{const{collapsible:a,collapsedSize:s,minSize:c}=r(),{mutableValues:d}=o(),v=i();if(a&&v===s){let g=d.expandToSize??c;g===0&&(g=1),l(g)}},getSize:()=>{const{group:a}=n(),s=i(),{element:c}=o(),d=a.orientation==="horizontal"?c.offsetWidth:c.offsetHeight;return{asPercentage:s,inPixels:d}},isCollapsed:()=>{const{collapsible:a,collapsedSize:s}=r(),c=i();return a&&U(s,c)},resize:a=>{const{group:s}=n(),{element:c}=o(),d=ye({group:s}),v=ze({groupSize:d,panelElement:c,styleProp:a}),g=q(v/d*100);l(g)}}}function xt(e){if(e.defaultPrevented)return;const t=de();_e(e,t).forEach(n=>{if(n.separator){const r=n.panels.find(o=>o.panelConstraints.defaultSize!==void 0);if(r){const o=r.panelConstraints.defaultSize,i=Gt({groupId:n.group.id,panelId:r.id});i&&o!==void 0&&(i.resize(o),e.preventDefault())}}})}function De(e){const t=de();for(const[n]of t)if(n.separators.some(r=>r.element===e))return n;throw Error("Could not find parent Group for separator element")}function Ut({groupId:e}){const t=()=>{const n=de();for(const[r,o]of n)if(r.id===e)return{group:r,...o};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){const{defaultLayoutDeferred:n,layout:r}=t();return n?{}:r},setLayout(n){const{defaultLayoutDeferred:r,derivedPanelConstraints:o,group:i,groupSize:l,layout:a,separatorToPanels:s}=t(),c=ce({layout:n,panelConstraints:o});return r?a:(le(a,c)||te(i,{defaultLayoutDeferred:r,derivedPanelConstraints:o,groupSize:l,layout:c,separatorToPanels:s}),c)}}}function se(e,t){const n=De(e),r=ae(n.id,!0),o=n.separators.find(d=>d.element===e);T(o,"Matching separator not found");const i=r.separatorToPanels.get(o);T(i,"Matching panels not found");const l=i.map(d=>n.panels.indexOf(d)),a=Ut({groupId:n.id}).getLayout(),s=ke({delta:t,initialLayout:a,panelConstraints:r.derivedPanelConstraints,pivotIndices:l,prevLayout:a,trigger:"keyboard"}),c=ce({layout:s,panelConstraints:r.derivedPanelConstraints});le(a,c)||te(n,{defaultLayoutDeferred:r.defaultLayoutDeferred,derivedPanelConstraints:r.derivedPanelConstraints,groupSize:r.groupSize,layout:c,separatorToPanels:r.separatorToPanels})}function yt(e){if(e.defaultPrevented)return;const t=e.currentTarget,n=De(t);if(!n.disabled)switch(e.key){case"ArrowDown":{e.preventDefault(),n.orientation==="vertical"&&se(t,5);break}case"ArrowLeft":{e.preventDefault(),n.orientation==="horizontal"&&se(t,-5);break}case"ArrowRight":{e.preventDefault(),n.orientation==="horizontal"&&se(t,5);break}case"ArrowUp":{e.preventDefault(),n.orientation==="vertical"&&se(t,-5);break}case"End":{e.preventDefault(),se(t,100);break}case"Enter":{e.preventDefault();const r=De(t),o=ae(r.id,!0),{derivedPanelConstraints:i,layout:l,separatorToPanels:a}=o,s=r.separators.find(g=>g.element===t);T(s,"Matching separator not found");const c=a.get(s);T(c,"Matching panels not found");const d=c[0],v=i.find(g=>g.panelId===d.id);if(T(v,"Panel metadata not found"),v.collapsible){const g=l[d.id],M=v.collapsedSize===g?r.mutableState.expandedPanelSizes[d.id]??v.minSize:v.collapsedSize;se(t,M-g)}break}case"F6":{e.preventDefault();const r=De(t).separators.map(l=>l.element),o=Array.from(r).findIndex(l=>l===e.currentTarget);T(o!==null,"Index not found");const i=e.shiftKey?o>0?o-1:r.length-1:o+1<r.length?o+1:0;r[i].focus({preventScroll:!0});break}case"Home":{e.preventDefault(),se(t,-100);break}}}let ve={cursorFlags:0,state:"inactive"};const Je=new Wt;function ue(){return ve}function $r(e){return Je.addListener("change",e)}function Tr(e){const t=ve,n={...ve};n.cursorFlags=e,ve=n,Je.emit("change",{prev:t,next:n})}function xe(e){const t=ve;ve=e,Je.emit("change",{prev:t,next:e})}function bt(e){if(e.defaultPrevented||e.pointerType==="mouse"&&e.button>0)return;const t=de(),n=_e(e,t),r=new Map;let o=!1;n.forEach(i=>{i.separator&&(o||(o=!0,i.separator.element.focus({preventScroll:!0})));const l=t.get(i.group);l&&r.set(i.group,l.layout)}),xe({cursorFlags:0,hitRegions:n,initialLayoutMap:r,pointerDownAtPoint:{x:e.clientX,y:e.clientY},state:"active"}),n.length&&e.preventDefault()}const Fr=e=>e,Ve=()=>{},qt=1,Kt=2,Xt=4,Yt=8,wt=3,St=12;let Re;function zt(){return Re===void 0&&(Re=!1,typeof window<"u"&&(window.navigator.userAgent.includes("Chrome")||window.navigator.userAgent.includes("Firefox"))&&(Re=!0)),Re}function Ar({cursorFlags:e,groups:t,state:n}){let r=0,o=0;switch(n){case"active":case"hover":t.forEach(i=>{if(!i.mutableState.disableCursor)switch(i.orientation){case"horizontal":{r++;break}case"vertical":{o++;break}}})}if(!(r===0&&o===0)){switch(n){case"active":{if(e&&zt()){const i=(e&qt)!==0,l=(e&Kt)!==0,a=(e&Xt)!==0,s=(e&Yt)!==0;if(i)return a?"se-resize":s?"ne-resize":"e-resize";if(l)return a?"sw-resize":s?"nw-resize":"w-resize";if(a)return"s-resize";if(s)return"n-resize"}break}}return zt()?r>0&&o>0?"move":r>0?"ew-resize":"ns-resize":r>0&&o>0?"grab":r>0?"col-resize":"row-resize"}}const jt=new WeakMap;function Qe(e){if(e.defaultView===null||e.defaultView===void 0)return;let{prevStyle:t,styleSheet:n}=jt.get(e)??{};n===void 0&&(n=new e.defaultView.CSSStyleSheet,e.adoptedStyleSheets&&e.adoptedStyleSheets.push(n));const r=ue();switch(r.state){case"active":case"hover":{const o=Ar({cursorFlags:r.cursorFlags,groups:r.hitRegions.map(l=>l.group),state:r.state}),i=`*, *:hover {cursor: ${o} !important; }`;if(t===i)return;t=i,o?n.cssRules.length===0?n.insertRule(i):n.replaceSync(i):n.cssRules.length===1&&n.deleteRule(0);break}case"inactive":{t=void 0,n.cssRules.length===1&&n.deleteRule(0);break}}jt.set(e,{prevStyle:t,styleSheet:n})}function _t({document:e,event:t,hitRegions:n,initialLayoutMap:r,mountedGroups:o,pointerDownAtPoint:i,prevCursorFlags:l}){let a=0;n.forEach(c=>{const{group:d,groupSize:v}=c,{orientation:g,panels:M}=d,{disableCursor:w}=d.mutableState;let m=0;i?g==="horizontal"?m=(t.clientX-i.x)/v*100:m=(t.clientY-i.y)/v*100:g==="horizontal"?m=t.clientX<0?-100:100:m=t.clientY<0?-100:100;const b=r.get(d),x=o.get(d);if(!b||!x)return;const{defaultLayoutDeferred:p,derivedPanelConstraints:z,groupSize:S,layout:h,separatorToPanels:P}=x;if(z&&h&&P){const C=ke({delta:m,initialLayout:b,panelConstraints:z,pivotIndices:c.panels.map(D=>M.indexOf(D)),prevLayout:h,trigger:"mouse-or-touch"});if(le(C,h)){if(m!==0&&!w)switch(g){case"horizontal":{a|=m<0?qt:Kt;break}case"vertical":{a|=m<0?Xt:Yt;break}}}else te(c.group,{defaultLayoutDeferred:p,derivedPanelConstraints:z,groupSize:S,layout:C,separatorToPanels:P})}});let s=0;t.movementX===0?s|=l&wt:s|=a&wt,t.movementY===0?s|=l&St:s|=a&St,Tr(s),Qe(e)}function Ct(e){const t=de(),n=ue();switch(n.state){case"active":_t({document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedGroups:t,prevCursorFlags:n.cursorFlags})}}function Pt(e){if(e.defaultPrevented)return;const t=ue(),n=de();switch(t.state){case"active":{if(e.buttons===0){xe({cursorFlags:0,state:"inactive"}),t.hitRegions.forEach(r=>{const o=ae(r.group.id,!0);te(r.group,o)});return}_t({document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedGroups:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break}default:{const r=_e(e,n);r.length===0?t.state!=="inactive"&&xe({cursorFlags:0,state:"inactive"}):xe({cursorFlags:0,hitRegions:r,state:"hover"}),Qe(e.currentTarget);break}}}function kt(e){if(e.relatedTarget instanceof HTMLIFrameElement)switch(ue().state){case"hover":xe({cursorFlags:0,state:"inactive"})}}function Et(e){if(e.defaultPrevented||e.pointerType==="mouse"&&e.button>0)return;const t=ue();switch(t.state){case"active":xe({cursorFlags:0,state:"inactive"}),t.hitRegions.length>0&&(Qe(e.currentTarget),t.hitRegions.forEach(n=>{const r=ae(n.group.id,!0);te(n.group,r)}),e.preventDefault())}}function Mt(e){let t=0,n=0;const r={};for(const i of e)if(i.defaultSize!==void 0){t++;const l=q(i.defaultSize);n+=l,r[i.panelId]=l}else r[i.panelId]=void 0;const o=e.length-t;if(o!==0){const i=q((100-n)/o);for(const l of e)l.defaultSize===void 0&&(r[l.panelId]=i)}return r}function Br(e,t,n){if(!n[0])return;const r=e.panels.find(s=>s.element===t);if(!r||!r.onResize)return;const o=ye({group:e}),i=e.orientation==="horizontal"?r.element.offsetWidth:r.element.offsetHeight,l=r.mutableValues.prevSize,a={asPercentage:q(i/o*100),inPixels:i};r.mutableValues.prevSize=a,r.onResize(a,r.id,l)}function Wr(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(e[n]!==t[n])return!1;return!0}function Hr({group:e,nextGroupSize:t,prevGroupSize:n,prevLayout:r}){if(n<=0||t<=0||n===t)return r;let o=0,i=0,l=!1;const a=new Map,s=[];for(const v of e.panels){const g=r[v.id]??0;switch(v.panelConstraints.groupResizeBehavior){case"preserve-pixel-size":{l=!0;const M=g/100*n,w=q(M/t*100);a.set(v.id,w),o+=w;break}case"preserve-relative-size":default:{s.push(v.id),i+=g;break}}}if(!l||s.length===0)return r;const c=100-o,d={...r};if(a.forEach((v,g)=>{d[g]=v}),i>0)for(const v of s){const g=r[v]??0;d[v]=q(g/i*c)}else{const v=q(c/s.length);for(const g of s)d[g]=v}return d}function Vr(e,t){const n=e.map(o=>o.id),r=Object.keys(t);if(n.length!==r.length)return!1;for(const o of n)if(!r.includes(o))return!1;return!0}const pe=new Map;function Gr(e){let t=!0;T(e.element.ownerDocument.defaultView,"Cannot register an unmounted Group");const n=e.element.ownerDocument.defaultView.ResizeObserver,r=new Set,o=new Set,i=new n(w=>{for(const m of w){const{borderBoxSize:b,target:x}=m;if(x===e.element){if(t){const p=ye({group:e});if(p===0)return;const z=ae(e.id);if(!z)return;const S=Ge(e),h=z.defaultLayoutDeferred?Mt(S):z.layout,P=Hr({group:e,nextGroupSize:p,prevGroupSize:z.groupSize,prevLayout:h}),C=ce({layout:P,panelConstraints:S});if(!z.defaultLayoutDeferred&&le(z.layout,C)&&Wr(z.derivedPanelConstraints,S)&&z.groupSize===p)return;te(e,{defaultLayoutDeferred:!1,derivedPanelConstraints:S,groupSize:p,layout:C,separatorToPanels:z.separatorToPanels})}}else Br(e,x,b)}});i.observe(e.element),e.panels.forEach(w=>{T(!r.has(w.id),`Panel ids must be unique; id "${w.id}" was used more than once`),r.add(w.id),w.onResize&&i.observe(w.element)});const l=ye({group:e}),a=Ge(e),s=e.panels.map(({id:w})=>w).join(",");let c=e.mutableState.defaultLayout;c&&(Vr(e.panels,c)||(c=void 0));const d=e.mutableState.layouts[s]??c??Mt(a),v=ce({layout:d,panelConstraints:a}),g=e.element.ownerDocument;pe.set(g,(pe.get(g)??0)+1);const M=new Map;return Bt(e).forEach(w=>{w.separator&&M.set(w.separator,w.panels)}),te(e,{defaultLayoutDeferred:l===0,derivedPanelConstraints:a,groupSize:l,layout:v,separatorToPanels:M}),e.separators.forEach(w=>{T(!o.has(w.id),`Separator ids must be unique; id "${w.id}" was used more than once`),o.add(w.id),w.element.addEventListener("keydown",yt)}),pe.get(g)===1&&(g.addEventListener("dblclick",xt,!0),g.addEventListener("pointerdown",bt,!0),g.addEventListener("pointerleave",Ct),g.addEventListener("pointermove",Pt),g.addEventListener("pointerout",kt),g.addEventListener("pointerup",Et,!0)),function(){t=!1,pe.set(g,Math.max(0,(pe.get(g)??0)-1)),Pr(e),e.separators.forEach(w=>{w.element.removeEventListener("keydown",yt)}),pe.get(g)||(g.removeEventListener("dblclick",xt,!0),g.removeEventListener("pointerdown",bt,!0),g.removeEventListener("pointerleave",Ct),g.removeEventListener("pointermove",Pt),g.removeEventListener("pointerout",kt),g.removeEventListener("pointerup",Et,!0)),i.disconnect()}}function Ur(){const[e,t]=u.useState({}),n=u.useCallback(()=>t({}),[]);return[e,n]}function Ze(e){const t=u.useId();return`${e??t}`}const fe=typeof window<"u"?u.useLayoutEffect:u.useEffect;function Ce(e){const t=u.useRef(e);return fe(()=>{t.current=e},[e]),u.useCallback((...n)=>{var r;return(r=t.current)==null?void 0:r.call(t,...n)},[t])}function et(...e){return Ce(t=>{e.forEach(n=>{if(n)switch(typeof n){case"function":{n(t);break}case"object":{n.current=t;break}}})})}function tt(e){const t=u.useRef({...e});return fe(()=>{for(const n in e)t.current[n]=e[n]},[e]),t.current}const Jt=u.createContext(null);function qr(e,t){const n=u.useRef({getLayout:()=>({}),setLayout:Fr});u.useImperativeHandle(t,()=>n.current,[]),fe(()=>{Object.assign(n.current,Ut({groupId:e}))})}function Qt({children:e,className:t,defaultLayout:n,disableCursor:r,disabled:o,elementRef:i,groupRef:l,id:a,onLayoutChange:s,onLayoutChanged:c,orientation:d="horizontal",resizeTargetMinimumSize:v={coarse:20,fine:10},style:g,...M}){const w=u.useRef({onLayoutChange:{},onLayoutChanged:{}}),m=Ce(k=>{le(w.current.onLayoutChange,k)||(w.current.onLayoutChange=k,s==null||s(k))}),b=Ce(k=>{le(w.current.onLayoutChanged,k)||(w.current.onLayoutChanged=k,c==null||c(k))}),x=Ze(a),p=u.useRef(null),[z,S]=Ur(),h=u.useRef({lastExpandedPanelSizes:{},layouts:{},panels:[],resizeTargetMinimumSize:v,separators:[]}),P=et(p,i);qr(x,l);const C=Ce((k,E)=>{const $=ue(),A=ht(k),j=ae(k);if(j){let R=!1;switch($.state){case"active":{R=$.hitRegions.some(H=>H.group===A);break}}return{flexGrow:j.layout[E]??1,pointerEvents:R?"none":void 0}}return{flexGrow:(n==null?void 0:n[E])??1}}),D=tt({defaultLayout:n,disableCursor:r}),F=u.useMemo(()=>({get disableCursor(){return!!D.disableCursor},getPanelStyles:C,id:x,orientation:d,registerPanel:k=>{const E=h.current;return E.panels=Ue(d,[...E.panels,k]),S(),()=>{E.panels=E.panels.filter($=>$!==k),S()}},registerSeparator:k=>{const E=h.current;return E.separators=Ue(d,[...E.separators,k]),S(),()=>{E.separators=E.separators.filter($=>$!==k),S()}},togglePanelDisabled:(k,E)=>{const $=h.current.panels.find(R=>R.id===k);$&&($.panelConstraints.disabled=E);const A=ht(x),j=ae(x);A&&j&&te(A,{...j,derivedPanelConstraints:Ge(A)})},toggleSeparatorDisabled:(k,E)=>{const $=h.current.separators.find(A=>A.id===k);$&&($.disabled=E)}}),[C,x,S,d,D]),L=u.useRef(null);return fe(()=>{const k=p.current;if(k===null)return;const E=h.current;let $;if(D.defaultLayout!==void 0&&Object.keys(D.defaultLayout).length===E.panels.length){$={};for(const _ of E.panels){const O=D.defaultLayout[_.id];O!==void 0&&($[_.id]=O)}}const A={disabled:!!o,element:k,id:x,mutableState:{defaultLayout:$,disableCursor:!!D.disableCursor,expandedPanelSizes:h.current.lastExpandedPanelSizes,layouts:h.current.layouts},orientation:d,panels:E.panels,resizeTargetMinimumSize:E.resizeTargetMinimumSize,separators:E.separators};L.current=A;const j=Gr(A),{defaultLayoutDeferred:R,derivedPanelConstraints:H,layout:G}=ae(A.id,!0);!R&&H.length>0&&(m(G),b(G));const X=Ye(x,_=>{const{defaultLayoutDeferred:O,derivedPanelConstraints:I,layout:V}=_.next;if(O||I.length===0)return;const ee=A.panels.map(({id:Y})=>Y).join(",");A.mutableState.layouts[ee]=V,I.forEach(Y=>{if(Y.collapsible){const{layout:be}=_.prev??{};if(be){const Me=U(Y.collapsedSize,V[Y.panelId]),Fe=U(Y.collapsedSize,be[Y.panelId]);Me&&!Fe&&(A.mutableState.expandedPanelSizes[Y.panelId]=be[Y.panelId])}}});const J=ue().state!=="active";m(V),J&&b(V)});return()=>{L.current=null,j(),X()}},[o,x,b,m,d,z,D]),u.useEffect(()=>{const k=L.current;k&&(k.mutableState.defaultLayout=n,k.mutableState.disableCursor=!!r)}),f.jsx(Jt.Provider,{value:F,children:f.jsx("div",{...M,className:t,"data-group":!0,"data-testid":x,id:x,ref:P,style:{height:"100%",width:"100%",overflow:"hidden",...g,display:"flex",flexDirection:d==="horizontal"?"row":"column",flexWrap:"nowrap",touchAction:d==="horizontal"?"pan-y":"pan-x"},children:e})})}Qt.displayName="Group";function nt(){const e=u.useContext(Jt);return T(e,"Group Context not found; did you render a Panel or Separator outside of a Group?"),e}function Kr(e,t){const{id:n}=nt(),r=u.useRef({collapse:Ve,expand:Ve,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:Ve});u.useImperativeHandle(t,()=>r.current,[]),fe(()=>{Object.assign(r.current,Gt({groupId:n,panelId:e}))})}function Ie({children:e,className:t,collapsedSize:n="0%",collapsible:r=!1,defaultSize:o,disabled:i,elementRef:l,groupResizeBehavior:a="preserve-relative-size",id:s,maxSize:c="100%",minSize:d="0%",onResize:v,panelRef:g,style:M,...w}){const m=!!s,b=Ze(s),x=tt({disabled:i}),p=u.useRef(null),z=et(p,l),{getPanelStyles:S,id:h,orientation:P,registerPanel:C,togglePanelDisabled:D}=nt(),F=v!==null,L=Ce((E,$,A)=>{v==null||v(E,s,A)});fe(()=>{const E=p.current;if(E!==null){const $={element:E,id:b,idIsStable:m,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:F?L:void 0,panelConstraints:{groupResizeBehavior:a,collapsedSize:n,collapsible:r,defaultSize:o,disabled:x.disabled,maxSize:c,minSize:d}};return C($)}},[a,n,r,o,F,b,m,c,d,L,C,x]),u.useEffect(()=>{D(b,!!i)},[i,b,D]),Kr(b,g);const k=u.useSyncExternalStore(E=>Ye(h,E),()=>JSON.stringify(S(h,b)),()=>JSON.stringify(S(h,b)));return f.jsx("div",{...w,"aria-disabled":i||void 0,"data-panel":!0,"data-testid":b,id:b,ref:z,style:{...Xr,display:"flex",flexBasis:0,flexShrink:1,overflow:"visible",...JSON.parse(k)},children:f.jsx("div",{className:t,style:{maxHeight:"100%",maxWidth:"100%",flexGrow:1,overflow:"auto",...M,touchAction:P==="horizontal"?"pan-y":"pan-x"},children:e})})}Ie.displayName="Panel";const Xr={minHeight:0,maxHeight:"100%",height:"auto",minWidth:0,maxWidth:"100%",width:"auto",border:"none",borderWidth:0,padding:0,margin:0};function Yr({layout:e,panelConstraints:t,panelId:n,panelIndex:r}){let o,i;const l=e[n],a=t.find(s=>s.panelId===n);if(a){const s=a.maxSize,c=a.collapsible?a.collapsedSize:a.minSize,d=[r,r+1];i=ce({layout:ke({delta:c-l,initialLayout:e,panelConstraints:t,pivotIndices:d,prevLayout:e}),panelConstraints:t})[n],o=ce({layout:ke({delta:s-l,initialLayout:e,panelConstraints:t,pivotIndices:d,prevLayout:e}),panelConstraints:t})[n]}return{valueControls:n,valueMax:o,valueMin:i,valueNow:l}}function qe({children:e,className:t,disabled:n,elementRef:r,id:o,style:i,...l}){const a=Ze(o),s=tt({disabled:n}),[c,d]=u.useState({}),[v,g]=u.useState("inactive"),M=u.useRef(null),w=et(M,r),{disableCursor:m,id:b,orientation:x,registerSeparator:p,toggleSeparatorDisabled:z}=nt(),S=x==="horizontal"?"vertical":"horizontal";fe(()=>{const P=M.current;if(P!==null){const C={disabled:s.disabled,element:P,id:a},D=p(C),F=$r(k=>{g(k.next.state!=="inactive"&&k.next.hitRegions.some(E=>E.separator===C)?k.next.state:"inactive")}),L=Ye(b,k=>{const{derivedPanelConstraints:E,layout:$,separatorToPanels:A}=k.next,j=A.get(C);if(j){const R=j[0],H=j.indexOf(R);d(Yr({layout:$,panelConstraints:E,panelId:R.id,panelIndex:H}))}});return()=>{F(),L(),D()}}},[b,a,p,s]),u.useEffect(()=>{z(a,!!n)},[n,a,z]);let h;return n&&!m&&(h="not-allowed"),f.jsx("div",{...l,"aria-controls":c.valueControls,"aria-disabled":n||void 0,"aria-orientation":S,"aria-valuemax":c.valueMax,"aria-valuemin":c.valueMin,"aria-valuenow":c.valueNow,children:e,className:t,"data-separator":n?"disabled":v,"data-testid":a,id:a,ref:w,role:"separator",style:{flexBasis:"auto",cursor:h,...i,flexGrow:0,flexShrink:0,touchAction:"none"},tabIndex:n?void 0:0})}qe.displayName="Separator";function Ke(e){var r;const t=((r=e.split(".").pop())==null?void 0:r.toLowerCase())||"";return{js:"text-yellow-600",ts:"text-blue-500",tsx:"text-blue-400",jsx:"text-yellow-500",py:"text-green-600",rb:"text-red-500",go:"text-cyan-600",html:"text-orange-500",css:"text-purple-500",json:"text-green-500",md:"text-slate",yaml:"text-green-400",yml:"text-green-400",sh:"text-green-600",bash:"text-green-600",rs:"text-orange-600",java:"text-red-600",kt:"text-purple-600",sql:"text-blue-600",svg:"text-orange-400"}[t]||"text-charcoal/80"}function Xe(e,t){var o;if(t==="directory")return"[ ]";const n=((o=e.split(".").pop())==null?void 0:o.toLowerCase())||"";return{js:"JS",ts:"TS",tsx:"TX",jsx:"JX",py:"PY",html:"<>",css:"##",json:"{}",md:"MD",yml:"YL",yaml:"YL",sh:"SH",go:"GO",rs:"RS",rb:"RB",java:"JV",kt:"KT",sql:"SQ",svg:"SV",png:"IM",jpg:"IM",gif:"IM",ico:"IC"}[n]||".."}function _r(e){var o;const t=((o=e.split(".").pop())==null?void 0:o.toLowerCase())||"",n={js:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",py:"python",html:"html",htm:"html",css:"css",scss:"scss",less:"less",json:"json",md:"markdown",go:"go",rs:"rust",sh:"shell",bash:"shell",yml:"yaml",yaml:"yaml",xml:"xml",svg:"xml",sql:"sql",java:"java",kt:"kotlin",rb:"ruby",dockerfile:"dockerfile"},r=e.toLowerCase();return r==="dockerfile"?"dockerfile":r==="makefile"?"makefile":n[t]||"plaintext"}function Zt(e){for(const t of e)if(t.type==="file"&&t.name.endsWith(".html")||t.children&&Zt(t.children))return!0;return!1}function en(e,t){for(const n of e){if(n.path===t)return n.size;if(n.children){const r=en(n.children,t);if(r!==void 0)return r}}}function tn(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function nn({nodes:e,selectedPath:t,onSelect:n,onDelete:r,depth:o=0}){const[i,l]=u.useState(()=>{const a=new Set;return o<2&&e.filter(s=>s.type==="directory").forEach(s=>a.add(s.path)),a});return f.jsx("div",{children:e.map(a=>{const s=a.type==="directory",c=i.has(a.path),d=a.path===t;return f.jsxs("div",{className:"group/file",children:[f.jsxs("button",{onClick:()=>{s?l(v=>{const g=new Set(v);return g.has(a.path)?g.delete(a.path):g.add(a.path),g}):n(a.path,a.name)},className:`w-full text-left flex items-center gap-1.5 px-2 py-1 text-xs font-mono rounded transition-colors ${d?"bg-accent-product/10 text-accent-product":"text-charcoal/70 hover:bg-white/40"}`,style:{paddingLeft:`${o*14+8}px`},children:[s?f.jsx("span",{className:"text-[10px] text-slate w-3 text-center flex-shrink-0",children:c?"v":">"}):f.jsx("span",{className:"w-3 flex-shrink-0"}),f.jsx("span",{className:`text-[10px] font-bold w-5 text-center flex-shrink-0 ${s?"text-accent-product":Ke(a.name)}`,children:Xe(a.name,a.type)}),f.jsxs("span",{className:"truncate",children:[a.name,s?"/":""]}),!s&&a.size!=null&&a.size>0&&f.jsx("span",{className:"text-[10px] text-slate/40 ml-auto flex-shrink-0",children:tn(a.size)}),!s&&r&&f.jsx("span",{role:"button",tabIndex:-1,onClick:v=>{v.stopPropagation(),r(a.path,a.name)},onKeyDown:v=>{v.key==="Enter"&&(v.stopPropagation(),r(a.path,a.name))},className:"text-[10px] text-slate/30 hover:text-red-500 ml-1 flex-shrink-0 opacity-0 group-hover/file:opacity-100 transition-opacity cursor-pointer",title:"Delete file",children:"x"})]}),s&&c&&a.children&&f.jsx(nn,{nodes:a.children,selectedPath:t,onSelect:n,onDelete:r,depth:o+1})]},a.path)})})}function rn(e,t=""){const n=[];for(const r of e)r.type==="file"&&n.push({path:r.path,name:r.name}),r.children&&n.push(...rn(r.children,r.path+"/"));return n}function Jr({session:e,onClose:t}){var rt;const[n,r]=u.useState(null),[o,i]=u.useState(""),[l,a]=u.useState(null),[s,c]=u.useState(null),[d,v]=u.useState(!1),[g,M]=u.useState(!1),[w,m]=u.useState(!1),[b,x]=u.useState(!1),[p,z]=u.useState(e),S=u.useRef(null),[h,P]=u.useState([]),[C,D]=u.useState(!1),[F,L]=u.useState(""),k=u.useRef(null),E=u.useRef(null),[$,A]=u.useState(0),j=Zt(p.files),R=`/api/sessions/${encodeURIComponent(p.id)}/preview/index.html`,H=u.useCallback(async()=>{try{const y=await ne.getSessionDetail(p.id);z(y)}catch{}},[p.id]),G=u.useCallback(async(y,N)=>{w&&n&&s!==null&&P(W=>W.map(ie=>ie.path===n?{...ie,content:s,modified:!0}:ie));const B=h.find(W=>W.path===y);if(B){r(y),i(N),a(B.content),c(B.content),m(B.modified);return}r(y),i(N),v(!0),m(!1);try{const W=p.id?await ne.getSessionFileContent(p.id,y):await ne.getFileContent(y);a(W.content),c(W.content),P(ie=>[...ie,{path:y,name:N,content:W.content,modified:!1}])}catch{a("[Error loading file]"),c("[Error loading file]")}finally{v(!1)}},[p.id,w,n,s,h]),X=u.useCallback(async()=>{var y;if(!(!n||s===null||!p.id)){x(!0);try{await ne.saveSessionFile(p.id,n,s),a(s),m(!1),P(B=>B.map(W=>W.path===n?{...W,content:s,modified:!1}:W));const N=((y=n.split(".").pop())==null?void 0:y.toLowerCase())||"";["html","css","js","jsx","ts","tsx"].includes(N)&&A(B=>B+1)}catch(N){const B=N instanceof Error?N.message:"Unknown error";window.alert(`Save failed: ${B}`)}finally{x(!1)}}},[n,s,p.id]),_=u.useCallback(y=>{const N=h.find(B=>B.path===y);if(!(N!=null&&N.modified&&!window.confirm("Unsaved changes. Close anyway?"))&&(P(B=>B.filter(W=>W.path!==y)),n===y)){const B=h.filter(W=>W.path!==y);if(B.length>0){const W=B[B.length-1];r(W.path),i(W.name),a(W.content),c(W.content),m(W.modified)}else r(null),i(""),a(null),c(null),m(!1)}},[h,n]);u.useEffect(()=>{const y=N=>{(N.metaKey||N.ctrlKey)&&N.key==="s"&&(N.preventDefault(),w&&n&&X()),(N.metaKey||N.ctrlKey)&&N.key==="p"&&(N.preventDefault(),D(B=>!B),L("")),N.key==="Escape"&&C&&D(!1)};return window.addEventListener("keydown",y),()=>window.removeEventListener("keydown",y)},[w,n,X,C]),u.useEffect(()=>{C&&k.current&&k.current.focus()},[C]);const O=rn(p.files),I=F?O.filter(y=>y.path.toLowerCase().includes(F.toLowerCase())):O;u.useEffect(()=>{const y=p.files.find(N=>N.name==="index.html"&&N.type==="file");y&&(G(y.path,y.name),M(!0))},[]);const V=u.useCallback(y=>{y!==void 0&&(c(y),m(y!==l))},[l]),ee=u.useCallback(y=>{S.current=y},[]),J=u.useCallback(async()=>{const y=window.prompt("New file name (e.g. src/utils.ts):");if(!(!y||!y.trim()))try{await ne.createSessionFile(p.id,y.trim()),await H()}catch(N){const B=N instanceof Error?N.message:"Unknown error";window.alert(`Create file failed: ${B}`)}},[p.id,H]),Y=u.useCallback(async()=>{const y=window.prompt("New folder name (e.g. src/components):");if(!(!y||!y.trim()))try{await ne.createSessionDirectory(p.id,y.trim()),await H()}catch(N){const B=N instanceof Error?N.message:"Unknown error";window.alert(`Create folder failed: ${B}`)}},[p.id,H]),be=u.useCallback(async(y,N)=>{if(window.confirm(`Delete "${N}"?`))try{await ne.deleteSessionFile(p.id,y),n===y&&(r(null),i(""),a(null),c(null),m(!1)),await H()}catch(W){const ie=W instanceof Error?W.message:"Unknown error";window.alert(`Delete failed: ${ie}`)}},[p.id,n,H]),Me=n?en(p.files,n):void 0,Fe=((rt=o.split(".").pop())==null?void 0:rt.toUpperCase())||"";return f.jsxs("div",{className:"flex flex-col h-full",children:[f.jsxs("div",{className:"glass px-5 py-3 flex items-center gap-4 flex-shrink-0 border-b border-white/10",children:[f.jsx("button",{onClick:()=>{w&&!window.confirm("Unsaved changes. Discard?")||t()},className:"text-xs font-medium px-3 py-1.5 rounded-lg border border-white/20 text-slate hover:text-charcoal hover:bg-white/30 transition-colors",children:"Back"}),f.jsxs("div",{className:"flex-1 min-w-0",children:[f.jsx("h2",{className:"text-sm font-bold text-charcoal truncate",children:p.id}),f.jsx("p",{className:"text-[10px] font-mono text-slate truncate",children:p.path})]}),f.jsx("span",{className:`text-[10px] font-semibold px-2 py-0.5 rounded-full ${p.status==="completed"||p.status==="completion_promise_fulfilled"?"bg-success/10 text-success":"bg-slate/10 text-slate"}`,children:p.status}),j&&f.jsx("button",{onClick:()=>M(!g),className:`text-xs font-medium px-3 py-1.5 rounded-lg border transition-colors ${g?"border-accent-product/40 bg-accent-product/10 text-accent-product":"border-white/20 text-slate hover:text-charcoal hover:bg-white/30"}`,children:g?"Hide Preview":"Preview"})]}),f.jsx("div",{className:"flex-1 min-h-0",children:f.jsxs(Qt,{orientation:"horizontal",className:"h-full",children:[f.jsx(Ie,{defaultSize:20,minSize:15,children:f.jsxs("div",{className:"h-full flex flex-col border-r border-white/10 bg-white/30",children:[f.jsxs("div",{className:"px-3 py-2 border-b border-white/10 flex items-center gap-2",children:[f.jsx("span",{className:"text-[10px] text-slate uppercase tracking-wider font-semibold flex-1",children:"Files"}),f.jsx("button",{onClick:J,title:"New File",className:"text-[10px] text-slate hover:text-accent-product px-1.5 py-0.5 rounded border border-white/20 hover:border-accent-product/30 transition-colors",children:"+ File"}),f.jsx("button",{onClick:Y,title:"New Folder",className:"text-[10px] text-slate hover:text-accent-product px-1.5 py-0.5 rounded border border-white/20 hover:border-accent-product/30 transition-colors",children:"+ Dir"})]}),f.jsx("div",{className:"flex-1 overflow-y-auto terminal-scroll",children:p.files.length>0?f.jsx(nn,{nodes:p.files,selectedPath:n,onSelect:G,onDelete:be}):f.jsx("div",{className:"p-4 text-xs text-slate",children:"No files"})})]})}),f.jsx(qe,{className:"w-1 bg-white/10 hover:bg-accent-product/30 transition-colors cursor-col-resize"}),f.jsx(Ie,{defaultSize:g?50:80,minSize:25,children:f.jsxs("div",{className:"h-full flex flex-col min-w-0",children:[h.length>0&&f.jsx("div",{className:"flex items-center border-b border-white/10 bg-white/10 overflow-x-auto flex-shrink-0",children:h.map(y=>f.jsxs("button",{onClick:()=>G(y.path,y.name),className:`flex items-center gap-1.5 px-3 py-1.5 text-[11px] font-mono border-r border-white/10 whitespace-nowrap transition-colors ${y.path===n?"bg-white/40 text-charcoal":"text-slate hover:text-charcoal hover:bg-white/20"}`,children:[f.jsx("span",{className:`text-[9px] font-bold ${Ke(y.name)}`,children:Xe(y.name,"file")}),y.name,y.modified&&f.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent-product"}),f.jsx("span",{role:"button",tabIndex:-1,onClick:N=>{N.stopPropagation(),_(y.path)},onKeyDown:N=>{N.key==="Enter"&&(N.stopPropagation(),_(y.path))},className:"text-slate/30 hover:text-danger ml-1 cursor-pointer",children:"x"})]},y.path))}),n?f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"px-4 py-1.5 border-b border-white/10 flex items-center gap-2 flex-shrink-0 bg-white/20",children:[f.jsx("span",{className:"text-xs font-mono text-charcoal/60 truncate",children:n}),b&&f.jsx("span",{className:"text-[10px] text-accent-product animate-pulse flex-shrink-0",children:"Saving..."}),f.jsx("span",{className:"ml-auto text-[10px] text-slate/50 font-mono",children:Me!=null?tn(Me):""}),f.jsx("span",{className:"text-[10px] text-slate/40 font-mono uppercase",children:Fe}),w&&f.jsx("button",{onClick:X,className:"text-[10px] font-medium px-2 py-0.5 rounded border border-accent-product/40 bg-accent-product/10 text-accent-product hover:bg-accent-product/20 transition-colors",children:"Save"})]}),f.jsx("div",{className:"flex-1 min-h-0",children:d?f.jsx("div",{className:"text-slate text-xs animate-pulse p-4",children:"Loading..."}):f.jsx(gr,{value:s??"",language:_r(o),theme:"vs",onChange:V,onMount:ee,options:{minimap:{enabled:!1},fontSize:13,lineNumbers:"on",wordWrap:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:8},renderLineHighlight:"line",smoothScrolling:!0,cursorBlinking:"smooth",folding:!0,bracketPairColorization:{enabled:!0}}})})]}):f.jsx("div",{className:"flex-1 flex items-center justify-center text-slate text-sm",children:"Select a file to view its contents"})]})}),g&&f.jsxs(f.Fragment,{children:[f.jsx(qe,{className:"w-1 bg-white/10 hover:bg-accent-product/30 transition-colors cursor-col-resize"}),f.jsx(Ie,{defaultSize:30,minSize:20,collapsible:!0,children:f.jsxs("div",{className:"h-full flex flex-col border-l border-white/10",children:[f.jsxs("div",{className:"px-4 py-2 border-b border-white/10 flex items-center gap-2 flex-shrink-0 bg-white/20",children:[f.jsx("span",{className:"text-xs font-semibold text-charcoal",children:"Live Preview"}),f.jsx("span",{className:"text-[10px] font-mono text-slate/50 truncate ml-auto",children:R})]}),f.jsx("div",{className:"flex-1 bg-white",children:f.jsx("iframe",{ref:E,src:R,title:"Project Preview",className:"w-full h-full border-0",sandbox:"allow-scripts allow-same-origin allow-forms allow-popups"},$)})]})})]})]})}),C&&f.jsx("div",{className:"fixed inset-0 z-50 flex items-start justify-center pt-[20vh]",onClick:()=>D(!1),children:f.jsxs("div",{className:"bg-white rounded-xl shadow-2xl border border-white/20 w-full max-w-lg",onClick:y=>y.stopPropagation(),children:[f.jsx("input",{ref:k,type:"text",value:F,onChange:y=>L(y.target.value),placeholder:"Search files by name...",className:"w-full px-4 py-3 text-sm font-mono border-b border-white/10 outline-none rounded-t-xl bg-transparent",onKeyDown:y=>{y.key==="Enter"&&I.length>0&&(G(I[0].path,I[0].name),D(!1)),y.key==="Escape"&&D(!1)}}),f.jsxs("div",{className:"max-h-64 overflow-y-auto",children:[I.slice(0,20).map(y=>f.jsxs("button",{onClick:()=>{G(y.path,y.name),D(!1)},className:"w-full text-left px-4 py-2 text-xs font-mono hover:bg-accent-product/5 flex items-center gap-2",children:[f.jsx("span",{className:`text-[10px] font-bold ${Ke(y.name)}`,children:Xe(y.name,"file")}),f.jsx("span",{className:"text-charcoal",children:y.name}),f.jsx("span",{className:"text-slate/40 ml-auto truncate text-[10px]",children:y.path})]},y.path)),I.length===0&&f.jsx("div",{className:"px-4 py-3 text-xs text-slate",children:"No matching files"})]})]})})]})}function eo(){const{sessionId:e}=on(),t=an(),[n,r]=u.useState(null),[o,i]=u.useState(!0),[l,a]=u.useState(null);return u.useEffect(()=>{e&&(i(!0),a(null),ne.getSessionDetail(e).then(s=>{r(s),i(!1)}).catch(s=>{a(s instanceof Error?s.message:"Failed to load session"),i(!1)}))},[e]),o?f.jsxs("div",{className:"h-screen bg-background flex flex-col",children:[f.jsx(Ae,{status:null,wsConnected:!1}),f.jsx("div",{className:"flex-1 flex items-center justify-center",children:f.jsxs("div",{className:"text-center",children:[f.jsx("div",{className:"text-slate animate-pulse text-sm",children:"Loading project..."}),f.jsx("div",{className:"text-[10px] font-mono text-slate/50 mt-2",children:e})]})})]}):l||!n?f.jsxs("div",{className:"h-screen bg-background flex flex-col",children:[f.jsx(Ae,{status:null,wsConnected:!1}),f.jsx("div",{className:"flex-1 flex items-center justify-center",children:f.jsxs("div",{className:"text-center",children:[f.jsx("p",{className:"text-danger text-sm font-medium",children:"Project not found"}),f.jsx("p",{className:"text-xs text-slate mt-1",children:l||`Session ${e} does not exist`}),f.jsx("button",{onClick:()=>t("/"),className:"mt-4 px-4 py-2 rounded-xl text-sm font-semibold border border-accent-product/30 text-accent-product hover:bg-accent-product/5 transition-all",children:"Back to Home"})]})})]}):f.jsxs("div",{className:"h-screen bg-background flex flex-col",children:[f.jsx(Ae,{status:null,wsConnected:!1}),f.jsx("div",{className:"flex-1 min-h-0",children:f.jsx(sn,{name:"ProjectWorkspace",children:f.jsx(Jr,{session:n,onClose:()=>t("/")})})})]})}export{eo as default};
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,Cascadia Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.terminal-scroll::-webkit-scrollbar{width:6px}.terminal-scroll::-webkit-scrollbar-track{background:transparent}.terminal-scroll::-webkit-scrollbar-thumb{background:#3d52a033;border-radius:3px}.terminal-scroll::-webkit-scrollbar-thumb:hover{background:#3d52a059}.glass{background:#fff9;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.3);border-radius:16px;box-shadow:0 8px 32px #3d52a014}.glass-subtle{background:#fff6;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.2);border-radius:12px;box-shadow:0 4px 16px #3d52a00f}.pattern-circles{position:absolute;top:0;right:0;bottom:0;left:0;opacity:.04;background-image:radial-gradient(circle at 20% 30%,transparent 30%,#6C63FF 30.5%,transparent 31%),radial-gradient(circle at 80% 70%,transparent 25%,#6C63FF 25.5%,transparent 26%),radial-gradient(circle at 50% 50%,transparent 40%,#6C63FF 40.5%,transparent 41%);pointer-events:none}@keyframes phase-pulse{0%,to{opacity:1}50%{opacity:.5}}.phase-active{animation:phase-pulse 2s ease-in-out infinite}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:0}}.terminal-cursor:after{content:"";display:inline-block;width:8px;height:16px;background:#7091e6;animation:cursor-blink 1s step-end infinite;margin-left:2px;vertical-align:text-bottom}.\!visible{visibility:visible!important}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.right-0{right:0}.top-0{top:0}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-5{grid-column:span 5 / span 5}.col-span-6{grid-column:span 6 / span 6}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.grid{display:grid}.contents{display:contents}.h-1\.5{height:.375rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-28{height:7rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-64{max-height:16rem}.max-h-\[400px\]{max-height:400px}.min-h-0{min-height:0px}.min-h-\[280px\]{min-height:280px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-8{width:2rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-3xl{max-width:48rem}.max-w-\[1920px\]{max-width:1920px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-accent-product{--tw-border-opacity: 1;border-color:rgb(108 99 255 / var(--tw-border-opacity, 1))}.border-accent-product\/20{border-color:#6c63ff33}.border-accent-product\/30{border-color:#6c63ff4d}.border-accent-product\/40{border-color:#6c63ff66}.border-danger\/20{border-color:#c45b5b33}.border-primary-wash\/30{border-color:#8697c44d}.border-primary\/20{border-color:#3d52a033}.border-slate\/20{border-color:#4f5d7533}.border-success\/20{border-color:#7fb06933}.border-surface\/50{border-color:#adbbda80}.border-warning\/10{border-color:#d4a03c1a}.border-warning\/20{border-color:#d4a03c33}.border-warning\/30{border-color:#d4a03c4d}.border-warning\/40{border-color:#d4a03c66}.border-white\/10{border-color:#ffffff1a}.border-white\/20{border-color:#fff3}.border-white\/30{border-color:#ffffff4d}.border-t-transparent{border-top-color:transparent}.bg-accent-product{--tw-bg-opacity: 1;background-color:rgb(108 99 255 / var(--tw-bg-opacity, 1))}.bg-accent-product\/10{background-color:#6c63ff1a}.bg-background{--tw-bg-opacity: 1;background-color:rgb(237 232 245 / var(--tw-bg-opacity, 1))}.bg-black\/30{background-color:#0000004d}.bg-black\/5{background-color:#0000000d}.bg-charcoal\/10{background-color:#2d31421a}.bg-charcoal\/5{background-color:#2d31420d}.bg-charcoal\/\[0\.03\]{background-color:#2d314208}.bg-danger{--tw-bg-opacity: 1;background-color:rgb(196 91 91 / var(--tw-bg-opacity, 1))}.bg-danger\/10{background-color:#c45b5b1a}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(61 82 160 / var(--tw-bg-opacity, 1))}.bg-primary-light{--tw-bg-opacity: 1;background-color:rgb(112 145 230 / var(--tw-bg-opacity, 1))}.bg-primary-wash\/20{background-color:#8697c433}.bg-primary\/10{background-color:#3d52a01a}.bg-slate{--tw-bg-opacity: 1;background-color:rgb(79 93 117 / var(--tw-bg-opacity, 1))}.bg-slate\/10{background-color:#4f5d751a}.bg-slate\/30{background-color:#4f5d754d}.bg-slate\/40{background-color:#4f5d7566}.bg-success{--tw-bg-opacity: 1;background-color:rgb(127 176 105 / var(--tw-bg-opacity, 1))}.bg-success\/10{background-color:#7fb0691a}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(173 187 218 / var(--tw-bg-opacity, 1))}.bg-surface\/30{background-color:#adbbda4d}.bg-surface\/50{background-color:#adbbda80}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:rgb(212 160 60 / var(--tw-bg-opacity, 1))}.bg-warning\/10{background-color:#d4a03c1a}.bg-warning\/5{background-color:#d4a03c0d}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/20{background-color:#fff3}.bg-white\/30{background-color:#ffffff4d}.bg-white\/40{background-color:#fff6}.fill-charcoal{fill:#2d3142}.fill-primary{fill:#3d52a0}.p-0{padding:0}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2\.5{padding-bottom:.625rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-\[20vh\]{padding-top:20vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,Fira Code,Cascadia Code,monospace}.font-sans{font-family:Inter,system-ui,-apple-system,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-accent-product{--tw-text-opacity: 1;color:rgb(108 99 255 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-charcoal{--tw-text-opacity: 1;color:rgb(45 49 66 / var(--tw-text-opacity, 1))}.text-charcoal\/60{color:#2d314299}.text-charcoal\/70{color:#2d3142b3}.text-charcoal\/80{color:#2d3142cc}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-danger{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:rgb(61 82 160 / var(--tw-text-opacity, 1))}.text-primary-light{--tw-text-opacity: 1;color:rgb(112 145 230 / var(--tw-text-opacity, 1))}.text-primary-wash{--tw-text-opacity: 1;color:rgb(134 151 196 / var(--tw-text-opacity, 1))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-slate{--tw-text-opacity: 1;color:rgb(79 93 117 / var(--tw-text-opacity, 1))}.text-slate\/30{color:#4f5d754d}.text-slate\/40{color:#4f5d7566}.text-slate\/50{color:#4f5d7580}.text-slate\/60{color:#4f5d7599}.text-success{--tw-text-opacity: 1;color:rgb(127 176 105 / var(--tw-text-opacity, 1))}.text-warning{--tw-text-opacity: 1;color:rgb(212 160 60 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glass{--tw-shadow: 0 8px 32px rgba(61,82,160,.08);--tw-shadow-colored: 0 8px 32px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glass-subtle{--tw-shadow: 0 4px 16px rgba(61,82,160,.06);--tw-shadow-colored: 0 4px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-accent-product\/20{--tw-shadow-color: rgb(108 99 255 / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.placeholder\:text-primary-wash::-moz-placeholder{--tw-text-opacity: 1;color:rgb(134 151 196 / var(--tw-text-opacity, 1))}.placeholder\:text-primary-wash::placeholder{--tw-text-opacity: 1;color:rgb(134 151 196 / var(--tw-text-opacity, 1))}.placeholder\:text-primary-wash\/70::-moz-placeholder{color:#8697c4b3}.placeholder\:text-primary-wash\/70::placeholder{color:#8697c4b3}.hover\:border-accent-product\/30:hover{border-color:#6c63ff4d}.hover\:bg-accent-product\/20:hover{background-color:#6c63ff33}.hover\:bg-accent-product\/30:hover{background-color:#6c63ff4d}.hover\:bg-accent-product\/5:hover{background-color:#6c63ff0d}.hover\:bg-accent-product\/90:hover{background-color:#6c63ffe6}.hover\:bg-danger\/20:hover{background-color:#c45b5b33}.hover\:bg-primary\/5:hover{background-color:#3d52a00d}.hover\:bg-warning\/10:hover{background-color:#d4a03c1a}.hover\:bg-white\/20:hover{background-color:#fff3}.hover\:bg-white\/30:hover{background-color:#ffffff4d}.hover\:bg-white\/40:hover{background-color:#fff6}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-accent-product:hover{--tw-text-opacity: 1;color:rgb(108 99 255 / var(--tw-text-opacity, 1))}.hover\:text-charcoal:hover{--tw-text-opacity: 1;color:rgb(45 49 66 / var(--tw-text-opacity, 1))}.hover\:text-danger:hover{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.hover\:text-primary-light:hover{--tw-text-opacity: 1;color:rgb(112 145 230 / var(--tw-text-opacity, 1))}.hover\:text-primary\/80:hover{color:#3d52a0cc}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.focus\:border-accent-product\/30:focus{border-color:#6c63ff4d}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent-product\/20:focus{--tw-ring-color: rgb(108 99 255 / .2)}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-accent-product{--tw-text-opacity: 1;color:rgb(108 99 255 / var(--tw-text-opacity, 1))}.group\/file:hover .group-hover\/file\:opacity-100{opacity:1}