*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;background:#f5f6f8;color:#1f2937}.site-nav{display:flex;align-items:center;gap:16px;padding:12px 24px;background:#fff;border-bottom:1px solid #e5e7eb}.site-nav .brand{font-weight:700;color:#4f46e5;text-decoration:none}.site-nav .spacer{flex:1 1}.site-nav a{color:#4b5563;text-decoration:none;font-size:14px}.site-nav a:hover{color:#4f46e5}.avatar-placeholder{width:34px;height:34px;border-radius:50%;background:#e5e7eb}.user-menu{position:relative}.user-trigger{display:flex;align-items:center;gap:8px;margin-top:0;padding:4px 10px 4px 4px;background:transparent;border:0;border-radius:999px;cursor:pointer}.user-trigger:hover{background:#f3f4f6}.user-trigger:focus-visible{outline:2px solid #6366f1;outline-offset:1px}.avatar-fallback,.avatar-img{width:34px;height:34px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex:none}.avatar-img{object-fit:cover}.avatar-fallback{color:#fff;font-size:15px;font-weight:600}.user-name{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;color:#4b5563}.caret{font-size:10px;color:#9ca3af;transition:transform .15s}.user-menu:focus-within .caret,.user-menu:hover .caret{transform:rotate(180deg)}.user-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:176px;padding:6px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 8px 24px rgb(0 0 0/8%);opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .12s,transform .12s,visibility .12s;z-index:10}.user-dropdown:before{content:"";position:absolute;top:-6px;left:0;right:0;height:6px}.user-menu:focus-within .user-dropdown,.user-menu:hover .user-dropdown{opacity:1;visibility:visible;transform:none}.dropdown-header{padding:8px 10px;margin-bottom:4px;border-bottom:1px solid #f3f4f6}.dropdown-name{font-size:14px;font-weight:600;color:#1f2937;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-username{font-size:12px;color:#9ca3af}.user-dropdown a{display:block;padding:8px 10px;border-radius:8px}.user-dropdown a:hover{background:#f3f4f6}.password-field{position:relative;display:block}.password-field input{width:100%;padding-right:40px}.eye-toggle{position:absolute;right:4px;top:50%;transform:translateY(-50%);margin:0;padding:6px;display:inline-flex;background:transparent;border:0;border-radius:6px;color:#9ca3af;cursor:pointer}.eye-toggle:hover{background:#f3f4f6;color:#4b5563}.eye-toggle:focus-visible{outline:2px solid #6366f1;outline-offset:1px}.eye-toggle svg{display:block}.admin-shell{display:flex;align-items:stretch;min-height:calc(100vh - 60px)}.admin-sidebar{width:200px;flex:none;padding:14px 12px 20px;background:#fff;border-right:1px solid #e5e7eb;transition:width .18s ease;overflow:visible}.admin-sidebar.collapsed{width:64px}.admin-sidebar-head{display:flex;align-items:center;gap:8px;min-height:32px;margin-bottom:14px}.admin-sidebar-title{flex:1 1;font-size:13px;font-weight:600;color:#374151;white-space:nowrap;overflow:hidden}.sidebar-toggle{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;margin-top:0;padding:0;border:1px solid #e5e7eb;border-radius:6px;background:transparent;color:#6b7280;cursor:pointer}.sidebar-toggle:hover{border-color:#4f46e5;color:#4f46e5;background:#eef2ff}.admin-sidebar.collapsed .admin-sidebar-head,.sidebar-logo-btn{justify-content:center}.sidebar-logo-btn{display:inline-flex;align-items:center;width:40px;height:40px;margin-top:0;padding:0;border:0;border-radius:8px;background:transparent;cursor:pointer}.sidebar-logo-btn:hover{background:#eef2ff}.admin-sidebar.collapsed .admin-menu-item{justify-content:center;padding:9px 0}.admin-menu-title{margin:0 0 10px;padding:0 12px;font-size:12px;color:#9ca3af;letter-spacing:.05em}.admin-menu{display:flex;flex-direction:column;gap:4px}.admin-menu-item{display:flex;align-items:center;justify-content:flex-start;gap:8px;padding:9px 12px;border-radius:8px;color:#4b5563;font-size:14px;text-decoration:none}.admin-menu-item .menu-label{white-space:nowrap;overflow:hidden}.admin-menu-item.disabled{justify-content:space-between}.admin-menu-item.disabled .menu-label{flex:1 1}a.admin-menu-item:hover{background:#f3f4f6}a.admin-menu-item.active{background:#eef2ff;color:#4f46e5;font-weight:600}.admin-menu-item.disabled{color:#c7cbd4;cursor:not-allowed}.admin-menu-item .soon{font-size:11px;color:#c7cbd4}.admin-main{min-width:0;height:calc(100vh - 60px);padding:20px 24px;overflow:hidden}.admin-main,.list-view{flex:1 1;display:flex;flex-direction:column}.list-view{min-height:0}.list-scroll{margin-top:16px}.admin-content{display:flex;justify-content:center;align-items:flex-start;padding-top:4vh}.admin-content,.admin-fill{flex:1 1;min-height:0;overflow-y:auto}.admin-bar{display:flex;align-items:center;justify-content:space-between;gap:16px}.admin-bar h1{margin:0}.button-link{display:inline-block;padding:9px 14px;border-radius:8px;background:#4f46e5;color:#fff!important;font-size:14px;text-decoration:none}.button-link:hover{background:#4338ca;color:#fff}.admin-table{width:100%;border-collapse:collapse;background:#fff;border:1px solid #e5e7eb;border-radius:12px;overflow:hidden;font-size:14px}.admin-table td,.admin-table th{padding:10px 12px;text-align:left;border-bottom:1px solid #f3f4f6;white-space:nowrap}.admin-table th{background:#f9fafb;color:#6b7280;font-weight:600;font-size:13px}.admin-table tbody tr:last-child td{border-bottom:0}.row-action{display:inline-block;margin-left:8px;padding:4px 10px;border:1px solid #d1d5db;border-radius:6px;background:transparent;color:#4b5563;font-size:13px;cursor:pointer;text-decoration:none}.row-action:hover{border-color:#4f46e5;color:#4f46e5}.row-action.danger:hover{border-color:#dc2626;color:#dc2626}.list-pager{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:12px;padding-top:12px;border-top:1px solid #e5e7eb;background:inherit}.list-pager button{margin-top:0;padding:7px 14px}.list-pager button:disabled{opacity:.5;cursor:not-allowed}.form-card{width:460px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:28px;box-shadow:0 4px 16px rgb(0 0 0/4%)}.form-card h1{margin:0 0 20px;font-size:20px}.back-link{margin:0 0 12px;font-size:13px}.roles-fieldset{margin:0;padding:10px 12px;border:1px solid #d1d5db;border-radius:8px;display:flex;gap:16px}.roles-fieldset legend{padding:0 6px;font-size:13px;color:#4b5563}.checkbox-label{flex-direction:row!important;align-items:center;gap:6px!important;font-size:14px;color:#1f2937}.checkbox-label input[type=checkbox]{width:15px;height:15px;padding:0}.page{max-width:720px;margin:0 auto;padding:32px 24px}.auth-page{min-height:calc(70vh - 60px);display:flex;align-items:flex-start;justify-content:center;padding-top:5vh}.auth-card{width:360px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:32px 28px;box-shadow:0 4px 16px rgb(0 0 0/4%)}.auth-card h1{margin:0 0 20px;font-size:20px}form{gap:10px}form,label{display:flex;flex-direction:column}label{gap:4px;font-size:13px;color:#4b5563}input,select{padding:8px 10px;border:1px solid #d1d5db;border-radius:8px;font-size:14px}input:focus,select:focus{outline:2px solid #6366f1;outline-offset:1px}button{margin-top:6px;padding:9px 12px;border:0;border-radius:8px;background:#4f46e5;color:#fff;font-size:14px;cursor:pointer}button:hover{background:#4338ca}button:disabled{opacity:.6;cursor:not-allowed}button.ghost{margin-top:16px;width:100%;background:transparent;color:#6b7280;border:1px solid #d1d5db}.field-error{margin:0;font-size:12px;color:#dc2626}.form-error{color:#dc2626}.form-error,.form-ok{margin:4px 0 0;font-size:13px}.form-ok{color:#059669}.loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;min-height:60vh;color:#6b7280;font-size:14px}.loading-inline{min-height:160px}.loading-spinner{width:28px;height:28px;border:3px solid #e5e7eb;border-top-color:#4f46e5;border-radius:50%;animation:loading-spin .8s linear infinite}@keyframes loading-spin{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.loading-spinner{animation:none}}.hint{margin:8px 0 0;font-size:13px;color:#6b7280}.hint a{color:#4f46e5}.profile-facts{margin:0 0 16px;display:flex;flex-direction:column;gap:8px}.profile-facts div{display:flex;gap:12px;font-size:14px}.profile-facts dt{width:56px;color:#6b7280}.profile-facts dd{margin:0}.rule-form{display:grid;grid-template-columns:1fr 140px 160px;grid-gap:12px;gap:12px;align-items:end;padding:16px;margin:16px 0;background:#fff;border:1px solid #e5e7eb;border-radius:12px}.rule-form label{gap:4px}.rule-form .form-error,.rule-form-actions{grid-column:1/-1}.rule-form-actions{display:flex;gap:8px}.rule-form-actions button{margin-top:0;width:auto}.effect-allow{color:#059669}.effect-deny{color:#dc2626}.inherited-rules{margin-top:24px}.inherited-block{margin-top:12px}.inherited-block h2{display:flex;align-items:center;gap:8px;margin:0 0 8px;font-size:15px}.project-detail h2{margin:20px 0 8px;font-size:14px;color:#374151}.project-synopsis{margin:12px 0 0;color:#374151;line-height:1.7}.var-chips{display:flex;flex-wrap:wrap;gap:8px}.var-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:999px;background:#f9fafb;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.var-chip em{font-style:normal;color:#6b7280}.asset-cards{display:flex;flex-direction:column;gap:10px}.asset-card{display:flex;align-items:center;gap:12px;padding:14px 16px;border:1px solid #e5e7eb;border-radius:10px;background:#fff;text-decoration:none;color:inherit;transition:border-color .15s ease,box-shadow .15s ease}.asset-card:hover{border-color:#4f46e5;box-shadow:0 1px 6px rgba(79,70,229,.15)}.asset-card-title{font-weight:600;font-size:14px}.asset-card-desc{flex:1 1;color:#6b7280;font-size:13px}.asset-card-arrow{color:#4f46e5;font-size:16px}.graph-page{height:100vh;height:100dvh;display:flex;flex-direction:column}.graph-canvas{flex:1 1;min-height:0}.graph-empty{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.graph-empty h3{margin:0}.graph-float{display:flex;align-items:center;gap:10px;padding:6px 14px 6px 8px;background:#fff;border:1px solid #e5e7eb;border-radius:999px;box-shadow:0 1px 6px rgba(0,0,0,.12)}.graph-back{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#4f46e5;color:#fff;text-decoration:none;font-size:14px;line-height:1}.graph-back:hover{background:#4338ca}.graph-title{font-size:13px;font-weight:600;color:#1f2937;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.graph-autolayout{margin-top:0;padding:7px 14px;border:1px solid #e5e7eb;border-radius:999px;background:#fff;color:#1f2937;font-size:13px;box-shadow:0 1px 6px rgba(0,0,0,.12);cursor:pointer}.graph-autolayout:hover{background:#fff;border-color:#4f46e5;color:#4f46e5}.graph-node-start{background:#4f46e5;color:#fff;border-radius:999px;padding:6px 18px;font-size:13px;font-weight:600}.graph-node-shot{background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:10px 12px;width:230px;box-shadow:0 1px 3px rgba(0,0,0,.08);font-size:13px}.graph-node-shot h4{margin:0 0 4px;font-size:13px}.graph-node-shot p{margin:0;color:#6b7280;font-size:12px;line-height:1.5}.graph-node-shot .graph-node-warn{color:#dc2626}.graph-node-shot.missing{border-color:#dc2626}.graph-node-ending{background:#fffbeb;border:1px solid #f59e0b;color:#92400e;border-radius:10px;padding:8px 14px;font-size:13px;font-weight:600}