/
G33K
/
Portfolio
Обзор
Документация
Войти
/
G33K
/
Portfolio
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
styles.css
746 строк
13 KB
G33K
Implement carousel functionality for project images and enhance reveal animations. Update styles for improved visual presentation and responsiveness.
24 июл 2026, 07:50
24 июл 2026, 07:50
60db0c0
Код
Авторство
О чём код?
:root { --bg: #12100e; --bg-soft: #181512; --bg-card: #1a1714; --text: #f2f0eb; --muted: #a7a39a; --line: rgba(242, 240, 235, 0.12); --accent: #d8c4a4; --accent-text: #171512; --glow-brown: rgba(122, 82, 48, 0.3); --glow-umber: rgba(94, 64, 42, 0.22); --radius: 10px; --container: 1040px; --header-h: 68px; --font-display: "Newsreader", Georgia, serif; --font-body: "Instrument Sans", sans-serif; } *, *::before, *::after { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; min-height: 100vh; font-family: var(--font-body); color: var(--text); background-color: var(--bg); background-image: radial-gradient(ellipse 70% 50% at 12% 8%, rgba(122, 82, 48, 0.28), transparent 55%), radial-gradient(ellipse 55% 45% at 88% 18%, rgba(94, 64, 42, 0.22), transparent 50%), radial-gradient(ellipse 60% 40% at 70% 72%, rgba(72, 48, 32, 0.2), transparent 55%), radial-gradient(ellipse 50% 35% at 18% 88%, rgba(110, 74, 44, 0.16), transparent 50%), linear-gradient(180deg, #171411 0%, var(--bg) 42%, #0e0d0c 100%); background-attachment: fixed; line-height: 1.6; -webkit-font-smoothing: antialiased; } img { max-width: 100%; display: block; } a { color: inherit; text-decoration: none; } ul { margin: 0; padding: 0; list-style: none; } button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; } .container { width: min(100% - 2.5rem, var(--container)); margin-inline: auto; } .header { position: sticky; top: 0; z-index: 40; backdrop-filter: blur(12px); background: rgba(18, 18, 18, 0.86); border-bottom: 1px solid transparent; transition: border-color 0.25s ease; } .header.is-scrolled { border-bottom-color: var(--line); } .header__inner { min-height: var(--header-h); display: flex; align-items: center; gap: 1.25rem; } .logo { font-family: var(--font-body); font-weight: 600; letter-spacing: 0.08em; font-size: 0.95rem; } .nav { display: flex; align-items: center; gap: 1.4rem; margin-left: auto; } .nav a { color: var(--muted); font-size: 0.92rem; transition: color 0.2s ease; } .nav a:hover { color: var(--text); } .header__cta { margin-left: 0.35rem; } .nav-toggle { display: none; width: 42px; height: 42px; margin-left: auto; place-items: center; gap: 6px; flex-direction: column; } .nav-toggle span { display: block; width: 18px; height: 1.5px; background: var(--text); transition: transform 0.2s ease, opacity 0.2s ease; } .nav-toggle[aria-expanded="true"] span:first-child { transform: translateY(3.75px) rotate(45deg); } .nav-toggle[aria-expanded="true"] span:last-child { transform: translateY(-3.75px) rotate(-45deg); } .btn { display: inline-flex; align-items: center; justify-content: center; min-height: 46px; padding: 0.7rem 1.2rem; border-radius: 8px; background: var(--accent); color: var(--accent-text); font-weight: 600; font-size: 0.95rem; transition: background 0.2s ease, transform 0.2s ease; } .btn:hover { background: #e6d5b8; transform: translateY(-1px); } .btn--ghost { background: transparent; color: var(--text); border: 1px solid var(--line); } .btn--ghost:hover { background: rgba(255, 255, 255, 0.03); border-color: rgba(242, 240, 235, 0.22); transform: translateY(-1px); } .btn--sm { min-height: 38px; padding: 0.45rem 0.9rem; font-size: 0.88rem; } .hero { min-height: calc(100vh - var(--header-h)); display: grid; align-items: center; padding: 4.5rem 0 5rem; } .hero__inner { max-width: 680px; } .hero__brand { margin: 0 0 1.25rem; font-family: var(--font-display); font-size: clamp(3rem, 8vw, 5.25rem); font-weight: 600; letter-spacing: -0.03em; line-height: 0.95; color: var(--text); } .hero__title { margin: 0 0 1rem; font-family: var(--font-body); font-size: clamp(1.35rem, 2.8vw, 1.85rem); font-weight: 500; letter-spacing: -0.02em; line-height: 1.25; color: var(--text); } .hero__lead { margin: 0 0 2rem; max-width: 34rem; color: var(--muted); font-size: 1.05rem; } .hero__actions { display: flex; flex-wrap: wrap; gap: 0.75rem; } .section { padding: 5rem 0; } .section--skills { border-block: 1px solid var(--line); background: var(--bg-soft); } .section--contact { padding-bottom: 6rem; } .section__head { max-width: 34rem; margin-bottom: 2.25rem; } .eyebrow { margin: 0 0 0.6rem; color: var(--muted); font-size: 0.78rem; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; } .section__title { margin: 0 0 0.75rem; font-family: var(--font-display); font-size: clamp(1.7rem, 3.2vw, 2.35rem); font-weight: 500; letter-spacing: -0.02em; } .section__desc { margin: 0; color: var(--muted); } .projects { display: grid; gap: 1.25rem; } .project { display: grid; grid-template-columns: 1.15fr 1fr; overflow: hidden; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-card); transition: border-color 0.25s ease, transform 0.25s ease; } .project:hover { transform: translateY(-3px); border-color: rgba(216, 196, 164, 0.35); } .carousel { position: relative; min-height: 300px; border-right: 1px solid var(--line); background: #100e0c; } .carousel__viewport { height: 100%; min-height: 300px; overflow: hidden; } .carousel__track { display: flex; height: 100%; min-height: 300px; transition: transform 0.4s ease; will-change: transform; } .carousel__slide { margin: 0; flex: 0 0 100%; min-width: 100%; height: 100%; min-height: 300px; background: #0c0a09; } .carousel__slide img { width: 100%; height: 100%; object-fit: cover; object-position: top center; display: block; user-select: none; pointer-events: none; } .carousel__btn { position: absolute; top: 50%; z-index: 2; display: grid; place-items: center; width: 36px; height: 36px; transform: translateY(-50%); border: 1px solid var(--line); border-radius: 999px; background: rgba(18, 16, 14, 0.72); color: var(--text); backdrop-filter: blur(8px); transition: background 0.2s ease, border-color 0.2s ease; } .carousel__btn:hover { background: rgba(30, 26, 22, 0.9); border-color: rgba(216, 196, 164, 0.4); } .carousel__btn svg { width: 16px; height: 16px; } .carousel__btn--prev { left: 0.7rem; } .carousel__btn--next { right: 0.7rem; } .carousel__dots { position: absolute; left: 0; right: 0; bottom: 0.85rem; z-index: 2; display: flex; justify-content: center; gap: 0.4rem; } .carousel__dot { width: 7px; height: 7px; padding: 0; border-radius: 999px; border: 0; background: rgba(242, 240, 235, 0.35); transition: background 0.2s ease, transform 0.2s ease; } .carousel__dot.is-active { background: var(--accent); transform: scale(1.15); } .project__body { padding: 1.6rem 1.7rem 1.5rem; display: flex; flex-direction: column; gap: 0.8rem; } .project__meta { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; flex-wrap: wrap; } .tag { color: var(--accent); font-size: 0.82rem; font-weight: 500; letter-spacing: 0.04em; text-transform: uppercase; } .status { color: var(--muted); font-size: 0.85rem; } .project__title { margin: 0; font-family: var(--font-display); font-size: 1.45rem; font-weight: 500; letter-spacing: -0.02em; } .project__text { margin: 0; color: var(--muted); } .project__stack { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: auto; padding-top: 0.35rem; } .project__stack li { padding: 0.28rem 0.55rem; border: 1px solid var(--line); border-radius: 6px; color: var(--muted); font-size: 0.8rem; } .skills { display: flex; flex-wrap: wrap; gap: 0.6rem; } .skills li { padding: 0.65rem 0.95rem; border-radius: 8px; border: 1px solid var(--line); background: transparent; color: var(--muted); transition: border-color 0.2s ease, color 0.2s ease; } .skills li:hover { border-color: rgba(216, 196, 164, 0.4); color: var(--text); } .about { max-width: 38rem; } .about__text { margin: 0; color: var(--muted); font-size: 1.05rem; } .contact { max-width: 36rem; } .contact__text { margin: 0 0 1.4rem; color: var(--muted); } .contact__actions { display: flex; flex-wrap: wrap; gap: 0.75rem; } .contact-link { display: inline-flex; align-items: center; gap: 0.75rem; min-height: 52px; padding: 0.65rem 1rem; border: 1px solid var(--line); border-radius: 10px; background: rgba(255, 255, 255, 0.02); transition: border-color 0.2s ease, background 0.2s ease, transform 0.2s ease; } .contact-link:hover { border-color: rgba(216, 196, 164, 0.4); background: rgba(216, 196, 164, 0.06); transform: translateY(-1px); } .contact-link__icon { display: grid; place-items: center; width: 28px; height: 28px; color: var(--accent); flex-shrink: 0; } .contact-link__icon svg { width: 22px; height: 22px; } .contact-link__copy { display: flex; flex-direction: column; gap: 0.1rem; line-height: 1.2; } .contact-link__kind { font-size: 0.72rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); } .contact-link__text { font-size: 0.98rem; font-weight: 500; } .footer { border-top: 1px solid var(--line); padding: 1.4rem 0 1.8rem; } .footer__inner { display: flex; justify-content: space-between; gap: 1rem; color: var(--muted); font-size: 0.88rem; } .hero-anim { animation: heroIn 0.7s ease both; } .hero-anim--d1 { animation-delay: 0.07s; } .hero-anim--d2 { animation-delay: 0.14s; } .hero-anim--d3 { animation-delay: 0.21s; } /* Scroll-linked reveals: --reveal-progress is 0→1 from JS (viewport travel). */ .reveal { --reveal-progress: 0; --reveal-p: clamp(0, var(--reveal-progress), 1); opacity: var(--reveal-p); transform: translateY(calc((1 - var(--reveal-p)) * 28px)); will-change: opacity, transform; } .reveal--card { transform: translateY(calc((1 - var(--reveal-p)) * 40px)) scale(calc(0.97 + 0.03 * var(--reveal-p))); } /* Assemble / stagger: container stays solid; children map progress with offsets. */ .reveal--assemble, .reveal--stagger { opacity: 1; transform: none; will-change: auto; } .reveal--assemble .eyebrow { --p: clamp(0, calc(var(--reveal-progress) / 0.32), 1); opacity: var(--p); transform: translateY(calc((1 - var(--p)) * 12px)); } .assemble-word { --word-start: calc(0.08 + var(--i, 0) * 0.07); --p: clamp(0, calc((var(--reveal-progress) - var(--word-start)) / 0.38), 1); display: inline-block; opacity: var(--p); transform: translateY(calc((1 - var(--p)) * 1.1em)); } .reveal--assemble .section__desc, .reveal--assemble .about__text, .reveal--assemble .contact__text, .reveal--assemble .contact__actions { --p: clamp(0, calc((var(--reveal-progress) - 0.38) / 0.42), 1); opacity: var(--p); transform: translateY(calc((1 - var(--p)) * 18px)); } .reveal--stagger li { --item-start: calc(var(--i, 0) * 0.06); --p: clamp(0, calc((var(--reveal-progress) - var(--item-start)) / 0.36), 1); opacity: var(--p); transform: translateY(calc((1 - var(--p)) * 14px)); transition: border-color 0.2s ease, color 0.2s ease; } @keyframes heroIn { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } } @media (max-width: 900px) { .project { grid-template-columns: 1fr; } .carousel, .carousel__viewport, .carousel__track, .carousel__slide { min-height: 240px; } .carousel { border-right: 0; border-bottom: 1px solid var(--line); } } @media (max-width: 760px) { .nav-toggle { display: inline-flex; } .header__cta { display: none; } .nav { position: absolute; top: calc(var(--header-h) - 1px); left: 0; right: 0; margin: 0; padding: 1rem 1.25rem 1.25rem; flex-direction: column; align-items: stretch; gap: 0.2rem; background: rgba(18, 18, 18, 0.98); border-bottom: 1px solid var(--line); transform: translateY(-8px); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; } .nav.is-open { opacity: 1; visibility: visible; transform: none; pointer-events: auto; } .nav a { padding: 0.85rem 0.2rem; border-bottom: 1px solid var(--line); } .hero { min-height: auto; padding: 3.25rem 0 3.75rem; } .section { padding: 3.75rem 0; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } .reveal, .project, .btn, .skills li, .hero-anim, .carousel__track, .assemble-word, .reveal--assemble .eyebrow, .reveal--assemble .section__desc, .reveal--assemble .about__text, .reveal--assemble .contact__text, .reveal--assemble .contact__actions, .reveal--stagger li { transition: none !important; animation: none !important; will-change: auto !important; } .reveal, .reveal--card, .hero-anim, .assemble-word, .reveal--assemble .eyebrow, .reveal--assemble .section__desc, .reveal--assemble .about__text, .reveal--assemble .contact__text, .reveal--assemble .contact__actions, .reveal--stagger li { opacity: 1 !important; transform: none !important; } }