@tombcato/ai-selector-vue 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";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:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,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}.apmsu-root{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;margin-left:auto;margin-right:auto;box-sizing:border-box}.apmsu-btn{display:inline-flex;height:2.5rem;align-items:center;justify-content:center;border-radius:.375rem;padding:.5rem 1rem;font-size:.75rem;line-height:1rem;font-weight:500;--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);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.apmsu-btn: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-offset-width: 2px}.apmsu-btn:disabled{pointer-events:none;opacity:.5}.apmsu-btn-primary{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.apmsu-btn-primary:hover{background-color:#18181be6}.apmsu-btn-primary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.apmsu-btn-primary:hover:is(.dark *){background-color:#fafafae6}.apmsu-btn-success{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.apmsu-btn-success:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.apmsu-btn-ghost{background-color:transparent;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.apmsu-btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.apmsu-btn-ghost:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.apmsu-btn-ghost:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.apmsu-input{display:flex;height:2.75rem;width:100%;border-radius:.5rem;border-width:1px;background-color:#f3f4f64d;padding:.625rem 1rem;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);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.apmsu-input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-input::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-input:focus{outline:2px solid transparent;outline-offset:2px}.apmsu-input:is(.dark *){background-color:#27272a80}.apmsu-input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-input-default{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.apmsu-input-default:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.apmsu-input-default:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.apmsu-input-default:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.apmsu-input-default:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.apmsu-input-default:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.apmsu-input-default{border-width:1px}.apmsu-input-error{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.apmsu-input-error:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.apmsu-input-error:is(.dark *){border-color:#ef444480;background-color:#ef44440d}.apmsu-input-error{border-width:1px}.apmsu-input-success{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.apmsu-input-success:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.apmsu-input-success:is(.dark *){border-color:#22c55e80;background-color:#22c55e0d}.apmsu-input-success{border-width:1px}.apmsu-select-trigger{display:flex;height:2.75rem;width:100%;min-width:0px;align-items:center;justify-content:space-between;white-space:nowrap;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));background-color:#f3f4f633;padding:.625rem 1rem;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);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.apmsu-select-trigger:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.apmsu-select-trigger:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px}.apmsu-select-trigger:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1));background-color:#27272a80}.apmsu-select-trigger:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.apmsu-select-trigger:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.apmsu-select-trigger{border-width:1px}.apmsu-dropdown{position:absolute;z-index:50;margin-top:.25rem;width:100%;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--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)}.apmsu-dropdown:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.apmsu-dropdown{border-width:1px;max-height:0;opacity:0;transform-origin:top;transform:translateY(-8px) scale(.98);pointer-events:none;visibility:hidden;transition:max-height .4s cubic-bezier(.2,.8,.2,1),opacity .3s cubic-bezier(.2,.8,.2,1),transform .4s cubic-bezier(.2,.8,.2,1),visibility 0s linear .4s}.apmsu-dropdown-open{max-height:480px;opacity:1;transform:translateY(0) scale(1);pointer-events:auto;visibility:visible;transition-delay:0s}.apmsu-dropdown-item{display:flex;width:100%;cursor:pointer;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.apmsu-dropdown-item:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.apmsu-dropdown-item:active{--tw-scale-x: .98;--tw-scale-y: .98;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))}.apmsu-dropdown-item:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.apmsu-dropdown-item{background:transparent;border:none;text-align:left}.apmsu-dropdown-item-active{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.apmsu-dropdown-item-active:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.apmsu-label{margin-bottom:.5rem;display:block;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;line-height:1;letter-spacing:.05em;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.apmsu-label:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-error-text{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.apmsu-error-text:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.apmsu-hint-text{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-hint-text:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-success-text{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.apmsu-success-text:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.apmsu-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.apmsu-card{border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1.5rem;--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)}.apmsu-card:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.apmsu-card{border-width:1px}.apmsu-icon-spin{height:1rem;width:1rem}.apmsu-icon-spin{animation:spin 1s linear infinite;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-icon-success{height:1rem;width:1rem;--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.apmsu-icon-error{height:1rem;width:1rem;--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.apmsu-provider-icon{height:1rem;width:1rem;flex-shrink:0}.apmsu-chevron{height:1rem;width:1rem;flex-shrink:0;opacity:.5;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.apmsu-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-placeholder:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-field>: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))}.apmsu-divider{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.apmsu-divider:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.relative{position:relative}.right-3{right:.75rem}.top-1\/2{top:50%}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-6{margin-top:1.5rem}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-80{height:20rem}.h-full{height:100%}.max-h-0{max-height:0px}.max-h-60{max-height:15rem}.max-h-\[1000px\]{max-height:1000px}.max-h-\[300px\]{max-height:300px}.min-h-\[20px\]{min-height:20px}.min-h-screen{min-height:100vh}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-\[80\%\]{max-width:80%}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.origin-top{transform-origin:top}.-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))}.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))}.rotate-90{--tw-rotate: 90deg;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 bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.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}.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-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-bl-md{border-bottom-left-radius:.375rem}.rounded-br-md{border-bottom-right-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.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-200\/50{border-color:#e5e7eb80}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-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-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-100\/20{background-color:#f3f4f633}.bg-gray-100\/30{background-color:#f3f4f64d}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / 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-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-zinc-100{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.bg-zinc-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-zinc-900{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-green-500{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-emerald-700{--tw-gradient-to: #047857 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pr-10{padding-right:2.5rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.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}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / 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-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / 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-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-zinc-50{--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.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)}.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)}.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-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.dark .apmsu-provider-icon{filter:invert(1) hue-rotate(180deg)}.apmsu-root ::-webkit-scrollbar{width:8px;height:8px}.apmsu-root ::-webkit-scrollbar-track{background:transparent}.apmsu-root ::-webkit-scrollbar-thumb{background:#9ca3af80;border-radius:4px}.apmsu-root ::-webkit-scrollbar-thumb:hover{background:#9ca3afb3}.apmsu-root.dark ::-webkit-scrollbar-thumb{background:#52525b99}.apmsu-root.dark ::-webkit-scrollbar-thumb:hover{background:#52525bcc}.apmsu-dropdown::-webkit-scrollbar,.apmsu-dropdown *::-webkit-scrollbar{width:6px}.apmsu-dropdown::-webkit-scrollbar-thumb,.apmsu-dropdown *::-webkit-scrollbar-thumb{background:#9ca3af66;border-radius:3px}.apmsu-dropdown::-webkit-scrollbar-track,.apmsu-dropdown *::-webkit-scrollbar-track{background:transparent}.dark .apmsu-dropdown::-webkit-scrollbar-thumb,.dark .apmsu-dropdown *::-webkit-scrollbar-thumb{background:#52525b80}@keyframes apmsu-fade-in{0%{opacity:0}to{opacity:1}}.apmsu-fade-in{animation:apmsu-fade-in .2s cubic-bezier(.16,1,.3,1) forwards}.apmsu-fade-enter-active{transition:opacity .2s cubic-bezier(.16,1,.3,1)}.apmsu-fade-enter-from{opacity:0}.apmsu-fade-leave-active{display:none}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-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-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / 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-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / 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-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-100:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-900\/90:hover{background-color:#18181be6}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.focus\:border-zinc-500:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset: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-green-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.focus-visible\:ring-red-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.active\:scale-\[0\.98\]:active{--tw-scale-x: .98;--tw-scale-y: .98;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))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-300:disabled{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.dark\:border-green-500\/50:is(.dark *){border-color:#22c55e80}.dark\:border-red-500\/50:is(.dark *){border-color:#ef444480}.dark\:border-red-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:border-zinc-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.dark\:border-zinc-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-red-900\/30:is(.dark *){background-color:#7f1d1d4d}.dark\:bg-zinc-50:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800\/50:is(.dark *){background-color:#27272a80}.dark\:bg-zinc-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-900\/50:is(.dark *){background-color:#18181b80}.dark\:bg-zinc-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / 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-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.dark\:text-zinc-500:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:text-zinc-600:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:text-zinc-900:is(.dark *){--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:hover\:border-zinc-600:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-red-900\/40:hover:is(.dark *){background-color:#7f1d1d66}.dark\:hover\:bg-zinc-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-zinc-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-zinc-800\/50:hover:is(.dark *){background-color:#27272a80}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:focus\:border-zinc-500:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.dark\:disabled\:bg-zinc-700:disabled:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.ticker{display:inline-flex;overflow:hidden;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace,PingFang SC,Microsoft YaHei,sans-serif;font-weight:600;line-height:1.2}.ticker-column{display:inline-block;height:1.2em;overflow:hidden;position:relative;clip-path:inset(0)}.ticker-char{position:absolute;top:0;left:0;right:0;height:1.2em;display:flex;align-items:center;justify-content:center;white-space:pre}.ticker[data-v-7e47ac69]{display:inline-flex;overflow:hidden;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-weight:600;line-height:1.2}.ticker-column[data-v-7e47ac69]{display:inline-block;height:1.2em;overflow:hidden;position:relative;clip-path:inset(0)}.ticker-char[data-v-7e47ac69]{position:absolute;top:0;left:0;right:0;height:1.2em;display:flex;align-items:center;justify-content:center;white-space:pre}
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";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:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,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}.apmsu-root{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;margin-left:auto;margin-right:auto;box-sizing:border-box}.apmsu-btn{display:inline-flex;height:2.5rem;align-items:center;justify-content:center;border-radius:.375rem;padding:.5rem 1rem;font-size:.75rem;line-height:1rem;font-weight:500;--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);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.apmsu-btn: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-offset-width: 2px}.apmsu-btn:disabled{pointer-events:none;opacity:.5}.apmsu-btn-primary{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.apmsu-btn-primary:hover{background-color:#18181be6}.apmsu-btn-primary:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.apmsu-btn-primary:hover:is(.dark *){background-color:#fafafae6}.apmsu-btn-success{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.apmsu-btn-success:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.apmsu-btn-ghost{background-color:transparent;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.apmsu-btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.apmsu-btn-ghost:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.apmsu-btn-ghost:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.apmsu-input{display:flex;height:2.75rem;width:100%;border-radius:.5rem;border-width:1px;background-color:#f3f4f64d;padding:.625rem 1rem;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);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.apmsu-input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-input::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-input:focus{outline:2px solid transparent;outline-offset:2px}.apmsu-input:is(.dark *){background-color:#27272a80}.apmsu-input:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-input:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-input-default{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.apmsu-input-default:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.apmsu-input-default:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.apmsu-input-default:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.apmsu-input-default:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.apmsu-input-default:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.apmsu-input-default{border-width:1px}.apmsu-input-error{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.apmsu-input-error:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.apmsu-input-error:is(.dark *){border-color:#ef444480;background-color:#ef44440d}.apmsu-input-error{border-width:1px}.apmsu-input-success{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.apmsu-input-success:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.apmsu-input-success:is(.dark *){border-color:#22c55e80;background-color:#22c55e0d}.apmsu-input-success{border-width:1px}.apmsu-select-trigger{display:flex;height:2.75rem;width:100%;min-width:0px;align-items:center;justify-content:space-between;white-space:nowrap;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));background-color:#f3f4f633;padding:.625rem 1rem;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);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.apmsu-select-trigger:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.apmsu-select-trigger:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px}.apmsu-select-trigger:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1));background-color:#27272a80}.apmsu-select-trigger:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.apmsu-select-trigger:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.apmsu-select-trigger{border-width:1px}.apmsu-dropdown{position:absolute;z-index:50;margin-top:.25rem;width:100%;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--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)}.apmsu-dropdown:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.apmsu-dropdown{border-width:1px;transform:translateZ(0);max-height:0;opacity:0;transform-origin:top;transform:translateY(-8px) scale(.98);pointer-events:none;visibility:hidden;transition:max-height .4s cubic-bezier(.2,.8,.2,1),opacity .3s cubic-bezier(.2,.8,.2,1),transform .4s cubic-bezier(.2,.8,.2,1),visibility 0s linear .4s}.apmsu-dropdown-open{max-height:480px;opacity:1;transform:translateY(0) scale(1);pointer-events:auto;visibility:visible;transition-delay:0s}.apmsu-dropdown-item{display:flex;width:100%;cursor:pointer;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.apmsu-dropdown-item:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.apmsu-dropdown-item:active{--tw-scale-x: .98;--tw-scale-y: .98;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))}.apmsu-dropdown-item:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.apmsu-dropdown-item{background:transparent;border:none;text-align:left}.apmsu-dropdown-item-active{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.apmsu-dropdown-item-active:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.apmsu-label{margin-bottom:.5rem;display:block;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;line-height:1;letter-spacing:.05em;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.apmsu-label:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-error-text{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.apmsu-error-text:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.apmsu-hint-text{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-hint-text:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-success-text{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.apmsu-success-text:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.apmsu-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.apmsu-card{border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1.5rem;--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)}.apmsu-card:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.apmsu-card{border-width:1px}.apmsu-icon-spin{height:1rem;width:1rem}.apmsu-icon-spin{animation:spin 1s linear infinite;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-icon-success{height:1rem;width:1rem;--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.apmsu-icon-error{height:1rem;width:1rem;--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.apmsu-provider-icon{height:1rem;width:1rem;flex-shrink:0}.apmsu-chevron{height:1rem;width:1rem;flex-shrink:0;opacity:.5;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.apmsu-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.apmsu-placeholder:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.apmsu-field>: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))}.apmsu-divider{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.apmsu-divider:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.relative{position:relative}.right-3{right:.75rem}.top-1\/2{top:50%}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-6{margin-top:1.5rem}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-80{height:20rem}.h-full{height:100%}.max-h-0{max-height:0px}.max-h-60{max-height:15rem}.max-h-\[1000px\]{max-height:1000px}.max-h-\[300px\]{max-height:300px}.min-h-\[20px\]{min-height:20px}.min-h-screen{min-height:100vh}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-\[80\%\]{max-width:80%}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.origin-top{transform-origin:top}.-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))}.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))}.rotate-90{--tw-rotate: 90deg;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 bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.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}.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-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-bl-md{border-bottom-left-radius:.375rem}.rounded-br-md{border-bottom-right-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.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-200\/50{border-color:#e5e7eb80}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-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-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-100\/20{background-color:#f3f4f633}.bg-gray-100\/30{background-color:#f3f4f64d}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / 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-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-zinc-100{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.bg-zinc-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-zinc-900{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-green-500{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-emerald-700{--tw-gradient-to: #047857 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pr-10{padding-right:2.5rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.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}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / 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-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / 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-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-zinc-50{--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.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)}.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)}.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-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.dark .apmsu-provider-icon{filter:invert(1) hue-rotate(180deg)}.apmsu-root ::-webkit-scrollbar{width:8px;height:8px}.apmsu-root ::-webkit-scrollbar-track{background:transparent}.apmsu-root ::-webkit-scrollbar-thumb{background:#9ca3af80;border-radius:4px}.apmsu-root ::-webkit-scrollbar-thumb:hover{background:#9ca3afb3}.apmsu-root.dark ::-webkit-scrollbar-thumb{background:#52525b99}.apmsu-root.dark ::-webkit-scrollbar-thumb:hover{background:#52525bcc}.apmsu-dropdown::-webkit-scrollbar,.apmsu-dropdown *::-webkit-scrollbar{width:6px}.apmsu-dropdown::-webkit-scrollbar-thumb,.apmsu-dropdown *::-webkit-scrollbar-thumb{background:#9ca3af66;border-radius:3px}.apmsu-dropdown::-webkit-scrollbar-track,.apmsu-dropdown *::-webkit-scrollbar-track{background:transparent}.dark .apmsu-dropdown::-webkit-scrollbar-thumb,.dark .apmsu-dropdown *::-webkit-scrollbar-thumb{background:#52525b80}@keyframes apmsu-fade-in{0%{opacity:0}to{opacity:1}}.apmsu-fade-in{animation:apmsu-fade-in .2s cubic-bezier(.16,1,.3,1) forwards}.apmsu-fade-enter-active{transition:opacity .2s cubic-bezier(.16,1,.3,1)}.apmsu-fade-enter-from{opacity:0}.apmsu-fade-leave-active{display:none}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-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-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / 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-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / 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-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-100:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-900\/90:hover{background-color:#18181be6}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.focus\:border-zinc-500:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset: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-green-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.focus-visible\:ring-red-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.active\:scale-\[0\.98\]:active{--tw-scale-x: .98;--tw-scale-y: .98;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))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-300:disabled{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.dark\:border-green-500\/50:is(.dark *){border-color:#22c55e80}.dark\:border-red-500\/50:is(.dark *){border-color:#ef444480}.dark\:border-red-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:border-zinc-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.dark\:border-zinc-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-red-900\/30:is(.dark *){background-color:#7f1d1d4d}.dark\:bg-zinc-50:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800\/50:is(.dark *){background-color:#27272a80}.dark\:bg-zinc-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-900\/50:is(.dark *){background-color:#18181b80}.dark\:bg-zinc-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / 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-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.dark\:text-zinc-500:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:text-zinc-600:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:text-zinc-900:is(.dark *){--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:hover\:border-zinc-600:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-red-900\/40:hover:is(.dark *){background-color:#7f1d1d66}.dark\:hover\:bg-zinc-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-zinc-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-zinc-800\/50:hover:is(.dark *){background-color:#27272a80}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:focus\:border-zinc-500:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.dark\:disabled\:bg-zinc-700:disabled:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.ticker{display:inline-flex;overflow:hidden;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace,PingFang SC,Microsoft YaHei,sans-serif;font-weight:600;line-height:1.2}.ticker-column{display:inline-block;height:1.2em;overflow:hidden;position:relative;clip-path:inset(0)}.ticker-char{position:absolute;top:0;left:0;right:0;height:1.2em;display:flex;align-items:center;justify-content:center;white-space:pre}.ticker[data-v-7e47ac69]{display:inline-flex;overflow:hidden;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-weight:600;line-height:1.2}.ticker-column[data-v-7e47ac69]{display:inline-block;height:1.2em;overflow:hidden;position:relative;clip-path:inset(0)}.ticker-char[data-v-7e47ac69]{position:absolute;top:0;left:0;right:0;height:1.2em;display:flex;align-items:center;justify-content:center;white-space:pre}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find(p => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some(p => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find(m => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find(m => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","t","charHeight","_sfc_main","defineComponent","__props","props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_export_sfc","sfc","val","Ticker","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[1,2]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find((p: any) => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some((p: any) => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find((m: Model) => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find((m: Model) => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","t","charHeight","_sfc_main","defineComponent","__props","props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_export_sfc","sfc","val","Ticker","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[1,2]}
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find(p => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some(p => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find(m => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find(m => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","charHeight","Ticker","sfc","props","val","defineComponent","__props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","t","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[1,2]}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find((p: any) => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some((p: any) => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find((m: Model) => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find((m: Model) => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","charHeight","Ticker","sfc","props","val","defineComponent","__props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","t","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[1,2]}
|