@nextclaw/ui 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ *,: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:hsl(var(--gray-200))}: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:var(--font-sans);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:var(--font-mono);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:hsl(var(--gray-400))}input::placeholder,textarea::placeholder{opacity:1;color:hsl(var(--gray-400))}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}:root{--brand-50: 217 100% 97%;--brand-100: 217 100% 94%;--brand-200: 217 95% 87%;--brand-300: 217 90% 77%;--brand-400: 217 85% 65%;--brand-500: 217 80% 55%;--brand-600: 217 75% 48%;--brand-700: 217 70% 40%;--brand-800: 217 65% 33%;--brand-900: 217 60% 25%;--gray-50: 210 20% 98%;--gray-100: 220 14% 96%;--gray-200: 220 13% 91%;--gray-300: 216 12% 84%;--gray-400: 218 11% 65%;--gray-500: 220 9% 46%;--gray-600: 215 14% 34%;--gray-700: 217 19% 27%;--gray-800: 215 28% 17%;--gray-900: 221 39% 11%;--background-secondary: 220 14% 96%;--background-tertiary: 220 13% 91%;--foreground-secondary: 215 28% 17%;--foreground-tertiary: 220 9% 46%;--foreground-muted: 218 11% 65%;--primary-hover: 217 75% 48%;--primary-active: 217 70% 40%;--secondary-hover: 220 13% 91%;--success: 142 76% 36%;--success-foreground: 0 0% 100%;--warning: 38 92% 50%;--warning-foreground: 0 0% 100%;--card-border: 220 13% 91%;--border-hover: 216 12% 84%;--border-active: 217 80% 55%;--input: 0 0% 100%;--input-border: 220 13% 91%;--input-focus: 217 80% 55%;--ring-offset: 0 0% 100%;--space-0: 0px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--space-16: 64px;--space-20: 80px;--space-24: 96px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-2xl: 20px;--radius-3xl: 24px;--radius-full: 9999px;--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .05);--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / .25);--shadow-card: 0 1px 3px 0 rgb(0 0 0 / .05), 0 1px 2px -1px rgb(0 0 0 / .05);--shadow-card-hover: 0 10px 15px -3px rgb(0 0 0 / .08), 0 4px 6px -4px rgb(0 0 0 / .05);--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--text-xs: 12px;--text-sm: 14px;--text-base: 16px;--text-lg: 18px;--text-xl: 20px;--text-2xl: 24px;--text-3xl: 30px;--text-4xl: 36px;--text-5xl: 48px;--font-normal: 400;--font-medium: 500;--font-semibold: 600;--font-bold: 700;--leading-tight: 1.25;--leading-snug: 1.375;--leading-normal: 1.5;--leading-relaxed: 1.625;--tracking-tight: -.025em;--tracking-normal: 0;--tracking-wide: .025em;--transition-fast: .15s ease;--transition-base: .2s ease;--transition-slow: .3s ease;--z-dropdown: 100;--z-sticky: 200;--z-fixed: 300;--z-modal-backdrop: 400;--z-modal: 500;--z-popover: 600;--z-tooltip: 700;--background: 210 20% 98%;--foreground: 221 39% 11%;--card: 0 0% 100%;--card-foreground: 221 39% 11%;--popover: 0 0% 100%;--popover-foreground: 221 39% 11%;--primary: 217 80% 55%;--primary-foreground: 0 0% 100%;--secondary: 220 14% 96%;--secondary-foreground: 215 28% 17%;--muted: 220 14% 96%;--muted-foreground: 220 9% 46%;--accent: 217 100% 97%;--accent-foreground: 217 70% 40%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 98%;--border: 220 13% 91%;--input: 220 13% 91%;--ring: 217 80% 55%;--radius: .75rem;--milk-50: 210 20% 98%;--milk-100: 220 14% 96%;--milk-200: 220 13% 91%;--milk-300: 216 12% 84%;--milk-400: 218 11% 65%;--milk-500: 220 9% 46%;--milk-600: 215 14% 34%;--milk-700: 217 19% 27%;--milk-800: 215 28% 17%;--milk-900: 221 39% 11%}*{border-color:hsl(var(--border))}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);overflow:hidden}*{scrollbar-width:thin;scrollbar-color:hsl(var(--gray-300)) transparent}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[180px\]{height:180px}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[85vh\]{max-height:85vh}.min-h-\[42px\]{min-height:42px}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[160px\]{width:160px}.w-\[240px\]{width:240px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[100px\]{min-width:100px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--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))}@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}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.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-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * 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-5>: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))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.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-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:calc(var(--radius) + 8px)}.rounded-\[2rem\]{border-radius:2rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-\[hsl\(40\,10\%\,94\%\)\]{--tw-border-opacity: 1;border-color:hsl(40 10% 94% / var(--tw-border-opacity, 1))}.border-gray-200{border-color:hsl(var(--gray-200))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-transparent{border-color:transparent}.bg-\[hsl\(40\,20\%\,98\%\)\]{--tw-bg-opacity: 1;background-color:hsl(40 20% 98% / var(--tw-bg-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black\/40{background-color:#0006}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-gray-200{background-color:hsl(var(--gray-200))}.bg-gray-400{background-color:hsl(var(--gray-400))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-100{background-color:hsl(var(--brand-100))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/80{background-color:#fffc}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from: hsl(var(--primary)) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-400{--tw-gradient-from: #c084fc var(--tw-gradient-from-position);--tw-gradient-to: rgb(192 132 252 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-rose-400{--tw-gradient-from: #fb7185 var(--tw-gradient-from-position);--tw-gradient-to: rgb(251 113 133 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-sky-400{--tw-gradient-from: #38bdf8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(56 189 248 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-slate-400{--tw-gradient-from: #94a3b8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(148 163 184 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-blue-500{--tw-gradient-to: #3b82f6 var(--tw-gradient-to-position)}.to-gray-500{--tw-gradient-to: hsl(var(--gray-500)) var(--tw-gradient-to-position)}.to-indigo-500{--tw-gradient-to: #6366f1 var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to: #ec4899 var(--tw-gradient-to-position)}.to-primary-600{--tw-gradient-to: hsl(var(--brand-600)) var(--tw-gradient-to-position)}.to-white\/10{--tw-gradient-to: rgb(255 255 255 / .1) var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-20{padding-right:5rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-gray-400{color:hsl(var(--gray-400))}.text-gray-700{color:hsl(var(--gray-700))}.text-primary{color:hsl(var(--primary))}.text-primary-700{color:hsl(var(--brand-700))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.mix-blend-multiply{mix-blend-mode:multiply}.shadow-card{--tw-shadow: var(--shadow-card);--tw-shadow-colored: var(--shadow-card);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-card{--tw-shadow-color: hsl(var(--card));--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--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(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.ring-offset-white{--tw-ring-offset-color: #fff}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-base{transition-duration:.2s}.duration-fast{transition-duration:.15s}.duration-slow{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in{--tw-enter-opacity: 0}.slide-in-from-left-2{--tw-enter-translate-x: -.5rem}.duration-300{animation-duration:.3s}.duration-base{animation-duration:.2s}.duration-fast{animation-duration:.15s}.duration-slow{animation-duration:.3s}.bg-gray-50{background-color:hsl(var(--gray-50))}.bg-gray-100{background-color:hsl(var(--gray-100))}.text-gray-500{color:hsl(var(--gray-500))}.text-gray-600{color:hsl(var(--gray-600))}.text-gray-900{color:hsl(var(--gray-900))}.shadow-card{box-shadow:var(--shadow-card)}.custom-scrollbar::-webkit-scrollbar{width:6px;height:6px}.custom-scrollbar::-webkit-scrollbar-track{background:transparent}.custom-scrollbar::-webkit-scrollbar-thumb{background:hsl(var(--gray-300));border-radius:6px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:hsl(var(--gray-400))}.shadow-card{box-shadow:0 1px 3px #0000000d,0 1px 2px -1px #0000000d}@keyframes fadeIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes slideIn{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes scaleIn{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@keyframes pulse-soft{0%,to{opacity:1}50%{opacity:.8}}.animate-fade-in{animation:fadeIn .4s cubic-bezier(.16,1,.3,1) forwards}.animate-slide-in{animation:slideIn .35s cubic-bezier(.16,1,.3,1) forwards}.animate-scale-in{animation:scaleIn .35s cubic-bezier(.16,1,.3,1) forwards}.animate-pulse-soft{animation:pulse-soft 3s ease-in-out infinite}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-gray-400::-moz-placeholder{color:hsl(var(--gray-400))}.placeholder\:text-gray-400::placeholder{color:hsl(var(--gray-400))}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;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))}.hover\:border-gray-300:hover{border-color:hsl(var(--gray-300))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-gray-200:hover{background-color:hsl(var(--gray-200))}.hover\:bg-gray-300:hover{background-color:hsl(var(--gray-300))}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary-600:hover{background-color:hsl(var(--brand-600))}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/50:hover{background-color:#ffffff80}.hover\:text-gray-700:hover{color:hsl(var(--gray-700))}.hover\:text-primary-foreground:hover{color:hsl(var(--primary-foreground))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-secondary-foreground:hover{color:hsl(var(--secondary-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-card-hover:hover{--tw-shadow: var(--shadow-card-hover);--tw-shadow-colored: var(--shadow-card-hover);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:bg-gray-100:hover{background-color:hsl(var(--gray-100))}.hover\:text-gray-600:hover{color:hsl(var(--gray-600))}.hover\:text-gray-900:hover{color:hsl(var(--gray-900))}.hover\:shadow-card-hover:hover{box-shadow:var(--shadow-card-hover);box-shadow:0 10px 15px -3px #00000014,0 4px 6px -4px #0000000d}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.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-primary:focus-visible{--tw-ring-color: hsl(var(--primary))}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-white:focus-visible{--tw-ring-offset-color: #fff}.active\:bg-primary-700:active{background-color:hsl(var(--brand-700))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x: .125rem;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))}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-gray-300{border-color:hsl(var(--gray-300))}.group:hover .group-hover\:text-primary{color:hsl(var(--primary))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[state\=checked\]\:bg-emerald-500[data-state=checked]{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}@media(min-width:640px){.sm\:max-w-\[500px\]{max-width:500px}.sm\:max-w-\[550px\]{max-width:550px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:gap-3{gap:.75rem}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
package/dist/index.html CHANGED
@@ -6,8 +6,8 @@
6
6
  <link rel="icon" type="image/svg+xml" href="/logo.svg" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
8
  <title>NextClaw - 系统配置</title>
9
- <script type="module" crossorigin src="/assets/index-BN_YuYNC.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-DahcMyga.css">
9
+ <script type="module" crossorigin src="/assets/index-CANDXRNv.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-DM9Q3WUX.css">
11
11
  </head>
12
12
 
13
13
  <body>
@@ -0,0 +1,11 @@
1
+ <svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="128" height="128" rx="28" fill="#07C160" />
3
+ <circle cx="50" cy="55" r="26" fill="white" />
4
+ <circle cx="82" cy="73" r="24" fill="#CFF6E2" />
5
+ <circle cx="40" cy="52" r="3.5" fill="#07C160" />
6
+ <circle cx="51" cy="52" r="3.5" fill="#07C160" />
7
+ <circle cx="62" cy="52" r="3.5" fill="#07C160" />
8
+ <circle cx="72" cy="70" r="3.5" fill="#07C160" />
9
+ <circle cx="83" cy="70" r="3.5" fill="#07C160" />
10
+ <circle cx="94" cy="70" r="3.5" fill="#07C160" />
11
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ui",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,11 @@
1
+ <svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="128" height="128" rx="28" fill="#07C160" />
3
+ <circle cx="50" cy="55" r="26" fill="white" />
4
+ <circle cx="82" cy="73" r="24" fill="#CFF6E2" />
5
+ <circle cx="40" cy="52" r="3.5" fill="#07C160" />
6
+ <circle cx="51" cy="52" r="3.5" fill="#07C160" />
7
+ <circle cx="62" cy="52" r="3.5" fill="#07C160" />
8
+ <circle cx="72" cy="70" r="3.5" fill="#07C160" />
9
+ <circle cx="83" cy="70" r="3.5" fill="#07C160" />
10
+ <circle cx="94" cy="70" r="3.5" fill="#07C160" />
11
+ </svg>
package/src/api/types.ts CHANGED
@@ -32,7 +32,6 @@ export type ConfigView = {
32
32
  model: string;
33
33
  workspace?: string;
34
34
  maxTokens?: number;
35
- temperature?: number;
36
35
  maxToolIterations?: number;
37
36
  };
38
37
  context?: {
@@ -75,6 +75,16 @@ const CHANNEL_FIELDS: Record<string, Array<{ name: string; type: string; label:
75
75
  { name: 'clientSecret', type: 'password', label: t('clientSecret') },
76
76
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
77
77
  ],
78
+ wecom: [
79
+ { name: 'enabled', type: 'boolean', label: t('enabled') },
80
+ { name: 'corpId', type: 'text', label: t('corpId') },
81
+ { name: 'agentId', type: 'text', label: t('agentId') },
82
+ { name: 'secret', type: 'password', label: t('secret') },
83
+ { name: 'token', type: 'password', label: t('token') },
84
+ { name: 'callbackPort', type: 'number', label: t('callbackPort') },
85
+ { name: 'callbackPath', type: 'text', label: t('callbackPath') },
86
+ { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
87
+ ],
78
88
  slack: [
79
89
  { name: 'enabled', type: 'boolean', label: t('enabled') },
80
90
  { name: 'mode', type: 'text', label: t('mode') },
@@ -269,8 +279,8 @@ export function ChannelForm() {
269
279
  </div>
270
280
  </DialogHeader>
271
281
 
272
- <div className="flex-1 overflow-y-auto custom-scrollbar py-2">
273
- <form onSubmit={handleSubmit} className="space-y-5 pr-2">
282
+ <form onSubmit={handleSubmit} className="flex flex-col flex-1 overflow-hidden">
283
+ <div className="flex-1 overflow-y-auto custom-scrollbar py-2 pr-2 space-y-5">
274
284
  {fields.map((field) => {
275
285
  const hint = channelName
276
286
  ? hintForPath(`channels.${channelName}.${field.name}`, uiHints)
@@ -280,88 +290,89 @@ export function ChannelForm() {
280
290
 
281
291
  return (
282
292
  <div key={field.name} className="space-y-2.5">
283
- <Label
284
- htmlFor={field.name}
285
- className="text-sm font-medium text-gray-900 flex items-center gap-2"
286
- >
287
- {getFieldIcon(field.name)}
288
- {label}
289
- </Label>
290
-
291
- {field.type === 'boolean' && (
292
- <div className="flex items-center justify-between p-3 rounded-xl bg-gray-50">
293
- <span className="text-sm text-gray-500">
294
- {(formData[field.name] as boolean) ? t('enabled') : t('disabled')}
295
- </span>
296
- <Switch
293
+ <Label
294
+ htmlFor={field.name}
295
+ className="text-sm font-medium text-gray-900 flex items-center gap-2"
296
+ >
297
+ {getFieldIcon(field.name)}
298
+ {label}
299
+ </Label>
300
+
301
+ {field.type === 'boolean' && (
302
+ <div className="flex items-center justify-between p-3 rounded-xl bg-gray-50">
303
+ <span className="text-sm text-gray-500">
304
+ {(formData[field.name] as boolean) ? t('enabled') : t('disabled')}
305
+ </span>
306
+ <Switch
307
+ id={field.name}
308
+ checked={(formData[field.name] as boolean) || false}
309
+ onCheckedChange={(checked) => updateField(field.name, checked)}
310
+ className="data-[state=checked]:bg-emerald-500"
311
+ />
312
+ </div>
313
+ )}
314
+
315
+ {(field.type === 'text' || field.type === 'email') && (
316
+ <Input
317
+ id={field.name}
318
+ type={field.type}
319
+ value={(formData[field.name] as string) || ''}
320
+ onChange={(e) => updateField(field.name, e.target.value)}
321
+ placeholder={placeholder}
322
+ className="rounded-xl"
323
+ />
324
+ )}
325
+
326
+ {field.type === 'password' && (
327
+ <Input
297
328
  id={field.name}
298
- checked={(formData[field.name] as boolean) || false}
299
- onCheckedChange={(checked) => updateField(field.name, checked)}
300
- className="data-[state=checked]:bg-emerald-500"
329
+ type="password"
330
+ value={(formData[field.name] as string) || ''}
331
+ onChange={(e) => updateField(field.name, e.target.value)}
332
+ placeholder={placeholder ?? 'Leave blank to keep unchanged'}
333
+ className="rounded-xl"
301
334
  />
302
- </div>
303
- )}
304
-
305
- {(field.type === 'text' || field.type === 'email') && (
306
- <Input
307
- id={field.name}
308
- type={field.type}
309
- value={(formData[field.name] as string) || ''}
310
- onChange={(e) => updateField(field.name, e.target.value)}
311
- placeholder={placeholder}
312
- className="rounded-xl"
313
- />
314
- )}
315
-
316
- {field.type === 'password' && (
317
- <Input
318
- id={field.name}
319
- type="password"
320
- value={(formData[field.name] as string) || ''}
321
- onChange={(e) => updateField(field.name, e.target.value)}
322
- placeholder={placeholder ?? 'Leave blank to keep unchanged'}
323
- className="rounded-xl"
324
- />
325
- )}
326
-
327
- {field.type === 'number' && (
328
- <Input
329
- id={field.name}
330
- type="number"
331
- value={(formData[field.name] as number) || 0}
332
- onChange={(e) => updateField(field.name, parseInt(e.target.value) || 0)}
333
- placeholder={placeholder}
334
- className="rounded-xl"
335
- />
336
- )}
337
-
338
- {field.type === 'tags' && (
339
- <TagInput
340
- value={(formData[field.name] as string[]) || []}
341
- onChange={(tags) => updateField(field.name, tags)}
342
- />
343
- )}
335
+ )}
336
+
337
+ {field.type === 'number' && (
338
+ <Input
339
+ id={field.name}
340
+ type="number"
341
+ value={(formData[field.name] as number) || 0}
342
+ onChange={(e) => updateField(field.name, parseInt(e.target.value) || 0)}
343
+ placeholder={placeholder}
344
+ className="rounded-xl"
345
+ />
346
+ )}
347
+
348
+ {field.type === 'tags' && (
349
+ <TagInput
350
+ value={(formData[field.name] as string[]) || []}
351
+ onChange={(tags) => updateField(field.name, tags)}
352
+ />
353
+ )}
344
354
  </div>
345
355
  );
346
356
  })}
357
+ </div>
347
358
 
348
- <DialogFooter className="pt-4">
349
- <Button
350
- type="button"
351
- variant="outline"
352
- onClick={closeChannelModal}
353
- >
354
- {t('cancel')}
355
- </Button>
356
- <Button
357
- type="submit"
358
- disabled={updateChannel.isPending || Boolean(runningActionId)}
359
- >
360
- {updateChannel.isPending ? 'Saving...' : t('save')}
361
- </Button>
362
- {actions
363
- .filter((action) => action.trigger === 'manual')
364
- .map((action) => (
359
+ <DialogFooter className="pt-4 flex-shrink-0">
360
+ <Button
361
+ type="button"
362
+ variant="outline"
363
+ onClick={closeChannelModal}
364
+ >
365
+ {t('cancel')}
366
+ </Button>
367
+ <Button
368
+ type="submit"
369
+ disabled={updateChannel.isPending || Boolean(runningActionId)}
370
+ >
371
+ {updateChannel.isPending ? 'Saving...' : t('save')}
372
+ </Button>
373
+ {actions
374
+ .filter((action) => action.trigger === 'manual')
375
+ .map((action) => (
365
376
  <Button
366
377
  key={action.id}
367
378
  type="button"
@@ -371,10 +382,9 @@ export function ChannelForm() {
371
382
  >
372
383
  {runningActionId === action.id ? t('connecting') : action.title}
373
384
  </Button>
374
- ))}
375
- </DialogFooter>
376
- </form>
377
- </div>
385
+ ))}
386
+ </DialogFooter>
387
+ </form>
378
388
  </DialogContent>
379
389
  </Dialog>
380
390
  );
@@ -16,19 +16,16 @@ export function ModelConfig() {
16
16
  const [model, setModel] = useState('');
17
17
  const [workspace, setWorkspace] = useState('');
18
18
  const [maxTokens, setMaxTokens] = useState(8192);
19
- const [temperature, setTemperature] = useState(0.7);
20
19
  const uiHints = schema?.uiHints;
21
20
  const modelHint = hintForPath('agents.defaults.model', uiHints);
22
21
  const workspaceHint = hintForPath('agents.defaults.workspace', uiHints);
23
22
  const maxTokensHint = hintForPath('agents.defaults.maxTokens', uiHints);
24
- const temperatureHint = hintForPath('agents.defaults.temperature', uiHints);
25
23
 
26
24
  useEffect(() => {
27
25
  if (config?.agents?.defaults) {
28
26
  setModel(config.agents.defaults.model || '');
29
27
  setWorkspace(config.agents.defaults.workspace || '');
30
28
  setMaxTokens(config.agents.defaults.maxTokens || 8192);
31
- setTemperature(config.agents.defaults.temperature || 0.7);
32
29
  }
33
30
  }, [config]);
34
31
 
@@ -63,10 +60,6 @@ export function ModelConfig() {
63
60
  <Skeleton className="h-4 w-28 mb-3" />
64
61
  <Skeleton className="h-2 w-full rounded-full" />
65
62
  </div>
66
- <div>
67
- <Skeleton className="h-4 w-32 mb-3" />
68
- <Skeleton className="h-2 w-full rounded-full" />
69
- </div>
70
63
  </div>
71
64
  </Card>
72
65
  </div>
@@ -77,7 +70,7 @@ export function ModelConfig() {
77
70
  <div className="max-w-4xl animate-fade-in pb-20">
78
71
  <div className="mb-10">
79
72
  <h2 className="text-2xl font-bold text-gray-900">Model Configuration</h2>
80
- <p className="text-sm text-gray-500 mt-1">Configure default AI model and behavior parameters</p>
73
+ <p className="text-sm text-gray-500 mt-1">Configure default AI model and runtime limits</p>
81
74
  </div>
82
75
 
83
76
  <form onSubmit={handleSubmit} className="space-y-8">
@@ -142,7 +135,7 @@ export function ModelConfig() {
142
135
  <h3 className="text-lg font-bold text-gray-900">Generation Parameters</h3>
143
136
  </div>
144
137
 
145
- <div className="grid grid-cols-1 md:grid-cols-2 gap-12">
138
+ <div className="grid grid-cols-1 gap-12">
146
139
  <div className="space-y-4">
147
140
  <div className="flex justify-between items-center mb-2">
148
141
  <Label className="text-xs font-semibold text-gray-500 uppercase tracking-wider">
@@ -160,24 +153,6 @@ export function ModelConfig() {
160
153
  className="w-full h-1 bg-gray-200 rounded-full appearance-none cursor-pointer accent-primary"
161
154
  />
162
155
  </div>
163
-
164
- <div className="space-y-4">
165
- <div className="flex justify-between items-center mb-2">
166
- <Label className="text-xs font-semibold text-gray-500 uppercase tracking-wider">
167
- {temperatureHint?.label ?? 'Temperature'}
168
- </Label>
169
- <span className="text-sm font-semibold text-gray-900">{temperature}</span>
170
- </div>
171
- <input
172
- type="range"
173
- min="0"
174
- max="2"
175
- step="0.1"
176
- value={temperature}
177
- onChange={(e) => setTemperature(parseFloat(e.target.value))}
178
- className="w-full h-1 bg-gray-200 rounded-full appearance-none cursor-pointer accent-primary"
179
- />
180
- </div>
181
156
  </div>
182
157
  </div>
183
158
 
@@ -100,85 +100,87 @@ export function ProviderForm() {
100
100
  </div>
101
101
  </DialogHeader>
102
102
 
103
- <form onSubmit={handleSubmit} className="space-y-5 pt-2">
104
- <div className="space-y-2.5">
105
- <Label htmlFor="apiKey" className="text-sm font-medium text-gray-900 flex items-center gap-2">
106
- <KeyRound className="h-3.5 w-3.5 text-gray-500" />
107
- {apiKeyHint?.label ?? t('apiKey')}
108
- </Label>
109
- <MaskedInput
110
- id="apiKey"
111
- value={apiKey}
112
- isSet={providerConfig?.apiKeySet}
113
- onChange={(e) => setApiKey(e.target.value)}
114
- placeholder={
115
- providerConfig?.apiKeySet
116
- ? t('apiKeySet')
117
- : apiKeyHint?.placeholder ?? 'Enter API Key'
118
- }
119
- className="rounded-xl"
120
- />
121
- </div>
103
+ <form onSubmit={handleSubmit} className="flex flex-col pt-2">
104
+ <div className="space-y-5 max-h-[60vh] overflow-y-auto pr-1">
105
+ <div className="space-y-2.5">
106
+ <Label htmlFor="apiKey" className="text-sm font-medium text-gray-900 flex items-center gap-2">
107
+ <KeyRound className="h-3.5 w-3.5 text-gray-500" />
108
+ {apiKeyHint?.label ?? t('apiKey')}
109
+ </Label>
110
+ <MaskedInput
111
+ id="apiKey"
112
+ value={apiKey}
113
+ isSet={providerConfig?.apiKeySet}
114
+ onChange={(e) => setApiKey(e.target.value)}
115
+ placeholder={
116
+ providerConfig?.apiKeySet
117
+ ? t('apiKeySet')
118
+ : apiKeyHint?.placeholder ?? 'Enter API Key'
119
+ }
120
+ className="rounded-xl"
121
+ />
122
+ </div>
122
123
 
123
- <div className="space-y-2.5">
124
- <Label htmlFor="apiBase" className="text-sm font-medium text-gray-900 flex items-center gap-2">
125
- <Globe className="h-3.5 w-3.5 text-gray-500" />
126
- {apiBaseHint?.label ?? t('apiBase')}
127
- </Label>
128
- <Input
129
- id="apiBase"
130
- type="text"
131
- value={apiBase}
132
- onChange={(e) => setApiBase(e.target.value)}
133
- placeholder={
134
- providerSpec?.defaultApiBase ||
135
- apiBaseHint?.placeholder ||
136
- 'https://api.example.com'
137
- }
138
- className="rounded-xl"
139
- />
140
- {apiBaseHint?.help && (
141
- <p className="text-xs text-gray-500">{apiBaseHint.help}</p>
124
+ <div className="space-y-2.5">
125
+ <Label htmlFor="apiBase" className="text-sm font-medium text-gray-900 flex items-center gap-2">
126
+ <Globe className="h-3.5 w-3.5 text-gray-500" />
127
+ {apiBaseHint?.label ?? t('apiBase')}
128
+ </Label>
129
+ <Input
130
+ id="apiBase"
131
+ type="text"
132
+ value={apiBase}
133
+ onChange={(e) => setApiBase(e.target.value)}
134
+ placeholder={
135
+ providerSpec?.defaultApiBase ||
136
+ apiBaseHint?.placeholder ||
137
+ 'https://api.example.com'
138
+ }
139
+ className="rounded-xl"
140
+ />
141
+ {apiBaseHint?.help && (
142
+ <p className="text-xs text-gray-500">{apiBaseHint.help}</p>
143
+ )}
144
+ </div>
145
+
146
+ {providerSpec?.supportsWireApi && (
147
+ <div className="space-y-2.5">
148
+ <Label htmlFor="wireApi" className="text-sm font-medium text-gray-900 flex items-center gap-2">
149
+ <Hash className="h-3.5 w-3.5 text-gray-500" />
150
+ {wireApiHint?.label ?? t('wireApi')}
151
+ </Label>
152
+ <select
153
+ id="wireApi"
154
+ value={wireApi}
155
+ onChange={(e) => setWireApi(e.target.value as 'auto' | 'chat' | 'responses')}
156
+ className="flex h-10 w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"
157
+ >
158
+ {(providerSpec.wireApiOptions || ['auto', 'chat', 'responses']).map((option) => (
159
+ <option key={option} value={option}>
160
+ {option === 'chat'
161
+ ? t('wireApiChat')
162
+ : option === 'responses'
163
+ ? t('wireApiResponses')
164
+ : t('wireApiAuto')}
165
+ </option>
166
+ ))}
167
+ </select>
168
+ </div>
142
169
  )}
143
- </div>
144
170
 
145
- {providerSpec?.supportsWireApi && (
146
171
  <div className="space-y-2.5">
147
- <Label htmlFor="wireApi" className="text-sm font-medium text-gray-900 flex items-center gap-2">
148
- <Hash className="h-3.5 w-3.5 text-gray-500" />
149
- {wireApiHint?.label ?? t('wireApi')}
150
- </Label>
151
- <select
152
- id="wireApi"
153
- value={wireApi}
154
- onChange={(e) => setWireApi(e.target.value as 'auto' | 'chat' | 'responses')}
155
- className="flex h-10 w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"
156
- >
157
- {(providerSpec.wireApiOptions || ['auto', 'chat', 'responses']).map((option) => (
158
- <option key={option} value={option}>
159
- {option === 'chat'
160
- ? t('wireApiChat')
161
- : option === 'responses'
162
- ? t('wireApiResponses')
163
- : t('wireApiAuto')}
164
- </option>
165
- ))}
166
- </select>
172
+ <Label className="text-sm font-medium text-gray-900 flex items-center gap-2">
173
+ <Hash className="h-3.5 w-3.5 text-gray-500" />
174
+ {extraHeadersHint?.label ?? t('extraHeaders')}
175
+ </Label>
176
+ <KeyValueEditor
177
+ value={extraHeaders}
178
+ onChange={setExtraHeaders}
179
+ />
167
180
  </div>
168
- )}
169
-
170
- <div className="space-y-2.5">
171
- <Label className="text-sm font-medium text-gray-900 flex items-center gap-2">
172
- <Hash className="h-3.5 w-3.5 text-gray-500" />
173
- {extraHeadersHint?.label ?? t('extraHeaders')}
174
- </Label>
175
- <KeyValueEditor
176
- value={extraHeaders}
177
- onChange={setExtraHeaders}
178
- />
179
181
  </div>
180
182
 
181
- <DialogFooter className="pt-4">
183
+ <DialogFooter className="pt-4 flex-shrink-0">
182
184
  <Button
183
185
  type="button"
184
186
  variant="outline"
package/src/lib/i18n.ts CHANGED
@@ -21,7 +21,6 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
21
21
  modelName: { zh: '模型', en: 'Model' },
22
22
  workspace: { zh: '工作空间', en: 'Workspace' },
23
23
  maxTokens: { zh: '最大 Token 数', en: 'Max Tokens' },
24
- temperature: { zh: '温度', en: 'Temperature' },
25
24
  maxToolIterations: { zh: '最大工具迭代次数', en: 'Max Tool Iterations' },
26
25
 
27
26
  // Provider
@@ -43,6 +42,8 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
43
42
  botToken: { zh: 'Bot Token', en: 'Bot Token' },
44
43
  appToken: { zh: 'App Token', en: 'App Token' },
45
44
  appId: { zh: 'App ID', en: 'App ID' },
45
+ corpId: { zh: '企业 ID', en: 'Corp ID' },
46
+ agentId: { zh: '应用 Agent ID', en: 'Agent ID' },
46
47
  appSecret: { zh: 'App Secret', en: 'App Secret' },
47
48
  markdownSupport: { zh: 'Markdown 支持', en: 'Markdown Support' },
48
49
  clientId: { zh: 'Client ID', en: 'Client ID' },
@@ -55,6 +56,8 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
55
56
  intents: { zh: 'Intents', en: 'Intents' },
56
57
  mode: { zh: '模式', en: 'Mode' },
57
58
  webhookPath: { zh: 'Webhook 路径', en: 'Webhook Path' },
59
+ callbackPort: { zh: '回调端口', en: 'Callback Port' },
60
+ callbackPath: { zh: '回调路径', en: 'Callback Path' },
58
61
  groupPolicy: { zh: '群组策略', en: 'Group Policy' },
59
62
  consentGranted: { zh: '同意条款', en: 'Consent Granted' },
60
63
  imapHost: { zh: 'IMAP 服务器', en: 'IMAP Host' },
package/src/lib/logos.ts CHANGED
@@ -23,6 +23,7 @@ const CHANNEL_LOGOS: LogoMap = {
23
23
  qq: "qq.svg",
24
24
  feishu: "feishu.svg",
25
25
  dingtalk: "dingtalk.svg",
26
+ wecom: "wecom.svg",
26
27
  mochat: "mochat.svg",
27
28
  email: "email.svg"
28
29
  };