/* Базовые числа темы (переопределяются из localStorage и пикера) */ html { --theme-h: 210; --theme-s: 90; --theme-l: 40; --mesh-a-x: 2%; --mesh-a-y: 2%; --mesh-b-x: 50%; --mesh-b-y: 2%; --mesh-c-x: 98%; --mesh-c-y: 2%; --mesh-a-mult: 1; --mesh-b-mult: 1; --mesh-c-mult: 1; --mesh-size-mult: 1.5; --mesh-opacity-max: 1; --mesh-opacity-min: 0; --mesh-opacity-current: 1; --neutral-accent-tint: 4%; --accent: hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)); --accent-square-2-h: calc((var(--theme-h) + 90) * 1deg); --accent-square-3-h: calc((var(--theme-h) + 180) * 1deg); --accent-square-4-h: calc((var(--theme-h) + 270) * 1deg); --accent-square-2: hsl(var(--accent-square-2-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)); --accent-square-3: hsl(var(--accent-square-3-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)); --accent-square-4: hsl(var(--accent-square-4-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)); --accent-text: var(--accent); --accent-btn-radial-core: color-mix( in hsl, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc((var(--theme-l) + 8) * 1%)), white 6% ); --accent-btn-radial-mid: color-mix(in hsl, var(--accent-analog), hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 45%); --accent-btn-radial-edge: color-mix(in hsl, var(--accent-analog), black 15%); /* Базовая шкала скруглений; карточки и кнопки используют один уровень */ --radius-sm: 8px; --radius-md: 12px; --radius-card: 14px; --radius-btn: 14px; --space: clamp(1rem, 4vw, 2.75rem); /* Единый отступ fixed-элементов (FAB, плавающее меню, header) от краёв вьюпорта */ --edge-pad: clamp(0.5rem, 2vw, 1.4rem); /* Контент на всю ширину экрана, поля только от --space и safe area */ --max: none; --font: "Alice", system-ui, -apple-system, serif; --font-accent: "Merriweather", var(--font); --neutral-s: 5%; /* Иконки UI: фиксированный размер по типу элемента */ --icon-fab: 1.25rem; --icon-nav-overflow: 1.125rem; --icon-contact: 1.5rem; --icon-contact-meta: 1.125rem; --card-border: hsla(210, 10%, 55%, 0.15); } html[data-theme="dark"] { color-scheme: dark; --bg: color-mix(in hsl, hsl(var(--theme-h), 6%, 10%), var(--accent) var(--neutral-accent-tint)); --bg-elevated: color-mix(in hsl, hsl(var(--theme-h), 6%, 13%), var(--accent) var(--neutral-accent-tint)); --surface: color-mix(in hsl, hsl(var(--theme-h), 6%, 17%), var(--accent) var(--neutral-accent-tint)); --accent-text: color-mix(in hsl, var(--accent), white 10%); --page-bg: radial-gradient( calc(48% * var(--mesh-size-mult)) calc(56% * var(--mesh-size-mult)) at var(--mesh-a-x) var(--mesh-a-y), color-mix(in srgb, var(--accent-square-3) calc(52% * var(--mesh-a-mult)), var(--bg)) 0%, transparent 62% ), radial-gradient( calc(48% * var(--mesh-size-mult)) calc(56% * var(--mesh-size-mult)) at var(--mesh-b-x) var(--mesh-b-y), color-mix(in srgb, var(--accent-square-2) calc(44% * var(--mesh-b-mult)), var(--bg)) 0%, transparent 64% ), radial-gradient( calc(52% * var(--mesh-size-mult)) calc(60% * var(--mesh-size-mult)) at var(--mesh-c-x) var(--mesh-c-y), color-mix(in srgb, var(--accent-square-4) calc(36% * var(--mesh-c-mult)), var(--bg)) 0%, transparent 68% ); --text: hsl(var(--theme-h), 4%, 92%); --text-muted: color-mix(in hsl, hsl(var(--theme-h), 5%, 58%), var(--accent) 6%); --line: color-mix(in hsl, hsla(var(--theme-h), 8%, 48%, 0.18), var(--accent) 5%); --accent-hover: color-mix(in hsl, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)), white 18%); --accent-soft: color-mix(in hsl, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)), transparent 82%); --shadow-strong: 0 24px 60px hsla(0, 0%, 0%, 0.45); /* Карточки навыков: зона решений */ --skill-solutions-bg: color-mix(in srgb, var(--bg-elevated) 55%, var(--surface)); --skill-solutions-top-border: var(--line); --skill-solution-separator: color-mix(in srgb, var(--line) 92%, var(--text-muted)); --img-ph-shine-peak: color-mix(in srgb, var(--text) 25%, var(--surface) 75%); /* Кнопки primary: радиальный акцент + стекло (общие с .fab--primary) */ --btn-primary-border: color-mix( in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 55%, hsla(0, 0%, 100%, 0.12) ); --btn-primary-bg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 10%) 0%, var(--accent) 100% ); --btn-primary-hover-bg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 14%) 0%, var(--accent) 100% ); /* flat: без «парения» и фаски — только обводка (--btn-primary-border) */ --btn-primary-shadow-flat: none; --btn-primary-shadow-raised: 0 14px 34px color-mix(in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 22%, hsla(0, 0%, 0%, 0.5)), inset 0 1px 0 hsla(0, 0%, 100%, 0.14), inset 0 -1px 0 color-mix(in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 22%, transparent); --btn-primary-shadow-hover: 0 16px 40px color-mix(in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 28%, hsla(0, 0%, 0%, 0.48)), inset 0 1px 0 hsla(0, 0%, 100%, 0.18), inset 0 -1px 0 color-mix(in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 18%, transparent); --btn-primary-backdrop: blur(16px) saturate(135%); --btn-primary-backdrop-hover: blur(18px) saturate(140%); /* Liquid Glass (Хабр): искажение + лёгкое матирование — только Chromium */ --btn-primary-backdrop-lg: url(#liquid-glass-displacement-btn) blur(2px); --btn-primary-backdrop-hover-lg: url(#liquid-glass-displacement-btn) blur(2px); /* Полупрозрачный акцентный фон, чтобы displacement был виден (Liquid Glass) */ --btn-primary-bg-lg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 10%) 0%, color-mix(in srgb, var(--accent) 82%, transparent) 100% ); --btn-primary-hover-bg-lg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 14%) 0%, color-mix(in srgb, var(--accent) 86%, transparent) 100% ); --btn-primary-sheen: linear-gradient( 155deg, hsla(0, 0%, 100%, 0.1) 0%, hsla(0, 0%, 100%, 0.03) 50%, color-mix(in srgb, var(--accent-soft) 32%, transparent) 100% ); } html[data-radius="soft"] { --radius-sm: 4px; --radius-md: 6px; --radius-card: 4px; --radius-btn: 4px; } html[data-radius="strong"] { --radius-sm: 11px; --radius-md: 16px; --radius-card: 20px; --radius-btn: 20px; } html[data-font="merriweather"] { --font: "Alice", system-ui, -apple-system, serif; --font-accent: "Merriweather", var(--font); } html[data-font="geologica"] { --font: "PT Sans", system-ui, -apple-system, sans-serif; --font-accent: "Geologica", var(--font); } html[data-font="mono"] { --font: "PT Mono", ui-monospace, "Cascadia Code", "Consolas", monospace; --font-accent: "Source Code Pro", var(--font); } html[data-theme="light"] { color-scheme: light; --bg: color-mix(in hsl, hsl(var(--theme-h), 6%, 97%), var(--accent) var(--neutral-accent-tint)); --bg-elevated: color-mix(in hsl, hsl(var(--theme-h), 5%, 94%), var(--accent) var(--neutral-accent-tint)); --surface: color-mix(in hsl, hsl(var(--theme-h), 6%, 100%), var(--accent) var(--neutral-accent-tint)); --accent-text: color-mix(in hsl, var(--accent), black 14%); --page-bg: radial-gradient( calc(48% * var(--mesh-size-mult)) calc(56% * var(--mesh-size-mult)) at var(--mesh-a-x) var(--mesh-a-y), color-mix(in srgb, var(--accent-square-3) calc(38% * var(--mesh-a-mult)), var(--bg)) 0%, transparent 62% ), radial-gradient( calc(48% * var(--mesh-size-mult)) calc(56% * var(--mesh-size-mult)) at var(--mesh-b-x) var(--mesh-b-y), color-mix(in srgb, var(--accent-square-2) calc(32% * var(--mesh-b-mult)), var(--bg)) 0%, transparent 64% ), radial-gradient( calc(52% * var(--mesh-size-mult)) calc(60% * var(--mesh-size-mult)) at var(--mesh-c-x) var(--mesh-c-y), color-mix(in srgb, var(--accent-square-4) calc(26% * var(--mesh-c-mult)), var(--bg)) 0%, transparent 68% ); --text: hsl(var(--theme-h), 8%, 14%); --text-muted: color-mix(in hsl, hsl(var(--theme-h), 7%, 40%), var(--accent) 7%); --line: color-mix(in hsl, hsla(var(--theme-h), 10%, 38%, 0.16), var(--accent) 6%); --accent-hover: color-mix(in hsl, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)), black 14%); --accent-soft: color-mix(in hsl, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)), transparent 88%); --shadow-strong: 0 20px 48px hsla(var(--theme-h), 20%, 20%, 0.08); /* Зона решений: светлее чем --bg-elevated (~#efeff0), ближе к странице/белому */ --skill-solutions-bg: color-mix(in srgb, var(--surface) 82%, var(--bg) 18%); --skill-solutions-top-border: color-mix(in srgb, var(--line), var(--text) 7%); --skill-solution-separator: color-mix(in srgb, var(--line), var(--text) 11%); --img-ph-shine-peak: color-mix(in srgb, var(--text) 15%, var(--surface) 85%); --btn-primary-border: color-mix(in srgb, var(--accent) 48%, hsl(0 0% 0% / 0.16)); --btn-primary-bg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 10%) 0%, var(--accent) 100% ); --btn-primary-hover-bg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 14%) 0%, var(--accent) 100% ); --btn-primary-shadow-flat: none; --btn-primary-shadow-raised: 0 14px 28px color-mix(in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 24%, hsla(0, 0%, 0%, 0.18)), inset 0 1px 0 color-mix(in srgb, var(--accent) 40%, hsl(0 0% 100%) 60%), inset 0 -1px 0 color-mix(in srgb, var(--accent) 35%, hsl(0 0% 0%) 65%); --btn-primary-shadow-hover: 0 16px 34px color-mix(in srgb, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)) 28%, hsla(0, 0%, 0%, 0.2)), inset 0 1px 0 color-mix(in srgb, var(--accent) 35%, hsl(0 0% 100%) 65%), inset 0 -1px 0 color-mix(in srgb, var(--accent) 32%, hsl(0 0% 0%) 68%); --btn-primary-backdrop: blur(10px) saturate(142%); --btn-primary-backdrop-hover: blur(11px) saturate(148%); /* Liquid Glass (Хабр): искажение + лёгкое матирование — только Chromium */ --btn-primary-backdrop-lg: url(#liquid-glass-displacement-btn) blur(2px); --btn-primary-backdrop-hover-lg: url(#liquid-glass-displacement-btn) blur(2px); /* Полупрозрачный акцентный фон, чтобы displacement был виден (Liquid Glass) */ --btn-primary-bg-lg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 10%) 0%, color-mix(in srgb, var(--accent) 82%, transparent) 100% ); --btn-primary-hover-bg-lg: radial-gradient( circle at 0% 0%, color-mix(in hsl, var(--accent), white 14%) 0%, color-mix(in srgb, var(--accent) 86%, transparent) 100% ); --btn-primary-sheen: linear-gradient( 155deg, color-mix(in srgb, var(--accent) 55%, hsl(0 0% 100%) 45%) 0%, transparent 52%, color-mix(in srgb, var(--accent) 70%, hsl(0 0% 0%) 30%) 100% ); } /* Фон и цвет на корне: без этого просвечивает белый фон документа и «хвосты» светлой темы */ html[data-theme="dark"], html[data-theme="light"] { min-height: 100%; background-color: var(--bg); color: var(--text); } *, *::before, *::after { box-sizing: border-box; } html { scroll-behavior: smooth; /* запас под sticky header; точнее задаётся --header-offset из JS */ scroll-padding-top: var(--header-offset, 4.25rem); } body { margin: 0; min-height: 100dvh; font-family: var(--font); font-size: 1rem; line-height: 1.55; color: var(--text); background-color: transparent; position: relative; -webkit-font-smoothing: antialiased; } .page-mesh-bg { position: fixed; inset: 0; z-index: -1; pointer-events: none; overflow: hidden; opacity: var(--mesh-opacity-current, 1); } .page-mesh-bg canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; opacity: 0; /* старт для fade-in живого шэйдера */ transition: opacity 0.9s ease; } /* Шэйдер отрисовал первый кадр — плавно проявляем его поверх статичного фона */ .page-mesh-bg.is-ready canvas { opacity: 0.4; /* приглушаем яркость живого шэйдера */ } /* Вертикальный градиент-оверлэй: снизу фон закрыт цветом страницы (--bg, 100% непрозрачности), кверху растворяется — фон становится виден на 100%. --bg берётся из темы, поэтому на светлой теме верх светлый, на тёмной — тёмный. */ .page-mesh-bg::after { content: ""; position: absolute; inset: 0; background: linear-gradient( to top, var(--bg) 0%, color-mix(in srgb, var(--bg) 65%, transparent) 35%, transparent 70% ); } html[data-mesh-bg="off"] .page-mesh-bg { visibility: hidden; } .mesh-panel { position: fixed; left: max(0.75rem, env(safe-area-inset-left, 0px)); bottom: max(0.75rem, env(safe-area-inset-bottom, 0px)); z-index: 120; width: min(230px, calc(100vw - 1.5rem)); padding: 0.65rem 0.7rem; border-radius: var(--radius-md); border: 1px solid var(--line); } .mesh-panel__title { margin: 0 0 0.5rem; font-size: 0.72rem; line-height: 1.2; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); } .mesh-panel__row { display: grid; grid-template-columns: 5.2rem minmax(0, 1fr) 2.3rem; align-items: center; gap: 0.45rem; } .mesh-panel__row + .mesh-panel__row { margin-top: 0.35rem; } .mesh-panel__row--toggle { grid-template-columns: 5.2rem auto; } .mesh-panel__label { font-size: 0.72rem; line-height: 1.25; color: var(--text-muted); } .mesh-panel__value { font-size: 0.68rem; line-height: 1; color: var(--text-muted); text-align: right; font-variant-numeric: tabular-nums; } .mesh-panel input[type="checkbox"] { width: 1rem; height: 1rem; margin: 0; accent-color: var(--accent-text); } .mesh-panel input[type="range"] { width: 100%; margin: 0; accent-color: var(--accent-text); } #main { color: var(--text); background-color: transparent; margin-top: 0; } img { max-width: 100%; height: auto; display: block; } /* Заглушка: ::before — статичный фон, ::after — один бегущий блеск */ .has-img-loading { position: relative; overflow: hidden; background-color: transparent; } .has-img-loading::before { content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none; background-color: color-mix(in srgb, var(--text-muted) 11%, var(--surface)); } /* У обёрток со своим фоном — не дублируем серый слой */ .mp-card__media.has-img-loading::before, .case-media-gallery__item.has-img-loading::before { content: none; } .has-img-loading::after { content: ""; position: absolute; top: 0; left: 0; width: 260%; height: 100%; z-index: 1; pointer-events: none; /* Узкая полоса блеска; слой шире тайла — без обрезки краёв градиента */ background-image: linear-gradient( 105deg, transparent 0%, transparent 40%, var(--img-ph-shine-peak) 50%, transparent 60%, transparent 100% ); background-repeat: no-repeat; background-size: 100% 100%; background-position: 50% 50%; transform: translateX(-100%); animation: img-ph-shine-sweep 3.4s linear infinite; } .has-img-loading img.is-img-loading { opacity: 0; } .has-img-loading img:not(.is-img-loading) { opacity: 1; transition: opacity 0.28s ease; } @keyframes img-ph-shine-sweep { 0% { transform: translateX(-100%); } 100% { transform: translateX(38.5%); } } @media (prefers-reduced-motion: reduce) { .has-img-loading::after { content: none; } } .img-ph-demo { max-width: 18rem; aspect-ratio: 16 / 9; margin: 0.85rem 0 1.2rem; } a { color: var(--accent-text); text-decoration-thickness: 1px; text-underline-offset: 0.2em; } a:hover { color: var(--accent-hover); } /* Только «текстовые» ссылки: .btn / .fab / .logo задают цвет сами, иначе :visited перебивает --on-accent */ a:visited:not(.btn):not(.fab):not(.logo):not(.skip-link) { color: color-mix(in hsl, var(--accent) 40%, var(--text) 60%); } a:visited:not(.btn):not(.fab):not(.logo):not(.skip-link):hover { color: color-mix(in hsl, var(--accent-hover) 50%, var(--text) 50%); } ::selection { background: var(--accent-soft); color: var(--text); } .skip-link { position: absolute; left: -9999px; top: auto; width: 1px; height: 1px; overflow: hidden; } .skip-link:focus { position: fixed; left: var(--space); top: var(--space); z-index: 100; width: auto; height: auto; padding: 0.75rem 1rem; background: var(--accent); color: var(--on-accent); font-weight: 600; border-radius: var(--radius-md); } .header { position: relative; top: 0; z-index: 50; height: 0; background: transparent; transition: background 0.25s ease; } /* Обычный (не плавающий) header спрятан — виден только при скролле (.header--scrolled) */ .header:not(.header--scrolled) .header__inner { display: none; } .header--scrolled { background: transparent; height: 0; overflow: visible; } .header__inner { max-width: var(--max); width: 100%; margin: 0 auto; padding: 0.8rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: nowrap; } .header--scrolled .header__inner { position: fixed; top: var(--edge-pad); left: auto; right: var(--edge-pad); width: fit-content; max-width: min( 980px, calc( 100% - max(var(--space), env(safe-area-inset-left, 0px)) - max(var(--space), env(safe-area-inset-right, 0px)) ) ); margin-left: 0; margin-right: 0; margin-top: 0; margin-bottom: 0; padding: 0.8rem; border: 1px solid var(--line); border-radius: calc(var(--radius-card) * 0.7); background: var(--bg-elevated); box-shadow: 0 16px 38px hsla(0, 0%, 0%, 0.2); animation: header-float-in 0.24s cubic-bezier(0.22, 0.8, 0.24, 1); justify-content: flex-start; gap: 0.75rem; } @keyframes header-float-in { from { transform: translateY(-118%); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .header--scrolled .logo { width: 2.15rem; height: 2.15rem; font-size: 0.75rem; } .header--scrolled .nav { font-size: 0.84rem; gap: 0.45rem 0.72rem; } .header--scrolled .nav-more__btn { width: 32px; height: 32px; } .header--scrolled .header__cluster { flex: 0 1 auto; margin-left: 0; } /* Переключатель языка в футере: лаконичная текстовая группа RU / EN */ .lang-switch { display: inline-flex; align-items: center; gap: 0.45rem; font-size: inherit; line-height: 1; } .lang-switch__btn { appearance: none; margin: 0; padding: 0; border: 0; background: none; font: inherit; font-weight: 400; letter-spacing: 0.04em; color: var(--accent); text-decoration: none; cursor: pointer; transition: color 0.15s ease; } .lang-switch__btn:hover, .lang-switch__btn:focus-visible { color: var(--text); } .lang-switch__btn[aria-current="true"] { color: var(--accent); } /* разделитель между языками */ .lang-switch__btn:not(:last-child)::after { content: "/"; margin-left: 0.45rem; color: var(--border); font-weight: 400; } .header__cluster { display: flex; flex-wrap: nowrap; align-items: center; justify-content: flex-end; gap: 0.5rem; margin-left: auto; flex: 1 1 auto; min-width: 0; /* overflow не hidden: иначе обрезается .nav-more__menu (position:absolute снизу) */ overflow: visible; } .logo { display: grid; flex-shrink: 0; place-items: center; width: 2.5rem; height: 2.5rem; border-radius: var(--radius-sm); background: var(--accent-soft); color: var(--accent-text); font-weight: 700; font-size: 0.85rem; letter-spacing: 0.02em; text-decoration: none; } .logo:hover { color: var(--accent-hover); } .logo:visited { color: var(--accent-text); } .nav { display: flex; flex-wrap: nowrap; justify-content: flex-end; gap: 0.65rem 0.95rem; font-size: 1.2rem; flex: 1 1 auto; min-width: 0; overflow: hidden; } .nav a { color: var(--text-muted); text-decoration: none; font-weight: 400; letter-spacing: 0.02em; white-space: nowrap; } .nav a:visited { color: var(--text-muted); } .nav a:hover { color: var(--text); } /* --- Overflow навигации + панель темы --- */ .nav-more { position: relative; flex-shrink: 0; } .nav-more__btn { display: grid; place-items: center; width: 36px; height: 36px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface); color: var(--text-muted); cursor: pointer; } .nav-more__btn:hover { color: var(--text); background: var(--accent-soft); } .nav-more__btn svg { width: var(--icon-nav-overflow); height: var(--icon-nav-overflow); display: block; flex-shrink: 0; } .nav-more__btn[aria-expanded="true"] { color: var(--accent-text); } /* Два отдельных контейнера: док (шапка) и плавающий (body). Общая сетка ссылок — без общего класса «menu». */ .nav-more__dock, .nav-more__floating { min-width: 12rem; padding: 0.35rem; border-radius: var(--radius-md); border: 1px solid var(--line); box-shadow: var(--shadow-strong); } .nav-more__dock { position: absolute; top: calc(100% + 6px); right: 0; z-index: 90; background: var(--bg-elevated); border-color: var(--v12-glass-neutral-border); } /* Плавающая панель: fixed + координаты из JS; фон — токены v12-glass внизу файла */ #nav-more-menu-floating.nav-more__floating { position: fixed; top: var(--nav-more-menu-top, 0px); left: var(--nav-more-menu-left, 0px); right: auto; z-index: 140; margin: 0; } .nav-more__dock a, .nav-more__floating a { display: block; padding: 0.5rem 0.6rem; border-radius: var(--radius-sm); color: var(--text-muted); text-decoration: none; font-weight: 400; } .nav-more__dock a:hover, .nav-more__floating a:hover { color: var(--text); background: var(--accent-soft); } .fab[data-theme-panel-btn] { display: grid; place-items: center; } .theme-panel-fab__icon { grid-area: 1 / 1; line-height: 1; color: inherit; pointer-events: none; } .theme-panel-fab__icon--close { display: block; width: var(--icon-fab); height: var(--icon-fab); } .theme-panel-fab__icon--open-hide { display: block; flex-shrink: 0; width: var(--icon-fab); height: var(--icon-fab); background: currentColor; mask-image: url("../assets/shared/icons/design_edit.svg"); -webkit-mask-image: url("../assets/shared/icons/design_edit.svg"); mask-size: contain; mask-repeat: no-repeat; mask-position: center; -webkit-mask-size: contain; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; } .theme-mode-seg .theme-mode-seg__ico { display: block; width: var(--icon-fab); height: var(--icon-fab); background: currentColor; mask-size: contain; mask-repeat: no-repeat; mask-position: center; -webkit-mask-size: contain; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; } .theme-mode-seg__ico--system { mask-image: url("../assets/shared/icons/system.svg"); -webkit-mask-image: url("../assets/shared/icons/system.svg"); } .theme-mode-seg__ico--light { mask-image: url("../assets/shared/icons/sun.svg"); -webkit-mask-image: url("../assets/shared/icons/sun.svg"); } .theme-mode-seg__ico--dark { mask-image: url("../assets/shared/icons/moon.svg"); -webkit-mask-image: url("../assets/shared/icons/moon.svg"); } .fab-primary__ico { display: block; width: var(--icon-fab); height: var(--icon-fab); background: currentColor; mask-image: url("../assets/shared/icons/chat_start.svg"); -webkit-mask-image: url("../assets/shared/icons/chat_start.svg"); mask-size: contain; mask-repeat: no-repeat; mask-position: center; -webkit-mask-size: contain; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; } [data-theme-panel-btn][aria-expanded="true"] .theme-panel-fab__icon--open-hide { display: none; } [data-theme-panel-btn][aria-expanded="false"] .theme-panel-fab__icon--close { display: none; } /* Панель темы привязана к FAB настроек: абсолют внутри .theme-panel-fab-wrap */ .theme-panel-fab-wrap { position: relative; display: flex; flex-direction: column; align-items: flex-end; } .theme-picker__panel { position: absolute; right: 0; bottom: calc(100% + 0.5rem); width: min(calc(320px + 2.2rem), calc(100vw - 2 * var(--space))); max-height: min(85vh, calc(100dvh - 5rem)); overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 1rem 1.1rem; border-radius: var(--radius-md); border: 1px solid var(--line); background: var(--bg-elevated); box-shadow: var(--shadow-strong); z-index: 1; } .theme-picker__panel[hidden] { display: none !important; } .fab-stack { position: fixed; right: var(--edge-pad); bottom: var(--edge-pad); display: flex; flex-direction: column; align-items: flex-end; gap: 0.6rem; z-index: 92; } .fab { display: inline-flex; align-items: center; justify-content: center; min-width: 3rem; min-height: 3rem; padding: 0.7rem 1rem; border-radius: 999px; border: 1px solid var(--line); text-decoration: none; color: var(--text); background: var(--surface); box-shadow: var(--shadow-strong); cursor: pointer; transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease; } .fab--primary { position: relative; isolation: isolate; overflow: hidden; width: 3rem; min-width: 3rem; min-height: 3rem; padding: 0; border: 1px solid var(--btn-primary-border); background: var(--btn-primary-bg); backdrop-filter: var(--btn-primary-backdrop); -webkit-backdrop-filter: var(--btn-primary-backdrop); box-shadow: var(--btn-primary-shadow-raised); color: var(--on-accent); font-weight: 600; transition: background 0.2s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.2s ease, backdrop-filter 0.2s ease; } .fab--primary::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: 0; background: var(--btn-primary-sheen); } html[data-theme="light"] .fab--primary::after { opacity: 0.42; } .fab--primary::before { content: ""; position: absolute; inset: 0; border-radius: inherit; background: radial-gradient( circle 3rem at var(--btn-shine-x, 50%) var(--btn-shine-y, 50%), color-mix(in hsl, hsl(var(--theme-h) calc(var(--theme-s) * 1%) calc(var(--theme-l) * 1%)), white 52%) 0%, transparent 55% ); opacity: 0; transition: opacity 0.2s ease; pointer-events: none; z-index: 2; mix-blend-mode: soft-light; } .fab--primary:hover::before { opacity: 0.58; } a.fab--primary:visited { color: var(--on-accent); background: var(--btn-primary-bg); } .fab--primary > * { position: relative; z-index: 3; } .fab--primary:hover { color: var(--on-accent); border-color: var(--btn-primary-border); background: var(--btn-primary-hover-bg); backdrop-filter: var(--btn-primary-backdrop-hover); -webkit-backdrop-filter: var(--btn-primary-backdrop-hover); box-shadow: var(--btn-primary-shadow-hover); } .fab--primary:focus-visible { color: var(--on-accent); border-color: var(--btn-primary-border); background: var(--btn-primary-hover-bg); backdrop-filter: var(--btn-primary-backdrop-hover); -webkit-backdrop-filter: var(--btn-primary-backdrop-hover); box-shadow: var(--btn-primary-shadow-hover); outline: 2px solid color-mix(in hsl, var(--accent) 65%, var(--text)); outline-offset: 2px; } .fab--secondary { width: 3rem; padding: 0; color: var(--text-muted); } a.fab--secondary:visited { color: var(--text-muted); } .fab--secondary:hover { color: var(--accent-text); background: var(--bg-elevated); border-color: color-mix(in hsl, var(--accent) 38%, var(--line)); box-shadow: var(--shadow-strong); } .fab--secondary:focus-visible { color: var(--accent-text); background: var(--bg-elevated); border-color: color-mix(in hsl, var(--accent) 45%, var(--line)); outline: 2px solid color-mix(in hsl, var(--accent) 50%, var(--line)); outline-offset: 2px; } /* ── PDF download FAB ── */ .fab-primary__ico--pdf { mask-image: url("../assets/shared/icons/cv.svg"); -webkit-mask-image: url("../assets/shared/icons/cv.svg"); } /* ── Print FAB ── */ .fab-secondary__ico--print { display: block; width: var(--icon-fab); height: var(--icon-fab); background: currentColor; mask-image: url("../assets/shared/icons/printer.svg"); -webkit-mask-image: url("../assets/shared/icons/printer.svg"); mask-size: contain; mask-repeat: no-repeat; mask-position: center; -webkit-mask-size: contain; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; } .fab--label { width: auto; padding: 0.65rem 1.1rem; gap: 0.5rem; } .fab__label { font-size: 0.85rem; font-weight: 600; line-height: 1; white-space: nowrap; } .theme-picker__stack { display: flex; flex-direction: column; gap: 1.1rem; } .theme-picker__section { display: flex; flex-direction: column; gap: 0.5rem; } .theme-picker__section-title { margin: 0; font-size: 0.68rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-muted); } /* Segmented: слабое / среднее / сильное скругление */ .radius-seg { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.4rem; padding: 0; border: none; background: transparent; } .radius-seg--two { grid-template-columns: repeat(2, 1fr); } .radius-seg__btn { display: flex; flex-direction: column; align-items: center; justify-content: center; min-width: 0; padding: 0.5rem 0.25rem; border: 1px solid var(--line); border-radius: var(--radius-sm); background: transparent; color: var(--text-muted); cursor: pointer; font-family: inherit; transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease; } .radius-seg__btn:hover { color: var(--text); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); } .radius-seg__btn[aria-checked="true"] { background: var(--accent-soft); color: var(--accent-text); border-color: color-mix(in srgb, var(--accent) 55%, var(--line)); box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent); } .theme-font-seg__btn { min-height: 44px; padding: 0.5rem 0.25rem; } .theme-font-seg__label { display: block; font-size: 0.78rem; line-height: 1.15; letter-spacing: 0.01em; } .theme-font-seg__btn[data-font-option="merriweather"] .theme-font-seg__label { font-family: "Merriweather", serif; } .theme-font-seg__btn[data-font-option="mono"] .theme-font-seg__label { font-family: "Source Code Pro", monospace; } .theme-font-seg__btn[data-font-option="geologica"] .theme-font-seg__label { font-family: "Geologica", sans-serif; } .theme-mesh-bg-seg__btn { min-height: 44px; padding: 0.5rem 0.35rem; } .theme-mesh-bg-seg__label { display: block; font-size: 0.78rem; line-height: 1.15; font-weight: 600; letter-spacing: 0.01em; } .radius-seg__viz { display: grid; place-items: center; flex-shrink: 0; width: 44px; height: 44px; } .radius-seg__arc { display: block; width: 28px; height: 28px; box-sizing: border-box; border-left: 2px solid currentColor; border-top: 2px solid currentColor; opacity: 0.88; } .radius-seg__arc--soft { border-top-left-radius: 4px; } .radius-seg__arc--medium { border-top-left-radius: 14px; } .radius-seg__arc--strong { border-top-left-radius: 26px; } /* Colorpicker: S/L 16:9 + горизонтальный оттенок, общая ширина блоков */ .colorpicker { display: flex; flex-direction: column; gap: 0.75rem; width: min(100%, 320px); margin-inline: auto; } .colorpicker__plane-box { position: relative; width: 100%; aspect-ratio: 16 / 9; border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--line); touch-action: none; } .colorpicker__plane { display: block; width: 100%; height: 100%; cursor: crosshair; vertical-align: middle; } .colorpicker__knob { position: absolute; width: 20px; height: 20px; margin: -10px 0 0 -10px; border: 1px solid hsla(0, 0%, 0%, 0.32); border-radius: 50%; background: #fff; box-shadow: inset 0 0 0 1px hsla(0, 0%, 100%, 0.45); pointer-events: none; } .colorpicker__hue-sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); clip-path: inset(50%); white-space: nowrap; border: 0; } .colorpicker__hue-wrap { position: relative; width: 100%; box-sizing: border-box; padding: 0; line-height: 0; } .colorpicker__hue { -webkit-appearance: none; appearance: none; display: block; width: 100%; /* Высота ≈ thumb (20px), без лишней «полки» под трек */ height: 22px; margin: 0; padding: 0; cursor: pointer; background: transparent; touch-action: manipulation; -webkit-tap-highlight-color: transparent; } .colorpicker__hue::-webkit-slider-runnable-track { height: 14px; border-radius: 7px; border: 1px solid var(--line); background: linear-gradient( to right, hsl(0 100% 50%), hsl(60 100% 45%), hsl(120 100% 40%), hsl(180 100% 40%), hsl(240 100% 52%), hsl(300 100% 50%), hsl(360 100% 50%) ); } .colorpicker__hue::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; margin-top: -4px; border-radius: 50%; border: 1px solid hsla(0, 0%, 0%, 0.32); background: #fff; box-shadow: inset 0 0 0 1px hsla(0, 0%, 100%, 0.45); } .colorpicker__hue::-moz-range-track { height: 14px; border-radius: 7px; border: 1px solid var(--line); background: linear-gradient( to right, hsl(0 100% 50%), hsl(60 100% 45%), hsl(120 100% 40%), hsl(180 100% 40%), hsl(240 100% 52%), hsl(300 100% 50%), hsl(360 100% 50%) ); } .colorpicker__hue::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; border: 1px solid hsla(0, 0%, 0%, 0.32); background: #fff; box-shadow: inset 0 0 0 1px hsla(0, 0%, 100%, 0.45); } .hero { padding: calc(2 * clamp(2.5rem, 6vw, 4.5rem)) calc(2 * max(var(--space), env(safe-area-inset-right, 0px))) calc(2 * clamp(2rem, 5vw, 3.5rem)) calc(2 * max(var(--space), env(safe-area-inset-left, 0px))); } /* Hero проявляется только после готовности фона-шэйдера (html.mesh-bg-ready), чтобы текст не вскакивал раньше, чем подгрузится живой фон. */ .hero { opacity: 0; transform: translateY(14px); transition: opacity 0.8s ease 0.2s, transform 0.8s ease 0.2s; } html.mesh-bg-ready .hero { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { .hero { opacity: 1; transform: none; transition: none; } } .hero__grid { max-width: var(--max); margin: 0 auto; display: grid; grid-template-columns: 1fr; gap: clamp(2rem, 5vw, 3rem); align-items: center; } @media (min-width: 860px) { .hero__grid { grid-template-columns: 1.15fr 0.85fr; } } .hero__eyebrow { margin: 0 0 0.6rem; font-size: 0.78rem; font-weight: 700; color: color-mix(in srgb, var(--text) 65%, transparent); letter-spacing: 0.14em; text-transform: uppercase; } .hero__title { margin: 0 0 1rem; font-family: var(--font-accent); font-size: clamp(3.1rem, 7.2vw, 4.85rem); font-weight: 700; line-height: 1.2; letter-spacing: -0.02em; color: var(--text); } html[data-font="geologica"] .hero__title { line-height: 1; } html[data-font="mono"] .hero__title { line-height: 1; } .hero-rotator { position: relative; display: inline-flex; align-items: baseline; vertical-align: baseline; min-width: 8.5ch; min-height: 0.92em; } .hero-rotator__word { display: inline-block; min-width: 100%; white-space: pre; color: var(--accent-text); letter-spacing: var(--hero-slot-spacing, 0); transition: letter-spacing 0.26s ease; } .hero-rotator__char { display: inline-block; transition: color 0.12s linear; } /* Превью кейса: pages/cases/*.html (без полной оболочки главной) */ .case-page__h1 { margin: 0 0 0.5rem; font-family: var(--font-accent); font-size: clamp(2rem, 3.9vw, 2.9rem); font-weight: 700; line-height: 1.2; color: var(--text); text-transform: none; letter-spacing: -0.02em; } .case-article h2:not(.section__title), .case-article h3:not(.section__title):not(.mp-card__title) { font-family: var(--font-accent); } .case-article h3:not(.section__title):not(.mp-card__title) { margin: 3.25rem 0 1.5rem; } .case-article h2 + h3:not(.section__title):not(.mp-card__title) { margin-top: 2.25rem; } .case-article h3 + h3:not(.section__title):not(.mp-card__title) { margin-top: 3.5rem; } .case-article figure + h3:not(.section__title):not(.mp-card__title) { margin-top: 4rem; } .case-page__sub { margin: 0 0 1.25rem; font-size: clamp(1.5rem, 2vw, 1.65rem); color: var(--text-muted); font-weight: 500; } .case-page__code { font-size: 0.88rem; word-break: break-all; } /* Inline-код в лонгридах кейса (`metric_name` и т.п.) */ .case-article code { font-family: ui-monospace, "Cascadia Code", "Consolas", "Courier New", monospace; font-size: 0.86em; font-weight: 400; padding: 0.1em 0.4em; border-radius: 6px; vertical-align: 0.04em; color: var(--accent-text); background: color-mix(in srgb, var(--bg) 42%, var(--surface) 58%); border: 1px solid color-mix(in srgb, var(--line) 65%, transparent); box-decoration-break: clone; -webkit-box-decoration-break: clone; word-break: break-word; } .case-article pre { max-width: 100%; overflow: auto; padding: 0.9rem 1rem; border-radius: var(--radius-sm); background: color-mix(in srgb, var(--bg) 32%, var(--surface) 68%); border: 1px solid var(--line); } .case-article pre code { padding: 0; border: none; background: none; font-size: inherit; font-weight: inherit; vertical-align: baseline; word-break: normal; white-space: pre; color: inherit; } /* Внутренние страницы: быстрый флаг скрытия хедера (легко вернуть, убрав класс). */ body.case-page--hide-header .header { display: none; } .case-links-grid { display: grid; gap: 0.75rem; margin: 0.85rem 0 1.15rem; } .case-link-card { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 1rem; align-items: center; padding: 1rem 1.1rem; border-radius: var(--radius-md); border: 1px solid var(--line); background: color-mix(in srgb, var(--surface) 82%, transparent); text-decoration: none; color: inherit; transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease; } .case-link-card:hover, .case-link-card:focus-visible { border-color: var(--accent); box-shadow: 0 8px 24px color-mix(in srgb, var(--accent) 18%, transparent); transform: translateY(-1px); } .case-link-card:focus-visible { outline: 2px solid color-mix(in srgb, var(--accent) 44%, transparent); outline-offset: 2px; } .case-link-card__media { display: block; width: 96px; height: 72px; border-radius: calc(var(--radius-md) - 4px); overflow: hidden; border: 1px solid var(--line); background: color-mix(in srgb, var(--surface-soft) 70%, transparent); } .case-link-card__media img { display: block; width: 100%; height: 100%; margin: 0; object-fit: cover; } .case-link-card__body { min-width: 0; display: grid; gap: 0.2rem; } .case-link-card__title { font-weight: 700; font-size: 0.98rem; line-height: 1.2; color: var(--text); } .case-link-card__meta { font-size: 0.88rem; line-height: 1.35; color: var(--text-muted); } .case-link-card__url { font-size: 0.78rem; line-height: 1.2; color: color-mix(in srgb, var(--accent) 72%, var(--text)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .case-link-card--favicon { grid-template-columns: 24px minmax(0, 1fr); align-items: center; } .case-link-card--favicon .case-link-card__media { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; min-width: 24px; min-height: 24px; border-radius: 6px; padding: 0; background: color-mix(in srgb, var(--surface) 64%, var(--accent) 7%); overflow: hidden; flex-shrink: 0; line-height: 0; box-sizing: border-box; } .case-link-card--favicon .case-link-card__media img { display: block; width: 100%; height: 100%; max-width: none; max-height: none; margin: 0; object-fit: contain; object-position: center; } /* Картинки в кейсах: 3 ширины + fullscreen viewer */ .case-media { margin: 0.85rem 0 1.2rem; } .case-media img { display: block; height: auto; } .case-media .plyr { border-radius: 0; overflow: hidden; --plyr-color-main: var(--accent); --plyr-video-range-track-background: color-mix(in srgb, var(--text-muted) 36%, var(--surface)); --plyr-control-spacing: 0.75rem; --plyr-control-icon-size: 14px; --plyr-video-control-color: var(--text-muted); --plyr-video-control-color-hover: var(--accent); --plyr-control-radius: 999px; --plyr-menu-color: var(--text); --plyr-menu-background: color-mix(in srgb, var(--surface) 92%, var(--bg) 8%); --plyr-tooltip-background: color-mix(in srgb, var(--surface) 92%, var(--bg) 8%); --plyr-tooltip-color: var(--text); --plyr-video-controls-background: linear-gradient( to top, color-mix(in srgb, var(--bg) 72%, transparent) 0%, color-mix(in srgb, var(--bg) 40%, transparent) 42%, transparent 100% ); } .case-media .plyr--video .plyr__controls { margin: 0; padding: 0; min-height: 3rem; width: 100%; border-radius: 0; border: 0; border-top: 1px solid color-mix(in srgb, var(--line) 92%, transparent); background: color-mix(in srgb, var(--surface) 84%, var(--bg) 16%); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); align-items: center; } .case-media .plyr--video .plyr__controls .plyr__control { height: calc(3rem - 2px); min-height: calc(3rem - 2px); width: calc(3rem - 2px); min-width: calc(3rem - 2px); border-radius: 0; padding: 0; display: inline-flex; align-items: center; justify-content: center; } /* Hover на кнопках панели плеера: только иконка в акцент, фон не меняем */ .case-media .plyr--video .plyr__controls .plyr__control:hover { background: color-mix(in srgb, var(--surface) 84%, var(--bg) 16%); color: var(--accent); } .case-media .plyr--video .plyr__controls .plyr__control svg { fill: currentColor; } /* Кнопка Play по центру: normal как у кнопок панели, hover — только иконка в акцент */ .case-media .plyr--video .plyr__control--overlaid { background: color-mix(in srgb, var(--surface) 84%, var(--bg) 16%); color: var(--text-muted); border: none; } .case-media .plyr--video .plyr__control--overlaid:hover { background: color-mix(in srgb, var(--surface) 84%, var(--bg) 16%); color: var(--accent); } .case-media .plyr--video .plyr__controls .plyr__progress__container { height: auto; display: flex; align-items: center; min-width: 0; flex: 1 1 auto; } .case-media .plyr--video .plyr__controls .plyr__progress { flex: 1 1 auto; min-width: 0; } .case-media .plyr--video .plyr__controls .plyr__progress input[type="range"] { width: 100%; min-width: 0; } .case-media .case-video-shell { border-radius: var(--radius-md); overflow: hidden; box-sizing: border-box; border: 1px solid var(--line); box-shadow: none; transition: border-color 0.2s ease, box-shadow 0.2s ease; } .case-media .case-video-shell:hover, .case-media .case-video-shell:focus-within { border-color: var(--accent); box-shadow: 0 8px 24px color-mix(in srgb, var(--accent) 18%, transparent); } .case-media .case-plyr video, .case-media .plyr video { width: 100% !important; height: auto !important; max-height: none; object-fit: contain; object-position: center; border-radius: 0 !important; } /* Fullscreen (API и fallback Plyr): кадр целиком, без cover по ширине */ .plyr--fullscreen-active, .plyr--fullscreen-fallback, .plyr:fullscreen, .plyr:-webkit-full-screen { background: #000; display: flex; flex-direction: column; align-items: center; justify-content: center; } .plyr--fullscreen-active .plyr__video-wrapper, .plyr--fullscreen-fallback .plyr__video-wrapper, .plyr:fullscreen .plyr__video-wrapper, .plyr:-webkit-full-screen .plyr__video-wrapper { display: flex; align-items: center; justify-content: center; flex: 1 1 auto; width: 100%; height: 100%; max-height: none; } .case-plyr.case-plyr--fullscreen video, .case-plyr--fullscreen-fallback video, .case-plyr.plyr--fullscreen-fallback video, .plyr--fullscreen-active video, .plyr--fullscreen-active .plyr__video-wrapper video, .plyr--fullscreen-fallback video, .plyr--fullscreen-fallback .plyr__video-wrapper video, .plyr:fullscreen video, .plyr:-webkit-full-screen video, video:fullscreen, video:-webkit-full-screen { width: auto !important; height: auto !important; max-width: 100% !important; max-height: 100% !important; object-fit: contain !important; object-position: center; margin: auto; } .case-media .plyr__video-wrapper, .case-media .plyr__poster, .case-media .plyr__video-embed { border-radius: 0 !important; border: 0 !important; box-shadow: none !important; } .case-media .plyr__control { color: var(--text-muted); } .case-media .plyr__control:hover, .case-media .plyr__control:focus-visible { color: var(--accent-text); background: var(--bg-elevated); border-color: color-mix(in hsl, var(--accent) 38%, var(--line)); } .case-media .plyr__control--overlaid { background: color-mix(in srgb, var(--surface) 88%, var(--bg) 12%); border: 1px solid color-mix(in srgb, var(--line) 92%, transparent); color: var(--text-muted); } .case-media .plyr__control--overlaid:hover { background: var(--bg-elevated); color: var(--accent-text); border-color: color-mix(in hsl, var(--accent) 38%, var(--line)); } .case-media figcaption { margin-top: 0.3rem; font-size: 0.86rem; line-height: 1.35; color: var(--text-muted); } .case-media:has(.case-video-shell) { display: flex; flex-direction: column; align-items: center; gap: 0.35rem; } .case-media:has(.case-video-shell) > .case-video-shell { width: 100%; } .case-media:has(.case-video-shell) > figcaption { width: 100%; margin-top: 0; text-align: center; } .case-media--natural img { width: auto; max-width: 100%; margin-inline: auto; } .case-media--natural { display: flex; flex-direction: column; align-items: center; } .case-media--content img { width: 100%; max-width: 100%; } .case-media--wide { width: min(calc(100vw - (max(var(--space), env(safe-area-inset-left)) + max(var(--space), env(safe-area-inset-right)))), calc(100% + 8rem)); margin-left: 50%; transform: translateX(-50%); } .case-media--wide img { width: 100%; max-width: 100%; margin-inline: auto; } /* Длинный скрин: ширина по колонке (content) или «широкая» (wide), см. data-case-tall-width */ .case-media[data-case-tall-media][data-case-tall-width="wide"]:not(.case-media--wide) { width: min(calc(100vw - (max(var(--space), env(safe-area-inset-left)) + max(var(--space), env(safe-area-inset-right)))), calc(100% + 8rem)); margin-left: 50%; transform: translateX(-50%); } .case-media[data-case-tall-media][data-case-tall-width="wide"] .case-media-tall__clip > img, .case-media.case-media--wide[data-case-tall-media] .case-media-tall__clip > img { width: 100%; max-width: 100%; margin-inline: auto; } .case-media[data-case-tall-media][data-case-tall-width="wide"] .case-media-tall, .case-media.case-media--wide[data-case-tall-media] .case-media-tall { width: 100%; } /* Длинный скрин: обрезка по высоте, туман и кнопка внутри рамки превью */ .case-media-tall { position: relative; box-sizing: border-box; border: 0; background: none; } .case-media-tall__clip { position: relative; max-height: var(--case-tall-max, min(70vh, 32rem)); overflow: hidden; transition: max-height 0.38s ease; } .case-media-tall--expanded .case-media-tall__clip { max-height: none; overflow: visible; } .case-media-tall--reduced-motion .case-media-tall__clip { transition: none; } .case-media-tall__clip > img { width: 100%; max-width: 100%; height: auto; display: block; } .case-media-tall__fog { position: absolute; left: 0; right: 0; bottom: 0; z-index: 1; height: min(58%, 15rem); min-height: 5.5rem; pointer-events: none; visibility: visible; opacity: 1; background: linear-gradient( to top, color-mix(in srgb, var(--bg) 99.5%, transparent) 0%, color-mix(in srgb, var(--bg) 96%, transparent) 12%, color-mix(in srgb, var(--bg) 78%, transparent) 38%, color-mix(in srgb, var(--bg) 38%, transparent) 68%, transparent 100% ); transition: opacity 0.22s ease, visibility 0.22s ease; } .case-media-tall--expanded .case-media-tall__fog { opacity: 0; visibility: hidden; } .case-media-tall__actions { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; display: flex; justify-content: center; align-items: center; padding: 0.65rem 0.5rem 0.75rem; border: 0; background: none; pointer-events: none; } .case-media-tall__actions .case-media-tall__btn { pointer-events: auto; } .case-media-tall__btn.btn.btn--ghost { gap: 0.45rem; min-width: unset; padding: 0.45rem 0.65rem; color: var(--accent-text); border-color: transparent !important; background: transparent !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; box-shadow: none !important; } .case-media-tall__btn.btn.btn--ghost:hover, .case-media-tall__btn.btn.btn--ghost:focus-visible { color: var(--accent-hover); border-color: transparent !important; background: color-mix(in srgb, var(--accent) 10%, transparent) !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } .case-media-tall__btn-chev { display: block; width: 1rem; height: 1rem; flex-shrink: 0; background: currentColor; mask-image: url("../assets/shared/icons/shevron-down.svg"); -webkit-mask-image: url("../assets/shared/icons/shevron-down.svg"); mask-size: contain; mask-repeat: no-repeat; mask-position: center; -webkit-mask-size: contain; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; } .case-media-tall--expanded .case-media-tall__btn .case-media-tall__btn-chev { mask-image: url("../assets/shared/icons/shevron-up.svg"); -webkit-mask-image: url("../assets/shared/icons/shevron-up.svg"); } @media (prefers-reduced-motion: reduce) { .case-media-tall__clip { transition: none; } .case-media-tall__fog { transition: none; } } /* Галерея изображений сеткой: число колонок на широком экране — CSS-переменная --case-gallery-cols на figure */ .case-media-gallery { --case-gallery-cols: 3; } /* Wide-галерея: 4 колонки и выход за колонку контента (как у .case-media--wide) */ .case-media-gallery--wide { --case-gallery-cols: 4; width: min(calc(100vw - (max(var(--space), env(safe-area-inset-left)) + max(var(--space), env(safe-area-inset-right)))), calc(100% + 8rem)); margin-left: 50%; transform: translateX(-50%); } .case-media-gallery > figcaption { width: 100%; text-align: center; } .case-media-gallery__grid { display: grid; gap: 0.65rem; grid-template-columns: repeat(var(--case-gallery-cols), minmax(0, 1fr)); } @media (max-width: 48rem) { .case-media-gallery__grid { grid-template-columns: repeat(min(2, var(--case-gallery-cols)), minmax(0, 1fr)); } } @media (max-width: 28rem) { .case-media-gallery__grid { grid-template-columns: 1fr; } } .case-media-gallery__item { min-width: 0; border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--line); background: color-mix(in srgb, var(--surface) 60%, var(--bg) 40%); transition: border-color 0.2s ease, box-shadow 0.2s ease; } .case-media-gallery__item:has(> img[data-image-viewer]:not([data-src])):not(.has-img-loading) { padding: 0; border: none; background: none; overflow: visible; } /* Заглушка: клип по тайлу (viewer снимает overflow только после load) */ .case-media-gallery__item.has-img-loading { overflow: hidden; border: 1px solid var(--line); } .case-media-gallery__item img { width: 100%; height: auto; display: block; } .case-media-gallery--wide { width: min(calc(100vw - (max(var(--space), env(safe-area-inset-left)) + max(var(--space), env(safe-area-inset-right)))), calc(100% + 8rem)); margin-left: 50%; transform: translateX(-50%); } .case-callout { width: min(calc(100vw - (max(var(--space), env(safe-area-inset-left)) + max(var(--space), env(safe-area-inset-right)))), calc(100% + 8rem)); margin: 1.8rem 0 2.4rem; margin-left: 50%; padding: 0.95rem 1.1rem; display: grid; grid-template-columns: auto 1fr; align-items: start; gap: 0.72rem; border-radius: var(--radius-md); transform: translateX(-50%); background: color-mix(in srgb, var(--surface) 84%, var(--bg) 16%); } .case-callout__emoji { display: inline-grid; place-items: center; min-width: 1.65rem; min-height: 1.65rem; font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", emoji, sans-serif; font-size: clamp(1.05rem, 1.75vw, 1.3rem); line-height: 1; font-style: normal; font-variant-emoji: emoji; color: unset; -webkit-text-fill-color: unset; transform-origin: center; } .case-callout__emoji--pulse { animation: case-callout-emoji-pulse 0.6s ease-in-out infinite; } .case-callout__content { min-width: 0; font-size: clamp(1.05rem, 1.45vw, 1.125rem); line-height: 1.6; color: var(--text); } .case-callout__content > :first-child { margin-top: 0; } .case-callout__content > :last-child { margin-bottom: 0; } .case-callout:has(.case-callout__content > p:only-child), .case-callout:has(.case-callout__content > :only-child) { align-items: center; } @keyframes case-callout-emoji-pulse { 0%, 100% { transform: scale(1); filter: saturate(1); } 50% { transform: scale(1.12); filter: saturate(1.15); } } /* Кликабельные кадры (viewer): рамка на кадре, figcaption снаружи и по центру под картинкой */ .case-media:has(> img[data-image-viewer]:not([data-src])), .case-media:has(.case-media-tall__clip > img[data-image-viewer]:not([data-src])) { display: flex; flex-direction: column; align-items: center; gap: 0.35rem; } /* Перебивает margin у `.case-article img` в локальных