@@ -1,71 +1,112 @@
/* 设计令牌与 UI 组件样式已迁入 Agent-System-UI( @ui/tokens.css、@ui/ui.css, main.tsx 引入)。 */
/* 设计令牌与 UI 组件样式已迁入 Agent-System-UI( @ui/tokens.css、@ui/ui.css, main.tsx 引入)。
R4 视觉收敛(2026-09-30):三级表面阶梯 + 发丝边框 + 圆角标尺 + 克制阴影 + 统一线性图标。 */
* { box-sizing : border-box ; }
html , body , # root { height : 100 % ; margin : 0 ; }
body { font-family : var ( - - font ) ; background : var ( - - bg ) ; color : var ( - - text ) ; font-size : 14 px ; }
button { font-family : inherit ; }
body {
font-family : var ( - - font ) ; background : var ( - - bg ) ; color : var ( - - text ) ;
font-size : 13.5 px ; line-height : 1.55 ;
-webkit- font-smoothing : antialiased ; text-rendering : optimizeLegibility ;
}
button { font-family : inherit ; font-size : inherit ; color : inherit ; }
:: selection { background : var ( - - accent - soft -2 ) ; }
: focus-visible { outline : 2 px solid var ( - - accent ) ; outline-offset : 1 px ; border-radius : 2 px ; }
. app { display : flex ; height : 100 vh ; overflow : hidden ; }
/* ---- 三栏布局 ---- */
. left-nav { background : var ( - - bg - panel ) ; border-right : 1 px solid var ( - - border ) ; display : flex ; flex-direction : column ; min-width : 0 ; flex-shrink : 0 ; transition : width .08 s ease ; }
/* ---- 三栏布局:层次靠背景阶梯(bg-panel 侧栏 / bg 主区),边框只发丝勾边 ---- */
. left-nav { background : var ( - - bg - panel ) ; border-right : 1 px solid var ( - - border ) ; display : flex ; flex-direction : column ; min-width : 0 ; flex-shrink : 0 ; transition : width .15 s var ( - - ease ) ; }
. left-nav . collapsed { width : 52 px !important ; }
. divider { width : 4 px ; cursor : col-resize ; background : transparent ; flex-shrink : 0 ; position : relative ; }
. divider : hover , . divider . dragging { background : var ( - - accent ) ; }
. divider :: before { content : '' ; position : absolute ; left : 1.5 px ; top : 0 ; bottom : 0 ; width : 1 px ; background : transparent ; transition : background .12 s ; }
. divider : hover :: before , . divider . dragging :: before { background : var ( - - accent ) ; }
. divider :: after { content : '' ; position : absolute ; inset : 0 -3 px ; } /* 拖拽热区加宽 */
. main { flex : 1 ; min-width : 0 ; display : flex ; flex-direction : column ; background : var ( - - bg ) ; }
. right-panel { background : var ( - - bg - panel ) ; border-left : 1 px solid var ( - - border ) ; display : flex ; flex-direction : column ; flex-shrink : 0 ; min-width : 0 ; }
. right-panel . collapsed { width : 44 px !important ; }
/* ---- 左栏:任务中心(方案 A)见文末 tsb-* ---- */
/* ---- 通用控件 ---- */
. btn {
background : var ( - - accent ) ; color : var ( - - text - on - accent ) ; border : none ;
border-radius : var ( - - radius ) ; padding : 8 px 16 px ; cursor : pointer ;
font-size : 13 px ; font-weight : 550 ; white-space : nowrap ;
box-shadow : inset 0 1 px 0 rgba ( 255 , 255 , 255 , .14 ) , 0 1 px 2 px rgba ( 8 , 9 , 12 , .3 ) ;
transition : filter .12 s var ( - - ease ) , transform .12 s var ( - - ease ) ;
}
. btn : hover : not ( : disabled ) { filter : brightness ( 1.09 ) ; }
. btn : active : not ( : disabled ) { transform : translateY ( 1 px ) ; }
. btn : disabled { opacity : .42 ; cursor : not-allowed ; box-shadow : none ; }
. btn . ghost { background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border - strong ) ; color : var ( - - text - dim ) ; box-shadow : none ; }
. btn . ghost : hover : not ( : disabled ) { color : var ( - - text ) ; border-color : var ( - - text - faint ) ; filter : none ; }
. btn . danger { background : var ( - - err ) ; }
. icon-btn {
background : none ; border : none ; color : var ( - - text - faint ) ;
border-radius : var ( - - radius - sm ) ; padding : 0 ; width : 28 px ; height : 28 px ;
display : inline-flex ; align-items : center ; justify-content : center ; cursor : pointer ;
transition : background .12 s , color .12 s ;
}
. icon-btn : hover { background : var ( - - bg - hover ) ; color : var ( - - text ) ; }
. search-input , . cmd-menu input {
background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius ) ;
color : var ( - - text ) ; padding : 7 px 11 px ; font-family : inherit ; font-size : 13 px ; width : 100 % ;
transition : border-color .12 s , box-shadow .12 s ;
}
. search-input : focus { border-color : var ( - - accent ) ; box-shadow : var ( - - ring ) ; outline : none ; }
/* ---- 中栏对话 ---- */
/* min-height:0 须随列向 flex 链下传(.main→.chat→.chat-body):flex 项的自动最小
高度是内容高度,缺失时消息会撑破 .chat——chat-body 永不滚动、输入栏被顶出视口。 */
. chat { flex : 1 ; display : flex ; flex-direction : column ; min-width : 0 ; min-height : 0 ; }
. chat-header { padding : 10 px 18 px ; border-bottom : 1 px solid var ( - - border ) ; display : flex ; align-items : center ; gap : 10 px ; background : var ( - - bg - raised ) ; }
. chat-title { font-weight : 600 ; flex : 1 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. chat-body { flex : 1 ; overflow-y : auto ; min-height : 0 ; padding : 18 px max ( 18 px , 12 % ) ; }
. empty-state { height : 100 % ; display : flex ; flex-direction : column ; align-items : center ; justify-content : center ; color : var ( - - text - faint ) ; gap : 8 px ; }
. msg { margin-bottom : 18 px ; }
. msg-role { font-size : 12 px ; color : var ( - - text - faint ) ; margin-bottom : 4 px ; display : flex ; gap : 8 px ; align-items : center ; }
. msg . user . bubble { background : var ( - - accent - soft ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius ) ; padding : 10 px 14 px ; white-space : pre-wrap ; }
. chat-header { padding : 12 px 22 px ; border-bottom : 1 px solid var ( - - border - soft ) ; display : flex ; align-items : center ; gap : 10 px ; background : var ( - - bg ) ; }
. chat-title { font-weight : 600 ; font-size : 14.5 px ; letter-spacing : -0.01 em ; flex : 1 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. chat-body { flex : 1 ; overflow-y : auto ; min-height : 0 ; padding : 22 px max ( 22 px , 13 % ) ; }
. empty-state { height : 100 % ; display : flex ; flex-direction : column ; align-items : center ; justify-content : center ; color : var ( - - text - faint ) ; gap : 10 px ; font-size : 13.5 px ; }
. empty-state . es-mark { width : 44 px ; height : 44 px ; border-radius : 12 px ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border - soft ) ; display : flex ; align-items : center ; justify-content : center ; color : var ( - - text - faint ) ; margin-bottom : 4 px ; }
. empty-state svg { opacity : .5 ; }
. msg { margin-bottom : 20 px ; }
. msg-role { font-size : 12 px ; color : var ( - - text - faint ) ; margin-bottom : 6 px ; display : flex ; gap : 8 px ; align-items : center ; }
. msg-role . role-mark { width : 18 px ; height : 18 px ; border-radius : 5 px ; display : inline-flex ; align-items : center ; justify-content : center ; color : var ( - - text - dim ) ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; }
. msg . user . bubble {
background : var ( - - accent - soft ) ; border : 1 px solid transparent ;
border-radius : var ( - - radius - lg ) ; padding : 11 px 16 px ; white-space : pre-wrap ;
}
. part { margin : 4 px 0 ; }
. part-thinking { color : var ( - - text - dim ) ; font-size : 12.5 px ; border-left : 2 px solid var ( - - border ) ; padding-left : 10 px ; margin : 4 px 0 ; }
. part-thinking summary { cursor : pointer ; color : var ( - - text - faint ) ; user-select : none ; }
. part-thinking . part-thinking-body { white-space : pre-wrap ; margin-top : 4 px ; }
. part-tool { font-size : 12.5 px ; }
. tool-chip { display : inline-flex ; gap : 6 px ; align-items : center ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; padding : 4 px 8 px ; margin : 2 px 4 px 2 px 0 ; font-family : var ( - - mono ) ; }
. tool-chip { display : inline-flex ; gap : 6 px ; align-items : center ; background : var ( - - bg - inset ) ; border : 1 px solid var ( - - border - soft ) ; border-radius : var ( - - radius - sm ) ; padding : 4 px 9 px ; margin : 2 px 4 px 2 px 0 ; font-family : var ( - - mono ) ; }
. tool-chip . status-ok { color : var ( - - ok ) ; }
. tool-chip . status-error { color : var ( - - err ) ; }
. part-text { line-height : 1.65 ; overflow-wrap : break-word ; }
. part-text { line-height : 1.7 ; overflow-wrap : break-word ; }
/* 块级间距只由标签自身控制:禁用 pre-wrap(marked 输出的块间换行会被渲染成空行,
叠加出"列表逐项空一行"的松散排版);行内换行语义交给 Markdown 段落。 */
. part-text > * : first-child { margin-top : 0 ; }
. part-text > * : last-child { margin-bottom : 0 ; }
. part-text p { margin : 0.5 em 0 ; }
. part-text : is ( h1 , h2 , h3 , h4 ) { margin : 0.8 em 0 0.35 em ; line-height : 1.35 ; font-weight : 600 ; }
. part-text : is ( h1 , h2 , h3 , h4 ) { margin : 0.8 em 0 0.35 em ; line-height : 1.35 ; font-weight : 600 ; letter-spacing : -0.01 em ; }
. part-text h1 { font-size : 1.3 em ; }
. part-text h2 { font-size : 1.18 em ; }
. part-text h3 { font-size : 1.06 em ; }
. part-text : is ( ul , ol ) { margin : 0.4 em 0 ; padding-left : 1.6 em ; }
. part-text li { margin : 0.15 em 0 ; }
. part-text li > p { margin : 0.2 em 0 ; }
. part-text pre { background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; padding : 10 px ; overflow-x : auto ; font-family : var ( - - mono ) ; font-size : 12.5 px ; }
. part-text code { font-family : var ( - - mono ) ; background : var ( - - bg - raised ) ; border-radius : 4 px ; padding : 1 px 5 px ; font-size : 12.5 px ; }
. part-text pre { background : var ( - - bg - inset ) ; border : 1 px solid var ( - - border - soft ) ; border-radius : var ( - - radius ) ; padding : 11 px 13 px ; overflow-x : auto ; font-family : var ( - - mono ) ; font-size : 12.5 px ; }
. part-text code { font-family : var ( - - mono ) ; background : var ( - - bg - raised ) ; border-radius : var ( - - radius - xs ) ; padding : 1 px 5 px ; font-size : 12.5 px ; }
. part-text pre code { background : none ; padding : 0 ; }
. part-text blockquote { margin : 0.5 em 0 ; padding : 0.1 em 0 0.1 em 10 px ; border-left : 3 px solid var ( - - border ) ; color : var ( - - text - dim ) ; }
. part-text blockquote { margin : 0.5 em 0 ; padding : 0.1 em 0 0.1 em 10 px ; border-left : 3 px solid var ( - - border - strong ) ; color : var ( - - text - dim ) ; }
. part-text table { border-collapse : collapse ; margin : 0.6 em 0 ; font-size : 0.95 em ; display : block ; max-width : 100 % ; overflow-x : auto ; }
. part-text th , . part-text td { border : 1 px solid var ( - - border ) ; padding : 4 px 10 px ; text-align : left ; }
. part-text th { background : var ( - - bg - raised ) ; font-weight : 600 ; }
. part-text hr { border : none ; border-top : 1 px solid var ( - - border ) ; margin : 0.8 em 0 ; }
. part-text a { color : var ( - - accent ) ; }
. part-error { color : var ( - - err ) ; background : color-mix ( in srgb , var ( - - err ) 8 % , transparent ) ; border : 1 px solid var ( - - err ) ; border-radius : var ( - - radius - sm ) ; padding : 8 px 12 px ; }
. artifact-chip { display : inline-flex ; align-items : center ; gap : 6 px ; color : var ( - - accent ) ; background : var ( - - accent - soft ) ; border-radius : var ( - - radius - sm ) ; padding : 4 px 10 px ; cursor : pointer ; font-size : 13 px ; }
. artifact-chip : hover { filter : brightness ( 1.15 ) ; }
. part-error { color : var ( - - err ) ; background : var ( - - err - soft ) ; border : 1 px solid var ( - - err ) ; border-radius : var ( - - radius - sm ) ; padding : 8 px 12 px ; }
. artifact-chip { display : inline-flex ; align-items : center ; gap : 6 px ; color : var ( - - accent ) ; background : var ( - - accent - soft ) ; border : 1 px solid transparent ; border-radius : var ( - - radius - sm ) ; padding : 5 px 10 px ; cursor : pointer ; font-size : 13 px ; transition : background .12 s ; }
. artifact-chip : hover { background : var ( - - accent - soft -2 ) ; }
/* 过程折叠(run 终态后) */
. process-collapse { border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; background : var ( - - bg - raised ) ; margin : 6 px 0 ; }
. process-collapse summary { list-style : none ; cursor : pointer ; padding : 6 px 12 px ; color : var ( - - text - faint ) ; font-size : 12.5 px ; display : flex ; align-items : center ; gap : 8 px ; user-select : none ; }
. process-collapse { border : 1 px solid var ( - - border - soft ) ; border-radius : var ( - - radius ) ; background : var ( - - bg - panel ) ; margin : 6 px 0 ; }
. process-collapse summary { list-style : none ; cursor : pointer ; padding : 7 px 12 px ; color : var ( - - text - faint ) ; font-size : 12.5 px ; display : flex ; align-items : center ; gap : 8 px ; user-select : none ; }
. process-collapse summary :: before { content : '▸' ; transition : transform .12 s ; font-size : 10 px ; }
. process-collapse [ open ] summary :: before { transform : rotate ( 90 deg ) ; }
. process-collapse . body { padding : 4 px 12 px 10 px ; }
@@ -76,41 +117,37 @@ button { font-family: inherit; }
@ keyframes pulse { 0 % , 100 % { opacity : .4 } 50 % { opacity : 1 } }
. cursor-blink :: after { content : '▍' ; animation : pulse 1 s infinite ; color : var ( - - accent ) ; }
/* HITL 卡片 */
. hitl-card { border : 1 px solid var ( - - accent ) ; background : var ( - - bg - raised ) ; border-radius : var ( - - radius ) ; padding : 14 px ; margin : 10 px 0 ; }
. hitl-q { font-weight : 600 ; margin-bottom : 10 px ; }
/* HITL 卡片(确认类交互统一绿色语言) */
. hitl-card { border : 1 px solid var ( - - ok - border ) ; background : var ( - - ok - soft ) ; border-radius : var ( - - radius - lg ) ; padding : 14 px ; margin : 10 px 0 ; }
. hitl-q { font-weight : 600 ; margin-bottom : 10 px ; display : flex ; gap : 8 px ; align-items : flex-start ; }
. hitl-q svg { color : var ( - - ok ) ; flex : none ; margin-top : 1 px ; }
. hitl-choices { display : flex ; flex-direction : column ; gap : 8 px ; }
. hitl-choice { text-align : left ; border : 1 px solid var ( - - border ) ; background : var ( - - bg ) ; color : var ( - - text ) ; border-radius : var ( - - radius - sm ) ; padding : 10 px 12 px ; cursor : pointer ; }
. hitl-choice { text-align : left ; border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text ) ; border-radius : var ( - - radius ) ; padding : 10 px 12 px ; cursor : pointer ; transition : border-color .12 s , background .12 s ; }
. hitl-choice : hover { border-color : var ( - - accent ) ; background : var ( - - accent - soft ) ; }
. hitl-choice . label { font-weight : 600 ; display : flex ; gap : 8 px ; align-items : center ; }
. hitl-choice . desc { color : var ( - - text - dim ) ; font-size : 12.5 px ; margin-top : 3 px ; }
. hitl-choice . impact { color : var ( - - warn ) ; font-size : 12 px ; margin-top : 3 px ; }
. hitl-choice . rec { font-size : 10.5 px ; color : var ( - - accent ) ; border : 1 px solid var ( - - accent ) ; padding : 0 5 px ; border-radius : 8 px ; }
. hitl-choice . rec { font-size : 10.5 px ; color : var ( - - accent ) ; border : 1 px solid var ( - - accent ) ; padding : 0 5 px ; border-radius : var ( - - radius - full ) ; }
. hitl-free { display : flex ; gap : 8 px ; margin-top : 10 px ; }
/* 输入区 */
. input-bar { border-top : 1 px solid var ( - - border ) ; padding : 12 px 18 px ; background : var ( - - bg - raised ) ; }
/* 输入区:悬浮卡片式输入壳(外圆角大、聚焦发光) */
. input-bar { padding : 8 px max ( 16 px , 6 % ) 16 px ; background : var ( - - bg ) ; }
. attachments { display : flex ; flex-wrap : wrap ; gap : 6 px ; margin-bottom : 8 px ; }
. attach-chip { display : inline-flex ; gap : 6 px ; align-items : center ; background : var ( - - bg - hover ) ; border-radius : var ( - - radius - sm ) ; padding : 3 px 8 px ; font-size : 12 px ; }
. input-row { display : flex ; gap : 8 px ; align-items : flex-end ; }
. input-row textarea { flex : 1 ; resize : none ; background : var ( - - bg ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius ) ; color : var ( - - text ) ; padding : 10 px 12 px ; font-family : inherit ; font-size : 14 px ; max-height : 160 px ; outline : none ; }
. input-row textarea : focus { border-color : var ( - - accent ) ; }
. btn { background : var ( - - accent ) ; color : #fff ; border : none ; border-radius : var ( - - radius - sm ) ; padding : 9 px 16 px ; cursor : pointer ; font-size : 13 px ; white-space : nowrap ; }
. btn : disabled { opacity : .45 ; cursor : not-allowed ; }
. btn . ghost { background : none ; border : 1 px solid var ( - - border ) ; color : var ( - - text - dim ) ; }
. btn . ghost : hover { color : var ( - - text ) ; border-color : var ( - - text - faint ) ; }
. btn . danger { background : var ( - - err ) ; }
. icon-btn { background : none ; border : 1 px solid var ( - - border ) ; color : var ( - - text - dim ) ; border-radius : var ( - - radius - sm ) ; padding : 8 px 10 px ; cursor : pointer ; font-size : 14 px ; }
. icon-btn : hover { color : var ( - - text ) ; border-color : var ( - - text - faint ) ; }
. cmd-menu { border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; border-radius : var ( - - radius - sm ) ; margin-bottom : 6 px ; max-height : 180 px ; overflow-y : auto ; }
. attach-chip { display : inline-flex ; gap : 6 px ; align-items : center ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; padding : 3 px 8 px ; font-size : 12 px ; }
. input-row { display : flex ; gap : 8 px ; align-items : flex-end ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - lg ) ; padding : 8 px 8 px 8 px 14 px ; box-shadow : var ( - - shadow - md ) ; transition : border-color .12 s , box-shadow .12 s ; }
. input-row : focus-within { border-color : var ( - - accent ) ; box-shadow : var ( - - shadow - md ) , var ( - - ring ) ; }
. input-row textarea { flex : 1 ; resize : none ; background : transparent ; border : none ; color : var ( - - text ) ; padding : 6 px 0 ; font-family : inherit ; font-size : 13.5 px ; max-height : 160 px ; outline : none ; }
. input-row textarea :: placeholder { color : var ( - - text - faint ) ; }
. cmd-menu { border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; border-radius : var ( - - radius ) ; margin-bottom : 6 px ; max-height : 180 px ; overflow-y : auto ; box-shadow : var ( - - shadow - md ) ; }
. cmd-item { padding : 7 px 12 px ; cursor : pointer ; display : flex ; gap : 10 px ; font-size : 13 px ; }
. cmd-item : hover , . cmd-item . active { background : var ( - - accent - soft ) ; }
. cmd-item : hover , . cmd-item . active { background : var ( - - bg - hover ) ; }
. cmd-item . name { color : var ( - - accent ) ; font-family : var ( - - mono ) ; }
/* ---- 右栏 ---- */
. tabs { display : flex ; border-bottom : 1 px solid var ( - - border ) ; overflow-x : auto ; }
. tab { background : none ; border : none ; color : var ( - - text - dim ) ; padding : 9 px 12 px ; cursor : pointer ; font-size : 12.5 px ; border-bottom : 2 px solid transparent ; white-space : nowrap ; }
. tab . active { color : var ( - - accent ) ; border-bottom-color : var ( - - accent ) ; }
. tabs { display : flex ; border-bottom : 1 px solid var ( - - border - soft ) ; overflow-x : auto ; padding : 0 8 px ; }
. tab { background : none ; border : none ; color : var ( - - text - faint ) ; padding : 10 px 10 px ; cursor : pointer ; font-size : 12.5 px ; font-weight : 550 ; border-bottom : 2 px solid transparent ; margin-bottom : -1 px ; white-space : nowrap ; }
. tab : hover { color : var ( - - text - dim ) ; }
. tab . active { color : var ( - - text ) ; border-bottom-color : var ( - - accent ) ; }
. tab-body { flex : 1 ; overflow-y : auto ; padding : 12 px ; }
. step { display : flex ; gap : 8 px ; align-items : flex-start ; padding : 6 px 4 px ; font-size : 13 px ; }
. step-icon { width : 16 px ; text-align : center ; flex-shrink : 0 ; }
@@ -131,193 +168,201 @@ button { font-family: inherit; }
. status-pending , . status-waiting_hitl { background : var ( - - warn ) ; }
/* ---- 弹窗 / 模态 ---- */
. overlay { position : fixed ; inset : 0 ; background : rgba ( 0 , 0 , 0 , .55 ) ; display : flex ; align-items : center ; justify-content : center ; z-index : 50 ; }
. modal { background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : 12 px ; width : min ( 860 px , 92 vw ) ; max-height : 86 vh ; display : flex ; flex-direction : column ; box-shadow : 0 18 px 60 px rgba ( 0 , 0 , 0 , .4 ) ; }
. modal-header { padding : 14 px 18 px ; border-bottom : 1 px solid var ( - - border ) ; display : flex ; align-items : center ; font-weight : 600 ; }
. overlay { position : fixed ; inset : 0 ; background : rgba ( 8 , 9 , 12 , .6 ) ; backdrop-filter : blur ( 8 px ) ; display : flex ; align-items : center ; justify-content : center ; z-index : 50 ; animation : overlay - in .14 s var ( - - ease ) ; }
@ keyframes overlay-in { from { opacity : 0 } }
. modal { background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - xl ) ; width : min ( 860 px , 92 vw ) ; max-height : 86 vh ; display : flex ; flex-direction : column ; box-shadow : var ( - - shadow - lg ) ; animation : modal-in .16 s var ( - - ease ) ; }
@ keyframes modal-in { from { opacity : 0 ; transform : translateY ( 6 px ) scale ( .99 ) } }
. modal-header { padding : 16 px 20 px ; border-bottom : 1 px solid var ( - - border - soft ) ; display : flex ; align-items : center ; font-weight : 600 ; font-size : 14.5 px ; letter-spacing : -0.01 em ; }
. modal-header . spacer { flex : 1 ; }
. modal-body { flex : 1 ; overflow-y : auto ; padding : 16 px 18 px ; }
. modal-body { flex : 1 ; overflow-y : auto ; padding : 18 px 20 px ; }
. subagent-tree { font-size : 13 px ; }
. subagent-node { border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; padding : 10 px ; margin-bottom : 8 px ; }
. subagent-node { border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius ) ; padding : 10 px ; margin-bottom : 8 px ; background : var ( - - bg - panel ) ; }
. subagent-node . head { display : flex ; gap : 8 px ; align-items : center ; margin-bottom : 6 px ; }
/* ---- 设置(schema 驱动)---- */
. settings-group { margin-bottom : 18 px ; }
. settings-group h4 { margin : 0 0 8 px ; font-size : 13 px ; color : var ( - - text - dim ) ; text-transform : uppercase ; letter-spacing : .04 em ; }
. setting-row { display : grid ; grid-template-columns : 200 px 1 fr auto ; gap : 10 px ; align-items : center ; padding : 7 px 0 ; border-bottom : 1 px dashed var ( - - border ) ; font-size : 13 px ; }
. settings-group h4 { margin : 0 0 8 px ; font-size : 11.5 px ; color : var ( - - text - faint ) ; text-transform : uppercase ; letter-spacing : .07 em ; font-weight : 600 ; }
. setting-row { display : grid ; grid-template-columns : 200 px 1 fr auto ; gap : 10 px ; align-items : center ; padding : 8 px 0 ; border-bottom : 1 px solid var ( - - border - soft ) ; font-size : 13 px ; }
. setting-row label { color : var ( - - text - dim ) ; }
. setting-row input , . setting-row select { background : var ( - - bg ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; color : var ( - - text ) ; padding : 7 px 10 px ; font-family : inherit ; }
. effect-badge { font-size : 10.5 px ; padding : 2 px 7 px ; border-radius : 8 px ; border : 1 px solid var ( - - border ) ; color : var ( - - text - faint ) ; white-space : nowrap ; }
. setting-row input : focus , . setting-row select : focus { border-color : var ( - - accent ) ; box-shadow : var ( - - ring ) ; outline : none ; }
. effect-badge { font-size : 10.5 px ; padding : 2 px 7 px ; border-radius : var ( - - radius - full ) ; border : 1 px solid var ( - - border ) ; color : var ( - - text - faint ) ; white-space : nowrap ; }
. effect-hot { color : var ( - - ok ) ; border-color : var ( - - ok ) ; }
. effect-new-run { color : var ( - - warn ) ; border-color : var ( - - warn ) ; }
/* UI schema 渲染器样式(.ui-*)与 .doc-viewer 已迁入 @ui/ui.css。 */
/* ---- 杂项 ---- */
. toast { position : fixed ; bottom : 22 px ; left : 50 % ; transform : translateX ( -50 % ) ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; color : var ( - - text ) ; padding : 9 px 16 px ; border-radius : 20 px ; box-shadow : 0 8 px 30 px rgba ( 0 , 0 , 0 , .35 ) ; z-index : 90 ; font-size : 13 px ; }
. toast { position : fixed ; bottom : 24 px ; left : 50 % ; transform : translateX ( -50 % ) ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; color : var ( - - text ) ; padding : 9 px 16 px ; border-radius : var ( - - radius - full ) ; box-shadow : var ( - - shadow - lg ) ; z-index : 90 ; font-size : 13 px ; }
. conn-dot { width : 8 px ; height : 8 px ; border-radius : 50 % ; }
. conn-dot . on { background : var ( - - ok ) ; }
. conn-dot . off { background : var ( - - err ) ; }
. doc-toolbar { display : flex ; gap : 8 px ; margin-bottom : 10 px ; align-items : center ; }
. search-input { background : var ( - - bg ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; color : var ( - - text ) ; padding : 6 px 10 px ; font-family : inherit ; width : 100 % ; }
:: -webkit-scrollbar { width : 9 px ; height : 9 px ; }
:: -webkit-scrollbar-thumb { background : var ( - - bg - active ) ; border-radius : 5 px ; }
:: -webkit-scrollbar { width : 10 px ; height : 10 px ; }
:: -webkit-scrollbar-thumb { background : var ( - - bg - active ) ; border-radius : 6 px ; border : 3 px solid transparent ; background-clip : content-box ; }
:: -webkit-scrollbar-thumb : hover { background : var ( - - border - strong ) ; background-clip : content-box ; border : 3 px solid transparent ; }
:: -webkit-scrollbar-track { background : transparent ; }
/* ---- 登录门(API key 认证,PG 档默认开启 ) ---- */
. login-gate {
position : fixed ; inset : 0 ; display : flex ; align-items : center ; justify-content : center ;
background : var ( - - bg , #14161a ) ; z-index : 1000 ;
}
. login-card {
width : 360 px ; padding : 28 px ; border-radius : 12 px ; text-align : center ;
background : #1d2026 ; border : 1 px solid #2c313a ; box-shadow : 0 8 px 32 px rgba ( 0 , 0 , 0 , .45 ) ;
}
. login-card h2 { margin : 0 0 8 px ; }
. login-hint { font-size : 12 px ; color : #9aa3b2 ; margin-bottom : 16 px ; line-height : 1.6 ; }
. login-card input {
width : 100 % ; box-sizing : border-box ; padding : 9 px 12 px ; border-radius : 8 px ;
border : 1 px solid #2c313a ; background : #14161a ; color : inherit ; font-size : 14 px ;
}
. login-card button {
margin-top : 12 px ; width : 100 % ; padding : 9 px 0 ; border : none ; border-radius : 8 px ;
background : #3b82f6 ; color : #fff ; font-size : 14 px ; cursor : pointer ;
}
. login-err { margin-top : 10 px ; font-size : 12 px ; color : #f87171 ; }
/* ---- 品牌标(侧栏 / 登录页 / 头像共用的星芒渐变底 ) ---- */
. brand-mark { background : linear-gradient ( 135 deg , #6d8dff , #9d7bff ) ; color : #fff ; display : inline-flex ; align-items : center ; justify-content : center ; flex : none ; box-shadow : inset 0 1 px 0 rgba ( 255 , 255 , 255 , .22 ) ; }
/* 工作区快捷区(T4/D26 左栏)与当前任务常驻卡(D25 R4) */
. current-task { border : 1 px solid var ( - - border ) ; border-radius : 8 px ; padding : 8 px 10 px ; margin-bottom : 8 px ; background : rgba ( 120 , 160 , 255 , .05 ) }
. ct-head { display : flex ; align-items : center ; gap : 8 px ; font-weight : 600 ; margin-bottom : 6 px }
. ct-title { flex : 1 ; overflow : hidden ; text-overflow : ellipsis ; white-space : nowrap }
. ct-progress { font-size : 11 px ; color : var ( - - text - faint ) }
. project-badge { font-size : 11 px ; padding : 1 px 8 px ; border-radius : 8 px ; background : rgba ( 120 , 160 , 255 , .15 ) ; color : var ( - - accent ) ; white-space : nowrap }
. tab-hint { font-size : 10 px ; color : var ( - - text - faint ) ; align-self : center }
. empty-note { color : var ( - - text - faint ) ; font-size : 12 px ; padding : 12 px 4 px }
/* 收纳策略(T5):收起态角标 + 收纳按钮 */
. rail-badge { position : absolute ; top : -4 px ; right : -6 px ; font-size : 10 px ; background : var ( - - warn , #d29922 ) ; color : #fff ; border-radius : 8 px ; padding : 0 5 px ; min-width : 14 px }
. right-panel . collapsed . icon-only button { position : relative }
. tab-action { font-size : 11 px ; color : var ( - - text - faint ) }
/* ---- 左栏:任务中心(方案 A,提案 2026-09-30) ---- */
. tsb-brand { display : flex ; align-items : center ; gap : 8 px ; padding : 12 px 12 px 6 px ; }
. tsb-logo { width : 22 px ; height : 22 px ; border-radius : 6 px ; background : var ( - - accent ) ; color : #fff ; font-size : 12 px ; font-weight : 700 ; display : flex ; align-items : center ; justify-content : center ; flex : none ; }
. tsb-name { font-weight : 600 ; font-size : 13.5 px ; }
/* ---- 左栏:任务中心(方案 A;R4 重造型) ---- */
. tsb-brand { display : flex ; align-items : center ; gap : 9 px ; padding : 14 px 14 px 8 px ; }
. tsb-logo { width : 24 px ; height : 24 px ; border-radius : 8 px ; background : linear-gradient ( 135 deg , #6d8dff , #9d7bff ) ; color : #fff ; font-size : 12 px ; font-weight : 700 ; display : flex ; align-items : center ; justify-content : center ; flex : none ; }
. tsb-name { font-weight : 650 ; font-size : 13.5 px ; letter-spacing : -0.01 em ; }
. tsb-iconbtn { width : 26 px ; height : 26 px ; border-radius : var ( - - radius - sm ) ; background : none ; border : none ; color : var ( - - text - faint ) ; cursor : pointer ; font-size : 13 px ; display : inline-flex ; align-items : center ; justify-content : center ; position : relative ; }
. tsb-iconbtn : hover { background : var ( - - bg - hover ) ; color : var ( - - text ) ; }
. tsb-iconbtn . active { color : var ( - - accent ) ; background : var ( - - accent - soft ) ; }
. tsb-actions { padding : 4 px 10 px 8 px ; display : flex ; flex-direction : column ; gap : 6 px ; }
. tsb-newtask { display : flex ; height : 34 px ; border-radius : var ( - - radius - sm ) ; border : 1 px solid var ( - - accent ) ; background : var ( - - accent - soft ) ; overflow : hidden ; }
. tsb-newtask-main { flex : 1 ; display : flex ; align-items : center ; gap : 6 px ; padding : 0 10 px ; background : none ; border : none ; color : var ( - - accent ) ; font-weight : 600 ; font-size : 13 px ; cursor : pointer ; min-width : 0 ; }
. tsb-newtask-main : hover { filter : brightness ( 1.08 ) ; }
. tsb-newtask-proj { font-weight : 400 ; font-size : 11.5 px ; opacity : .8 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. tsb-newtask-caret { width : 28 px ; border : none ; border-left : 1 px solid var ( - - accent ) ; background : none ; color : var ( - - accent ) ; cursor : pointer ; font-size : 10 px ; }
. tsb-newtask-caret : hover { background : var ( - - accent - soft ) ; }
. tsb-search { height : 30 px ; border-radius : var ( - - radius - sm ) ; border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text ) ; padding : 0 10 px ; font-size : 12.5 px ; width : 100 % ; }
. tsb-search : focus { border-color : var ( - - accent ) ; outline : none ; }
. tsb-search :: placeholder { color : var ( - - text - faint ) ; }
. tsb-actions { padding : 6 px 12 px 8 px ; display : flex ; flex-direction : column ; gap : 7 px ; }
. tsb-newtask { display : flex ; height : 36 px ; border-radius : var ( - - radius ) ; background : var ( - - accent ) ; color : var ( - - text - on - accent ) ; overflow : hidden ; box-shadow : inset 0 1 px 0 rgba ( 255 , 255 , 255 , .16 ) , 0 2 px 6 px rgba ( 8 , 9 , 12 , .28 ) ; transition : filter .12 s ; }
. tsb-newtask : hover { filter : brightness ( 1.08 ) ; }
. tsb-newtask-main { flex : 1 ; display : flex ; align-items : center ; gap : 7 px ; padding : 0 11 px ; background : none ; border : none ; color : inherit ; font-weight : 600 ; font-size : 13 px ; cursor : pointer ; min-width : 0 ; }
. tsb-newtask-main svg { flex : none ; }
. tsb-newtask-proj { font-weight : 450 ; font-size : 11.5 px ; opacity : .75 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. tsb-newtask-caret { width : 30 px ; border : none ; border-left : 1 px solid rgba ( 255 , 255 , 255 , .18 ) ; background : none ; color : inherit ; cursor : pointer ; display : flex ; align-items : center ; justify-content : center ; }
. tsb-newtask-caret : hover { background : rgba ( 255 , 255 , 255 , .08 ) ; }
. tsb-search { display : flex ; align-items : center ; gap : 7 px ; height : 32 px ; border-radius : var ( - - radius ) ; border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text - faint ) ; padding : 0 10 px ; transition : border-color .12 s , box-shadow .12 s ; }
. tsb-search : focus-within { border-color : var ( - - accent ) ; box-shadow : var ( - - ring ) ; }
. tsb-search svg { flex : none ; }
. tsb-search input { flex : 1 ; border : none ; background : none ; color : var ( - - text ) ; font-size : 12.5 px ; outline : none ; min-width : 0 ; }
. tsb-search input :: placeholder { color : var ( - - text - faint ) ; }
. tsb-orgrow { display : flex ; align-items : center ; gap : 6 px ; padding : 0 10 px 8 px ; }
. tsb-pills { flex : 1 ; display : flex ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - sm ) ; padding : 2 px ; gap : 2 px ; }
. tsb-pill { flex : 1 ; height : 22 px ; border : none ; border-radius : 4 px ; background : none ; color : var ( - - text - faint ) ; font-size : 12 px ; cursor : pointer ; }
. tsb-orgrow { display : flex ; align-items : center ; gap : 6 px ; padding : 0 12 px 8 px ; }
. tsb-pills { flex : 1 ; display : flex ; background : var ( - - bg - inset ) ; border : 1 px solid var ( - - border - soft ) ; border-radius : var ( - - radius - sm ) ; padding : 2 px ; gap : 2 px ; }
. tsb-pill { flex : 1 ; height : 22 px ; border : none ; border-radius : var ( - - radius - xs ) ; background : none ; color : var ( - - text - faint ) ; font-size : 12 px ; cursor : pointer ; transition : all .12 s ; }
. tsb-pill : hover { color : var ( - - text - dim ) ; }
. tsb-pill . on { background : var ( - - bg - active ) ; color : var ( - - text ) ; font-weight : 500 ; }
. tsb-pill . on { background : var ( - - bg - raised ) ; color : var ( - - text ) ; font-weight : 550 ; box-shadow : 0 1 px 2 px rgba ( 8 , 9 , 12 , .25 ) ; }
. tsb-scroll { flex : 1 ; overflow-y : auto ; padding : 0 8 px 8 px ; min-height : 0 ; }
. tsb-seclabel { font-size : 11 px ; color : var ( - - text - faint ) ; padding : 10 px 8 px 4 px ; letter-spacing : .3 px ; }
. tsb-empty { padding : 18 px 12 px ; color : var ( - - text - faint ) ; font-size : 12.5 px ; line-height : 1.8 ; text-align : center ; }
. tsb-scroll { flex : 1 ; overflow-y : auto ; padding : 0 10 px 8 px ; min-height : 0 ; }
. tsb-seclabel { font-size : 11 px ; color : var ( - - text - faint ) ; padding : 12 px 8 px 4 px ; letter-spacing : .05 em ; font-weight : 600 ; }
. tsb-empty { padding : 20 px 14 px ; color : var ( - - text - faint ) ; font-size : 12.5 px ; line-height : 1.9 ; text-align : center ; }
. tsb-newproject { padding : 0 2 px 8 px ; }
. tsb-group { margin-bottom : 2 px ; }
. tsb-group-head { display : flex ; align-items : center ; gap : 6 px ; height : 30 px ; padding : 0 6 px 0 8 px ; border-radius : var ( - - radius - sm ) ; color : var ( - - text - dim ) ; font-weight : 500 ; font-size : 13 px ; cursor : pointer ; user-select : none ; }
. tsb-group-head { display : flex ; align-items : center ; gap : 6 px ; height : 30 px ; padding : 0 6 px 0 4 px ; border-radius : var ( - - radius - sm ) ; color : var ( - - text - dim ) ; font-weight : 550 ; font-size : 13 px ; cursor : pointer ; user-select : none ; }
. tsb-group-head : hover { background : var ( - - bg - hover ) ; }
. tsb-group . closed . tsb-chev { transform : rotate ( -90 deg ) ; }
. tsb-chev { font-size : 9 px ; color : var ( - - text - faint ) ; transition : transform .12 s ; }
. tsb-group . closed . tsb-chev { transform : rotate ( 0 deg ) ; }
. tsb-chev { display : inline-flex ; color : var ( - - text - faint ) ; transform : rotate ( 90 deg ) ; transition : transform .12 s ; }
. tsb-group-name { flex : 1 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. tsb-group-cnt { font-size : 11 px ; color : var ( - - text - faint ) ; font-weight : 400 ; }
. tsb-group-add { visibility : hidden ; width : 20 px ; height : 20 px ; border : none ; border-radius : 4 px ; background : none ; color : var ( - - text - faint ) ; font-size : 12 px ; cursor : pointer ; }
. tsb-group-cnt { font-size : 11 px ; color : var ( - - text - faint ) ; font-weight : 400 ; font-variant-numeric : tabular-nums ; }
. tsb-group-add { visibility : hidden ; width : 22 px ; height : 22 px ; border : none ; border-radius : var ( - - radius - xs ) ; background : none ; color : var ( - - text - faint ) ; display : inline-flex ; align-items : center ; justify-content : center ; cursor : pointer ; }
. tsb-group-head : hover . tsb-group-add { visibility : visible ; }
. tsb-group-add : hover { background : var ( - - bg - active ) ; color : var ( - - text ) ; }
. tsb-task { display : flex ; align-items : center ; gap : 8 px ; height : 30 px ; padding : 0 8 px ; margin : 1 px 0 ; border-radius : var ( - - radius - sm ) ; color : var ( - - text - dim ) ; cursor : pointer ; }
. tsb-task { display : flex ; align-items : center ; gap : 8 px ; height : 31 px ; padding : 0 8 px ; margin : 1 px 0 ; border-radius : var ( - - radius - sm ) ; color : var ( - - text - dim ) ; cursor : pointer ; position : relative ; transition : background .1 s , color .1 s ; }
. tsb-task : hover { background : var ( - - bg - hover ) ; color : var ( - - text ) ; }
. tsb-task . active { background : var ( - - bg - active ) ; color : var ( - - text ) ; }
. tsb-task . active :: before { content : '' ; position : absolute ; left : -2 px ; top : 6 px ; bottom : 6 px ; width : 2.5 px ; border-radius : 2 px ; background : var ( - - accent ) ; }
. tsb-task . archived . tsb-task-t { text-decoration : line-through ; opacity : .6 ; }
. tsb-task-t { flex : 1 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; font-size : 13 px ; }
. tsb-task-tm { font-size : 11 px ; color : var ( - - text - faint ) ; font-variant-numeric : tabular-nums ; }
. tsb-pbadge { font-size : 10.5 px ; color : var ( - - text - faint ) ; border : 1 px solid var ( - - border ) ; border-radius : 4 px ; padding : 0 5 px ; line-height : 1.5 ; white-space : nowrap ; }
. tsb-pbadge { font-size : 10.5 px ; color : var ( - - text - faint ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - xs ) ; padding : 0 5 px ; line-height : 1.5 ; white-space : nowrap ; }
. tsb-row-acts { display : none ; gap : 2 px ; }
. tsb-task : hover . tsb-row-acts { display : inline-flex ; }
. tsb-task : hover . tsb-task-tm { display : none ; }
. tsb-row-act { border : none ; background : none ; color : var ( - - text - faint ) ; font-size : 11 px ; cursor : pointer ; padding : 2 px 3 px ; border-radius : 4 px ; }
. tsb-row-act { border : none ; background : none ; color : var ( - - text - faint ) ; cursor : pointer ; padding : 3 px ; border-radius : var ( - - radius - xs ) ; display : inline-flex ; }
. tsb-row-act : hover { background : var ( - - bg - active ) ; color : var ( - - text ) ; }
. tsb-wsstrip { display : flex ; align-items : center ; gap : 2 px ; padding : 6 px 10 px ; border-top : 1 px solid var ( - - border ) ; }
. tsb-wsstrip button { border : none ; background : none ; color : var ( - - text - faint ) ; font-size : 13 px ; cursor : pointer ; padding : 4 px 5 px ; border-radius : var ( - - radius - sm ) ; }
. tsb-wsstrip { display : flex ; align-items : center ; gap : 2 px ; padding : 6 px 12 px ; border-top : 1 px solid var ( - - border - soft ) ; }
. tsb-wsstrip button { border : none ; background : none ; color : var ( - - text - faint ) ; cursor : pointer ; padding : 5 px ; border-radius : var ( - - radius - sm ) ; display : inline-flex ; }
. tsb-wsstrip button : hover { background : var ( - - bg - hover ) ; color : var ( - - text ) ; }
. tsb-footer { display : flex ; align-items : center ; gap : 6 px ; padding : 8 px 10 px ; border-top : 1 px solid var ( - - border ) ; }
. tsb-user { flex : 1 ; display : flex ; align-items : center ; gap : 8 px ; min-width : 0 ; height : 38 px ; padding : 0 7 px ; border : none ; border-radius : var ( - - radius - sm ) ; background : none ; cursor : pointer ; text-align : left ; }
. tsb-footer { display : flex ; align-items : center ; gap : 4 px ; padding : 10 px 12 px ; border-top : 1 px solid var ( - - border - soft ) ; }
. tsb-user { flex : 1 ; display : flex ; align-items : center ; gap : 9 px ; min-width : 0 ; height : 40 px ; padding : 0 7 px ; border : none ; border-radius : var ( - - radius ) ; background : none ; cursor : pointer ; text-align : left ; transition : background .12 s ; }
. tsb-user : hover { background : var ( - - bg - hover ) ; }
. tsb-avatar { width : 26 px ; height : 26 px ; border-radius : 50 % ; background : var ( - - accent ) ; color : #fff ; font-size : 12 px ; font-weight : 600 ; display : flex ; align-items : center ; justify-content : center ; flex : none ; }
. tsb-avatar { width : 27 px ; height : 27 px ; border-radius : 50 % ; background : linear-gradient ( 135 deg , #6d8dff , #9d7bff ) ; color : #fff ; font-size : 12 px ; font-weight : 600 ; display : flex ; align-items : center ; justify-content : center ; flex : none ; box-shadow : inset 0 1 px 0 rgba ( 255 , 255 , 255 , .2 ) ; }
. tsb-user-info { flex : 1 ; min-width : 0 ; display : flex ; flex-direction : column ; }
. tsb-user-name { font-size : 13 px ; font-weight : 600 ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. tsb-user-sub { font-size : 11 px ; color : var ( - - text - faint ) ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; }
. tsb-user-chev { color : var ( - - text - faint ) ; font-size : 10 px ; }
. tsb-user-chev { color : var ( - - text - faint ) ; display : inline-flex ; }
. tsb-menu { position : fixed ; z-index : 300 ; min-width : 210 px ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius ) ; box-shadow : 0 12 px 32 px rgba ( 0 , 0 , 0 , .35 ) ; padding : 5 px ; display : flex ; flex-direction : column ; }
. tsb-mi { display : flex ; align-items : center ; gap : 8 px ; min-height : 30 px ; padding : 4 px 9 px ; border : none ; border-radius : var ( - - radius - sm ) ; background : none ; color : var ( - - text - dim ) ; font-size : 13 px ; cursor : pointer ; text-align : left ; }
. tsb-menu { position : fixed ; z-index : 300 ; min-width : 216 px ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border - strong ) ; border-radius : var ( - - radius - lg ) ; box-shadow : var ( - - shadow - lg ) ; padding : 5 px ; display : flex ; flex-direction : column ; animation : modal-in .12 s var ( - - ease ) ; }
. tsb-mi { display : flex ; align-items : center ; gap : 9 px ; min-height : 31 px ; padding : 4 px 9 px ; border : none ; border-radius : var ( - - radius - sm ) ; background : none ; color : var ( - - text - dim ) ; font-size : 13 px ; cursor : pointer ; text-align : left ; }
. tsb-mi svg { color : var ( - - text - faint ) ; flex : none ; }
. tsb-mi : hover { background : var ( - - bg - hover ) ; color : var ( - - text ) ; }
. tsb-mi : hover svg { color : var ( - - text - dim ) ; }
. tsb-mi . danger { color : var ( - - err ) ; }
. tsb-mi . danger : hover { background : var ( - - err ) ; color : #fff ; }
. tsb-mi kbd { margin-left : auto ; font-size : 10.5 px ; color : var ( - - text - faint ) ; }
. tsb-menu-div { height : 1 px ; background : var ( - - border ) ; margin : 5 px 4 px ; }
. tsb-mi . danger : hover svg { color : #fff ; }
. tsb-mi kbd { margin-left : auto ; font-size : 10.5 px ; font-family : var ( - - mono ) ; color : var ( - - text - faint ) ; }
. tsb-menu-div { height : 1 px ; background : var ( - - border - soft ) ; margin : 5 px 4 px ; }
. tsb-acc-head { display : flex ; gap : 10 px ; align-items : center ; padding : 8 px 9 px 6 px ; }
. tsb-acc-name { font-size : 13.5 px ; font-weight : 600 ; }
. tsb-acc-mail { font-size : 11.5 px ; color : var ( - - text - faint ) ; }
/* ---- 登录页与改密门(R2 管理员发放制 ) ---- */
. lg-wrap { position : fixed ; inset : 0 ; display : flex ; align-items : center ; justify-content : center ; background : var ( - - bg ) ; z-index : 500 ; }
. lg-card { width : 380 px ; max-width : calc ( 100 vw - 32 px ) ; background : var ( - - bg - panel ) ; border : 1 px solid var ( - - border ) ; border-radius : 12 px ; padding : 28 px 28 px 22 px ; box-shadow : 0 12 px 40 px rgba ( 0 , 0 , 0 , .25 ) ; }
. lg-brand { display : flex ; align-items : center ; gap : 9 px ; font-weight : 700 ; font-size : 15 px ; margin-bottom : 18 px ; }
. lg-logo { width : 26 px ; height : 26 px ; border-radius : 8 px ; background : var ( - - accent ) ; color : #fff ; display : flex ; align-items : center ; justify-content : center ; font-size : 13 px ; }
. lg-title { margin : 0 0 4 px ; font-size : 19 px ; }
. lg-sub { margin : 0 0 16 px ; font-size : 12.5 px ; color : var ( - - text - faint ) ; line-height : 1.6 ; }
. lg-tabs { display : flex ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : 8 px ; padding : 3 px ; gap : 3 px ; margin-bottom : 14 px ; }
. lg-tab { flex : 1 ; height : 28 px ; border : none ; border-radius : 6 px ; background : none ; color : var ( - - text - faint ) ; font-size : 12.5 px ; cursor : pointer ; }
. lg-tab . on { background : var ( - - bg - active ) ; color : var ( - - text ) ; font-weight : 500 ; }
. lg-label { display : block ; font-size : 12 px ; font-weight : 500 ; color : var ( - - text - dim ) ; margin : 10 px 0 5 px ; }
. lg-input { width : 100 % ; height : 36 px ; border-radius : 8 px ; border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text ) ; padding : 0 11 px ; font-size : 13.5 px ; }
. lg-input : focus { border-color : var ( - - accent ) ; outline : none ; }
/* ---- 登录页与改密门(R4 重造型:宽屏右侧品牌面板 ) ---- */
. lg-wrap { position : fixed ; inset : 0 ; display : flex ; align-items : stretch ; background : var ( - - bg ) ; z-index : 500 ; }
. lg-panel { flex : none ; width : 46 % ; max-width : 620 px ; position : relative ; overflow : hidden ; display : flex ; flex-direction : column ; justify-content : center ; padding : 64 px ; color : #dfe4f2 ; background : linear-gradient ( 160 deg , #171e38 0 % , #1d2145 55 % , #251d4d 100 % ) ; }
. lg-panel :: before { content : '' ; position : absolute ; width : 560 px ; height : 560 px ; border-radius : 50 % ; background : radial-gradient ( closest - side , rgba ( 109 , 141 , 255 , .22 ) , transparent 70 % ) ; top : -140 px ; right : -160 px ; }
. lg-panel :: after { content : '' ; position : absolute ; width : 440 px ; height : 440 px ; border-radius : 50 % ; background : radial-gradient ( closest - side , rgba ( 157 , 123 , 255 , .18 ) , transparent 70 % ) ; bottom : -150 px ; left : -120 px ; }
. lg-panel h2 { font-size : 26 px ; font-weight : 700 ; letter-spacing : -0.02 em ; line-height : 1.35 ; margin : 0 0 12 px ; position : relative ; }
. lg-panel p { font-size : 14 px ; opacity : .72 ; line-height : 1.75 ; margin : 0 ; position : relative ; }
. lg-panel ul { margin : 28 px 0 0 ; list-style : none ; display : flex ; flex-direction : column ; gap : 13 px ; position : relative ; }
. lg-panel li { display : flex ; gap : 10 px ; align-items : flex-start ; font-size : 13.5 px ; opacity : .88 ; }
. lg-panel li svg { margin-top : 2 px ; color : #8fa8ff ; flex : none ; }
. lg-panel . lg-foot { position : absolute ; bottom : 28 px ; left : 64 px ; right : 64 px ; display : flex ; justify-content : space-between ; font-size : 11.5 px ; opacity : .45 ; }
@ media ( max-width : 960px ) { . lg-panel { display : none ; } }
. lg-formside { flex : 1 ; display : flex ; align-items : center ; justify-content : center ; padding : 24 px ; min-width : 0 ; }
. lg-card { width : 392 px ; max-width : 100 % ; }
. lg-brand { display : flex ; align-items : center ; gap : 10 px ; font-weight : 700 ; font-size : 15.5 px ; letter-spacing : -0.01 em ; margin-bottom : 26 px ; }
. lg-title { margin : 0 0 4 px ; font-size : 22 px ; font-weight : 700 ; letter-spacing : -0.02 em ; }
. lg-sub { margin : 0 0 18 px ; font-size : 12.5 px ; color : var ( - - text - faint ) ; line-height : 1.6 ; }
. lg-tabs { display : flex ; background : var ( - - bg - inset ) ; border : 1 px solid var ( - - border - soft ) ; border-radius : var ( - - radius ) ; padding : 3 px ; gap : 3 px ; margin-bottom : 16 px ; }
. lg-tab { flex : 1 ; height : 30 px ; border : none ; border-radius : var ( - - radius - xs ) ; background : none ; color : var ( - - text - faint ) ; font-size : 12.5 px ; cursor : pointer ; transition : all .12 s ; }
. lg-tab : hover { color : var ( - - text - dim ) ; }
. lg-tab . on { background : var ( - - bg - raised ) ; color : var ( - - text ) ; font-weight : 550 ; box-shadow : 0 1 px 2 px rgba ( 8 , 9 , 12 , .25 ) ; }
. lg-label { display : block ; font-size : 12 px ; font-weight : 550 ; color : var ( - - text - dim ) ; margin : 12 px 0 6 px ; }
. lg-input { width : 100 % ; height : 38 px ; border-radius : var ( - - radius ) ; border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text ) ; padding : 0 12 px ; font-size : 13.5 px ; transition : border-color .12 s , box-shadow .12 s ; }
. lg-input : focus { border-color : var ( - - accent ) ; box-shadow : var ( - - ring ) ; outline : none ; }
. lg-mono { font-family : var ( - - mono ) ; font-size : 12.5 px ; }
. lg-err { margin-top : 10 px ; font-size : 12.5 px ; color : var ( - - err ) ; background : rgba ( 224 , 86 , 107 , .08 ) ; border : 1 px solid rgba ( 224 , 86 , 107 , .3 ) ; border-radius : 8 px ; padding : 7 px 10 px ; }
. lg-submit { width : 100 % ; height : 36 px ; margin-top : 14 px ; border : none ; border-radius : 8 px ; background : var ( - - accent ) ; color : #fff ; font-weight : 600 ; font-size : 13.5 px ; cursor : pointer ; }
. lg-submit : disabled { opacity : .55 ; cursor : default ; }
. lg-submit : not ( : disabled ) : hover { filter : brightness ( 1.08 ) ; }
. lg-err { margin-top : 12 px ; font-size : 12.5 px ; color : var ( - - err ) ; background : var ( - - err - soft ) ; border : 1 px solid color-mix ( in srgb , var ( - - err ) 35 % , transparent ) ; border-radius : var ( - - radius ) ; padding : 8 px 11 px ; display : flex ; gap : 7 px ; align-items : flex-start ; }
. lg-err svg { flex : none ; margin-top : 1 px ; }
. lg-submit {
width : 100 % ; height : 38 px ; margin-top : 16 px ; border : none ; border-radius : var ( - - radius ) ;
background : var ( - - accent ) ; color : var ( - - text - on - accent ) ; font-weight : 600 ; font-size : 13.5 px ; cursor : pointer ;
box-shadow : inset 0 1 px 0 rgba ( 255 , 255 , 255 , .16 ) , 0 2 px 8 px var ( - - accent - glow ) ;
transition : filter .12 s , transform .12 s ;
}
. lg-submit : disabled { opacity : .45 ; cursor : default ; box-shadow : none ; }
. lg-submit : not ( : disabled ) : hover { filter : brightness ( 1.09 ) ; }
. lg-submit : not ( : disabled ) : active { transform : translateY ( 1 px ) ; }
. lg-cancel { width : 100 % ; margin-top : 8 px ; border : none ; background : none ; color : var ( - - text - faint ) ; font-size : 12.5 px ; cursor : pointer ; }
. lg-cancel : hover { color : var ( - - text - dim ) ; text-decoration : underline ; }
. lg-hint { margin : 12 px 0 0 ; font-size : 11.5 px ; color : var ( - - text - faint ) ; line-height : 1.7 ; }
. lg-hint code { font-family : var ( - - mono ) ; font-size : 10.5 px ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : 4 px ; padding : 1 px 5 px ; }
. lg-hint { margin : 14 px 0 0 ; font-size : 11.5 px ; color : var ( - - text - faint ) ; line-height : 1.7 ; }
. lg-hint code { font-family : var ( - - mono ) ; font-size : 10.5 px ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - xs ) ; padding : 1 px 5 px ; }
/* ---- 用户管理 / 改密弹层 ---- */
. ad-body { padding : 14 px 18 px 18 px ; display : flex ; flex-direction : column ; gap : 12 px ; max-height : 70 vh ; overflow-y : auto ; }
. ad-create { border : 1 px solid var ( - - border ) ; border-radius : 10 px ; padding : 12 px ; display : flex ; flex-direction : column ; gap : 8 px ; background : var ( - - bg - raised ) ; }
. ad-body { padding : 16 px 20 px 20 px ; display : flex ; flex-direction : column ; gap : 12 px ; max-height : 70 vh ; overflow-y : auto ; }
. ad-create { border : 1 px solid var ( - - border ) ; border-radius : var ( - - radius - lg ) ; padding : 14 px ; display : flex ; flex-direction : column ; gap : 8 px ; background : var ( - - bg - panel ) ; }
. ad-row { display : flex ; gap : 8 px ; align-items : center ; }
. ad-row . lg-input { flex : 1 ; min-width : 0 ; height : 32 px ; }
. ad-row . lg-input { flex : 1 ; min-width : 0 ; height : 34 px ; }
. ad-check { display : flex ; align-items : center ; gap : 5 px ; font-size : 12.5 px ; color : var ( - - text - dim ) ; white-space : nowrap ; }
. ad-create-btn { width : auto ; padding : 0 14 px ; margin-top : 0 ; height : 32 px ; flex : none ; }
. ad-mini { border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text - dim ) ; border-radius : 6 px ; padding : 4 px 9 px ; font-size : 12 px ; cursor : pointer ; white-space : nowrap ; }
. ad-create-btn { width : auto ; padding : 0 14 px ; margin-top : 0 ; height : 34 px ; flex : none ; box-shadow : inset 0 1 px 0 rgba ( 255 , 255 , 255 , .14 ) ; }
. ad-mini { border : 1 px solid var ( - - border ) ; background : var ( - - bg - raised ) ; color : var ( - - text - dim ) ; border-radius : var ( - - radius - sm ) ; padding : 4 px 9 px ; font-size : 12 px ; cursor : pointer ; white-space : nowrap ; display : inline-flex ; align-items : center ; gap : 4 px ; }
. ad-mini : hover { color : var ( - - text ) ; border-color : var ( - - accent ) ; }
. ad-hint { margin : 0 ; font-size : 11.5 px ; color : var ( - - text - faint ) ; }
. ad-notice { font-size : 12.5 px ; color : var ( - - ok ) ; background : rgba ( 65 , 178 , 110 , .09 ) ; border : 1 px solid rgba ( 65 , 178 , 110 , .3 ) ; border-radius : 8 px ; padding : 8 px 11 px ; }
. ad-notice { font-size : 12.5 px ; color : var ( - - ok ) ; background : var ( - - ok - soft ) ; border : 1 px solid var ( - - ok - border ) ; border-radius : var ( - - radius ) ; padding : 8 px 11 px ; display : flex ; gap : 7 px ; align-items : flex-start ; }
. ad-notice svg { flex : none ; margin-top : 1 px ; }
. ad-table { width : 100 % ; border-collapse : collapse ; font-size : 12.5 px ; }
. ad-table th { text-align : left ; font-weight : 500 ; color : var ( - - text - faint ) ; font-size : 11.5 px ; padding : 6 px 8 px ; border-bottom : 1 px solid var ( - - border ) ; }
. ad-table td { padding : 7 px 8 px ; border-bottom : 1 px solid var ( - - border ) ; }
. ad-table th { text-align : left ; font-weight : 600 ; color : var ( - - text - faint ) ; font-size : 11 px ; text-transform : uppercase ; letter-spacing : .06 em ; padding : 8 px ; border-bottom : 1 px solid var ( - - border ) ; }
. ad-table td { padding : 9 px 8 px ; border-bottom : 1 px solid var ( - - border - soft ) ; }
. ad-table tr : last-child td { border-bottom : none ; }
. ad-mono { font-family : var ( - - mono ) ; font-size : 12 px ; }
. ad-dim { color : var ( - - text - faint ) ; }
. ad-chip { font-size : 10 px ; border-radius : 4 px ; padding : 1 px 6 px ; font-weight : 700 ; letter-spacing : .4 px ; background : var ( - - bg - hover ) ; color : var ( - - text - faint ) ; }
. ad-chip { font-size : 10 px ; border-radius : var ( - - radius - xs ) ; padding : 2 px 7 px ; font-weight : 700 ; letter-spacing : .5 px ; background : var ( - - bg - hover ) ; color : var ( - - text - faint ) ; }
. ad-chip-admin { background : var ( - - accent - soft ) ; color : var ( - - accent ) ; }
. ad-chip-warn { background : rgba ( 217 , 155 , 63 , .15 ) ; color : var ( - - warn ) ; }
. ad-reset { display : flex ; gap : 8 px ; align-items : center ; flex-wrap : wrap ; border : 1 px solid var ( - - warn ) ; border-radius : 10 px ; padding : 12 px ; font-size : 12.5 px ; }
. ad-chip-warn { background : var ( - - warn - soft ) ; color : var ( - - warn ) ; }
. ad-reset { display : flex ; gap : 8 px ; align-items : center ; flex-wrap : wrap ; border : 1 px solid color-mix ( in srgb , var ( - - warn ) 40 % , transparent ) ; background : var ( - - warn - soft ) ; border-radius : var ( - - radius - lg ) ; padding : 12 px ; font-size : 12.5 px ; }
. ad-reset . lg-input { flex : 1 ; min-width : 160 px ; height : 32 px ; }
. ad-changepw { display : flex ; flex-direction : column ; gap : 2 px ; max-width : 340 px ; }
/* ---- 收起轨道(左栏收起态) ---- */
. icon-only { display : flex ; flex-direction : column ; align-items : center ; gap : 6 px ; padding-top : 12 px ; }
. icon-only button { background : none ; border : none ; color : var ( - - text - faint ) ; cursor : pointer ; padding : 0 ; width : 34 px ; height : 34 px ; border-radius : var ( - - radius ) ; display : inline-flex ; align-items : center ; justify-content : center ; position : relative ; }
. icon-only button : hover { background : var ( - - bg - hover ) ; color : var ( - - text ) ; }
. rail-badge { position : absolute ; top : 3 px ; right : 3 px ; min-width : 14 px ; height : 14 px ; border-radius : 7 px ; background : var ( - - warn ) ; color : #fff ; font-size : 9.5 px ; font-weight : 700 ; display : flex ; align-items : center ; justify-content : center ; padding : 0 4 px ; }
/* ---- UI 能力平台消费(消息头像列 / 设置外壳 / 管理弹层头像) ---- */
. role-mark { width : 20 px ; height : 20 px ; border-radius : 6 px ; display : inline-flex ; align-items : center ; justify-content : center ; color : var ( - - text - dim ) ; background : var ( - - bg - raised ) ; border : 1 px solid var ( - - border ) ; }
. role-mark . role-assistant { background : none ; border : none ; padding : 0 ; }
. msg . user . msg-role { align-items : center ; }
. ad-user-cell { display : flex ; align-items : center ; gap : 8 px ; }