#side { position: fixed; left: 0; top: 0; bottom: 0; width: 340px; z-index: 30; pointer-events: none } #side::before { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(0, 0, 0, .92) 0%, rgba(0, 0, 0, .7) 55%, transparent 100%); opacity: 0; transition: opacity .35s } #side.open::before { opacity: 1 } #side nav { position: absolute; left: 0; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 6px; pointer-events: auto } .ni { margin-left: 16px; width: 56px; height: 56px; border-radius: 28px; display: flex; align-items: center; gap: 18px; padding: 0 16px; color: #fff; opacity: .45; overflow: hidden; white-space: nowrap; transition: width .32s cubic-bezier(.2, .8, .2, 1), background .25s, color .25s, opacity .25s } .ni svg { width: 24px; height: 24px; flex: 0 0 24px } .ni span { font-size: 19px; font-weight: 600; opacity: 0; transition: opacity .25s } .ni.act { opacity: 1 } #side.open .ni { width: 260px; opacity: .85 } #side.open .ni span { opacity: 1 } #side.open .ni.on { background: #fff; color: #000; opacity: 1 } .brand { position: absolute; left: 24px; top: 5vh; display: flex; align-items: center; gap: 14px; height: 44px; color: #fff } .brand svg, .brand img { width: 40px; height: 40px; flex: 0 0 40px; object-fit: contain } .brand span { font-size: 24px; font-weight: 700; letter-spacing: -.03em; opacity: 0; transform: translateX(-6px); transition: opacity .3s, transform .3s } #side.open .brand span { opacity: 1; transform: none }