:root{--color-bg-primary: #0a0e1a;--color-bg-secondary: #131829;--color-bg-tertiary: #1a1f35;--color-bg-elevated: #1f2640;--color-primary: #6366f1;--color-primary-hover: #4f46e5;--color-primary-light: rgba(99, 102, 241, .1);--color-success: #10b981;--color-success-light: rgba(16, 185, 129, .1);--color-warning: #f59e0b;--color-warning-light: rgba(245, 158, 11, .1);--color-danger: #ef4444;--color-danger-light: rgba(239, 68, 68, .1);--color-info: #06b6d4;--color-info-light: rgba(6, 182, 212, .1);--color-text-primary: #f8fafc;--color-text-secondary: #cbd5e1;--color-text-tertiary: #94a3b8;--color-border: rgba(148, 163, 184, .2);--color-border-focus: rgba(99, 102, 241, .5);--gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);--gradient-success: linear-gradient(135deg, #10b981 0%, #059669 100%);--gradient-warning: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);--gradient-danger: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .4);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .5);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .6);--shadow-glow: 0 0 20px rgba(99, 102, 241, .3);--space-xs: .25rem;--space-sm: .5rem;--space-md: 1rem;--space-lg: 1.5rem;--space-xl: 2rem;--space-2xl: 3rem;--radius-sm: .375rem;--radius-md: .5rem;--radius-lg: .75rem;--radius-xl: 1rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans TC", "Microsoft YaHei", sans-serif;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: 1rem;--font-size-lg: 1.125rem;--font-size-xl: 1.25rem;--font-size-2xl: 1.5rem;--font-size-3xl: 2rem;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-base: .25s cubic-bezier(.4, 0, .2, 1);--transition-slow: .35s cubic-bezier(.4, 0, .2, 1)}*{margin:0;padding:0;box-sizing:border-box}html,body{width:100%;height:100%;overflow-x:hidden}body{font-family:var(--font-family);background:var(--color-bg-primary);color:var(--color-text-primary);line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#root{min-height:100vh;display:flex;flex-direction:column}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.2;margin-bottom:var(--space-md)}h1{font-size:var(--font-size-3xl)}h2{font-size:var(--font-size-2xl)}h3{font-size:var(--font-size-xl)}h4{font-size:var(--font-size-lg)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);font-size:var(--font-size-sm);font-weight:500;border:none;border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-base);text-decoration:none;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--gradient-primary);color:#fff;box-shadow:var(--shadow-md)}.btn-primary:hover:not(:disabled){box-shadow:var(--shadow-lg),var(--shadow-glow);transform:translateY(-2px)}.btn-secondary{background:var(--color-bg-elevated);color:var(--color-text-primary);border:1px solid var(--color-border)}.btn-secondary:hover:not(:disabled){background:var(--color-bg-tertiary);border-color:var(--color-primary)}.btn-success{background:var(--gradient-success);color:#fff;box-shadow:var(--shadow-md)}.btn-success:hover:not(:disabled){box-shadow:var(--shadow-lg);transform:translateY(-2px)}.btn-danger{background:var(--gradient-danger);color:#fff;box-shadow:var(--shadow-md)}.btn-danger:hover:not(:disabled){box-shadow:var(--shadow-lg);transform:translateY(-2px)}.btn-sm{padding:var(--space-xs) var(--space-md);font-size:var(--font-size-xs)}.btn-lg{padding:var(--space-md) var(--space-xl);font-size:var(--font-size-base)}.card{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-lg);box-shadow:var(--shadow-md);transition:all var(--transition-base)}.card:hover{border-color:var(--color-primary);box-shadow:var(--shadow-lg)}.card-header{margin-bottom:var(--space-lg);padding-bottom:var(--space-md);border-bottom:1px solid var(--color-border)}.card-title{font-size:var(--font-size-xl);font-weight:600;margin-bottom:0}.card-body{flex:1}.form-group{margin-bottom:var(--space-lg)}.form-label{display:block;font-size:var(--font-size-sm);font-weight:500;margin-bottom:var(--space-sm);color:var(--color-text-secondary)}.form-input,.form-select,.form-textarea{width:100%;padding:var(--space-sm) var(--space-md);font-size:var(--font-size-base);font-family:var(--font-family);background:var(--color-bg-tertiary);border:1px solid var(--color-border);border-radius:var(--radius-md);color:var(--color-text-primary);transition:all var(--transition-base)}.form-input:focus,.form-select:focus,.form-textarea:focus{outline:none;border-color:var(--color-border-focus);box-shadow:0 0 0 3px var(--color-primary-light)}.form-textarea{resize:vertical;min-height:100px}.badge{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);font-size:var(--font-size-xs);font-weight:500;border-radius:var(--radius-sm);white-space:nowrap}.badge-primary{background:var(--color-primary-light);color:var(--color-primary)}.badge-success{background:var(--color-success-light);color:var(--color-success)}.badge-warning{background:var(--color-warning-light);color:var(--color-warning)}.badge-danger{background:var(--color-danger-light);color:var(--color-danger)}.badge-info{background:var(--color-info-light);color:var(--color-info)}.table-container{width:100%;overflow-x:auto;border-radius:var(--radius-lg);border:1px solid var(--color-border)}.table{width:100%;border-collapse:collapse}.table thead{background:var(--color-bg-elevated)}.table th{padding:var(--space-md);text-align:left;font-size:var(--font-size-sm);font-weight:600;color:var(--color-text-secondary);border-bottom:1px solid var(--color-border)}.table td{padding:var(--space-md);border-bottom:1px solid var(--color-border)}.table tbody tr{transition:background-color var(--transition-fast)}.table tbody tr:hover{background:var(--color-bg-tertiary)}.alert{padding:var(--space-md);border-radius:var(--radius-md);border-left:4px solid;display:flex;align-items:flex-start;gap:var(--space-md)}.alert-success{background:var(--color-success-light);border-color:var(--color-success);color:var(--color-success)}.alert-warning{background:var(--color-warning-light);border-color:var(--color-warning);color:var(--color-warning)}.alert-danger{background:var(--color-danger-light);border-color:var(--color-danger);color:var(--color-danger)}.alert-info{background:var(--color-info-light);border-color:var(--color-info);color:var(--color-info)}.modal-overlay{position:fixed;inset:0;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn var(--transition-base)}.modal{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-xl);max-width:90vw;max-height:90vh;overflow:auto;box-shadow:var(--shadow-xl);animation:slideUp var(--transition-base)}.modal-header{padding:var(--space-lg);border-bottom:1px solid var(--color-border);display:flex;align-items:center;justify-content:space-between}.modal-body{padding:var(--space-lg)}.modal-footer{padding:var(--space-lg);border-top:1px solid var(--color-border);display:flex;gap:var(--space-md);justify-content:flex-end}.stat-card{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-lg);box-shadow:var(--shadow-md);transition:all var(--transition-base)}.stat-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)}.stat-label{font-size:var(--font-size-sm);color:var(--color-text-secondary);margin-bottom:var(--space-sm)}.stat-value{font-size:var(--font-size-3xl);font-weight:700;background:var(--gradient-primary);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.flex{display:flex}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-sm{gap:var(--space-sm)}.gap-md{gap:var(--space-md)}.gap-lg{gap:var(--space-lg)}.mt-sm{margin-top:var(--space-sm)}.mt-md{margin-top:var(--space-md)}.mt-lg{margin-top:var(--space-lg)}.mb-sm{margin-bottom:var(--space-sm)}.mb-md{margin-bottom:var(--space-md)}.mb-lg{margin-bottom:var(--space-lg)}.text-center{text-align:center}.text-sm{font-size:var(--font-size-sm)}.text-lg{font-size:var(--font-size-lg)}.text-secondary{color:var(--color-text-secondary)}.text-tertiary{color:var(--color-text-tertiary)}.w-full{width:100%}.grid{display:grid;gap:var(--space-lg)}.grid-cols-1{grid-template-columns:repeat(1,1fr)}.grid-cols-2{grid-template-columns:repeat(2,1fr)}.grid-cols-3{grid-template-columns:repeat(3,1fr)}.grid-cols-4{grid-template-columns:repeat(4,1fr)}@media(max-width:1024px){.grid-cols-4,.grid-cols-3{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.grid-cols-4,.grid-cols-3,.grid-cols-2{grid-template-columns:repeat(1,1fr)}}.app-container{display:flex;min-height:100vh}.sidebar{width:260px;background:var(--color-bg-secondary);border-right:1px solid var(--color-border);display:flex;flex-direction:column;position:fixed;left:0;top:0;bottom:0;z-index:100}.sidebar-header{padding:var(--space-xl);border-bottom:1px solid var(--color-border)}.sidebar-header h1{font-size:var(--font-size-xl);margin-bottom:var(--space-xs);background:var(--gradient-primary);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.nav-menu{flex:1;padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-xs)}.nav-item{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md);border-radius:var(--radius-md);border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;transition:all var(--transition-base);font-size:var(--font-size-base);text-align:left;width:100%}.nav-item:hover{background:var(--color-bg-tertiary);color:var(--color-text-primary)}.nav-item.active{background:var(--color-primary-light);color:var(--color-primary);font-weight:600}.nav-icon{font-size:var(--font-size-xl)}.nav-text{flex:1}.sidebar-footer{padding:var(--space-lg);border-top:1px solid var(--color-border);text-align:center}.main-content{flex:1;margin-left:260px;background:var(--color-bg-primary);min-height:100vh}.content-wrapper{padding:var(--space-2xl);max-width:1400px;margin:0 auto}.page-header{margin-bottom:var(--space-xl)}.page-title{font-size:var(--font-size-3xl);margin-bottom:var(--space-sm)}.page-description{color:var(--color-text-secondary);font-size:var(--font-size-base)}@media(max-width:768px){.sidebar{width:220px}.main-content{margin-left:220px}.content-wrapper{padding:var(--space-lg)}}.mobile-topbar{display:none}.mobile-menu-btn{background:none;border:none;color:var(--color-text-primary);font-size:1.5rem;cursor:pointer;padding:var(--space-sm);border-radius:var(--radius-md);transition:background var(--transition-fast);line-height:1}.mobile-menu-btn:hover{background:var(--color-bg-elevated)}.mobile-title{font-size:var(--font-size-base);font-weight:600;background:var(--gradient-primary);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.sidebar-overlay{display:none;position:fixed;inset:0;background:#0009;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:99}@media(max-width:640px){.app-container{flex-direction:column}.mobile-topbar{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-sm) var(--space-md);background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);position:sticky;top:0;z-index:200}.sidebar-overlay{display:block}.sidebar{transform:translate(-100%);transition:transform var(--transition-base);z-index:150;top:0;width:260px}.sidebar.open{transform:translate(0);box-shadow:var(--shadow-xl)}.main-content{margin-left:0;padding-top:0}.content-wrapper{padding:var(--space-md)}.page-title{font-size:var(--font-size-2xl)}.modal{width:95vw!important;max-height:95vh}.modal-body .grid-cols-2{grid-template-columns:1fr}.flex.gap-md{flex-wrap:wrap}.stat-value{font-size:var(--font-size-2xl)}}
