uchill/front_material/styles/globals.css

1722 lines
45 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Глобальные стили с оптимизацией производительности
* Используем CSS Variables для быстрого рендеринга
*/
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200');
/* CSS Variables для темизации (быстрее чем JS темы) */
:root {
/* Основные цвета из landing_site */
--theme: #7444FD;
--theme2: #F9F3EF;
--theme3: #FAF8FF;
--title: #282C32;
--text: #858585;
--text2: #cbcbcb;
--border: #E6E6E6;
--border-2: #F1F1F1;
--bg-1: #161921;
--bg-2: #F6F7FF;
--white: #fff;
--black: #000;
--orange: #e78c45;
/* Material Design 3 цвета */
--md-sys-color-primary: #7444FD;
--md-sys-color-on-primary: #FFFFFF;
--md-sys-color-primary-container: #FAF8FF;
--md-sys-color-on-primary-container: #282C32;
--md-sys-color-secondary: #7444FD;
--md-sys-color-on-secondary: #FFFFFF;
--md-sys-color-secondary-container: #F9F3EF;
--md-sys-color-on-secondary-container: #282C32;
--md-sys-color-surface: #FFFFFF;
--md-sys-color-on-surface: #282C32;
--md-sys-color-surface-variant: #F6F7FF;
--md-sys-color-on-surface-variant: #858585;
--md-sys-color-background: #F6F7FF;
--md-sys-color-on-background: #282C32;
--md-sys-color-error: #BA1A1A;
--md-sys-color-on-error: #FFFFFF;
--md-sys-color-tertiary: #4361EE;
--md-sys-color-on-tertiary: #FFFFFF;
--md-sys-color-outline: #E6E6E6;
--md-sys-color-outline-variant: #F1F1F1;
/* iOS 24+ стиль */
--ios-blur: blur(20px);
--ios-radius: 20px;
--ios-radius-sm: 16px;
--ios-radius-lg: 24px;
--ios-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
--ios-blur-bg: rgba(255, 255, 255, 0.8);
--ios-glass-bg: rgba(255, 255, 255, 0.74);
--ios-glass-border: rgba(255, 255, 255, 0.6);
--ios-glass-highlight: rgba(255, 255, 255, 0.55);
--ios-shadow-deep: 0 18px 50px rgba(116, 68, 253, 0.12), 0 6px 16px rgba(0, 0, 0, 0.08);
--ios-shadow-soft: 0 10px 30px rgba(116, 68, 253, 0.08), 0 2px 10px rgba(0, 0, 0, 0.05);
/* iOS 26+ стиль: более скруглённые углы, увеличенные отступы */
--ios26-radius-xs: 12px;
--ios26-radius-sm: 16px;
--ios26-radius: 20px;
--ios26-radius-md: 24px;
--ios26-radius-lg: 28px;
--ios26-radius-xl: 32px;
--ios26-spacing-xs: 8px;
--ios26-spacing-sm: 12px;
--ios26-spacing: 16px;
--ios26-spacing-md: 20px;
--ios26-spacing-lg: 24px;
--ios26-spacing-xl: 32px;
--ios26-glass: rgba(255, 255, 255, 0.72);
--ios26-glass-border: rgba(255, 255, 255, 0.5);
--ios26-blur: blur(24px) saturate(1.2);
--ios26-shadow: 0 2px 12px rgba(0, 0, 0, 0.06), 0 8px 24px rgba(0, 0, 0, 0.04);
--ios26-shadow-hover: 0 4px 16px rgba(0, 0, 0, 0.08), 0 12px 32px rgba(0, 0, 0, 0.06);
--ios26-segment-bg: rgba(0, 0, 0, 0.06);
--ios26-segment-active: #fff;
--ios26-segment-active-fg: var(--md-sys-color-on-surface);
--ios26-list-divider: rgba(0, 0, 0, 0.08);
}
/* Темная тема */
[data-theme="dark"] {
--md-sys-color-primary: #9D6AFF;
--md-sys-color-on-primary: #000000;
--md-sys-color-primary-container: #4A148C;
--md-sys-color-on-primary-container: #E1BEE7;
--md-sys-color-surface: #161921;
--md-sys-color-on-surface: #FFFFFF;
--md-sys-color-surface-variant: #282C32;
--md-sys-color-on-surface-variant: #cbcbcb;
--md-sys-color-background: #161921;
--md-sys-color-on-background: #FFFFFF;
--md-sys-color-tertiary: #7B8EF6;
--md-sys-color-on-tertiary: #FFFFFF;
--md-sys-color-outline: #565656;
--md-sys-color-outline-variant: #282C32;
--ios-blur-bg: rgba(0, 0, 0, 0.6);
--ios-glass-bg: rgba(22, 25, 33, 0.7);
--ios-glass-border: rgba(255, 255, 255, 0.08);
--ios-glass-highlight: rgba(255, 255, 255, 0.08);
--ios26-glass: rgba(28, 28, 30, 0.72);
--ios26-glass-border: rgba(255, 255, 255, 0.1);
--ios26-segment-bg: rgba(255, 255, 255, 0.12);
--ios26-segment-active: rgba(255, 255, 255, 0.9);
--ios26-segment-active-fg: var(--md-sys-color-on-background);
--ios26-list-divider: rgba(255, 255, 255, 0.12);
}
[data-theme="dark"] .ios-glass-panel {
background: rgba(22, 25, 33, 0.7);
border-color: rgba(255, 255, 255, 0.08);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
}
/* Базовые стили с оптимизацией */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
/* Оптимизация скролла */
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
color: var(--md-sys-color-on-surface);
/* Базовый цвет на случай, если градиент не применится */
background-color: var(--md-sys-color-background);
/* Основной iOSстиль фона с переливающимся градиентом */
background-image:
radial-gradient(60% 60% at 10% 10%, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0) 65%),
radial-gradient(70% 70% at 85% 20%, rgba(208, 189, 255, 0.9), rgba(255, 255, 255, 0) 70%),
radial-gradient(70% 70% at 50% 90%, rgba(189, 222, 255, 0.8), rgba(255, 255, 255, 0) 70%),
linear-gradient(120deg, rgba(210, 190, 255, 0.7), rgba(255, 255, 255, 0.6), rgba(190, 165, 255, 0.7));
background-size: 220% 220%;
background-repeat: no-repeat;
background-attachment: fixed;
line-height: 1.6;
/* Оптимизация рендеринга */
text-rendering: optimizeLegibility;
font-feature-settings: 'kern' 1;
position: relative;
isolation: isolate;
/* Высота на весь экран + отступ под нижний бар (только когда есть навигация) */
min-height: 100vh;
padding-bottom: calc(60px + 56px); /* 60px базовый отступ + 56px высота бара */
}
/* Страницы без навигационного меню (логин, регистрация и т.д.) — без отступа снизу */
body:has([data-no-nav]) {
padding-bottom: 0;
}
body:has(.protected-layout-root) {
padding-bottom: 0;
}
body > * {
position: relative;
z-index: 1;
}
body::after {
content: '';
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
opacity: 0.04;
mix-blend-mode: soft-light;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.7'/%3E%3C/svg%3E");
}
/* Select: выпадающее меню — светлый фон и тёмный текст (иначе белый на белом) */
md-filled-select::part(menu),
md-outlined-select::part(menu) {
background-color: #fff !important;
--md-menu-container-color: #fff !important;
--md-sys-color-surface: #fff !important;
--md-sys-color-on-surface: #1a1a1a !important;
--md-sys-color-on-surface-variant: #444 !important;
color: #1a1a1a !important;
}
md-filled-select::part(menu) md-select-option,
md-filled-select::part(menu) md-menu-item,
md-outlined-select::part(menu) md-select-option,
md-outlined-select::part(menu) md-menu-item {
color: #1a1a1a !important;
}
/* Меню select может рендериться в overlay — светлая тема для списка опций */
md-menu:has(md-select-option) {
--md-menu-container-color: #fff !important;
--md-sys-color-surface: #fff !important;
--md-sys-color-on-surface: #1a1a1a !important;
background-color: #fff !important;
color: #1a1a1a !important;
}
md-menu:has(md-select-option) md-select-option,
md-menu:has(md-select-option) md-menu-item {
color: #1a1a1a !important;
}
/* Временные стили для нижней навигации (Material Web) — больше не используются, оставлены на случай отката */
/* md-navigation-bar.bottom-nav-ios26 { ... } */
/* Оптимизация изображений */
img {
max-width: 100%;
height: auto;
/* Lazy loading по умолчанию */
loading: lazy;
/* Оптимизация декодирования */
decoding: async;
}
/* iOS 24+ эффекты */
.ios-blur {
backdrop-filter: var(--ios-blur);
-webkit-backdrop-filter: var(--ios-blur);
}
.ios-card {
border-radius: var(--ios-radius);
background: var(--ios-blur-bg);
backdrop-filter: var(--ios-blur);
-webkit-backdrop-filter: var(--ios-blur);
box-shadow: var(--ios-shadow);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.ios-card:hover {
transform: translateY(-2px);
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.15);
}
/* iOS 24+ стеклянные панели */
.ios-glass-panel {
position: relative;
background: #ffffff;
border: 1px solid transparent;
backdrop-filter: blur(26px) saturate(1.25);
-webkit-backdrop-filter: blur(26px) saturate(1.25);
box-shadow: none;
overflow: hidden;
}
.ios-glass-panel::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
pointer-events: none;
opacity: 0;
mix-blend-mode: soft-light;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 120 120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)' opacity='0.6'/%3E%3C/svg%3E");
}
/* Кастомный нижний бар iOS 26 — первый ряд всегда, остальное по раскрытию. Ноутбук и выше: fixed, bottom 20px */
.ios26-bottom-nav-container {
position: fixed;
bottom: 20px;
left: 16px;
right: 16px;
z-index: 1000;
max-width: min(900px, 100%);
margin: 0 auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 0;
transition:
bottom 0.45s cubic-bezier(0.22, 1, 0.36, 1),
padding-bottom 0.45s cubic-bezier(0.22, 1, 0.36, 1);
padding-bottom: 0;
}
.ios26-bottom-nav-container--expanded {
bottom: 0;
padding-bottom: env(safe-area-inset-bottom, 0);
}
/* Protected layout: контент скроллится сверху, снизу меню. На мобильном — меню в потоке; ноутбук+ — fixed */
.protected-layout-root {
display: flex;
flex-direction: column;
min-height: 100vh;
height: 100vh;
}
.protected-layout-root .protected-main {
flex: 1;
min-height: 0;
overflow: auto;
}
/* Ноутбук и выше (768px+): нижний бар fixed, bottom 20px, контенту отступ снизу */
@media (min-width: 768px) {
.protected-layout-root .ios26-bottom-nav-container {
position: fixed;
bottom: 20px;
left: 16px;
right: 16px;
margin: 0 auto;
max-width: min(900px, 100%);
}
.protected-layout-root .protected-main {
padding-bottom: 88px;
}
}
/* Мобильный: меню в потоке, на всю ширину, прижато к низу */
@media (max-width: 767px) {
.protected-layout-root .ios26-bottom-nav-container {
position: relative;
bottom: auto;
left: 0;
right: 0;
margin: 0;
max-width: 100%;
flex-shrink: 0;
border-radius: 0;
}
.protected-layout-root .ios26-bottom-nav {
border-radius: 0;
border-left: none;
border-right: none;
padding-bottom: calc(8px + env(safe-area-inset-bottom, 0));
}
/* Все строки навигации по 4 элемента на мобильном */
.protected-layout-root .ios26-bottom-nav-first-row {
grid-template-columns: repeat(4, 1fr);
}
.protected-layout-root .ios26-bottom-nav-first-row-buttons {
grid-template-columns: repeat(4, 1fr);
}
.protected-layout-root .ios26-bottom-nav-rest {
grid-template-columns: repeat(4, 1fr);
}
}
.ios26-bottom-nav-expand-trigger {
all: unset;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
width: 80px;
height: 15px;
margin-bottom: 0;
color: var(--md-sys-color-surface);
background: #7444fdc7;
border: 1px solid #bfa9ff52;
border-bottom: none;
border-radius: 12px 12px 0 0;
backdrop-filter: var(--ios26-blur);
-webkit-backdrop-filter: var(--ios26-blur);
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.04);
transition: color 0.2s ease, background 0.2s ease;
}
.ios26-bottom-nav-expand-trigger:hover {
color: var(--md-sys-color-surface);
background: rgba(191, 169, 255, 0.2);
}
.ios26-bottom-nav-expand-trigger .material-symbols-outlined {
font-size: 20px;
}
.ios26-bottom-nav-arrow {
transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}
.ios26-bottom-nav {
display: flex;
flex-direction: column;
gap: 0;
padding: 8px 12px;
background: #7444fdc7;
border-radius: 20px;
border: 1px solid var(--ios26-glass-border);
backdrop-filter: var(--ios26-blur);
-webkit-backdrop-filter: var(--ios26-blur);
box-shadow: var(--ios26-shadow-soft);
}
.ios26-bottom-nav-first-row {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px 8px;
}
.ios26-bottom-nav-first-row--with-selector {
display: flex;
align-items: stretch;
gap: 6px;
grid-template-columns: unset;
}
/* Первый ряд: 4 колонки, когда есть слот уведомлений (мобильное меню) */
.ios26-bottom-nav-first-row--with-notifications {
grid-template-columns: repeat(4, 1fr);
}
.ios26-bottom-nav-first-row-buttons--with-notifications {
grid-template-columns: repeat(4, 1fr);
}
.ios26-bottom-nav-first-row-buttons {
flex: 1;
min-width: 0;
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px 8px;
}
.ios26-bottom-nav-rest {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px 8px;
margin-top: 0;
max-height: 0;
overflow: hidden;
opacity: 0;
transition:
max-height 0.45s cubic-bezier(0.22, 1, 0.36, 1),
margin-top 0.45s cubic-bezier(0.22, 1, 0.36, 1),
opacity 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}
.ios26-bottom-nav-rest--expanded {
margin-top: 4px;
max-height: 220px;
opacity: 1;
}
/* Плавное появление дополнительных кнопок при раскрытии */
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button {
animation: ios26-nav-item-reveal 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) backwards;
}
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button:nth-child(1) { animation-delay: 0.04s; }
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button:nth-child(2) { animation-delay: 0.08s; }
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button:nth-child(3) { animation-delay: 0.12s; }
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button:nth-child(4) { animation-delay: 0.16s; }
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button:nth-child(5) { animation-delay: 0.2s; }
.ios26-bottom-nav-rest--expanded .ios26-bottom-nav-button:nth-child(6) { animation-delay: 0.24s; }
@keyframes ios26-nav-item-reveal {
from {
opacity: 0;
transform: translateY(-8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.ios26-bottom-nav-button {
all: unset;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
padding: 6px 4px;
border-radius: 12px;
min-width: 0;
color: var(--md-sys-color-surface);
background: transparent;
box-shadow: none;
}
.ios26-bottom-nav-button--active,
.ios26-bottom-nav-button:hover {
color: #ebe4ff;
background: #bfa9ff52;
box-shadow: 0 4px 12px rgb(0 0 0 / 7%);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
}
.ios26-bottom-nav-icon {
font-size: 20px;
line-height: 1;
flex-shrink: 0;
}
.ios26-bottom-nav-label {
font-size: 10px;
font-weight: 500;
letter-spacing: 0.02em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
text-align: center;
}
/* Выдвижная навигация slideout — слева, появление слева направо */
.ios26-bottom-nav-slideout {
position: fixed !important;
left: 0 !important;
right: auto !important;
top: 0 !important;
bottom: 0 !important;
width: 100px !important;
z-index: 10004 !important;
overflow: hidden;
animation: ios26-slideout-left-to-right 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;
}
@keyframes ios26-slideout-left-to-right {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(0);
}
}
/* Слева углы прямые, справа закруглённые — 1 колонка, 100px ширина */
.ios26-bottom-nav-slideout .ios26-bottom-nav-slideout-inner {
display: grid !important;
grid-template-columns: 1fr !important;
gap: 4px !important;
padding: 12px 8px !important;
height: 100%;
overflow-y: auto;
align-content: start;
border-radius: 0 20px 20px 0 !important;
border-left: none !important;
box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15) !important;
}
.ios26-bottom-nav-slideout .ios26-bottom-nav-button {
flex-direction: column;
padding: 8px 4px;
min-height: 48px;
}
.ios26-bottom-nav-slideout .ios26-bottom-nav-label {
font-size: 9px;
max-width: 68px;
}
/* Тарифные планы — карточки в ряд с описанием и преимуществами */
.ios26-payment-tab {
display: flex;
flex-direction: column;
gap: var(--ios26-spacing-lg);
}
.ios26-payment-tab__label {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.05em;
color: var(--md-sys-color-on-surface-variant);
}
/* Карточки всегда в ряд: 1 на узких, 2 на планшете, 3 на десктопе */
.ios26-plan-card-grid {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
@media (min-width: 600px) {
.ios26-plan-card-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 900px) {
.ios26-plan-card-grid {
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
}
/* Ограничение 45 карточек — можно показать 4 в ряд на очень широких экранах */
@media (min-width: 1400px) {
.ios26-plan-card-grid {
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}
}
.ios26-plan-card {
display: flex;
flex-direction: column;
gap: 12px;
padding: 24px;
border-radius: 16px;
border: 1px solid transparent;
box-sizing: border-box;
min-height: 0;
}
.ios26-plan-card--elevated {
background: #fff;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04);
border-color: rgba(0, 0, 0, 0.06);
}
.ios26-plan-card--elevated:hover {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08), 0 2px 6px rgba(0, 0, 0, 0.04);
}
.ios26-plan-card--current {
background: var(--md-sys-color-primary-container, #e8def8);
border-color: var(--md-sys-color-primary, #6750a4);
}
.ios26-plan-card__overline {
font-size: 12px;
font-weight: 500;
color: var(--md-sys-color-on-surface-variant);
letter-spacing: 0.04em;
}
.ios26-plan-card__headline {
font-size: 20px;
font-weight: 600;
line-height: 1.3;
color: var(--md-sys-color-on-surface);
margin: 0;
}
/* Бейдж названия тарифа */
.ios26-plan-card__badge {
display: inline-flex;
align-items: center;
height: 28px;
padding: 0 12px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
color: var(--md-sys-color-primary, #6750a4);
background: rgba(103, 80, 164, 0.12);
width: fit-content;
}
/* Блок цены: число + период */
.ios26-plan-card__price-block {
display: flex;
align-items: baseline;
gap: 6px;
margin: 4px 0 0 0;
}
.ios26-plan-card__price-value {
font-size: 32px;
font-weight: 700;
line-height: 1;
color: var(--md-sys-color-on-surface, #1c1b1f);
}
.ios26-plan-card__price-period {
font-size: 14px;
font-weight: 500;
color: var(--md-sys-color-on-surface-variant);
}
.ios26-plan-card__supporting {
font-size: 14px;
line-height: 1.5;
color: var(--md-sys-color-on-surface-variant);
margin: 0;
}
.ios26-plan-card__benefits {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 8px;
}
.ios26-plan-card__benefit {
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 13px;
color: var(--md-sys-color-on-surface);
line-height: 1.4;
}
.ios26-plan-card__benefit-icon {
flex-shrink: 0;
width: 18px;
height: 18px;
margin-top: 1px;
color: var(--md-sys-color-primary, #6750a4);
}
.ios26-plan-card__price {
font-size: 20px;
font-weight: 600;
color: var(--md-sys-color-primary);
margin-top: auto;
}
.ios26-plan-card__actions {
margin-top: auto;
padding-top: 8px;
}
.ios26-plan-card__action {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
padding: 12px 20px;
border-radius: 12px;
border: none;
background: var(--md-sys-color-primary, #6750a4);
color: var(--md-sys-color-on-primary, #fff);
font-size: 14px;
font-weight: 600;
text-decoration: none;
cursor: pointer;
transition: opacity 0.2s ease, background-color 0.2s ease;
}
.ios26-plan-card__action:hover {
opacity: 0.92;
}
.ios26-plan-card__action:active {
opacity: 0.88;
}
/* Профиль: оверлей при наведении на аватар */
.profile-avatar-container:hover .profile-avatar-overlay {
opacity: 1;
pointer-events: auto;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* Flip-card: панели заполняют всю высоту */
.flip-card-front .ios26-panel {
min-height: 100%;
display: flex;
flex-direction: column;
}
.flip-card-back .ios26-panel {
height: 100%;
display: flex;
flex-direction: column;
}
/* Кнопка "Назад" в шапке секций деталей */
.ios26-back-button {
all: unset;
cursor: pointer;
padding: 8px 16px;
border-radius: 999px;
font-size: 13px;
font-weight: 500;
color: var(--md-sys-color-primary);
background: #bfa9ff52;
box-shadow: 0 4px 12px rgb(0 0 0 / 7%);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
}
.ios26-back-button:hover {
background: #bfa9ff80;
}
/* Превью ближайших занятий в виде карточек */
.ios26-lesson-preview {
all: unset;
cursor: pointer;
display: flex;
align-items: center;
gap: var(--ios26-spacing-sm);
padding: var(--ios26-spacing-sm);
border-radius: var(--ios26-radius-sm);
border: 1px solid var(--ios26-list-divider);
background: var(--ios26-glass);
box-shadow: var(--ios26-shadow-soft);
transition: background 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}
.ios26-lesson-preview:hover {
background: #bfa9ff52;
box-shadow: 0 4px 12px rgb(0 0 0 / 7%);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
}
.ios26-lesson-avatar {
width: 44px;
height: 44px;
border-radius: 50%;
overflow: hidden;
background: linear-gradient(135deg, #bfa9ff, #8c7eff);
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-weight: 600;
font-size: 18px;
flex-shrink: 0;
}
.ios26-lesson-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.ios26-lesson-text {
display: flex;
flex-direction: column;
gap: 2px;
}
.ios26-lesson-subject {
font-size: 15px;
font-weight: 600;
color: var(--md-sys-color-on-surface);
margin: 0;
}
.ios26-lesson-student {
font-size: 13px;
color: var(--md-sys-color-on-surface-variant);
margin: 0;
}
.ios26-lesson-datetime {
font-size: 12px;
color: var(--md-sys-color-on-surface-variant);
margin: 0;
}
.ios-glass-panel::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
pointer-events: none;
background: radial-gradient(80% 60% at 15% 10%, var(--ios-glass-highlight), rgba(255, 255, 255, 0));
opacity: 0;
}
.ios-glass-interactive {
transition: transform 0.2s ease, box-shadow 0.2s ease;
cursor: pointer;
}
.ios-glass-interactive:hover {
transform: translateY(-2px);
box-shadow: var(--ios-shadow-deep);
}
.ios-dashboard {
position: relative;
padding-bottom: 32px;
}
.ios-dashboard .ios-glass-panel {
box-shadow: var(--ios-shadow-soft);
}
/* iOS 26+ Dashboard: контейнер и панели */
.ios26-dashboard {
--dashboard-font: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Segoe UI', Roboto, sans-serif;
font-family: var(--dashboard-font);
width: 100%;
max-width: 100%;
padding: var(--ios26-spacing);
}
.ios26-dashboard.ios26-dashboard-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-auto-rows: min-content;
gap: var(--ios26-spacing);
align-items: stretch;
}
@media (max-width: 700px) {
.ios26-dashboard.ios26-dashboard-grid {
grid-template-columns: 1fr;
}
}
/* Страница обратной связи — Kanban две колонки */
.ios26-feedback-page {
padding: var(--ios26-spacing);
}
.ios26-feedback-kanban {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--ios26-spacing-lg);
align-items: start;
}
@media (max-width: 700px) {
.ios26-feedback-kanban {
grid-template-columns: 1fr;
}
}
.ios26-feedback-column {
display: flex;
flex-direction: column;
gap: var(--ios26-spacing-sm);
min-height: 200px;
}
.ios26-feedback-column__title {
font-size: 14px;
font-weight: 600;
color: var(--md-sys-color-on-surface-variant);
letter-spacing: 0.03em;
margin: 0 0 var(--ios26-spacing-sm) 0;
padding: 0;
}
.ios26-feedback-column__cards {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--ios26-spacing-sm);
}
@media (max-width: 600px) {
.ios26-feedback-column__cards {
grid-template-columns: 1fr;
}
}
/* Домашние задания — 4 колонки Kanban */
.ios26-homework-kanban {
grid-template-columns: repeat(4, 1fr);
}
@media (max-width: 1100px) {
.ios26-homework-kanban {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
.ios26-homework-kanban {
grid-template-columns: 1fr;
}
}
.ios26-panel {
background: var(--ios26-glass);
backdrop-filter: var(--ios26-blur);
-webkit-backdrop-filter: var(--ios26-blur);
border-radius: var(--ios26-radius-md);
border: 1px solid var(--ios26-glass-border);
box-shadow: var(--ios26-shadow);
overflow: hidden;
transition: box-shadow 0.25s ease, transform 0.2s ease;
}
.ios26-panel-interactive:hover {
box-shadow: var(--ios26-shadow-hover);
}
/* Страница аналитики: слайдер на всю высоту экрана */
.ios26-dashboard-analytics {
overflow: hidden;
}
.ios26-analytics-swiper-wrap {
position: relative;
height: 100vh;
width: 100%;
}
.ios26-analytics-swiper-wrap .ios26-analytics-swiper {
height: 100%;
}
.ios26-analytics-swiper-wrap .ios26-analytics-swiper .swiper-slide {
height: 100%;
overflow: auto;
}
/* Кнопки навигации слайдера — в стиле дашборда (стекло, primary) */
.ios26-analytics-swiper-wrap .swiper-button-next,
.ios26-analytics-swiper-wrap .swiper-button-prev {
width: 48px;
height: 48px;
margin-top: 0;
top: 50%;
transform: translateY(-50%);
background: var(--ios26-glass);
backdrop-filter: var(--ios26-blur);
-webkit-backdrop-filter: var(--ios26-blur);
border: 1px solid var(--ios26-list-divider);
border-radius: 50%;
box-shadow: var(--ios26-shadow-soft);
color: var(--md-sys-color-primary);
transition: box-shadow 0.2s ease, background 0.2s ease;
}
.ios26-analytics-swiper-wrap .swiper-button-next:hover,
.ios26-analytics-swiper-wrap .swiper-button-prev:hover {
background: var(--md-sys-color-primary);
color: var(--md-sys-color-on-primary);
box-shadow: var(--ios26-shadow);
}
.ios26-analytics-swiper-wrap .swiper-button-next {
right: var(--ios26-spacing);
}
.ios26-analytics-swiper-wrap .swiper-button-prev {
left: var(--ios26-spacing);
}
.ios26-analytics-swiper-wrap .swiper-button-next::after,
.ios26-analytics-swiper-wrap .swiper-button-prev::after {
font-size: 20px;
font-weight: 700;
}
.ios26-analytics-swiper-wrap .swiper-pagination {
bottom: var(--ios26-spacing);
}
.ios26-analytics-swiper-wrap .swiper-pagination-bullet {
width: 8px;
height: 8px;
background: var(--md-sys-color-outline-variant);
opacity: 0.8;
transition: opacity 0.2s ease, transform 0.2s ease;
}
.ios26-analytics-swiper-wrap .swiper-pagination-bullet:hover {
opacity: 1;
}
.ios26-analytics-swiper-wrap .swiper-pagination-bullet-active {
background: var(--md-sys-color-primary);
opacity: 1;
transform: scale(1.2);
}
/* Кастомные кнопки навигации слайдера — в стиле кнопки «Сохранить» (профиль) */
.ios26-analytics-nav {
position: absolute;
inset: 0;
z-index: 10;
pointer-events: none;
}
.ios26-analytics-nav .ios26-analytics-nav-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
pointer-events: auto;
}
.ios26-analytics-nav .ios26-analytics-nav-btn:first-child {
left: var(--ios26-spacing);
}
.ios26-analytics-nav .ios26-analytics-nav-btn:last-child {
right: var(--ios26-spacing);
}
.ios26-analytics-nav .ios26-analytics-nav-btn:hover {
opacity: 0.92;
}
.ios26-analytics-nav .ios26-analytics-nav-btn:active {
opacity: 0.85;
}
/* Страница аналитики: панели на всю высоту слайда, без скруглений, нижняя граница темнее */
.ios26-dashboard-analytics .ios26-panel {
min-height: 100%;
height: 100%;
border-radius: 0;
border: none;
border-bottom: 2px solid rgba(0, 0, 0, 0.14);
display: flex;
flex-direction: column;
box-sizing: border-box;
}
@media (prefers-color-scheme: dark) {
.ios26-dashboard-analytics .ios26-panel {
border-bottom-color: rgba(255, 255, 255, 0.16);
}
}
/* Графики на странице аналитики — единый размер по высоте экрана (80%) */
.ios26-dashboard-analytics .ios26-analytics-chart,
.ios26-dashboard-analytics .ios26-analytics-chart-placeholder {
min-height: 80vh;
}
/* Ряд: график слева, статистика справа */
.ios26-analytics-chart-row {
display: flex;
flex-direction: row;
gap: var(--ios26-spacing-lg);
align-items: flex-start;
}
.ios26-analytics-chart-col {
flex: 1;
min-width: 0;
}
/* Топ занятий + Топ ученики — одна панель в 2 колонки */
.ios26-analytics-two-cols {
display: flex;
flex-direction: row;
gap: var(--ios26-spacing-lg);
align-items: flex-start;
width: 100%;
}
.ios26-analytics-two-cols .ios26-analytics-col {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: var(--ios26-spacing-sm);
}
.ios26-dashboard-analytics .ios26-stat-grid--aside {
display: flex;
flex-direction: column;
gap: var(--ios26-spacing-sm);
flex-shrink: 0;
width: 200px;
}
.ios26-dashboard-analytics .ios26-stat-grid--aside .ios26-stat-tile {
width: 100%;
}
.ios26-list-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--ios26-spacing-sm) 0;
border-bottom: 1px solid var(--ios26-list-divider);
font-size: 17px;
line-height: 1.35;
}
.ios26-list-row:last-child {
border-bottom: none;
}
.ios26-list-row-label {
color: var(--md-sys-color-on-surface-variant);
}
.ios26-list-row-value {
font-weight: 500;
color: var(--md-sys-color-on-surface);
}
/* Статистика: грид 3×3 с иконкой, названием и значением */
.ios26-stat-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: var(--ios26-spacing-sm);
}
.ios26-stat-tile {
padding: 14px 16px;
border-radius: var(--ios26-radius-sm);
background: var(--ios26-glass);
border: 1px solid var(--ios26-list-divider);
box-shadow: var(--ios26-shadow-soft);
display: flex;
flex-direction: column;
gap: 8px;
align-items: center;
text-align: center;
}
.ios26-stat-icon {
color: var(--md-sys-color-primary);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 4px;
}
.ios26-stat-icon svg {
width: 30px;
height: 30px;
}
.ios26-stat-label {
font-size: 18px;
color: var(--md-sys-color-on-surface-variant);
}
.ios26-stat-value {
font-size: 18px;
font-weight: 600;
color: var(--md-sys-color-on-surface);
}
.ios26-stat-value--primary {
color: var(--md-sys-color-primary);
}
.ios26-stat-value--tertiary {
color: var(--md-sys-color-tertiary);
}
.ios26-stat-value--error {
color: var(--md-sys-color-error);
}
.ios26-section-title {
font-size: 20px;
font-weight: 600;
color: var(--md-sys-color-on-surface);
margin: 0 0 var(--ios26-spacing-md) 0;
text-align: left;
letter-spacing: -0.02em;
}
@keyframes ios-aurora {
0% {
background-position: 0% 20%;
}
50% {
background-position: 100% 80%;
}
100% {
background-position: 0% 20%;
}
}
/* Оптимизация анимаций */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* Утилиты для производительности */
.gpu-accelerated {
transform: translateZ(0);
will-change: transform;
}
/* Анимация загрузки */
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Прогресс поиска */
@keyframes searchProgress {
0% { transform: translateX(-100%); }
50% { transform: translateX(200%); }
100% { transform: translateX(-100%); }
}
/* Скрытие элементов без перерисовки */
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* Календарь: чтобы не обрезались рамки ячеек */
.rbc-day-bg {
overflow: hidden;
}
/* Календарь: выбранный день / выбранная ячейка */
.rbc-day-bg.rbc-selected-day,
.rbc-day-bg.rbc-selected-cell {
border: 2px solid #9286b2 !important;
background: #cec1f4 !important;
opacity: 1;
cursor: pointer;
}
.rbc-day-bg.rbc-selected-day:hover,
.rbc-day-bg.rbc-selected-cell:hover {
border: 2px solid #9286b2 !important;
background: #cec1f4 !important;
opacity: 1;
cursor: pointer;
}
/* Календарь: события не выходят за пределы ячейки */
.rbc-row-segment {
overflow: hidden;
}
.rbc-event {
max-width: 100%;
box-sizing: border-box;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
/* Календарь: события прижаты к верху ячейки, а не по центру */
.rbc-month-row .rbc-row-content {
align-items: flex-start;
}
/* Градиентная теневая заливка под линией графика доходов ментора */
#apexchartsmentor-income-chart .apexcharts-area-series path {
filter: drop-shadow(0 4px 12px rgba(103, 80, 164, 0.25))
drop-shadow(0 2px 6px rgba(103, 80, 164, 0.2))
drop-shadow(0 1px 3px rgba(0, 0, 0, 0.15));
}
/* Улучшенная градиентная заливка области под линией */
#apexchartsmentor-income-chart .apexcharts-area-series .apexcharts-area {
filter: drop-shadow(0 8px 20px rgba(103, 80, 164, 0.2))
drop-shadow(0 4px 10px rgba(103, 80, 164, 0.15));
}
/* Градиентная тень для foreignobject */
#apexchartsmentor-income-chart foreignObject {
filter: drop-shadow(0 4px 12px rgba(103, 80, 164, 0.15))
drop-shadow(0 2px 6px rgba(103, 80, 164, 0.1));
}
/* Увеличение размера шрифта для всех текстовых элементов графика */
#apexchartsmentor-income-chart text,
#apexchartsmentor-income-chart tspan {
font-size: 15px !important;
}
/* ========== Адаптив: планшет и телефон (dashboard, chat, materials, homework, my-progress, request-mentor, profile, livekit, students, feedback, analytics, payment, referrals) ========== */
/* Планшет: 768px — 1024px */
@media (max-width: 1024px) {
.protected-main {
padding-left: 12px !important;
padding-right: 12px !important;
padding-top: 12px !important;
padding-bottom: 12px !important;
}
.protected-main[data-full-width] {
padding: 12px !important;
}
.ios26-dashboard {
padding: 12px;
}
.ios26-dashboard.ios26-dashboard-grid {
gap: 12px;
}
.ios26-stat-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ios26-analytics-chart-row {
flex-direction: column;
}
.ios26-analytics-two-cols {
flex-direction: column;
}
.ios26-dashboard-analytics .ios26-stat-grid--aside {
width: 100%;
flex-direction: row;
flex-wrap: wrap;
gap: 8px;
}
.ios26-dashboard-analytics .ios26-stat-grid--aside .ios26-stat-tile {
flex: 1;
min-width: 140px;
}
.ios26-bottom-nav-container {
left: 8px;
right: 8px;
}
.ios26-panel {
padding: 12px;
}
}
/* Телефон: до 767px */
@media (max-width: 767px) {
body {
padding-bottom: calc(50px + 52px);
}
.protected-main {
padding-left: 10px !important;
padding-right: 10px !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
}
.protected-main[data-full-width] {
padding: 10px !important;
}
.ios26-dashboard {
padding: 10px;
}
.ios26-dashboard.ios26-dashboard-grid {
grid-template-columns: 1fr;
gap: 10px;
}
.ios26-stat-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.ios26-stat-tile {
padding: 10px 12px;
}
.ios26-stat-label,
.ios26-stat-value {
font-size: 15px;
}
.ios26-section-title {
font-size: 18px;
margin-bottom: 12px;
}
.ios26-bottom-nav-container {
left: 6px;
right: 6px;
bottom: 20px;
}
.ios26-bottom-nav {
padding: 6px 8px;
}
.ios26-bottom-nav-first-row {
gap: 2px 4px;
}
.ios26-bottom-nav-rest--expanded {
max-height: 200px;
}
.ios26-panel {
padding: 10px;
border-radius: var(--ios26-radius-sm);
}
.ios26-dashboard-analytics .ios26-analytics-chart,
.ios26-dashboard-analytics .ios26-analytics-chart-placeholder {
min-height: 60vh;
}
.ios26-analytics-nav .ios26-analytics-nav-btn:first-child {
left: 8px;
}
.ios26-analytics-nav .ios26-analytics-nav-btn:last-child {
right: 8px;
}
.ios26-feedback-page {
padding: 10px;
}
.ios26-feedback-kanban {
gap: 12px;
}
.ios26-list-row {
font-size: 15px;
padding: 10px 0;
}
/* Страница Студенты: сетка карточек и боковая панель */
.page-students {
padding: 16px !important;
}
.students-cards-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
align-items: start;
}
.students-side-panel {
width: 100% !important;
max-width: 100vw;
right: 0 !important;
border-top-left-radius: 0 !important;
border-bottom-left-radius: 0 !important;
}
/* Страница Профиль: одна колонка, поля в 1 колонку */
.page-profile {
padding: 16px !important;
}
.page-profile-grid {
grid-template-columns: 1fr !important;
}
.page-profile-fields {
grid-template-columns: 1fr !important;
}
/* Аналитика: уже есть .ios26-analytics-chart-row column, .ios26-analytics-two-cols column */
}
/* Маленький телефон: до 480px */
@media (max-width: 480px) {
.protected-main {
padding-left: 8px !important;
padding-right: 8px !important;
padding-top: 8px !important;
padding-bottom: 8px !important;
}
.protected-main[data-full-width] {
padding: 8px !important;
}
.page-students {
padding: 12px !important;
}
.students-cards-grid {
grid-template-columns: 1fr;
gap: 10px;
}
.page-profile {
padding: 12px !important;
}
.ios26-dashboard {
padding: 8px;
}
.ios26-dashboard.ios26-dashboard-grid {
gap: 8px;
}
.ios26-stat-grid {
grid-template-columns: 1fr;
}
.ios26-stat-tile {
padding: 12px;
}
.ios26-bottom-nav-container {
left: 4px;
right: 4px;
bottom: 16px;
}
.ios26-bottom-nav-first-row {
grid-template-columns: repeat(5, 1fr);
}
.ios26-bottom-nav-button {
min-width: 0;
}
.ios26-bottom-nav-label {
font-size: 10px;
}
.ios26-panel {
padding: 8px;
}
.ios26-section-title {
font-size: 17px;
}
}
/* Страница Студенты: сетка карточек (десктоп) */
.students-cards-grid {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 16px;
align-items: start;
}
/* Страница календаря (расписание): планшет — правая часть сверху, календарь снизу; телефон — только правая часть */
@media (max-width: 1024px) {
.ios26-schedule-layout {
grid-template-columns: 1fr !important;
grid-template-rows: auto 1fr;
}
.ios26-schedule-calendar-wrap {
order: 2;
}
.ios26-schedule-right-wrap {
order: 1;
}
}
@media (max-width: 767px) {
.ios26-schedule-calendar-wrap {
display: none !important;
}
.ios26-schedule-layout {
grid-template-rows: 1fr !important;
min-height: auto !important;
}
}
/* Chat: список + окно чата — на планшете и телефоне одна колонка, список сверху */
@media (max-width: 900px) {
.ios26-chat-page {
padding: 10px !important;
}
.ios26-chat-layout {
grid-template-columns: 1fr !important;
grid-template-rows: auto 1fr;
height: calc(100vh - 120px) !important;
max-height: none !important;
}
.ios26-chat-layout > div:first-of-type {
max-height: 38vh;
min-height: 180px;
overflow: auto;
}
}
@media (max-width: 480px) {
.ios26-chat-page {
padding: 8px !important;
}
.ios26-chat-layout {
height: calc(100vh - 100px) !important;
}
.ios26-chat-layout > div:first-of-type {
max-height: 35vh;
min-height: 160px;
}
}
/* Materials / Homework / Students / Request-mentor / Profile: карточки и контент */
@media (max-width: 767px) {
.ios26-payment-tab,
.ios26-plan-card-grid {
gap: 10px;
}
.ios26-plan-card {
padding: 12px;
}
.protected-main md-elevated-card {
padding: 20px !important;
border-radius: 16px !important;
}
}
@media (max-width: 480px) {
.protected-main md-elevated-card {
padding: 14px !important;
border-radius: 14px !important;
}
}
/* LiveKit: полноэкранный контейнер на мобильных */
@media (max-width: 767px) {
[data-lk-theme] {
font-size: 14px;
}
.protected-main[data-no-nav] {
padding: 0 !important;
}
}
/* Flip-карточка эффект */
.flip-card {
position: relative;
width: 100%;
height: 100%;
min-height: 340px;
display: flex;
flex-direction: column;
}
.flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.6s;
transform-style: preserve-3d;
}
.flip-card-front,
.flip-card-back {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
display: flex;
flex-direction: column;
}
.flip-card-back {
transform: rotateY(180deg);
}