:root{--color-pass-bg:#dcfce7;--color-pass-text:#166534;--color-pass-border:#86efac;--color-pass-dot:#16a34a;--color-review-bg:#fef9c3;--color-review-text:#854d0e;--color-review-border:#fde047;--color-review-dot:#ca8a04;--color-fail-bg:#fee2e2;--color-fail-text:#991b1b;--color-fail-border:#fca5a5;--color-fail-dot:#dc2626;--color-unreadable-bg:#f3f4f6;--color-unreadable-text:#374151;--color-unreadable-border:#d1d5db;--color-unreadable-dot:#6b7280;--color-bg:#f8fafc;--color-surface:#ffffff;--color-surface-raised:#f1f5f9;--color-border:#e2e8f0;--color-border-strong:#cbd5e1;--color-text-primary:#0f172a;--color-text-secondary:#475569;--color-text-muted:#94a3b8;--color-text-inverse:#ffffff;--color-brand:#1d4ed8;--color-brand-hover:#1e40af;--color-brand-light:#dbeafe;--color-danger:#dc2626;--color-danger-hover:#b91c1c;--color-success:#16a34a;--color-warning:#ca8a04;--color-highlight-decl:rgba(59,130,246,0.25);--color-highlight-decl-border:rgba(59,130,246,0.8);--color-highlight-ctr:rgba(234,88,12,0.20);--color-highlight-ctr-border:rgba(234,88,12,0.75);--color-highlight-active:rgba(250,204,21,0.40);--color-highlight-active-border:rgba(234,179,8,0.9);--space-1:0.25rem;--space-2:0.5rem;--space-3:0.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-8:2rem;--space-10:2.5rem;--space-12:3rem;--space-16:4rem;--font-family-base:"Noto Sans TC","Helvetica Neue",Arial,sans-serif;--font-family-mono:"JetBrains Mono","Fira Mono",Consolas,monospace;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-size-3xl:1.875rem;--font-size-4xl:2.25rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--line-height-tight:1.25;--line-height-normal:1.5;--line-height-relaxed:1.625;--radius-sm:0.25rem;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--radius-full:9999px;--shadow-sm:0 1px 2px 0 rgb(0 0 0/0.05);--shadow-md:0 4px 6px -1px rgb(0 0 0/0.1),0 2px 4px -2px rgb(0 0 0/0.1);--shadow-lg:0 10px 15px -3px rgb(0 0 0/0.1),0 4px 6px -4px rgb(0 0 0/0.1);--shadow-xl:0 20px 25px -5px rgb(0 0 0/0.1),0 8px 10px -6px rgb(0 0 0/0.1);--max-width-content:1400px;--header-height:3.5rem;--sidebar-width:400px;--z-base:0;--z-overlay:10;--z-modal:100;--z-toast:200;--z-tooltip:300;--transition-fast:150ms ease;--transition-normal:250ms ease;--transition-slow:400ms ease}*,:after,:before{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-text-size-adjust:100%;scroll-behavior:smooth}body{font-family:var(--font-family-base);font-size:var(--font-size-base);line-height:var(--line-height-normal);background-color:var(--color-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,h1,h2,h3,h4,h5,h6{color:var(--color-text-primary)}h1,h2,h3,h4,h5,h6{font-weight:var(--font-weight-semibold);line-height:var(--line-height-tight)}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)}h5{font-size:var(--font-size-base)}h6{font-size:var(--font-size-sm)}p{line-height:var(--line-height-relaxed);color:var(--color-text-secondary)}a{color:var(--color-brand);text-decoration:none}a:hover{text-decoration:underline}code,pre{font-family:var(--font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--color-brand);outline-offset:2px;border-radius:var(--radius-sm)}.container{width:100%;max-width:var(--max-width-content);margin-inline:auto;padding-inline:var(--space-6)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);padding:var(--space-6)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);font-family:inherit;border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast);text-decoration:none;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.btn--primary{background:var(--color-brand);color:var(--color-text-inverse);border-color:var(--color-brand)}.btn--primary:hover:not(:disabled){background:var(--color-brand-hover);border-color:var(--color-brand-hover)}.btn--secondary{background:var(--color-surface);color:var(--color-text-primary);border-color:var(--color-border-strong)}.btn--secondary:hover:not(:disabled){background:var(--color-surface-raised)}.btn--danger{background:var(--color-danger);color:var(--color-text-inverse);border-color:var(--color-danger)}.btn--danger:hover:not(:disabled){background:var(--color-danger-hover);border-color:var(--color-danger-hover)}.btn--ghost{background:transparent;color:var(--color-text-secondary);border-color:transparent}.btn--ghost:hover:not(:disabled){background:var(--color-surface-raised)}.btn--lg{padding:var(--space-3) var(--space-6);font-size:var(--font-size-base)}.form-label{font-weight:var(--font-weight-medium);margin-bottom:var(--space-1)}.form-input,.form-label{display:block;font-size:var(--font-size-sm);color:var(--color-text-primary)}.form-input{width:100%;padding:var(--space-2) var(--space-3);font-family:inherit;background:var(--color-surface);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.form-input:focus{outline:none;border-color:var(--color-brand);box-shadow:0 0 0 3px var(--color-brand-light)}.form-input::placeholder{color:var(--color-text-muted)}.form-error{font-size:var(--font-size-xs);color:var(--color-danger);margin-top:var(--space-1)}.spinner{display:inline-block;width:1.25rem;height:1.25rem;border:2px solid var(--color-border);border-top-color:var(--color-brand);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(1turn)}}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-16) var(--space-8);text-align:center;color:var(--color-text-muted)}.empty-state__icon{font-size:3rem;margin-bottom:var(--space-4);opacity:.4}.empty-state__title{font-size:var(--font-size-lg);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);margin-bottom:var(--space-2)}.page-header{background:var(--color-surface);border-bottom:1px solid var(--color-border);min-height:var(--header-height);display:flex;align-items:center;position:-webkit-sticky;position:sticky;top:0;z-index:var(--z-overlay)}.page-header__inner{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-4);row-gap:var(--space-1);width:100%;max-width:var(--max-width-content);margin-inline:auto;padding-inline:var(--space-6);padding-block:var(--space-2)}.page-header__logo{font-size:var(--font-size-base);font-weight:var(--font-weight-bold);color:var(--color-text-primary);text-decoration:none}.page-header__nav{display:flex;align-items:center;gap:var(--space-1);margin-left:var(--space-6)}.page-header__nav-link{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);text-decoration:none;padding:var(--space-1) var(--space-3);border-radius:var(--radius-md);transition:background-color var(--transition-fast),color var(--transition-fast)}.page-header__nav-link:hover{background:var(--color-surface-raised);color:var(--color-text-primary);text-decoration:none}.page-header__user{display:flex;align-items:center;gap:var(--space-2);margin-left:auto}.page-header__user .btn{padding:var(--space-1) var(--space-3)}.page-header__user-name{max-width:12rem;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-header__user-error{font-size:var(--font-size-xs);color:var(--color-danger)}.page-header__subtitle{font-size:var(--font-size-sm);color:var(--color-text-muted);margin-left:auto}.badge{display:inline-flex;align-items:center;gap:var(--space-1);padding:.125rem var(--space-2);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);border-radius:var(--radius-full);border:1px solid transparent;white-space:nowrap;letter-spacing:.02em;text-transform:uppercase}@media (max-width:768px){.container{padding-inline:var(--space-4)}h1{font-size:var(--font-size-2xl)}h2{font-size:var(--font-size-xl)}}@media (max-width:640px){:root{--header-height:5rem}.page-header{height:auto}.page-header__inner{flex-wrap:wrap;gap:var(--space-2);padding:var(--space-2) var(--space-4)}.page-header__logo{flex-basis:100%;white-space:nowrap}.page-header__nav{width:100%;justify-content:space-between;gap:0;margin-left:0}.page-header__nav-link{padding:var(--space-1) var(--space-2);font-size:var(--font-size-xs);white-space:nowrap}.page-header__user{flex-basis:100%;margin-left:0;justify-content:space-between}.page-header__user-name{margin-right:auto}:root:has(.page-header__user){--header-height:7.25rem}}