Refactor global styles and enhance MITM functionality

- Updated global CSS to implement a new brand color palette and improve light/dark theme consistency.
- Enhanced the MitmServerCard component to provide clearer user feedback regarding admin privileges.
- Filtered LLM combos in the CombosPage to ensure only relevant data is displayed.
- Improved APIPageClient layout for better usability and visual consistency.
- Added functionality to save and load DNS tool states in the MITM manager.
- Updated OAuth configuration URLs for Qwen to reflect the new endpoint structure.
- Refined tunnel management logic to improve reliability and user experience.
This commit is contained in:
decolua
2026-05-03 18:00:35 +07:00
parent 1686adc704
commit 6cdf40b44e
40 changed files with 1029 additions and 762 deletions

View File

@@ -3,13 +3,13 @@
import { useEffect } from "react";
import { cn } from "@/shared/utils/cn";
export default function Drawer({
isOpen,
onClose,
title,
children,
export default function Drawer({
isOpen,
onClose,
title,
children,
width = "md",
className
className
}) {
const widths = {
sm: "w-[400px]",
@@ -19,24 +19,18 @@ export default function Drawer({
full: "w-full",
};
// Lock body scroll when drawer is open
useEffect(() => {
if (isOpen) {
document.body.style.overflow = "hidden";
} else {
document.body.style.overflow = "";
}
return () => {
document.body.style.overflow = "";
};
return () => { document.body.style.overflow = ""; };
}, [isOpen]);
// Handle escape key
useEffect(() => {
const handleEscape = (e) => {
if (e.key === "Escape" && isOpen) {
onClose();
}
if (e.key === "Escape" && isOpen) onClose();
};
document.addEventListener("keydown", handleEscape);
return () => document.removeEventListener("keydown", handleEscape);
@@ -47,40 +41,39 @@ export default function Drawer({
return (
<div className="fixed inset-0 z-50">
{/* Overlay */}
<div
className="absolute inset-0 bg-black/50 backdrop-blur-sm transition-opacity cursor-pointer"
<div
className="absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in cursor-pointer"
onClick={onClose}
aria-hidden="true"
/>
{/* Drawer panel */}
<div className={cn(
"absolute right-0 top-0 h-full bg-surface shadow-2xl flex flex-col",
"animate-in slide-in-from-right duration-200",
"border-l border-black/10 dark:border-white/10",
"absolute right-0 top-0 h-full bg-surface flex flex-col",
"shadow-[var(--shadow-elev)]",
"slide-in-right",
"border-l border-border-subtle",
widths[width] || widths.md,
className
)}>
{/* Header */}
<div className="flex items-center justify-between p-6 border-b border-black/5 dark:border-white/5 flex-shrink-0">
<div className="flex items-center justify-between p-6 border-b border-border-subtle flex-shrink-0">
<div className="flex items-center gap-3">
{title && (
<h2 className="text-lg font-semibold text-text-main">
{title}
</h2>
<h2 className="text-lg font-semibold text-text-main">{title}</h2>
)}
</div>
<button
type="button"
onClick={onClose}
className="p-1.5 rounded-lg text-text-muted hover:bg-black/5 dark:hover:bg-white/5 transition-colors"
className="p-1.5 rounded-[10px] text-text-muted hover:bg-surface-2 hover:text-text-main transition-colors"
>
<span className="material-symbols-outlined text-[20px]">close</span>
</button>
</div>
{/* Body */}
<div className="flex-1 overflow-y-auto p-6">
<div className="flex-1 overflow-y-auto p-6 custom-scrollbar">
{children}
</div>
</div>