Plugin Directory

Changeset 3455209


Ignore:
Timestamp:
02/06/2026 08:24:58 AM (8 weeks ago)
Author:
chatprojects
Message:

Version 1.1.2 - Fixed Elementor conflicts, improved plugin compatibility

Location:
chatprojects/trunk
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • chatprojects/trunk/admin/class-settings.php

    r3453774 r3455209  
    852852        if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] ) ) === 'chatprojects-settings' ) {
    853853            $api_key = get_option('chatprojects_openai_key', '');
    854            
     854
    855855            if (empty($api_key)) {
    856856                ?>
  • chatprojects/trunk/assets/dist/css/admin.css

    r3453774 r3455209  
    1 /**
    2  * ChatProjects - Admin Styles
    3  * Minimal styles for WordPress admin area
    4  */
     1@import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
     2 */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([multiple]),textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}input:where([type=text]):focus,input:where(:not([type])):focus,input:where([type=email]):focus,input:where([type=url]):focus,input:where([type=password]):focus,input:where([type=number]):focus,input:where([type=date]):focus,input:where([type=datetime-local]):focus,input:where([type=month]):focus,input:where([type=search]):focus,input:where([type=tel]):focus,input:where([type=time]):focus,input:where([type=week]):focus,select:where([multiple]):focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}select:where([multiple]),select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}input:where([type=checkbox]),input:where([type=radio]){-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}input:where([type=checkbox]){border-radius:0}input:where([type=radio]){border-radius:100%}input:where([type=checkbox]):focus,input:where([type=radio]):focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:where([type=checkbox]):checked,input:where([type=radio]):checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}input:where([type=checkbox]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){input:where([type=checkbox]):checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}input:where([type=radio]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){input:where([type=radio]):checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}input:where([type=checkbox]):checked:hover,input:where([type=checkbox]):checked:focus,input:where([type=radio]):checked:hover,input:where([type=radio]):checked:focus{border-color:transparent;background-color:currentColor}input:where([type=checkbox]):indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){input:where([type=checkbox]):indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}input:where([type=checkbox]):indeterminate:hover,input:where([type=checkbox]):indeterminate:focus{border-color:transparent;background-color:currentColor}input:where([type=file]){background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}input:where([type=file]):focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root{--chatpr-sidebar-width: 280px;--chatpr-header-height: 64px;--chatpr-input-height: auto;--chatpr-transition-speed: .2s;--chatpr-transition-ease: cubic-bezier(.4, 0, .2, 1)}html{font-feature-settings:"cv11","ss01";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:1rem;line-height:1.5rem;--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}body:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}*:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1));--tw-ring-offset-width: 2px}*:focus-visible:is(.dark *){--tw-ring-offset-color: #0a0a0a}*{scroll-behavior:smooth}::-webkit-scrollbar{width:.5rem}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}:is(.dark *)::-webkit-scrollbar-thumb{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar-thumb:hover{--tw-bg-opacity: 1;background-color:rgb(163 163 163 / var(--tw-bg-opacity, 1))}:is(.dark *)::-webkit-scrollbar-thumb:hover{--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: rgb(17 24 39 / 10%);--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn-primary:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-primary{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.btn-primary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1))}.btn-primary:active{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.btn-primary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.btn-primary:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}.btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn-secondary:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.btn-secondary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.btn-secondary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.btn-secondary:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.\!input{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.\!input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.\!input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.\!input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.\!input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.input{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.textarea::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.textarea::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.textarea:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.textarea:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.textarea:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea{resize:none}.card{border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 2px 8px 0 rgba(0, 0, 0, .05);--tw-shadow-colored: 0 2px 8px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.card:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.toast{display:flex;align-items:flex-start;gap:.75rem;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem;--tw-shadow: 0 8px 32px 0 rgba(0, 0, 0, .12);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.toast:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.tab{display:flex;align-items:center;gap:.5rem;border-radius:.5rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tab:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.tab:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.tab-active{display:flex;align-items:center;gap:.5rem;border-radius:.5rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tab-active:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab-active:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.tab-active:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.tab-active{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab-active:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-bottom-8{bottom:-2rem}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1\/2{left:50%}.left-4{left:1rem}.right-0{right:0}.right-4{right:1rem}.top-20{top:5rem}.top-full{top:100%}.isolate{isolation:isolate}.z-100{z-index:100}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[70\]{z-index:70}.z-\[9999\]{z-index:9999}.col-span-12{grid-column:span 12 / span 12}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.-mr-2{margin-right:-.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-96{max-height:24rem}.max-h-\[100px\]{max-height:100px}.max-h-\[90vh\]{max-height:90vh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-7xl{max-width:80rem}.max-w-\[150px\]{max-width:150px}.max-w-\[70\%\]{max-width:70%}.max-w-\[80\%\]{max-width:80%}.max-w-\[calc\(100vw-60px\)\]{max-width:calc(100vw - 60px)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-2{--tw-translate-y: -.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes slideUp{0%{transform:translateY(10px);opacity:0}to{transform:translateY(0);opacity:1}}.animate-slide-up{animation:slideUp .3s ease-out}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:1rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-neutral-200{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.border-neutral-300{--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.border-primary-200{--tw-border-opacity: 1;border-color:rgb(186 230 253 / var(--tw-border-opacity, 1))}.border-primary-500{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-sidebar-border{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-900\/20{background-color:#1e3a8a33}.bg-dark-hover{--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.bg-error-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-neutral-200{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.bg-neutral-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-primary-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-primary-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-primary-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-sidebar-active{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-sidebar-light{--tw-bg-opacity: 1;background-color:rgb(247 247 248 / var(--tw-bg-opacity, 1))}.bg-success-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary-50{--tw-gradient-from: #f0f9ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 249 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-white{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #fff var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-primary-50{--tw-gradient-to: #f0f9ff var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pr-12{padding-right:3rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-bottom{vertical-align:bottom}.font-mono{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-current{color:currentColor}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-error-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo-500{--tw-text-opacity: 1;color:rgb(99 102 241 / var(--tw-text-opacity, 1))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-neutral-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-neutral-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-primary-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-primary-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-sidebar-text{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-sidebar-textLight{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-sidebar-textMuted{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-success-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-warning-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-large{--tw-shadow: 0 8px 32px 0 rgba(0, 0, 0, .12);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-primary-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.blur{--tw-blur: blur(8px);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)}.invert{--tw-invert: invert(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)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-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,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[a-zA-Z\:_\]{a-z-a--z:}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
     3  Theme: GitHub Dark
     4  Description: Dark theme as seen on github.com
     5  Author: github.com
     6  Maintainer: @Hirse
     7  Updated: 2021-05-15
    58
    6 /* Admin page wrapper */
    7 .chatprojects-admin-wrap {
    8     max-width: 1200px;
    9     margin: 20px auto;
    10     padding: 0 20px;
    11 }
    12 
    13 /* Settings page styling */
    14 .vp-settings-form {
    15     background: #fff;
    16     border: 1px solid #ccd0d4;
    17     padding: 20px;
    18     margin-top: 20px;
    19 }
    20 
    21 .vp-settings-form label {
    22     display: block;
    23     font-weight: 600;
    24     margin-bottom: 5px;
    25 }
    26 
    27 .vp-settings-form input[type="text"],
    28 .vp-settings-form input[type="password"],
    29 .vp-settings-form textarea,
    30 .vp-settings-form select {
    31     width: 100%;
    32     max-width: 400px;
    33 }
    34 
    35 .vp-settings-form .description {
    36     color: #666;
    37     font-style: italic;
    38     margin-top: 5px;
    39 }
    40 
    41 /* Notice styling */
    42 .vp-notice {
    43     padding: 15px;
    44     margin: 15px 0;
    45     border-left: 4px solid #2271b1;
    46     background: #f0f6fc;
    47 }
    48 
    49 .vp-notice.success {
    50     border-color: #00a32a;
    51     background: #d7ffd9;
    52 }
    53 
    54 .vp-notice.error {
    55     border-color: #d63638;
    56     background: #ffebe8;
    57 }
    58 
    59 /* Free version upgrade prompt */
    60 .vp-upgrade-prompt {
    61     background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    62     color: white;
    63     padding: 20px;
    64     border-radius: 8px;
    65     margin: 20px 0;
    66     text-align: center;
    67 }
    68 
    69 .vp-upgrade-prompt h3 {
    70     color: white;
    71     margin-top: 0;
    72 }
    73 
    74 .vp-upgrade-prompt .button {
    75     background: white;
    76     color: #667eea;
    77     border: none;
    78     font-weight: 600;
    79 }
    80 
    81 .vp-upgrade-prompt .button:hover {
    82     background: #f0f0f0;
    83     color: #764ba2;
    84 }
     9  Outdated base version: https://github.com/primer/github-syntax-dark
     10  Current colors taken from GitHub's CSS
     11*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}.chatpr-chat-message{display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.chatpr-chat-message-user{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.chatpr-chat-message-user:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-chat-message-assistant{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.chatpr-chat-message-assistant:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-chat-input-wrapper{position:relative;display:flex;align-items:flex-end;gap:.5rem;border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem}.chatpr-chat-input-wrapper:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-chat-input{max-height:200px;min-height:44px;flex:1 1 0%;resize:none;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.chatpr-chat-input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.chatpr-chat-input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-chat-input:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-attachment-preview{position:relative;display:inline-flex;align-items:center}.chatpr-attachment-preview-image{height:4rem;width:4rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));-o-object-fit:cover;object-fit:cover}.chatpr-attachment-preview-image:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-attachment-preview-document{display:flex;height:4rem;width:4rem;flex-direction:column;align-items:center;justify-content:center;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.chatpr-attachment-preview-document:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-attachment-preview-document-icon{height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.chatpr-attachment-preview-document-icon:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-attachment-preview-document-ext{margin-top:.125rem;font-size:10px;font-weight:600;text-transform:uppercase;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.chatpr-attachment-preview-document-ext:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-attachment-remove{position:absolute;top:-.375rem;right:-.375rem;display:flex;height:1.25rem;width:1.25rem;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-attachment-remove:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.chatpr-attachment-list{margin-bottom:.5rem;display:flex;flex-wrap:wrap;gap:.5rem}.chatpr-drop-overlay{pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));background-color:#0ea5e91a}.chatpr-drop-overlay-text{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.chatpr-drop-overlay-text:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.chatpr-attach-btn{cursor:pointer;border-radius:.5rem;padding:.5rem;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-attach-btn:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.chatpr-sidebar{position:fixed;top:0;left:0;z-index:40;display:flex;height:100%;width:280px;flex-direction:column;border-right-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(247 247 248 / var(--tw-bg-opacity, 1))}.chatpr-sidebar:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.chatpr-sidebar-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:1rem}.chatpr-sidebar-header:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-sidebar-content{flex:1 1 0%;overflow-y:auto}.chatpr-sidebar-footer{border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:1rem}.chatpr-sidebar-footer:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-main-content{position:relative;margin-left:280px;height:100vh;overflow:hidden;--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.chatpr-main-content:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.chatpr-main-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem 1.5rem}.chatpr-main-header:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-main-body{flex:1 1 0%;overflow-y:auto}.chatpr-tab-content{display:none;position:absolute;top:0;left:0;right:0;bottom:0;overflow-y:auto;padding:2rem}.chatpr-tab-content.active{display:block}.chatpr-upload-zone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));padding:2rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-upload-zone:hover{--tw-border-opacity: 1;border-color:rgb(56 189 248 / var(--tw-border-opacity, 1));background-color:#f0f9ff80}.chatpr-upload-zone:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-upload-zone:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(2 132 199 / var(--tw-border-opacity, 1));background-color:#0c4a6e1a}.chatpr-upload-zone-active{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(240 249 255 / var(--tw-bg-opacity, 1))}.chatpr-upload-zone-active:is(.dark *){--tw-border-opacity: 1;border-color:rgb(2 132 199 / var(--tw-border-opacity, 1));background-color:#0c4a6e33}.chatpr-code-block{position:relative;margin-top:1rem;margin-bottom:1rem;overflow:hidden;border-radius:1rem;--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-shadow: 0 4px 16px 0 rgba(0, 0, 0, .08);--tw-shadow-colored: 0 4px 16px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.chatpr-code-block:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.chatpr-code-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1));padding:.5rem 1rem}.chatpr-code-header:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.chatpr-code-language{font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.025em;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-code-copy{display:flex;align-items:center;gap:.375rem;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-code-copy:hover{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.chatpr-code-copy-success{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.dark .chatpr-code-copy-success{color:#10b981;background-color:#10b9811a}.chatpr-code-content{overflow-x:auto;padding:0}.chatpr-code-content pre{margin:0;padding:1rem}.chatpr-code-content code{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.hljs{background-color:transparent}.chatpr-table-wrapper{margin-top:1rem;margin-bottom:1rem;overflow-x:auto;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.chatpr-table-wrapper:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-table-wrapper table{min-width:100%}.chatpr-table-wrapper table>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse));--tw-divide-opacity: 1;border-color:rgb(229 229 229 / var(--tw-divide-opacity, 1))}.chatpr-table-wrapper table:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(64 64 64 / var(--tw-divide-opacity, 1))}.chatpr-table-wrapper thead{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.chatpr-table-wrapper thead:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-table-wrapper th{padding:.75rem 1rem;text-align:left;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper th:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper td{padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper td:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper tbody tr{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-table-wrapper tbody tr:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.chatpr-table-wrapper tbody tr:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}@media (max-width: 768px){.chatpr-sidebar{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-sidebar-open{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chatpr-main-content{margin-left:0}}@media print{.chatpr-sidebar,.chatpr-main-header,.chatpr-chat-input-wrapper{display:none}.chatpr-main-content{margin-left:0}}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}.first\:rounded-t-lg:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.last\:rounded-b-lg:last-child{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.last\:border-0:last-child{border-width:0px}.hover\:border-blue-400:hover{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-100:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-600:hover{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-700:hover{--tw-bg-opacity: 1;background-color:rgb(3 105 161 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-sidebar-hover:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-neutral-600:hover{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.hover\:text-neutral-700:hover{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.hover\:text-primary-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.hover\:text-primary-700:hover{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.hover\:text-purple-700:hover{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-sidebar-text:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-primary-500:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-primary-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}.group:hover .group-hover\:opacity-100{opacity:1}.dark\:divide-dark-border:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(64 64 64 / var(--tw-divide-opacity, 1))}.dark\:border-amber-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(146 64 14 / var(--tw-border-opacity, 1))}.dark\:border-dark-border:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-green-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.dark\:border-neutral-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.dark\:border-neutral-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-primary-900\/30:is(.dark *){border-color:#0c4a6e4d}.dark\:border-red-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:border-transparent:is(.dark *){border-color:transparent}.dark\:bg-amber-900\/20:is(.dark *){background-color:#78350f33}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1e3a8a4d}.dark\:bg-dark-bg:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-elevated:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-surface:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-green-900\/20:is(.dark *){background-color:#14532d33}.dark\:bg-green-900\/30:is(.dark *){background-color:#14532d4d}.dark\:bg-neutral-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:bg-orange-900\/30:is(.dark *){background-color:#7c2d124d}.dark\:bg-primary-900\/20:is(.dark *){background-color:#0c4a6e33}.dark\:bg-purple-900\/30:is(.dark *){background-color:#581c874d}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-opacity-75:is(.dark *){--tw-bg-opacity: .75}.dark\:from-dark-bg:is(.dark *){--tw-gradient-from: #0a0a0a var(--tw-gradient-from-position);--tw-gradient-to: rgb(10 10 10 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:via-dark-surface:is(.dark *){--tw-gradient-to: rgb(23 23 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #171717 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\:to-dark-bg:is(.dark *){--tw-gradient-to: #0a0a0a var(--tw-gradient-to-position)}.dark\:text-amber-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-300:is(.dark *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-green-300:is(.dark *){--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-neutral-100:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.dark\:text-neutral-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:text-neutral-400:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.dark\:text-neutral-500:is(.dark *){--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:text-purple-300:is(.dark *){--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:placeholder-neutral-500:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-neutral-500:is(.dark *)::placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:hover\:border-blue-500:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.dark\:hover\:border-gray-600:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:hover\:border-transparent:hover:is(.dark *){border-color:transparent}.dark\:hover\:bg-dark-bg:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-dark-elevated:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-dark-hover:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-800\/50:hover:is(.dark *){background-color:#1f293780}.dark\:hover\:bg-neutral-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-red-900\/20:hover:is(.dark *){background-color:#7f1d1d33}.dark\:hover\:bg-red-900\/30:hover:is(.dark *){background-color:#7f1d1d4d}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:hover\:text-neutral-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:hover\:text-primary-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.dark\:hover\:text-primary-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:hover\:text-red-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity, 1))}.dark\:focus\:ring-offset-dark-bg:focus:is(.dark *){--tw-ring-offset-color: #0a0a0a}@media (min-width: 640px){.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-md{max-width:28rem}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:rounded-2xl{border-radius:1.5rem}.sm\:p-0{padding:0}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:align-middle{vertical-align:middle}}@media (min-width: 768px){.md\:col-span-3{grid-column:span 3 / span 3}.md\:col-span-9{grid-column:span 9 / span 9}.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:relative{position:relative}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:p-8{padding:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}
  • chatprojects/trunk/assets/dist/css/main.css

    r3453774 r3455209  
    1 @import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com
    2  */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root{--vp-sidebar-width: 280px;--vp-header-height: 64px;--vp-input-height: auto;--vp-transition-speed: .2s;--vp-transition-ease: cubic-bezier(.4, 0, .2, 1)}html{font-feature-settings:"cv11","ss01";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:1rem;line-height:1.5rem;--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}body:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}*:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1));--tw-ring-offset-width: 2px}*:focus-visible:is(.dark *){--tw-ring-offset-color: #0a0a0a}*{scroll-behavior:smooth}::-webkit-scrollbar{width:.5rem}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}:is(.dark *)::-webkit-scrollbar-thumb{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar-thumb:hover{--tw-bg-opacity: 1;background-color:rgb(163 163 163 / var(--tw-bg-opacity, 1))}:is(.dark *)::-webkit-scrollbar-thumb:hover{--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.\!container{width:100%!important}.container{width:100%}@media (min-width: 640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width: 768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width: 1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width: 1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width: 1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: rgb(17 24 39 / 10%);--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn-primary:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-primary{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.btn-primary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1))}.btn-primary:active{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.btn-primary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.btn-primary:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}.btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn-secondary:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.btn-secondary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.btn-secondary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.btn-secondary:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.\!input{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.\!input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.\!input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.\!input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.\!input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.input{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.textarea::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.textarea::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.textarea:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.textarea:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.textarea:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea{resize:none}.card{border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 2px 8px 0 rgba(0, 0, 0, .05);--tw-shadow-colored: 0 2px 8px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.card:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.toast{display:flex;align-items:flex-start;gap:.75rem;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem;--tw-shadow: 0 8px 32px 0 rgba(0, 0, 0, .12);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.toast:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.tab{display:flex;align-items:center;gap:.5rem;border-radius:.5rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tab:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.tab:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.tab-active{display:flex;align-items:center;gap:.5rem;border-radius:.5rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tab-active:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab-active:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.tab-active:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.tab-active{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab-active:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-bottom-8{bottom:-2rem}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-3{left:.75rem}.left-4{left:1rem}.right-0{right:0}.right-4{right:1rem}.top-1\/2{top:50%}.top-20{top:5rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-100{z-index:100}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[9999\]{z-index:9999}.col-span-12{grid-column:span 12 / span 12}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-96{max-height:24rem}.max-h-\[150px\]{max-height:150px}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.max-w-20{max-width:5rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-\[80\%\]{max-width:80%}.max-w-\[85\%\]{max-width:85%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes slideUp{0%{transform:translateY(10px);opacity:0}to{transform:translateY(0);opacity:1}}.animate-slide-up{animation:slideUp .3s ease-out}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.divide-neutral-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 229 229 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:1rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-neutral-200{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.border-neutral-300{--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.border-primary-200{--tw-border-opacity: 1;border-color:rgb(186 230 253 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-sidebar-border{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-900\/20{background-color:#1e3a8a33}.bg-dark-hover{--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.bg-error-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-neutral-200{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.bg-neutral-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-neutral-700{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-primary-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-primary-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-primary-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-sidebar-active{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-sidebar-light{--tw-bg-opacity: 1;background-color:rgb(247 247 248 / var(--tw-bg-opacity, 1))}.bg-success-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/20{background-color:#fff3}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary-50{--tw-gradient-from: #f0f9ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 249 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-white{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #fff var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-primary-50{--tw-gradient-to: #f0f9ff var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pl-11{padding-left:2.75rem}.pr-4{padding-right:1rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-bottom{vertical-align:bottom}.font-mono{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-error-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-neutral-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-neutral-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-primary-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-primary-500{--tw-text-opacity: 1;color:rgb(14 165 233 / var(--tw-text-opacity, 1))}.text-primary-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-sidebar-text{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-sidebar-textLight{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-sidebar-textMuted{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-success-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-warning-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-large{--tw-shadow: 0 8px 32px 0 rgba(0, 0, 0, .12);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-primary-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.ring-offset-2{--tw-ring-offset-width: 2px}.blur{--tw-blur: blur(8px);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)}.invert{--tw-invert: invert(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)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-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,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[a-zA-Z\:_\]{a-z-a--z:}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
     1@import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
     2 */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([multiple]),textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}input:where([type=text]):focus,input:where(:not([type])):focus,input:where([type=email]):focus,input:where([type=url]):focus,input:where([type=password]):focus,input:where([type=number]):focus,input:where([type=date]):focus,input:where([type=datetime-local]):focus,input:where([type=month]):focus,input:where([type=search]):focus,input:where([type=tel]):focus,input:where([type=time]):focus,input:where([type=week]):focus,select:where([multiple]):focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}select:where([multiple]),select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}input:where([type=checkbox]),input:where([type=radio]){-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}input:where([type=checkbox]){border-radius:0}input:where([type=radio]){border-radius:100%}input:where([type=checkbox]):focus,input:where([type=radio]):focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:where([type=checkbox]):checked,input:where([type=radio]):checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}input:where([type=checkbox]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){input:where([type=checkbox]):checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}input:where([type=radio]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){input:where([type=radio]):checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}input:where([type=checkbox]):checked:hover,input:where([type=checkbox]):checked:focus,input:where([type=radio]):checked:hover,input:where([type=radio]):checked:focus{border-color:transparent;background-color:currentColor}input:where([type=checkbox]):indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){input:where([type=checkbox]):indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}input:where([type=checkbox]):indeterminate:hover,input:where([type=checkbox]):indeterminate:focus{border-color:transparent;background-color:currentColor}input:where([type=file]){background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}input:where([type=file]):focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root{--chatpr-sidebar-width: 280px;--chatpr-header-height: 64px;--chatpr-input-height: auto;--chatpr-transition-speed: .2s;--chatpr-transition-ease: cubic-bezier(.4, 0, .2, 1)}html{font-feature-settings:"cv11","ss01";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:1rem;line-height:1.5rem;--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}body:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}*:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1));--tw-ring-offset-width: 2px}*:focus-visible:is(.dark *){--tw-ring-offset-color: #0a0a0a}*{scroll-behavior:smooth}::-webkit-scrollbar{width:.5rem}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}:is(.dark *)::-webkit-scrollbar-thumb{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar-thumb:hover{--tw-bg-opacity: 1;background-color:rgb(163 163 163 / var(--tw-bg-opacity, 1))}:is(.dark *)::-webkit-scrollbar-thumb:hover{--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: rgb(17 24 39 / 10%);--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn-primary:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-primary{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.btn-primary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1))}.btn-primary:active{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.btn-primary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.btn-primary:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}.btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn-secondary:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.btn-secondary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.btn-secondary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.btn-secondary:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.\!input{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.\!input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.\!input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.\!input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.\!input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.input{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea{display:block;width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.textarea::-moz-placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.textarea::placeholder{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.textarea:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.textarea:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.textarea:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.textarea{resize:none}.card{border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 2px 8px 0 rgba(0, 0, 0, .05);--tw-shadow-colored: 0 2px 8px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.card:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.toast{display:flex;align-items:flex-start;gap:.75rem;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem;--tw-shadow: 0 8px 32px 0 rgba(0, 0, 0, .12);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.toast:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.tab{display:flex;align-items:center;gap:.5rem;border-radius:.5rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tab:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.tab:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.tab-active{display:flex;align-items:center;gap:.5rem;border-radius:.5rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tab-active:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab-active:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.tab-active:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.tab-active{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.tab-active:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-bottom-8{bottom:-2rem}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1\/2{left:50%}.left-4{left:1rem}.right-0{right:0}.right-4{right:1rem}.top-20{top:5rem}.top-full{top:100%}.isolate{isolation:isolate}.z-100{z-index:100}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[70\]{z-index:70}.z-\[9999\]{z-index:9999}.col-span-12{grid-column:span 12 / span 12}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.-mr-2{margin-right:-.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-96{max-height:24rem}.max-h-\[100px\]{max-height:100px}.max-h-\[90vh\]{max-height:90vh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-7xl{max-width:80rem}.max-w-\[150px\]{max-width:150px}.max-w-\[70\%\]{max-width:70%}.max-w-\[80\%\]{max-width:80%}.max-w-\[calc\(100vw-60px\)\]{max-width:calc(100vw - 60px)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-2{--tw-translate-y: -.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes slideUp{0%{transform:translateY(10px);opacity:0}to{transform:translateY(0);opacity:1}}.animate-slide-up{animation:slideUp .3s ease-out}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:1rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-neutral-200{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.border-neutral-300{--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.border-primary-200{--tw-border-opacity: 1;border-color:rgb(186 230 253 / var(--tw-border-opacity, 1))}.border-primary-500{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-sidebar-border{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-900\/20{background-color:#1e3a8a33}.bg-dark-hover{--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.bg-error-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-neutral-200{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.bg-neutral-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-primary-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-primary-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-primary-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-sidebar-active{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-sidebar-light{--tw-bg-opacity: 1;background-color:rgb(247 247 248 / var(--tw-bg-opacity, 1))}.bg-success-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary-50{--tw-gradient-from: #f0f9ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 249 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-white{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #fff var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-primary-50{--tw-gradient-to: #f0f9ff var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pr-12{padding-right:3rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-bottom{vertical-align:bottom}.font-mono{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-current{color:currentColor}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-error-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo-500{--tw-text-opacity: 1;color:rgb(99 102 241 / var(--tw-text-opacity, 1))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-neutral-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-neutral-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-primary-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-primary-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-sidebar-text{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-sidebar-textLight{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-sidebar-textMuted{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-success-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-warning-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-large{--tw-shadow: 0 8px 32px 0 rgba(0, 0, 0, .12);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-primary-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.blur{--tw-blur: blur(8px);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)}.invert{--tw-invert: invert(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)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-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,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[a-zA-Z\:_\]{a-z-a--z:}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
    33  Theme: GitHub Dark
    44  Description: Dark theme as seen on github.com
     
    99  Outdated base version: https://github.com/primer/github-syntax-dark
    1010  Current colors taken from GitHub's CSS
    11 */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}.vp-chat-message{display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.vp-chat-message-user{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.vp-chat-message-user:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.vp-chat-message-assistant{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.vp-chat-message-assistant:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.vp-chat-input-wrapper{position:relative;display:flex;align-items:flex-end;gap:.5rem;border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem}.vp-chat-input-wrapper:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.vp-chat-input{max-height:200px;min-height:44px;flex:1 1 0%;resize:none;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.vp-chat-input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.vp-chat-input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.vp-chat-input:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.vp-attachment-preview{position:relative;display:inline-flex;align-items:center}.vp-attachment-preview-image{height:4rem;width:4rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));-o-object-fit:cover;object-fit:cover}.vp-attachment-preview-image:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.vp-attachment-preview-document{display:flex;height:4rem;width:4rem;flex-direction:column;align-items:center;justify-content:center;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.vp-attachment-preview-document:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.vp-attachment-preview-document-icon{height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.vp-attachment-preview-document-icon:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.vp-attachment-preview-document-ext{margin-top:.125rem;font-size:10px;font-weight:600;text-transform:uppercase;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.vp-attachment-preview-document-ext:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.vp-attachment-remove{position:absolute;top:-.375rem;right:-.375rem;display:flex;height:1.25rem;width:1.25rem;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vp-attachment-remove:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.vp-attachment-list{margin-bottom:.5rem;display:flex;flex-wrap:wrap;gap:.5rem}.vp-drop-overlay{pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));background-color:#0ea5e91a}.vp-drop-overlay-text{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.vp-drop-overlay-text:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.vp-attach-btn{cursor:pointer;border-radius:.5rem;padding:.5rem;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vp-attach-btn:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.vp-attach-btn:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.vp-attach-btn:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.vp-attach-btn:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.vp-attach-btn:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.vp-sidebar{position:fixed;top:0;left:0;z-index:40;display:flex;height:100%;width:280px;flex-direction:column;border-right-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(247 247 248 / var(--tw-bg-opacity, 1))}.vp-sidebar:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.vp-sidebar-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:1rem}.vp-sidebar-header:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.vp-sidebar-content{flex:1 1 0%;overflow-y:auto}.vp-sidebar-footer{border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:1rem}.vp-sidebar-footer:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.vp-main-content{position:relative;margin-left:280px;height:100vh;overflow:hidden;--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.vp-main-content:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.vp-main-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem 1.5rem}.vp-main-header:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.vp-main-body{flex:1 1 0%;overflow-y:auto}.vp-tab-content{display:none;position:absolute;top:0;left:0;right:0;bottom:0;overflow-y:auto;padding:2rem}.vp-tab-content.active{display:block}.vp-upload-zone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));padding:2rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vp-upload-zone:hover{--tw-border-opacity: 1;border-color:rgb(56 189 248 / var(--tw-border-opacity, 1));background-color:#f0f9ff80}.vp-upload-zone:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.vp-upload-zone:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(2 132 199 / var(--tw-border-opacity, 1));background-color:#0c4a6e1a}.vp-upload-zone-active{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(240 249 255 / var(--tw-bg-opacity, 1))}.vp-upload-zone-active:is(.dark *){--tw-border-opacity: 1;border-color:rgb(2 132 199 / var(--tw-border-opacity, 1));background-color:#0c4a6e33}.vp-code-block{position:relative;margin-top:1rem;margin-bottom:1rem;overflow:hidden;border-radius:1rem;--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-shadow: 0 4px 16px 0 rgba(0, 0, 0, .08);--tw-shadow-colored: 0 4px 16px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.vp-code-block:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.vp-code-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1));padding:.5rem 1rem}.vp-code-header:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.vp-code-language{font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.025em;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.vp-code-copy{display:flex;align-items:center;gap:.375rem;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vp-code-copy:hover{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.vp-code-copy-success{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.dark .vp-code-copy-success{color:#10b981;background-color:#10b9811a}.vp-code-content{overflow-x:auto;padding:0}.vp-code-content pre{margin:0;padding:1rem}.vp-code-content code{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.hljs{background-color:transparent}.vp-table-wrapper{margin-top:1rem;margin-bottom:1rem;overflow-x:auto;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.vp-table-wrapper:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.vp-table-wrapper table{min-width:100%}.vp-table-wrapper table>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse));--tw-divide-opacity: 1;border-color:rgb(229 229 229 / var(--tw-divide-opacity, 1))}.vp-table-wrapper table:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(64 64 64 / var(--tw-divide-opacity, 1))}.vp-table-wrapper thead{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.vp-table-wrapper thead:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.vp-table-wrapper th{padding:.75rem 1rem;text-align:left;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.vp-table-wrapper th:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.vp-table-wrapper td{padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.vp-table-wrapper td:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.vp-table-wrapper tbody tr{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vp-table-wrapper tbody tr:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.vp-table-wrapper tbody tr:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}@media (max-width: 768px){.vp-sidebar{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vp-sidebar-open{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.vp-main-content{margin-left:0}}@media print{.vp-sidebar,.vp-main-header,.vp-chat-input-wrapper{display:none}.vp-main-content{margin-left:0}}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}.first\:rounded-t-lg:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.last\:rounded-b-lg:last-child{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.last\:border-0:last-child{border-width:0px}.hover\:border-blue-400:hover{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-100:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-800:hover{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-600:hover{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-700:hover{--tw-bg-opacity: 1;background-color:rgb(3 105 161 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-sidebar-hover:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-900:hover{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.hover\:text-neutral-600:hover{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.hover\:text-neutral-900:hover{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.hover\:text-primary-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.hover\:text-primary-700:hover{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-sidebar-text:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-primary-500:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-primary-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}.group:hover .group-hover\:opacity-100{opacity:1}.dark\:divide-dark-border:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(64 64 64 / var(--tw-divide-opacity, 1))}.dark\:border-amber-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(146 64 14 / var(--tw-border-opacity, 1))}.dark\:border-dark-border:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-green-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.dark\:border-neutral-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.dark\:border-neutral-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-primary-900\/30:is(.dark *){border-color:#0c4a6e4d}.dark\:border-red-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:bg-amber-900\/20:is(.dark *){background-color:#78350f33}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1e3a8a4d}.dark\:bg-dark-bg:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-elevated:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-surface:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-green-900\/20:is(.dark *){background-color:#14532d33}.dark\:bg-green-900\/30:is(.dark *){background-color:#14532d4d}.dark\:bg-neutral-600:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.dark\:bg-neutral-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:bg-neutral-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:bg-neutral-900\/30:is(.dark *){background-color:#1717174d}.dark\:bg-orange-900\/30:is(.dark *){background-color:#7c2d124d}.dark\:bg-primary-900\/20:is(.dark *){background-color:#0c4a6e33}.dark\:bg-primary-900\/30:is(.dark *){background-color:#0c4a6e4d}.dark\:bg-purple-900\/30:is(.dark *){background-color:#581c874d}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-opacity-75:is(.dark *){--tw-bg-opacity: .75}.dark\:from-dark-bg:is(.dark *){--tw-gradient-from: #0a0a0a var(--tw-gradient-from-position);--tw-gradient-to: rgb(10 10 10 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:via-dark-surface:is(.dark *){--tw-gradient-to: rgb(23 23 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #171717 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\:to-dark-bg:is(.dark *){--tw-gradient-to: #0a0a0a var(--tw-gradient-to-position)}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-300:is(.dark *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-green-300:is(.dark *){--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-neutral-100:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.dark\:text-neutral-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:text-neutral-400:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.dark\:text-neutral-500:is(.dark *){--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:text-purple-300:is(.dark *){--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:placeholder-neutral-400:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-neutral-400:is(.dark *)::placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-neutral-500:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-neutral-500:is(.dark *)::placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:hover\:border-blue-500:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.dark\:hover\:border-gray-600:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-blue-900\/20:hover:is(.dark *){background-color:#1e3a8a33}.dark\:hover\:bg-dark-bg:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-dark-elevated:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-dark-hover:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-800\/50:hover:is(.dark *){background-color:#1f293780}.dark\:hover\:bg-neutral-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-neutral-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-red-900\/20:hover:is(.dark *){background-color:#7f1d1d33}.dark\:hover\:bg-red-900\/30:hover:is(.dark *){background-color:#7f1d1d4d}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:hover\:text-neutral-100:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.dark\:hover\:text-neutral-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:hover\:text-primary-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.dark\:hover\:text-primary-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:hover\:text-red-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity, 1))}.dark\:focus\:ring-offset-dark-bg:focus:is(.dark *){--tw-ring-offset-color: #0a0a0a}@media (min-width: 640px){.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-md{max-width:28rem}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:rounded-2xl{border-radius:1.5rem}.sm\:p-0{padding:0}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:align-middle{vertical-align:middle}}@media (min-width: 768px){.md\:col-span-3{grid-column:span 3 / span 3}.md\:col-span-9{grid-column:span 9 / span 9}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:relative{position:relative}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:p-8{padding:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}
    12 
    13 
    14 /* Disabled Nav Items - Pro Features */
    15 .vp-nav-item.disabled {
    16     opacity: 0.4;
    17     cursor: not-allowed;
    18 }
    19 
    20 .vp-nav-item.disabled:hover {
    21     background: transparent;
    22 }
    23 
    24 /* Pro Badge Tooltip - Shows on Hover */
    25 .vp-nav-item.vp-pro-badge {
    26     position: relative;
    27     pointer-events: auto;
    28 }
    29 
    30 .vp-nav-item.vp-pro-badge::after {
    31     content: 'Pro';
    32     position: absolute;
    33     bottom: -20px;
    34     left: 50%;
    35     transform: translateX(-50%);
    36     background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    37     color: white;
    38     font-size: 9px;
    39     font-weight: 600;
    40     padding: 2px 6px;
    41     border-radius: 4px;
    42     opacity: 0;
    43     transition: opacity 0.2s;
    44     pointer-events: none;
    45     white-space: nowrap;
    46     z-index: 10;
    47 }
    48 
    49 .vp-nav-item.vp-pro-badge:hover::after {
    50     opacity: 1;
    51 }
     11*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}.chatpr-chat-message{display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.chatpr-chat-message-user{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.chatpr-chat-message-user:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-chat-message-assistant{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));display:flex;gap:.75rem;border-radius:.5rem;padding:1rem}.chatpr-chat-message-assistant:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-chat-input-wrapper{position:relative;display:flex;align-items:flex-end;gap:.5rem;border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem}.chatpr-chat-input-wrapper:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-chat-input{max-height:200px;min-height:44px;flex:1 1 0%;resize:none;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.chatpr-chat-input:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.chatpr-chat-input:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-chat-input:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-attachment-preview{position:relative;display:inline-flex;align-items:center}.chatpr-attachment-preview-image{height:4rem;width:4rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));-o-object-fit:cover;object-fit:cover}.chatpr-attachment-preview-image:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-attachment-preview-document{display:flex;height:4rem;width:4rem;flex-direction:column;align-items:center;justify-content:center;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.chatpr-attachment-preview-document:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-attachment-preview-document-icon{height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.chatpr-attachment-preview-document-icon:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-attachment-preview-document-ext{margin-top:.125rem;font-size:10px;font-weight:600;text-transform:uppercase;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.chatpr-attachment-preview-document-ext:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-attachment-remove{position:absolute;top:-.375rem;right:-.375rem;display:flex;height:1.25rem;width:1.25rem;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-attachment-remove:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.chatpr-attachment-list{margin-bottom:.5rem;display:flex;flex-wrap:wrap;gap:.5rem}.chatpr-drop-overlay{pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));background-color:#0ea5e91a}.chatpr-drop-overlay-text{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.chatpr-drop-overlay-text:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.chatpr-attach-btn{cursor:pointer;border-radius:.5rem;padding:.5rem;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-attach-btn:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.chatpr-attach-btn:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.chatpr-sidebar{position:fixed;top:0;left:0;z-index:40;display:flex;height:100%;width:280px;flex-direction:column;border-right-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(247 247 248 / var(--tw-bg-opacity, 1))}.chatpr-sidebar:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.chatpr-sidebar-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:1rem}.chatpr-sidebar-header:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-sidebar-content{flex:1 1 0%;overflow-y:auto}.chatpr-sidebar-footer{border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:1rem}.chatpr-sidebar-footer:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-main-content{position:relative;margin-left:280px;height:100vh;overflow:hidden;--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.chatpr-main-content:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.chatpr-main-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem 1.5rem}.chatpr-main-header:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.chatpr-main-body{flex:1 1 0%;overflow-y:auto}.chatpr-tab-content{display:none;position:absolute;top:0;left:0;right:0;bottom:0;overflow-y:auto;padding:2rem}.chatpr-tab-content.active{display:block}.chatpr-upload-zone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1));padding:2rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-upload-zone:hover{--tw-border-opacity: 1;border-color:rgb(56 189 248 / var(--tw-border-opacity, 1));background-color:#f0f9ff80}.chatpr-upload-zone:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-upload-zone:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(2 132 199 / var(--tw-border-opacity, 1));background-color:#0c4a6e1a}.chatpr-upload-zone-active{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(240 249 255 / var(--tw-bg-opacity, 1))}.chatpr-upload-zone-active:is(.dark *){--tw-border-opacity: 1;border-color:rgb(2 132 199 / var(--tw-border-opacity, 1));background-color:#0c4a6e33}.chatpr-code-block{position:relative;margin-top:1rem;margin-bottom:1rem;overflow:hidden;border-radius:1rem;--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1));--tw-shadow: 0 4px 16px 0 rgba(0, 0, 0, .08);--tw-shadow-colored: 0 4px 16px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.chatpr-code-block:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.chatpr-code-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1));padding:.5rem 1rem}.chatpr-code-header:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.chatpr-code-language{font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.025em;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-code-copy{display:flex;align-items:center;gap:.375rem;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-code-copy:hover{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.chatpr-code-copy-success{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.dark .chatpr-code-copy-success{color:#10b981;background-color:#10b9811a}.chatpr-code-content{overflow-x:auto;padding:0}.chatpr-code-content pre{margin:0;padding:1rem}.chatpr-code-content code{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.hljs{background-color:transparent}.chatpr-table-wrapper{margin-top:1rem;margin-bottom:1rem;overflow-x:auto;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.chatpr-table-wrapper:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.chatpr-table-wrapper table{min-width:100%}.chatpr-table-wrapper table>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse));--tw-divide-opacity: 1;border-color:rgb(229 229 229 / var(--tw-divide-opacity, 1))}.chatpr-table-wrapper table:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(64 64 64 / var(--tw-divide-opacity, 1))}.chatpr-table-wrapper thead{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.chatpr-table-wrapper thead:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.chatpr-table-wrapper th{padding:.75rem 1rem;text-align:left;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper th:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper td{padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper td:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.chatpr-table-wrapper tbody tr{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-table-wrapper tbody tr:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.chatpr-table-wrapper tbody tr:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}@media (max-width: 768px){.chatpr-sidebar{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chatpr-sidebar-open{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chatpr-main-content{margin-left:0}}@media print{.chatpr-sidebar,.chatpr-main-header,.chatpr-chat-input-wrapper{display:none}.chatpr-main-content{margin-left:0}}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}.first\:rounded-t-lg:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.last\:rounded-b-lg:last-child{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.last\:border-0:last-child{border-width:0px}.hover\:border-blue-400:hover{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-100:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-600:hover{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-700:hover{--tw-bg-opacity: 1;background-color:rgb(3 105 161 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-sidebar-hover:hover{--tw-bg-opacity: 1;background-color:rgb(235 235 235 / var(--tw-bg-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-neutral-600:hover{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.hover\:text-neutral-700:hover{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.hover\:text-primary-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.hover\:text-primary-700:hover{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.hover\:text-purple-700:hover{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-sidebar-text:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-primary-500:focus{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-primary-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}.group:hover .group-hover\:opacity-100{opacity:1}.dark\:divide-dark-border:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(64 64 64 / var(--tw-divide-opacity, 1))}.dark\:border-amber-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(146 64 14 / var(--tw-border-opacity, 1))}.dark\:border-dark-border:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-green-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.dark\:border-neutral-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.dark\:border-neutral-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-primary-900\/30:is(.dark *){border-color:#0c4a6e4d}.dark\:border-red-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:border-transparent:is(.dark *){border-color:transparent}.dark\:bg-amber-900\/20:is(.dark *){background-color:#78350f33}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1e3a8a4d}.dark\:bg-dark-bg:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-elevated:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.dark\:bg-dark-surface:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-green-900\/20:is(.dark *){background-color:#14532d33}.dark\:bg-green-900\/30:is(.dark *){background-color:#14532d4d}.dark\:bg-neutral-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:bg-orange-900\/30:is(.dark *){background-color:#7c2d124d}.dark\:bg-primary-900\/20:is(.dark *){background-color:#0c4a6e33}.dark\:bg-purple-900\/30:is(.dark *){background-color:#581c874d}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-opacity-75:is(.dark *){--tw-bg-opacity: .75}.dark\:from-dark-bg:is(.dark *){--tw-gradient-from: #0a0a0a var(--tw-gradient-from-position);--tw-gradient-to: rgb(10 10 10 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:via-dark-surface:is(.dark *){--tw-gradient-to: rgb(23 23 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #171717 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\:to-dark-bg:is(.dark *){--tw-gradient-to: #0a0a0a var(--tw-gradient-to-position)}.dark\:text-amber-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-300:is(.dark *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-green-300:is(.dark *){--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-neutral-100:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.dark\:text-neutral-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:text-neutral-400:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.dark\:text-neutral-500:is(.dark *){--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:text-purple-300:is(.dark *){--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:placeholder-neutral-500:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-neutral-500:is(.dark *)::placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:hover\:border-blue-500:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.dark\:hover\:border-gray-600:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:hover\:border-transparent:hover:is(.dark *){border-color:transparent}.dark\:hover\:bg-dark-bg:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-dark-elevated:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-dark-hover:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(42 42 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-800\/50:hover:is(.dark *){background-color:#1f293780}.dark\:hover\:bg-neutral-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-red-900\/20:hover:is(.dark *){background-color:#7f1d1d33}.dark\:hover\:bg-red-900\/30:hover:is(.dark *){background-color:#7f1d1d4d}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:hover\:text-neutral-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:hover\:text-primary-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.dark\:hover\:text-primary-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:hover\:text-red-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity, 1))}.dark\:focus\:ring-offset-dark-bg:focus:is(.dark *){--tw-ring-offset-color: #0a0a0a}@media (min-width: 640px){.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-md{max-width:28rem}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:rounded-2xl{border-radius:1.5rem}.sm\:p-0{padding:0}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:align-middle{vertical-align:middle}}@media (min-width: 768px){.md\:col-span-3{grid-column:span 3 / span 3}.md\:col-span-9{grid-column:span 9 / span 9}.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:relative{position:relative}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:p-8{padding:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}
  • chatprojects/trunk/assets/dist/js/admin.js

    r3453774 r3455209  
    1 import{m as t}from"./alpine-core-B3GESKiv.js";/* empty css             */t.data("settingsForm",()=>({saving:!1,testingConnection:!1,apiKey:"",provider:"openai",async saveSettings(){var t,n,o;this.saving=!0;try{const o=new FormData(this.$refs.form);o.append("action","chatpr_save_settings"),o.append("nonce",chatprData.nonce);const s=await fetch(chatprData.ajax_url,{method:"POST",body:o}),e=await s.json();e.success?null==(t=window.VPToast)||t.success("Settings saved successfully"):null==(n=window.VPToast)||n.error(e.data||"Failed to save settings")}catch(s){console.error("Error saving settings:",s),null==(o=window.VPToast)||o.error("Failed to save settings")}finally{this.saving=!1}},async testConnection(){var t,n,o,s;if(this.apiKey){this.testingConnection=!0;try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_test_connection",nonce:chatprData.nonce,api_key:this.apiKey,provider:this.provider})}),s=await t.json();s.success?null==(n=window.VPToast)||n.success("Connection successful!"):null==(o=window.VPToast)||o.error(s.data||"Connection failed")}catch(e){console.error("Error testing connection:",e),null==(s=window.VPToast)||s.error("Connection test failed")}finally{this.testingConnection=!1}}else null==(t=window.VPToast)||t.warning("Please enter an API key first")}})),t.data("assistantInstructionsModal",()=>({isOpen:!1,open(){this.isOpen=!0},close(){this.isOpen=!1}})),t.data("assistantPromptSelector",()=>({showPrompts:!1,prompts:[],loading:!1,selectedCategory:"Assistant",async loadPrompts(){var t,n;this.loading=!0,this.showPrompts=!0;try{const n=new FormData;n.append("action","chatpr_get_prompts"),n.append("nonce",(null==chatprAjax?void 0:chatprAjax.nonce)||(null==chatprData?void 0:chatprData.nonce)),n.append("category",this.selectedCategory);const o=await fetch((null==chatprAjax?void 0:chatprAjax.ajaxUrl)||(null==chatprData?void 0:chatprData.ajax_url),{method:"POST",body:n}),s=await o.json();s.success?this.prompts=s.data:null==(t=window.VPToast)||t.error("Failed to load prompts")}catch(o){console.error("Error loading prompts:",o),null==(n=window.VPToast)||n.error("Failed to load prompts")}finally{this.loading=!1}},selectPrompt(t){var n;const o=document.getElementById("chatprojects_assistant_instructions");o&&(o.value=t.content),this.showPrompts=!1,null==(n=window.VPToast)||n.success("Prompt loaded successfully")},close(){this.showPrompts=!1}})),window.Alpine=t,window._alpineStarted||(window._alpineStarted=!0,t.start()),document.addEventListener("DOMContentLoaded",function(){const t=document.getElementById("load-assistant-prompt-btn"),n=document.getElementById("assistant-instructions-info-btn");t&&t.addEventListener("click",function(){const t=new CustomEvent("open-prompt-selector");window.dispatchEvent(t)}),n&&n.addEventListener("click",function(){const t=new CustomEvent("open-instructions-info");window.dispatchEvent(t)})});
     1import{m as t}from"./alpine-core-CLFcr9yj.js";t.data("settingsForm",()=>({saving:!1,testingConnection:!1,apiKey:"",provider:"openai",async saveSettings(){var t,n,o;this.saving=!0;try{const o=new FormData(this.$refs.form);o.append("action","chatpr_save_settings"),o.append("nonce",chatprData.nonce);const a=await fetch(chatprData.ajax_url,{method:"POST",body:o}),s=await a.json();s.success?null==(t=window.VPToast)||t.success("Settings saved successfully"):null==(n=window.VPToast)||n.error(s.data||"Failed to save settings")}catch(a){console.error("Error saving settings:",a),null==(o=window.VPToast)||o.error("Failed to save settings")}finally{this.saving=!1}},async testConnection(){var t,n,o,a;if(this.apiKey){this.testingConnection=!0;try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_test_connection",nonce:chatprData.nonce,api_key:this.apiKey,provider:this.provider})}),a=await t.json();a.success?null==(n=window.VPToast)||n.success("Connection successful!"):null==(o=window.VPToast)||o.error(a.data||"Connection failed")}catch(s){console.error("Error testing connection:",s),null==(a=window.VPToast)||a.error("Connection test failed")}finally{this.testingConnection=!1}}else null==(t=window.VPToast)||t.warning("Please enter an API key first")}})),t.data("assistantInstructionsModal",()=>({isOpen:!1,open(){this.isOpen=!0},close(){this.isOpen=!1}})),t.data("assistantPromptSelector",()=>({showPrompts:!1,prompts:[],loading:!1,selectedCategory:"Assistant",async loadPrompts(){var t,n;this.loading=!0,this.showPrompts=!0;try{const n=new FormData;n.append("action","chatpr_get_prompts"),n.append("nonce",(null==chatprAjax?void 0:chatprAjax.nonce)||(null==chatprData?void 0:chatprData.nonce)),n.append("category",this.selectedCategory);const o=await fetch((null==chatprAjax?void 0:chatprAjax.ajaxUrl)||(null==chatprData?void 0:chatprData.ajax_url),{method:"POST",body:n}),a=await o.json();a.success?this.prompts=a.data:null==(t=window.VPToast)||t.error("Failed to load prompts")}catch(o){console.error("Error loading prompts:",o),null==(n=window.VPToast)||n.error("Failed to load prompts")}finally{this.loading=!1}},selectPrompt(t){var n;const o=document.getElementById("chatprojects_assistant_instructions");o&&(o.value=t.content),this.showPrompts=!1,null==(n=window.VPToast)||n.success("Prompt loaded successfully")},close(){this.showPrompts=!1}})),window.Alpine=t,window._alpineStarted||(window._alpineStarted=!0,t.start()),console.log("ChatProjects Admin initialized"),document.addEventListener("DOMContentLoaded",function(){const t=document.getElementById("load-assistant-prompt-btn"),n=document.getElementById("assistant-instructions-info-btn");t&&t.addEventListener("click",function(){const t=new CustomEvent("open-prompt-selector");window.dispatchEvent(t)}),n&&n.addEventListener("click",function(){const t=new CustomEvent("open-instructions-info");window.dispatchEvent(t)})});
  • chatprojects/trunk/assets/dist/js/chat.js

    r3453774 r3455209  
    1 import{m as e}from"./vendor-markdown-C9lje_HT.js";import{H as t,t as a}from"./index-DWuNdYZ9.js";/* empty css             */import"./vendor-highlight-DerHs5y0.js";e.setOptions({highlight:function(e,a){return a&&t.getLanguage(a)?t.highlight(e,{language:a}).value:t.highlightAuto(e).value},breaks:!0,gfm:!0}),document.addEventListener("alpine:init",()=>{window.Alpine.data("chat",(t=null,s=null,r="project")=>({projectId:t,threadId:s,mode:r,provider:"openai",model:"gpt-4o",messages:[],input:"",loading:!1,streaming:!1,currentStreamingMessage:null,abortController:null,availableProviders:[],selectedProvider:null,selectedModel:null,currentChatProvider:null,currentChatModel:null,attachedImages:[],isDragOver:!1,isProUser:"undefined"!=typeof chatprData&&chatprData.is_pro_user||!1,maxImagesPerMessage:"undefined"!=typeof chatprData&&parseInt(chatprData.max_images_per_message)||1,async init(){this.threadId&&this.loadMessages(),"general"===this.mode&&await this.loadAvailableProviders(),window.addEventListener("vp:chat:new",()=>{this.startNewChat()}),window.addEventListener("vp:chat:switch",e=>{this.switchChat(e.detail.threadId)}),this.$watch("input",()=>{this.autoResizeTextarea()})},async loadMessages(){var e,t;if(chatprData.nonceReady){try{await chatprData.nonceReady}catch(e){}}this.loading=!0;try{const s="general"===this.mode?"chatpr_get_general_chat_history":"chatpr_load_chat_history";const r=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:s,nonce:chatprData.nonce,chat_id:this.threadId})});const i=await r.json();i.success?(this.messages=i.data.messages||i.data,this.scrollToBottom()):a((null==(t=i.data)?void 0:t.message)||"Failed to load messages","error")}catch(s){a("Failed to load messages","error")}finally{this.loading=!1}},async sendMessage(){const e=this.input.trim().length>0,t=this.attachedImages.length>0;if(!e&&!t||this.loading||this.streaming)return;const a=this.input.trim(),s=[...this.attachedImages];this.input="",this.attachedImages=[];const r={role:"user",content:a,timestamp:(new Date).toISOString()};s.length>0&&(r.images=s.map(e=>e.dataUrl)),this.messages.push(r),this.scrollToBottom(),await this.streamResponse(a,s)},async streamResponse(e,t=[]){var s;console.log("[ChatProjects] streamResponse called, mode:",this.mode);if(typeof chatprData==="undefined"||!chatprData.ajax_url||!chatprData.nonce){a("Session expired. Please refresh the page.","error");return}console.log("[ChatProjects] chatprData check passed");if(chatprData.nonceReady){console.log("[ChatProjects] Waiting for nonceReady...");try{await chatprData.nonceReady;console.log("[ChatProjects] nonceReady resolved")}catch(e){console.log("[ChatProjects] nonceReady error:",e)}}this.streaming=!0,this.abortController=new AbortController;const r={role:"assistant",content:"",timestamp:(new Date).toISOString(),streaming:!0,sources:[]};this.messages.push(r),this.currentStreamingMessage=r;try{if("general"===this.mode){console.log("[ChatProjects] Preparing general mode fetch...");const i={action:"chatpr_stream_general_message",nonce:chatprData.nonce,message:e,chat_id:this.threadId||"",provider:this.selectedProvider,model:this.selectedModel};console.log("[ChatProjects] Fetch params:",{action:i.action,provider:i.provider,model:i.model});t.length>0&&(i.images_base64=JSON.stringify(t.map(e=>({dataUrl:e.dataUrl,name:e.name,type:e.type}))));console.log("[ChatProjects] About to fetch...");const o=await fetch(chatprData.ajax_url,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(i),signal:this.abortController.signal});console.log("[ChatProjects] Fetch completed, status:",o.status);if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);const n=o.body.getReader(),d=new TextDecoder;let l="",h=!1;for(;!h;){const{done:e,value:t}=await n.read();if(e)break;l+=d.decode(t,{stream:!0});const s=l.split("\n");l=s.pop()||"";for(const o of s)if(o.trim()&&o.startsWith("data: ")){const e=o.slice(6);if("[DONE]"===e){h=!0;break}try{const t=JSON.parse(e);if("content"===t.type&&t.content){console.log("[ChatProjects] Received content chunk:",t.content.substring(0,50));r.content+=t.content;const idx=this.messages.findIndex(m=>m.streaming&&m.role==="assistant");if(idx!==-1){this.messages[idx]={...this.messages[idx],content:r.content};this.messages=[...this.messages]}this.scrollToBottom()}else if("chat_id"===t.type&&t.chat_id)this.threadId=t.chat_id,window.dispatchEvent(new CustomEvent("vp:chat:updated",{detail:{threadId:this.threadId}}));else if("error"===t.type)return a(t.content||"An error occurred","error"),void(this.messages=this.messages.filter(e=>e!==r));else if("done"===t.type){h=!0;break}}catch(c){}}}this.currentStreamingMessage=null;const c=this.messages.findIndex(m=>m.streaming&&m.role==="assistant");if(c!==-1){this.messages[c]={...this.messages[c],streaming:!1};this.messages=[...this.messages]}window.dispatchEvent(new CustomEvent("vp:chat:updated",{detail:{threadId:this.threadId}})),setTimeout(()=>{window.dispatchEvent(new CustomEvent("vp:chat:updated",{detail:{threadId:this.threadId}}))},2500)}else{const o=await fetch(chatprData.stream_url||chatprData.ajax_url,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_stream_chat_message",nonce:chatprData.nonce,message:e,thread_id:this.threadId||"",project_id:this.projectId||""}),signal:this.abortController.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);const n=o.body.getReader(),d=new TextDecoder;let l="",h=!1;for(;!h;){const{done:e,value:t}=await n.read();if(e)break;l+=d.decode(t,{stream:!0});const s=l.split("\n");l=s.pop()||"";for(const o of s)if(o.trim()&&o.startsWith("data: ")){const e=o.slice(6);if("[DONE]"===e){h=!0;break}try{const t=JSON.parse(e);if("content"===t.type&&t.content){console.log("[ChatProjects] Received content chunk:",t.content.substring(0,50));r.content+=t.content;const idx=this.messages.findIndex(m=>m.streaming&&m.role==="assistant");if(idx!==-1){this.messages[idx]={...this.messages[idx],content:r.content};this.messages=[...this.messages]}this.scrollToBottom()}else if("sources"===t.type&&t.sources)r.sources=t.sources;else if("chat_id"===t.type&&t.chat_id)this.threadId=t.chat_id;else{if("error"===t.type)return a(t.content||"An error occurred","error"),void(this.messages=this.messages.filter(e=>e!==r));if("done"===t.type){h=!0;break}}}catch(i){}}}this.currentStreamingMessage=null;const c=this.messages.findIndex(m=>m.streaming&&m.role==="assistant");if(c!==-1){this.messages[c]={...this.messages[c],streaming:!1};this.messages=[...this.messages]}window.dispatchEvent(new CustomEvent("vp:chat:updated",{detail:{threadId:this.threadId}})),setTimeout(()=>{window.dispatchEvent(new CustomEvent("vp:chat:updated",{detail:{threadId:this.threadId}}))},2500)}}catch(o){if("AbortError"!==o.name){console.error("[ChatProjects] Stream error:",o);console.error("[ChatProjects] Error name:",o.name,"message:",o.message);console.error("[ChatProjects] chatprData state:",{ajax_url:chatprData?.ajax_url,nonce:chatprData?.nonce?.substring(0,8)+"...",nonceReady:!!chatprData?.nonceReady});const msg=o.message&&o.message.includes("status")?"Server error: "+o.message:"Failed to get response: "+(o.message||o.name||"unknown error");a(msg,"error");this.messages=this.messages.filter(e=>e!==r)}}finally{this.streaming=!1;const idx=this.messages.findIndex(m=>m.streaming&&m.role==="assistant");if(idx!==-1){this.messages[idx]={...this.messages[idx],streaming:!1};this.messages=[...this.messages]}this.abortController=null}},stopGeneration(){if(this.abortController){this.abortController.abort();this.streaming=!1;const idx=this.messages.findIndex(m=>m.streaming&&m.role==="assistant");if(idx!==-1){this.messages[idx]={...this.messages[idx],streaming:!1};this.messages=[...this.messages]}this.currentStreamingMessage=null;a("Generation stopped","info",3e3)}},async regenerateResponse(){if(this.messages.length<2)return;this.messages.pop();const e=[...this.messages].reverse().find(e=>"user"===e.role);e&&await this.streamResponse(e.content)},renderMarkdown:t=>e.parse(t),copyMessage(e){navigator.clipboard.writeText(e).then(()=>{a("Copied to clipboard","success",2e3)})},startNewChat(){this.threadId=null,this.messages=[],this.input="","general"===this.mode&&(this.currentChatProvider=null,this.currentChatModel=null)},async switchChat(e){this.threadId=e,this.messages=[],await this.loadMessages(),"general"===this.mode&&await this.loadChatMetadata()},autoResizeTextarea(){this.$nextTick(()=>{const e=this.$refs.messageInput;e&&(e.style.height="auto",e.style.height=Math.min(e.scrollHeight,200)+"px")})},scrollToBottom(){this.$nextTick(()=>{const e=this.$refs.messagesContainer;e&&(e.scrollTop=e.scrollHeight)})},handleKeydown(e){"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this.sendMessage())},handleInputFocus(){if(window.innerWidth<768){document.body.classList.add("vp-keyboard-open");const e=this.$refs.messageInput;e&&setTimeout(()=>{e.scrollIntoView({behavior:"smooth",block:"center"}),this.scrollToBottom()},300)}},handleInputBlur(){document.body.classList.remove("vp-keyboard-open")},async loadAvailableProviders(){if(chatprData.nonceReady){try{await chatprData.nonceReady}catch(x){}}try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_available_providers",nonce:chatprData.nonce})}),t=await e.json();if(t.success&&(this.availableProviders=Object.entries(t.data.providers).map(([e,t])=>({id:e,name:t.name,models:t.models})),this.availableProviders.length>0)){const e=chatprData.default_provider||this.availableProviders[0].id,t=this.availableProviders.find(t=>t.id===e);this.selectedProvider=t?e:this.availableProviders[0].id;const a=this.availableProviders.find(e=>e.id===this.selectedProvider);if(a){const e=chatprData.default_model||a.models[0];this.selectedModel=a.models.includes(e)?e:a.models[0]}}}catch(e){a("Failed to load AI providers","error")}},get currentProviderModels(){const e=this.availableProviders.find(e=>e.id===this.selectedProvider);return e?e.models:[]},async handleProviderChange(){const e=this.availableProviders.find(e=>e.id===this.selectedProvider);e&&e.models.length>0&&(this.selectedModel=e.models[0]),this.threadId&&this.messages.length>0&&await this.confirmProviderSwitch()},async handleModelChange(){this.threadId&&this.messages.length>0&&await this.confirmProviderSwitch()},async confirmProviderSwitch(){var e;const t=this.currentChatProvider||this.selectedProvider,a=this.currentChatModel||this.selectedModel;if(t===this.selectedProvider&&a===this.selectedModel)return;const s=null==(e=this.availableProviders.find(e=>e.id===this.selectedProvider))?void 0:e.name;confirm(`Switching to ${s} (${this.selectedModel}) will create a new conversation. Your current chat history will be preserved in the sidebar.\n\nContinue?`)?await this.createNewChatWithProvider():(this.selectedProvider=t,this.selectedModel=a)},async createNewChatWithProvider(){var e;try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_create_general_chat",nonce:chatprData.nonce,provider:this.selectedProvider,model:this.selectedModel})}),s=await t.json();s.success?(this.threadId=s.data.chat_id,this.messages=[],this.currentChatProvider=this.selectedProvider,this.currentChatModel=this.selectedModel,window.dispatchEvent(new CustomEvent("vp:chat:updated",{detail:{threadId:this.threadId}})),a("New conversation created","success",2e3)):a((null==(e=s.data)?void 0:e.message)||"Failed to create conversation","error")}catch(t){a("Failed to create new conversation","error")}},async loadChatMetadata(){try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_chat_metadata",nonce:chatprData.nonce,chat_id:this.threadId})}),t=await e.json();t.success&&(this.currentChatProvider=t.data.provider,this.currentChatModel=t.data.model,this.selectedProvider=t.data.provider,this.selectedModel=t.data.model)}catch(e){}},async handleImageSelect(e){if("general"!==this.mode)return;const t=Array.from(e.target.files);await this.addImages(t),e.target.value=""},async handlePaste(e){var t;if("general"!==this.mode)return;const a=null==(t=e.clipboardData)?void 0:t.items;if(!a)return;const s=[];for(let r=0;r<a.length;r++)if(a[r].type.startsWith("image/")){const e=a[r].getAsFile();e&&s.push(e)}s.length>0&&(e.preventDefault(),await this.addImages(s))},async handleDrop(e){if("general"!==this.mode)return;this.isDragOver=!1;const t=Array.from(e.dataTransfer.files).filter(e=>e.type.startsWith("image/"));t.length>0&&await this.addImages(t)},async addImages(e){var t,s,r,i;const o=-1===this.maxImagesPerMessage?1/0:this.maxImagesPerMessage-this.attachedImages.length;if(o<=0)return void a((null==(t=chatprData.i18n)?void 0:t.maxImagesReached)||"Maximum images reached","warning");const n=e.slice(0,o);for(const l of n){if(!["image/jpeg","image/png","image/gif","image/webp"].includes(l.type)){a((null==(s=chatprData.i18n)?void 0:s.invalidImageType)||"Invalid image type. Allowed: JPEG, PNG, GIF, WebP.","error");continue}const e=chatprData.max_image_size||10485760;if(l.size>e){const t=Math.round(e/1048576);a(((null==(r=chatprData.i18n)?void 0:r.imageTooLarge)||"Image exceeds {size} MB limit").replace("{size}",t),"error");continue}try{const e=await this.fileToDataUrl(l);this.attachedImages.push({name:l.name,type:l.type,size:l.size,dataUrl:e})}catch(d){a((null==(i=chatprData.i18n)?void 0:i.imageProcessError)||"Failed to process image","error")}}},fileToDataUrl:e=>new Promise((t,a)=>{const s=new FileReader;s.onload=()=>t(s.result),s.onerror=()=>a(new Error("Failed to read file")),s.readAsDataURL(e)}),removeImage(e){this.attachedImages.splice(e,1)},openImageModal(e){window.open(e,"_blank")}}))});
     1import{m as e}from"./vendor-markdown-C9lje_HT.js";import{H as t,t as a}from"./index-BUXiFE9L.js";/* empty css             */import"./vendor-highlight-DerHs5y0.js";e.setOptions({highlight:function(e,a){return a&&t.getLanguage(a)?t.highlight(e,{language:a}).value:t.highlightAuto(e).value},breaks:!0,gfm:!0}),document.addEventListener("alpine:init",()=>{window.Alpine.data("chat",(t=null,s=null,r="project")=>({projectId:t,threadId:s,mode:r,provider:"openai",model:"gpt-4o",messages:[],input:"",loading:!1,streaming:!1,currentStreamingMessage:null,abortController:null,availableProviders:[],selectedProvider:null,selectedModel:null,currentChatProvider:null,currentChatModel:null,attachedImages:[],isDragOver:!1,isProUser:"undefined"!=typeof chatprData&&chatprData.is_pro_user||!1,maxImagesPerMessage:"undefined"!=typeof chatprData&&parseInt(chatprData.max_images_per_message)||1,async init(){this.threadId&&this.loadMessages(),"general"===this.mode&&await this.loadAvailableProviders(),window.addEventListener("chatpr:chat:switch",e=>{this.switchChat(e.detail.threadId)}),this.$watch("input",()=>{this.autoResizeTextarea()})},async loadMessages(){var e,t;this.loading=!0,console.log("[DEBUG] loadMessages() starting - mode:",this.mode,"threadId:",this.threadId);try{const s="general"===this.mode?"chatpr_get_general_chat_history":"chatpr_load_chat_history";console.log("[DEBUG] Using action:",s,"chat_id:",this.threadId);const r=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:s,nonce:chatprData.nonce,chat_id:this.threadId})});console.log("[DEBUG] Response status:",r.status);const i=await r.json();console.log("[DEBUG] Response data:",i),i.success?(this.messages=i.data.messages||i.data,console.log("[DEBUG] Loaded messages:",this.messages.length),this.scrollToBottom()):(console.error("[DEBUG] Load failed:",null==(e=i.data)?void 0:e.message),a((null==(t=i.data)?void 0:t.message)||"Failed to load messages","error"))}catch(s){console.error("[DEBUG] Exception in loadMessages:",s),a("Failed to load messages","error")}finally{this.loading=!1,console.log("[DEBUG] loadMessages() complete")}},async sendMessage(){const e=this.input.trim().length>0,t=this.attachedImages.length>0;if(!e&&!t||this.loading||this.streaming)return;const a=this.input.trim(),s=[...this.attachedImages];this.input="",this.attachedImages=[];const r={role:"user",content:a,timestamp:(new Date).toISOString()};s.length>0&&(r.images=s.map(e=>e.dataUrl)),this.messages.push(r),this.scrollToBottom(),await this.streamResponse(a,s)},async streamResponse(e,t=[]){var s;this.streaming=!0,this.abortController=new AbortController;const r={role:"assistant",content:"",timestamp:(new Date).toISOString(),streaming:!0,sources:[]};this.messages.push(r),this.currentStreamingMessage=r;try{if("general"===this.mode){const a={action:"chatpr_send_general_message",nonce:chatprData.nonce,message:e,chat_id:this.threadId||"",provider:this.selectedProvider,model:this.selectedModel};t.length>0&&(a.images_base64=JSON.stringify(t.map(e=>({dataUrl:e.dataUrl,name:e.name,type:e.type}))));const i=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(a),signal:this.abortController.signal}),o=await i.json();if(!o.success)throw new Error((null==(s=o.data)?void 0:s.message)||"Failed to send message");{r.content=o.data.response,r.streaming=!1;const e=this.messages.indexOf(r);-1!==e&&(this.messages[e]=Object.assign({},r)),o.data.chat_id&&!this.threadId&&(this.threadId=o.data.chat_id,window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}}))),this.scrollToBottom()}return this.streaming=!1,void(this.currentStreamingMessage=null)}const o=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_stream_chat_message",nonce:chatprData.nonce,message:e,thread_id:this.threadId||"",project_id:this.projectId||""}),signal:this.abortController.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);const n=o.body.getReader(),d=new TextDecoder;let h="",l=!1;for(;!l;){const{done:e,value:t}=await n.read();if(e)break;h+=d.decode(t,{stream:!0});const s=h.split("\n");h=s.pop()||"";for(const o of s)if(o.trim()&&o.startsWith("data: ")){const e=o.slice(6);if("[DONE]"===e){l=!0;break}try{const t=JSON.parse(e);if("content"===t.type&&t.content)r.content+=t.content,this.scrollToBottom();else if("chat_id"===t.type&&t.chat_id)console.log("[ChatProjects] chat_id handler - VERSION 2.0 LOADED"),this.threadId||(this.threadId=t.chat_id,console.log("[ChatProjects] Received chat_id:",this.threadId));else if("sources"===t.type&&t.sources)r.sources=t.sources;else{if("error"===t.type)return console.error("SSE error:",t.content),a(t.content||"An error occurred","error"),void(this.messages=this.messages.filter(e=>e!==r));if("done"===t.type){l=!0;break}}}catch(i){console.warn("Failed to parse SSE data:",e,i)}}}r.streaming=!1,this.currentStreamingMessage=null;const c=this.messages.indexOf(r);-1!==c&&(this.messages[c]=Object.assign({},r)),window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}})),setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}}))},2500)}catch(o){"AbortError"!==o.name&&(console.error("Streaming error:",o),a("Failed to get response","error"),this.messages=this.messages.filter(e=>e!==r))}finally{this.streaming=!1,this.abortController=null}},stopGeneration(){this.abortController&&(this.abortController.abort(),this.streaming=!1,this.currentStreamingMessage&&(this.currentStreamingMessage.streaming=!1,this.currentStreamingMessage=null),a("Generation stopped","info",3e3))},async regenerateResponse(){if(this.messages.length<2)return;this.messages.pop();const e=[...this.messages].reverse().find(e=>"user"===e.role);e&&await this.streamResponse(e.content)},renderMarkdown:t=>e.parse(t),copyMessage(e){navigator.clipboard.writeText(e).then(()=>{a("Copied to clipboard","success",2e3)})},startNewChat(){this.threadId=null,this.messages=[],this.input="","general"===this.mode&&(this.currentChatProvider=null,this.currentChatModel=null)},async switchChat(e){console.log("[DEBUG] switchChat called with threadId:",e,"mode:",this.mode),this.threadId=e,this.messages=[],console.log("[DEBUG] About to call loadMessages()"),await this.loadMessages(),console.log("[DEBUG] loadMessages() completed, messages count:",this.messages.length),"general"===this.mode&&(console.log("[DEBUG] Loading chat metadata for general mode"),await this.loadChatMetadata())},autoResizeTextarea(){this.$nextTick(()=>{const e=this.$refs.messageInput;e&&(e.style.height="auto",e.style.height=Math.min(e.scrollHeight,200)+"px")})},scrollToBottom(){this.$nextTick(()=>{const e=this.$refs.messagesContainer;e&&(e.scrollTop=e.scrollHeight)})},handleKeydown(e){"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this.sendMessage())},async loadAvailableProviders(){try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_available_providers",nonce:chatprData.nonce})}),t=await e.json();if(t.success&&(this.availableProviders=Object.entries(t.data.providers).map(([e,t])=>({id:e,name:t.name,models:t.models})),this.availableProviders.length>0)){const e=chatprData.default_provider||this.availableProviders[0].id,t=this.availableProviders.find(t=>t.id===e);this.selectedProvider=t?e:this.availableProviders[0].id;const a=this.availableProviders.find(e=>e.id===this.selectedProvider);if(a){const e=chatprData.default_model||a.models[0];this.selectedModel=a.models.includes(e)?e:a.models[0]}}}catch(e){console.error("Failed to load providers:",e),a("Failed to load AI providers","error")}},get currentProviderModels(){const e=this.availableProviders.find(e=>e.id===this.selectedProvider);return e?e.models:[]},async handleProviderChange(){const e=this.availableProviders.find(e=>e.id===this.selectedProvider);e&&e.models.length>0&&(this.selectedModel=e.models[0]),this.threadId&&this.messages.length>0&&await this.confirmProviderSwitch()},async handleModelChange(){this.threadId&&this.messages.length>0&&await this.confirmProviderSwitch()},async confirmProviderSwitch(){var e;const t=this.currentChatProvider||this.selectedProvider,a=this.currentChatModel||this.selectedModel;if(t===this.selectedProvider&&a===this.selectedModel)return;const s=null==(e=this.availableProviders.find(e=>e.id===this.selectedProvider))?void 0:e.name;confirm(`Switching to ${s} (${this.selectedModel}) will create a new conversation. Your current chat history will be preserved in the sidebar.\n\nContinue?`)?await this.createNewChatWithProvider():(this.selectedProvider=t,this.selectedModel=a)},async createNewChatWithProvider(){var e;try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_create_general_chat",nonce:chatprData.nonce,provider:this.selectedProvider,model:this.selectedModel})}),s=await t.json();s.success?(this.threadId=s.data.chat_id,this.messages=[],this.currentChatProvider=this.selectedProvider,this.currentChatModel=this.selectedModel,window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}})),a("New conversation created","success",2e3)):a((null==(e=s.data)?void 0:e.message)||"Failed to create conversation","error")}catch(t){console.error("Failed to create new chat:",t),a("Failed to create new conversation","error")}},async loadChatMetadata(){try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_chat_metadata",nonce:chatprData.nonce,chat_id:this.threadId})}),t=await e.json();t.success&&(this.currentChatProvider=t.data.provider,this.currentChatModel=t.data.model,this.selectedProvider=t.data.provider,this.selectedModel=t.data.model)}catch(e){console.error("Failed to load chat metadata:",e)}},async handleImageSelect(e){if("general"!==this.mode)return;const t=Array.from(e.target.files);await this.addImages(t),e.target.value=""},async handlePaste(e){var t;if("general"!==this.mode)return;const a=null==(t=e.clipboardData)?void 0:t.items;if(!a)return;const s=[];for(let r=0;r<a.length;r++)if(a[r].type.startsWith("image/")){const e=a[r].getAsFile();e&&s.push(e)}s.length>0&&(e.preventDefault(),await this.addImages(s))},async handleDrop(e){if("general"!==this.mode)return;this.isDragOver=!1;const t=Array.from(e.dataTransfer.files).filter(e=>e.type.startsWith("image/"));t.length>0&&await this.addImages(t)},async addImages(e){var t,s,r,i;const o=-1===this.maxImagesPerMessage?1/0:this.maxImagesPerMessage-this.attachedImages.length;if(o<=0)return void a((null==(t=chatprData.i18n)?void 0:t.maxImagesReached)||"Maximum images reached","warning");const n=e.slice(0,o);for(const h of n){if(!["image/jpeg","image/png","image/gif","image/webp"].includes(h.type)){a((null==(s=chatprData.i18n)?void 0:s.invalidImageType)||"Invalid image type. Allowed: JPEG, PNG, GIF, WebP.","error");continue}const e=chatprData.max_image_size||10485760;if(h.size>e){const t=Math.round(e/1048576);a(((null==(r=chatprData.i18n)?void 0:r.imageTooLarge)||"Image exceeds {size} MB limit").replace("{size}",t),"error");continue}try{const e=await this.fileToDataUrl(h);this.attachedImages.push({name:h.name,type:h.type,size:h.size,dataUrl:e})}catch(d){console.error("Failed to process image:",d),a((null==(i=chatprData.i18n)?void 0:i.imageProcessError)||"Failed to process image","error")}}},fileToDataUrl:e=>new Promise((t,a)=>{const s=new FileReader;s.onload=()=>t(s.result),s.onerror=()=>a(new Error("Failed to read file")),s.readAsDataURL(e)}),removeImage(e){this.attachedImages.splice(e,1)},openImageModal(e){window.open(e,"_blank")}}))});
  • chatprojects/trunk/assets/dist/js/main.js

    r3453774 r3455209  
    1 import{m as e}from"./alpine-core-B3GESKiv.js";/* empty css             */import{t,i as a}from"./index-DWuNdYZ9.js";import"./chat.js";import"./vendor-highlight-DerHs5y0.js";import"./vendor-markdown-C9lje_HT.js";class i{constructor(){this.theme=this.getStoredTheme()||this.getSystemTheme(),this.init()}init(){this.applyTheme(this.theme),this.setupListeners()}getStoredTheme(){return localStorage.getItem("cp_theme_preference")}getSystemTheme(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}applyTheme(e){const t=document.documentElement;"dark"===e?t.classList.add("dark"):t.classList.remove("dark"),this.theme=e,localStorage.setItem("cp_theme_preference",e),window.dispatchEvent(new CustomEvent("vp:theme:changed",{detail:{theme:e}}))}toggle(){const e="dark"===this.theme?"light":"dark";return this.applyTheme(e),e}setTheme(e){"dark"!==e&&"light"!==e||this.applyTheme(e)}setupListeners(){window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{this.getStoredTheme()||this.applyTheme(e.matches?"dark":"light")})}getCurrentTheme(){return this.theme}}let s=null;class o{constructor(){this.shortcuts=new Map,this.isEnabled=!0,this.init()}init(){this.registerDefaultShortcuts(),this.setupListeners()}registerDefaultShortcuts(){this.register("mod+k",()=>{this.openCommandPalette()},"Open command palette"),this.register("mod+n",()=>{window.dispatchEvent(new CustomEvent("vp:chat:new"))},"Start new chat"),this.register("mod+shift+l",()=>{var e;null==(e=window.VPTheme)||e.toggle()},"Toggle light/dark mode"),this.register("mod+/",()=>{const e=document.querySelector("[data-search-input]");e&&e.focus()},"Focus search"),this.register("?",()=>{this.showShortcutsModal()},"Show keyboard shortcuts"),this.register("escape",()=>{window.dispatchEvent(new CustomEvent("vp:modal:close"))},"Close modal/dialog")}register(e,t,a=""){this.shortcuts.set(e,{callback:t,description:a,keys:this.parseKeyCombination(e)})}parseKeyCombination(e){return e.toLowerCase().split("+").map(e=>"mod"===e?navigator.platform.includes("Mac")?"meta":"ctrl":e)}setupListeners(){document.addEventListener("keydown",e=>{if(!this.isEnabled)return;const t=["INPUT","TEXTAREA","SELECT"].includes(e.target.tagName),a=e.target.isContentEditable;if(t||a){if("Escape"===e.key)return void e.target.blur();if("?"!==e.key)return}this.shortcuts.forEach((t,a)=>{this.matchesShortcut(e,t.keys)&&(e.preventDefault(),t.callback(e))})})}matchesShortcut(e,t){const a=[];e.ctrlKey&&a.push("ctrl"),e.metaKey&&a.push("meta"),e.shiftKey&&a.push("shift"),e.altKey&&a.push("alt");const i=e.key.toLowerCase();return["control","meta","shift","alt"].includes(i)||a.push(i),a.length===t.length&&t.every(e=>a.includes(e))}openCommandPalette(){window.dispatchEvent(new CustomEvent("vp:command-palette:open"))}showShortcutsModal(){const e=Array.from(this.shortcuts.entries()).map(([e,t])=>({combination:this.formatCombination(e),description:t.description}));window.dispatchEvent(new CustomEvent("vp:shortcuts:show",{detail:{shortcuts:e}}))}formatCombination(e){const t=navigator.platform.includes("Mac");return e.replace("mod",t?"⌘":"Ctrl").replace("shift",t?"⇧":"Shift").replace("alt",t?"⌥":"Alt").replace("ctrl",t?"⌃":"Ctrl").split("+").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(t?" ":" + ")}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}unregister(e){this.shortcuts.delete(e)}getShortcuts(){return Array.from(this.shortcuts.entries()).map(([e,t])=>({combination:this.formatCombination(e),description:t.description}))}}let r=null;document.addEventListener("alpine:init",()=>{window.Alpine.data("sidebar",()=>({isOpen:!0,isMobile:window.innerWidth<768,init(){this.isMobile&&(this.isOpen=!1),window.addEventListener("resize",()=>{const e=this.isMobile;this.isMobile=window.innerWidth<768,!e&&this.isMobile?this.isOpen=!1:e&&!this.isMobile&&(this.isOpen=!0)})},toggle(){this.isOpen=!this.isOpen},close(){this.isOpen=!1},open(){this.isOpen=!0}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("projectSwitcher",(e=null)=>({isOpen:!1,searchQuery:"",currentProjectId:e,projects:[],loading:!1,init(){this.loadProjects(),document.addEventListener("click",e=>{this.$el.contains(e.target)||(this.isOpen=!1)})},async loadProjects(){this.loading=!0;try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_projects",nonce:chatprData.nonce})}),t=await e.json();t.success&&(this.projects=t.data)}catch(e){console.error("Failed to load projects:",e)}finally{this.loading=!1}},get filteredProjects(){if(!this.searchQuery)return this.projects;const e=this.searchQuery.toLowerCase();return this.projects.filter(t=>t.title.toLowerCase().includes(e))},selectProject(e){window.location.href=`?page=chatprojects&project_id=${e}`},toggle(){this.isOpen=!this.isOpen,this.isOpen&&this.$nextTick(()=>{var e;null==(e=this.$refs.searchInput)||e.focus()})},openShareModal(){this.isOpen=!1,window.dispatchEvent(new CustomEvent("open-share-modal"))}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("modal",(e=!1)=>({isOpen:e,init(){window.addEventListener("vp:modal:open",e=>{var t;(null==(t=e.detail)?void 0:t.id)===this.$el.id&&this.open()}),window.addEventListener("vp:modal:close",()=>{this.close()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.isOpen&&this.close()})},open(){this.isOpen=!0,document.body.style.overflow="hidden",this.$nextTick(()=>{const e=this.$el.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');e.length&&e[0].focus()})},close(){this.isOpen=!1,document.body.style.overflow=""},closeOnBackdrop(e){e.target===e.currentTarget&&this.close()}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("dropdown",(e="bottom-left")=>({isOpen:!1,placement:e,init(){document.addEventListener("click",e=>{!this.$el.contains(e.target)&&this.isOpen&&(this.isOpen=!1)}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.isOpen&&(this.isOpen=!1)})},toggle(){this.isOpen=!this.isOpen},close(){this.isOpen=!1},open(){this.isOpen=!0}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("chatHistory",(e=null,a=null)=>({projectId:e,chatMode:a,chats:[],activeThreadId:null,loading:!1,editingChatId:null,editingTitle:"",init(){this.loadChatList(),window.addEventListener("vp:chat:updated",e=>{this.loadChatList(),e.detail&&e.detail.threadId&&(this.activeThreadId=e.detail.threadId)}),window.addEventListener("vp:chat:new",()=>{this.activeThreadId=null}),window.addEventListener("vp:chat:switch",e=>{e.detail&&e.detail.threadId&&(this.activeThreadId=e.detail.threadId)})},async loadChatList(){var e;this.loading=!0;try{const a={action:"chatpr_get_chat_list",nonce:chatprData.nonce,project_id:this.projectId||""};this.chatMode&&(a.chat_mode=this.chatMode);const i=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(a)}),s=await i.json();if(s.success)this.chats=s.data.chats||[];else{console.error("Failed to load chat list:",s.data);const a="string"==typeof s.data?s.data:(null==(e=s.data)?void 0:e.message)||"Failed to load chat history";t(a,"error")}}catch(a){console.error("Error loading chat list:",a),t("Failed to load chat history","error")}finally{this.loading=!1}},switchChat(e){this.activeThreadId=e,window.dispatchEvent(new CustomEvent("vp:chat:switch",{detail:{threadId:e}}))},startEditingChat(e,t){t.stopPropagation(),this.editingChatId=e.id,this.editingTitle=e.title||e.first_message||"Untitled Chat"},cancelEditing(){this.editingChatId=null,this.editingTitle=""},async saveTitle(e,a){var i;if(a.stopPropagation(),this.editingTitle.trim()){try{const a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_rename_chat",nonce:chatprData.nonce,chat_id:e,title:this.editingTitle.trim()})}),s=await a.json();if(s.success)t("Chat renamed successfully","success",2e3),this.loadChatList();else{const e="string"==typeof s.data?s.data:(null==(i=s.data)?void 0:i.message)||"Failed to rename chat";console.error("Rename failed:",e,s),t(e,"error")}}catch(s){console.error("Error renaming chat:",s),t("Failed to rename chat","error")}finally{this.cancelEditing()}}else t("Chat title cannot be empty","error")},async deleteChat(e,a){var i;if(a.stopPropagation(),confirm("Are you sure you want to delete this chat? This action cannot be undone.")){try{const a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_chat",nonce:chatprData.nonce,chat_id:e})}),s=await a.json();if(s.success)t("Chat deleted successfully","success",2e3),this.activeThreadId===e&&(this.activeThreadId=null,window.dispatchEvent(new CustomEvent("vp:chat:new"))),this.loadChatList();else{const e="string"==typeof s.data?s.data:(null==(i=s.data)?void 0:i.message)||"Failed to delete chat";console.error("Delete failed:",e,s),t(e,"error")}}catch(s){console.error("Error deleting chat:",s),t("Failed to delete chat","error")}}},formatDate(e){if(!e)return"";const t=new Date(e),a=new Date,i=Math.abs(a-t),s=Math.floor(i/864e5);return 0===s?"Today":1===s?"Yesterday":s<7?`${s} days ago`:t.toLocaleDateString()},getChatTitle:e=>e.title||e.first_message||"Untitled Chat",truncateText:(e,t=40)=>e?e.length>t?e.substring(0,t)+"...":e:"",getDateGroup(e){if(!e)return"Older";const t=new Date(e),a=new Date,i=Math.abs(a-t),s=Math.floor(i/864e5);return 0===s?"Today":1===s?"Yesterday":s<7?"Last 7 Days":s<30?"Last 30 Days":"Older"},get groupedChats(){const e={};this.chats.forEach(t=>{const a=this.getDateGroup(t.updated_at);e[a]||(e[a]=[]),e[a].push(t)});const t=[];return["Today","Yesterday","Last 7 Days","Last 30 Days","Older"].forEach(a=>{e[a]&&e[a].length>0&&t.push({name:a,chats:e[a]})}),t}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("fileManager",(e=null)=>({projectId:e,files:[],loading:!1,uploading:!1,uploadQueue:[],selectedFiles:[],selectAll:!1,isDragging:!1,init(){this.loadFiles(),this.$watch("selectAll",e=>{this.selectedFiles=e?this.files.map(e=>e.id||e.file_id):[]}),this.$watch("selectedFiles",()=>{0===this.selectedFiles.length?this.selectAll=!1:this.selectedFiles.length===this.files.length&&this.files.length>0&&(this.selectAll=!0)})},async loadFiles(){this.loading=!0;try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_list_files",nonce:chatprData.nonce,project_id:this.projectId||""})}),t=await e.json();t.success?this.files=t.data.files||[]:console.error("Failed to load files:",t.data)}catch(e){console.error("Error loading files:",e)}finally{this.loading=!1}},handleFileSelect(e){const t=e.target.files;t&&t.length>0&&this.handleFiles(Array.from(t)),e.target.value=""},handleDrop(e){var t;e.preventDefault(),this.isDragging=!1;const a=null==(t=e.dataTransfer)?void 0:t.files;a&&a.length>0&&this.handleFiles(Array.from(a))},handleDragOver(e){e.preventDefault(),this.isDragging=!0},handleDragLeave(e){e.preventDefault(),this.isDragging=!1},handleFiles(e){e.forEach(e=>{this.validateFile(e)&&this.uploadFile(e)})},validateFile(e){if(e.size>52428800)return t(`File "${e.name}" exceeds 50MB limit`,"error"),!1;return!(!["application/pdf","text/plain","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","text/csv","application/json","text/markdown","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"].includes(e.type)&&!e.name.endsWith(".md"))||(t(`File type "${e.type}" is not allowed`,"error"),!1)},async uploadFile(e){var a;const i="upload-"+Date.now()+"-"+Math.random().toString(36).substr(2,9),s={id:i,name:e.name,progress:0,status:"uploading"};this.uploadQueue.push(s);const o=new FormData;o.append("action","chatpr_upload_file"),o.append("nonce",chatprData.nonce),o.append("project_id",this.projectId||""),o.append("file",e);try{const s=new XMLHttpRequest;s.upload.addEventListener("progress",e=>{if(e.lengthComputable){const t=e.loaded/e.total*100,a=this.uploadQueue.find(e=>e.id===i);a&&(a.progress=t)}});const r=new Promise((e,t)=>{s.onload=()=>{if(200===s.status)try{const t=JSON.parse(s.responseText);e(t)}catch(a){t(new Error("Invalid JSON response"))}else t(new Error(`HTTP ${s.status}`))},s.onerror=()=>t(new Error("Network error"))});s.open("POST",chatprData.ajax_url),s.send(o);const n=await r;if(n.success){const a=this.uploadQueue.find(e=>e.id===i);a&&(a.status="success",a.progress=100),t(`File "${e.name}" uploaded successfully`,"success",3e3),this.files.unshift(n.data.file),setTimeout(()=>{this.uploadQueue=this.uploadQueue.filter(e=>e.id!==i)},2e3)}else{const e=this.uploadQueue.find(e=>e.id===i);e&&(e.status="error");const s=(null==(a=n.data)?void 0:a.message)||"Failed to upload file";t(s,"error"),setTimeout(()=>{this.uploadQueue=this.uploadQueue.filter(e=>e.id!==i)},3e3)}}catch(r){const a=this.uploadQueue.find(e=>e.id===i);a&&(a.status="error"),console.error("Upload error:",r),t(`Failed to upload "${e.name}"`,"error"),setTimeout(()=>{this.uploadQueue=this.uploadQueue.filter(e=>e.id!==i)},3e3)}},async deleteFile(e){var a;if(confirm("Are you sure you want to delete this file? This action cannot be undone."))try{const i=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_file",nonce:chatprData.nonce,file_id:e,project_id:this.projectId||""})}),s=await i.json();s.success?(t("File deleted successfully","success",2e3),this.files=this.files.filter(t=>(t.id||t.file_id)!==e),this.selectedFiles=this.selectedFiles.filter(t=>t!==e)):t((null==(a=s.data)?void 0:a.message)||"Failed to delete file","error")}catch(i){console.error("Error deleting file:",i),t("Failed to delete file","error")}},async bulkDeleteFiles(){const e=this.selectedFiles.length;if(0===e)return;if(!confirm(`Are you sure you want to delete ${e} file${e>1?"s":""}? This action cannot be undone.`))return;const a=[...this.selectedFiles];let i=0,s=0;for(const t of a)try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_file",nonce:chatprData.nonce,file_id:t,project_id:this.projectId||""})});(await e.json()).success?(i++,this.files=this.files.filter(e=>(e.id||e.file_id)!==t)):s++}catch(o){console.error("Error deleting file:",o),s++}this.selectedFiles=[],this.selectAll=!1,i>0&&t(`${i} file${i>1?"s":""} deleted successfully`,"success"),s>0&&t(`Failed to delete ${s} file${s>1?"s":""}`,"error")},formatFileSize(e){if(!e||0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,t)*100)/100+" "+["Bytes","KB","MB","GB"][t]},formatDate(e){if(!e)return"";const t=new Date(e),a=new Date,i=Math.abs(a-t),s=Math.floor(i/864e5);return 0===s?"Today at "+t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit"}):1===s?"Yesterday":s<7?`${s} days ago`:t.toLocaleDateString()},getFileId:e=>e.id||e.file_id,getFileSize:e=>e.bytes||e.size||0,getFileDate:e=>e.created_at||e.uploaded_at||"",triggerFileInput(){this.$refs.fileInput.click()}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("transcriber",(e=null)=>({projectId:e,selectedFile:null,language:"",enableRewrite:!1,tone:"",transcribing:!1,rewriting:!1,saving:!1,transcription:null,rewrittenText:null,duration:null,saveToDatabase:!1,init(){},handleFileSelect(e){var t;const a=null==(t=e.target.files)?void 0:t[0];a&&this.selectFile(a)},handleDrop(e){var t,a;e.preventDefault();const i=null==(a=null==(t=e.dataTransfer)?void 0:t.files)?void 0:a[0];i&&this.selectFile(i)},selectFile(e){if(!(["audio/mpeg","audio/mp4","audio/wav","audio/m4a","audio/webm","video/mp4","video/webm"].includes(e.type)||e.name.match(/\.(mp3|mp4|wav|m4a|webm)$/i)))return void t("Please select a valid audio or video file","error");e.size>26214400?t("File size exceeds 25MB limit","error"):(this.selectedFile=e,this.transcription=null,this.rewrittenText=null,this.duration=null)},clearFile(){this.selectedFile=null,this.transcription=null,this.rewrittenText=null,this.duration=null},async transcribe(){var e;if(!this.selectedFile)return void t("Please select an audio file first","error");this.transcribing=!0;const a=new FormData;a.append("action","chatpr_transcribe_audio"),a.append("nonce",chatprData.nonce),a.append("project_id",this.projectId||""),a.append("audio_file",this.selectedFile),this.language&&a.append("language",this.language);try{const i=await fetch(chatprData.ajax_url,{method:"POST",body:a}),s=await i.json();s.success?(this.transcription=s.data.text||s.data.transcription,this.duration=s.data.duration,t("Transcription completed successfully","success",3e3),this.enableRewrite&&this.tone&&setTimeout(()=>this.rewrite(),500)):t((null==(e=s.data)?void 0:e.message)||"Transcription failed","error")}catch(i){console.error("Transcription error:",i),t("Failed to transcribe audio","error")}finally{this.transcribing=!1}},async rewrite(){var e;if(this.transcription)if(this.tone){this.rewriting=!0;try{const a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_rewrite_transcription",nonce:chatprData.nonce,transcription:this.transcription,tone:this.tone,project_id:this.projectId||""})}),i=await a.json();i.success?(this.rewrittenText=i.data.rewritten_text||i.data.text,t("Text rewritten successfully","success",2e3)):t((null==(e=i.data)?void 0:e.message)||"Rewrite failed","error")}catch(a){console.error("Rewrite error:",a),t("Failed to rewrite text","error")}finally{this.rewriting=!1}}else t("Please select a tone for rewriting","error");else t("No transcription available to rewrite","error")},async saveTranscription(){var e,a;if(this.transcription){this.saving=!0;try{const i=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_save_transcription",nonce:chatprData.nonce,project_id:this.projectId||"",transcription:this.transcription,rewritten:this.rewrittenText||"",file_name:(null==(e=this.selectedFile)?void 0:e.name)||"transcription.txt",duration:this.duration||"",language:this.language||"",save_to_db:this.saveToDatabase?"1":"0"})}),s=await i.json();s.success?(t("Transcription saved successfully","success",3e3),setTimeout(()=>{this.clearFile(),this.saveToDatabase=!1,this.tone=""},1e3)):t((null==(a=s.data)?void 0:a.message)||"Failed to save transcription","error")}catch(i){console.error("Save error:",i),t("Failed to save transcription","error")}finally{this.saving=!1}}else t("No transcription available to save","error")},async saveToProject(){var e,a,i;if(!this.transcription)return void t("No transcription available to save","error");if(!this.projectId)return void t("No project selected","error");this.saving=!0;const s=this.rewrittenText||this.transcription,o=`${(null==(a=null==(e=this.selectedFile)?void 0:e.name)?void 0:a.replace(/\.[^/.]+$/,""))||"transcription"}_transcription.txt`;try{const e=new Blob([s],{type:"text/plain"}),a=new File([e],o,{type:"text/plain"}),r=new FormData;r.append("action","chatpr_upload_file"),r.append("nonce",chatprData.nonce),r.append("project_id",this.projectId),r.append("file",a);const n=await fetch(chatprData.ajax_url,{method:"POST",body:r}),l=await n.json();l.success?(t("Transcription saved to project successfully","success",3e3),setTimeout(()=>{this.clearFile(),this.tone=""},1e3)):t((null==(i=l.data)?void 0:i.message)||"Failed to save to project","error")}catch(r){console.error("Save to project error:",r),t("Failed to save to project","error")}finally{this.saving=!1}},copyText(e){navigator.clipboard.writeText(e).then(()=>{t("Copied to clipboard","success",2e3)}).catch(()=>{t("Failed to copy to clipboard","error")})},formatFileSize(e){if(!e||0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,t)*100)/100+" "+["Bytes","KB","MB","GB"][t]},formatDuration(e){if(!e)return"";return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,"0")}`},triggerFileInput(){this.$refs.fileInput.click()}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("promptLibrary",(e=null)=>({projectId:e,prompts:[],filteredPrompts:[],loading:!1,searchQuery:"",categoryFilter:"",showModal:!1,editingPrompt:null,formData:{title:"",content:"",category:"general"},saving:!1,enhancing:!1,init(){this.loadPrompts(),this.$watch("searchQuery",()=>this.filterPrompts()),this.$watch("categoryFilter",()=>this.filterPrompts())},async loadPrompts(){this.loading=!0;try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_list_prompts",nonce:chatprData.nonce,project_id:this.projectId||""})}),t=await e.json();t.success?(this.prompts=t.data.prompts||[],this.filterPrompts()):console.error("Failed to load prompts:",t.data)}catch(e){console.error("Error loading prompts:",e),t("Failed to load prompts","error")}finally{this.loading=!1}},filterPrompts(){let e=[...this.prompts];if(this.searchQuery.trim()){const t=this.searchQuery.toLowerCase();e=e.filter(e=>e.title.toLowerCase().includes(t)||e.content.toLowerCase().includes(t))}this.categoryFilter&&(e=e.filter(e=>e.category===this.categoryFilter)),this.filteredPrompts=e},openCreateModal(){this.editingPrompt=null,this.formData={title:"",content:"",category:"general"},this.showModal=!0},openEditModal(e){this.editingPrompt=e,this.formData={title:e.title,content:e.content,category:e.category||"general"},this.showModal=!0},closeModal(){this.showModal=!1,this.editingPrompt=null,this.formData={title:"",content:"",category:"general"}},async savePrompt(){var e,a;if(this.formData.title.trim())if(this.formData.content.trim()){this.saving=!0;try{const i=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_save_prompt",nonce:chatprData.nonce,project_id:this.projectId||"",prompt_id:(null==(e=this.editingPrompt)?void 0:e.id)||"",title:this.formData.title,content:this.formData.content,category:this.formData.category})}),s=await i.json();s.success?(t(this.editingPrompt?"Prompt updated successfully":"Prompt created successfully","success",2e3),this.closeModal(),this.loadPrompts()):t((null==(a=s.data)?void 0:a.message)||"Failed to save prompt","error")}catch(i){console.error("Save error:",i),t("Failed to save prompt","error")}finally{this.saving=!1}}else t("Please enter prompt content","error");else t("Please enter a title","error")},async deletePrompt(e){var a;if(confirm("Are you sure you want to delete this prompt? This action cannot be undone."))try{const i=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_prompt",nonce:chatprData.nonce,prompt_id:e,project_id:this.projectId||""})}),s=await i.json();s.success?(t("Prompt deleted successfully","success",2e3),this.prompts=this.prompts.filter(t=>t.id!==e),this.filterPrompts()):t((null==(a=s.data)?void 0:a.message)||"Failed to delete prompt","error")}catch(i){console.error("Delete error:",i),t("Failed to delete prompt","error")}},async enhancePrompt(){var e;if(this.formData.content.trim()){this.enhancing=!0;try{const a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_enhance_prompt",nonce:chatprData.nonce,prompt:this.formData.content})}),i=await a.json();i.success?(this.formData.content=i.data.enhanced||i.data.text,t("Prompt enhanced successfully","success",2e3)):t((null==(e=i.data)?void 0:e.message)||"Failed to enhance prompt","error")}catch(a){console.error("Enhance error:",a),t("Failed to enhance prompt","error")}finally{this.enhancing=!1}}else t("Please enter prompt content first","error")},usePrompt(e){navigator.clipboard.writeText(e.content).then(()=>{t("Prompt copied to clipboard","success",2e3)}).catch(()=>{t("Failed to copy prompt","error")})},getCategoryLabel:e=>({general:"General",code:"Code Generation",content:"Content Writing",analysis:"Analysis"}[e]||e),getCategoryColor(e){const t={general:"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300",code:"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300",content:"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300",analysis:"bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300"};return t[e]||t.general},extractVariables(e){const t=/\{\{(\w+)\}\}/g,a=[];let i;for(;null!==(i=t.exec(e));)a.includes(i[1])||a.push(i[1]);return a},truncateText:(e,t=150)=>e?e.length>t?e.substring(0,t)+"...":e:""}))}),window.Alpine=e,a(),s||(s=new i),window.VPTheme=s,r||(r=new o),window.VPShortcuts=r;window._alpineStarted||(window._alpineStarted=!0,e.start());
     1import{m as e}from"./alpine-core-CLFcr9yj.js";import{m as t}from"./vendor-markdown-C9lje_HT.js";import{H as a}from"./index-D3IDo2R4.js";import"./vendor-highlight-DerHs5y0.js";class s{constructor(){this.container=null,this.toasts=[],this.init()}init(){document.getElementById("vp-toast-container")?this.container=document.getElementById("vp-toast-container"):this.createContainer()}createContainer(){this.container=document.createElement("div"),this.container.id="vp-toast-container",this.container.className="fixed bottom-4 right-4 z-50 flex flex-col gap-2",document.body.appendChild(this.container)}show(e,t="info",a=5e3){this.container||this.init();const s=document.createElement("div");return s.className=this.getToastClasses(t),s.innerHTML=`\n            <div class="flex items-center gap-2">\n                ${this.getIcon(t)}\n                <span>${this.escapeHtml(e)}</span>\n            </div>\n            <button class="ml-4 text-current opacity-70 hover:opacity-100" onclick="this.parentElement.remove()">\n                <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">\n                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>\n                </svg>\n            </button>\n        `,this.container.appendChild(s),a>0&&setTimeout(()=>{s.parentElement&&(s.classList.add("opacity-0","translate-x-full"),setTimeout(()=>s.remove(),300))},a),s}getToastClasses(e){const t={success:"bg-green-500 text-white",error:"bg-red-500 text-white",warning:"bg-yellow-500 text-white",info:"bg-blue-500 text-white"};return`flex items-center justify-between px-4 py-3 rounded-lg shadow-lg transition-all duration-300 transform ${t[e]||t.info}`}getIcon(e){const t={success:'<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>',error:'<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg>',warning:'<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg>',info:'<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>'};return t[e]||t.info}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}success(e,t=5e3){return this.show(e,"success",t)}error(e,t=5e3){return this.show(e,"error",t)}warning(e,t=5e3){return this.show(e,"warning",t)}info(e,t=5e3){return this.show(e,"info",t)}}let i=null;function r(){return i||(i=new s),window.VPToast=i,i}function n(e,t="info",a=5e3){return i||r(),i.show(e,t,a)}t.setOptions({highlight:function(e,t){return t&&a.getLanguage(t)?a.highlight(e,{language:t}).value:a.highlightAuto(e).value},breaks:!0,gfm:!0}),document.addEventListener("alpine:init",()=>{window.Alpine.data("chat",(e=null,a=null,s="project")=>({projectId:e,threadId:a,mode:s,provider:"openai",model:"gpt-4o",availableProviders:[],selectedProvider:null,selectedModel:null,currentChatProvider:null,currentChatModel:null,messages:[],input:"",loading:!1,streaming:!1,currentStreamingMessage:null,abortController:null,attachedImages:[],isDragOver:!1,isProUser:"undefined"!=typeof chatprData&&chatprData.is_pro_user||!1,maxImagesPerMessage:"undefined"!=typeof chatprData&&parseInt(chatprData.max_images_per_message)||1,async init(){this.threadId&&this.loadMessages(),"general"===this.mode&&await this.loadAvailableProviders(),window.addEventListener("chatpr:chat:new",()=>{this.startNewChat()}),window.addEventListener("chatpr:chat:switch",e=>{this.switchChat(e.detail.threadId)}),this.$watch("input",()=>{this.autoResizeTextarea()})},async loadMessages(){var e;if(chatprData.nonceReady)try{await chatprData.nonceReady}catch(t){}this.loading=!0;try{const t="general"===this.mode?"chatpr_get_general_chat_history":"chatpr_load_chat_history",a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:t,nonce:chatprData.nonce,chat_id:this.threadId})}),s=await a.json();s.success?(this.messages=s.data.messages||s.data,this.scrollToBottom()):n((null==(e=s.data)?void 0:e.message)||"Failed to load messages","error")}catch(a){n("Failed to load messages","error")}finally{this.loading=!1}},async sendMessage(){const e=this.input.trim().length>0,t=this.attachedImages.length>0;if(!e&&!t||this.loading||this.streaming)return;const a=this.input.trim(),s=[...this.attachedImages];this.input="",this.attachedImages=[];const i={role:"user",content:a,timestamp:(new Date).toISOString()};s.length>0&&(i.images=s.map(e=>e.dataUrl)),this.messages.push(i),this.scrollToBottom(),await this.streamResponse(a,s)},async streamResponse(e,t=[]){if(console.log("[ChatProjects] streamResponse called, mode:",this.mode),"undefined"==typeof chatprData||!chatprData.ajax_url||!chatprData.nonce)return void n("Session expired. Please refresh the page.","error");if(console.log("[ChatProjects] chatprData check passed"),chatprData.nonceReady){console.log("[ChatProjects] Waiting for nonceReady...");try{await chatprData.nonceReady,console.log("[ChatProjects] nonceReady resolved")}catch(s){console.log("[ChatProjects] nonceReady error:",s)}}this.streaming=!0,this.abortController=new AbortController;const a={role:"assistant",content:"",timestamp:(new Date).toISOString(),streaming:!0,sources:[]};this.messages.push(a),this.currentStreamingMessage=a;try{"general"===this.mode?await this.streamGeneralChat(e,t,a):await this.streamProjectChat(e,a)}catch(i){if("AbortError"!==i.name){console.error("[ChatProjects] Stream error:",i);n(i.message&&i.message.includes("status")?"Server error: "+i.message:"Failed to get response: "+(i.message||i.name||"unknown error"),"error"),this.messages=this.messages.filter(e=>e!==a)}}finally{this.streaming=!1;const e=this.messages.findIndex(e=>e.streaming&&"assistant"===e.role);-1!==e&&(this.messages[e]={...this.messages[e],streaming:!1},this.messages=[...this.messages]),this.abortController=null}},async streamGeneralChat(e,t,a){console.log("[ChatProjects] Preparing general mode fetch...");const s={action:"chatpr_stream_general_message",nonce:chatprData.nonce,message:e,chat_id:this.threadId||"",provider:this.selectedProvider,model:this.selectedModel};console.log("[ChatProjects] Fetch params:",{action:s.action,provider:s.provider,model:s.model}),t.length>0&&(s.images_base64=JSON.stringify(t.map(e=>({dataUrl:e.dataUrl,name:e.name,type:e.type})))),console.log("[ChatProjects] About to fetch...");const i=await fetch(chatprData.ajax_url,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(s),signal:this.abortController.signal});if(console.log("[ChatProjects] Fetch completed, status:",i.status),!i.ok)throw new Error(`HTTP error! status: ${i.status}`);await this.processSSEStream(i,a),window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}})),setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}}))},2500)},async streamProjectChat(e,t){const a=await fetch(chatprData.stream_url||chatprData.ajax_url,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_stream_chat_message",nonce:chatprData.nonce,message:e,thread_id:this.threadId||"",project_id:this.projectId||""}),signal:this.abortController.signal});if(!a.ok)throw new Error(`HTTP error! status: ${a.status}`);await this.processSSEStream(a,t),window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}})),setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}}))},2500)},async processSSEStream(e,t){const a=e.body.getReader(),s=new TextDecoder;let i="",r=!1;for(;!r;){const{done:e,value:o}=await a.read();if(e)break;i+=s.decode(o,{stream:!0});const c=i.split("\n");i=c.pop()||"";for(const a of c){if(!a.trim()||!a.startsWith("data: "))continue;const e=a.slice(6);if("[DONE]"===e){r=!0;break}try{const a=JSON.parse(e);if("content"===a.type&&a.content){console.log("[ChatProjects] Received content chunk:",a.content.substring(0,50)),t.content+=a.content;const e=this.messages.findIndex(e=>e.streaming&&"assistant"===e.role);-1!==e&&(this.messages[e]={...this.messages[e],content:t.content},this.messages=[...this.messages]),this.scrollToBottom()}else if("sources"===a.type&&a.sources)t.sources=a.sources;else if("chat_id"===a.type&&a.chat_id)this.threadId=a.chat_id,window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}}));else{if("error"===a.type)return n(a.content||"An error occurred","error"),void(this.messages=this.messages.filter(e=>e!==t));if("done"===a.type){r=!0;break}}}catch(d){}}}this.currentStreamingMessage=null;const o=this.messages.findIndex(e=>e.streaming&&"assistant"===e.role);-1!==o&&(this.messages[o]={...this.messages[o],streaming:!1},this.messages=[...this.messages])},stopGeneration(){if(this.abortController){this.abortController.abort(),this.streaming=!1;const e=this.messages.findIndex(e=>e.streaming&&"assistant"===e.role);-1!==e&&(this.messages[e]={...this.messages[e],streaming:!1},this.messages=[...this.messages]),this.currentStreamingMessage=null,n("Generation stopped","info",3e3)}},async regenerateResponse(){if(this.messages.length<2)return;this.messages.pop();const e=[...this.messages].reverse().find(e=>"user"===e.role);e&&await this.streamResponse(e.content)},renderMarkdown:e=>t.parse(e),copyMessage(e){navigator.clipboard.writeText(e).then(()=>{n("Copied to clipboard","success",2e3)})},startNewChat(){this.threadId=null,this.messages=[],this.input="","general"===this.mode&&(this.currentChatProvider=null,this.currentChatModel=null)},async switchChat(e){this.threadId=e,this.messages=[],await this.loadMessages(),"general"===this.mode&&await this.loadChatMetadata()},autoResizeTextarea(){this.$nextTick(()=>{const e=this.$refs.messageInput;e&&(e.style.height="auto",e.style.height=Math.min(e.scrollHeight,200)+"px")})},scrollToBottom(){this.$nextTick(()=>{const e=this.$refs.messagesContainer;e&&(e.scrollTop=e.scrollHeight)})},handleKeydown(e){"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this.sendMessage())},handleInputFocus(){if(window.innerWidth<768){document.body.classList.add("vp-keyboard-open");const e=this.$refs.messageInput;e&&setTimeout(()=>{e.scrollIntoView({behavior:"smooth",block:"center"}),this.scrollToBottom()},300)}},handleInputBlur(){document.body.classList.remove("vp-keyboard-open")},async loadAvailableProviders(){if(chatprData.nonceReady)try{await chatprData.nonceReady}catch(e){}try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_available_providers",nonce:chatprData.nonce})}),t=await e.json();if(t.success&&(this.availableProviders=Object.entries(t.data.providers).map(([e,t])=>({id:e,name:t.name,models:t.models})),this.availableProviders.length>0)){const e=chatprData.default_provider||this.availableProviders[0].id,t=this.availableProviders.find(t=>t.id===e);this.selectedProvider=t?e:this.availableProviders[0].id;const a=this.availableProviders.find(e=>e.id===this.selectedProvider);if(a){const e=chatprData.default_model||a.models[0];this.selectedModel=a.models.includes(e)?e:a.models[0]}}}catch(t){n("Failed to load AI providers","error")}},get currentProviderModels(){const e=this.availableProviders.find(e=>e.id===this.selectedProvider);return e?e.models:[]},async handleProviderChange(){const e=this.availableProviders.find(e=>e.id===this.selectedProvider);e&&e.models.length>0&&(this.selectedModel=e.models[0]),this.threadId&&this.messages.length>0&&await this.confirmProviderSwitch()},async handleModelChange(){this.threadId&&this.messages.length>0&&await this.confirmProviderSwitch()},async confirmProviderSwitch(){var e;const t=this.currentChatProvider||this.selectedProvider,a=this.currentChatModel||this.selectedModel;if(t===this.selectedProvider&&a===this.selectedModel)return;const s=null==(e=this.availableProviders.find(e=>e.id===this.selectedProvider))?void 0:e.name;confirm(`Switching to ${s} (${this.selectedModel}) will create a new conversation. Your current chat history will be preserved in the sidebar.\n\nContinue?`)?await this.createNewChatWithProvider():(this.selectedProvider=t,this.selectedModel=a)},async createNewChatWithProvider(){var e;try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_create_general_chat",nonce:chatprData.nonce,provider:this.selectedProvider,model:this.selectedModel})}),a=await t.json();a.success?(this.threadId=a.data.chat_id,this.messages=[],this.currentChatProvider=this.selectedProvider,this.currentChatModel=this.selectedModel,window.dispatchEvent(new CustomEvent("chatpr:chat:updated",{detail:{threadId:this.threadId}})),n("New conversation created","success",2e3)):n((null==(e=a.data)?void 0:e.message)||"Failed to create conversation","error")}catch(t){n("Failed to create new conversation","error")}},async loadChatMetadata(){try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_chat_metadata",nonce:chatprData.nonce,chat_id:this.threadId})}),t=await e.json();t.success&&(this.currentChatProvider=t.data.provider,this.currentChatModel=t.data.model,this.selectedProvider=t.data.provider,this.selectedModel=t.data.model)}catch(e){}},async handleImageSelect(e){if("general"!==this.mode)return;const t=Array.from(e.target.files);await this.addImages(t),e.target.value=""},async handlePaste(e){var t;if("general"!==this.mode)return;const a=null==(t=e.clipboardData)?void 0:t.items;if(!a)return;const s=[];for(let i=0;i<a.length;i++)if(a[i].type.startsWith("image/")){const e=a[i].getAsFile();e&&s.push(e)}s.length>0&&(e.preventDefault(),await this.addImages(s))},async handleDrop(e){if("general"!==this.mode)return;this.isDragOver=!1;const t=Array.from(e.dataTransfer.files).filter(e=>e.type.startsWith("image/"));t.length>0&&await this.addImages(t)},async addImages(e){var t,a,s,i;const r=(-1===this.maxImagesPerMessage?1/0:this.maxImagesPerMessage)-this.attachedImages.length;if(r<=0)return void n((null==(t=chatprData.i18n)?void 0:t.maxImagesReached)||"Maximum images reached","warning");const o=e.slice(0,r);for(const c of o){if(!["image/jpeg","image/png","image/gif","image/webp"].includes(c.type)){n((null==(a=chatprData.i18n)?void 0:a.invalidImageType)||"Invalid image type. Allowed: JPEG, PNG, GIF, WebP.","error");continue}const e=chatprData.max_image_size||10485760;if(c.size>e){const t=Math.round(e/1048576);n(((null==(s=chatprData.i18n)?void 0:s.imageTooLarge)||"Image exceeds {size} MB limit").replace("{size}",t),"error");continue}try{const e=await this.fileToDataUrl(c);this.attachedImages.push({name:c.name,type:c.type,size:c.size,dataUrl:e})}catch(d){n((null==(i=chatprData.i18n)?void 0:i.imageProcessError)||"Failed to process image","error")}}},fileToDataUrl:e=>new Promise((t,a)=>{const s=new FileReader;s.onload=()=>t(s.result),s.onerror=()=>a(new Error("Failed to read file")),s.readAsDataURL(e)}),removeImage(e){this.attachedImages.splice(e,1)},openImageModal(e){window.open(e,"_blank")}}))});class o{constructor(){this.theme=this.getStoredTheme()||this.getSystemTheme(),this.init()}init(){this.applyTheme(this.theme),this.setupListeners()}getStoredTheme(){return localStorage.getItem("chatpr-theme")}getSystemTheme(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}applyTheme(e){const t=document.documentElement;"dark"===e?t.classList.add("dark"):t.classList.remove("dark"),this.theme=e,localStorage.setItem("chatpr-theme",e),window.dispatchEvent(new CustomEvent("chatpr:theme:changed",{detail:{theme:e}}))}toggle(){const e="dark"===this.theme?"light":"dark";return this.applyTheme(e),e}setTheme(e){"dark"!==e&&"light"!==e||this.applyTheme(e)}setupListeners(){window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{this.getStoredTheme()||this.applyTheme(e.matches?"dark":"light")})}getCurrentTheme(){return this.theme}}class d{constructor(){this.shortcuts=new Map,this.isEnabled=!0,this.init()}init(){this.registerDefaultShortcuts(),this.setupListeners()}registerDefaultShortcuts(){this.register("mod+k",()=>{this.openCommandPalette()},"Open command palette"),this.register("mod+n",()=>{window.dispatchEvent(new CustomEvent("chatpr:chat:new"))},"Start new chat"),this.register("mod+shift+l",()=>{var e;null==(e=window.VPTheme)||e.toggle()},"Toggle light/dark mode"),this.register("mod+/",()=>{const e=document.querySelector("[data-search-input]");e&&e.focus()},"Focus search"),this.register("?",()=>{this.showShortcutsModal()},"Show keyboard shortcuts"),this.register("escape",()=>{window.dispatchEvent(new CustomEvent("chatpr:modal:close"))},"Close modal/dialog")}register(e,t,a=""){this.shortcuts.set(e,{callback:t,description:a,keys:this.parseKeyCombination(e)})}parseKeyCombination(e){return e.toLowerCase().split("+").map(e=>"mod"===e?navigator.platform.includes("Mac")?"meta":"ctrl":e)}setupListeners(){document.addEventListener("keydown",e=>{if(!this.isEnabled)return;const t=["INPUT","TEXTAREA","SELECT"].includes(e.target.tagName),a=e.target.isContentEditable;if(t||a){if("Escape"===e.key)return void e.target.blur();if("?"!==e.key)return}this.shortcuts.forEach((t,a)=>{this.matchesShortcut(e,t.keys)&&(e.preventDefault(),t.callback(e))})})}matchesShortcut(e,t){const a=[];e.ctrlKey&&a.push("ctrl"),e.metaKey&&a.push("meta"),e.shiftKey&&a.push("shift"),e.altKey&&a.push("alt");const s=e.key.toLowerCase();return["control","meta","shift","alt"].includes(s)||a.push(s),a.length===t.length&&t.every(e=>a.includes(e))}openCommandPalette(){window.dispatchEvent(new CustomEvent("chatpr:command-palette:open"))}showShortcutsModal(){const e=Array.from(this.shortcuts.entries()).map(([e,t])=>({combination:this.formatCombination(e),description:t.description}));window.dispatchEvent(new CustomEvent("chatpr:shortcuts:show",{detail:{shortcuts:e}}))}formatCombination(e){const t=navigator.platform.includes("Mac");return e.replace("mod",t?"⌘":"Ctrl").replace("shift",t?"⇧":"Shift").replace("alt",t?"⌥":"Alt").replace("ctrl",t?"⌃":"Ctrl").split("+").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(t?" ":" + ")}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}unregister(e){this.shortcuts.delete(e)}getShortcuts(){return Array.from(this.shortcuts.entries()).map(([e,t])=>({combination:this.formatCombination(e),description:t.description}))}}document.addEventListener("alpine:init",()=>{window.Alpine.data("sidebar",()=>({isOpen:!0,isMobile:window.innerWidth<768,init(){this.isMobile&&(this.isOpen=!1),window.addEventListener("resize",()=>{const e=this.isMobile;this.isMobile=window.innerWidth<768,!e&&this.isMobile?this.isOpen=!1:e&&!this.isMobile&&(this.isOpen=!0)})},toggle(){this.isOpen=!this.isOpen},close(){this.isOpen=!1},open(){this.isOpen=!0}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("projectSwitcher",(e=null)=>({isOpen:!1,searchQuery:"",currentProjectId:e,projects:[],loading:!1,init(){this.loadProjects(),document.addEventListener("click",e=>{this.$el.contains(e.target)||(this.isOpen=!1)})},async loadProjects(){this.loading=!0;try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_get_projects",nonce:chatprData.nonce})}),t=await e.json();t.success&&(this.projects=t.data)}catch(e){console.error("Failed to load projects:",e)}finally{this.loading=!1}},get filteredProjects(){if(!this.searchQuery)return this.projects;const e=this.searchQuery.toLowerCase();return this.projects.filter(t=>t.title.toLowerCase().includes(e))},selectProject(e){window.location.href=`?page=chatprojects&project_id=${e}`},toggle(){this.isOpen=!this.isOpen,this.isOpen&&this.$nextTick(()=>{var e;null==(e=this.$refs.searchInput)||e.focus()})},openShareModal(){this.isOpen=!1,window.dispatchEvent(new CustomEvent("open-share-modal"))}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("modal",(e=!1)=>({isOpen:e,init(){window.addEventListener("chatpr:modal:open",e=>{var t;(null==(t=e.detail)?void 0:t.id)===this.$el.id&&this.open()}),window.addEventListener("chatpr:modal:close",()=>{this.close()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.isOpen&&this.close()})},open(){this.isOpen=!0,document.body.style.overflow="hidden",this.$nextTick(()=>{const e=this.$el.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');e.length&&e[0].focus()})},close(){this.isOpen=!1,document.body.style.overflow=""},closeOnBackdrop(e){e.target===e.currentTarget&&this.close()}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("dropdown",(e="bottom-left")=>({isOpen:!1,placement:e,init(){document.addEventListener("click",e=>{!this.$el.contains(e.target)&&this.isOpen&&(this.isOpen=!1)}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.isOpen&&(this.isOpen=!1)})},toggle(){this.isOpen=!this.isOpen},close(){this.isOpen=!1},open(){this.isOpen=!0}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("chatHistory",(e=null,t=null)=>({projectId:e,chatMode:t,chats:[],activeThreadId:null,loading:!1,editingChatId:null,editingTitle:"",init(){this.loadChatList(),window.addEventListener("chatpr:chat:updated",e=>{this.loadChatList(),e.detail&&e.detail.threadId&&(this.activeThreadId=e.detail.threadId)}),window.addEventListener("chatpr:chat:new",()=>{this.activeThreadId=null}),window.addEventListener("chatpr:chat:switch",e=>{e.detail&&e.detail.threadId&&(this.activeThreadId=e.detail.threadId)})},async loadChatList(){var e;this.loading=!0;try{const t={action:"chatpr_get_chat_list",nonce:chatprData.nonce,project_id:this.projectId||""};this.chatMode&&(t.chat_mode=this.chatMode);const a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t)}),s=await a.json();if(s.success)this.chats=s.data.chats||[];else{console.error("Failed to load chat list:",s.data);n("string"==typeof s.data?s.data:(null==(e=s.data)?void 0:e.message)||"Failed to load chat history","error")}}catch(t){console.error("Error loading chat list:",t),n("Failed to load chat history","error")}finally{this.loading=!1}},switchChat(e){this.activeThreadId=e,window.dispatchEvent(new CustomEvent("chatpr:chat:switch",{detail:{threadId:e}}))},startEditingChat(e,t){t.stopPropagation(),this.editingChatId=e.id,this.editingTitle=e.title||e.first_message||"Untitled Chat"},cancelEditing(){this.editingChatId=null,this.editingTitle=""},async saveTitle(e,t){var a;if(t.stopPropagation(),this.editingTitle.trim())try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_rename_chat",nonce:chatprData.nonce,chat_id:e,title:this.editingTitle.trim()})}),s=await t.json();if(s.success)n("Chat renamed successfully","success",2e3),this.loadChatList();else{const e="string"==typeof s.data?s.data:(null==(a=s.data)?void 0:a.message)||"Failed to rename chat";console.error("Rename failed:",e,s),n(e,"error")}}catch(s){console.error("Error renaming chat:",s),n("Failed to rename chat","error")}finally{this.cancelEditing()}else n("Chat title cannot be empty","error")},async deleteChat(e,t){var a;if(t.stopPropagation(),confirm("Are you sure you want to delete this chat? This action cannot be undone."))try{const t=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_chat",nonce:chatprData.nonce,chat_id:e})}),s=await t.json();if(s.success)n("Chat deleted successfully","success",2e3),this.activeThreadId===e&&(this.activeThreadId=null,window.dispatchEvent(new CustomEvent("chatpr:chat:new"))),this.loadChatList();else{const e="string"==typeof s.data?s.data:(null==(a=s.data)?void 0:a.message)||"Failed to delete chat";console.error("Delete failed:",e,s),n(e,"error")}}catch(s){console.error("Error deleting chat:",s),n("Failed to delete chat","error")}},formatDate(e){if(!e)return"";const t=new Date(e),a=new Date,s=Math.abs(a-t),i=Math.floor(s/864e5);return 0===i?"Today":1===i?"Yesterday":i<7?`${i} days ago`:t.toLocaleDateString()},getChatTitle:e=>e.title||e.first_message||"Untitled Chat",truncateText:(e,t=40)=>e?e.length>t?e.substring(0,t)+"...":e:"",getDateGroup(e){if(!e)return"Older";const t=new Date(e),a=new Date,s=Math.abs(a-t),i=Math.floor(s/864e5);return 0===i?"Today":1===i?"Yesterday":i<7?"Last 7 Days":i<30?"Last 30 Days":"Older"},get groupedChats(){const e={};this.chats.forEach(t=>{const a=this.getDateGroup(t.updated_at);e[a]||(e[a]=[]),e[a].push(t)});const t=[];return["Today","Yesterday","Last 7 Days","Last 30 Days","Older"].forEach(a=>{e[a]&&e[a].length>0&&t.push({name:a,chats:e[a]})}),t}}))}),document.addEventListener("alpine:init",()=>{window.Alpine.data("fileManager",(e=null)=>({projectId:e,files:[],loading:!1,uploading:!1,uploadQueue:[],selectedFiles:[],selectAll:!1,isDragging:!1,init(){this.loadFiles(),this.$watch("selectAll",e=>{this.selectedFiles=e?this.files.map(e=>e.id||e.file_id):[]}),this.$watch("selectedFiles",()=>{0===this.selectedFiles.length?this.selectAll=!1:this.selectedFiles.length===this.files.length&&this.files.length>0&&(this.selectAll=!0)})},async loadFiles(){this.loading=!0;try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_list_files",nonce:chatprData.nonce,project_id:this.projectId||""})}),t=await e.json();t.success?this.files=t.data.files||[]:console.error("Failed to load files:",t.data)}catch(e){console.error("Error loading files:",e)}finally{this.loading=!1}},handleFileSelect(e){const t=e.target.files;t&&t.length>0&&this.handleFiles(Array.from(t)),e.target.value=""},handleDrop(e){var t;e.preventDefault(),this.isDragging=!1;const a=null==(t=e.dataTransfer)?void 0:t.files;a&&a.length>0&&this.handleFiles(Array.from(a))},handleDragOver(e){e.preventDefault(),this.isDragging=!0},handleDragLeave(e){e.preventDefault(),this.isDragging=!1},handleFiles(e){e.forEach(e=>{this.validateFile(e)&&this.uploadFile(e)})},validateFile(e){if(e.size>52428800)return n(`File "${e.name}" exceeds 50MB limit`,"error"),!1;return!(!["application/pdf","text/plain","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","text/csv","application/json","text/markdown","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"].includes(e.type)&&!e.name.endsWith(".md"))||(n(`File type "${e.type}" is not allowed`,"error"),!1)},async uploadFile(e){var t;const a="upload-"+Date.now()+"-"+Math.random().toString(36).substr(2,9),s={id:a,name:e.name,progress:0,status:"uploading"};this.uploadQueue.push(s);const i=new FormData;i.append("action","chatpr_upload_file"),i.append("nonce",chatprData.nonce),i.append("project_id",this.projectId||""),i.append("file",e);try{const s=new XMLHttpRequest;s.upload.addEventListener("progress",e=>{if(e.lengthComputable){const t=e.loaded/e.total*100,s=this.uploadQueue.find(e=>e.id===a);s&&(s.progress=t)}});const r=new Promise((e,t)=>{s.onload=()=>{if(200===s.status)try{const t=JSON.parse(s.responseText);e(t)}catch(a){t(new Error("Invalid JSON response"))}else t(new Error(`HTTP ${s.status}`))},s.onerror=()=>t(new Error("Network error"))});s.open("POST",chatprData.ajax_url),s.send(i);const o=await r;if(o.success){const t=this.uploadQueue.find(e=>e.id===a);t&&(t.status="success",t.progress=100),n(`File "${e.name}" uploaded successfully`,"success",3e3),this.files.unshift(o.data.file),setTimeout(()=>{this.uploadQueue=this.uploadQueue.filter(e=>e.id!==a)},2e3)}else{const e=this.uploadQueue.find(e=>e.id===a);e&&(e.status="error");n((null==(t=o.data)?void 0:t.message)||"Failed to upload file","error"),setTimeout(()=>{this.uploadQueue=this.uploadQueue.filter(e=>e.id!==a)},3e3)}}catch(r){const t=this.uploadQueue.find(e=>e.id===a);t&&(t.status="error"),console.error("Upload error:",r),n(`Failed to upload "${e.name}"`,"error"),setTimeout(()=>{this.uploadQueue=this.uploadQueue.filter(e=>e.id!==a)},3e3)}},async deleteFile(e){var t;if(confirm("Are you sure you want to delete this file? This action cannot be undone."))try{const a=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_file",nonce:chatprData.nonce,file_id:e,project_id:this.projectId||""})}),s=await a.json();s.success?(n("File deleted successfully","success",2e3),this.files=this.files.filter(t=>(t.id||t.file_id)!==e),this.selectedFiles=this.selectedFiles.filter(t=>t!==e)):n((null==(t=s.data)?void 0:t.message)||"Failed to delete file","error")}catch(a){console.error("Error deleting file:",a),n("Failed to delete file","error")}},async bulkDeleteFiles(){const e=this.selectedFiles.length;if(0===e)return;if(!confirm(`Are you sure you want to delete ${e} file${e>1?"s":""}? This action cannot be undone.`))return;const t=[...this.selectedFiles];let a=0,s=0;for(const r of t)try{const e=await fetch(chatprData.ajax_url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({action:"chatpr_delete_file",nonce:chatprData.nonce,file_id:r,project_id:this.projectId||""})});(await e.json()).success?(a++,this.files=this.files.filter(e=>(e.id||e.file_id)!==r)):s++}catch(i){console.error("Error deleting file:",i),s++}this.selectedFiles=[],this.selectAll=!1,a>0&&n(`${a} file${a>1?"s":""} deleted successfully`,"success"),s>0&&n(`Failed to delete ${s} file${s>1?"s":""}`,"error")},formatFileSize(e){if(!e||0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,t)*100)/100+" "+["Bytes","KB","MB","GB"][t]},formatDate(e){if(!e)return"";const t=new Date(e),a=new Date,s=Math.abs(a-t),i=Math.floor(s/864e5);return 0===i?"Today at "+t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit"}):1===i?"Yesterday":i<7?`${i} days ago`:t.toLocaleDateString()},getFileId:e=>e.id||e.file_id,getFileSize:e=>e.bytes||e.size||0,getFileDate:e=>e.created_at||e.uploaded_at||"",triggerFileInput(){this.$refs.fileInput.click()}}))}),window.Alpine=e,r();let c=null;c||(c=new o),window.VPTheme=c;let l=null;l||(l=new d),window.VPShortcuts=l,window._alpineStarted||(window._alpineStarted=!0,e.start());
  • chatprojects/trunk/assets/js/pro-chat-patches.js

    r3453774 r3455209  
    261261                                                } else if (parsed.type === 'chat_id' && parsed.chat_id) {
    262262                                                    self.threadId = parsed.chat_id;
    263                                                     window.dispatchEvent(new CustomEvent('vp:chat:updated', { detail: { threadId: self.threadId } }));
     263                                                    window.dispatchEvent(new CustomEvent('chatpr:chat:updated', { detail: { threadId: self.threadId } }));
    264264                                                } else if (parsed.type === 'sources' && parsed.sources) {
    265265                                                    assistantMessage.sources = parsed.sources;
     
    271271                                                    if (parsed.title) {
    272272                                                        // Optimistic UI update: pass title directly in event
    273                                                         window.dispatchEvent(new CustomEvent('vp:chat:title-updated', {
     273                                                        window.dispatchEvent(new CustomEvent('chatpr:chat:title-updated', {
    274274                                                            detail: {
    275275                                                                chatId: parsed.chat_id,
     
    297297                                }
    298298
    299                                 window.dispatchEvent(new CustomEvent('vp:chat:updated', { detail: { threadId: self.threadId } }));
     299                                window.dispatchEvent(new CustomEvent('chatpr:chat:updated', { detail: { threadId: self.threadId } }));
    300300
    301301                            } catch (err) {
     
    327327
    328328    // Handle direct title updates from SSE (optimistic UI update)
    329     window.addEventListener('vp:chat:title-updated', function(e) {
     329    window.addEventListener('chatpr:chat:title-updated', function(e) {
    330330        if (!e.detail || !e.detail.chatId || !e.detail.title) return;
    331331
     
    352352        // Fallback: if we couldn't find the chat, trigger a full refresh
    353353        if (!found) {
    354             window.dispatchEvent(new CustomEvent('vp:chat:updated', {
     354            window.dispatchEvent(new CustomEvent('chatpr:chat:updated', {
    355355                detail: { threadId: e.detail.chatId }
    356356            }));
  • chatprojects/trunk/chatprojects.php

    r3454444 r3455209  
    44 * Plugin URI: https://chatprojects.com/chatprojects
    55 * Description: AI-powered project management with multi-provider chat support. Vector store chat with OpenAI Responses API. Chat with GPT-5, Claude, Gemini, and more using your own API keys.
    6  * Version: 1.1.0
     6 * Version: 1.1.2
    77 * Author: chatprojects.com
    88 * Author URI: https://chatprojects.com
     
    2323
    2424// Define plugin constants
    25 define('CHATPROJECTS_VERSION', '1.1.0');
     25define('CHATPROJECTS_VERSION', '1.1.2');
    2626define('CHATPROJECTS_PLUGIN_FILE', __FILE__);
    2727define('CHATPROJECTS_PLUGIN_DIR', plugin_dir_path(__FILE__));
  • chatprojects/trunk/includes/class-api-handler.php

    r3453774 r3455209  
    163163    public function upload_file($file_path, $purpose = 'assistants', $original_filename = null) {
    164164        if (!file_exists($file_path)) {
     165            if (defined('WP_DEBUG') && WP_DEBUG) {
     166                // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     167                error_log('[ChatProjects] upload_file: File not found: ' . $file_path);
     168            }
    165169            return new \WP_Error('file_not_found', __('File not found.', 'chatprojects'));
    166170        }
     
    169173
    170174        $boundary = wp_generate_password(24, false);
    171        
     175
    172176        $headers = array(
    173177            'Authorization' => 'Bearer ' . $this->api_key,
     
    177181        $file_contents = file_get_contents($file_path);
    178182        $filename = $original_filename ? $original_filename : basename($file_path);
     183
     184        if (defined('WP_DEBUG') && WP_DEBUG) {
     185            // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     186            error_log('[ChatProjects] upload_file: Starting upload - ' . $filename . ' (' . strlen($file_contents) . ' bytes)');
     187        }
     188
    179189
    180190        $body = "--{$boundary}\r\n";
     
    197207
    198208        if (is_wp_error($response)) {
     209            if (defined('WP_DEBUG') && WP_DEBUG) {
     210                // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     211                error_log('[ChatProjects] upload_file: WP_Error - ' . $response->get_error_message());
     212            }
    199213            return $response;
    200214        }
     
    206220        if ($status_code < 200 || $status_code >= 300) {
    207221            $error_message = isset($decoded['error']['message']) ? $decoded['error']['message'] : __('Unknown API error', 'chatprojects');
     222            if (defined('WP_DEBUG') && WP_DEBUG) {
     223                // phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     224                error_log('[ChatProjects] upload_file: API error ' . $status_code . ' - ' . $error_message);
     225                error_log('[ChatProjects] upload_file: Response body: ' . $body);
     226                // phpcs:enable WordPress.PHP.DevelopmentFunctions.error_log_error_log
     227            }
    208228            return new \WP_Error('api_error', $error_message, array('status' => $status_code));
     229        }
     230
     231        $file_id = isset($decoded['id']) ? $decoded['id'] : 'unknown';
     232        if (defined('WP_DEBUG') && WP_DEBUG) {
     233            // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     234            error_log('[ChatProjects] upload_file: SUCCESS - File uploaded with ID: ' . $file_id);
    209235        }
    210236
     
    368394     * @param string $instructions System instructions
    369395     * @param array  $options Additional options (max_num_results, etc.)
    370      * @param string $previous_response_id Optional previous response ID for conversation chaining
     396     * @param string $previous_response_id Previous response ID for conversation continuity
    371397     * @return array|WP_Error
    372398     */
     
    388414        );
    389415
    390         // Add previous_response_id for conversation chaining
    391         if (!empty($previous_response_id)) {
    392             $data['previous_response_id'] = $previous_response_id;
    393         }
    394 
    395416        // Add instructions if provided
    396417        if (!empty($instructions)) {
    397418            $data['instructions'] = $instructions;
     419        }
     420
     421        // Add previous response ID for conversation continuity
     422        if (!empty($previous_response_id)) {
     423            $data['previous_response_id'] = $previous_response_id;
     424            if (defined('WP_DEBUG') && WP_DEBUG) {
     425                // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     426                error_log('[ChatProjects] Including previous_response_id: ' . $previous_response_id);
     427            }
    398428        }
    399429
     
    484514     * @param string       $instructions System instructions
    485515     * @param array        $options Additional options
    486      * @return void
    487      */
    488     public function stream_response($input, $callback, $model = null, $instructions = '', $options = array()) {
     516     * @param string       $previous_response_id Previous response ID for conversation continuity
     517     * @return string|null Response ID from the API
     518     */
     519    public function stream_response($input, $callback, $model = null, $instructions = '', $options = array(), $previous_response_id = null) {
    489520        if (!$this->has_api_key()) {
    490521            $callback(array('type' => 'error', 'content' => 'OpenAI API key is not configured'));
    491             return;
     522            return null;
    492523        }
    493524
     
    510541        }
    511542
     543        // Add previous response ID for conversation continuity
     544        if (!empty($previous_response_id)) {
     545            $data['previous_response_id'] = $previous_response_id;
     546            if (defined('WP_DEBUG') && WP_DEBUG) {
     547                // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     548                error_log('[ChatProjects] Including previous_response_id: ' . $previous_response_id);
     549            }
     550        }
     551
    512552        // Merge any additional options
    513553        $data = array_merge($data, $options);
     
    517557
    518558        // Use WordPress HTTP API streaming
    519         $result = $this->make_streaming_request($url, $data, $callback, $context);
    520 
    521         // Handle streaming errors
    522         if ($result !== true) {
    523             $callback(array('type' => 'error', 'content' => $result));
    524             return;
     559        $response_id = $this->make_streaming_request($url, $data, $callback, $context);
     560
     561        // Handle streaming errors (make_streaming_request returns error strings)
     562        if (is_string($response_id) && (strpos($response_id, 'error:') !== false || strpos($response_id, 'Error:') !== false)) {
     563            $callback(array('type' => 'error', 'content' => $response_id));
     564            return null;
    525565        }
    526566
    527567        $callback(array('type' => 'done'));
     568
     569        // Return the captured response_id for conversation continuity
     570        return $response_id;
    528571    }
    529572
     
    568611     */
    569612    private function make_streaming_request( $url, $data, $callback, &$context = array() ) {
     613        // Track response_id from response.completed event
     614        $response_id = null;
     615
    570616        // Headers for WordPress HTTP API (associative array format).
    571617        $headers = array(
     
    577623        // Create SSE parser for OpenAI Responses API format.
    578624        // This parser handles file search, annotations, and content deltas.
    579         $parser = function ( $chunk, $callback, &$buffer, &$state ) use ( &$context ) {
     625        $parser = function ( $chunk, $callback, &$buffer, &$state ) use ( &$context, &$response_id ) {
    580626            $buffer .= $chunk;
    581627
     
    672718                        }
    673719                    }
     720                } elseif ( 'response.completed' === $type ) {
     721                    // Handle response completion - capture response_id for conversation continuity.
     722                    // The response.completed event has the ID in response.id
     723                    if ( isset( $decoded['response']['id'] ) ) {
     724                        $response_id = $decoded['response']['id'];
     725                        if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
     726                            // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     727                            error_log( '[ChatProjects] Captured response_id: ' . $response_id );
     728                        }
     729                    }
    674730                } elseif ( 'error' === $type ) {
    675731                    // Handle errors.
     
    681737                        )
    682738                    );
    683                 } elseif ( 'response.created' === $type ) {
    684                     // Capture response ID for conversation chaining with previous_response_id.
    685                     if ( isset( $decoded['response']['id'] ) ) {
    686                         $context['response_id'] = $decoded['response']['id'];
    687                     }
    688739                }
    689740            }
     
    703754        }
    704755
    705         return true;
     756        // Return the captured response_id for conversation continuity
     757        return $response_id;
    706758    }
    707759
     
    715767     * @param string   $instructions Optional system instructions
    716768     * @param array    $options Additional options
    717      * @param string   $previous_response_id Optional previous response ID for conversation chaining
    718      * @return string|null The response ID for conversation chaining, or null on error
     769     * @param string   $previous_response_id Previous response ID for conversation continuity
     770     * @return string|null Response ID from the API
    719771     */
    720772    public function stream_response_with_filesearch($input, $vector_store_id, $callback, $model = null, $instructions = '', $options = array(), $previous_response_id = null) {
     773        if (defined('WP_DEBUG') && WP_DEBUG) {
     774            // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     775            error_log('[ChatProjects] stream_response_with_filesearch called - VERSION 2.0 WITH FIXES');
     776        }
     777
    721778        if (!$this->has_api_key()) {
    722779            $callback(array('type' => 'error', 'content' => 'OpenAI API key is not configured'));
     
    743800        );
    744801
    745         // Add previous_response_id for conversation chaining
    746         if (!empty($previous_response_id)) {
    747             $data['previous_response_id'] = $previous_response_id;
    748         }
    749 
    750802        // Add instructions if provided
    751803        if (!empty($instructions)) {
    752804            $data['instructions'] = $instructions;
     805        }
     806
     807        // Add previous response ID for conversation continuity
     808        if (!empty($previous_response_id)) {
     809            $data['previous_response_id'] = $previous_response_id;
     810            if (defined('WP_DEBUG') && WP_DEBUG) {
     811                // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for development
     812                error_log('[ChatProjects] Including previous_response_id: ' . $previous_response_id);
     813            }
    753814        }
    754815
     
    763824
    764825        // Use WordPress HTTP API streaming
    765         $result = $this->make_streaming_request($url, $data, $callback, $context);
    766 
    767         // Handle streaming errors
    768         if ($result !== true) {
    769             $callback(array('type' => 'error', 'content' => $result));
    770             return;
     826        $response_id = $this->make_streaming_request($url, $data, $callback, $context);
     827
     828        // Handle streaming errors (make_streaming_request returns error strings)
     829        if (is_string($response_id) && (strpos($response_id, 'error:') !== false || strpos($response_id, 'Error:') !== false)) {
     830            $callback(array('type' => 'error', 'content' => $response_id));
     831            return null;
    771832        }
    772833
     
    796857        $callback(array('type' => 'done'));
    797858
    798         // Return response_id for conversation chaining
    799         return isset($context['response_id']) ? $context['response_id'] : null;
     859        // Return the captured response_id for conversation continuity
     860        return $response_id;
    800861    }
    801862}
  • chatprojects/trunk/includes/class-chat-interface.php

    r3453774 r3455209  
    272272            );
    273273
    274             // Include images from metadata if present
    275             if (!empty($message['metadata']) && isset($message['metadata']['images'])) {
    276                 $formatted_message['images'] = $message['metadata']['images'];
     274            // Include full metadata for internal use (response_id for OpenAI continuity).
     275            if (!empty($message['metadata'])) {
     276                $formatted_message['metadata'] = $message['metadata'];
     277
     278                // Also include images at top level for backward compatibility.
     279                if (isset($message['metadata']['images'])) {
     280                    $formatted_message['images'] = $message['metadata']['images'];
     281                }
    277282            }
    278283
  • chatprojects/trunk/includes/class-chatprojects.php

    r3454444 r3455209  
    123123        add_action('load-post-new.php', array($this, 'redirect_from_new_project'));
    124124
    125         // Add theme initialization script to wp_head (priority 1 to run early)
    126         add_action('wp_head', array($this, 'output_theme_init_script'), 1);
     125        // Theme initialization is handled directly in project-shell-modern.php template
     126        // add_action('wp_head', array($this, 'output_theme_init_script'), 1);
    127127    }
    128128
     
    130130     * Output theme initialization script via wp_head
    131131     * This runs before body to prevent flash of unstyled content
    132      * Uses wp_add_inline_script for WordPress guidelines compliance
     132     * Output directly (not via wp_add_inline_script) to ensure it runs IMMEDIATELY
    133133     */
    134134    public function output_theme_init_script() {
     
    138138        }
    139139
    140         // Register a placeholder script to attach the inline script to
    141         wp_register_script('chatprojects-theme-init', false, array(), CHATPROJECTS_VERSION, false);
    142         wp_enqueue_script('chatprojects-theme-init');
    143 
    144         $script = "(function() {
     140        // Output script directly in head for immediate execution (prevents FOUC)
     141        ?>
     142        <script>
     143        (function() {
    145144            var theme = localStorage.getItem('cp_theme_preference');
    146145            if (theme === 'dark') {
     
    156155            }
    157156            // If no theme set, leave as server-rendered
    158         })();";
    159 
    160         wp_add_inline_script('chatprojects-theme-init', $script);
     157        })();
     158        </script>
     159        <?php
    161160    }
    162161
  • chatprojects/trunk/includes/class-general-chat-ajax.php

    r3453774 r3455209  
    370370            $history = $chat_interface->get_general_chat_history($chat_id);
    371371            $api_messages = array();
     372            $previous_response_id = null;
     373
    372374            if (!is_wp_error($history)) {
    373375                foreach ($history as $msg) {
     
    376378                        'content' => $msg['content']
    377379                    );
     380
     381                    // For OpenAI, get the last assistant message's response_id for conversation continuity.
     382                    if ($provider_name === 'openai' && $msg['role'] === 'assistant' && !empty($msg['metadata'])) {
     383                        $metadata = is_string($msg['metadata']) ? json_decode($msg['metadata'], true) : $msg['metadata'];
     384                        if (isset($metadata['response_id'])) {
     385                            $previous_response_id = $metadata['response_id'];
     386                        }
     387                    }
    378388                }
    379389            }
     
    389399            }
    390400
     401            // Build options for provider
     402            $provider_options = array('images' => $images);
     403            if ($provider_name === 'openai' && $previous_response_id) {
     404                $provider_options['previous_response_id'] = $previous_response_id;
     405            }
     406
    391407            // Stream response from provider
    392408            $assistant_content = '';
     409            $captured_response_id = null;
     410
    393411            $provider_instance->stream_completion(
    394412                $api_messages,
    395413                $model,
    396                 function($chunk) use (&$assistant_content) {
     414                function($chunk) use (&$assistant_content, &$captured_response_id) {
    397415                    if (isset($chunk['type'])) {
    398416                        if ($chunk['type'] === 'content' && isset($chunk['content'])) {
    399417                            $assistant_content .= $chunk['content'];
     418                        }
     419                        // Capture response_id from OpenAI Responses API.
     420                        if ($chunk['type'] === 'response_id' && isset($chunk['response_id'])) {
     421                            $captured_response_id = $chunk['response_id'];
     422                            // Don't send response_id to frontend, it's internal.
     423                            return;
    400424                        }
    401425                        // Output immediately
     
    409433                    }
    410434                },
    411                 array('images' => $images)
     435                $provider_options
    412436            );
    413437
    414             // Save assistant response to database
     438            // Save assistant response to database with response_id in metadata (for OpenAI).
    415439            if (!empty($assistant_content)) {
    416                 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table requires direct query
    417                 $wpdb->insert($this->messages_table, array(
     440                $insert_data = array(
    418441                    'chat_id' => $chat_id,
    419442                    'role' => 'assistant',
    420443                    'content' => $assistant_content,
    421444                    'created_at' => current_time('mysql'),
    422                 ), array('%d', '%s', '%s', '%s'));
     445                );
     446                $insert_format = array('%d', '%s', '%s', '%s');
     447
     448                // Store response_id in metadata for OpenAI provider.
     449                if ($provider_name === 'openai' && $captured_response_id) {
     450                    $insert_data['metadata'] = wp_json_encode(array('response_id' => $captured_response_id));
     451                    $insert_format[] = '%s';
     452                }
     453
     454                // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table requires direct query
     455                $wpdb->insert($this->messages_table, $insert_data, $insert_format);
    423456            }
    424457
  • chatprojects/trunk/includes/providers/class-openai-provider.php

    r3453774 r3455209  
    122122
    123123    /**
    124      * Stream completion with callback using Chat Completions API
    125      *
    126      * Uses WordPress HTTP API with http_api_curl hook for SSE streaming.
     124     * Stream completion with callback using Responses API
     125     *
     126     * Uses the OpenAI Responses API with streaming for conversation continuity.
     127     * When previous_response_id is provided, maintains context from previous turn.
    127128     *
    128129     * @param array    $messages Array of message objects
    129130     * @param string   $model    Model identifier
    130131     * @param callable $callback Callback for each chunk
    131      * @param array    $options  Additional options
     132     * @param array    $options  Additional options (previous_response_id, instructions, etc.)
    132133     * @return void
    133134     */
     
    143144        }
    144145
    145         $url = self::API_BASE_URL . 'chat/completions';
    146 
    147         // Build request data for Chat Completions API.
     146        $url = self::API_BASE_URL . 'responses';
     147
     148        // Build request data for Responses API.
    148149        $data = array(
    149             'model'    => $model,
    150             'messages' => $this->format_messages_for_chat_api( $messages ),
    151             'stream'   => true,
    152         );
     150            'model'  => $model,
     151            'stream' => true,
     152        );
     153
     154        // If we have a previous_response_id, use it for conversation continuity
     155        // and only send the latest user message.
     156        if ( ! empty( $options['previous_response_id'] ) ) {
     157            $data['previous_response_id'] = $options['previous_response_id'];
     158            // Only send the latest user message when using previous_response_id.
     159            $latest_user_message = $this->get_latest_user_message( $messages );
     160            $data['input'] = $latest_user_message;
     161        } else {
     162            // No previous response - send full conversation history.
     163            $data['input'] = $this->format_messages_for_api( $messages );
     164        }
    153165
    154166        // Add system instructions if provided.
    155167        if ( ! empty( $options['instructions'] ) ) {
    156             array_unshift(
    157                 $data['messages'],
    158                 array(
    159                     'role'    => 'system',
    160                     'content' => $options['instructions'],
    161                 )
    162             );
     168            $data['instructions'] = $options['instructions'];
    163169        }
    164170
     
    171177
    172178        if ( isset( $options['max_tokens'] ) ) {
    173             $data['max_tokens'] = $options['max_tokens'];
    174         }
    175 
    176         // Headers for WordPress HTTP API (associative array format).
     179            $data['max_output_tokens'] = $options['max_tokens'];
     180        }
     181
     182        // Headers for WordPress HTTP API.
    177183        $headers = array(
    178184            'Authorization' => 'Bearer ' . $this->api_key,
     
    181187        );
    182188
    183         // SSE parser for OpenAI Chat Completions API format.
     189        // SSE parser for OpenAI Responses API streaming format.
    184190        $parser = function ( $chunk, $callback, &$buffer, &$state ) {
    185191            $buffer .= $chunk;
     
    190196                $buffer = substr( $buffer, $pos + 2 );
    191197
    192                 // Parse data line using regex.
    193                 if ( preg_match( '/^data: (.+)$/m', $event, $matches ) ) {
    194                     $json_data = trim( $matches[1] );
    195 
    196                     if ( '[DONE]' === $json_data ) {
    197                         continue;
     198                // Parse event type and data lines.
     199                $event_type = '';
     200                $json_data  = '';
     201
     202                foreach ( explode( "\n", $event ) as $line ) {
     203                    if ( strpos( $line, 'event: ' ) === 0 ) {
     204                        $event_type = trim( substr( $line, 7 ) );
     205                    } elseif ( strpos( $line, 'data: ' ) === 0 ) {
     206                        $json_data = trim( substr( $line, 6 ) );
    198207                    }
    199 
    200                     $parsed = json_decode( $json_data, true );
    201                     if ( $parsed && isset( $parsed['choices'][0]['delta']['content'] ) ) {
    202                         $content = $parsed['choices'][0]['delta']['content'];
    203                         $callback( array( 'type' => 'content', 'content' => $content ) );
    204                     }
     208                }
     209
     210                if ( empty( $json_data ) || '[DONE]' === $json_data ) {
     211                    continue;
     212                }
     213
     214                $parsed = json_decode( $json_data, true );
     215                if ( ! $parsed ) {
     216                    continue;
     217                }
     218
     219                // Handle different event types from Responses API.
     220                switch ( $event_type ) {
     221                    case 'response.output_text.delta':
     222                        // Text delta - stream content to user.
     223                        if ( isset( $parsed['delta'] ) ) {
     224                            $callback( array( 'type' => 'content', 'content' => $parsed['delta'] ) );
     225                        }
     226                        break;
     227
     228                    case 'response.completed':
     229                        // Response completed - capture response_id for next turn.
     230                        if ( isset( $parsed['response']['id'] ) ) {
     231                            $callback( array( 'type' => 'response_id', 'response_id' => $parsed['response']['id'] ) );
     232                        }
     233                        break;
     234
     235                    case 'error':
     236                        // API error during streaming.
     237                        $error_msg = isset( $parsed['error']['message'] ) ? $parsed['error']['message'] : __( 'Unknown streaming error', 'chatprojects' );
     238                        $callback( array( 'type' => 'error', 'content' => $error_msg ) );
     239                        break;
    205240                }
    206241            }
     
    216251
    217252        $callback( array( 'type' => 'done' ) );
     253    }
     254
     255    /**
     256     * Get the latest user message from messages array
     257     *
     258     * @param array $messages Array of message objects
     259     * @return string The content of the latest user message
     260     */
     261    private function get_latest_user_message( $messages ) {
     262        // Iterate backwards to find the last user message.
     263        for ( $i = count( $messages ) - 1; $i >= 0; $i-- ) {
     264            if ( isset( $messages[ $i ]['role'] ) && 'user' === $messages[ $i ]['role'] ) {
     265                $content = isset( $messages[ $i ]['content'] ) ? $messages[ $i ]['content'] : '';
     266
     267                // Handle vision/image content for Responses API format.
     268                if ( ! empty( $messages[ $i ]['images'] ) && is_array( $messages[ $i ]['images'] ) ) {
     269                    $content_parts = array();
     270
     271                    if ( ! empty( $content ) ) {
     272                        $content_parts[] = array(
     273                            'type' => 'input_text',
     274                            'text' => $content,
     275                        );
     276                    }
     277
     278                    foreach ( $messages[ $i ]['images'] as $image_url ) {
     279                        $content_parts[] = array(
     280                            'type'      => 'input_image',
     281                            'image_url' => $image_url,
     282                        );
     283                    }
     284
     285                    return $content_parts;
     286                }
     287
     288                return $content;
     289            }
     290        }
     291
     292        return '';
    218293    }
    219294
  • chatprojects/trunk/public/ajax-handlers.php

    r3453774 r3455209  
    683683                $message,
    684684                $vector_store_id,
    685                 function($chunk) use (&$assistant_content, &$sources) {
     685                function($chunk) use (&$assistant_content, &$sources, $chat_id) {
    686686                    if (isset($chunk['type']) && $chunk['type'] === 'content') {
    687687                        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for streaming API
     
    695695                        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for streaming API
    696696                        error_log('[ChatProjects] SSE chunk type=error message=' . ($chunk['content'] ?? ''));
     697                    } elseif (isset($chunk['type']) && $chunk['type'] === 'done') {
     698                        // Send chat_id BEFORE done event so frontend can capture it
     699                        echo 'data: ' . wp_json_encode(array('type' => 'chat_id', 'chat_id' => $chat_id)) . "\n\n";
     700                        if (function_exists('litespeed_flush')) {
     701                            litespeed_flush();
     702                        }
     703                        if (function_exists('fastcgi_finish_request')) {
     704                            fastcgi_finish_request();
     705                        }
     706                        if (ob_get_level() > 0) {
     707                            ob_flush();
     708                        }
     709                        flush();
    697710                    }
    698711
     
    810823            }
    811824
    812             // Send chat_id for frontend to track (fixes chat splitting bug)
    813             $this->send_sse_data(array(
    814                 'type' => 'chat_id',
    815                 'chat_id' => $chat_id
    816             ));
     825            // Note: chat_id is now sent in the callback before 'done' event
     826            // to ensure frontend receives it before stopping SSE parsing
    817827
    818828            // Send completion signal LAST
  • chatprojects/trunk/public/class-frontend.php

    r3454444 r3455209  
    3030        add_action('template_redirect', array($this, 'redirect_old_slugs'), 1); // Redirect old slugs first
    3131        add_action('template_redirect', array($this, 'redirect_projects_users'));
     32        add_action('template_redirect', array($this, 'disable_elementor_on_chatprojects_pages'), 5); // Disable Elementor early
     33        add_action('template_redirect', array($this, 'start_output_buffer'), 1); // Start output buffer to strip Elementor HTML
    3234        add_filter('template_include', array($this, 'load_project_template'), 999); // Very high priority to override block editor
    3335        add_filter('the_content', array($this, 'inject_project_workspace'));
     
    3537        add_shortcode('chatprojects_main', array($this, 'render_main_app'));
    3638        add_action('wp_enqueue_scripts', array($this, 'enqueue_assets'));
     39        add_action('wp_enqueue_scripts', array($this, 'dequeue_conflicting_scripts'), 999);
    3740
    3841        // Hide admin bar on ChatProjects frontend pages
     
    6871
    6972    /**
     73     * Start output buffer on ChatProjects pages to strip Elementor HTML
     74     */
     75    public function start_output_buffer() {
     76        // Check if we're on a ChatProjects page
     77        $chatpr_page = get_query_var('chatpr_page');
     78        $is_chatpr_page = !empty($chatpr_page) || is_singular('chatpr_project');
     79
     80        if (!$is_chatpr_page) {
     81            return;
     82        }
     83
     84        // Start output buffering with callback to clean Elementor content
     85        ob_start(array($this, 'clean_output_buffer'));
     86    }
     87
     88    /**
     89     * Clean Elementor HTML from output buffer
     90     */
     91    public function clean_output_buffer($buffer) {
     92        // Remove Elementor popups by finding and removing the entire div block
     93        // Elementor popups are added just before </body> tag
     94        $pattern = '/<div[^>]*data-elementor-type=["\']popup["\'][^>]*>[\s\S]*?<\/section>\s*<\/div>/i';
     95        $buffer = preg_replace($pattern, '', $buffer);
     96
     97        // Also remove any Elementor frontend wrapper divs
     98        $buffer = preg_replace('/<div[^>]*class=["\'][^"\']*elementor-location-popup[^"\']*["\'][^>]*>[\s\S]*?<\/div>/i', '', $buffer);
     99
     100        return $buffer;
     101    }
     102
     103    /**
     104     * Disable Elementor from rendering on ChatProjects pages
     105     * This runs early during template_redirect to prevent Elementor from hooking into wp_head/wp_footer
     106     */
     107    public function disable_elementor_on_chatprojects_pages() {
     108        // Check if we're on a ChatProjects page
     109        $chatpr_page = get_query_var('chatpr_page');
     110        $is_chatpr_page = !empty($chatpr_page) || is_singular('chatpr_project');
     111
     112        if (!$is_chatpr_page) {
     113            return;
     114        }
     115
     116        // Prevent Elementor from rendering any content
     117        if (class_exists('\Elementor\Plugin')) {
     118            // Tell Elementor not to run on this page
     119            add_filter('elementor/frontend/builder_content_display', '__return_false');
     120            add_filter('elementor/theme/need_override_location', '__return_false');
     121            add_filter('elementor/frontend/print_google_fonts', '__return_false');
     122        }
     123    }
     124
     125    /**
     126     * Dequeue conflicting scripts and styles from other plugins on ChatProjects pages
     127     * ChatProjects pages don't need Elementor or other page builder assets
     128     */
     129    public function dequeue_conflicting_scripts() {
     130        // Check if we're on a ChatProjects page
     131        $chatpr_page = get_query_var('chatpr_page');
     132        $is_chatpr_page = !empty($chatpr_page) || is_singular('chatpr_project');
     133
     134        if (!$is_chatpr_page) {
     135            return;
     136        }
     137
     138        // Prevent Elementor from rendering any content (popups, widgets, etc.)
     139        if (class_exists('\Elementor\Plugin')) {
     140            // Tell Elementor not to run on this page
     141            add_filter('elementor/frontend/builder_content_display', '__return_false');
     142
     143            // Prevent Elementor popups from rendering
     144            remove_action('wp_footer', 'elementor_theme_do_location');
     145
     146            // Remove all Elementor frontend actions
     147            if (isset(\Elementor\Plugin::$instance->frontend)) {
     148                remove_action('wp_head', array(\Elementor\Plugin::$instance->frontend, 'wp_head'));
     149                remove_action('wp_footer', array(\Elementor\Plugin::$instance->frontend, 'wp_footer'));
     150            }
     151        }
     152
     153        // Dequeue ALL Elementor scripts by checking registered scripts
     154        global $wp_scripts;
     155        if (isset($wp_scripts->registered)) {
     156            foreach ($wp_scripts->registered as $handle => $script) {
     157                // Check if script source contains 'elementor' or starts with 'e-' (Elementor prefix)
     158                if (isset($script->src) &&
     159                    (strpos($script->src, 'elementor') !== false ||
     160                     strpos($handle, 'elementor') === 0 ||
     161                     strpos($handle, 'e-') === 0)) {
     162                    wp_dequeue_script($handle);
     163                    wp_deregister_script($handle);
     164                }
     165            }
     166        }
     167
     168        // Dequeue ALL Elementor styles by checking registered styles
     169        global $wp_styles;
     170        if (isset($wp_styles->registered)) {
     171            foreach ($wp_styles->registered as $handle => $style) {
     172                // Check if style source contains 'elementor' or starts with 'e-' (Elementor prefix)
     173                // Also check for Font Awesome (loaded by Elementor)
     174                if (isset($style->src) &&
     175                    (strpos($style->src, 'elementor') !== false ||
     176                     strpos($handle, 'elementor') === 0 ||
     177                     strpos($handle, 'e-') === 0 ||
     178                     strpos($handle, 'font-awesome') !== false)) {
     179                    wp_dequeue_style($handle);
     180                    wp_deregister_style($handle);
     181                }
     182            }
     183        }
     184
     185        // Dequeue standalone Alpine.js from CDNs that might conflict
     186        $alpine_handles = array('alpinejs', 'alpine');
     187
     188        foreach ($alpine_handles as $handle) {
     189            if (wp_script_is($handle, 'enqueued') || wp_script_is($handle, 'registered')) {
     190                wp_dequeue_script($handle);
     191                wp_deregister_script($handle);
     192            }
     193        }
     194    }
     195
     196    /**
    70197     * Hide admin bar on ChatProjects frontend pages
    71198     *
     
    136263        }
    137264
    138         $request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
     265        $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : '';
    139266
    140267        foreach ($old_slugs as $key => $old_slug) {
     
    222349     */
    223350    private function load_projects_page() {
     351        // Check if OpenAI API key is configured (required for Projects)
     352        $openai_key = get_option('chatprojects_openai_key', '');
     353        if (empty($openai_key)) {
     354            // Redirect to admin settings page (existing notice will show)
     355            wp_safe_redirect(admin_url('admin.php?page=chatprojects-settings'));
     356            exit;
     357        }
     358
    224359        // Prevent browser caching to ensure fresh nonces and scripts
    225360        nocache_headers();
     
    246381            CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js',
    247382            array('jquery'),
    248             CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),
     383            CHATPROJECTS_VERSION . '-' . time(),
    249384            true // Load in footer
    250385        );
     
    307442            CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js',
    308443            array('jquery'),
    309             CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),
     444            CHATPROJECTS_VERSION . '-' . time(),
    310445            true
    311446        );
     
    367502            CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js',
    368503            array('jquery'),
    369             CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),
     504            CHATPROJECTS_VERSION . '-' . time(),
    370505            true
    371506        );
     
    445580            CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js',
    446581            array('jquery'),
    447             CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),
     582            CHATPROJECTS_VERSION . '-' . time(),
    448583            true
    449584        );
  • chatprojects/trunk/public/templates/chat-interface-modern.php

    r3453774 r3455209  
    6464        <div
    6565            x-show="showModelNotification"
     66            x-cloak
    6667            x-transition:enter="transition ease-out duration-200"
    6768            x-transition:enter-start="opacity-0 transform -translate-y-2"
     
    443444                            @paste="handlePaste($event)"
    444445                            <?php endif; ?>
    445                             @focus="handleInputFocus()"
    446                             @blur="handleInputBlur()"
    447446                            :disabled="streaming || loading"
    448447                            placeholder="<?php esc_attr_e('Type your message...', 'chatprojects'); ?>"
  • chatprojects/trunk/public/templates/partials/projects-panel.php

    r3453774 r3455209  
    5353        </div>
    5454        <button
    55             @click="$dispatch('vp:project:create')"
     55            @click="$dispatch('chatpr:project:create')"
    5656            style="display: flex; align-items: center; gap: 0.5rem; padding: 0.625rem 1rem; background: var(--vp-primary); color: white; border: none; border-radius: 8px; font-size: 0.875rem; font-weight: 500; cursor: pointer;"
    5757        >
     
    7676        </p>
    7777        <button
    78             @click="$dispatch('vp:project:create')"
     78            @click="$dispatch('chatpr:project:create')"
    7979            style="padding: 0.75rem 1.5rem; background: var(--vp-primary); color: white; border: none; border-radius: 8px; font-size: 0.875rem; font-weight: 500; cursor: pointer;"
    8080        >
     
    141141<div
    142142    x-data="{ showCreateModal: false }"
    143     @vp:project:create.window="showCreateModal = true"
     143    @chatpr:project:create.window="showCreateModal = true"
    144144>
    145145    <template x-if="showCreateModal">
  • chatprojects/trunk/public/templates/pro-chat.php

    r3454444 r3455209  
    2929    ?>
    3030<!DOCTYPE html>
    31 <html <?php language_attributes(); ?> class="h-full <?php echo esc_attr($dark_class); ?>">
    32 <?php
    33 // Apply theme from localStorage immediately (handles back-button cache)
    34 // Using wp_print_inline_script_tag for WordPress guidelines compliance
    35 $theme_init_script = "(function() {
    36     var storedTheme = localStorage.getItem('cp_theme_preference');
    37     var theme = storedTheme || '" . esc_js($theme_preference) . "';
    38     if (theme === 'dark') {
    39         document.documentElement.classList.add('dark');
    40     } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
    41         document.documentElement.classList.add('dark');
    42     } else {
    43         document.documentElement.classList.remove('dark');
    44     }
    45 })();";
    46 wp_print_inline_script_tag($theme_init_script, array('id' => 'chatprojects-theme-init'));
    47 ?>
     31<html <?php language_attributes(); ?> class="h-full">
    4832<head>
     33    <script id="chatprojects-theme-init">
     34    (function() {
     35        function applyTheme() {
     36            var storedTheme = localStorage.getItem('chatpr-theme');
     37            var theme = storedTheme || '<?php echo esc_js($theme_preference); ?>';
     38
     39            // Remove first to ensure clean state
     40            document.documentElement.classList.remove('dark');
     41
     42            if (theme === 'dark') {
     43                document.documentElement.classList.add('dark');
     44            } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
     45                document.documentElement.classList.add('dark');
     46            }
     47        }
     48
     49        // Apply immediately
     50        applyTheme();
     51
     52        // Reapply on pageshow (handles back-forward cache)
     53        window.addEventListener('pageshow', applyTheme);
     54    })();
     55    </script>
    4956    <meta charset="<?php bloginfo('charset'); ?>">
    5057    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover, interactive-widget=resizes-content">
     
    144151            <div class="px-4 pt-4 pb-2">
    145152                <button
    146                     @click="window.dispatchEvent(new CustomEvent('vp:chat:new')); if (window.innerWidth < 768) sidebarOpen = false"
     153                    @click="window.dispatchEvent(new CustomEvent('chatpr:chat:new')); if (window.innerWidth < 768) sidebarOpen = false"
    147154                    class="w-full flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors shadow-sm"
    148155                >
  • chatprojects/trunk/public/templates/project-shell-modern.php

    r3454444 r3455209  
    4343    ?>
    4444<!DOCTYPE html>
    45 <html <?php language_attributes(); ?> class="h-full <?php echo esc_attr($dark_class); ?>">
    46 <?php
    47 // Apply theme from localStorage immediately (handles back-button cache)
    48 // Using wp_print_inline_script_tag for WordPress guidelines compliance
    49 $theme_init_script = "(function() {
    50     var storedTheme = localStorage.getItem('cp_theme_preference');
    51     var theme = storedTheme || '" . esc_js($theme_preference) . "';
    52     if (theme === 'dark') {
    53         document.documentElement.classList.add('dark');
    54     } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
    55         document.documentElement.classList.add('dark');
    56     } else {
    57         document.documentElement.classList.remove('dark');
    58     }
    59 })();";
    60 wp_print_inline_script_tag($theme_init_script, array('id' => 'chatprojects-theme-init'));
    61 ?>
     45<html <?php language_attributes(); ?> class="h-full">
    6246<head>
     47    <script id="chatprojects-theme-init">
     48    (function() {
     49        function applyTheme() {
     50            var storedTheme = localStorage.getItem('chatpr-theme');
     51            var theme = storedTheme || '<?php echo esc_js($theme_preference); ?>';
     52
     53            // Remove first to ensure clean state
     54            document.documentElement.classList.remove('dark');
     55
     56            if (theme === 'dark') {
     57                document.documentElement.classList.add('dark');
     58            } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
     59                document.documentElement.classList.add('dark');
     60            }
     61        }
     62
     63        // Apply immediately
     64        applyTheme();
     65
     66        // Reapply on pageshow (handles back-forward cache)
     67        window.addEventListener('pageshow', applyTheme);
     68    })();
     69    </script>
    6370    <meta charset="<?php bloginfo('charset'); ?>">
    6471    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover, interactive-widget=resizes-content">
     
    271278                                                    } else if (parsed.type === "chat_id" && parsed.chat_id) {
    272279                                                        self.threadId = parsed.chat_id;
    273                                                         window.dispatchEvent(new CustomEvent("vp:chat:updated", { detail: { threadId: self.threadId } }));
     280                                                        window.dispatchEvent(new CustomEvent("chatpr:chat:updated", { detail: { threadId: self.threadId } }));
    274281                                                    } else if (parsed.type === "sources" && parsed.sources) {
    275282                                                        assistantMessage.sources = parsed.sources;
     
    280287                                                    } else if (parsed.type === "title_update" && parsed.title) {
    281288                                                        // Handle title update from SSE
    282                                                         window.dispatchEvent(new CustomEvent("vp:chat:title-updated", {
     289                                                        window.dispatchEvent(new CustomEvent("chatpr:chat:title-updated", {
    283290                                                            detail: { chatId: parsed.chat_id, title: parsed.title }
    284291                                                        }));
     
    302309                                    }
    303310
    304                                     window.dispatchEvent(new CustomEvent("vp:chat:updated", { detail: { threadId: self.threadId } }));
     311                                    window.dispatchEvent(new CustomEvent("chatpr:chat:updated", { detail: { threadId: self.threadId } }));
    305312
    306313                                } catch (err) {
     
    332339
    333340        // Handle title updates from SSE
    334         window.addEventListener("vp:chat:title-updated", function(e) {
     341        window.addEventListener("chatpr:chat:title-updated", function(e) {
    335342            if (!e.detail || !e.detail.chatId || !e.detail.title) return;
    336343            // Find Alpine chatHistory components and update them
     
    593600            <div class="px-4 pb-4">
    594601                <button
    595                     @click="$dispatch('vp-switch-to-chat'); window.dispatchEvent(new CustomEvent('vp:chat:new')); if (window.innerWidth < 768) sidebarOpen = false"
     602                    @click="$dispatch('vp-switch-to-chat'); window.dispatchEvent(new CustomEvent('chatpr:chat:new')); if (window.innerWidth < 768) sidebarOpen = false"
    596603                    class="w-full flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors"
    597604                >
  • chatprojects/trunk/public/templates/projects-list.php

    r3454444 r3455209  
    105105?>
    106106<!DOCTYPE html>
    107 <html <?php language_attributes(); ?> class="<?php echo esc_attr($theme_preference === 'dark' ? 'dark' : ''); ?>">
    108 <?php
    109 // Apply theme from localStorage immediately
    110 // Using wp_print_inline_script_tag for WordPress guidelines compliance
    111 $theme_init_script = "(function() {
    112     var theme = localStorage.getItem('cp_theme_preference') || '" . esc_js($theme_preference) . "';
    113     if (theme === 'dark') {
    114         document.documentElement.classList.add('dark');
    115     } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
    116         document.documentElement.classList.add('dark');
    117     } else {
    118         document.documentElement.classList.remove('dark');
    119     }
    120 })();";
    121 wp_print_inline_script_tag($theme_init_script, array('id' => 'chatprojects-theme-init'));
    122 ?>
     107<html <?php language_attributes(); ?>>
    123108<head>
     109    <script id="chatprojects-theme-init">
     110    (function() {
     111        function applyTheme() {
     112            var theme = localStorage.getItem('chatpr-theme') || '<?php echo esc_js($theme_preference); ?>';
     113
     114            // Remove first to ensure clean state
     115            document.documentElement.classList.remove('dark');
     116
     117            if (theme === 'dark') {
     118                document.documentElement.classList.add('dark');
     119            } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
     120                document.documentElement.classList.add('dark');
     121            }
     122        }
     123
     124        // Apply immediately
     125        applyTheme();
     126
     127        // Reapply on pageshow (handles back-forward cache)
     128        window.addEventListener('pageshow', applyTheme);
     129    })();
     130    </script>
    124131    <meta charset="<?php bloginfo('charset'); ?>">
    125132    <meta name="viewport" content="width=device-width, initial-scale=1.0">
     
    139146    $chatpr_data_script = 'var chatprData = ' . wp_json_encode($chatpr_inline_data) . ';';
    140147    wp_print_inline_script_tag($chatpr_data_script, array('id' => 'chatprojects-inline-data'));
    141 
     148    ?>
     149    <?php
     150    // Define projectsApp function EARLY in head to prevent "not defined" errors
     151    // when Alpine.js is loaded by other plugins (like Elementor) before our scripts
     152    $projects_json = wp_json_encode($all_projects);
     153    $current_user_json = wp_json_encode($current_user);
     154    $home_url = esc_url(home_url());
     155    $error_create = esc_js(__('Failed to create project.', 'chatprojects'));
     156    $error_update = esc_js(__('Failed to update project.', 'chatprojects'));
     157    $error_delete = esc_js(__('Failed to delete project.', 'chatprojects'));
     158    $error_general = esc_js(__('An error occurred. Please try again.', 'chatprojects'));
     159    ?>
     160    <script id="chatprojects-projects-app-early">
     161// Define projectsApp function before Alpine parses the page
     162function projectsApp() {
     163    // Helper to decode HTML entities
     164    const decodeHtml = (html) => {
     165        const txt = document.createElement('textarea');
     166        txt.innerHTML = html;
     167        return txt.value;
     168    };
     169
     170    const projectsData = <?php echo $projects_json; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- wp_json_encode() provides safe output for JS context ?>;
     171    const currentUser = <?php echo $current_user_json; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- wp_json_encode() provides safe output for JS context ?>;
     172    const homeUrl = '<?php echo $home_url; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_url() already applied ?>';
     173
     174    return {
     175        projects: projectsData,
     176        searchQuery: '',
     177        filterMode: 'all',
     178        sortBy: 'modified',
     179        viewMode: 'grid',
     180        sidebarOpen: false,
     181
     182        // Create Modal State
     183        createModal: {
     184            show: false,
     185            saving: false,
     186            error: '',
     187            project: {
     188                title: '',
     189                description: '',
     190                category: '',
     191                instructions: ''
     192            }
     193        },
     194
     195        // Edit Modal State
     196        editModal: {
     197            show: false,
     198            saving: false,
     199            error: '',
     200            project: {
     201                id: null,
     202                title: '',
     203                description: '',
     204                category: '',
     205                instructions: ''
     206            }
     207        },
     208
     209        // Delete Modal State
     210        deleteModal: {
     211            show: false,
     212            deleting: false,
     213            error: '',
     214            project: {
     215                id: null,
     216                title: ''
     217            }
     218        },
     219
     220        get filteredProjects() {
     221            let filtered = this.projects.map(item => {
     222                const post = item.post;
     223                const owner = item.is_owner ? currentUser : null;
     224
     225                return {
     226                    id: post.ID,
     227                    title: decodeHtml(post.post_title),
     228                    description: post.post_content,
     229                    instructions: item.instructions || '',
     230                    categories: item.categories || [],
     231                    url: homeUrl + '/chatpr_project/' + post.post_name + '/',
     232                    is_owner: item.is_owner,
     233                    owner_name: owner ? owner.display_name : 'Unknown',
     234                    message_count: item.message_count || 0,
     235                    file_count: item.file_count || 0,
     236                    shared_count: 0,
     237                    is_active: true,
     238                    created_date: new Date(post.post_date).toLocaleDateString(),
     239                    modified_date: new Date(post.post_modified).toLocaleDateString(),
     240                    _post_modified: post.post_modified,
     241                    _post_date: post.post_date
     242                };
     243            });
     244
     245            // Apply search filter
     246            if (this.searchQuery) {
     247                filtered = filtered.filter(p =>
     248                    p.title.toLowerCase().includes(this.searchQuery.toLowerCase()) ||
     249                    p.description.toLowerCase().includes(this.searchQuery.toLowerCase())
     250                );
     251            }
     252
     253            // Apply ownership filter
     254            if (this.filterMode === 'own') {
     255                filtered = filtered.filter(p => p.is_owner);
     256            } else if (this.filterMode === 'shared') {
     257                filtered = filtered.filter(p => !p.is_owner);
     258            }
     259
     260            // Apply sorting
     261            filtered.sort((a, b) => {
     262                switch (this.sortBy) {
     263                    case 'modified':
     264                        return new Date(b._post_modified) - new Date(a._post_modified);
     265                    case 'created':
     266                        return new Date(b._post_date) - new Date(a._post_date);
     267                    case 'title':
     268                        return a.title.localeCompare(b.title);
     269                    default:
     270                        return 0;
     271                }
     272            });
     273
     274            return filtered;
     275        },
     276
     277        openCreateModal() {
     278            this.createModal.project = {
     279                title: '',
     280                description: '',
     281                category: '',
     282                instructions: ''
     283            };
     284            this.createModal.error = '';
     285            this.createModal.show = true;
     286        },
     287
     288        closeCreateModal() {
     289            this.createModal.show = false;
     290            this.createModal.error = '';
     291            this.createModal.project = {
     292                title: '',
     293                description: '',
     294                category: '',
     295                instructions: ''
     296            };
     297        },
     298
     299        async createProject() {
     300            this.createModal.saving = true;
     301            this.createModal.error = '';
     302
     303            const formData = new FormData();
     304            formData.append('action', 'chatpr_create_project');
     305            formData.append('nonce', chatprAjax.nonce);
     306            formData.append('title', this.createModal.project.title);
     307            formData.append('description', this.createModal.project.description);
     308            formData.append('category', this.createModal.project.category || '');
     309            formData.append('instructions', this.createModal.project.instructions || '');
     310
     311            try {
     312                const response = await fetch(chatprAjax.ajaxUrl, {
     313                    method: 'POST',
     314                    body: formData
     315                });
     316
     317                const data = await response.json();
     318
     319                if (data.success) {
     320                    window.location.reload();
     321                } else {
     322                    this.createModal.error = data.data?.message || '<?php echo $error_create; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_js() applied ?>';
     323                }
     324            } catch (error) {
     325                this.createModal.error = '<?php echo $error_general; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_js() applied ?>';
     326            } finally {
     327                this.createModal.saving = false;
     328            }
     329        },
     330
     331        openEditModal(project) {
     332            const categoryId = (project.categories && project.categories.length > 0) ? project.categories[0].term_id : '';
     333
     334            this.editModal.project = {
     335                id: project.id,
     336                title: project.title,
     337                description: project.description,
     338                category: categoryId,
     339                instructions: project.instructions || ''
     340            };
     341            this.editModal.error = '';
     342            this.editModal.show = true;
     343        },
     344
     345        async saveProject() {
     346            this.editModal.saving = true;
     347            this.editModal.error = '';
     348
     349            const formData = new FormData();
     350            formData.append('action', 'chatpr_update_project');
     351            formData.append('nonce', chatprAjax.nonce);
     352            formData.append('project_id', this.editModal.project.id);
     353            formData.append('title', this.editModal.project.title);
     354            formData.append('description', this.editModal.project.description);
     355            formData.append('category', this.editModal.project.category || '');
     356            formData.append('instructions', this.editModal.project.instructions || '');
     357
     358            try {
     359                const response = await fetch(chatprAjax.ajaxUrl, {
     360                    method: 'POST',
     361                    body: formData
     362                });
     363
     364                const data = await response.json();
     365
     366                if (data.success) {
     367                    window.location.reload();
     368                } else {
     369                    this.editModal.error = data.data?.message || '<?php echo $error_update; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_js() applied ?>';
     370                }
     371            } catch (error) {
     372                this.editModal.error = '<?php echo $error_general; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_js() applied ?>';
     373            } finally {
     374                this.editModal.saving = false;
     375            }
     376        },
     377
     378        openDeleteModal(project) {
     379            this.deleteModal.project = {
     380                id: project.id,
     381                title: project.title
     382            };
     383            this.deleteModal.error = '';
     384            this.deleteModal.show = true;
     385        },
     386
     387        async confirmDelete() {
     388            this.deleteModal.deleting = true;
     389            this.deleteModal.error = '';
     390
     391            const formData = new FormData();
     392            formData.append('action', 'chatpr_delete_project');
     393            formData.append('nonce', chatprData.nonce);
     394            formData.append('project_id', this.deleteModal.project.id);
     395
     396            try {
     397                const response = await fetch(chatprData.ajax_url, {
     398                    method: 'POST',
     399                    body: formData
     400                });
     401
     402                const data = await response.json();
     403
     404                if (data.success) {
     405                    window.location.reload();
     406                } else {
     407                    this.deleteModal.error = data.data?.message || '<?php echo $error_delete; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_js() applied ?>';
     408                }
     409            } catch (error) {
     410                this.deleteModal.error = '<?php echo $error_general; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- esc_js() applied ?>';
     411            } finally {
     412                this.deleteModal.deleting = false;
     413            }
     414        }
     415    };
     416}
     417
     418// Also register with Alpine if it's already loaded (Elementor compatibility)
     419if (window.Alpine && typeof window.Alpine.data === 'function') {
     420    window.Alpine.data('projectsApp', projectsApp);
     421    console.log('ChatProjects: Registered projectsApp with existing Alpine instance');
     422}
     423    </script>
     424    <?php
    142425    wp_head(); // Theme init script and styles are enqueued via class-chatprojects.php
    143426    ?>
     
    8351118    })();";
    8361119    wp_print_inline_script_tag($fallback_script, array('id' => 'chatprojects-fallback-loader'));
    837     ?>
    838 
    839     <?php
    840     // Projects app script - using wp_print_inline_script_tag for WordPress compliance
    841     $projects_json = wp_json_encode($all_projects);
    842     $current_user_json = wp_json_encode($current_user);
    843     $home_url = esc_url(home_url());
    844     $error_create = esc_js(__('Failed to create project.', 'chatprojects'));
    845     $error_update = esc_js(__('Failed to update project.', 'chatprojects'));
    846     $error_delete = esc_js(__('Failed to delete project.', 'chatprojects'));
    847     $error_general = esc_js(__('An error occurred. Please try again.', 'chatprojects'));
    848 
    849     $projects_app_script = "function projectsApp() {
    850             // Helper to decode HTML entities
    851             const decodeHtml = (html) => {
    852                 const txt = document.createElement('textarea');
    853                 txt.innerHTML = html;
    854                 return txt.value;
    855             };
    856 
    857             return {
    858                 projects: {$projects_json},
    859                 searchQuery: '',
    860                 filterMode: 'all',
    861                 sortBy: 'modified',
    862                 viewMode: 'grid',
    863                 sidebarOpen: false,
    864 
    865                 // Create Modal State
    866                 createModal: {
    867                     show: false,
    868                     saving: false,
    869                     error: '',
    870                     project: {
    871                         title: '',
    872                         description: '',
    873                         category: '',
    874                         instructions: ''
    875                     }
    876                 },
    877 
    878                 // Edit Modal State
    879                 editModal: {
    880                     show: false,
    881                     saving: false,
    882                     error: '',
    883                     project: {
    884                         id: null,
    885                         title: '',
    886                         description: '',
    887                         category: '',
    888                         instructions: ''
    889                     }
    890                 },
    891 
    892                 // Delete Modal State
    893                 deleteModal: {
    894                     show: false,
    895                     deleting: false,
    896                     error: '',
    897                     project: {
    898                         id: null,
    899                         title: ''
    900                     }
    901                 },
    902 
    903                 get filteredProjects() {
    904                     let filtered = this.projects.map(item => {
    905                         const post = item.post;
    906                         const owner = item.is_owner ? {$current_user_json} : null;
    907 
    908                         return {
    909                             id: post.ID,
    910                             title: decodeHtml(post.post_title),
    911                             description: post.post_content,
    912                             instructions: item.instructions || '',
    913                             categories: item.categories || [],
    914                             url: '{$home_url}/chatpr_project/' + post.post_name + '/',
    915                             is_owner: item.is_owner,
    916                             owner_name: owner ? owner.display_name : 'Unknown',
    917                             message_count: item.message_count || 0,
    918                             file_count: item.file_count || 0,
    919                             shared_count: 0,
    920                             is_active: true,
    921                             created_date: new Date(post.post_date).toLocaleDateString(),
    922                             modified_date: new Date(post.post_modified).toLocaleDateString(),
    923                             _post_modified: post.post_modified,
    924                             _post_date: post.post_date
    925                         };
    926                     });
    927 
    928                     // Apply search filter
    929                     if (this.searchQuery) {
    930                         filtered = filtered.filter(p =>
    931                             p.title.toLowerCase().includes(this.searchQuery.toLowerCase()) ||
    932                             p.description.toLowerCase().includes(this.searchQuery.toLowerCase())
    933                         );
    934                     }
    935 
    936                     // Apply ownership filter
    937                     if (this.filterMode === 'own') {
    938                         filtered = filtered.filter(p => p.is_owner);
    939                     } else if (this.filterMode === 'shared') {
    940                         filtered = filtered.filter(p => !p.is_owner);
    941                     }
    942 
    943                     // Apply sorting
    944                     filtered.sort((a, b) => {
    945                         switch (this.sortBy) {
    946                             case 'modified':
    947                                 return new Date(b._post_modified) - new Date(a._post_modified);
    948                             case 'created':
    949                                 return new Date(b._post_date) - new Date(a._post_date);
    950                             case 'title':
    951                                 return a.title.localeCompare(b.title);
    952                             default:
    953                                 return 0;
    954                         }
    955                     });
    956 
    957                     return filtered;
    958                 },
    959 
    960                 openCreateModal() {
    961                     this.createModal.project = {
    962                         title: '',
    963                         description: '',
    964                         category: '',
    965                         instructions: ''
    966                     };
    967                     this.createModal.error = '';
    968                     this.createModal.show = true;
    969                 },
    970 
    971                 closeCreateModal() {
    972                     this.createModal.show = false;
    973                     this.createModal.error = '';
    974                     this.createModal.project = {
    975                         title: '',
    976                         description: '',
    977                         category: '',
    978                         instructions: ''
    979                     };
    980                 },
    981 
    982                 async createProject() {
    983                     this.createModal.saving = true;
    984                     this.createModal.error = '';
    985 
    986                     const formData = new FormData();
    987                     formData.append('action', 'chatpr_create_project');
    988                     formData.append('nonce', chatprAjax.nonce);
    989                     formData.append('title', this.createModal.project.title);
    990                     formData.append('description', this.createModal.project.description);
    991                     formData.append('category', this.createModal.project.category || '');
    992                     formData.append('instructions', this.createModal.project.instructions || '');
    993 
    994                     try {
    995                         const response = await fetch(chatprAjax.ajaxUrl, {
    996                             method: 'POST',
    997                             body: formData
    998                         });
    999 
    1000                         const data = await response.json();
    1001 
    1002                         if (data.success) {
    1003                             // Reload page to show new project
    1004                             window.location.reload();
    1005                         } else {
    1006                             this.createModal.error = data.data?.message || '{$error_create}';
    1007                         }
    1008                     } catch (error) {
    1009                         this.createModal.error = '{$error_general}';
    1010                     } finally {
    1011                         this.createModal.saving = false;
    1012                     }
    1013                 },
    1014 
    1015                 openEditModal(project) {
    1016                     // Get the first category ID if available
    1017                     const categoryId = (project.categories && project.categories.length > 0) ? project.categories[0].term_id : '';
    1018 
    1019                     this.editModal.project = {
    1020                         id: project.id,
    1021                         title: project.title,
    1022                         description: project.description,
    1023                         category: categoryId,
    1024                         instructions: project.instructions || ''
    1025                     };
    1026                     this.editModal.error = '';
    1027                     this.editModal.show = true;
    1028                 },
    1029 
    1030                 async saveProject() {
    1031                     this.editModal.saving = true;
    1032                     this.editModal.error = '';
    1033 
    1034                     const formData = new FormData();
    1035                     formData.append('action', 'chatpr_update_project');
    1036                     formData.append('nonce', chatprAjax.nonce);
    1037                     formData.append('project_id', this.editModal.project.id);
    1038                     formData.append('title', this.editModal.project.title);
    1039                     formData.append('description', this.editModal.project.description);
    1040                     formData.append('category', this.editModal.project.category || '');
    1041                     formData.append('instructions', this.editModal.project.instructions || '');
    1042 
    1043                     try {
    1044                         const response = await fetch(chatprAjax.ajaxUrl, {
    1045                             method: 'POST',
    1046                             body: formData
    1047                         });
    1048 
    1049                         const data = await response.json();
    1050 
    1051                         if (data.success) {
    1052                             // Reload page to reflect changes
    1053                             window.location.reload();
    1054                         } else {
    1055                             this.editModal.error = data.data?.message || '{$error_update}';
    1056                         }
    1057                     } catch (error) {
    1058                         this.editModal.error = '{$error_general}';
    1059                     } finally {
    1060                         this.editModal.saving = false;
    1061                     }
    1062                 },
    1063 
    1064                 openDeleteModal(project) {
    1065                     this.deleteModal.project = {
    1066                         id: project.id,
    1067                         title: project.title
    1068                     };
    1069                     this.deleteModal.error = '';
    1070                     this.deleteModal.show = true;
    1071                 },
    1072 
    1073                 async confirmDelete() {
    1074                     this.deleteModal.deleting = true;
    1075                     this.deleteModal.error = '';
    1076 
    1077                     const formData = new FormData();
    1078                     formData.append('action', 'chatpr_delete_project');
    1079                     formData.append('nonce', chatprData.nonce);
    1080                     formData.append('project_id', this.deleteModal.project.id);
    1081 
    1082                     try {
    1083                         const response = await fetch(chatprData.ajax_url, {
    1084                             method: 'POST',
    1085                             body: formData
    1086                         });
    1087 
    1088                         const data = await response.json();
    1089 
    1090                         if (data.success) {
    1091                             // Remove project from list
    1092                             this.projects = this.projects.filter(p => p.post.ID !== this.deleteModal.project.id);
    1093                             this.deleteModal.show = false;
    1094                         } else {
    1095                             this.deleteModal.error = data.data.message || '{$error_delete}';
    1096                         }
    1097                     } catch (error) {
    1098                         this.deleteModal.error = '{$error_general}';
    1099                     } finally {
    1100                         this.deleteModal.deleting = false;
    1101                     }
    1102                 }
    1103             }
    1104         }";
    1105     wp_print_inline_script_tag($projects_app_script, array('id' => 'chatprojects-projects-app'));
    11061120
    11071121    // Theme toggle event listener
  • chatprojects/trunk/public/templates/user-settings.php

    r3454444 r3455209  
    3636?>
    3737<!DOCTYPE html>
    38 <html <?php language_attributes(); ?> class="<?php echo $theme_preference === 'dark' ? 'dark' : ''; ?>">
    39 <?php
    40 // Apply theme from localStorage immediately (handles back-button cache)
    41 // Using wp_print_inline_script_tag for WordPress guidelines compliance
    42 $theme_init_script = "(function() {
    43     var storedTheme = localStorage.getItem('cp_theme_preference');
    44     var theme = storedTheme || '" . esc_js($theme_preference) . "';
    45     if (theme === 'dark') {
    46         document.documentElement.classList.add('dark');
    47     } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
    48         document.documentElement.classList.add('dark');
    49     } else {
    50         document.documentElement.classList.remove('dark');
    51     }
    52 })();";
    53 wp_print_inline_script_tag($theme_init_script, array('id' => 'chatprojects-theme-init'));
    54 ?>
     38<html <?php language_attributes(); ?>>
    5539<head>
     40    <script id="chatprojects-theme-init">
     41    (function() {
     42        function applyTheme() {
     43            var storedTheme = localStorage.getItem('chatpr-theme');
     44            var theme = storedTheme || '<?php echo esc_js($theme_preference); ?>';
     45
     46            // Remove first to ensure clean state
     47            document.documentElement.classList.remove('dark');
     48
     49            if (theme === 'dark') {
     50                document.documentElement.classList.add('dark');
     51            } else if (theme === 'auto' && window.matchMedia('(prefers-color-scheme:dark)').matches) {
     52                document.documentElement.classList.add('dark');
     53            }
     54        }
     55
     56        // Apply immediately
     57        applyTheme();
     58
     59        // Reapply on pageshow (handles back-forward cache)
     60        window.addEventListener('pageshow', applyTheme);
     61    })();
     62    </script>
    5663    <meta charset="<?php bloginfo('charset'); ?>">
    5764    <meta name="viewport" content="width=device-width, initial-scale=1.0">
     
    93100
    94101    <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
     102        <?php
     103        // Display error messages from URL parameters
     104        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only parameter, no data modification
     105        if (isset($_GET['error']) && sanitize_key(wp_unslash($_GET['error'])) === 'openai_key_required') :
     106        ?>
     107        <div class="mb-6 p-4 bg-amber-50 dark:bg-amber-900/20 border-l-4 border-amber-500 rounded-r-lg">
     108            <div class="flex items-start">
     109                <svg class="w-6 h-6 text-amber-600 dark:text-amber-400 mr-3 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
     110                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
     111                </svg>
     112                <div>
     113                    <h3 class="text-lg font-semibold text-amber-800 dark:text-amber-300 mb-1">
     114                        <?php esc_html_e('OpenAI API Key Required', 'chatprojects'); ?>
     115                    </h3>
     116                    <p class="text-amber-700 dark:text-amber-400">
     117                        <?php esc_html_e('Please configure your OpenAI API key below to use Projects. The API key is required for vector stores and document chat features.', 'chatprojects'); ?>
     118                    </p>
     119                </div>
     120            </div>
     121        </div>
     122        <?php endif; ?>
     123
    95124        <div class="grid grid-cols-12 gap-8">
    96125            <!-- Sidebar Navigation -->
     
    165194                            <!-- Hidden input outside Alpine scope for reliable form submission -->
    166195                            <input type="hidden" name="theme_preference" id="theme_preference_input" value="<?php echo esc_attr($theme_preference); ?>">
    167                             <div class="flex gap-3" x-data="{ theme: localStorage.getItem('cp_theme_preference') || '<?php echo esc_js($theme_preference); ?>' }" x-init="document.getElementById('theme_preference_input').value = theme">
     196                            <div class="flex gap-3" x-data="{ theme: localStorage.getItem('chatpr-theme') || '<?php echo esc_js($theme_preference); ?>' }" x-init="document.getElementById('theme_preference_input').value = theme">
    168197                                <div
    169198                                    @click="theme = 'light'; document.getElementById('theme_preference_input').value = 'light'; $dispatch('theme-changed', 'light')"
  • chatprojects/trunk/readme.txt

    r3454444 r3455209  
    66Tested up to: 6.9
    77Requires PHP: 7.4
    8 Stable tag: 1.1.0
     8Stable tag: 1.1.2
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    122122== Changelog ==
    123123
     124= 1.1.2 =
     125* Fixed Elementor CSS conflicts causing invisible dark/light toggle button
     126* Fixed Elementor popup/form HTML rendering on ChatProjects pages
     127* Improved button hover colors and styles
     128* Added comprehensive Elementor asset blocking on ChatProjects pages
     129* Better plugin compatibility with page builders
     130
     131= 1.1.1 =
     132* Fixed Alpine.js initialization timing issue that prevented UI components from loading
     133* Improved JavaScript module loading reliability
     134
    124135= 1.1.0 =
    125136* **IMPORTANT:** Changed plugin URLs to prevent conflicts with existing WordPress pages
Note: See TracChangeset for help on using the changeset viewer.