@ai-sdk/devtools 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.3.0 | 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)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-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}}}@layer theme{:root,:host{--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--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-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--default-mono-font-family:"Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace}}@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}*{border-color:var(--border);outline-color:var(--ring)}body{background-color:var(--background);color:var(--foreground);font-family:Geist Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}code,pre,kbd{font-family:Geist Mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}*{scrollbar-width:thin;scrollbar-color:var(--border) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background-color:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background-color:var(--muted-foreground)}::-webkit-scrollbar-corner{background:0 0}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.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}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-1{bottom:calc(var(--spacing) * 1)}.z-10{z-index:10}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-5\.5{margin-left:calc(var(--spacing) * 5.5)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-6{-webkit-line-clamp:6;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.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-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-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[400px\]{max-height:400px}.min-h-\[calc\(100vh-57px\)\]{min-height:calc(100vh - 57px)}.min-h-full{min-height:100%}.w-1{width:calc(var(--spacing) * 1)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-4{width:calc(var(--spacing) * 4)}.w-\[100px\]{width:100px}.w-\[300px\]{width:300px}.w-\[800px\]{width:800px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[200px\]{max-width:200px}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-in{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)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.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)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * 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)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.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-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-agent\/20{border-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.border-agent\/20{border-color:color-mix(in oklab,var(--agent) 20%,transparent)}}.border-agent\/30{border-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.border-agent\/30{border-color:color-mix(in oklab,var(--agent) 30%,transparent)}}.border-border,.border-border\/20{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,var(--border) 20%,transparent)}}.border-border\/30{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,var(--border) 30%,transparent)}}.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--border) 50%,transparent)}}.border-destructive\/30{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.border-info\/30{border-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.border-info\/30{border-color:color-mix(in oklab,var(--info) 30%,transparent)}}.border-success\/30{border-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-success\/30{border-color:color-mix(in oklab,var(--success) 30%,transparent)}}.border-tool\/30{border-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.border-tool\/30{border-color:color-mix(in oklab,var(--tool) 30%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/20{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/20{border-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.border-warning\/30{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/30{border-color:color-mix(in oklab,var(--warning) 30%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:var(--accent)}.bg-agent,.bg-agent\/10{background-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.bg-agent\/10{background-color:color-mix(in oklab,var(--agent) 10%,transparent)}}.bg-agent\/20{background-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.bg-agent\/20{background-color:color-mix(in oklab,var(--agent) 20%,transparent)}}.bg-background,.bg-background\/50{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,var(--background) 50%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/50{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,var(--card) 50%,transparent)}}.bg-danger,.bg-danger\/20{background-color:var(--danger)}@supports (color:color-mix(in lab,red,red)){.bg-danger\/20{background-color:color-mix(in oklab,var(--danger) 20%,transparent)}}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-info,.bg-info\/10{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/10{background-color:color-mix(in oklab,var(--info) 10%,transparent)}}.bg-info\/15{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/15{background-color:color-mix(in oklab,var(--info) 15%,transparent)}}.bg-info\/20{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/20{background-color:color-mix(in oklab,var(--info) 20%,transparent)}}.bg-muted,.bg-muted\/10{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,var(--muted) 10%,transparent)}}.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--muted) 20%,transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted) 30%,transparent)}}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-primary\/10{background-color:var(--sidebar-primary)}@supports (color:color-mix(in lab,red,red)){.bg-sidebar-primary\/10{background-color:color-mix(in oklab,var(--sidebar-primary) 10%,transparent)}}.bg-success,.bg-success\/5{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/5{background-color:color-mix(in oklab,var(--success) 5%,transparent)}}.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-success\/15{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/15{background-color:color-mix(in oklab,var(--success) 15%,transparent)}}.bg-success\/20{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/20{background-color:color-mix(in oklab,var(--success) 20%,transparent)}}.bg-tool,.bg-tool\/10{background-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.bg-tool\/10{background-color:color-mix(in oklab,var(--tool) 10%,transparent)}}.bg-tool\/20{background-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.bg-tool\/20{background-color:color-mix(in oklab,var(--tool) 20%,transparent)}}.bg-warning,.bg-warning\/5{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/5{background-color:color-mix(in oklab,var(--warning) 5%,transparent)}}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--warning) 10%,transparent)}}.bg-warning\/20{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-px{padding:1px}.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-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.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)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-1{padding-left:calc(var(--spacing) * 1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:Geist Mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-balance{text-wrap:balance}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-agent{color:var(--agent)}.text-card-foreground{color:var(--card-foreground)}.text-danger{color:var(--danger)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground,.text-foreground\/80{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--foreground) 80%,transparent)}}.text-foreground\/90{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,var(--foreground) 90%,transparent)}}.text-info{color:var(--info)}.text-muted-foreground,.text-muted-foreground\/30{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/30{color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--muted-foreground) 60%,transparent)}}.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--muted-foreground) 70%,transparent)}}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-primary{color:var(--sidebar-primary)}.text-success{color:var(--success)}.text-tool{color:var(--tool)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.shadow-sm{--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)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--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)}.ring-foreground\/50{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/50{--tw-ring-color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.ring-info\/50{--tw-ring-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.ring-info\/50{--tw-ring-color:color-mix(in oklab, var(--info) 50%, transparent)}}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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))}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[vaul-drawer-direction\=bottom\]\/drawer-content\:block:is(:where(.group\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.group-data-\[vaul-drawer-direction\=bottom\]\/drawer-content\:text-center:is(:where(.group\/drawer-content)[data-vaul-drawer-direction=bottom] *),.group-data-\[vaul-drawer-direction\=top\]\/drawer-content\:text-center:is(:where(.group\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}@media(hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab,var(--accent) 30%,transparent)}}.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.hover\:bg-agent\/15:hover{background-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-agent\/15:hover{background-color:color-mix(in oklab,var(--agent) 15%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-info\/20:hover{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info\/20:hover{background-color:color-mix(in oklab,var(--info) 20%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/30:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/30:hover{background-color:color-mix(in oklab,var(--primary) 30%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-success\/20:hover{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/20:hover{background-color:color-mix(in oklab,var(--success) 20%,transparent)}}.hover\:bg-tool\/20:hover{background-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-tool\/20:hover{background-color:color-mix(in oklab,var(--tool) 20%,transparent)}}.hover\:bg-warning\/20:hover{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/20:hover{background-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.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:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color: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, var(--destructive) 20%, transparent)}}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[state\=closed\]\:animate-out[data-state=closed]{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-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=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\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[vaul-drawer-direction\=bottom\]\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=bottom\]\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=bottom\]\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(var(--spacing) * 24)}.data-\[vaul-drawer-direction\=bottom\]\:max-h-\[80vh\][data-vaul-drawer-direction=bottom]{max-height:80vh}.data-\[vaul-drawer-direction\=bottom\]\:rounded-t-lg[data-vaul-drawer-direction=bottom]{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.data-\[vaul-drawer-direction\=bottom\]\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\[vaul-drawer-direction\=left\]\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=left\]\:left-0[data-vaul-drawer-direction=left]{left:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=left\]\:w-3\/4[data-vaul-drawer-direction=left]{width:75%}.data-\[vaul-drawer-direction\=left\]\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.data-\[vaul-drawer-direction\=right\]\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=right\]\:right-0[data-vaul-drawer-direction=right]{right:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=right\]\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.data-\[vaul-drawer-direction\=top\]\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=top\]\:top-0[data-vaul-drawer-direction=top]{top:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=top\]\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(var(--spacing) * 24)}.data-\[vaul-drawer-direction\=top\]\:max-h-\[80vh\][data-vaul-drawer-direction=top]{max-height:80vh}.data-\[vaul-drawer-direction\=top\]\:rounded-b-lg[data-vaul-drawer-direction=top]{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.data-\[vaul-drawer-direction\=top\]\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@media(min-width:40rem){.sm\:max-w-\[800px\]{max-width:800px}.data-\[vaul-drawer-direction\=left\]\:sm\:max-w-sm[data-vaul-drawer-direction=left]{max-width:var(--container-sm)}}@media(min-width:48rem){.md\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.md\:text-left{text-align:left}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}@media(hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary) 90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}}@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}:root,:root[data-theme=dark]{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(17% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(14.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(98.5% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(39.6% .141 25.723);--destructive-foreground:oklch(63.7% .237 25.331);--border:oklch(26.9% 0 0);--input:oklch(26.9% 0 0);--ring:oklch(60% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--radius:.625rem;--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(26.9% 0 0);--sidebar-ring:oklch(60% 0 0);--info:#60a5fa;--success:#4ade80;--warning:#fbbf24;--tool:#c084fc;--agent:#22d3ee;--danger:#f87171;color-scheme:dark}:root[data-theme=light]{--background:#fff;--foreground:#171717;--card:#fafafa;--card-foreground:#171717;--popover:#fff;--popover-foreground:#171717;--primary:#171717;--primary-foreground:#fafafa;--secondary:#f1f1f1;--secondary-foreground:#262626;--muted:#f1f1f1;--muted-foreground:#525252;--accent:#e5e5e5;--accent-foreground:#171717;--destructive:#dc2626;--destructive-foreground:#b91c1c;--border:#8a8a8a;--input:#8a8a8a;--ring:#737373;--chart-1:#1d4ed8;--chart-2:#15803d;--chart-3:#a16207;--chart-4:#7e22ce;--chart-5:#be123c;--sidebar:#f7f7f7;--sidebar-foreground:#171717;--sidebar-primary:#1d4ed8;--sidebar-primary-foreground:#fff;--sidebar-accent:#e5e5e5;--sidebar-accent-foreground:#171717;--sidebar-border:#8a8a8a;--sidebar-ring:#737373;--info:#1d4ed8;--success:#166534;--warning:#92400e;--tool:#7e22ce;--agent:#0e7490;--danger:#b91c1c;color-scheme:light}@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-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-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-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}@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))}}
@@ -10,8 +10,8 @@
10
10
  href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600;700&display=swap"
11
11
  rel="stylesheet"
12
12
  />
13
- <script type="module" crossorigin src="/assets/index-DKzNaLaQ.js"></script>
14
- <link rel="stylesheet" crossorigin href="/assets/index-BVPj3Knk.css">
13
+ <script type="module" crossorigin src="/assets/index-Beo4T2zg.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/assets/index-CIZI8r26.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/devtools",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -55,7 +55,7 @@
55
55
  "vite": "^6.4.3",
56
56
  "vitest": "^4.1.6",
57
57
  "zod": "3.25.76",
58
- "ai": "7.0.27"
58
+ "ai": "7.0.35"
59
59
  },
60
60
  "publishConfig": {
61
61
  "access": "public",
@@ -87,7 +87,9 @@
87
87
  "build": "pnpm build:client && pnpm build:server",
88
88
  "build:client": "vite build",
89
89
  "build:server": "tsup --tsconfig tsconfig.build.json",
90
- "test": "vitest --config vitest.node.config.js --run",
90
+ "test": "pnpm test:unit",
91
+ "test:e2e": "pnpm build:client && playwright test",
92
+ "test:unit": "vitest --config vitest.node.config.js --run",
91
93
  "test:watch": "vitest --config vitest.node.config.js"
92
94
  }
93
95
  }
@@ -36,13 +36,31 @@ import {
36
36
  import { TokenBreakdownTooltip } from './components/shared-components';
37
37
  import { StepCard } from './components/step-card';
38
38
  import { TraceTimeline } from './components/trace-timeline';
39
+ import { ThemeToggle } from './components/theme-toggle';
40
+ import { setTheme, type Theme } from './theme';
39
41
 
40
- function App() {
42
+ function App({
43
+ initialTheme,
44
+ storage,
45
+ }: {
46
+ initialTheme: Theme;
47
+ storage?: Pick<Storage, 'setItem'>;
48
+ }) {
41
49
  const [runs, setRuns] = useState<Run[]>([]);
42
50
  const [selectedRun, setSelectedRun] = useState<RunDetail | null>(null);
43
51
  const [expandedSteps, setExpandedSteps] = useState<Set<string>>(new Set());
44
52
  const [loading, setLoading] = useState(true);
45
53
  const [showTimeline, setShowTimeline] = useState(false);
54
+ const [theme, updateTheme] = useState<Theme>(initialTheme);
55
+
56
+ const handleThemeChange = (nextTheme: Theme) => {
57
+ setTheme({
58
+ theme: nextTheme,
59
+ root: document.documentElement,
60
+ storage,
61
+ });
62
+ updateTheme(nextTheme);
63
+ };
46
64
 
47
65
  const fetchRuns = async () => {
48
66
  try {
@@ -245,6 +263,7 @@ function App() {
245
263
  </span>
246
264
  </div>
247
265
  <div className="flex gap-2">
266
+ <ThemeToggle theme={theme} onThemeChange={handleThemeChange} />
248
267
  <Button
249
268
  variant="ghost"
250
269
  size="sm"
@@ -293,7 +312,7 @@ function App() {
293
312
  >
294
313
  <div className="flex items-start gap-2 mb-1.5 min-w-0">
295
314
  {run.isInProgress ? (
296
- <Loader2 className="size-3.5 text-blue-400 mt-0.5 shrink-0 animate-spin" />
315
+ <Loader2 className="size-3.5 text-info mt-0.5 shrink-0 animate-spin" />
297
316
  ) : run.hasError ? (
298
317
  <AlertCircle className="size-3.5 text-destructive-foreground mt-0.5 shrink-0" />
299
318
  ) : (
@@ -315,8 +334,8 @@ function App() {
315
334
  <span
316
335
  className={`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium ${
317
336
  run.type === 'stream'
318
- ? 'bg-blue-500/15 text-blue-400'
319
- : 'bg-emerald-500/15 text-emerald-400'
337
+ ? 'bg-info/15 text-info'
338
+ : 'bg-success/15 text-success'
320
339
  }`}
321
340
  >
322
341
  {run.type === 'stream' && (
@@ -363,7 +382,7 @@ function App() {
363
382
  {selectedRun.run.isInProgress && (
364
383
  <Badge
365
384
  variant="secondary"
366
- className="text-[10px] h-5 gap-1.5 bg-blue-500/15 text-blue-400 border-blue-500/30"
385
+ className="text-[10px] h-5 gap-1.5 bg-info/15 text-info border-info/30"
367
386
  >
368
387
  <Loader2 className="size-3 animate-spin" />
369
388
  In Progress
@@ -174,7 +174,7 @@ function InputMessagePreview({
174
174
  </div>
175
175
 
176
176
  {reasoningContent && (
177
- <div className="text-xs text-amber-500/60">[thinking]</div>
177
+ <div className="text-xs text-warning">[thinking]</div>
178
178
  )}
179
179
 
180
180
  {textContent && (
@@ -97,25 +97,25 @@ function ToolCallCard({
97
97
  typeof result === 'string' ? safeParseJson(result) : result;
98
98
 
99
99
  return (
100
- <div className="rounded-md border border-purple/30 overflow-hidden">
100
+ <div className="rounded-md border border-tool/30 overflow-hidden">
101
101
  <button
102
- className="w-full flex items-center gap-2 px-3 py-2 bg-purple/10 hover:bg-purple/20 transition-colors"
102
+ className="w-full flex items-center gap-2 px-3 py-2 bg-tool/10 hover:bg-tool/20 transition-colors"
103
103
  onClick={() => setExpanded(!expanded)}
104
104
  >
105
105
  <ChevronRight
106
- className={`size-3 text-purple transition-transform shrink-0 ${
106
+ className={`size-3 text-tool transition-transform shrink-0 ${
107
107
  expanded ? 'rotate-90' : ''
108
108
  }`}
109
109
  />
110
- <Wrench className="size-3 text-purple shrink-0" />
111
- <span className="text-xs font-mono font-medium text-purple">
110
+ <Wrench className="size-3 text-tool shrink-0" />
111
+ <span className="text-xs font-mono font-medium text-tool">
112
112
  {toolName}
113
113
  </span>
114
114
  {!expanded &&
115
115
  parsedArgs &&
116
116
  typeof parsedArgs === 'object' &&
117
117
  !Array.isArray(parsedArgs) && (
118
- <span className="text-[11px] font-mono text-purple/70 truncate">
118
+ <span className="text-[11px] font-mono text-tool truncate">
119
119
  {formatToolParams(parsedArgs)}
120
120
  </span>
121
121
  )}
@@ -123,7 +123,7 @@ function ToolCallCard({
123
123
 
124
124
  {expanded && (
125
125
  <>
126
- <div className="p-3 bg-card/50 border-t border-purple/30">
126
+ <div className="p-3 bg-card/50 border-t border-tool/30">
127
127
  <div className="text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-2">
128
128
  Input
129
129
  </div>
@@ -326,27 +326,27 @@ export function ReasoningBlock({ content }: { content: string }) {
326
326
  content.length > 200 ? content.slice(0, 200) + '…' : content;
327
327
 
328
328
  return (
329
- <div className="overflow-hidden rounded-md border border-amber-500/30">
329
+ <div className="overflow-hidden rounded-md border border-warning/30">
330
330
  <button
331
- className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-amber-500/10 hover:bg-amber-500/20"
331
+ className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-warning/10 hover:bg-warning/20"
332
332
  onClick={() => setExpanded(!expanded)}
333
333
  >
334
334
  <ChevronRight
335
- className={`size-3 text-amber-500 transition-transform shrink-0 ${
335
+ className={`size-3 text-warning transition-transform shrink-0 ${
336
336
  expanded ? 'rotate-90' : ''
337
337
  }`}
338
338
  />
339
- <Brain className="text-amber-500 size-3 shrink-0" />
340
- <span className="text-xs font-medium text-amber-500">Thinking</span>
339
+ <Brain className="text-warning size-3 shrink-0" />
340
+ <span className="text-xs font-medium text-warning">Thinking</span>
341
341
  {!expanded && (
342
- <span className="text-[11px] text-amber-500/70 truncate ml-1">
342
+ <span className="text-[11px] text-warning truncate ml-1">
343
343
  {previewContent}
344
344
  </span>
345
345
  )}
346
346
  </button>
347
347
 
348
348
  {expanded && (
349
- <div className="p-3 border-t bg-card/50 border-amber-500/30">
349
+ <div className="p-3 border-t bg-card/50 border-warning/30">
350
350
  <div className="text-xs leading-relaxed whitespace-pre-wrap text-foreground/80">
351
351
  {content}
352
352
  </div>
@@ -371,11 +371,11 @@ export function TextBlock({
371
371
  const previewContent =
372
372
  content.length > 200 ? content.slice(0, 200) + '…' : content;
373
373
 
374
- const borderColor = isSystem ? 'border-blue-500/30' : 'border-border';
375
- const bgColor = isSystem ? 'bg-blue-500/10' : 'bg-muted/30';
376
- const hoverBgColor = isSystem ? 'hover:bg-blue-500/20' : 'hover:bg-muted/50';
377
- const iconColor = isSystem ? 'text-blue-400' : 'text-muted-foreground';
378
- const labelColor = isSystem ? 'text-blue-400' : 'text-foreground';
374
+ const borderColor = isSystem ? 'border-info/30' : 'border-border';
375
+ const bgColor = isSystem ? 'bg-info/10' : 'bg-muted/30';
376
+ const hoverBgColor = isSystem ? 'hover:bg-info/20' : 'hover:bg-muted/50';
377
+ const iconColor = isSystem ? 'text-info' : 'text-muted-foreground';
378
+ const labelColor = isSystem ? 'text-info' : 'text-foreground';
379
379
 
380
380
  const handleCopy = async (e: React.MouseEvent) => {
381
381
  e.stopPropagation();
@@ -399,7 +399,7 @@ export function TextBlock({
399
399
  <span className={`text-xs font-medium ${labelColor}`}>Text</span>
400
400
  {!expanded && (
401
401
  <span
402
- className={`text-[11px] ${isSystem ? 'text-blue-400/70' : 'text-muted-foreground'} truncate ml-1`}
402
+ className={`text-[11px] ${isSystem ? 'text-info' : 'text-muted-foreground'} truncate ml-1`}
403
403
  >
404
404
  {previewContent}
405
405
  </span>
@@ -441,7 +441,7 @@ export function ToolItem({ tool }: { tool: ToolDefinition }) {
441
441
  className="w-full flex items-center justify-between p-2.5 hover:bg-accent/50 transition-colors"
442
442
  onClick={() => setExpanded(!expanded)}
443
443
  >
444
- <span className="font-mono text-sm text-purple">{tool.name}</span>
444
+ <span className="font-mono text-sm text-tool">{tool.name}</span>
445
445
  {hasExpandableContent && (
446
446
  <ChevronRight
447
447
  className={`size-3 text-muted-foreground transition-transform ${
@@ -486,25 +486,25 @@ export function CollapsibleToolCall({
486
486
  const parsedData = typeof data === 'string' ? safeParseJson(data) : data;
487
487
 
488
488
  return (
489
- <div className="overflow-hidden rounded-md border border-purple/30">
489
+ <div className="overflow-hidden rounded-md border border-tool/30">
490
490
  <button
491
- className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-purple/10 hover:bg-purple/20"
491
+ className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-tool/10 hover:bg-tool/20"
492
492
  onClick={() => setExpanded(!expanded)}
493
493
  >
494
494
  <ChevronRight
495
- className={`size-3 text-purple transition-transform shrink-0 ${
495
+ className={`size-3 text-tool transition-transform shrink-0 ${
496
496
  expanded ? 'rotate-90' : ''
497
497
  }`}
498
498
  />
499
- <Wrench className="size-3 text-purple shrink-0" />
500
- <span className="font-mono text-xs font-medium text-purple">
499
+ <Wrench className="size-3 text-tool shrink-0" />
500
+ <span className="font-mono text-xs font-medium text-tool">
501
501
  {toolName}
502
502
  </span>
503
503
  {!expanded &&
504
504
  parsedData != null &&
505
505
  typeof parsedData === 'object' &&
506
506
  !Array.isArray(parsedData) && (
507
- <span className="text-[11px] font-mono text-purple/70 truncate">
507
+ <span className="text-[11px] font-mono text-tool truncate">
508
508
  {formatToolParams(parsedData as Record<string, unknown>)}
509
509
  </span>
510
510
  )}
@@ -515,7 +515,7 @@ export function CollapsibleToolCall({
515
515
  )}
516
516
  </button>
517
517
  {expanded && (
518
- <div className="p-3 border-t bg-card/50 border-purple/30">
518
+ <div className="p-3 border-t bg-card/50 border-tool/30">
519
519
  <JsonBlock data={parsedData} />
520
520
  </div>
521
521
  )}
@@ -82,7 +82,7 @@ export function StepCard({
82
82
  return (
83
83
  <Collapsible open={isExpanded} onOpenChange={() => toggleStep(step.id)}>
84
84
  <Card
85
- className={`overflow-hidden py-0 gap-0 ${isActiveStep ? 'ring-2 ring-blue-500/50 ring-offset-1 ring-offset-background' : ''}`}
85
+ className={`overflow-hidden py-0 gap-0 ${isActiveStep ? 'ring-2 ring-info/50 ring-offset-1 ring-offset-background' : ''}`}
86
86
  >
87
87
  <CollapsibleTrigger asChild>
88
88
  <button
@@ -164,7 +164,7 @@ export function StepCard({
164
164
 
165
165
  <div className="flex items-center gap-4">
166
166
  {isActiveStep ? (
167
- <span className="text-[11px] text-blue-400 font-medium flex items-center gap-1.5">
167
+ <span className="text-[11px] text-info font-medium flex items-center gap-1.5">
168
168
  <Loader2 className="size-3 animate-spin" />
169
169
  streaming
170
170
  </span>
@@ -292,7 +292,7 @@ export function StepDetailContent({
292
292
  ) : output ? (
293
293
  <OutputDisplay output={output} toolResults={toolResults} />
294
294
  ) : isActiveStep ? (
295
- <div className="flex items-center gap-2 text-sm text-blue-400">
295
+ <div className="flex items-center gap-2 text-sm text-info">
296
296
  <Loader2 className="size-4 animate-spin" />
297
297
  <span>Waiting for response...</span>
298
298
  </div>
@@ -410,20 +410,18 @@ function NestedRunCard({
410
410
  const modelId = firstStep?.model_id;
411
411
 
412
412
  return (
413
- <div className="rounded-md border border-cyan-500/30 overflow-hidden">
413
+ <div className="rounded-md border border-agent/30 overflow-hidden">
414
414
  <button
415
- className="w-full flex items-center gap-2 px-3 py-2 bg-cyan-500/10 hover:bg-cyan-500/15 transition-colors"
415
+ className="w-full flex items-center gap-2 px-3 py-2 bg-agent/10 hover:bg-agent/15 transition-colors"
416
416
  onClick={() => setExpanded(!expanded)}
417
417
  >
418
418
  <ChevronRight
419
- className={`size-3 text-cyan-400 transition-transform shrink-0 ${
419
+ className={`size-3 text-agent transition-transform shrink-0 ${
420
420
  expanded ? 'rotate-90' : ''
421
421
  }`}
422
422
  />
423
- <Brain className="size-3 text-cyan-400 shrink-0" />
424
- <span className="text-xs font-medium text-cyan-400 truncate">
425
- {label}
426
- </span>
423
+ <Brain className="size-3 text-agent shrink-0" />
424
+ <span className="text-xs font-medium text-agent truncate">{label}</span>
427
425
  <span className="ml-auto flex items-center gap-3 shrink-0">
428
426
  {modelId && (
429
427
  <span className="text-[10px] font-mono text-muted-foreground">
@@ -438,13 +436,13 @@ function NestedRunCard({
438
436
  {formatDuration(totalDuration)}
439
437
  </span>
440
438
  {childRun.run.isInProgress && (
441
- <Loader2 className="size-3 text-blue-400 animate-spin" />
439
+ <Loader2 className="size-3 text-info animate-spin" />
442
440
  )}
443
441
  </span>
444
442
  </button>
445
443
 
446
444
  {expanded && (
447
- <div className="border-t border-cyan-500/20 bg-background/50 p-3 flex flex-col gap-2">
445
+ <div className="border-t border-agent/20 bg-background/50 p-3 flex flex-col gap-2">
448
446
  {childRun.steps.map((step, index) => {
449
447
  const nestedChildRuns = (childRun.childRuns ?? []).filter(
450
448
  cr => cr.run.parent_step_id === step.id,
@@ -0,0 +1,33 @@
1
+ import { Moon, Sun } from 'lucide-react';
2
+ import type { Theme } from '../theme';
3
+ import { Button } from './ui/button';
4
+
5
+ export function ThemeToggle({
6
+ theme,
7
+ onThemeChange,
8
+ }: {
9
+ theme: Theme;
10
+ onThemeChange: (theme: Theme) => void;
11
+ }) {
12
+ const nextTheme = theme === 'dark' ? 'light' : 'dark';
13
+ const title = `Switch to ${nextTheme} theme`;
14
+
15
+ return (
16
+ <Button
17
+ variant="ghost"
18
+ size="icon-sm"
19
+ type="button"
20
+ aria-label="Use light theme"
21
+ aria-pressed={theme === 'light'}
22
+ title={title}
23
+ onClick={() => onThemeChange(nextTheme)}
24
+ >
25
+ {theme === 'dark' ? (
26
+ <Sun className="size-3.5" />
27
+ ) : (
28
+ <Moon className="size-3.5" />
29
+ )}
30
+ <span className="sr-only">Use light theme</span>
31
+ </Button>
32
+ );
33
+ }
@@ -166,17 +166,17 @@ export function TraceTimeline({
166
166
  const spanIcon = (kind: SpanKind) => {
167
167
  switch (kind) {
168
168
  case 'child-run':
169
- return <Brain className="size-3 text-cyan-400 shrink-0" />;
169
+ return <Brain className="size-3 text-agent shrink-0" />;
170
170
  case 'thinking':
171
- return <Brain className="size-3 text-amber-500 shrink-0" />;
171
+ return <Brain className="size-3 text-warning shrink-0" />;
172
172
  case 'tool-call':
173
- return <Wrench className="size-3 text-purple-400 shrink-0" />;
173
+ return <Wrench className="size-3 text-tool shrink-0" />;
174
174
  case 'text':
175
- return <MessageSquare className="size-3 text-emerald-400 shrink-0" />;
175
+ return <MessageSquare className="size-3 text-success shrink-0" />;
176
176
  case 'error':
177
- return <AlertCircle className="size-3 text-red-400 shrink-0" />;
177
+ return <AlertCircle className="size-3 text-danger shrink-0" />;
178
178
  default:
179
- return <Zap className="size-3 text-blue-400 shrink-0" />;
179
+ return <Zap className="size-3 text-info shrink-0" />;
180
180
  }
181
181
  };
182
182
 
@@ -211,7 +211,7 @@ export function TraceTimeline({
211
211
  {ticks.map((tick, i) => (
212
212
  <span
213
213
  key={i}
214
- className="absolute text-[9px] font-mono text-muted-foreground/60 -translate-x-1/2"
214
+ className="absolute text-[9px] font-mono text-muted-foreground -translate-x-1/2"
215
215
  style={{
216
216
  left: `${(tick.ms / totalDurationMs) * 100}%`,
217
217
  top: 5,
@@ -263,7 +263,7 @@ export function TraceTimeline({
263
263
  {formatDuration(span.durationMs || null)}
264
264
  </span>
265
265
  {span.tokens && (
266
- <span className="text-[9px] font-mono text-muted-foreground/60 shrink-0">
266
+ <span className="text-[9px] font-mono text-muted-foreground shrink-0">
267
267
  {span.tokens.input}→{span.tokens.output}
268
268
  </span>
269
269
  )}
@@ -331,7 +331,7 @@ export function TraceTimeline({
331
331
  </span>
332
332
  )}
333
333
  </div>
334
- <div className="text-muted-foreground/60 pt-0.5">
334
+ <div className="text-muted-foreground pt-0.5">
335
335
  Click to {isSelected ? 'deselect' : 'view details'}
336
336
  </div>
337
337
  </div>
@@ -440,8 +440,8 @@ function SpanDetailPanel({
440
440
  return (
441
441
  <div className="p-4 space-y-4">
442
442
  <div className="flex items-center gap-2 mb-1">
443
- <Wrench className="size-4 text-purple-400" />
444
- <span className="text-sm font-mono font-medium text-purple-400">
443
+ <Wrench className="size-4 text-tool" />
444
+ <span className="text-sm font-mono font-medium text-tool">
445
445
  {span.label}
446
446
  </span>
447
447
  </div>
@@ -474,10 +474,10 @@ function SpanDetailPanel({
474
474
  return (
475
475
  <div className="p-4 space-y-2">
476
476
  <div className="flex items-center gap-2 mb-1">
477
- <Brain className="size-4 text-amber-500" />
478
- <span className="text-sm font-medium text-amber-500">Thinking</span>
477
+ <Brain className="size-4 text-warning" />
478
+ <span className="text-sm font-medium text-warning">Thinking</span>
479
479
  </div>
480
- <div className="text-sm text-foreground/80 leading-relaxed whitespace-pre-wrap rounded-md border border-amber-500/20 bg-amber-500/5 p-3">
480
+ <div className="text-sm text-foreground/80 leading-relaxed whitespace-pre-wrap rounded-md border border-warning/20 bg-warning/5 p-3">
481
481
  {span.thinkingText}
482
482
  </div>
483
483
  </div>
@@ -488,8 +488,8 @@ function SpanDetailPanel({
488
488
  return (
489
489
  <div className="p-4 space-y-2">
490
490
  <div className="flex items-center gap-2 mb-1">
491
- <MessageSquare className="size-4 text-emerald-400" />
492
- <span className="text-sm font-medium text-emerald-400">
491
+ <MessageSquare className="size-4 text-success" />
492
+ <span className="text-sm font-medium text-success">
493
493
  Text Response
494
494
  </span>
495
495
  </div>
@@ -504,8 +504,8 @@ function SpanDetailPanel({
504
504
  return (
505
505
  <div className="p-4 space-y-2">
506
506
  <div className="flex items-center gap-2 mb-1">
507
- <AlertCircle className="size-4 text-red-400" />
508
- <span className="text-sm font-medium text-red-400">Error</span>
507
+ <AlertCircle className="size-4 text-danger" />
508
+ <span className="text-sm font-medium text-danger">Error</span>
509
509
  </div>
510
510
  <div className="text-sm text-destructive-foreground font-mono whitespace-pre-wrap rounded-md border border-destructive/30 bg-destructive/10 p-3">
511
511
  {step.error}
@@ -4,7 +4,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
4
4
  import { cn } from '@/lib/utils';
5
5
 
6
6
  const badgeVariants = cva(
7
- 'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
7
+ 'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
8
8
  {
9
9
  variants: {
10
10
  variant: {
@@ -4,7 +4,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
4
4
  import { cn } from '@/lib/utils';
5
5
 
6
6
  const buttonVariants = cva(
7
- "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
7
+ "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
8
8
  {
9
9
  variants: {
10
10
  variant: {
@@ -18,7 +18,7 @@ function ScrollArea({
18
18
  >
19
19
  <ScrollAreaPrimitive.Viewport
20
20
  data-slot="scroll-area-viewport"
21
- className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
21
+ className="focus-visible:ring-ring size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
22
22
  >
23
23
  {children}
24
24
  </ScrollAreaPrimitive.Viewport>
@@ -1,6 +1,21 @@
1
1
  import React from 'react';
2
2
  import { createRoot } from 'react-dom/client';
3
3
  import App from './app';
4
+ import { initializeTheme } from './theme';
4
5
  import './styles.css';
5
6
 
6
- createRoot(document.getElementById('root')!).render(<App />);
7
+ let storage: Storage | undefined;
8
+ try {
9
+ storage = window.localStorage;
10
+ } catch {
11
+ storage = undefined;
12
+ }
13
+
14
+ const initialTheme = initializeTheme({
15
+ root: document.documentElement,
16
+ storage,
17
+ });
18
+
19
+ createRoot(document.getElementById('root')!).render(
20
+ <App initialTheme={initialTheme} storage={storage} />,
21
+ );