.toast-enter-active,.toast-leave-active{transition:opacity .2s cubic-bezier(.32,.72,0,1),transform .2s cubic-bezier(.32,.72,0,1)}.toast-enter-from,.toast-leave-to{opacity:0;transform:translate(-50%) translateY(-8px)}:root{--bg: #f6f7f9;--bg-soft: #fbfbfd;--panel: #ffffff;--panel-hover: #f7f9fc;--border: #eaecf1;--border-strong: #dce0e8;--text: #10131a;--text-2: #5a6272;--text-3: #8d96a5;--primary: #3b6ef6;--primary-hover: #2c5ce8;--primary-bg: #eef3ff;--primary-ring: rgba(59, 110, 246, .16);--danger: #e5484d;--danger-bg: #fdeeee;--danger-ring: rgba(229, 72, 77, .16);--success: #30a46c;--success-bg: #e9f7ef;--warning: #d9822b;--warning-bg: #fdf3e6;--purple: #7c5cf0;--purple-bg: #f1eefd;--radius-xs: 5px;--radius-sm: 6px;--radius: 8px;--radius-lg: 12px;--radius-xl: 16px;--shadow-xs: 0 1px 2px rgba(16, 24, 40, .04);--shadow-sm: 0 1px 3px rgba(16, 24, 40, .06), 0 1px 2px rgba(16, 24, 40, .03);--shadow-md: 0 6px 16px rgba(16, 24, 40, .08), 0 2px 4px rgba(16, 24, 40, .04);--shadow-lg: 0 16px 40px rgba(16, 24, 40, .12), 0 4px 10px rgba(16, 24, 40, .04);--shadow: var(--shadow-sm);--ease: cubic-bezier(.32, .72, 0, 1);--dur: .17s;--topbar-h: 56px}*{box-sizing:border-box}html,body,#app{height:100%}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:inherit;text-decoration:none}h1,h2,h3,h4,p{margin:0}button,input,select,textarea{font-family:inherit}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#d3d8e0;border:3px solid transparent;background-clip:content-box;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#bcc3cf;background-clip:content-box}::-webkit-scrollbar-track{background:transparent}.app{height:100%;display:flex;flex-direction:column;overflow:hidden}.topbar{height:var(--topbar-h);background:#ffffffe0;-webkit-backdrop-filter:saturate(180%) blur(12px);backdrop-filter:saturate(180%) blur(12px);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:20px;padding:0 22px;position:sticky;top:0;z-index:100}.brand{display:flex;align-items:center;gap:9px;font-size:15px;font-weight:600;letter-spacing:-.01em;white-space:nowrap}.brand-logo{width:26px;height:26px;border-radius:8px;background:linear-gradient(135deg,#3b6ef6,#7c5cf0);color:#fff;font-size:11.5px;font-weight:700;letter-spacing:0;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 6px #3b6ef652;flex:none}.topbar nav{display:flex;align-items:center;gap:2px;flex:1}.topbar nav>a,.nav-item{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;border-radius:var(--radius);color:var(--text-2);font-size:14px;font-weight:500;cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}.topbar nav>a:hover,.nav-item:hover{background:var(--panel-hover);color:var(--text)}.topbar nav>a.router-link-exact-active{background:var(--primary-bg);color:var(--primary);font-weight:600}.nav-icon{width:16px;height:16px;flex:none;opacity:.85}.router-link-exact-active .nav-icon,.nav-item.is-active .nav-icon{opacity:1}.nav-item.is-active{background:var(--primary-bg);color:var(--primary);font-weight:600}.nav-group{position:relative}.nav-group:after{content:"";position:absolute;top:100%;left:-10px;right:-10px;height:9px}.nav-group .nav-menu{position:absolute;top:calc(100% + 8px);left:0;min-width:150px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:5px;display:none;z-index:200}.nav-group:hover .nav-menu{display:block;animation:popIn .16s var(--ease)}.nav-menu a{display:block;padding:8px 11px;border-radius:var(--radius-sm);color:var(--text-2);font-size:14px;transition:background var(--dur),color var(--dur)}.nav-menu a:hover{background:var(--panel-hover);color:var(--text)}.nav-menu a.router-link-exact-active{color:var(--primary);background:var(--primary-bg);font-weight:500}.topbar .right{display:flex;align-items:center;gap:10px}.user-chip{display:inline-flex;align-items:center;gap:8px;padding:4px 10px 4px 4px;border-radius:999px;background:var(--bg-soft);border:1px solid var(--border);color:var(--text-2);font-size:13.5px;white-space:nowrap}.avatar{width:24px;height:24px;border-radius:50%;background:linear-gradient(135deg,#eaf0ff,#e4e0fd);color:var(--primary);font-size:12.5px;font-weight:600;display:flex;align-items:center;justify-content:center;flex:none}.user-name{color:var(--text-2);font-size:14px}.content{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;padding:24px;overflow:hidden}.page{width:100%;max-width:1560px;flex:1;min-height:0;display:flex;flex-direction:column}.page-head,.filters,.pager,.hd-bar{flex:none}.page-body{flex:1;min-height:0;display:flex;flex-direction:column;overflow:auto}.page-body>*{flex:none}.page-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:20px;gap:14px;flex-wrap:wrap}.page-title{font-size:21px;font-weight:650;letter-spacing:-.02em;line-height:1.3}.page-sub{color:var(--text-3);font-size:13px;margin-top:3px}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;box-shadow:var(--shadow-xs)}.card+.card{margin-top:16px}.card.is-orphan{border-style:dashed}.table-card{padding:0;overflow:hidden}.card-title{font-size:15px;font-weight:600;letter-spacing:-.01em;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:34px;padding:0 14px;border:1px solid var(--border-strong);background:var(--panel);color:var(--text);border-radius:var(--radius);font-size:14px;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;box-shadow:var(--shadow-xs);transition:background var(--dur) var(--ease),border-color var(--dur) var(--ease),color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease)}.btn:hover{background:var(--panel-hover);border-color:var(--border-strong);box-shadow:var(--shadow-sm)}.btn:active{transform:translateY(1px);box-shadow:var(--shadow-xs)}.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--primary-ring);border-color:var(--primary)}.btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}.btn:disabled:hover{background:var(--panel);border-color:var(--border-strong);transform:none}.btn-primary{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 1px 2px #3b6ef63d}.btn-primary:hover{background:var(--primary-hover);border-color:var(--primary-hover);color:#fff;box-shadow:0 4px 14px #3b6ef647}.btn-primary:disabled:hover{background:var(--primary);border-color:var(--primary);color:#fff}.btn-danger:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-bg)}.btn-danger-solid{background:var(--danger);border-color:var(--danger);color:#fff;box-shadow:0 1px 2px #e5484d3d}.btn-danger-solid:hover{background:#d13b40;border-color:#d13b40;color:#fff;box-shadow:0 4px 14px #e5484d47}.btn-text{border-color:transparent;background:transparent;color:var(--text-2);padding:0 10px;box-shadow:none}.btn-text:hover{border-color:transparent;background:var(--panel-hover);color:var(--text);box-shadow:none}.btn-sm{height:28px;padding:0 10px;font-size:13px;border-radius:var(--radius-sm);gap:4px}.btn-block{width:100%;height:38px}.field{margin-bottom:16px}.field-pair{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px}.field-pair>.field{margin-bottom:0;min-width:0}.field-label{display:block;font-size:13.5px;font-weight:500;color:var(--text-2);margin-bottom:6px}.field-label .req{color:var(--danger);margin-left:2px}.input,.select,.textarea{width:100%;height:36px;padding:0 12px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--panel);color:var(--text);font-size:14px;font-family:inherit;outline:none;transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}.textarea{height:auto;min-height:84px;padding:9px 12px;resize:vertical;line-height:1.65}.input:hover,.select:hover,.textarea:hover{border-color:#c9cfda}.input:focus,.select:focus,.textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-ring)}.input::placeholder,.textarea::placeholder{color:var(--text-3)}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--text-3) 50%),linear-gradient(135deg,var(--text-3) 50%,transparent 50%);background-position:right 15px center,right 10px center;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:28px}.form-row{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}.form-row-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 16px}.form-actions{display:flex;justify-content:flex-end;gap:10px;padding-top:6px}.field-hint{font-size:13px;color:var(--text-3);margin-top:5px;line-height:1.5}.checkbox-row{display:flex;flex-wrap:wrap;gap:8px 10px;padding:2px 0}.checkbox-label{display:inline-flex;align-items:center;gap:6px;font-size:14px;cursor:pointer;color:var(--text);padding:5px 11px 5px 9px;border:1px solid var(--border);border-radius:999px;background:var(--bg-soft);transition:border-color var(--dur),background var(--dur),color var(--dur)}.checkbox-label:hover{border-color:var(--border-strong);background:var(--panel-hover)}.checkbox-label:has(input:checked){border-color:var(--primary);background:var(--primary-bg);color:var(--primary);font-weight:500}.checkbox-label input{cursor:pointer;accent-color:var(--primary);margin:0;width:15px;height:15px}.chip-group{display:flex;flex-wrap:wrap;gap:8px;padding:1px 0}.chip{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 14px;border:1px solid var(--border-strong);border-radius:999px;background:var(--panel);color:var(--text-2);font-size:13.5px;font-family:inherit;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background var(--dur) var(--ease),border-color var(--dur) var(--ease),color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease)}.chip:hover:not(:disabled):not(.is-on){border-color:var(--text-3);background:var(--panel-hover);color:var(--text)}.chip:active:not(:disabled){transform:scale(.97)}.chip.is-on{color:#fff;font-weight:600;box-shadow:0 2px 8px #1018282e}.chip:disabled{opacity:.5;cursor:not-allowed}.chip-dot{width:7px;height:7px;border-radius:50%;flex:none;transition:background var(--dur) var(--ease)}.chip.is-on .chip-dot{background:#ffffffe6!important}.dp{position:relative;display:inline-flex;width:100%}.dp-trigger{display:flex;align-items:center;gap:8px;width:100%;height:36px;padding:0 12px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--panel);color:var(--text);font-size:14px;font-family:inherit;text-align:left;cursor:pointer;outline:none;transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}.dp-trigger:hover:not(:disabled){border-color:#c9cfda}.dp.is-open .dp-trigger,.dp-trigger:focus-visible{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-ring)}.dp-trigger.is-empty .dp-text{color:var(--text-3)}.dp.is-disabled .dp-trigger{background:var(--bg-soft);color:var(--text-3);cursor:not-allowed}.dp-icon{width:16px;height:16px;flex:none;color:var(--text-3);transition:color var(--dur) var(--ease)}.dp.is-open .dp-icon{color:var(--primary)}.dp-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums}.dp-clear{position:absolute;right:9px;top:50%;transform:translateY(-50%);width:20px;height:20px;display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:var(--text-3);cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}.dp-clear svg{width:12px;height:12px}.dp-clear:hover{background:var(--border);color:var(--text)}.dp:has(.dp-clear) .dp-text{padding-right:20px}.dp-panel{position:fixed;z-index:1300;width:288px;padding:12px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);animation:dpIn .16s var(--ease)}@keyframes dpIn{0%{opacity:0;transform:translateY(-4px) scale(.985)}to{opacity:1;transform:none}}.dp-head{display:flex;align-items:center;gap:2px;margin-bottom:8px}.dp-title{flex:1;text-align:center;font-size:14px;font-weight:600;letter-spacing:-.01em;font-variant-numeric:tabular-nums}.dp-nav{width:28px;height:28px;flex:none;display:flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-3);cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}.dp-nav svg{width:15px;height:15px}.dp-nav:hover{background:var(--panel-hover);color:var(--primary)}.dp-week{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:2px}.dp-week span{height:26px;display:flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:500;color:var(--text-3)}.dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.dp-day{height:32px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text);font-size:13.5px;font-family:inherit;font-variant-numeric:tabular-nums;cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}.dp-day:hover{background:var(--panel-hover)}.dp-day.is-out{color:var(--text-3);opacity:.6}.dp-day.is-today{color:var(--primary);font-weight:700;background:var(--primary-bg)}.dp-day.is-on{background:var(--primary);color:#fff;font-weight:600}.dp-day.is-on:hover{background:var(--primary-hover)}.dp-foot{display:flex;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}.dp-foot-btn{flex:1;height:32px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--panel);color:var(--text-2);font-size:13.5px;font-family:inherit;font-weight:500;cursor:pointer;transition:border-color var(--dur) var(--ease),background var(--dur) var(--ease),color var(--dur) var(--ease)}.dp-foot-btn:hover{border-color:var(--primary);background:var(--primary-bg);color:var(--primary)}.filter-item .dp{min-width:136px}.filter-item .dp-trigger{height:34px;font-size:13.5px}.field .dp{width:100%}.input:disabled,.select:disabled,.textarea:disabled{background:var(--bg-soft);color:var(--text-3);border-color:var(--border);cursor:not-allowed}.input:disabled::placeholder,.textarea:disabled::placeholder{color:var(--text-3)}.table-wrap{overflow-x:auto}table.tbl{width:100%;border-collapse:collapse;font-size:14px}table.tbl th{text-align:left;font-weight:500;color:var(--text-3);font-size:13px;letter-spacing:.01em;padding:11px 12px;border-bottom:1px solid var(--border-strong);white-space:nowrap}table.tbl td{padding:12px;border-bottom:1px solid var(--border);vertical-align:middle;font-variant-numeric:tabular-nums}table.tbl tbody tr{transition:background var(--dur) var(--ease)}table.tbl tbody tr:hover{background:var(--panel-hover)}table.tbl tbody tr:last-child td{border-bottom:none}.col-actions{white-space:nowrap;text-align:right}.row-click{cursor:pointer}.row-click:active{background:var(--primary-bg)}.link{color:var(--primary);cursor:pointer;font-weight:500;transition:color var(--dur)}.link:hover{color:var(--primary-hover);text-decoration:underline;text-underline-offset:3px}.muted{color:var(--text-3)}.code{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:13px;letter-spacing:-.01em}.ellipsis{max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.action-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:16px}.action-bar .spacer{flex:1}.tag{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:999px;font-size:12.5px;font-weight:500;line-height:1;white-space:nowrap}.tag-dot{width:6px;height:6px;border-radius:50%;margin-right:5px}.tag-admin{margin-left:6px;height:19px;padding:0 7px;font-size:11.5px;background:var(--primary-bg);color:var(--primary)}.empty{padding:44px 20px;text-align:center;color:var(--text-3);font-size:13.5px}.loading{padding:32px;text-align:center;color:var(--text-3);font-size:13.5px}.loading:after{content:"";display:inline-block;width:11px;height:11px;margin-left:7px;border:2px solid var(--border-strong);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite;vertical-align:-1px}.icon-btn{width:30px;height:30px;border:none;background:transparent;color:var(--text-3);font-size:19px;line-height:1;cursor:pointer;border-radius:var(--radius-sm);display:inline-flex;align-items:center;justify-content:center;font-family:inherit;flex:none;transition:background var(--dur),color var(--dur)}.icon-btn:hover{background:var(--panel-hover);color:var(--text)}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#10141c5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);z-index:1000;display:flex;align-items:center;justify-content:center;padding:20px;animation:fadeIn .2s var(--ease)}.modal{background:var(--panel);border-radius:var(--radius-xl);width:540px;max-width:100%;max-height:88vh;display:flex;flex-direction:column;box-shadow:var(--shadow-lg);animation:modalIn .22s var(--ease)}.modal-head{flex:none;display:flex;align-items:center;gap:10px;padding:16px 20px;border-bottom:1px solid var(--border);font-size:15.5px;font-weight:600;letter-spacing:-.01em}.modal-head.between{justify-content:space-between}.modal-head.between .icon-btn{margin:-6px -8px -6px 0}.modal-title-wrap{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.modal-title-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-head .tag{flex:none;height:24px;padding:0 10px;font-size:13px;font-weight:600}.modal-body{padding:20px;overflow-y:auto;flex:1;min-height:0}.modal-foot{flex:none;padding:14px 20px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:10px}.modal-sm{width:424px}.modal-lg{width:660px}.modal-xl{width:820px}.modal-mask-inner{z-index:1100}.confirm-msg{font-size:14.5px;line-height:1.65;color:var(--text);font-weight:500;word-break:break-word}.confirm-msg+.field-hint{margin-top:8px}.desc-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 24px}.desc-item{display:flex;gap:10px;font-size:13.5px;min-width:0}.desc-item .k{color:var(--text-3);flex:none;width:66px}.desc-item .v{color:var(--text);min-width:0;word-break:break-word;font-weight:500}.plan-hint{margin-left:8px;padding:1px 7px;border-radius:999px;font-size:12px;font-weight:400;color:#15803d;background:#e8f7ef}.plan-hint.is-bad{color:#b91c1c;background:#fdecec}.timeline{position:relative;padding-left:20px}.timeline:before{content:"";position:absolute;left:4px;top:8px;bottom:8px;width:1.5px;background:var(--border)}.tl-item{position:relative;padding-bottom:18px}.tl-item:before{content:"";position:absolute;left:-20px;top:6px;width:10px;height:10px;border-radius:50%;background:var(--panel);border:2px solid var(--border-strong);box-shadow:0 0 0 3px var(--bg)}.tl-item.is-latest:before{border-color:var(--primary);background:var(--primary-bg)}.tl-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:5px}.tl-user{font-weight:600;font-size:14px}.tl-time{color:var(--text-3);font-size:13px}.tl-content{color:var(--text);white-space:pre-wrap;word-break:break-word;margin-top:5px;font-size:14px}.tl-flow{display:inline-flex;align-items:center;gap:5px}.tl-flow .st{display:inline-flex;align-items:center;height:21px;padding:0 9px;border-radius:999px;font-size:12.5px;font-weight:600;line-height:1;white-space:nowrap}.tl-flow .st-arrow,.tl-flow .st-keep{color:var(--text-3);font-size:12.5px}.thumb-list{display:flex;flex-wrap:wrap;gap:8px}.thumb{width:80px;height:80px;border-radius:var(--radius);border:1px solid var(--border);object-fit:cover;cursor:zoom-in;background:var(--bg);box-shadow:var(--shadow-xs);transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}.thumb:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}.thumb-sm{width:64px;height:64px}.upload-box{width:80px;height:80px;border:1.5px dashed var(--border-strong);border-radius:var(--radius);display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-3);cursor:pointer;font-size:12.5px;gap:2px;background:var(--bg-soft);transition:border-color var(--dur),color var(--dur),background var(--dur)}.upload-box:hover{border-color:var(--primary);color:var(--primary);background:var(--primary-bg)}.thumb-wrap{position:relative}.thumb-del{position:absolute;top:-7px;right:-7px;width:20px;height:20px;border-radius:50%;background:#10141cc7;color:#fff;border:2px solid var(--panel);font-size:12.5px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background var(--dur)}.thumb-del:hover{background:var(--danger)}.file-list{display:flex;flex-direction:column;align-items:flex-start;gap:7px}.file-item{display:flex;align-items:center;gap:9px;width:100%;max-width:440px;min-width:0;padding:8px 10px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-soft);font-size:13.5px;line-height:1.4;transition:border-color var(--dur),background var(--dur),box-shadow var(--dur)}.file-item-link:hover{border-color:var(--primary);background:var(--primary-bg);box-shadow:var(--shadow-xs)}.file-item-link:hover .file-name{color:var(--primary)}.file-ext{flex:none;min-width:38px;padding:2px 5px;border-radius:var(--radius-xs);background:var(--primary-bg);color:var(--primary);font-size:10px;font-weight:700;letter-spacing:.3px;text-align:center}.file-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.file-size{flex:none;color:var(--text-3);font-size:13px;font-variant-numeric:tabular-nums}.file-dl{flex:none;color:var(--primary);font-size:13px;font-weight:500}.file-del{flex:none;width:20px;height:20px;padding:0;border:none;border-radius:50%;background:transparent;color:var(--text-3);font-size:15px;line-height:1;cursor:pointer;transition:background var(--dur),color var(--dur)}.file-del:hover{background:var(--danger-bg);color:var(--danger)}.file-add{padding:7px 14px;border:1.5px dashed var(--border-strong);border-radius:var(--radius);background:var(--bg-soft);color:var(--text-2);font-size:13px;font-weight:500;font-family:inherit;cursor:pointer;transition:border-color var(--dur),color var(--dur),background var(--dur)}.file-add:hover:not(:disabled){border-color:var(--primary);color:var(--primary);background:var(--primary-bg)}.file-add:disabled{cursor:default;color:var(--text-3)}.file-list-sm .file-item{font-size:13px;padding:6px 9px}.preview-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#080a0edb;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1100;display:flex;align-items:center;justify-content:center;cursor:zoom-out;padding:40px;animation:fadeIn .18s var(--ease)}.preview-mask img{max-width:100%;max-height:100%;object-fit:contain;border-radius:var(--radius);box-shadow:0 24px 70px #00000080;animation:modalIn .22s var(--ease)}.filters{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px 16px;margin-bottom:16px;box-shadow:var(--shadow-xs)}.filter-row{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end}.filter-item{display:flex;flex-direction:column;gap:5px;min-width:0}.filter-item>label{font-size:13px;font-weight:500;color:var(--text-2)}.filter-item .input,.filter-item .select{height:34px;font-size:13.5px;min-width:136px}.filter-item .select{background-position:calc(100% - 15px) 15px,calc(100% - 10px) 15px}.filter-item.wide .input{min-width:200px}.cond-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;padding-top:12px;border-top:1px dashed var(--border)}.cond-flag{font-size:12px;color:var(--text-3)}.cond-chip{display:inline-flex;align-items:center;gap:4px;height:26px;padding:0 4px 0 10px;border:1px solid var(--border-strong);border-radius:999px;background:var(--panel-hover);color:var(--text-2);font-size:12.5px;line-height:1;white-space:nowrap}.cond-x{width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:50%;background:transparent;color:var(--text-3);font-size:15px;line-height:1;cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}.cond-x:hover{background:var(--border);color:var(--text)}.filter-spacer{flex:1}.filter-actions{display:flex;gap:8px;align-items:center}.segmented{display:inline-flex;align-items:center;gap:2px;padding:3px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);height:34px}.segmented .btn{height:26px;padding:0 12px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-2);font-size:13px;font-weight:500;box-shadow:none}.segmented .btn:hover{background:#ffffffb3;color:var(--text);border-color:transparent;box-shadow:none;transform:none}.segmented .btn.btn-primary,.segmented .btn.btn-primary:hover{background:var(--panel);color:var(--text);font-weight:600;box-shadow:var(--shadow-xs);border-color:transparent}.pager{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:12px;row-gap:8px;padding-top:14px;color:var(--text-2);font-size:13.5px}.pager span{font-variant-numeric:tabular-nums}.pager-info{margin-right:auto}.pager-size{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}.pager-size .select{width:auto;height:28px;padding:0 24px 0 8px;font-size:13px;background-position:right 13px center,right 8px center}.pager-btns{display:inline-flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:6px}.pager-gap{color:var(--text-3);padding:0 2px;-webkit-user-select:none;user-select:none}.gantt{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-xs)}.gantt-scroll{overflow-x:auto}.gantt-inner{min-width:max-content;position:relative}.gantt-head{display:flex;position:sticky;top:0;z-index:20;background:var(--bg-soft);border-bottom:1px solid var(--border-strong)}.gantt-label-col{flex:none;border-right:1px solid var(--border);padding:0 14px;display:flex;align-items:center;height:40px;font-size:13px;font-weight:500;color:var(--text-3);position:sticky;left:0;background:var(--bg-soft);z-index:22}.gantt-days{display:flex;height:40px}.gantt-day{flex:none;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:12px;color:var(--text-3);border-left:1px solid var(--border);line-height:1.25;font-variant-numeric:tabular-nums}.gantt-day span:last-child{font-size:11px;opacity:.75}.gantt-day.is-off{background:#eceef4;color:var(--text-2)}.gantt-day.is-holiday{background:#fbe3dd;color:#b3352b;font-weight:600}.gantt-day.is-holiday span:last-child{opacity:.9}.gantt-day.is-makeup{background:#fdf6ea;color:var(--warning)}.gantt-day.is-today{color:var(--primary);font-weight:700;background:var(--primary-bg)}.gantt-row{display:flex;border-bottom:1px solid var(--border);background:var(--panel);transition:background var(--dur)}.gantt-row:hover{background:var(--panel-hover)}.gantt-row:last-child{border-bottom:none}.gantt-row-label{flex:none;border-right:1px solid var(--border);padding:0 14px;height:34px;display:flex;align-items:center;gap:6px;font-size:13px;position:sticky;left:0;background:inherit;z-index:10;overflow:hidden}.gantt-row-label .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gantt-track{position:relative;height:34px;flex:none}.gantt-offcol{position:absolute;top:0;bottom:0;background:#f3f5f9;pointer-events:none}.gantt-offcol.is-holiday{background:#fdf1ed}.gantt-bar{position:absolute;top:9px;height:16px;border-radius:8px;overflow:hidden;cursor:pointer;box-shadow:inset 0 -1px #00000014;transition:transform var(--dur) var(--ease),box-shadow var(--dur)}.gantt-seg{position:absolute;top:0;bottom:0}.gantt-seg.seg-slack{background:repeating-linear-gradient(45deg,var(--gantt-slack, #e3e6ed) 0 5px,#f5f7fb 5px 10px);box-shadow:inset 1px 0 #ffffffbf}.gantt-seg.seg-over{background:var(--gantt-over, #e5484d);box-shadow:inset 1px 0 #ffffff73}.gantt-split{position:absolute;top:0;bottom:0;width:1.5px;background:#10182859;pointer-events:none}.gantt-split.is-plan{width:2px;background:#10182880}.gantt-bar:hover{transform:scaleY(1.25);box-shadow:0 3px 10px #10182838}.gantt-bus{position:absolute;top:9px;height:20px;border:1px solid var(--border-strong);border-radius:999px;background:#f1f3f6;overflow:hidden}.gantt-bus-inner{height:100%;background:linear-gradient(90deg,var(--gantt-bus, #12a594) 0%,#34bdab 100%);border-radius:999px 0 0 999px;transition:width .4s var(--ease)}.gantt-group-bus{position:absolute;top:0;height:100%;z-index:1;pointer-events:none}.gantt-group-bus .gantt-bus{pointer-events:auto;cursor:pointer;top:50%;transform:translateY(-50%);height:22px;border:1.5px solid #7f97c9;background:#e3e9f6;box-shadow:inset 0 1px 2px #1018280f,0 1px 2px #10182814}.gantt-group-bus .gantt-bus:hover{filter:brightness(.97)}.gantt-bus-pct{position:absolute;top:50%;transform:translateY(-50%);height:22px;display:flex;align-items:center;font-size:11.5px;font-weight:700;color:var(--text-2);font-variant-numeric:tabular-nums;white-space:nowrap;pointer-events:none}.gantt-proj-status{display:inline-flex;vertical-align:middle;margin-left:6px;align-items:center;height:18px;padding:0 6px;border-radius:999px;font-size:11px;font-weight:600;line-height:1;white-space:nowrap}.gantt-group-head{display:flex;align-items:center;gap:9px;padding:0 14px 0 0;min-height:38px;background:#f7f8fb;border-bottom:1px solid var(--border);font-size:13px;font-weight:600;color:var(--text);position:relative;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background var(--dur)}.gantt-group-head:hover{background:#f1f3f8}.gantt-group-label{flex:none;position:sticky;left:0;z-index:10;align-self:center;min-height:38px;box-sizing:border-box;display:flex;align-items:center;gap:9px;padding:6px 14px;border-right:1px solid var(--border);background:inherit}.gantt-group-label .gantt-caret{flex:none;align-self:flex-start;line-height:1.35}.gantt-group-label .gantt-group-name{flex:1 1 auto;min-width:0;line-height:1.35;white-space:normal;overflow-wrap:anywhere}.gi-kind{flex:none;display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:5px;font-size:11.5px;font-weight:600;color:var(--primary);background:var(--primary-bg)}.gi-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gi-sec{margin:0 0 6px;font-size:12px;font-weight:600;color:var(--text-3);letter-spacing:.04em}.gi-sec+.gi-list{margin-bottom:16px}.gi-list{margin:0}.gi-row{display:flex;gap:12px;padding:7px 0;border-bottom:1px dashed var(--border);font-size:13.5px}.gi-row:last-child{border-bottom:none}.gi-row dt{flex:none;width:84px;color:var(--text-3)}.gi-row dd{margin:0;min-width:0;color:var(--text)}.gi-wrap{word-break:break-word}.gantt-legend{display:flex;flex-wrap:wrap;gap:16px;align-items:center;padding:11px 16px;border-bottom:1px solid var(--border);font-size:13px;color:var(--text-2);background:var(--panel)}.gantt-legend .lg{display:inline-flex;align-items:center;gap:6px}.gantt-legend .sw{width:14px;height:8px;border-radius:999px}.gantt-legend .sw.gantt-sw-bus{background:var(--gantt-bus, #12a594);border:1px solid rgba(16,24,40,.15)}.gantt-legend .sw.gantt-sw-slack{background:repeating-linear-gradient(45deg,var(--gantt-slack, #e3e6ed) 0 4px,#f5f7fb 4px 8px);border:1px solid var(--border-strong)}.gantt-legend .sw.gantt-sw-over{background:var(--gantt-over, #e5484d)}.gantt-today-line{position:absolute;top:40px;bottom:0;width:1.5px;background:#e5484d80;z-index:5;pointer-events:none}.gantt-today-line:before{content:"";position:absolute;top:-4px;left:-3px;width:8px;height:8px;border-radius:50%;background:var(--danger)}.hd-bar{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-xs);padding:14px 16px;margin-bottom:14px}.hd-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:16px}.hd-row.hd-meta{align-items:center;margin-top:12px;padding-top:12px;border-top:1px dashed var(--border);font-size:13px;color:var(--text-2)}.hd-field{display:flex;flex-direction:column;gap:6px}.hd-field>label{font-size:12.5px;color:var(--text-3)}.hd-field .input{width:160px}.hd-year{display:flex;align-items:center;gap:6px}.hd-year-val{min-width:54px;text-align:center;font-weight:600;font-variant-numeric:tabular-nums}.hd-actions{display:flex;flex-wrap:wrap;gap:8px;margin-left:auto}.hd-stat b{color:var(--text)}.hd-dirty{margin-left:4px;color:var(--warning);font-weight:600}.hd-legend{display:flex;gap:14px;margin-left:auto}.hd-legend .hd-lg{display:inline-flex;align-items:center;gap:6px}.hd-legend i{display:inline-block;width:12px;height:12px;border-radius:4px}.hd-legend .sw-holiday{background:#fbe3dd;border:1px solid #f0c3b9}.hd-legend .sw-workday{background:#fdf6ea;border:1px solid #eedcbb}.hd-legend .sw-weekend{background:#eceef4;border:1px solid var(--border-strong)}.hd-months{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:14px}.hd-month{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-xs);padding:12px}.hd-month-head{margin-bottom:8px;font-size:13.5px;font-weight:600;color:var(--text)}.hd-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}.hd-head-cell{padding-bottom:2px;text-align:center;font-size:11.5px;color:var(--text-3)}.hd-cell{height:30px;padding:0;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--text-2);font-size:12.5px;font-variant-numeric:tabular-nums;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background var(--dur),color var(--dur),transform var(--dur) var(--ease)}.hd-cell:hover{transform:translateY(-1px);box-shadow:0 2px 8px #10182824}.hd-cell:not(.is-holiday):not(.is-workday):not(.is-weekend):hover{background:var(--panel-hover)}.hd-cell.is-blank{cursor:default;pointer-events:none}.hd-cell.is-weekend{background:#eceef4;color:var(--text-3)}.hd-cell.is-holiday{background:#fbe3dd;border-color:#f0c3b9;color:#b3352b;font-weight:600}.hd-cell.is-workday{background:#fdf6ea;border-color:#eedcbb;color:var(--warning);font-weight:600}.hd-cell.is-today{outline:2px solid var(--primary);outline-offset:-2px;color:var(--primary);font-weight:700}.toast{position:fixed;top:calc(var(--topbar-h) + 18px);left:50%;transform:translate(-50%);background:#10141ceb;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;padding:10px 20px;border-radius:999px;font-size:13.5px;font-weight:500;z-index:2000;pointer-events:none;box-shadow:var(--shadow-lg)}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(1100px 560px at 50% -8%,#e6eeff,#f6f7f900 62%),var(--bg)}.login-card{width:386px;max-width:100%;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-xl);padding:34px 32px 28px;box-shadow:var(--shadow-lg)}.login-title{font-size:21px;font-weight:650;letter-spacing:-.02em;text-align:center;margin-bottom:5px}.login-logo{width:46px;height:46px;margin:0 auto 16px;border-radius:14px;background:linear-gradient(135deg,#3b6ef6,#7c5cf0);color:#fff;font-size:17px;font-weight:700;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 22px #3b6ef647}.login-sub{text-align:center;color:var(--text-3);font-size:13px;margin-bottom:26px}.login-error{color:var(--danger);font-size:13px;margin-bottom:10px;min-height:18px;text-align:center}.stat-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-bottom:20px}.stat-card{position:relative;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px 20px;box-shadow:var(--shadow-xs);overflow:hidden;transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}.stat-card:before{content:"";position:absolute;inset:0 0 auto 0;height:3px;background:var(--accent, var(--primary))}.stat-card:nth-child(1){--accent: #d9822b}.stat-card:nth-child(2){--accent: #3b6ef6}.stat-card:nth-child(3){--accent: #7c5cf0}.stat-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}.stat-label{color:var(--text-2);font-size:13.5px;font-weight:500}.stat-num{font-size:31px;font-weight:650;letter-spacing:-.03em;margin-top:4px;line-height:1.15;font-variant-numeric:tabular-nums}.page-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.metric-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin-bottom:16px}.metric-card{position:relative;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px 16px 14px 18px;box-shadow:var(--shadow-xs);overflow:hidden}.metric-card:before{content:"";position:absolute;left:0;top:13px;bottom:13px;width:3px;border-radius:0 3px 3px 0;background:var(--accent, var(--primary))}.metric-card.is-clickable{cursor:pointer;transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease)}.metric-card.is-clickable:hover{border-color:var(--text-3);box-shadow:var(--shadow-sm, var(--shadow-xs));transform:translateY(-1px)}.metric-card.is-clickable:active{transform:translateY(0)}.metric-label{color:var(--text-2);font-size:13px;font-weight:500}.metric-num{font-size:26px;font-weight:650;letter-spacing:-.03em;line-height:1.2;margin-top:3px;font-variant-numeric:tabular-nums}.metric-sub{color:var(--text-3);font-size:12px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ov-grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:16px;margin-bottom:16px}.ov-col-3{grid-column:span 3}.ov-col-4{grid-column:span 4}.ov-col-5{grid-column:span 5}.ov-owner{display:flex;flex-direction:column;flex:1;min-height:360px}.ov-owner>.card-title,.ov-owner>.ov-legend,.ov-owner>.ov-note{flex:none}.ov-owner>.ov-note{margin-bottom:0}.ov-owner>.empty{flex:1;display:flex;align-items:center;justify-content:center;padding:0}.ov-col-5 .legend{max-width:320px}.ov-col-3 .bar-label{width:40px}.ov-col-3 .bar-value{width:24px}.ov-grid>.card{margin-top:0;min-width:0}.ov-grid .card-title{margin-bottom:12px}.tip-label{font-weight:400;font-size:12.5px}.ov-donut{display:flex;align-items:center;gap:26px;min-width:0}.donut{flex:none;display:flex;align-items:center;justify-content:center}.donut-num{font-size:23px;font-weight:650;fill:var(--text);font-variant-numeric:tabular-nums}.donut-cap{font-size:11.5px;fill:var(--text-3)}.legend{list-style:none;margin:0;padding:0;flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.legend li{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:var(--radius-sm);font-size:13px;transition:background var(--dur)}.legend li:hover{background:var(--panel-hover)}.legend li.is-clickable{cursor:pointer}.legend i{width:9px;height:9px;border-radius:3px;flex:none}.legend-label{color:var(--text-2);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.legend-num{font-weight:600;font-variant-numeric:tabular-nums}.legend-pct,.legend-rate{color:var(--text-3);text-align:right;font-variant-numeric:tabular-nums}.legend-pct{width:38px}.legend-rate{width:68px}.bar-list{display:flex;flex-direction:column;gap:11px}.bar-row{display:flex;align-items:center;gap:10px}.bar-row.is-clickable{margin:0 -6px;padding:2px 6px;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--dur) var(--ease)}.bar-row.is-clickable:hover{background:var(--panel-hover)}.bar-label{width:150px;flex:none;display:flex;align-items:center;gap:5px;min-width:0;font-size:13px;color:var(--text-2)}.bar-label-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar-tag{flex:none;padding:1px 4px;border-radius:3px;background:var(--bg);color:var(--text-3);font-size:11px;line-height:1.4}.bar-track{flex:1;min-width:0;height:16px;display:flex;background:var(--bg);border-radius:4px;overflow:hidden}.bar-seg{height:100%;min-width:0;transition:width var(--dur) var(--ease)}.bar-value{width:54px;flex:none;text-align:right;font-size:12.5px;color:var(--text-2);font-variant-numeric:tabular-nums}.col-chart{display:flex;gap:6px;--col-names-h: 37px}.col-chart.is-fill{flex:1;min-height:0}.col-chart.is-fill .col-yaxis{height:auto;align-self:stretch;margin-bottom:var(--col-names-h)}.col-chart.is-fill .col-scroll{display:flex;padding-bottom:0;scrollbar-width:thin}.col-chart.is-fill .col-inner{flex:1 0 auto;display:flex;flex-direction:column;min-height:0}.col-chart.is-fill .col-plot{flex:1;min-height:0}.col-yaxis{position:relative;flex:none;width:28px;margin-top:16px;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}.col-yaxis span{position:absolute;right:0;transform:translateY(50%);line-height:1}.col-scroll{flex:1;min-width:0;overflow-x:auto;overflow-y:hidden;padding-bottom:2px}.col-inner{padding-top:16px;width:max-content;min-width:100%}.col-plot{position:relative;display:flex;align-items:flex-end;justify-content:safe center;gap:6px;padding:0 2px;border-bottom:1px solid var(--border-strong)}.col-line{position:absolute;left:0;right:0;border-top:1px dashed var(--border);pointer-events:none}.col-slot{position:relative;flex:0 0 var(--col-w, 96px);height:100%;display:flex;align-items:flex-end;justify-content:center;cursor:pointer}.col-group{position:relative;width:min(72%,168px);display:flex;align-items:flex-end;justify-content:center;gap:5px}.col-bar{flex:1 1 0;min-width:6px;max-width:18px;border-radius:2px 2px 0 0;cursor:pointer;transition:height var(--dur) var(--ease),filter var(--dur) var(--ease)}.col-bar:hover{filter:brightness(1.12) saturate(1.1)}.col-total{position:absolute;bottom:100%;left:50%;transform:translate(-50%);padding-bottom:3px;font-size:11.5px;line-height:1;color:var(--text-2);font-variant-numeric:tabular-nums}.col-names{display:flex;justify-content:safe center;gap:6px;padding:7px 2px 0}.col-name{flex:0 0 var(--col-w, 96px);text-align:center;font-size:11.5px;line-height:1.35}.col-name-sub{display:block;height:15px;color:var(--text-3);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-name-main{display:block;line-height:15px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ov-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin:2px 0 6px;font-size:12px;color:var(--text-2)}.ov-legend-item{display:inline-flex;align-items:center;gap:5px;line-height:1.4}.ov-legend-item i{width:9px;height:9px;border-radius:2px;flex:none}.ov-note{color:var(--text-3);font-size:12px;line-height:1.6;margin-top:10px}.segmented.is-sm{height:28px;padding:2px}.segmented.is-sm .btn{height:22px;padding:0 10px;font-size:12.5px}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes popIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes modalIn{0%{opacity:0;transform:translateY(10px) scale(.975)}to{opacity:1;transform:none}}@keyframes spin{to{transform:rotate(360deg)}}.att-kind{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:999px;font-size:12.5px;font-weight:500;line-height:1;white-space:nowrap}.att-kind.is-module{background:var(--primary-bg);color:var(--primary)}.att-kind.is-project{background:var(--purple-bg);color:var(--purple)}.att-count{font-size:13px;color:var(--text-2)}.att-count.is-zero{color:var(--text-3)}.seg-count{margin-left:5px;font-size:12px;color:var(--text-3)}.segmented .btn.btn-primary .seg-count{color:var(--primary)}.att-owner{background:var(--primary-bg);color:var(--primary)}.att-drop{padding:22px 16px;border:1.5px dashed var(--border-strong);border-radius:var(--radius-lg);background:var(--bg-soft);text-align:center;cursor:pointer;transition:border-color var(--dur),background var(--dur)}.att-drop:hover,.att-drop.is-drag{border-color:var(--primary);background:var(--primary-bg)}.att-drop.is-busy{cursor:default;opacity:.72}.att-drop-main{font-size:14px;font-weight:500;color:var(--text)}.att-drop-sub{margin-top:6px;font-size:12.5px;color:var(--text-3)}.att-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:16px 0 8px;font-size:13px;color:var(--text-2)}.att-file{display:flex;align-items:center;gap:8px;min-width:0}.att-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.fp-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:flex;align-items:center;justify-content:center;padding:24px;background:#10141c85;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:fadeIn .18s var(--ease)}.fp-box{display:flex;flex-direction:column;width:100%;max-width:1080px;height:100%;max-height:90vh;overflow:hidden;background:var(--panel);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);animation:modalIn .22s var(--ease)}.fp-head{flex:none;display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid var(--border)}.fp-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14.5px;font-weight:500}.fp-size{flex:none;color:var(--text-3);font-size:12.5px;font-variant-numeric:tabular-nums}.fp-acts{flex:none;display:flex;gap:8px}.fp-acts .btn{text-decoration:none}.fp-body{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;background:var(--bg-soft)}.fp-body.fp-image{align-items:center;justify-content:center;padding:20px}.fp-body.fp-pdf{background:#525659}.fp-img{max-width:100%;max-height:100%;object-fit:contain;background:#fff;border-radius:var(--radius);box-shadow:var(--shadow-md)}.fp-frame{display:block;flex:1;width:100%;min-height:0;border:0}.fp-docx{padding:20px}.fp-docx .docx-wrapper{padding:0;background:transparent}.fp-tabs{flex:none;display:flex;gap:4px;padding:10px 12px 0;overflow-x:auto;background:var(--panel);border-bottom:1px solid var(--border)}.fp-tab{flex:none;padding:6px 12px;border:none;border-radius:var(--radius-sm) var(--radius-sm) 0 0;background:transparent;color:var(--text-2);font-size:13px;font-family:inherit;cursor:pointer;transition:background var(--dur),color var(--dur)}.fp-tab:hover{background:var(--panel-hover)}.fp-tab.is-active{background:var(--primary-bg);color:var(--primary);font-weight:500}.fp-tablewrap{padding:12px;background:var(--panel)}.fp-tablewrap table{border-collapse:collapse;font-size:13px}.fp-tablewrap td,.fp-tablewrap th{padding:4px 8px;border:1px solid var(--border);white-space:nowrap}.fp-tablewrap td:empty{background:var(--bg-soft)}.fp-code{margin:0;padding:16px 18px;color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.65;white-space:pre;-moz-tab-size:2;tab-size:2}.fp-code .j-key{color:#7c5cf0}.fp-code .j-str{color:#0d9488}.fp-code .j-num{color:#b45309}.fp-code .j-bool{color:#2563eb}.fp-code .j-null{color:var(--text-3)}.fp-hint{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:40px 20px;text-align:center}.fp-hint-title{font-size:15px;font-weight:500;color:var(--text)}.fp-hint-sub{font-size:13px;color:var(--text-3)}.fp-err .fp-hint-title{color:var(--danger)}@media(max-width:900px){.fp-mask{padding:10px}.fp-box{max-height:94vh}}@media(max-width:1100px){.content{padding:18px}.metric-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.ov-col-5,.ov-col-4{grid-column:span 6}.ov-col-3{grid-column:span 12}.ov-col-3 .bar-label{width:48px}}@media(max-width:900px){.stat-grid,.form-row,.form-row-3,.desc-grid{grid-template-columns:1fr}.ov-col-3,.ov-col-4,.ov-col-5{grid-column:span 12}.metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.ov-donut{gap:16px;flex-wrap:wrap}.bar-label{width:118px}.content{padding:14px}.topbar{gap:12px;padding:0 14px}.topbar nav>a,.nav-item{padding:7px 9px;font-size:13px}.nav-icon{display:none}.brand span:not(.brand-logo){display:none}.modal{width:100%;max-height:92vh}}@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;transition-duration:.01ms!important}}.sql-head-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.sql-body{flex:1;min-height:0;display:flex;gap:14px}.sql-side{flex:none;width:218px;padding:12px;overflow:auto}.sql-side-head{display:flex;align-items:center;justify-content:space-between;padding:0 8px 8px;font-size:12.5px;font-weight:500;color:var(--text-3);letter-spacing:.02em}.sql-side-item{display:grid;grid-template-columns:1fr auto;gap:2px 8px;width:100%;padding:7px 8px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text);font:inherit;text-align:left;cursor:pointer;transition:background var(--dur) var(--ease)}.sql-side-item:hover{background:var(--panel-hover)}.sql-side-item.is-active{background:var(--primary-bg)}.sql-side-name{font-size:13.5px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sql-side-count{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}.sql-side-cols{grid-column:1 / -1;font-size:11.5px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sql-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;gap:12px}.sql-main>.card+.card{margin-top:0}.sql-editor{flex:none;padding:14px 16px}.sql-textarea{min-height:132px;max-height:40vh;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:13px}.sql-editor-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:10px}.sql-hint{font-size:12px;color:var(--text-3)}.sql-editor-btns{display:flex;gap:8px;flex-wrap:wrap}.sql-history{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.sql-history-label{font-size:12px;color:var(--text-3)}.sql-chip{max-width:230px;height:25px;padding:0 10px;border:1px solid var(--border);border-radius:999px;background:var(--panel);color:var(--text-2);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;transition:border-color var(--dur) var(--ease),color var(--dur) var(--ease)}.sql-chip:hover{border-color:var(--border-strong);color:var(--text)}.sql-result{flex:1;min-height:0;overflow:auto;padding:14px 16px}.sql-result table.tbl{width:auto}.sql-op-col{width:1%}.sql-op-cell{white-space:nowrap}.sql-del{height:22px;padding:0 8px;font-size:12px;border-radius:var(--radius-xs);box-shadow:none}.sql-error{margin-bottom:12px;padding:10px 12px;border-radius:var(--radius);background:var(--danger-bg);color:var(--danger);font-size:13px;line-height:1.6}.sql-warn{margin-bottom:12px;padding:10px 12px;border-radius:var(--radius);background:var(--warning-bg);color:var(--warning);font-size:13px;line-height:1.6}.sql-block+.sql-block{margin-top:18px;padding-top:16px;border-top:1px solid var(--border)}.sql-block-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}.sql-block-sql{flex:1;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-2)}.sql-block-ms{font-size:12px;font-variant-numeric:tabular-nums}.tag.is-read{background:var(--primary-bg);color:var(--primary)}.tag.is-write{background:var(--warning-bg);color:var(--warning)}.sql-note{margin-bottom:8px;font-size:12.5px;color:var(--text-2)}.sql-cell{max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sql-cell.is-null{color:var(--text-3);font-style:italic}@media(max-width:900px){.sql-body{flex-direction:column}.sql-side{width:auto;max-height:190px}}.chat-actions{display:flex;gap:8px;flex:none}.page-body.is-chat{overflow:hidden}.chat-wrap{flex:1;min-height:0;display:flex;gap:14px}.chat-side{flex:none;width:232px;display:flex;flex-direction:column;padding:10px;overflow:hidden}.chat-side-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:1px 6px 8px;font-size:12.5px;font-weight:500;color:var(--text-3);letter-spacing:.02em}.chat-new{height:26px;padding:0 9px;font-size:12.5px}.chat-side-list{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.chat-side-item{display:flex;align-items:center;gap:4px;padding:7px 6px 7px 8px;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--dur) var(--ease)}.chat-side-item:hover{background:var(--panel-hover)}.chat-side-item.is-active{background:var(--primary-bg)}.chat-side-text{flex:1;min-width:0}.chat-side-title{font-size:13px;font-weight:500;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-side-item.is-active .chat-side-title{color:var(--primary)}.chat-side-meta{margin-top:1px;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-side-del{flex:none;width:20px;height:20px;padding:0;border:none;border-radius:var(--radius-xs);background:transparent;color:var(--text-3);font-size:15px;line-height:1;cursor:pointer;opacity:.35;transition:opacity var(--dur) var(--ease),background var(--dur) var(--ease),color var(--dur) var(--ease)}.chat-side-item:hover .chat-side-del{opacity:1}.chat-side-del:hover{background:var(--danger-bg);color:var(--danger)}.chat-side-foot{flex:none;padding:8px 6px 0;font-size:11.5px;line-height:1.5;color:var(--text-3)}.chat-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}.chat-main>.chat-scroll{flex:1;min-height:0;overflow-y:auto}@media(max-width:900px){.chat-wrap{flex-direction:column}.chat-side{width:auto;max-height:168px}}.chat-list{margin:0 auto;padding:8px 0 24px;display:flex;flex-direction:column;gap:20px}.msg{display:flex;gap:10px;align-items:flex-start}.msg.is-user{flex-direction:row-reverse}.msg-avatar{flex:none;width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;background:var(--primary-bg);color:var(--primary);margin-top:2px;-webkit-user-select:none;user-select:none}.msg.is-user .msg-avatar{background:#eceff4;color:var(--text-2)}.msg-main{min-width:0;max-width:min(78%,720px);display:flex;flex-direction:column;gap:6px}.msg.is-user .msg-main{align-items:flex-end}.msg-bubble{padding:10px 14px;border-radius:12px;background:var(--panel);border:1px solid var(--border);font-size:14px;line-height:1.75;white-space:pre-wrap;word-break:break-word;box-shadow:var(--shadow-xs)}.msg.is-user .msg-bubble{background:var(--primary);border-color:transparent;color:#fff}.msg-bubble strong{font-weight:600}.msg-bubble code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;background:var(--bg-soft);border:1px solid var(--border);border-radius:4px;padding:0 4px}.msg.is-user .msg-bubble code{background:#ffffff29;border-color:transparent;color:#fff}.msg-error{font-size:13px;line-height:1.6;color:var(--danger);background:var(--danger-bg);border-radius:var(--radius);padding:8px 12px;word-break:break-word}.msg-reasoning{border:1px solid var(--border);border-radius:10px;background:var(--bg-soft);overflow:hidden}.msg-reasoning.is-live{border-color:var(--primary-ring)}.msg-reasoning-bar{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:0;background:transparent;color:var(--text-3);font:inherit;font-size:12.5px;line-height:1.5;text-align:left;cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}.msg-reasoning-bar:hover{background:#141e320a;color:var(--text-2)}.msg-reasoning-dot{flex:none;width:6px;height:6px;border-radius:50%;background:var(--text-3)}.msg-reasoning.is-live .msg-reasoning-dot{background:var(--primary);animation:chatPulse 1.1s ease-in-out infinite}@keyframes chatPulse{0%,to{opacity:.3;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}.msg-reasoning-label{flex:none}.msg-reasoning-meta{margin-left:auto;flex:none;font-variant-numeric:tabular-nums;opacity:.75}.msg-reasoning-toggle{flex:none;color:var(--primary);opacity:.85}.msg-reasoning-bar:hover .msg-reasoning-toggle{opacity:1}.msg-reasoning-peek{padding:0 12px 8px;font-size:12.5px;line-height:1.65;color:var(--text-3);white-space:pre-wrap;word-break:break-word;max-height:3.3em;overflow:hidden;-webkit-mask-image:linear-gradient(180deg,transparent 0,#000 55%);mask-image:linear-gradient(180deg,transparent 0,#000 55%)}.msg-reasoning-body{max-height:42vh;overflow-y:auto;margin-top:2px;padding:8px 12px 10px;border-top:1px solid var(--border);font-size:12.5px;line-height:1.7;color:var(--text-2);white-space:pre-wrap;word-break:break-word}.msg-typing{display:flex;gap:4px;padding:12px 14px}.msg-typing span{width:6px;height:6px;border-radius:50%;background:var(--text-3);animation:chatBlink 1.2s infinite ease-in-out}.msg-typing span:nth-child(2){animation-delay:.18s}.msg-typing span:nth-child(3){animation-delay:.36s}@keyframes chatBlink{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.chat-empty{max-width:600px;margin:7vh auto 0;text-align:center;padding:0 20px}.chat-empty-mark{width:46px;height:46px;margin:0 auto 16px;border-radius:14px;background:var(--primary-bg);color:var(--primary);font-size:14px;font-weight:600;letter-spacing:.02em;display:flex;align-items:center;justify-content:center}.chat-empty-title{font-size:17px;font-weight:600;letter-spacing:-.01em;margin-bottom:6px}.chat-empty-sub{color:var(--text-3);font-size:13.5px;line-height:1.7;margin-bottom:18px}.chat-examples{display:flex;flex-direction:column;gap:8px;text-align:left}.chat-example{padding:11px 14px;border:1px solid var(--border);border-radius:var(--radius);background:var(--panel);color:var(--text-2);font-size:13.5px;font-family:inherit;line-height:1.5;text-align:left;cursor:pointer;transition:border-color var(--dur) var(--ease),background var(--dur) var(--ease),color var(--dur) var(--ease)}.chat-example:hover{border-color:var(--primary);background:var(--primary-bg);color:var(--primary)}.chat-compose{flex:none;border-top:1px solid var(--border);padding:12px 0 2px}.chat-input-wrap{margin:0 auto;display:flex;gap:10px;align-items:flex-end}.chat-input{flex:1;min-height:44px;max-height:160px;padding:11px 14px;border:1px solid var(--border-strong);border-radius:var(--radius-lg);background:var(--panel);color:var(--text);font-family:inherit;font-size:14px;line-height:1.6;resize:none;outline:none;transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}.chat-input::placeholder{color:var(--text-3)}.chat-input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-ring)}.chat-send{height:44px;padding:0 20px;flex:none}.chat-tip{max-width:880px;margin:8px auto 0;font-size:12.5px;color:var(--text-3);text-align:center}.ai-sep{border:none;border-top:1px solid var(--border);margin:4px 0 16px}.ai-test-msg{font-size:13px;line-height:1.55;margin-top:8px;word-break:break-word}.ai-test-msg.is-ok{color:var(--success)}.ai-test-msg.is-err{color:var(--danger)}.ai-model-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px;max-height:108px;overflow-y:auto}.msg-note{font-size:12.5px;line-height:1.6;color:var(--text-3);padding:0 2px}.field-hint.is-warn{color:var(--danger)}
