/* ============================================================ YCat 全站统一左侧导航 Rail(共享组件) 使用:页面引入本 CSS + js/app-rail.js,body 内放
机制:rail 固定左侧;非编辑器页靠 body 左 padding 随 --rail-w 联动; 编辑器页(含 #editor-app)自动加 .editor-page 类,padding 归零、由自身 .main 处理左移。 ============================================================ */ :root{ --rail-bg: #11142b; --rail-bg-2: #171b38; --rail-fg: #c9cdec; --rail-fg-dim: #7e85b4; --rail-active: #8b7bff; --rail-active-soft: rgba(139,123,255,.18); --rail-hover: rgba(255,255,255,.055); --rail-edge: rgba(255,255,255,.07); --rail-w: 66px; --rail-w-expanded: 216px; --rail-font: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif; } /* —— 页面容器联动:非编辑器页面用 body 左 padding —— */ body.has-rail{ padding-left: var(--rail-w); transition: padding-left .24s cubic-bezier(.4,0,.2,1); } body.has-rail.rail-expanded{ --rail-w: var(--rail-w-expanded); } body.has-rail.editor-page{ padding-left: 0; } /* 编辑器自行管理 .main 位移 */ /* —— Rail 容器(深色常驻,修复收起变白) —— */ #app-rail{ position: fixed; left: 0; top: 0; bottom: 0; width: var(--rail-w); display: flex; flex-direction: column; background: linear-gradient(180deg,var(--rail-bg),var(--rail-bg-2)); color: var(--rail-fg); border-right: 1px solid var(--rail-edge); z-index: 600; transition: width .24s cubic-bezier(.4,0,.2,1); font-family: var(--rail-font); overflow: hidden; user-select: none; } body.rail-expanded #app-rail{ width: var(--rail-w-expanded); } /* 收起态:细微内阴影暗示“可展开”,不再覆盖背景 */ body:not(.rail-expanded) #app-rail{ box-shadow: inset 14px 0 22px -18px rgba(139,123,255,.5); } /* Logo */ #app-rail .rail-logo{ flex: 0 0 auto; height: 56px; display: flex; align-items: center; gap: 11px; padding: 0 16px; margin: 0; font-weight: 800; font-size: 15px; letter-spacing: .3px; color: #fff; text-decoration: none; border-bottom: 1px solid var(--rail-edge); } #app-rail .rail-logo::before{ content: "Y"; flex: 0 0 auto; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(135deg,#7c5cff,#4f46e5 55%,#6450e6); color: #fff; font-size: 17px; font-weight: 800; box-shadow: 0 4px 14px rgba(79,70,229,.45); } #app-rail .rail-logo .rail-logo-text{ display: none; white-space: nowrap; } body.rail-expanded #app-rail .rail-logo .rail-logo-text{ display: inline; } /* Toggle */ #app-rail .rail-toggle{ flex: 0 0 auto; display: flex; align-items: center; gap: 10px; height: 40px; margin: 10px; padding: 0 11px; background: rgba(255,255,255,.04); border: 1px solid var(--rail-edge); border-radius: 10px; color: var(--rail-fg); cursor: pointer; transition: background .16s ease, transform .12s ease; } #app-rail .rail-toggle:hover{ background: rgba(255,255,255,.09); } #app-rail .rail-toggle:active{ transform: scale(.97); } #app-rail .rail-toggle .rt-chev{ flex: 0 0 auto; width: 18px; height: 18px; transition: transform .24s cubic-bezier(.4,0,.2,1); } body.rail-expanded #app-rail .rail-toggle .rt-chev{ transform: rotate(180deg); } #app-rail .rail-toggle .rt-label{ display: none; font-size: 13px; white-space: nowrap; } body.rail-expanded #app-rail .rail-toggle .rt-label{ display: inline; } /* Scroll area */ #app-rail .rail-scroll{ flex: 1 1 auto; overflow-y: auto; overflow-x: hidden; padding: 4px 10px 16px; display: flex; flex-direction: column; gap: 4px; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,.14) transparent; } #app-rail .rail-scroll::-webkit-scrollbar{ width: 7px; } #app-rail .rail-scroll::-webkit-scrollbar-thumb{ background: rgba(255,255,255,.14); border-radius: 8px; } /* Group */ #app-rail .rail-group{ display: flex; flex-direction: column; gap: 2px; } #app-rail .rail-group + .rail-group{ margin-top: 6px; padding-top: 8px; border-top: 1px solid rgba(255,255,255,.05); } /* Group head(可点击收缩,仅展开态可见) */ #app-rail .rail-group-head{ display: none; align-items: center; gap: 6px; height: 26px; padding: 0 10px; background: none; border: 0; cursor: pointer; color: var(--rail-fg-dim); font: 700 10.5px/1 var(--rail-font); letter-spacing: 1.4px; text-transform: uppercase; width: 100%; text-align: left; } #app-rail .rail-group-head:hover{ color: var(--rail-fg); } #app-rail .rail-group-head .rg-caret{ flex: 0 0 auto; font-size: 9px; transition: transform .2s ease; transform: rotate(90deg); } #app-rail .rail-group.collapsed .rg-caret{ transform: rotate(0deg); } #app-rail .rail-group-head .rg-label{ flex: 1 1 auto; white-space: nowrap; } body.rail-expanded #app-rail .rail-group-head{ display: flex; } /* 收起态:分组标题隐藏,项目始终显示(仅 emoji) */ #app-rail .rail-group-items{ display: flex; flex-direction: column; gap: 2px; } body.rail-expanded #app-rail .rail-group.collapsed .rail-group-items{ display: none; } /* Item */ #app-rail .rail-item{ position: relative; display: flex; align-items: center; gap: 12px; height: 42px; padding: 0 11px; border-radius: 10px; color: var(--rail-fg); text-decoration: none; cursor: pointer; transition: background .16s ease, color .16s ease; overflow: hidden; } #app-rail .rail-item:hover{ background: var(--rail-hover); color: #fff; } #app-rail .rail-item:focus-visible{ outline: 2px solid var(--rail-active); outline-offset: 2px; } /* emoji icon(常驻) */ #app-rail .rail-emoji{ flex: 0 0 auto; width: 24px; height: 24px; display: grid; place-items: center; font-size: 17px; line-height: 1; transition: transform .16s ease; } #app-rail .rail-item:hover .rail-emoji{ transform: scale(1.12); } /* text column(展开态显示) */ #app-rail .rail-text{ display: none; flex-direction: column; min-width: 0; line-height: 1.18; } body.rail-expanded #app-rail .rail-text{ display: flex; } #app-rail .rail-label{ font-size: 13.5px; font-weight: 600; color: #f1f2fb; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } #app-rail .rail-hint{ font-size: 11.5px; color: var(--rail-fg-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-height: 0; opacity: 0; transition: max-height .22s ease, opacity .2s ease; } #app-rail .rail-hint.show{ max-height: 2.4em; opacity: 1; } /* active state */ #app-rail .rail-item.rail-item--active{ background: var(--rail-active-soft); color: #fff; } #app-rail .rail-item.rail-item--active::before{ content: ""; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px; border-radius: 3px; background: var(--rail-active); animation: railActivePulse 2.6s ease-in-out infinite; } @keyframes railActivePulse{ 0%,100%{ opacity: .65; box-shadow: 0 0 0 0 rgba(139,123,255,0); } 50%{ opacity: 1; box-shadow: 0 0 8px 1px rgba(139,123,255,.45); } } /* —— 移动端:抽屉 —— */ @media (max-width: 640px){ body.has-rail{ padding-left: 0; } #app-rail{ transform: translateX(-100%); transition: transform .24s cubic-bezier(.4,0,.2,1); } body.rail-expanded #app-rail{ transform: translateX(0); } }