Changeset 3455209
- Timestamp:
- 02/06/2026 08:24:58 AM (8 weeks ago)
- Location:
- chatprojects/trunk
- Files:
-
- 22 edited
-
admin/class-settings.php (modified) (1 diff)
-
assets/dist/css/admin.css (modified) (1 diff)
-
assets/dist/css/main.css (modified) (2 diffs)
-
assets/dist/js/admin.js (modified) (1 diff)
-
assets/dist/js/chat.js (modified) (1 diff)
-
assets/dist/js/main.js (modified) (1 diff)
-
assets/js/pro-chat-patches.js (modified) (5 diffs)
-
chatprojects.php (modified) (2 diffs)
-
includes/class-api-handler.php (modified) (19 diffs)
-
includes/class-chat-interface.php (modified) (1 diff)
-
includes/class-chatprojects.php (modified) (4 diffs)
-
includes/class-general-chat-ajax.php (modified) (4 diffs)
-
includes/providers/class-openai-provider.php (modified) (6 diffs)
-
public/ajax-handlers.php (modified) (3 diffs)
-
public/class-frontend.php (modified) (9 diffs)
-
public/templates/chat-interface-modern.php (modified) (2 diffs)
-
public/templates/partials/projects-panel.php (modified) (3 diffs)
-
public/templates/pro-chat.php (modified) (2 diffs)
-
public/templates/project-shell-modern.php (modified) (6 diffs)
-
public/templates/projects-list.php (modified) (3 diffs)
-
public/templates/user-settings.php (modified) (3 diffs)
-
readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
chatprojects/trunk/admin/class-settings.php
r3453774 r3455209 852 852 if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] ) ) === 'chatprojects-settings' ) { 853 853 $api_key = get_option('chatprojects_openai_key', ''); 854 854 855 855 if (empty($api_key)) { 856 856 ?> -
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 5 8 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.1 8| MIT License | https://tailwindcss.com2 */*,: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}/*! 3 3 Theme: GitHub Dark 4 4 Description: Dark theme as seen on github.com … … 9 9 Outdated base version: https://github.com/primer/github-syntax-dark 10 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}.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)})});1 import{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")}}))});1 import{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());1 import{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 261 261 } else if (parsed.type === 'chat_id' && parsed.chat_id) { 262 262 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 } })); 264 264 } else if (parsed.type === 'sources' && parsed.sources) { 265 265 assistantMessage.sources = parsed.sources; … … 271 271 if (parsed.title) { 272 272 // 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', { 274 274 detail: { 275 275 chatId: parsed.chat_id, … … 297 297 } 298 298 299 window.dispatchEvent(new CustomEvent(' vp:chat:updated', { detail: { threadId: self.threadId } }));299 window.dispatchEvent(new CustomEvent('chatpr:chat:updated', { detail: { threadId: self.threadId } })); 300 300 301 301 } catch (err) { … … 327 327 328 328 // 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) { 330 330 if (!e.detail || !e.detail.chatId || !e.detail.title) return; 331 331 … … 352 352 // Fallback: if we couldn't find the chat, trigger a full refresh 353 353 if (!found) { 354 window.dispatchEvent(new CustomEvent(' vp:chat:updated', {354 window.dispatchEvent(new CustomEvent('chatpr:chat:updated', { 355 355 detail: { threadId: e.detail.chatId } 356 356 })); -
chatprojects/trunk/chatprojects.php
r3454444 r3455209 4 4 * Plugin URI: https://chatprojects.com/chatprojects 5 5 * 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. 06 * Version: 1.1.2 7 7 * Author: chatprojects.com 8 8 * Author URI: https://chatprojects.com … … 23 23 24 24 // Define plugin constants 25 define('CHATPROJECTS_VERSION', '1.1. 0');25 define('CHATPROJECTS_VERSION', '1.1.2'); 26 26 define('CHATPROJECTS_PLUGIN_FILE', __FILE__); 27 27 define('CHATPROJECTS_PLUGIN_DIR', plugin_dir_path(__FILE__)); -
chatprojects/trunk/includes/class-api-handler.php
r3453774 r3455209 163 163 public function upload_file($file_path, $purpose = 'assistants', $original_filename = null) { 164 164 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 } 165 169 return new \WP_Error('file_not_found', __('File not found.', 'chatprojects')); 166 170 } … … 169 173 170 174 $boundary = wp_generate_password(24, false); 171 175 172 176 $headers = array( 173 177 'Authorization' => 'Bearer ' . $this->api_key, … … 177 181 $file_contents = file_get_contents($file_path); 178 182 $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 179 189 180 190 $body = "--{$boundary}\r\n"; … … 197 207 198 208 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 } 199 213 return $response; 200 214 } … … 206 220 if ($status_code < 200 || $status_code >= 300) { 207 221 $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 } 208 228 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); 209 235 } 210 236 … … 368 394 * @param string $instructions System instructions 369 395 * @param array $options Additional options (max_num_results, etc.) 370 * @param string $previous_response_id Optional previous response ID for conversation chaining396 * @param string $previous_response_id Previous response ID for conversation continuity 371 397 * @return array|WP_Error 372 398 */ … … 388 414 ); 389 415 390 // Add previous_response_id for conversation chaining391 if (!empty($previous_response_id)) {392 $data['previous_response_id'] = $previous_response_id;393 }394 395 416 // Add instructions if provided 396 417 if (!empty($instructions)) { 397 418 $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 } 398 428 } 399 429 … … 484 514 * @param string $instructions System instructions 485 515 * @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) { 489 520 if (!$this->has_api_key()) { 490 521 $callback(array('type' => 'error', 'content' => 'OpenAI API key is not configured')); 491 return ;522 return null; 492 523 } 493 524 … … 510 541 } 511 542 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 512 552 // Merge any additional options 513 553 $data = array_merge($data, $options); … … 517 557 518 558 // Use WordPress HTTP API streaming 519 $res ult= $this->make_streaming_request($url, $data, $callback, $context);520 521 // Handle streaming errors 522 if ( $result !== true) {523 $callback(array('type' => 'error', 'content' => $res ult));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; 525 565 } 526 566 527 567 $callback(array('type' => 'done')); 568 569 // Return the captured response_id for conversation continuity 570 return $response_id; 528 571 } 529 572 … … 568 611 */ 569 612 private function make_streaming_request( $url, $data, $callback, &$context = array() ) { 613 // Track response_id from response.completed event 614 $response_id = null; 615 570 616 // Headers for WordPress HTTP API (associative array format). 571 617 $headers = array( … … 577 623 // Create SSE parser for OpenAI Responses API format. 578 624 // 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 ) { 580 626 $buffer .= $chunk; 581 627 … … 672 718 } 673 719 } 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 } 674 730 } elseif ( 'error' === $type ) { 675 731 // Handle errors. … … 681 737 ) 682 738 ); 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 }688 739 } 689 740 } … … 703 754 } 704 755 705 return true; 756 // Return the captured response_id for conversation continuity 757 return $response_id; 706 758 } 707 759 … … 715 767 * @param string $instructions Optional system instructions 716 768 * @param array $options Additional options 717 * @param string $previous_response_id Optional previous response ID for conversation chaining718 * @return string|null The response ID for conversation chaining, or null on error769 * @param string $previous_response_id Previous response ID for conversation continuity 770 * @return string|null Response ID from the API 719 771 */ 720 772 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 721 778 if (!$this->has_api_key()) { 722 779 $callback(array('type' => 'error', 'content' => 'OpenAI API key is not configured')); … … 743 800 ); 744 801 745 // Add previous_response_id for conversation chaining746 if (!empty($previous_response_id)) {747 $data['previous_response_id'] = $previous_response_id;748 }749 750 802 // Add instructions if provided 751 803 if (!empty($instructions)) { 752 804 $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 } 753 814 } 754 815 … … 763 824 764 825 // Use WordPress HTTP API streaming 765 $res ult= $this->make_streaming_request($url, $data, $callback, $context);766 767 // Handle streaming errors 768 if ( $result !== true) {769 $callback(array('type' => 'error', 'content' => $res ult));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; 771 832 } 772 833 … … 796 857 $callback(array('type' => 'done')); 797 858 798 // Return response_id for conversation chaining799 return isset($context['response_id']) ? $context['response_id'] : null;859 // Return the captured response_id for conversation continuity 860 return $response_id; 800 861 } 801 862 } -
chatprojects/trunk/includes/class-chat-interface.php
r3453774 r3455209 272 272 ); 273 273 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 } 277 282 } 278 283 -
chatprojects/trunk/includes/class-chatprojects.php
r3454444 r3455209 123 123 add_action('load-post-new.php', array($this, 'redirect_from_new_project')); 124 124 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); 127 127 } 128 128 … … 130 130 * Output theme initialization script via wp_head 131 131 * This runs before body to prevent flash of unstyled content 132 * Uses wp_add_inline_script for WordPress guidelines compliance132 * Output directly (not via wp_add_inline_script) to ensure it runs IMMEDIATELY 133 133 */ 134 134 public function output_theme_init_script() { … … 138 138 } 139 139 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() { 145 144 var theme = localStorage.getItem('cp_theme_preference'); 146 145 if (theme === 'dark') { … … 156 155 } 157 156 // If no theme set, leave as server-rendered 158 })(); ";159 160 wp_add_inline_script('chatprojects-theme-init', $script);157 })(); 158 </script> 159 <?php 161 160 } 162 161 -
chatprojects/trunk/includes/class-general-chat-ajax.php
r3453774 r3455209 370 370 $history = $chat_interface->get_general_chat_history($chat_id); 371 371 $api_messages = array(); 372 $previous_response_id = null; 373 372 374 if (!is_wp_error($history)) { 373 375 foreach ($history as $msg) { … … 376 378 'content' => $msg['content'] 377 379 ); 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 } 378 388 } 379 389 } … … 389 399 } 390 400 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 391 407 // Stream response from provider 392 408 $assistant_content = ''; 409 $captured_response_id = null; 410 393 411 $provider_instance->stream_completion( 394 412 $api_messages, 395 413 $model, 396 function($chunk) use (&$assistant_content ) {414 function($chunk) use (&$assistant_content, &$captured_response_id) { 397 415 if (isset($chunk['type'])) { 398 416 if ($chunk['type'] === 'content' && isset($chunk['content'])) { 399 417 $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; 400 424 } 401 425 // Output immediately … … 409 433 } 410 434 }, 411 array('images' => $images)435 $provider_options 412 436 ); 413 437 414 // Save assistant response to database 438 // Save assistant response to database with response_id in metadata (for OpenAI). 415 439 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( 418 441 'chat_id' => $chat_id, 419 442 'role' => 'assistant', 420 443 'content' => $assistant_content, 421 444 '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); 423 456 } 424 457 -
chatprojects/trunk/includes/providers/class-openai-provider.php
r3453774 r3455209 122 122 123 123 /** 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. 127 128 * 128 129 * @param array $messages Array of message objects 129 130 * @param string $model Model identifier 130 131 * @param callable $callback Callback for each chunk 131 * @param array $options Additional options 132 * @param array $options Additional options (previous_response_id, instructions, etc.) 132 133 * @return void 133 134 */ … … 143 144 } 144 145 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. 148 149 $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 } 153 165 154 166 // Add system instructions if provided. 155 167 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']; 163 169 } 164 170 … … 171 177 172 178 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. 177 183 $headers = array( 178 184 'Authorization' => 'Bearer ' . $this->api_key, … … 181 187 ); 182 188 183 // SSE parser for OpenAI Chat Completions APIformat.189 // SSE parser for OpenAI Responses API streaming format. 184 190 $parser = function ( $chunk, $callback, &$buffer, &$state ) { 185 191 $buffer .= $chunk; … … 190 196 $buffer = substr( $buffer, $pos + 2 ); 191 197 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 ) ); 198 207 } 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; 205 240 } 206 241 } … … 216 251 217 252 $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 ''; 218 293 } 219 294 -
chatprojects/trunk/public/ajax-handlers.php
r3453774 r3455209 683 683 $message, 684 684 $vector_store_id, 685 function($chunk) use (&$assistant_content, &$sources ) {685 function($chunk) use (&$assistant_content, &$sources, $chat_id) { 686 686 if (isset($chunk['type']) && $chunk['type'] === 'content') { 687 687 // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for streaming API … … 695 695 // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Debug logging for streaming API 696 696 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(); 697 710 } 698 711 … … 810 823 } 811 824 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 817 827 818 828 // Send completion signal LAST -
chatprojects/trunk/public/class-frontend.php
r3454444 r3455209 30 30 add_action('template_redirect', array($this, 'redirect_old_slugs'), 1); // Redirect old slugs first 31 31 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 32 34 add_filter('template_include', array($this, 'load_project_template'), 999); // Very high priority to override block editor 33 35 add_filter('the_content', array($this, 'inject_project_workspace')); … … 35 37 add_shortcode('chatprojects_main', array($this, 'render_main_app')); 36 38 add_action('wp_enqueue_scripts', array($this, 'enqueue_assets')); 39 add_action('wp_enqueue_scripts', array($this, 'dequeue_conflicting_scripts'), 999); 37 40 38 41 // Hide admin bar on ChatProjects frontend pages … … 68 71 69 72 /** 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 /** 70 197 * Hide admin bar on ChatProjects frontend pages 71 198 * … … 136 263 } 137 264 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'])) : ''; 139 266 140 267 foreach ($old_slugs as $key => $old_slug) { … … 222 349 */ 223 350 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 224 359 // Prevent browser caching to ensure fresh nonces and scripts 225 360 nocache_headers(); … … 246 381 CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js', 247 382 array('jquery'), 248 CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),383 CHATPROJECTS_VERSION . '-' . time(), 249 384 true // Load in footer 250 385 ); … … 307 442 CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js', 308 443 array('jquery'), 309 CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),444 CHATPROJECTS_VERSION . '-' . time(), 310 445 true 311 446 ); … … 367 502 CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js', 368 503 array('jquery'), 369 CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),504 CHATPROJECTS_VERSION . '-' . time(), 370 505 true 371 506 ); … … 445 580 CHATPROJECTS_PLUGIN_URL . 'assets/dist/js/main.js', 446 581 array('jquery'), 447 CHATPROJECTS_VERSION . '-' . filemtime(CHATPROJECTS_PLUGIN_DIR . 'assets/dist/js/main.js'),582 CHATPROJECTS_VERSION . '-' . time(), 448 583 true 449 584 ); -
chatprojects/trunk/public/templates/chat-interface-modern.php
r3453774 r3455209 64 64 <div 65 65 x-show="showModelNotification" 66 x-cloak 66 67 x-transition:enter="transition ease-out duration-200" 67 68 x-transition:enter-start="opacity-0 transform -translate-y-2" … … 443 444 @paste="handlePaste($event)" 444 445 <?php endif; ?> 445 @focus="handleInputFocus()"446 @blur="handleInputBlur()"447 446 :disabled="streaming || loading" 448 447 placeholder="<?php esc_attr_e('Type your message...', 'chatprojects'); ?>" -
chatprojects/trunk/public/templates/partials/projects-panel.php
r3453774 r3455209 53 53 </div> 54 54 <button 55 @click="$dispatch(' vp:project:create')"55 @click="$dispatch('chatpr:project:create')" 56 56 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;" 57 57 > … … 76 76 </p> 77 77 <button 78 @click="$dispatch(' vp:project:create')"78 @click="$dispatch('chatpr:project:create')" 79 79 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;" 80 80 > … … 141 141 <div 142 142 x-data="{ showCreateModal: false }" 143 @ vp:project:create.window="showCreateModal = true"143 @chatpr:project:create.window="showCreateModal = true" 144 144 > 145 145 <template x-if="showCreateModal"> -
chatprojects/trunk/public/templates/pro-chat.php
r3454444 r3455209 29 29 ?> 30 30 <!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"> 48 32 <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> 49 56 <meta charset="<?php bloginfo('charset'); ?>"> 50 57 <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"> … … 144 151 <div class="px-4 pt-4 pb-2"> 145 152 <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" 147 154 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" 148 155 > -
chatprojects/trunk/public/templates/project-shell-modern.php
r3454444 r3455209 43 43 ?> 44 44 <!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"> 62 46 <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> 63 70 <meta charset="<?php bloginfo('charset'); ?>"> 64 71 <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"> … … 271 278 } else if (parsed.type === "chat_id" && parsed.chat_id) { 272 279 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 } })); 274 281 } else if (parsed.type === "sources" && parsed.sources) { 275 282 assistantMessage.sources = parsed.sources; … … 280 287 } else if (parsed.type === "title_update" && parsed.title) { 281 288 // Handle title update from SSE 282 window.dispatchEvent(new CustomEvent(" vp:chat:title-updated", {289 window.dispatchEvent(new CustomEvent("chatpr:chat:title-updated", { 283 290 detail: { chatId: parsed.chat_id, title: parsed.title } 284 291 })); … … 302 309 } 303 310 304 window.dispatchEvent(new CustomEvent(" vp:chat:updated", { detail: { threadId: self.threadId } }));311 window.dispatchEvent(new CustomEvent("chatpr:chat:updated", { detail: { threadId: self.threadId } })); 305 312 306 313 } catch (err) { … … 332 339 333 340 // Handle title updates from SSE 334 window.addEventListener(" vp:chat:title-updated", function(e) {341 window.addEventListener("chatpr:chat:title-updated", function(e) { 335 342 if (!e.detail || !e.detail.chatId || !e.detail.title) return; 336 343 // Find Alpine chatHistory components and update them … … 593 600 <div class="px-4 pb-4"> 594 601 <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" 596 603 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" 597 604 > -
chatprojects/trunk/public/templates/projects-list.php
r3454444 r3455209 105 105 ?> 106 106 <!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(); ?>> 123 108 <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> 124 131 <meta charset="<?php bloginfo('charset'); ?>"> 125 132 <meta name="viewport" content="width=device-width, initial-scale=1.0"> … … 139 146 $chatpr_data_script = 'var chatprData = ' . wp_json_encode($chatpr_inline_data) . ';'; 140 147 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 162 function 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) 419 if (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 142 425 wp_head(); // Theme init script and styles are enqueued via class-chatprojects.php 143 426 ?> … … 835 1118 })();"; 836 1119 wp_print_inline_script_tag($fallback_script, array('id' => 'chatprojects-fallback-loader')); 837 ?>838 839 <?php840 // Projects app script - using wp_print_inline_script_tag for WordPress compliance841 $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 entities851 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 State866 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 State879 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 State893 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_date925 };926 });927 928 // Apply search filter929 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 filter937 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 sorting944 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: formData998 });999 1000 const data = await response.json();1001 1002 if (data.success) {1003 // Reload page to show new project1004 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 available1017 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: formData1047 });1048 1049 const data = await response.json();1050 1051 if (data.success) {1052 // Reload page to reflect changes1053 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.title1068 };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: formData1086 });1087 1088 const data = await response.json();1089 1090 if (data.success) {1091 // Remove project from list1092 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'));1106 1120 1107 1121 // Theme toggle event listener -
chatprojects/trunk/public/templates/user-settings.php
r3454444 r3455209 36 36 ?> 37 37 <!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(); ?>> 55 39 <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> 56 63 <meta charset="<?php bloginfo('charset'); ?>"> 57 64 <meta name="viewport" content="width=device-width, initial-scale=1.0"> … … 93 100 94 101 <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 95 124 <div class="grid grid-cols-12 gap-8"> 96 125 <!-- Sidebar Navigation --> … … 165 194 <!-- Hidden input outside Alpine scope for reliable form submission --> 166 195 <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('c p_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"> 168 197 <div 169 198 @click="theme = 'light'; document.getElementById('theme_preference_input').value = 'light'; $dispatch('theme-changed', 'light')" -
chatprojects/trunk/readme.txt
r3454444 r3455209 6 6 Tested up to: 6.9 7 7 Requires PHP: 7.4 8 Stable tag: 1.1. 08 Stable tag: 1.1.2 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 122 122 == Changelog == 123 123 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 124 135 = 1.1.0 = 125 136 * **IMPORTANT:** Changed plugin URLs to prevent conflicts with existing WordPress pages
Note: See TracChangeset
for help on using the changeset viewer.