umans-gate 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/LICENSE +21 -0
  3. package/README.md +354 -0
  4. package/dashboard/dist/assets/alert-dialog-DlhAyxD3.js +2 -0
  5. package/dashboard/dist/assets/alert-dialog-DlhAyxD3.js.map +1 -0
  6. package/dashboard/dist/assets/clear-confirm-dialog-BOcl93wD.js +2 -0
  7. package/dashboard/dist/assets/clear-confirm-dialog-BOcl93wD.js.map +1 -0
  8. package/dashboard/dist/assets/config-tab-pnBjiSyC.js +4 -0
  9. package/dashboard/dist/assets/config-tab-pnBjiSyC.js.map +1 -0
  10. package/dashboard/dist/assets/economics-tab-BJXa5ydD.js +2 -0
  11. package/dashboard/dist/assets/economics-tab-BJXa5ydD.js.map +1 -0
  12. package/dashboard/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  13. package/dashboard/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  14. package/dashboard/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  15. package/dashboard/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  16. package/dashboard/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  17. package/dashboard/dist/assets/headers-viewer-C9FKdG-_.js +2 -0
  18. package/dashboard/dist/assets/headers-viewer-C9FKdG-_.js.map +1 -0
  19. package/dashboard/dist/assets/index-72wCsW4_.js +3 -0
  20. package/dashboard/dist/assets/index-72wCsW4_.js.map +1 -0
  21. package/dashboard/dist/assets/index-DFhG4t-C.css +1 -0
  22. package/dashboard/dist/assets/json-viewer-CXkZMoVn.js +2 -0
  23. package/dashboard/dist/assets/json-viewer-CXkZMoVn.js.map +1 -0
  24. package/dashboard/dist/assets/mode-toggle-BxkGFiYG.js +2 -0
  25. package/dashboard/dist/assets/mode-toggle-BxkGFiYG.js.map +1 -0
  26. package/dashboard/dist/assets/models-tab-Deqk3WT3.js +2 -0
  27. package/dashboard/dist/assets/models-tab-Deqk3WT3.js.map +1 -0
  28. package/dashboard/dist/assets/performance-meter-Bd152C4C.js +2 -0
  29. package/dashboard/dist/assets/performance-meter-Bd152C4C.js.map +1 -0
  30. package/dashboard/dist/assets/select-mZPf2BR3.js +2 -0
  31. package/dashboard/dist/assets/select-mZPf2BR3.js.map +1 -0
  32. package/dashboard/dist/assets/sheet-BgQXtbdw.js +2 -0
  33. package/dashboard/dist/assets/sheet-BgQXtbdw.js.map +1 -0
  34. package/dashboard/dist/assets/sonner-DGu1DGeO.js +2 -0
  35. package/dashboard/dist/assets/sonner-DGu1DGeO.js.map +1 -0
  36. package/dashboard/dist/assets/sse-viewer-BHnn3FcY.js +3 -0
  37. package/dashboard/dist/assets/sse-viewer-BHnn3FcY.js.map +1 -0
  38. package/dashboard/dist/assets/use-capture-done-listener-u5RxfYQP.js +2 -0
  39. package/dashboard/dist/assets/use-capture-done-listener-u5RxfYQP.js.map +1 -0
  40. package/dashboard/dist/assets/use-models-B4MLkfpt.js +2 -0
  41. package/dashboard/dist/assets/use-models-B4MLkfpt.js.map +1 -0
  42. package/dashboard/dist/assets/use-polling-resource-D_vWHFwW.js +2 -0
  43. package/dashboard/dist/assets/use-polling-resource-D_vWHFwW.js.map +1 -0
  44. package/dashboard/dist/assets/vendor-CVKsgXJU.js +312 -0
  45. package/dashboard/dist/assets/vendor-CVKsgXJU.js.map +1 -0
  46. package/dashboard/dist/assets/vendor-DtX4s2-2.css +1 -0
  47. package/dashboard/dist/assets/vendor-react-Dtud3GyP.js +41 -0
  48. package/dashboard/dist/assets/vendor-react-Dtud3GyP.js.map +1 -0
  49. package/dashboard/dist/assets/vision-calls-BquNiDzm.js +3 -0
  50. package/dashboard/dist/assets/vision-calls-BquNiDzm.js.map +1 -0
  51. package/dashboard/dist/index.html +34 -0
  52. package/dist/cli.d.ts +1 -0
  53. package/dist/cli.js +6788 -0
  54. package/dist/cli.js.map +1 -0
  55. package/dist/index.d.ts +1094 -0
  56. package/dist/index.js +6443 -0
  57. package/dist/index.js.map +1 -0
  58. package/package.json +85 -0
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){:root,:host{--shimmer-angle:20deg}*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0;--scroll-fade-t:0px;--scroll-fade-b:0px;--scroll-fade-s:0px;--scroll-fade-e:0px;--scroll-fade-mask:initial;--shimmer-image:initial;--shimmer-text-fill:initial}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-black:#000;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:calc(var(--radius) - 2px);--radius-4xl:2rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-xs:4px;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Variable", sans-serif;--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:0 0% 100%;--foreground:0 0% 14.5%;--card:0 0% 100%;--card-foreground:0 0% 14.5%;--popover:0 0% 100%;--popover-foreground:0 0% 14.5%;--primary:0 0% 20.5%;--primary-foreground:0 0% 98.5%;--secondary:0 0% 97%;--secondary-foreground:0 0% 20.5%;--muted:0 0% 97%;--muted-foreground:0 0% 55.6%;--accent:0 0% 97%;--accent-foreground:0 0% 20.5%;--destructive:0 72% 51%;--destructive-foreground:0 0% 98%;--border:0 0% 92.2%;--input:0 0% 92.2%;--ring:0 0% 70.8%;--radius:.625rem;--chart-1:0 0% 87%;--chart-2:0 0% 55.6%;--chart-3:0 0% 43.9%;--chart-4:0 0% 37.1%;--chart-5:0 0% 26.9%;--sidebar:0 0% 98.5%;--sidebar-foreground:0 0% 14.5%;--sidebar-primary:0 0% 20.5%;--sidebar-primary-foreground:0 0% 98.5%;--sidebar-accent:0 0% 97%;--sidebar-accent-foreground:0 0% 20.5%;--sidebar-border:0 0% 92.2%;--sidebar-ring:0 0% 70.8%}.dark{--background:0 0% 14.5%;--foreground:0 0% 98.5%;--card:0 0% 20.5%;--card-foreground:0 0% 98.5%;--popover:0 0% 20.5%;--popover-foreground:0 0% 98.5%;--primary:0 0% 92.2%;--primary-foreground:0 0% 20.5%;--secondary:0 0% 26.9%;--secondary-foreground:0 0% 98.5%;--muted:0 0% 26.9%;--muted-foreground:0 0% 70.8%;--accent:0 0% 26.9%;--accent-foreground:0 0% 98.5%;--destructive:0 63% 56%;--destructive-foreground:0 0% 98%;--border:0 0% 100% / 10%;--input:0 0% 100% / 15%;--ring:0 0% 55.6%;--chart-1:0 0% 87%;--chart-2:0 0% 55.6%;--chart-3:0 0% 43.9%;--chart-4:0 0% 37.1%;--chart-5:0 0% 26.9%;--sidebar:0 0% 20.5%;--sidebar-foreground:0 0% 98.5%;--sidebar-primary:263 70% 65%;--sidebar-primary-foreground:0 0% 98.5%;--sidebar-accent:0 0% 26.9%;--sidebar-accent-foreground:0 0% 98.5%;--sidebar-border:0 0% 100% / 10%;--sidebar-ring:0 0% 55.6%}*{border-color:hsl(var(--border));outline-color:hsl(var(--ring))}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,hsl(var(--ring)) 50%,transparent)}}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}html,body,#root{height:100%}body{background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.animate-spin{animation-duration:1.5s!important;animation-iteration-count:infinite!important}}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.right-0\.5{right:calc(var(--spacing) * .5)}.right-2{right:calc(var(--spacing) * 2)}.right-2\.5{right:calc(var(--spacing) * 2.5)}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:0}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.no-spinner::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.no-spinner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.no-spinner{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.m-0{margin:0}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{display:none}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.field-sizing-content{field-sizing:content}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-12{height:calc(var(--spacing) * 12)}.h-\[1\.2rem\]{height:1.2rem}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\(--available-height\){max-height:var(--available-height)}.max-h-40{max-height:calc(var(--spacing) * 40)}.min-h-0{min-height:0}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-full{min-height:100%}.w-\(--anchor-width\){width:var(--anchor-width)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-\[1\.2rem\]{width:1.2rem}.w-\[90px\]{width:90px}.w-\[120px\]{width:120px}.w-\[380px\]{width:380px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-screen{width:100vw}.max-w-3xl{max-width:var(--container-3xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[240px\]{max-width:240px}.max-w-\[260px\]{max-width:260px}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[96px\]{min-width:96px}.min-w-\[380px\]{min-width:380px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--transform-origin\){transform-origin:var(--transform-origin)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%-2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.scrollbar-none{scrollbar-width:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[minmax\(140px\,max-content\)_1fr\]{grid-template-columns:minmax(140px,max-content) 1fr}.grid-rows-\[auto_1fr\]{grid-template-rows:auto 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-\(--card-spacing\){gap:var(--card-spacing)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-4xl{border-radius:var(--radius-4xl)}.rounded-\[2px\]{border-radius:2px}.rounded-\[inherit\]{border-radius:inherit}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md),10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md),12px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-xl{border-top-left-radius:calc(var(--radius) + 4px);border-top-right-radius:calc(var(--radius) + 4px)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-border{border-color:hsl(var(--border))}.border-destructive\/30{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,hsl(var(--destructive)) 30%,transparent)}}.border-destructive\/50{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,hsl(var(--destructive)) 50%,transparent)}}.border-input{border-color:hsl(var(--input))}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-transparent{border-color:#0000}.bg-accent,.bg-accent\/50{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.bg-accent\/50{background-color:color-mix(in oklab,hsl(var(--accent)) 50%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-background,.bg-background\/80{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive,.bg-destructive\/5{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/5{background-color:color-mix(in oklab,hsl(var(--destructive)) 5%,transparent)}}.bg-destructive\/10{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,hsl(var(--destructive)) 10%,transparent)}}.bg-foreground{background-color:hsl(var(--foreground))}.bg-green-50{background-color:var(--color-green-50)}.bg-green-500{background-color:var(--color-green-500)}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,hsl(var(--muted)) 30%,transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.bg-popover{background-color:hsl(var(--popover))}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:#0000}.bg-yellow-100{background-color:var(--color-yellow-100)}@media(max-width:767px){.tab-scroll{-webkit-mask-image:linear-gradient(90deg,#000 0 calc(100% - 24px),#0000 100%);mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 24px),#0000)}}.bg-clip-padding{background-clip:padding-box}.fill-foreground{fill:hsl(var(--foreground))}.p-\(--card-spacing\){padding:var(--card-spacing)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-\(--card-spacing\){padding-inline:var(--card-spacing)}.px-0{padding-inline:0}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-\(--card-spacing\){padding-block:var(--card-spacing)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-heading{font-family:Geist Variable,sans-serif}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:Geist Variable,sans-serif}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-600{color:var(--color-amber-600)}.text-amber-900{color:var(--color-amber-900)}.text-background{color:hsl(var(--background))}.text-blue-900{color:var(--color-blue-900)}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-destructive\/80{color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.text-destructive\/80{color:color-mix(in oklab,hsl(var(--destructive)) 80%,transparent)}}.text-foreground,.text-foreground\/60{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/60{color:color-mix(in oklab,hsl(var(--foreground)) 60%,transparent)}}.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.text-green-900{color:var(--color-green-900)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-900{color:var(--color-yellow-900)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-3{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 10%, transparent)}}.ring-ring{--tw-ring-color:hsl(var(--ring))}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);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(var(--blur-sm));-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--card-spacing\:--spacing\(4\)\]{--card-spacing:calc(var(--spacing) * 4)}.running{animation-play-state:running}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus\/dropdown-menu-item\:text-accent-foreground:is(:where(.group\/dropdown-menu-item):focus *){color:hsl(var(--accent-foreground))}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-8:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 8)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/alert-dialog-content\:grid:is(:where(.group\/alert-dialog-content)[data-size=sm] *){display:grid}.group-data-\[size\=sm\]\/alert-dialog-content\:grid-cols-2:is(:where(.group\/alert-dialog-content)[data-size=sm] *){grid-template-columns:repeat(2,minmax(0,1fr))}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-\[\.toast\]\:bg-muted:is(:where(.group).toast *){background-color:hsl(var(--muted))}.group-\[\.toast\]\:bg-primary:is(:where(.group).toast *){background-color:hsl(var(--primary))}.group-\[\.toast\]\:text-muted-foreground:is(:where(.group).toast *){color:hsl(var(--muted-foreground))}.group-\[\.toast\]\:text-primary-foreground:is(:where(.group).toast *){color:hsl(var(--primary-foreground))}.group-\[\.toaster\]\:border-border:is(:where(.group).toaster *){border-color:hsl(var(--border))}.group-\[\.toaster\]\:bg-card:is(:where(.group).toaster *){background-color:hsl(var(--card))}.group-\[\.toaster\]\:text-card-foreground:is(:where(.group).toaster *){color:hsl(var(--card-foreground))}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * -3)}.after\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(var(--spacing) * -2)}.after\:bg-foreground:after{content:var(--tw-content);background-color:hsl(var(--foreground))}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}@media(hover:hover){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:color-mix(in oklch,var(--secondary),var(--foreground) 5%)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/20:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 20%,transparent)}}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted-foreground\/60:hover{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted-foreground\/60:hover{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:underline:hover{text-decoration-line:underline}}.focus\:not-sr-only:focus{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.focus\:absolute:focus{position:absolute}.focus\:top-2:focus{top:calc(var(--spacing) * 2)}.focus\:left-2:focus{left:calc(var(--spacing) * 2)}.focus\:z-50:focus{z-index:50}.focus\:rounded-md:focus{border-radius:calc(var(--radius) - 2px)}.focus\:border:focus{border-style:var(--tw-border-style);border-width:1px}.focus\:border-border:focus{border-color:hsl(var(--border))}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:bg-background:focus{background-color:hsl(var(--background))}.focus\:px-4:focus{padding-inline:calc(var(--spacing) * 4)}.focus\:py-2:focus{padding-block:calc(var(--spacing) * 2)}.focus\:text-sm:focus{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.focus\:font-medium:focus{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}:is(.focus\:\*\*\:text-accent-foreground:focus *),:is(.not-data-\[variant\=destructive\]\:focus\:\*\*\:text-accent-foreground:not([data-variant=destructive]):focus *){color:hsl(var(--accent-foreground))}.focus-visible\:border-destructive\/40:focus-visible{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab,hsl(var(--destructive)) 40%,transparent)}}.focus-visible\:border-ring:focus-visible{border-color:hsl(var(--ring))}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, hsl(var(--destructive)) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:hsl(var(--ring))}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, hsl(var(--ring)) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-input\/50:disabled{background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab,hsl(var(--input)) 50%,transparent)}}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-lg{border-radius:var(--radius)}.has-data-\[icon\=inline-end\]\:pr-1:has([data-icon=inline-end]){padding-right:var(--spacing)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1:has([data-icon=inline-start]){padding-left:var(--spacing)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=alert-dialog-media\]\:grid-rows-\[auto_auto_1fr\]:has([data-slot=alert-dialog-media]){grid-template-rows:auto auto 1fr}.has-data-\[slot\=alert-dialog-media\]\:gap-x-4:has([data-slot=alert-dialog-media]){column-gap:calc(var(--spacing) * 4)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\[slot\=card-footer\]\:pb-0:has([data-slot=card-footer]){padding-bottom:0}.has-data-\[slot\=kbd\]\:pr-1\.5:has([data-slot=kbd]){padding-right:calc(var(--spacing) * 1.5)}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:0}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:hsl(var(--muted))}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:hsl(var(--secondary))}.aria-expanded\:text-foreground[aria-expanded=true]{color:hsl(var(--foreground))}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:hsl(var(--secondary-foreground))}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:hsl(var(--destructive))}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, hsl(var(--destructive)) 20%, transparent)}}.data-ending-style\:opacity-0[data-ending-style]{opacity:0}.data-inset\:pl-7[data-inset]{padding-left:calc(var(--spacing) * 7)}.data-placeholder\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-popup-open\:bg-accent[data-popup-open]{background-color:hsl(var(--accent))}.data-popup-open\:text-accent-foreground[data-popup-open]{color:hsl(var(--accent-foreground))}.data-starting-style\:opacity-0[data-starting-style]{opacity:0}.data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.data-\[error\=true\]\:text-destructive[data-error=true]{color:hsl(var(--destructive))}.data-\[orientation\=horizontal\]\:h-2\.5[data-orientation=horizontal]{height:calc(var(--spacing) * 2.5)}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=horizontal\]\:border-t[data-orientation=horizontal]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\[orientation\=horizontal\]\:border-t-transparent[data-orientation=horizontal]{border-top-color:#0000}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-2\.5[data-orientation=vertical]{width:calc(var(--spacing) * 2.5)}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[orientation\=vertical\]\:self-stretch[data-orientation=vertical]{align-self:stretch}.data-\[orientation\=vertical\]\:border-l[data-orientation=vertical]{border-left-style:var(--tw-border-style);border-left-width:1px}.data-\[orientation\=vertical\]\:border-l-transparent[data-orientation=vertical]{border-left-color:#0000}.data-\[side\=bottom\]\:inset-x-0[data-side=bottom]{inset-inline:0}.data-\[side\=bottom\]\:top-1[data-side=bottom]{top:var(--spacing)}.data-\[side\=bottom\]\:bottom-0[data-side=bottom]{bottom:0}.data-\[side\=bottom\]\:h-auto[data-side=bottom]{height:auto}.data-\[side\=bottom\]\:border-t[data-side=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=bottom\]\:data-ending-style\:translate-y-\[2\.5rem\][data-side=bottom][data-ending-style],.data-\[side\=bottom\]\:data-starting-style\:translate-y-\[2\.5rem\][data-side=bottom][data-starting-style]{--tw-translate-y:2.5rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=inline-end\]\:top-1\/2\![data-side=inline-end]{top:50%!important}.data-\[side\=inline-end\]\:-left-1[data-side=inline-end]{left:calc(var(--spacing) * -1)}.data-\[side\=inline-end\]\:-translate-y-1\/2[data-side=inline-end]{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=inline-end\]\:slide-in-from-left-2[data-side=inline-end]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=inline-start\]\:top-1\/2\![data-side=inline-start]{top:50%!important}.data-\[side\=inline-start\]\:-right-1[data-side=inline-start]{right:calc(var(--spacing) * -1)}.data-\[side\=inline-start\]\:-translate-y-1\/2[data-side=inline-start]{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=inline-start\]\:slide-in-from-right-2[data-side=inline-start]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=left\]\:inset-y-0[data-side=left]{inset-block:0}.data-\[side\=left\]\:top-1\/2\![data-side=left]{top:50%!important}.data-\[side\=left\]\:-right-1[data-side=left]{right:calc(var(--spacing) * -1)}.data-\[side\=left\]\:left-0[data-side=left]{left:0}.data-\[side\=left\]\:h-full[data-side=left]{height:100%}.data-\[side\=left\]\:w-3\/4[data-side=left]{width:75%}.data-\[side\=left\]\:w-\[85vw\][data-side=left]{width:85vw}.data-\[side\=left\]\:-translate-y-1\/2[data-side=left]{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:border-r[data-side=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=left\]\:data-ending-style\:translate-x-\[-2\.5rem\][data-side=left][data-ending-style],.data-\[side\=left\]\:data-starting-style\:translate-x-\[-2\.5rem\][data-side=left][data-starting-style]{--tw-translate-x:-2.5rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:inset-y-0[data-side=right]{inset-block:0}.data-\[side\=right\]\:top-1\/2\![data-side=right]{top:50%!important}.data-\[side\=right\]\:right-0[data-side=right]{right:0}.data-\[side\=right\]\:-left-1[data-side=right]{left:calc(var(--spacing) * -1)}.data-\[side\=right\]\:h-full[data-side=right]{height:100%}.data-\[side\=right\]\:w-3\/4[data-side=right]{width:75%}.data-\[side\=right\]\:-translate-y-1\/2[data-side=right]{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:border-l[data-side=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=right\]\:data-ending-style\:translate-x-\[2\.5rem\][data-side=right][data-ending-style],.data-\[side\=right\]\:data-starting-style\:translate-x-\[2\.5rem\][data-side=right][data-starting-style]{--tw-translate-x:2.5rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:inset-x-0[data-side=top]{inset-inline:0}.data-\[side\=top\]\:top-0[data-side=top]{top:0}.data-\[side\=top\]\:-bottom-2\.5[data-side=top]{bottom:calc(var(--spacing) * -2.5)}.data-\[side\=top\]\:h-auto[data-side=top]{height:auto}.data-\[side\=top\]\:border-b[data-side=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[side\=top\]\:data-ending-style\:translate-y-\[-2\.5rem\][data-side=top][data-ending-style],.data-\[side\=top\]\:data-starting-style\:translate-y-\[-2\.5rem\][data-side=top][data-starting-style]{--tw-translate-y:-2.5rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[size\=default\]\:h-8[data-size=default]{height:calc(var(--spacing) * 8)}.data-\[size\=default\]\:h-\[18\.4px\][data-size=default]{height:18.4px}.data-\[size\=default\]\:w-\[32px\][data-size=default]{width:32px}.data-\[size\=default\]\:max-w-xs[data-size=default]{max-width:var(--container-xs)}.data-\[size\=sm\]\:h-7[data-size=sm]{height:calc(var(--spacing) * 7)}.data-\[size\=sm\]\:h-\[14px\][data-size=sm]{height:14px}.data-\[size\=sm\]\:w-\[24px\][data-size=sm]{width:24px}.data-\[size\=sm\]\:max-w-xs[data-size=sm]{max-width:var(--container-xs)}.data-\[size\=sm\]\:rounded-\[min\(var\(--radius-md\)\,10px\)\][data-size=sm]{border-radius:min(var(--radius-md),10px)}.data-\[size\=sm\]\:\[--card-spacing\:--spacing\(3\)\][data-size=sm]{--card-spacing:calc(var(--spacing) * 3)}.data-\[size\=sm\]\:has-data-\[slot\=card-footer\]\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:0}:is(.\*\*\:data-\[slot\=kbd\]\:relative *)[data-slot=kbd]{position:relative}:is(.\*\*\:data-\[slot\=kbd\]\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.\*\*\:data-\[slot\=kbd\]\:z-50 *)[data-slot=kbd]{z-index:50}:is(.\*\*\:data-\[slot\=kbd\]\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) - 4px)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-1\.5>*)[data-slot=select-value]{gap:calc(var(--spacing) * 1.5)}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:hsl(var(--destructive))}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,hsl(var(--destructive)) 10%,transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:hsl(var(--destructive))}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-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,)}}@media(min-width:40rem){.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(200px\,1fr\)_2fr\]{grid-template-columns:minmax(200px,1fr) 2fr}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:row-span-2:is(:where(.group\/alert-dialog-content)[data-size=default] *){grid-row:span 2/span 2}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:place-items-start:is(:where(.group\/alert-dialog-content)[data-size=default] *){place-items:start}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:text-left:is(:where(.group\/alert-dialog-content)[data-size=default] *){text-align:left}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:group-has-data-\[slot\=alert-dialog-media\]\/alert-dialog-content\:col-start-2:is(:where(.group\/alert-dialog-content)[data-size=default] *):is(:where(.group\/alert-dialog-content):has([data-slot=alert-dialog-media]) *){grid-column-start:2}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:has-data-\[slot\=alert-dialog-media\]\:grid-rows-\[auto_1fr\]:is(:where(.group\/alert-dialog-content)[data-size=default] *):has([data-slot=alert-dialog-media]){grid-template-rows:auto 1fr}.data-\[side\=left\]\:sm\:w-\[380px\][data-side=left]{width:380px}.data-\[side\=left\]\:sm\:max-w-\[380px\][data-side=left]{max-width:380px}.data-\[side\=left\]\:sm\:max-w-sm[data-side=left],.data-\[side\=right\]\:sm\:max-w-sm[data-side=right],.data-\[size\=default\]\:sm\:max-w-sm[data-size=default]{max-width:var(--container-sm)}}@media(min-width:48rem){.md\:mx-auto{margin-inline:auto}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-fit{width:fit-content}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-pretty{text-wrap:pretty}}@media(min-width:64rem){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.dark\:border-input:where(.dark,.dark *){border-color:hsl(var(--input))}.dark\:bg-amber-400:where(.dark,.dark *){background-color:var(--color-amber-400)}.dark\:bg-amber-800:where(.dark,.dark *){background-color:var(--color-amber-800)}.dark\:bg-blue-800:where(.dark,.dark *){background-color:var(--color-blue-800)}.dark\:bg-destructive\/20:where(.dark,.dark *){background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/20:where(.dark,.dark *){background-color:color-mix(in oklab,hsl(var(--destructive)) 20%,transparent)}}.dark\:bg-green-400:where(.dark,.dark *){background-color:var(--color-green-400)}.dark\:bg-green-800:where(.dark,.dark *){background-color:var(--color-green-800)}.dark\:bg-input\/30:where(.dark,.dark *){background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in oklab,hsl(var(--input)) 30%,transparent)}}.dark\:bg-yellow-700:where(.dark,.dark *){background-color:var(--color-yellow-700)}.dark\:text-amber-100:where(.dark,.dark *){color:var(--color-amber-100)}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-blue-100:where(.dark,.dark *){color:var(--color-blue-100)}.dark\:text-green-100:where(.dark,.dark *){color:var(--color-green-100)}.dark\:text-muted-foreground:where(.dark,.dark *){color:hsl(var(--muted-foreground))}.dark\:text-yellow-50:where(.dark,.dark *){color:var(--color-yellow-50)}@media(hover:hover){.dark\:hover\:bg-destructive\/30:where(.dark,.dark *):hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-destructive\/30:where(.dark,.dark *):hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 30%,transparent)}}.dark\:hover\:bg-input\/50:where(.dark,.dark *):hover{background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,hsl(var(--input)) 50%,transparent)}}.dark\:hover\:bg-muted\/50:where(.dark,.dark *):hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-muted\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.dark\:hover\:text-foreground:where(.dark,.dark *):hover{color:hsl(var(--foreground))}}.dark\:focus-visible\:ring-destructive\/40:where(.dark,.dark *):focus-visible{--tw-ring-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, hsl(var(--destructive)) 40%, transparent)}}.dark\:disabled\:bg-input\/80:where(.dark,.dark *):disabled{background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-input\/80:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,hsl(var(--input)) 80%,transparent)}}.dark\:aria-invalid\:border-destructive\/50:where(.dark,.dark *)[aria-invalid=true]{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:border-destructive\/50:where(.dark,.dark *)[aria-invalid=true]{border-color:color-mix(in oklab,hsl(var(--destructive)) 50%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, hsl(var(--destructive)) 40%, transparent)}}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:where(.dark,.dark *)[data-variant=destructive]:focus{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:where(.dark,.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab,hsl(var(--destructive)) 20%,transparent)}}.data-open\:animate-in:where([data-state=open]),.data-open\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:bg-accent:where([data-state=open]),.data-open\:bg-accent:where([data-open]:not([data-open=false])){background-color:hsl(var(--accent))}.data-open\:text-accent-foreground:where([data-state=open]),.data-open\:text-accent-foreground:where([data-open]:not([data-open=false])){color:hsl(var(--accent-foreground))}.data-open\:fade-in-0:where([data-state=open]),.data-open\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.data-open\:zoom-in-95:where([data-state=open]),.data-open\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}.data-closed\:animate-out:where([data-state=closed]),.data-closed\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:overflow-hidden:where([data-state=closed]),.data-closed\:overflow-hidden:where([data-closed]:not([data-closed=false])){overflow:hidden}.data-closed\:fade-out-0:where([data-state=closed]),.data-closed\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.data-closed\:zoom-out-95:where([data-state=closed]),.data-closed\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.data-checked\:bg-primary:where([data-state=checked]),.data-checked\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:hsl(var(--primary))}.group-data-\[size\=default\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *):where([data-state=checked]),.group-data-\[size\=default\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.group-data-\[size\=sm\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *):where([data-state=checked]),.group-data-\[size\=sm\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:data-checked\:bg-primary-foreground:where(.dark,.dark *):where([data-state=checked]),.dark\:data-checked\:bg-primary-foreground:where(.dark,.dark *):where([data-checked]:not([data-checked=false])){background-color:hsl(var(--primary-foreground))}.data-unchecked\:bg-input:where([data-state=unchecked]),.data-unchecked\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:hsl(var(--input))}.group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=default] *):where([data-state=unchecked]),.group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *):where([data-state=unchecked]),.group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:data-unchecked\:bg-foreground:where(.dark,.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-foreground:where(.dark,.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:hsl(var(--foreground))}.dark\:data-unchecked\:bg-input\/80:where(.dark,.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-input\/80:where(.dark,.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.dark\:data-unchecked\:bg-input\/80:where(.dark,.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-input\/80:where(.dark,.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab,hsl(var(--input)) 80%,transparent)}}.data-disabled\:pointer-events-none:where([data-disabled=true]),.data-disabled\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.data-disabled\:cursor-not-allowed:where([data-disabled=true]),.data-disabled\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.data-disabled\:opacity-50:where([data-disabled=true]),.data-disabled\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.data-active\:bg-background:where([data-state=active]),.data-active\:bg-background:where([data-active]:not([data-active=false])){background-color:hsl(var(--background))}.data-active\:text-foreground:where([data-state=active]),.data-active\:text-foreground:where([data-active]:not([data-active=false])){color:hsl(var(--foreground))}.group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *):where([data-state=active]),.group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:is(.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.dark\:data-active\:border-input:where(.dark,.dark *):where([data-state=active]),.dark\:data-active\:border-input:where(.dark,.dark *):where([data-active]:not([data-active=false])){border-color:hsl(var(--input))}.dark\:data-active\:bg-input\/30:where(.dark,.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:where(.dark,.dark *):where([data-active]:not([data-active=false])){background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.dark\:data-active\:bg-input\/30:where(.dark,.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:where(.dark,.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab,hsl(var(--input)) 30%,transparent)}}.dark\:data-active\:text-foreground:where(.dark,.dark *):where([data-state=active]),.dark\:data-active\:text-foreground:where(.dark,.dark *):where([data-active]:not([data-active=false])){color:hsl(var(--foreground))}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:where(.dark,.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:where(.dark,.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:where(.dark,.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:where(.dark,.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-\(--card-spacing\).border-b{padding-bottom:var(--card-spacing)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media(hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 20%,transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:hsl(var(--muted))}.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:hsl(var(--secondary))}@supports (color:color-mix(in lab,red,red)){.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:color-mix(in oklab,hsl(var(--secondary)) 80%,transparent)}}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:hsl(var(--muted-foreground))}:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:hsl(var(--foreground))}}:is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) + 4px);border-top-right-radius:calc(var(--radius) + 4px)}:is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive[data-variant=destructive]>*):is(svg){color:hsl(var(--destructive))}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-6>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-2\.5\!>svg{width:calc(var(--spacing) * 2.5)!important;height:calc(var(--spacing) * 2.5)!important}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@property --scroll-fade-t{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-b{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-s{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-e{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-mask{syntax:"*";inherits:false}@property --shimmer-angle{syntax:"<angle>";inherits:true;initial-value:20deg}@property --shimmer-image{syntax:"*";inherits:false}@property --shimmer-text-fill{syntax:"*";inherits:false}@media(prefers-reduced-motion:reduce){.shimmer{-webkit-text-fill-color:currentColor;background-image:none;animation:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
@@ -0,0 +1,2 @@
1
+ import{r as n,j as e}from"./vendor-react-Dtud3GyP.js";import{q as a}from"./index-72wCsW4_.js";import"./vendor-CVKsgXJU.js";function p({body:r}){const t=n.useMemo(()=>{if(!r)return"";try{const s=JSON.parse(r);return JSON.stringify(s,null,2)}catch{return r}},[r]);return r?e.jsx("pre",{className:"whitespace-pre-wrap break-words font-mono text-xs leading-relaxed",dangerouslySetInnerHTML:{__html:a(t)}}):e.jsx("div",{className:"text-muted-foreground italic",children:"empty body"})}export{p as JsonViewer};
2
+ //# sourceMappingURL=json-viewer-CXkZMoVn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-viewer-CXkZMoVn.js","sources":["../../src/components/json-viewer.tsx"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport { syntaxHighlight } from \"@/lib/format\";\n\ninterface JsonViewerProps {\n body: string | null | undefined;\n}\n\nexport function JsonViewer({ body }: JsonViewerProps) {\n const formatted = useMemo(() => {\n if (!body) return \"\";\n try {\n const parsed = JSON.parse(body) as unknown;\n return JSON.stringify(parsed, null, 2);\n } catch {\n return body;\n }\n }, [body]);\n\n if (!body) {\n return <div className=\"text-muted-foreground italic\">empty body</div>;\n }\n\n return (\n <pre\n className=\"whitespace-pre-wrap break-words font-mono text-xs leading-relaxed\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: syntaxHighlight(formatted) }}\n />\n );\n}\n"],"names":["JsonViewer","body","formatted","useMemo","parsed","jsx","syntaxHighlight"],"mappings":"2HAQO,SAASA,EAAW,CAAE,KAAAC,GAAyB,CACpD,MAAMC,EAAYC,EAAAA,QAAQ,IAAM,CAC9B,GAAI,CAACF,EAAM,MAAO,GAClB,GAAI,CACF,MAAMG,EAAS,KAAK,MAAMH,CAAI,EAC9B,OAAO,KAAK,UAAUG,EAAQ,KAAM,CAAC,CACvC,MAAQ,CACN,OAAOH,CACT,CACF,EAAG,CAACA,CAAI,CAAC,EAET,OAAKA,EAKHI,EAAAA,IAAC,MAAA,CACC,UAAU,oEAEV,wBAAyB,CAAE,OAAQC,EAAgBJ,CAAS,CAAA,CAAE,CAAA,EAPzDG,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAA+B,SAAA,aAAU,CAUnE"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-react-Dtud3GyP.js";import{p as n,T as m,a as h,B as l,b as c}from"./index-72wCsW4_.js";import{ay as d,az as x,aA as u}from"./vendor-CVKsgXJU.js";const t=["system","light","dark"],r={system:"Auto",light:"Light",dark:"Dark"};function p(){const{theme:s,setTheme:a}=n(),i=t.indexOf(s),o=t[(i+1)%t.length];return e.jsxs(m,{children:[e.jsx(h,{asChild:!0,children:e.jsx(l,{variant:"ghost",size:"icon",onClick:()=>a(o),"aria-label":`Theme: ${r[s]}`,children:s==="dark"?e.jsx(d,{className:"h-[1.2rem] w-[1.2rem]","aria-hidden":"true"}):s==="light"?e.jsx(x,{className:"h-[1.2rem] w-[1.2rem]","aria-hidden":"true"}):e.jsx(u,{className:"h-[1.2rem] w-[1.2rem]","aria-hidden":"true"})})}),e.jsxs(c,{side:"bottom",children:[r[s]," — click for ",r[o].toLowerCase()]})]})}export{p as ModeToggle};
2
+ //# sourceMappingURL=mode-toggle-BxkGFiYG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-toggle-BxkGFiYG.js","sources":["../../src/components/mode-toggle.tsx"],"sourcesContent":["import { Monitor, Moon, Sun } from \"lucide-react\";\n\nimport { type Theme, useTheme } from \"./theme-provider\";\nimport { Button } from \"./ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\nconst THEME_ORDER: Theme[] = [\"system\", \"light\", \"dark\"];\n\nconst THEME_LABELS: Record<Theme, string> = {\n system: \"Auto\",\n light: \"Light\",\n dark: \"Dark\",\n};\n\nexport function ModeToggle() {\n const { theme, setTheme } = useTheme();\n\n const currentIndex = THEME_ORDER.indexOf(theme);\n const next = THEME_ORDER[(currentIndex + 1) % THEME_ORDER.length];\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setTheme(next)}\n aria-label={`Theme: ${THEME_LABELS[theme]}`}\n >\n {theme === \"dark\" ? (\n <Moon className=\"h-[1.2rem] w-[1.2rem]\" aria-hidden=\"true\" />\n ) : theme === \"light\" ? (\n <Sun className=\"h-[1.2rem] w-[1.2rem]\" aria-hidden=\"true\" />\n ) : (\n <Monitor className=\"h-[1.2rem] w-[1.2rem]\" aria-hidden=\"true\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {THEME_LABELS[theme]} — click for {THEME_LABELS[next].toLowerCase()}\n </TooltipContent>\n </Tooltip>\n );\n}\n"],"names":["THEME_ORDER","THEME_LABELS","ModeToggle","theme","setTheme","useTheme","currentIndex","next","Tooltip","jsx","TooltipTrigger","Button","Moon","Sun","Monitor","jsxs","TooltipContent"],"mappings":"6KAMA,MAAMA,EAAuB,CAAC,SAAU,QAAS,MAAM,EAEjDC,EAAsC,CAC1C,OAAQ,OACR,MAAO,QACP,KAAM,MACR,EAEO,SAASC,GAAa,CAC3B,KAAM,CAAE,MAAAC,EAAO,SAAAC,CAAA,EAAaC,EAAA,EAEtBC,EAAeN,EAAY,QAAQG,CAAK,EACxCI,EAAOP,GAAaM,EAAe,GAAKN,EAAY,MAAM,EAEhE,cACGQ,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,QAAO,GACrB,SAAAD,EAAAA,IAACE,EAAA,CACC,QAAQ,QACR,KAAK,OACL,QAAS,IAAMP,EAASG,CAAI,EAC5B,aAAY,UAAUN,EAAaE,CAAK,CAAC,GAExC,SAAAA,IAAU,OACTM,EAAAA,IAACG,EAAA,CAAK,UAAU,wBAAwB,cAAY,MAAA,CAAO,EACzDT,IAAU,cACXU,EAAA,CAAI,UAAU,wBAAwB,cAAY,MAAA,CAAO,QAEzDC,EAAA,CAAQ,UAAU,wBAAwB,cAAY,MAAA,CAAO,CAAA,CAAA,EAGpE,EACAC,EAAAA,KAACC,EAAA,CAAe,KAAK,SAClB,SAAA,CAAAf,EAAaE,CAAK,EAAE,gBAAcF,EAAaM,CAAI,EAAE,YAAA,CAAY,CAAA,CACpE,CAAA,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-react-Dtud3GyP.js";import{T as r,a as c,d as m,b as d,B as u,h as g,S as N,g as v,C as b,i as w,c as _}from"./index-72wCsW4_.js";import{u as k}from"./use-models-B4MLkfpt.js";import{a6 as y,H as C,a7 as j,i as f,a8 as R,a9 as q,aa as M}from"./vendor-CVKsgXJU.js";import"./use-polling-resource-D_vWHFwW.js";import"./use-capture-done-listener-u5RxfYQP.js";function L(){const{data:t,loading:n,error:o,refresh:s}=k(),l=(t==null?void 0:t.models)??[];return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-border bg-card px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Models"}),t&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:[l.length," model",l.length===1?"":"s"]}),t&&!t.ok&&e.jsxs(r,{children:[e.jsx(c,{render:e.jsx("span",{className:"inline-flex"}),children:e.jsx(m,{variant:"destructive",className:"ml-1",children:"stale"})}),e.jsx(d,{side:"bottom",className:"max-w-[240px]",children:"Upstream model list could not be refreshed — showing last snapshot"})]})]}),e.jsxs(r,{children:[e.jsx(c,{asChild:!0,children:e.jsxs(u,{variant:"outline",size:"sm",onClick:s,disabled:n,children:[n?e.jsx(g,{className:"mr-1.5 size-3.5"}):e.jsx(y,{className:"mr-1.5 h-3.5 w-3.5"}),"Refresh"]})}),e.jsx(d,{side:"bottom",children:"Re-fetch the upstream model catalog"})]})]}),e.jsx(N,{className:"min-h-0 flex-1",children:e.jsx("div",{className:"mx-auto flex min-h-full w-full max-w-7xl flex-col p-4",children:n&&!t?e.jsx("div",{className:"flex flex-1 items-center justify-center",children:e.jsx(v,{className:"h-auto"})}):o?e.jsxs("div",{className:"flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center text-muted-foreground",children:[e.jsx(C,{className:"h-12 w-12 text-destructive"}),e.jsx("p",{className:"text-sm font-medium text-destructive",children:"Something went wrong"}),e.jsx("p",{className:"text-xs",children:o}),e.jsxs(r,{children:[e.jsx(c,{asChild:!0,children:e.jsx(u,{variant:"outline",size:"sm",onClick:s,children:"Retry"})}),e.jsx(d,{side:"top",children:"Retry loading models"})]})]}):l.length===0?e.jsxs("div",{className:"flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center text-muted-foreground",children:[e.jsx(j,{className:"h-12 w-12 text-muted-foreground/40"}),e.jsx("p",{className:"text-sm font-medium",children:"No models available"}),e.jsx("p",{className:"text-xs",children:"The proxy could not fetch the upstream model list."})]}):e.jsxs("div",{className:"grid flex-1 grid-cols-1 place-content-center gap-3 sm:grid-cols-2 xl:grid-cols-3",children:[l.map(a=>e.jsx(S,{entry:a,fetchedAt:(t==null?void 0:t.fetched_at)??0},a.id)),t&&t.fetched_at>0&&e.jsxs("p",{className:"col-span-full pt-2 text-center text-xs text-muted-foreground",children:["Last fetched ",new Date(t.fetched_at).toLocaleString()]})]})})})]})}function x(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:t.toLocaleString()}function S({entry:t,fetchedAt:n}){var h,p;const o=t.weight<1,s=t.info,l=s==null?void 0:s.capabilities,a=l==null?void 0:l.reasoning;return e.jsx(b,{className:"flex w-full min-w-0 flex-col",children:e.jsxs(w,{className:"flex flex-1 flex-col gap-2 p-3",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1 overflow-hidden",children:[e.jsx("h3",{className:"truncate text-sm font-semibold",title:t.id,children:(s==null?void 0:s.display_name)??t.id}),s&&s.display_name!==s.name&&e.jsx("p",{className:"truncate text-[11px] text-muted-foreground",title:s.name,children:s.name})]}),e.jsx("div",{className:"shrink-0",children:e.jsxs(r,{children:[e.jsx(c,{render:e.jsx("span",{className:"inline-flex"}),children:e.jsxs(m,{variant:o?"secondary":"outline",children:["weight=",t.weight.toFixed(1)]})}),e.jsxs(d,{side:"top",className:"max-w-[240px]",children:["Relative probability this model is picked when multiple match",o?" — cheaper fallback":" — primary pick"]})]})})]}),(s==null?void 0:s.base_model)&&(s.base_model.provider||s.base_model.family||s.base_model.oss_base)&&e.jsx("p",{className:"text-[11px] text-muted-foreground",children:[s.base_model.provider,s.base_model.family,s.base_model.oss_base].filter(Boolean).join(" · ")}),(s==null?void 0:s.description)&&e.jsx("p",{className:"line-clamp-2 text-xs text-muted-foreground",title:s.description,children:s.description}),l&&e.jsxs("div",{className:"flex flex-wrap gap-1",children:[e.jsxs(i,{icon:e.jsx(j,{className:"h-3 w-3"}),tooltip:"Maximum number of tokens (input + output) the model can process in a single request.",children:[x(l.context_window)," ctx"]}),l.max_completion_tokens>0&&e.jsxs(i,{tooltip:"Hard ceiling on output tokens per response. Requests asking for more will be capped or rejected.",children:[x(l.max_completion_tokens)," max out"]}),l.recommended_max_tokens>0&&l.recommended_max_tokens!==l.max_completion_tokens&&e.jsxs(i,{tooltip:"Suggested output token limit for best quality. Exceeding this may degrade responses.",children:[x(l.recommended_max_tokens)," rec out"]}),l.supports_vision===!0&&e.jsx(i,{icon:e.jsx(f,{className:"h-3 w-3"}),tooltip:"Accepts image inputs directly — the model processes images natively.",children:"vision"}),l.supports_vision==="via-handoff"&&e.jsx(i,{icon:e.jsx(f,{className:"h-3 w-3"}),variant:"outline",tooltip:"Image inputs are forwarded to a secondary model for preprocessing, then handed back. Less efficient than native vision; may be retired.",children:"vision handoff"}),l.supports_tools&&e.jsx(i,{icon:e.jsx(R,{className:"h-3 w-3"}),tooltip:"Supports function/tool calling — the model can emit structured tool-use requests that clients execute.",children:"tools"}),(a==null?void 0:a.supported)&&e.jsxs(i,{icon:e.jsx(q,{className:"h-3 w-3"}),tooltip:a.can_disable?`Extended thinking is supported and can be toggled. Default level: ${a.default_level??"on"}. Available levels: ${a.levels.length>0?a.levels.join(", "):"default"}.`:`Extended thinking is always on and cannot be disabled. Default level: ${a.default_level??"on"}.`,children:[a.default_level??"on",!a.can_disable&&" · locked"]}),((h=s==null?void 0:s.weights)==null?void 0:h.precision)&&e.jsx(i,{tooltip:`Weight precision: ${s.weights.precision}. "full" means unquantized (higher quality, more VRAM). "fp8" is 8-bit quantized (lower memory, faster, minor quality loss).`,children:s.weights.precision})]}),t.pricing?e.jsxs("div",{className:"mt-auto grid grid-cols-2 gap-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"in "}),e.jsxs("span",{className:"font-mono",children:["$",t.pricing.input.toFixed(2)]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"out "}),e.jsxs("span",{className:"font-mono",children:["$",t.pricing.output.toFixed(2)]})]})]}):e.jsx("p",{className:"mt-auto text-xs italic text-muted-foreground",children:"no pricing"}),((p=s==null?void 0:s.weights)==null?void 0:p.hf_url)&&e.jsxs("a",{href:s.weights.hf_url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[e.jsx(M,{className:"h-3 w-3"}),"HuggingFace weights"]}),n===0&&e.jsx("p",{className:"text-[11px] text-muted-foreground",children:"catalog not yet fetched"})]})})}function i({children:t,icon:n,variant:o,className:s,tooltip:l}){const a=e.jsxs(m,{variant:o??"outline",size:"sm",className:_("gap-1",s),children:[n,t]});return e.jsxs(r,{children:[e.jsx(c,{render:e.jsx("span",{className:"inline-flex"}),children:a}),e.jsx(d,{side:"top",className:"max-w-[260px]",children:l})]})}export{L as ModelsTab,L as default};
2
+ //# sourceMappingURL=models-tab-Deqk3WT3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-tab-Deqk3WT3.js","sources":["../../src/components/models-tab.tsx"],"sourcesContent":["import { AlertCircle, Boxes, Brain, ExternalLink, Eye, RefreshCw, Wrench } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Loader } from \"@/components/ui/loader\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { useModels } from \"@/hooks/use-models\";\nimport { cn } from \"@/lib/utils\";\nimport type { ModelEntry } from \"@/types\";\n\nexport function ModelsTab() {\n const { data, loading, error, refresh } = useModels();\n const models = data?.models ?? [];\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"flex items-center justify-between border-b border-border bg-card px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-sm font-semibold\">Models</h2>\n {data && (\n <span className=\"text-xs text-muted-foreground\">\n {models.length} model{models.length === 1 ? \"\" : \"s\"}\n </span>\n )}\n {data && !data.ok && (\n <Tooltip>\n <TooltipTrigger render={<span className=\"inline-flex\" />}>\n <Badge variant=\"destructive\" className=\"ml-1\">\n stale\n </Badge>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" className=\"max-w-[240px]\">\n Upstream model list could not be refreshed — showing last snapshot\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={refresh} disabled={loading}>\n {loading ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <RefreshCw className=\"mr-1.5 h-3.5 w-3.5\" />\n )}\n Refresh\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Re-fetch the upstream model catalog</TooltipContent>\n </Tooltip>\n </header>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"mx-auto flex min-h-full w-full max-w-7xl flex-col p-4\">\n {loading && !data ? (\n <div className=\"flex flex-1 items-center justify-center\">\n <Loader className=\"h-auto\" />\n </div>\n ) : error ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center text-muted-foreground\">\n <AlertCircle className=\"h-12 w-12 text-destructive\" />\n <p className=\"text-sm font-medium text-destructive\">Something went wrong</p>\n <p className=\"text-xs\">{error}</p>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={refresh}>\n Retry\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Retry loading models</TooltipContent>\n </Tooltip>\n </div>\n ) : models.length === 0 ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center text-muted-foreground\">\n <Boxes className=\"h-12 w-12 text-muted-foreground/40\" />\n <p className=\"text-sm font-medium\">No models available</p>\n <p className=\"text-xs\">The proxy could not fetch the upstream model list.</p>\n </div>\n ) : (\n <div className=\"grid flex-1 grid-cols-1 place-content-center gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {models.map((m) => (\n <ModelCard key={m.id} entry={m} fetchedAt={data?.fetched_at ?? 0} />\n ))}\n {data && data.fetched_at > 0 && (\n <p className=\"col-span-full pt-2 text-center text-xs text-muted-foreground\">\n Last fetched {new Date(data.fetched_at).toLocaleString()}\n </p>\n )}\n </div>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${Math.round(n / 1000)}K`;\n return n.toLocaleString();\n}\n\nfunction ModelCard({ entry, fetchedAt }: { entry: ModelEntry; fetchedAt: number }) {\n const cheap = entry.weight < 1;\n const info = entry.info;\n const caps = info?.capabilities;\n const reasoning = caps?.reasoning;\n\n return (\n <Card className=\"flex w-full min-w-0 flex-col\">\n <CardContent className=\"flex flex-1 flex-col gap-2 p-3\">\n {/* Header: identity + weight */}\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n <h3 className=\"truncate text-sm font-semibold\" title={entry.id}>\n {info?.display_name ?? entry.id}\n </h3>\n {info && info.display_name !== info.name && (\n <p className=\"truncate text-[11px] text-muted-foreground\" title={info.name}>\n {info.name}\n </p>\n )}\n </div>\n <div className=\"shrink-0\">\n <Tooltip>\n <TooltipTrigger render={<span className=\"inline-flex\" />}>\n <Badge variant={cheap ? \"secondary\" : \"outline\"}>\n weight={entry.weight.toFixed(1)}\n </Badge>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[240px]\">\n Relative probability this model is picked when multiple match\n {cheap ? \" — cheaper fallback\" : \" — primary pick\"}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Provider / family line */}\n {info?.base_model &&\n (info.base_model.provider || info.base_model.family || info.base_model.oss_base) && (\n <p className=\"text-[11px] text-muted-foreground\">\n {[info.base_model.provider, info.base_model.family, info.base_model.oss_base]\n .filter(Boolean)\n .join(\" · \")}\n </p>\n )}\n\n {/* Description */}\n {info?.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\" title={info.description}>\n {info.description}\n </p>\n )}\n\n {/* Capabilities badges */}\n {caps && (\n <div className=\"flex flex-wrap gap-1\">\n <CapabilityBadge\n icon={<Boxes className=\"h-3 w-3\" />}\n tooltip=\"Maximum number of tokens (input + output) the model can process in a single request.\"\n >\n {formatTokens(caps.context_window)} ctx\n </CapabilityBadge>\n {caps.max_completion_tokens > 0 && (\n <CapabilityBadge tooltip=\"Hard ceiling on output tokens per response. Requests asking for more will be capped or rejected.\">\n {formatTokens(caps.max_completion_tokens)} max out\n </CapabilityBadge>\n )}\n {caps.recommended_max_tokens > 0 &&\n caps.recommended_max_tokens !== caps.max_completion_tokens && (\n <CapabilityBadge tooltip=\"Suggested output token limit for best quality. Exceeding this may degrade responses.\">\n {formatTokens(caps.recommended_max_tokens)} rec out\n </CapabilityBadge>\n )}\n {caps.supports_vision === true && (\n <CapabilityBadge\n icon={<Eye className=\"h-3 w-3\" />}\n tooltip=\"Accepts image inputs directly — the model processes images natively.\"\n >\n vision\n </CapabilityBadge>\n )}\n {caps.supports_vision === \"via-handoff\" && (\n <CapabilityBadge\n icon={<Eye className=\"h-3 w-3\" />}\n variant=\"outline\"\n tooltip=\"Image inputs are forwarded to a secondary model for preprocessing, then handed back. Less efficient than native vision; may be retired.\"\n >\n vision handoff\n </CapabilityBadge>\n )}\n {caps.supports_tools && (\n <CapabilityBadge\n icon={<Wrench className=\"h-3 w-3\" />}\n tooltip=\"Supports function/tool calling — the model can emit structured tool-use requests that clients execute.\"\n >\n tools\n </CapabilityBadge>\n )}\n {reasoning?.supported && (\n <CapabilityBadge\n icon={<Brain className=\"h-3 w-3\" />}\n tooltip={\n reasoning.can_disable\n ? `Extended thinking is supported and can be toggled. Default level: ${reasoning.default_level ?? \"on\"}. Available levels: ${reasoning.levels.length > 0 ? reasoning.levels.join(\", \") : \"default\"}.`\n : `Extended thinking is always on and cannot be disabled. Default level: ${reasoning.default_level ?? \"on\"}.`\n }\n >\n {reasoning.default_level ?? \"on\"}\n {!reasoning.can_disable && \" · locked\"}\n </CapabilityBadge>\n )}\n {info?.weights?.precision && (\n <CapabilityBadge\n tooltip={`Weight precision: ${info.weights.precision}. \"full\" means unquantized (higher quality, more VRAM). \"fp8\" is 8-bit quantized (lower memory, faster, minor quality loss).`}\n >\n {info.weights.precision}\n </CapabilityBadge>\n )}\n </div>\n )}\n\n {/* Pricing */}\n {entry.pricing ? (\n <div className=\"mt-auto grid grid-cols-2 gap-2 text-xs\">\n <div>\n <span className=\"text-muted-foreground\">in </span>\n <span className=\"font-mono\">${entry.pricing.input.toFixed(2)}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground\">out </span>\n <span className=\"font-mono\">${entry.pricing.output.toFixed(2)}</span>\n </div>\n </div>\n ) : (\n <p className=\"mt-auto text-xs italic text-muted-foreground\">no pricing</p>\n )}\n\n {/* Weights / model source link */}\n {info?.weights?.hf_url && (\n <a\n href={info.weights.hf_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n HuggingFace weights\n </a>\n )}\n\n {fetchedAt === 0 && (\n <p className=\"text-[11px] text-muted-foreground\">catalog not yet fetched</p>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction CapabilityBadge({\n children,\n icon,\n variant,\n className,\n tooltip,\n}: {\n children: ReactNode;\n icon?: ReactNode;\n variant?: \"default\" | \"secondary\" | \"outline\" | \"destructive\";\n className?: string;\n tooltip: string;\n}) {\n const badge = (\n <Badge variant={variant ?? \"outline\"} size=\"sm\" className={cn(\"gap-1\", className)}>\n {icon}\n {children}\n </Badge>\n );\n return (\n <Tooltip>\n <TooltipTrigger render={<span className=\"inline-flex\" />}>{badge}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[260px]\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nexport default ModelsTab;\n"],"names":["ModelsTab","data","loading","error","refresh","useModels","models","jsxs","jsx","Tooltip","TooltipTrigger","Badge","TooltipContent","Button","Spinner","RefreshCw","ScrollArea","Loader","AlertCircle","Boxes","m","ModelCard","formatTokens","n","entry","fetchedAt","cheap","info","caps","reasoning","Card","CardContent","CapabilityBadge","Eye","Wrench","Brain","_a","_b","ExternalLink","children","icon","variant","className","tooltip","badge","cn"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-react-Dtud3GyP.js";import{T as m,a as o,B as u,h as j,b as x,S as g,g as N,C as b,i as _,d as v,j as c}from"./index-72wCsW4_.js";import{u as y}from"./use-polling-resource-D_vWHFwW.js";import{ab as h,W as T,H as C,ac as k,ad as $,ae as f}from"./vendor-CVKsgXJU.js";import"./use-capture-done-listener-u5RxfYQP.js";const F=1e4;function P(){const s=l=>l===void 0?null:l,{data:a,loading:n,error:t,refresh:r}=y({endpoint:"/performance",pollInterval:F,errorMessage:"Failed to fetch performance stats",parse:s});return{stats:a,loading:n,error:t,refresh:r}}function d(s){return s==null?"—":s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(2)}s`}function A(s){return`${s.toFixed(1)}%`}function S(s){return d(s)}function q(s){return s==null?"—":s.toFixed(1)}function p(s){return s==null?void 0:"AVG"}function R(s,a,n){const t=[];return s!=null&&t.push(`p10: ${d(s)}`),a!=null&&t.push(`p50: ${d(a)}`),n!=null&&t.push(`p95: ${d(n)}`),t.join(" · ")||"—"}function M(s,a,n){const t=[];return s!=null&&t.push(`p10: ${s.toFixed(1)}`),a!=null&&t.push(`p50: ${a.toFixed(1)}`),n!=null&&t.push(`p95: ${n.toFixed(1)}`),t.join(" · ")||"—"}function H(){const{stats:s,loading:a,error:n,refresh:t}=P();return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-border bg-card px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Performance"}),s&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.length," model",s.length===1?"":"s"]})]}),e.jsxs(m,{children:[e.jsx(o,{asChild:!0,children:e.jsxs(u,{variant:"outline",size:"sm",onClick:t,disabled:a,children:[a?e.jsx(j,{className:"mr-1.5 size-3.5"}):e.jsx(h,{className:"mr-1.5 h-3.5 w-3.5"}),"Refresh"]})}),e.jsx(x,{side:"bottom",children:"Re-compute performance statistics"})]})]}),e.jsx(g,{className:"min-h-0 flex-1",children:e.jsx("div",{className:"mx-auto flex min-h-full w-full max-w-7xl flex-col p-4",children:a&&!s?e.jsx("div",{className:"flex flex-1 items-center justify-center",children:e.jsx(N,{className:"h-auto"})}):s===null||s.length===0?e.jsxs("div",{className:"flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center text-muted-foreground",children:[e.jsx(T,{className:"h-12 w-12 text-muted-foreground/40"}),e.jsx("p",{className:"text-sm font-medium",children:n?"Something went wrong":"No performance data yet"}),n?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-xs",children:n}),e.jsxs(m,{children:[e.jsx(o,{asChild:!0,children:e.jsx(u,{variant:"outline",size:"sm",onClick:t,children:"Retry"})}),e.jsx(x,{side:"top",children:"Retry loading performance stats"})]})]}):e.jsx("p",{className:"text-xs",children:"Send requests through the proxy to see stats."})]}):e.jsxs("div",{className:"space-y-4",children:[n&&e.jsxs("div",{className:"flex items-center gap-2 rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-xs text-destructive",children:[e.jsx(C,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"font-medium",children:"Failed to refresh:"}),e.jsx("span",{className:"text-muted-foreground",children:n})]}),s.map(r=>e.jsx(L,{row:r},r.model))]})})})]})}function L({row:s}){return e.jsx(b,{children:e.jsxs(_,{className:"px-4 py-0",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h3",{className:"truncate text-sm font-semibold",title:s.model,children:s.model}),e.jsxs("p",{className:"mt-0.5 text-xs text-muted-foreground",children:[s.provider," · ",s.streaming_count," streaming"]})]}),e.jsxs(m,{children:[e.jsx(o,{render:e.jsx("span",{className:"shrink-0 inline-flex"}),children:e.jsxs(v,{variant:"secondary",children:[s.request_count," req",s.request_count===1?"":"s"]})}),e.jsxs(x,{side:"left",className:"max-w-[240px]",children:[s.request_count," requests — ",s.streaming_count," streamed ·"," ",s.request_count-s.streaming_count," non-streaming"]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-5",children:[e.jsx(i,{icon:e.jsx(k,{className:"h-3.5 w-3.5"}),label:"TTFT",primary:S(s.ttft_mean),primaryDetail:p(s.ttft_mean),sub2:R(s.ttft_p10,s.ttft_p50,s.ttft_p95)}),e.jsx(i,{icon:e.jsx($,{className:"h-3.5 w-3.5"}),label:"TPS",primary:q(s.tps_mean),primaryDetail:p(s.tps_mean),sub2:M(s.tps_p10,s.tps_p50,s.tps_p95)}),e.jsx(i,{icon:e.jsx(f,{className:"h-3.5 w-3.5"}),label:"Total In",primary:c(s.total_input_tokens),sub:`${s.provider==="anthropic"?"incl. cache":"prompt"}`}),e.jsx(i,{icon:e.jsx(f,{className:"h-3.5 w-3.5"}),label:"Total Out",primary:c(s.total_output_tokens),sub:s.total_thinking_tokens>0?`${c(s.total_thinking_tokens)} thinking`:void 0}),e.jsx(i,{icon:e.jsx(h,{className:"h-3.5 w-3.5"}),label:"Cache Hit",primary:A(s.cached_pct),sub:`${c(s.total_cache_read_tokens)} cached`})]})]})})}function i({icon:s,label:a,primary:n,primaryDetail:t,sub:r,sub2:l}){return e.jsxs("div",{className:"rounded-lg border border-border bg-muted/30 px-3 py-2",children:[e.jsxs("div",{className:"flex items-center gap-1 text-xs font-medium text-muted-foreground",children:[s,a]}),e.jsxs("div",{className:"mt-1 flex items-baseline gap-1.5",children:[e.jsx("span",{className:"text-lg font-semibold tabular-nums leading-tight",children:n}),t&&e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground/80 tabular-nums",children:t})]}),r&&e.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground tabular-nums",children:r}),l&&e.jsx("div",{className:"text-xs text-muted-foreground/70 tabular-nums",children:l})]})}export{H as PerformanceMeter};
2
+ //# sourceMappingURL=performance-meter-Bd152C4C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-meter-Bd152C4C.js","sources":["../../src/hooks/use-performance-stats.ts","../../src/components/perf-utils.ts","../../src/components/performance-meter.tsx"],"sourcesContent":["import { usePollingResource } from \"@/hooks/use-polling-resource\";\nimport type { PerformanceStatsRow } from \"@/types\";\n\nconst POLL_INTERVAL = 10000;\n\nexport interface UsePerformanceStatsResult {\n stats: PerformanceStatsRow[] | null;\n loading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function usePerformanceStats(): UsePerformanceStatsResult {\n const parse = (value: unknown): PerformanceStatsRow[] | null =>\n value === undefined ? null : (value as PerformanceStatsRow[]);\n\n const {\n data: stats,\n loading,\n error,\n refresh,\n } = usePollingResource<PerformanceStatsRow[] | null>({\n endpoint: \"/performance\",\n pollInterval: POLL_INTERVAL,\n errorMessage: \"Failed to fetch performance stats\",\n parse,\n });\n\n return { stats, loading, error, refresh };\n}\n","export function fmtMs(v: number | null): string {\n if (v == null) return \"—\";\n if (v < 1000) return `${Math.round(v)}ms`;\n return `${(v / 1000).toFixed(2)}s`;\n}\n\nexport function fmtPct(v: number): string {\n return `${v.toFixed(1)}%`;\n}\n\n/** Format an average value in ms (e.g. \"500ms\" or \"1.50s\"). */\nexport function fmtAvgMs(mean: number | null): string {\n return fmtMs(mean);\n}\n\n/** Format an average value in TPS (e.g. \"22.0\"). */\nexport function fmtAvgTps(mean: number | null): string {\n if (mean == null) return \"—\";\n return mean.toFixed(1);\n}\n\n/** Small \"avg\" label shown next to the primary average value. */\nexport function fmtAvgLabel(mean: number | null): string | undefined {\n return mean == null ? undefined : \"AVG\";\n}\n\n/** Format percentile sub-line (e.g. \"p10: 80ms · p50: 250ms · p95: 480ms\"). */\nexport function fmtPercentiles(p10: number | null, p50: number | null, p95: number | null): string {\n const parts: string[] = [];\n if (p10 != null) parts.push(`p10: ${fmtMs(p10)}`);\n if (p50 != null) parts.push(`p50: ${fmtMs(p50)}`);\n if (p95 != null) parts.push(`p95: ${fmtMs(p95)}`);\n return parts.join(\" · \") || \"—\";\n}\n\n/** Format TPS percentile sub-line (e.g. \"p10: 12.0 · p50: 22.0 · p95: 30.0\"). */\nexport function fmtTpsPercentiles(\n p10: number | null,\n p50: number | null,\n p95: number | null,\n): string {\n const parts: string[] = [];\n if (p10 != null) parts.push(`p10: ${p10.toFixed(1)}`);\n if (p50 != null) parts.push(`p50: ${p50.toFixed(1)}`);\n if (p95 != null) parts.push(`p95: ${p95.toFixed(1)}`);\n return parts.join(\" · \") || \"—\";\n}\n","import { Activity, AlertCircle, Cpu, Gauge, Inbox, Zap } from \"lucide-react\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Loader } from \"@/components/ui/loader\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { usePerformanceStats } from \"@/hooks/use-performance-stats\";\nimport { fmtTokensCompact } from \"@/lib/format\";\nimport type { PerformanceStatsRow } from \"@/types\";\n\nimport {\n fmtAvgLabel,\n fmtAvgMs,\n fmtAvgTps,\n fmtPct,\n fmtPercentiles,\n fmtTpsPercentiles,\n} from \"./perf-utils\";\n\nexport function PerformanceMeter() {\n const { stats, loading, error, refresh } = usePerformanceStats();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"flex items-center justify-between border-b border-border bg-card px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-sm font-semibold\">Performance</h2>\n {stats && (\n <span className=\"text-xs text-muted-foreground\">\n {stats.length} model{stats.length === 1 ? \"\" : \"s\"}\n </span>\n )}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={refresh} disabled={loading}>\n {loading ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <Activity className=\"mr-1.5 h-3.5 w-3.5\" />\n )}\n Refresh\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Re-compute performance statistics</TooltipContent>\n </Tooltip>\n </header>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"mx-auto flex min-h-full w-full max-w-7xl flex-col p-4\">\n {loading && !stats ? (\n <div className=\"flex flex-1 items-center justify-center\">\n <Loader className=\"h-auto\" />\n </div>\n ) : stats === null || stats.length === 0 ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center text-muted-foreground\">\n <Inbox className=\"h-12 w-12 text-muted-foreground/40\" />\n <p className=\"text-sm font-medium\">\n {error ? \"Something went wrong\" : \"No performance data yet\"}\n </p>\n {error ? (\n <>\n <p className=\"text-xs\">{error}</p>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={refresh}>\n Retry\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Retry loading performance stats</TooltipContent>\n </Tooltip>\n </>\n ) : (\n <p className=\"text-xs\">Send requests through the proxy to see stats.</p>\n )}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {error && (\n <div className=\"flex items-center gap-2 rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n <AlertCircle className=\"h-3.5 w-3.5\" />\n <span className=\"font-medium\">Failed to refresh:</span>\n <span className=\"text-muted-foreground\">{error}</span>\n </div>\n )}\n {stats.map((row) => (\n <ModelPerfCard key={row.model} row={row} />\n ))}\n </div>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction ModelPerfCard({ row }: { row: PerformanceStatsRow }) {\n return (\n <Card>\n <CardContent className=\"px-4 py-0\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold\" title={row.model}>\n {row.model}\n </h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {row.provider} · {row.streaming_count} streaming\n </p>\n </div>\n <Tooltip>\n <TooltipTrigger render={<span className=\"shrink-0 inline-flex\" />}>\n <Badge variant=\"secondary\">\n {row.request_count} req{row.request_count === 1 ? \"\" : \"s\"}\n </Badge>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"max-w-[240px]\">\n {row.request_count} requests — {row.streaming_count} streamed ·{\" \"}\n {row.request_count - row.streaming_count} non-streaming\n </TooltipContent>\n </Tooltip>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-5\">\n <StatTile\n icon={<Zap className=\"h-3.5 w-3.5\" />}\n label=\"TTFT\"\n primary={fmtAvgMs(row.ttft_mean)}\n primaryDetail={fmtAvgLabel(row.ttft_mean)}\n sub2={fmtPercentiles(row.ttft_p10, row.ttft_p50, row.ttft_p95)}\n />\n <StatTile\n icon={<Gauge className=\"h-3.5 w-3.5\" />}\n label=\"TPS\"\n primary={fmtAvgTps(row.tps_mean)}\n primaryDetail={fmtAvgLabel(row.tps_mean)}\n sub2={fmtTpsPercentiles(row.tps_p10, row.tps_p50, row.tps_p95)}\n />\n <StatTile\n icon={<Cpu className=\"h-3.5 w-3.5\" />}\n label=\"Total In\"\n primary={fmtTokensCompact(row.total_input_tokens)}\n sub={`${row.provider === \"anthropic\" ? \"incl. cache\" : \"prompt\"}`}\n />\n <StatTile\n icon={<Cpu className=\"h-3.5 w-3.5\" />}\n label=\"Total Out\"\n primary={fmtTokensCompact(row.total_output_tokens)}\n sub={\n row.total_thinking_tokens > 0\n ? `${fmtTokensCompact(row.total_thinking_tokens)} thinking`\n : undefined\n }\n />\n <StatTile\n icon={<Activity className=\"h-3.5 w-3.5\" />}\n label=\"Cache Hit\"\n primary={fmtPct(row.cached_pct)}\n sub={`${fmtTokensCompact(row.total_cache_read_tokens)} cached`}\n />\n </div>\n </CardContent>\n </Card>\n );\n}\n\nfunction StatTile({\n icon,\n label,\n primary,\n primaryDetail,\n sub,\n sub2,\n}: {\n icon: React.ReactNode;\n label: string;\n primary: string;\n primaryDetail?: string;\n sub?: string;\n sub2?: string;\n}) {\n return (\n <div className=\"rounded-lg border border-border bg-muted/30 px-3 py-2\">\n <div className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n {icon}\n {label}\n </div>\n <div className=\"mt-1 flex items-baseline gap-1.5\">\n <span className=\"text-lg font-semibold tabular-nums leading-tight\">{primary}</span>\n {primaryDetail && (\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground/80 tabular-nums\">\n {primaryDetail}\n </span>\n )}\n </div>\n {sub && <div className=\"mt-0.5 text-xs text-muted-foreground tabular-nums\">{sub}</div>}\n {sub2 && <div className=\"text-xs text-muted-foreground/70 tabular-nums\">{sub2}</div>}\n </div>\n );\n}\n"],"names":["POLL_INTERVAL","usePerformanceStats","parse","value","stats","loading","error","refresh","usePollingResource","fmtMs","v","fmtPct","fmtAvgMs","mean","fmtAvgTps","fmtAvgLabel","fmtPercentiles","p10","p50","p95","parts","fmtTpsPercentiles","PerformanceMeter","jsxs","jsx","Tooltip","TooltipTrigger","Button","Spinner","Activity","TooltipContent","ScrollArea","Loader","Inbox","Fragment","AlertCircle","row","ModelPerfCard","Card","CardContent","Badge","StatTile","Zap","Gauge","Cpu","fmtTokensCompact","icon","label","primary","primaryDetail","sub","sub2"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-react-Dtud3GyP.js";import{c as s}from"./index-72wCsW4_.js";import{ai as u,aj as p,ak as f,al as i,am as m,an as g,ao as v,ap as x,aq as h,ar as b,as as j,at as S,au as w,av as z,aw as y,ax as N}from"./vendor-CVKsgXJU.js";const P=u;function U({className:t,...a}){return e.jsx(m,{"data-slot":"select-value",className:s("flex flex-1 text-left",t),...a})}function $({className:t,size:a="default",children:n,...r}){return e.jsxs(p,{"data-slot":"select-trigger","data-size":a,className:s("flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...r,children:[n,e.jsx(f,{render:e.jsx(i,{className:"pointer-events-none size-4 text-muted-foreground"})})]})}function A({className:t,children:a,side:n="bottom",sideOffset:r=4,align:l="center",alignOffset:d=0,alignItemWithTrigger:o=!0,...c}){return e.jsx(g,{children:e.jsx(v,{side:n,sideOffset:r,align:l,alignOffset:d,alignItemWithTrigger:o,className:"isolate z-50",children:e.jsxs(x,{"data-slot":"select-content","data-align-trigger":o,className:s("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",t),...c,children:[e.jsx(k,{}),e.jsx(h,{children:a}),e.jsx(_,{})]})})})}function B({className:t,children:a,...n}){return e.jsxs(b,{"data-slot":"select-item",className:s("relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",t),...n,children:[e.jsx(j,{className:"flex flex-1 shrink-0 gap-2 whitespace-nowrap",children:a}),e.jsx(S,{render:e.jsx("span",{className:"pointer-events-none absolute right-2 flex size-4 items-center justify-center"}),children:e.jsx(w,{className:"pointer-events-none"})})]})}function k({className:t,...a}){return e.jsx(z,{"data-slot":"select-scroll-up-button",className:s("top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",t),...a,children:e.jsx(y,{})})}function _({className:t,...a}){return e.jsx(N,{"data-slot":"select-scroll-down-button",className:s("bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",t),...a,children:e.jsx(i,{})})}export{P as S,$ as a,U as b,A as c,B as d};
2
+ //# sourceMappingURL=select-mZPf2BR3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-mZPf2BR3.js","sources":["../../src/components/ui/select.tsx"],"sourcesContent":["import { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nconst Select = SelectPrimitive.Root;\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"flex flex-1 text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\";\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n render={<ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />}\n />\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props &\n Pick<\n SelectPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\" | \"alignItemWithTrigger\"\n >) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n data-align-trigger={alignItemWithTrigger}\n className={cn(\n \"relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.List>{children}</SelectPrimitive.List>\n <SelectScrollDownButton />\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"flex flex-1 shrink-0 gap-2 whitespace-nowrap\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {\n return (\n <SelectPrimitive.ScrollUpArrow\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <ChevronUpIcon />\n </SelectPrimitive.ScrollUpArrow>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {\n return (\n <SelectPrimitive.ScrollDownArrow\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <ChevronDownIcon />\n </SelectPrimitive.ScrollDownArrow>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n"],"names":["Select","SelectPrimitive.Root","SelectValue","className","props","jsx","SelectPrimitive.Value","cn","SelectTrigger","size","children","jsxs","SelectPrimitive.Trigger","SelectPrimitive.Icon","ChevronDownIcon","SelectContent","side","sideOffset","align","alignOffset","alignItemWithTrigger","SelectPrimitive.Portal","SelectPrimitive.Positioner","SelectPrimitive.Popup","SelectScrollUpButton","SelectPrimitive.List","SelectScrollDownButton","SelectItem","SelectPrimitive.Item","SelectPrimitive.ItemText","SelectPrimitive.ItemIndicator","CheckIcon","SelectPrimitive.ScrollUpArrow","ChevronUpIcon","SelectPrimitive.ScrollDownArrow"],"mappings":"yPAMA,MAAMA,EAASC,EAYf,SAASC,EAAY,CAAE,UAAAC,EAAW,GAAGC,GAAsC,CACzE,OACEC,EAAAA,IAACC,EAAA,CACC,YAAU,eACV,UAAWC,EAAG,wBAAyBJ,CAAS,EAC/C,GAAGC,CAAA,CAAA,CAGV,CAEA,SAASI,EAAc,CACrB,UAAAL,EACA,KAAAM,EAAO,UACP,SAAAC,EACA,GAAGN,CACL,EAEG,CACD,OACEO,EAAAA,KAACC,EAAA,CACC,YAAU,iBACV,YAAWH,EACX,UAAWF,EACT,s2BACAJ,CAAA,EAED,GAAGC,EAEH,SAAA,CAAAM,EACDL,EAAAA,IAACQ,EAAA,CACC,OAAQR,EAAAA,IAACS,EAAA,CAAgB,UAAU,kDAAA,CAAmD,CAAA,CAAA,CACxF,CAAA,CAAA,CAGN,CAEA,SAASC,EAAc,CACrB,UAAAZ,EACA,SAAAO,EACA,KAAAM,EAAO,SACP,WAAAC,EAAa,EACb,MAAAC,EAAQ,SACR,YAAAC,EAAc,EACd,qBAAAC,EAAuB,GACvB,GAAGhB,CACL,EAIK,CACH,OACEC,MAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACiB,EAAA,CACC,KAAAN,EACA,WAAAC,EACA,MAAAC,EACA,YAAAC,EACA,qBAAAC,EACA,UAAU,eAEV,SAAAT,EAAAA,KAACY,EAAA,CACC,YAAU,iBACV,qBAAoBH,EACpB,UAAWb,EACT,+oBACAJ,CAAA,EAED,GAAGC,EAEJ,SAAA,CAAAC,EAAAA,IAACmB,EAAA,EAAqB,EACtBnB,MAACoB,EAAA,CAAsB,SAAAf,EAAS,QAC/BgB,EAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAC1B,CAAA,EAEJ,CAEJ,CAYA,SAASC,EAAW,CAAE,UAAAxB,EAAW,SAAAO,EAAU,GAAGN,GAAqC,CACjF,OACEO,EAAAA,KAACiB,EAAA,CACC,YAAU,cACV,UAAWrB,EACT,qbACAJ,CAAA,EAED,GAAGC,EAEJ,SAAA,CAAAC,EAAAA,IAACwB,EAAA,CAAyB,UAAU,+CACjC,SAAAnB,CAAA,CACH,EACAL,EAAAA,IAACyB,EAAA,CACC,OACEzB,EAAAA,IAAC,OAAA,CAAK,UAAU,8EAAA,CAA+E,EAGjG,SAAAA,EAAAA,IAAC0B,EAAA,CAAU,UAAU,qBAAA,CAAsB,CAAA,CAAA,CAC7C,CAAA,CAAA,CAGN,CAYA,SAASP,EAAqB,CAC5B,UAAArB,EACA,GAAGC,CACL,EAA+D,CAC7D,OACEC,EAAAA,IAAC2B,EAAA,CACC,YAAU,0BACV,UAAWzB,EACT,yHACAJ,CAAA,EAED,GAAGC,EAEJ,eAAC6B,EAAA,CAAA,CAAc,CAAA,CAAA,CAGrB,CAEA,SAASP,EAAuB,CAC9B,UAAAvB,EACA,GAAGC,CACL,EAAiE,CAC/D,OACEC,EAAAA,IAAC6B,EAAA,CACC,YAAU,4BACV,UAAW3B,EACT,4HACAJ,CAAA,EAED,GAAGC,EAEJ,eAACU,EAAA,CAAA,CAAgB,CAAA,CAAA,CAGvB"}
@@ -0,0 +1,2 @@
1
+ import{j as a}from"./vendor-react-Dtud3GyP.js";import{T as l,a as n,B as g,b as c,c as s}from"./index-72wCsW4_.js";import{aK as h,aG as o,aD as p,aL as x,aF as m,aE as f,aM as u,aH as y,aI as b}from"./vendor-CVKsgXJU.js";function v({...t}){return a.jsx(h,{"data-slot":"sheet",...t})}function C({...t}){return a.jsx(u,{"data-slot":"sheet-trigger",...t})}function w({...t}){return a.jsx(o,{"data-slot":"sheet-close",...t})}function j({...t}){return a.jsx(y,{"data-slot":"sheet-portal",...t})}function D({className:t,...e}){return a.jsx(b,{"data-slot":"sheet-overlay",className:s("fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs",t),...e})}function k({className:t,children:e,side:i="right",showCloseButton:d=!0,...r}){return a.jsxs(j,{children:[a.jsx(D,{}),a.jsxs(p,{"data-slot":"sheet-content","data-side":i,className:s("fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",t),...r,children:[e,d&&a.jsxs(l,{children:[a.jsxs(n,{render:a.jsx(o,{"data-slot":"sheet-close",render:a.jsx(g,{variant:"ghost",className:"absolute top-3 right-3",size:"icon-sm"})}),children:[a.jsx(x,{}),a.jsx("span",{className:"sr-only",children:"Close"})]}),a.jsx(c,{side:"left",children:"Close panel"})]})]})]})}function z({className:t,...e}){return a.jsx("div",{"data-slot":"sheet-header",className:s("flex flex-col gap-0.5 p-4",t),...e})}function B({className:t,...e}){return a.jsx("div",{"data-slot":"sheet-footer",className:s("mt-auto flex flex-col gap-2 p-4",t),...e})}function P({className:t,...e}){return a.jsx(f,{"data-slot":"sheet-title",className:s("font-heading text-base font-medium text-foreground",t),...e})}function E({className:t,...e}){return a.jsx(m,{"data-slot":"sheet-description",className:s("text-sm text-muted-foreground",t),...e})}export{v as Sheet,w as SheetClose,k as SheetContent,E as SheetDescription,B as SheetFooter,z as SheetHeader,P as SheetTitle,C as SheetTrigger};
2
+ //# sourceMappingURL=sheet-BgQXtbdw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet-BgQXtbdw.js","sources":["../../src/components/ui/sheet.tsx"],"sourcesContent":["import { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\";\nimport { XIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Sheet({ ...props }: SheetPrimitive.Root.Props) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: SheetPrimitive.Close.Props) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n return (\n <SheetPrimitive.Backdrop\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: SheetPrimitive.Popup.Props & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <Tooltip>\n <TooltipTrigger\n render={\n <SheetPrimitive.Close\n data-slot=\"sheet-close\"\n render={\n <Button variant=\"ghost\" className=\"absolute top-3 right-3\" size=\"icon-sm\" />\n }\n />\n }\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </TooltipTrigger>\n <TooltipContent side=\"left\">Close panel</TooltipContent>\n </Tooltip>\n )}\n </SheetPrimitive.Popup>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-heading text-base font-medium text-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({ className, ...props }: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n"],"names":["Sheet","props","SheetPrimitive.Root","SheetTrigger","SheetPrimitive.Trigger","SheetClose","SheetPrimitive.Close","SheetPortal","SheetPrimitive.Portal","SheetOverlay","className","jsx","SheetPrimitive.Backdrop","cn","SheetContent","children","side","showCloseButton","jsxs","SheetPrimitive.Popup","Tooltip","TooltipTrigger","Button","XIcon","TooltipContent","SheetHeader","SheetFooter","SheetTitle","SheetPrimitive.Title","SheetDescription","SheetPrimitive.Description"],"mappings":"6NAQA,SAASA,EAAM,CAAE,GAAGC,GAAoC,CACtD,aAAQC,EAAA,CAAoB,YAAU,QAAS,GAAGD,EAAO,CAC3D,CAEA,SAASE,EAAa,CAAE,GAAGF,GAAuC,CAChE,aAAQG,EAAA,CAAuB,YAAU,gBAAiB,GAAGH,EAAO,CACtE,CAEA,SAASI,EAAW,CAAE,GAAGJ,GAAqC,CAC5D,aAAQK,EAAA,CAAqB,YAAU,cAAe,GAAGL,EAAO,CAClE,CAEA,SAASM,EAAY,CAAE,GAAGN,GAAsC,CAC9D,aAAQO,EAAA,CAAsB,YAAU,eAAgB,GAAGP,EAAO,CACpE,CAEA,SAASQ,EAAa,CAAE,UAAAC,EAAW,GAAGT,GAAwC,CAC5E,OACEU,EAAAA,IAACC,EAAA,CACC,YAAU,gBACV,UAAWC,EACT,qKACAH,CAAA,EAED,GAAGT,CAAA,CAAA,CAGV,CAEA,SAASa,EAAa,CACpB,UAAAJ,EACA,SAAAK,EACA,KAAAC,EAAO,QACP,gBAAAC,EAAkB,GAClB,GAAGhB,CACL,EAGG,CACD,cACGM,EAAA,CACC,SAAA,CAAAI,EAAAA,IAACF,EAAA,EAAa,EACdS,EAAAA,KAACC,EAAA,CACC,YAAU,gBACV,YAAWH,EACX,UAAWH,EACT,4pCACAH,CAAA,EAED,GAAGT,EAEH,SAAA,CAAAc,EACAE,UACEG,EAAA,CACC,SAAA,CAAAF,EAAAA,KAACG,EAAA,CACC,OACEV,EAAAA,IAACL,EAAA,CACC,YAAU,cACV,aACGgB,EAAA,CAAO,QAAQ,QAAQ,UAAU,yBAAyB,KAAK,SAAA,CAAU,CAAA,CAAA,EAKhF,SAAA,CAAAX,EAAAA,IAACY,EAAA,EAAM,EACPZ,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,OAAA,CAAK,CAAA,CAAA,CAAA,EAEjCA,EAAAA,IAACa,EAAA,CAAe,KAAK,OAAO,SAAA,aAAA,CAAW,CAAA,CAAA,CACzC,CAAA,CAAA,CAAA,CAEJ,EACF,CAEJ,CAEA,SAASC,EAAY,CAAE,UAAAf,EAAW,GAAGT,GAAsC,CACzE,OACEU,EAAAA,IAAC,MAAA,CACC,YAAU,eACV,UAAWE,EAAG,4BAA6BH,CAAS,EACnD,GAAGT,CAAA,CAAA,CAGV,CAEA,SAASyB,EAAY,CAAE,UAAAhB,EAAW,GAAGT,GAAsC,CACzE,OACEU,EAAAA,IAAC,MAAA,CACC,YAAU,eACV,UAAWE,EAAG,kCAAmCH,CAAS,EACzD,GAAGT,CAAA,CAAA,CAGV,CAEA,SAAS0B,EAAW,CAAE,UAAAjB,EAAW,GAAGT,GAAqC,CACvE,OACEU,EAAAA,IAACiB,EAAA,CACC,YAAU,cACV,UAAWf,EAAG,qDAAsDH,CAAS,EAC5E,GAAGT,CAAA,CAAA,CAGV,CAEA,SAAS4B,EAAiB,CAAE,UAAAnB,EAAW,GAAGT,GAA2C,CACnF,OACEU,EAAAA,IAACmB,EAAA,CACC,YAAU,oBACV,UAAWjB,EAAG,gCAAiCH,CAAS,EACvD,GAAGT,CAAA,CAAA,CAGV"}
@@ -0,0 +1,2 @@
1
+ import{j as r}from"./vendor-react-Dtud3GyP.js";import{aB as e}from"./vendor-CVKsgXJU.js";import{p as s}from"./index-72wCsW4_.js";function g(t){const{resolvedTheme:o}=s();return r.jsx(e,{theme:o,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-card group-[.toaster]:text-card-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...t})}export{g as Toaster};
2
+ //# sourceMappingURL=sonner-DGu1DGeO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner-DGu1DGeO.js","sources":["../../src/components/ui/sonner.tsx"],"sourcesContent":["import { Toaster as SonnerToaster, type ToasterProps } from \"sonner\";\nimport { useTheme } from \"../theme-provider\";\n\n/**\n * Sonner toast container. Reads the resolved theme from ThemeProvider so\n * toasts render correctly in light and dark modes. Mount once near the app\n * root.\n */\nfunction Toaster(props: ToasterProps) {\n const { resolvedTheme } = useTheme();\n return (\n <SonnerToaster\n theme={resolvedTheme}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-card group-[.toaster]:text-card-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton: \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton: \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n}\n\nexport { Toaster };\n"],"names":["Toaster","props","resolvedTheme","useTheme","jsx","SonnerToaster"],"mappings":"iIAQA,SAASA,EAAQC,EAAqB,CACpC,KAAM,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAC1B,OACEC,EAAAA,IAACC,EAAA,CACC,MAAOH,EACP,UAAU,gBACV,aAAc,CACZ,WAAY,CACV,MACE,uIACF,YAAa,uCACb,aAAc,mEACd,aAAc,8DAAA,CAChB,EAED,GAAGD,CAAA,CAAA,CAGV"}
@@ -0,0 +1,3 @@
1
+ import{r as l,j as r}from"./vendor-react-Dtud3GyP.js";import{q as m}from"./index-72wCsW4_.js";import{al as x}from"./vendor-CVKsgXJU.js";function u(n){return n.split(/\r?\n\r?\n/).filter(e=>e.trim()).map((e,s)=>{const a=e.split(/\r?\n/).filter(i=>i.startsWith("data:")).map(i=>i.replace(/^data:\s?/,"")).join(`
2
+ `),o=e.match(/^event:\s?(.*)$/m),p=(o==null?void 0:o[1])??"";let d="";try{const i=JSON.parse(a);d=f(i)??""}catch{d=a.slice(0,60)}return{id:s,name:p,data:a,preview:d}})}function f(n){var c;if(n===null||typeof n!="object")return;const t=n,e=t.choices??t.delta;if(Array.isArray(e)){const a=e[0],o=((c=a==null?void 0:a.delta)==null?void 0:c.content)??(a==null?void 0:a.text);if(o!=null)return JSON.stringify(o)}const s=t.delta;if((s==null?void 0:s.text)!=null)return JSON.stringify(s.text);if(t.type!=null)return String(t.type)}function N({body:n}){const t=l.useMemo(()=>n?u(n):[],[n]);return n?r.jsxs("div",{children:[r.jsxs("div",{className:"mb-2.5 text-xs text-muted-foreground",children:[t.length," event",t.length===1?"":"s"," · expand each to inspect payload"]}),t.map(e=>{const s=e.name?`event: ${e.name}`:`#${e.id+1}`;return r.jsxs("details",{className:"group mb-1.5 overflow-hidden rounded-md border border-border bg-card",children:[r.jsxs("summary",{className:"flex cursor-pointer items-center gap-1 px-2.5 py-1.5 font-mono text-[11px] text-muted-foreground select-none hover:text-foreground",children:[r.jsx(x,{className:"h-3 w-3 transition-transform group-open:rotate-180"}),r.jsx("span",{children:s}),e.preview&&r.jsx("span",{className:"ml-1 truncate",children:e.preview})]}),r.jsx("div",{className:"border-t border-border px-2.5 py-2",children:r.jsx(h,{data:e.data})})]},e.id)})]}):r.jsx("div",{className:"text-muted-foreground italic",children:"empty body"})}const h=l.memo(function({data:t}){try{const e=JSON.parse(t),s=JSON.stringify(e,null,2);return r.jsx("pre",{className:"m-0 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed",dangerouslySetInnerHTML:{__html:m(s)}})}catch{return r.jsx("pre",{className:"m-0 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed",children:t})}});export{N as SseViewer};
3
+ //# sourceMappingURL=sse-viewer-BHnn3FcY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-viewer-BHnn3FcY.js","sources":["../../src/components/sse-viewer.tsx"],"sourcesContent":["import { ChevronDown } from \"lucide-react\";\nimport { memo, useMemo } from \"react\";\n\nimport { syntaxHighlight } from \"@/lib/format\";\n\ninterface SseEvent {\n id: number;\n name: string;\n data: string;\n preview: string;\n}\n\nfunction parseSSE(body: string): SseEvent[] {\n const events = body.split(/\\r?\\n\\r?\\n/).filter((e) => e.trim());\n return events.map((ev, i) => {\n const dataLines = ev\n .split(/\\r?\\n/)\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.replace(/^data:\\s?/, \"\"));\n const data = dataLines.join(\"\\n\");\n const nameMatch = ev.match(/^event:\\s?(.*)$/m);\n const name = nameMatch?.[1] ?? \"\";\n\n let preview = \"\";\n try {\n const parsed = JSON.parse(data) as unknown;\n preview = extractDelta(parsed) ?? \"\";\n } catch {\n preview = data.slice(0, 60);\n }\n\n return {\n id: i,\n name,\n data,\n preview,\n };\n });\n}\n\nfunction extractDelta(value: unknown): string | undefined {\n if (value === null || typeof value !== \"object\") return undefined;\n\n const obj = value as Record<string, unknown>;\n const choices = (obj.choices ?? obj.delta) as unknown;\n\n if (Array.isArray(choices)) {\n const first = choices[0] as Record<string, unknown> | undefined;\n const d = (first?.delta as Record<string, unknown>)?.content ?? first?.text;\n if (d != null) return JSON.stringify(d);\n }\n\n const delta = obj.delta as Record<string, unknown> | undefined;\n if (delta?.text != null) return JSON.stringify(delta.text);\n if (obj.type != null) return String(obj.type);\n\n return undefined;\n}\n\ninterface SseViewerProps {\n body: string | null | undefined;\n}\n\nexport function SseViewer({ body }: SseViewerProps) {\n const events = useMemo(() => (body ? parseSSE(body) : []), [body]);\n\n if (!body) {\n return <div className=\"text-muted-foreground italic\">empty body</div>;\n }\n\n return (\n <div>\n <div className=\"mb-2.5 text-xs text-muted-foreground\">\n {events.length} event{events.length === 1 ? \"\" : \"s\"} · expand each to inspect payload\n </div>\n {events.map((ev) => {\n const label = ev.name ? `event: ${ev.name}` : `#${ev.id + 1}`;\n return (\n <details\n key={ev.id}\n className=\"group mb-1.5 overflow-hidden rounded-md border border-border bg-card\"\n >\n <summary className=\"flex cursor-pointer items-center gap-1 px-2.5 py-1.5 font-mono text-[11px] text-muted-foreground select-none hover:text-foreground\">\n <ChevronDown className=\"h-3 w-3 transition-transform group-open:rotate-180\" />\n <span>{label}</span>\n {ev.preview && <span className=\"ml-1 truncate\">{ev.preview}</span>}\n </summary>\n <div className=\"border-t border-border px-2.5 py-2\">\n <EventData data={ev.data} />\n </div>\n </details>\n );\n })}\n </div>\n );\n}\n\nconst EventData = memo(function EventData({ data }: { data: string }) {\n try {\n const parsed = JSON.parse(data) as unknown;\n const formatted = JSON.stringify(parsed, null, 2);\n return (\n <pre\n className=\"m-0 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: syntaxHighlight(formatted) }}\n />\n );\n } catch {\n return (\n <pre className=\"m-0 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed\">\n {data}\n </pre>\n );\n }\n});\n"],"names":["parseSSE","body","ev","i","data","l","nameMatch","name","preview","parsed","extractDelta","value","obj","choices","first","d","_a","delta","SseViewer","events","useMemo","jsxs","label","jsx","ChevronDown","EventData","memo","formatted","syntaxHighlight"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as o}from"./vendor-react-Dtud3GyP.js";import{o as i}from"./index-72wCsW4_.js";const u=500;function c(t){const r=o.useRef(t);r.current=t,o.useEffect(()=>{let e=null;function n(){e&&clearTimeout(e),e=setTimeout(()=>r.current(),u)}return window.addEventListener(i,n),()=>{window.removeEventListener(i,n),e&&clearTimeout(e)}},[])}export{c as u};
2
+ //# sourceMappingURL=use-capture-done-listener-u5RxfYQP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-capture-done-listener-u5RxfYQP.js","sources":["../../src/hooks/use-capture-done-listener.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\nimport { CAPTURE_DONE_EVENT } from \"@/lib/constants\";\n\nconst DEBOUNCE_MS = 500;\n\n/**\n * Listens for the `umans-gate:capture-done` window event (dispatched by\n * useCapturesSocket when a capture finishes) and calls `onDone` after a\n * short debounce. Multiple captures finishing in quick succession collapse\n * into a single `onDone` call.\n */\nexport function useCaptureDoneListener(onDone: () => void) {\n const fnRef = useRef(onDone);\n fnRef.current = onDone;\n\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function handler() {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fnRef.current(), DEBOUNCE_MS);\n }\n\n window.addEventListener(CAPTURE_DONE_EVENT, handler);\n return () => {\n window.removeEventListener(CAPTURE_DONE_EVENT, handler);\n if (timer) clearTimeout(timer);\n };\n }, []);\n}\n"],"names":["DEBOUNCE_MS","useCaptureDoneListener","onDone","fnRef","useRef","useEffect","timer","handler","CAPTURE_DONE_EVENT"],"mappings":"uFAIA,MAAMA,EAAc,IAQb,SAASC,EAAuBC,EAAoB,CACzD,MAAMC,EAAQC,EAAAA,OAAOF,CAAM,EAC3BC,EAAM,QAAUD,EAEhBG,EAAAA,UAAU,IAAM,CACd,IAAIC,EAA8C,KAElD,SAASC,GAAU,CACbD,gBAAoBA,CAAK,EAC7BA,EAAQ,WAAW,IAAMH,EAAM,QAAA,EAAWH,CAAW,CACvD,CAEA,cAAO,iBAAiBQ,EAAoBD,CAAO,EAC5C,IAAM,CACX,OAAO,oBAAoBC,EAAoBD,CAAO,EAClDD,gBAAoBA,CAAK,CAC/B,CACF,EAAG,CAAA,CAAE,CACP"}
@@ -0,0 +1,2 @@
1
+ import{u as l}from"./use-polling-resource-D_vWHFwW.js";const a=3e4;function i(){const o=e=>e===void 0?null:e,{data:r,loading:s,error:n,refresh:t}=l({endpoint:"/models",pollInterval:a,errorMessage:"Failed to fetch models",parse:o});return{data:r,loading:s,error:n,refresh:t}}export{i as u};
2
+ //# sourceMappingURL=use-models-B4MLkfpt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-models-B4MLkfpt.js","sources":["../../src/hooks/use-models.ts"],"sourcesContent":["import { usePollingResource } from \"@/hooks/use-polling-resource\";\nimport type { ModelsResponse } from \"@/types\";\n\nconst POLL_INTERVAL = 30000;\n\nexport interface UseModelsResult {\n data: ModelsResponse | null;\n loading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function useModels(): UseModelsResult {\n const parse = (value: unknown): ModelsResponse | null =>\n value === undefined ? null : (value as ModelsResponse);\n\n const { data, loading, error, refresh } = usePollingResource<ModelsResponse | null>({\n endpoint: \"/models\",\n pollInterval: POLL_INTERVAL,\n errorMessage: \"Failed to fetch models\",\n parse,\n });\n\n return { data, loading, error, refresh };\n}\n"],"names":["POLL_INTERVAL","useModels","parse","value","data","loading","error","refresh","usePollingResource"],"mappings":"uDAGA,MAAMA,EAAgB,IASf,SAASC,GAA6B,CAC3C,MAAMC,EAASC,GACbA,IAAU,OAAY,KAAQA,EAE1B,CAAE,KAAAC,EAAM,QAAAC,EAAS,MAAAC,EAAO,QAAAC,CAAA,EAAYC,EAA0C,CAClF,SAAU,UACV,aAAcR,EACd,aAAc,yBACd,MAAAE,CAAA,CACD,EAED,MAAO,CAAE,KAAAE,EAAM,QAAAC,EAAS,MAAAC,EAAO,QAAAC,CAAA,CACjC"}
@@ -0,0 +1,2 @@
1
+ import{r}from"./vendor-react-Dtud3GyP.js";import{u as A}from"./use-capture-done-listener-u5RxfYQP.js";import{A as C}from"./index-72wCsW4_.js";function j({endpoint:d,pollInterval:g,errorMessage:h,parse:l}){const[b,v]=r.useState(()=>l(void 0)),[y,m]=r.useState(!0),[R,a]=r.useState(null),i=r.useRef(!1),E=r.useRef({endpoint:d,errorMessage:h,parse:l});E.current={endpoint:d,errorMessage:h,parse:l};const o=r.useCallback(async t=>{const{endpoint:n,errorMessage:c,parse:s}=E.current;try{const e=await fetch(`${C}${n}`,{signal:t});if(!e.ok)throw new Error(`HTTP ${e.status}`);if(!(e.headers.get("content-type")??"").includes("application/json")){i.current||v(s(void 0)),a(null);return}const w=await e.json(),f=s(w);v(f),a(null),i.current=f!=null}catch(e){if(e instanceof DOMException&&e.name==="AbortError")return;i.current||a(e instanceof Error?e.message:c)}finally{m(!1)}},[]),u=r.useCallback(()=>{const t=new AbortController;return m(!0),a(null),o(t.signal),()=>t.abort()},[o]),p=r.useRef(u);return p.current=u,A(()=>p.current()),r.useEffect(()=>{const t=new AbortController;o(t.signal);let n=null;const c=()=>{n===null&&(n=setInterval(()=>o(t.signal),g))},s=()=>{n!==null&&(clearInterval(n),n=null)},e=()=>{document.hidden?s():(o(t.signal),c())};return c(),document.addEventListener("visibilitychange",e),()=>{t.abort(),s(),document.removeEventListener("visibilitychange",e)}},[o,g]),{data:b,loading:y,error:R,refresh:u}}export{j as u};
2
+ //# sourceMappingURL=use-polling-resource-D_vWHFwW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-polling-resource-D_vWHFwW.js","sources":["../../src/hooks/use-polling-resource.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useCaptureDoneListener } from \"@/hooks/use-capture-done-listener\";\nimport { API_BASE } from \"@/lib/constants\";\n\nexport interface UsePollingResourceOptions<T> {\n endpoint: string;\n pollInterval: number;\n errorMessage: string;\n parse: (value: unknown) => T;\n}\n\nexport interface UsePollingResourceResult<T> {\n data: T;\n loading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function usePollingResource<T>({\n endpoint,\n pollInterval,\n errorMessage,\n parse,\n}: UsePollingResourceOptions<T>): UsePollingResourceResult<T> {\n const [data, setData] = useState<T>(() => parse(undefined));\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const hasDataRef = useRef(false);\n\n const latestRef = useRef({ endpoint, errorMessage, parse });\n latestRef.current = { endpoint, errorMessage, parse };\n\n const fetchData = useCallback(async (signal: AbortSignal) => {\n const {\n endpoint: currentEndpoint,\n errorMessage: currentErrorMessage,\n parse: currentParse,\n } = latestRef.current;\n try {\n const res = await fetch(`${API_BASE}${currentEndpoint}`, { signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (!ct.includes(\"application/json\")) {\n if (!hasDataRef.current) {\n setData(currentParse(undefined));\n }\n setError(null);\n return;\n }\n const json = (await res.json()) as unknown;\n const parsed = currentParse(json);\n setData(parsed);\n setError(null);\n hasDataRef.current = parsed !== null && parsed !== undefined;\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n // Keep existing data on transient failures; only error before first load.\n if (!hasDataRef.current) {\n setError(err instanceof Error ? err.message : currentErrorMessage);\n }\n } finally {\n setLoading(false);\n }\n }, []);\n\n const refresh = useCallback(() => {\n const controller = new AbortController();\n setLoading(true);\n setError(null);\n void fetchData(controller.signal);\n return () => controller.abort();\n }, [fetchData]);\n\n const refreshRef = useRef(refresh);\n refreshRef.current = refresh;\n useCaptureDoneListener(() => refreshRef.current());\n\n useEffect(() => {\n const controller = new AbortController();\n void fetchData(controller.signal);\n\n let interval: ReturnType<typeof setInterval> | null = null;\n\n const startPolling = () => {\n if (interval === null) {\n interval = setInterval(() => fetchData(controller.signal), pollInterval);\n }\n };\n\n const stopPolling = () => {\n if (interval !== null) {\n clearInterval(interval);\n interval = null;\n }\n };\n\n const handleVisibilityChange = () => {\n if (document.hidden) {\n stopPolling();\n } else {\n void fetchData(controller.signal);\n startPolling();\n }\n };\n\n startPolling();\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n controller.abort();\n stopPolling();\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n };\n }, [fetchData, pollInterval]);\n\n return { data, loading, error, refresh };\n}\n"],"names":["usePollingResource","endpoint","pollInterval","errorMessage","parse","data","setData","useState","loading","setLoading","error","setError","hasDataRef","useRef","latestRef","fetchData","useCallback","signal","currentEndpoint","currentErrorMessage","currentParse","res","API_BASE","json","parsed","err","refresh","controller","refreshRef","useCaptureDoneListener","useEffect","interval","startPolling","stopPolling","handleVisibilityChange"],"mappings":"8IAmBO,SAASA,EAAsB,CACpC,SAAAC,EACA,aAAAC,EACA,aAAAC,EACA,MAAAC,CACF,EAA8D,CAC5D,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAY,IAAMH,EAAM,MAAS,CAAC,EACpD,CAACI,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAI,EACrC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEhDK,EAAaC,EAAAA,OAAO,EAAK,EAEzBC,EAAYD,EAAAA,OAAO,CAAE,SAAAZ,EAAU,aAAAE,EAAc,MAAAC,EAAO,EAC1DU,EAAU,QAAU,CAAE,SAAAb,EAAU,aAAAE,EAAc,MAAAC,CAAA,EAE9C,MAAMW,EAAYC,cAAY,MAAOC,GAAwB,CAC3D,KAAM,CACJ,SAAUC,EACV,aAAcC,EACd,MAAOC,CAAA,EACLN,EAAU,QACd,GAAI,CACF,MAAMO,EAAM,MAAM,MAAM,GAAGC,CAAQ,GAAGJ,CAAe,GAAI,CAAE,OAAAD,EAAQ,EACnE,GAAI,CAACI,EAAI,GAAI,MAAM,IAAI,MAAM,QAAQA,EAAI,MAAM,EAAE,EAEjD,GAAI,EADOA,EAAI,QAAQ,IAAI,cAAc,GAAK,IACtC,SAAS,kBAAkB,EAAG,CAC/BT,EAAW,SACdN,EAAQc,EAAa,MAAS,CAAC,EAEjCT,EAAS,IAAI,EACb,MACF,CACA,MAAMY,EAAQ,MAAMF,EAAI,KAAA,EAClBG,EAASJ,EAAaG,CAAI,EAChCjB,EAAQkB,CAAM,EACdb,EAAS,IAAI,EACbC,EAAW,QAAUY,GAAW,IAClC,OAASC,EAAK,CACZ,GAAIA,aAAe,cAAgBA,EAAI,OAAS,aAAc,OAEzDb,EAAW,SACdD,EAASc,aAAe,MAAQA,EAAI,QAAUN,CAAmB,CAErE,QAAA,CACEV,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAECiB,EAAUV,EAAAA,YAAY,IAAM,CAChC,MAAMW,EAAa,IAAI,gBACvB,OAAAlB,EAAW,EAAI,EACfE,EAAS,IAAI,EACRI,EAAUY,EAAW,MAAM,EACzB,IAAMA,EAAW,MAAA,CAC1B,EAAG,CAACZ,CAAS,CAAC,EAERa,EAAaf,EAAAA,OAAOa,CAAO,EACjC,OAAAE,EAAW,QAAUF,EACrBG,EAAuB,IAAMD,EAAW,SAAS,EAEjDE,EAAAA,UAAU,IAAM,CACd,MAAMH,EAAa,IAAI,gBAClBZ,EAAUY,EAAW,MAAM,EAEhC,IAAII,EAAkD,KAEtD,MAAMC,EAAe,IAAM,CACrBD,IAAa,OACfA,EAAW,YAAY,IAAMhB,EAAUY,EAAW,MAAM,EAAGzB,CAAY,EAE3E,EAEM+B,EAAc,IAAM,CACpBF,IAAa,OACf,cAAcA,CAAQ,EACtBA,EAAW,KAEf,EAEMG,EAAyB,IAAM,CAC/B,SAAS,OACXD,EAAA,GAEKlB,EAAUY,EAAW,MAAM,EAChCK,EAAA,EAEJ,EAEA,OAAAA,EAAA,EACA,SAAS,iBAAiB,mBAAoBE,CAAsB,EAE7D,IAAM,CACXP,EAAW,MAAA,EACXM,EAAA,EACA,SAAS,oBAAoB,mBAAoBC,CAAsB,CACzE,CACF,EAAG,CAACnB,EAAWb,CAAY,CAAC,EAErB,CAAE,KAAAG,EAAM,QAAAG,EAAS,MAAAE,EAAO,QAAAgB,CAAA,CACjC"}