Corp/backend/static/scss/custom-bootstrap.scss

495 lines
17 KiB
SCSS
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.

// =============================================================================
// Custom Bootstrap Configuration
// =============================================================================
// Этот файл переопределяет переменные Bootstrap ДО его компиляции
// Результат: полностью кастомизированный Bootstrap с нашей системой отступов
// =============================================================================
// 1. ИМПОРТ НАШИХ ПЕРЕМЕННЫХ
// =============================================================================
// Сначала импортируем наши CSS переменные (для справки)
// Реальные значения ниже в SCSS переменных
// =============================================================================
// 2. ПЕРЕОПРЕДЕЛЕНИЕ BOOTSTRAP ПЕРЕМЕННЫХ
// =============================================================================
// ──────────────────────────────────────────────────────────────
// 2.1 Система отступов (8px grid)
// ──────────────────────────────────────────────────────────────
// Bootstrap использует $spacer для всех utility классов (.p-*, .m-* и т.д.)
// Переопределяем его на нашу 8px сетку
$spacer: 1rem !default; // 16px - базовое значение
// Переопределение всей шкалы spacing
$spacers: (
0: 0, // 0px
1: 0.25rem, // 4px - var(--space-1)
2: 0.5rem, // 8px - var(--space-2)
3: 0.75rem, // 12px - var(--space-3)
4: 1rem, // 16px - var(--space-4)
5: 1.5rem, // 24px - var(--space-5)
) !default;
// ──────────────────────────────────────────────────────────────
// 2.2 Grid система
// ──────────────────────────────────────────────────────────────
$grid-gutter-width: 0.5rem !default; // 8px - var(--space-2)
// ──────────────────────────────────────────────────────────────
// 2.3 Компоненты - Padding
// ──────────────────────────────────────────────────────────────
// Переопределяем padding для всех Bootstrap компонентов
// Cards
$card-spacer-y: 1rem !default; // var(--space-2)
$card-spacer-x: 1rem !default; // var(--space-2)
// Alerts
$alert-padding-y: 1rem !default; // var(--space-2)
$alert-padding-x: 1rem !default; // var(--space-2)
// Buttons
$btn-padding-y: 0.5rem !default; // var(--space-1)
$btn-padding-x: 1rem !default; // var(--space-2)
$btn-padding-y-sm: 0.5rem !default; // var(--space-1)
$btn-padding-x-sm: 0.5rem !default; // var(--space-1)
$btn-padding-y-lg: 1rem !default; // var(--space-2)
$btn-padding-x-lg: 1.5rem !default; // var(--space-3)
// Form controls
$input-padding-y: 0.5rem !default; // var(--space-1)
$input-padding-x: 1rem !default; // var(--space-2)
$input-padding-y-sm: 0.5rem !default; // var(--space-1)
$input-padding-x-sm: 0.5rem !default; // var(--space-1)
$input-padding-y-lg: 1rem !default; // var(--space-2)
$input-padding-x-lg: 1.5rem !default; // var(--space-3)
// Modals
$modal-inner-padding: 1rem !default; // var(--space-2)
$modal-header-padding-y: 1rem !default; // var(--space-2)
$modal-header-padding-x: 1rem !default; // var(--space-2)
// Dropdowns
$dropdown-padding-x: 0 !default;
$dropdown-padding-y: 0.5rem !default; // var(--space-1)
$dropdown-item-padding-y: 0.5rem !default; // var(--space-1)
$dropdown-item-padding-x: 1rem !default; // var(--space-2)
// Navs
$nav-link-padding-y: 0.5rem !default; // var(--space-1)
$nav-link-padding-x: 1rem !default; // var(--space-2)
// Navbar
$navbar-padding-y: 0.5rem !default; // var(--space-1)
$navbar-padding-x: 1rem !default; // var(--space-2)
// Pagination
$pagination-padding-y: 0.5rem !default; // var(--space-1)
$pagination-padding-x: 1rem !default; // var(--space-2)
$pagination-padding-y-sm: 0.5rem !default; // var(--space-1)
$pagination-padding-x-sm: 0.5rem !default; // var(--space-1)
$pagination-padding-y-lg: 1rem !default; // var(--space-2)
$pagination-padding-x-lg: 1.5rem !default; // var(--space-3)
// List groups
$list-group-item-padding-y: 1rem !default; // var(--space-2)
$list-group-item-padding-x: 1rem !default; // var(--space-2)
// Breadcrumbs
$breadcrumb-padding-y: 0.5rem !default; // var(--space-1)
$breadcrumb-padding-x: 1rem !default; // var(--space-2)
// Toasts
$toast-padding-x: 1rem !default; // var(--space-2)
$toast-padding-y: 0.5rem !default; // var(--space-1)
// Offcanvas
$offcanvas-padding-y: 1rem !default; // var(--space-2)
$offcanvas-padding-x: 1rem !default; // var(--space-2)
// Badges
$badge-padding-y: 0.5rem !default; // var(--space-1)
$badge-padding-x: 0.5rem !default; // var(--space-1)
// ──────────────────────────────────────────────────────────────
// 2.4 Cards - переопределяем стили карточек (GLASSMORPHISM)
// ──────────────────────────────────────────────────────────────
$card-border-radius: 18px !default;
$card-border-width: 1px !default;
$card-border-color: rgba(255, 255, 255, 0.1) !default; // Светлая граница для glassmorphism
$card-bg: rgba(255, 255, 255, 0.05) !default; // Полупрозрачный для эффекта стекла
$card-box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37) !default; // Глубокая тень
// Card header/footer
$card-cap-padding-y: 1rem !default;
$card-cap-padding-x: 1rem !default;
$card-cap-bg: transparent !default; // Прозрачный header/footer
$card-cap-color: null !default;
// ──────────────────────────────────────────────────────────────
// 2.5 Дополнительные настройки (опционально)
// ──────────────────────────────────────────────────────────────
// Border radius (если хотите унифицировать)
// $border-radius: 10px !default; // var(--radius-md)
// $border-radius-sm: 6px !default; // var(--radius-sm)
// $border-radius-lg: 14px !default; // var(--radius-lg)
// =============================================================================
// 3. ИМПОРТ BOOTSTRAP
// =============================================================================
// Импортируем Bootstrap ПОСЛЕ переопределения переменных
@import "../node_modules/bootstrap/scss/bootstrap";
// =============================================================================
// 4. КАСТОМНЫЕ СТИЛИ (если нужно)
// =============================================================================
// Здесь можно добавить дополнительные стили или переопределения
@import "components/message-inputs";
@import "components/chat-detail";
@import "components/comments";
@import "components/modals";
// =============================================================================
// 5. ПЕРЕОПРЕДЕЛЕНИЕ BOOTSTRAP КАРТОЧЕК (GLASSMORPHISM ЭФФЕКТ)
// =============================================================================
// Все стили карточек собраны здесь для удобства поддержки
// Базовые стили карточки - применяем эффект жидкого стекла
.card {
// Прозрачный фон с лёгким оттенком для светлой темы (как в тёмной)
--bs-card-bg: transparent;
background: rgba(255, 255, 255, 0.1) !important;
// Размытие фона (glassmorphism) - основа эффекта жидкого стекла
backdrop-filter: blur(10px) saturate(180%);
-webkit-backdrop-filter: blur(10px) saturate(180%);
// Тонкая рамка для светлой темы
border: 1px solid rgba(0, 0, 0, 0.08) !important;
// Плавные переходы
transition: all 0.3s ease;
overflow: hidden;
// Hover эффект - усиливаем эффект
&:hover {
background: rgba(255, 255, 255, 0.15) !important;
border-color: rgba(0, 0, 0, 0.12) !important;
backdrop-filter: blur(12px) saturate(200%);
-webkit-backdrop-filter: blur(12px) saturate(200%);
box-shadow: 0 12px 48px 0 rgba(0, 0, 0, 0.15);
transform: translateY(-2px);
}
}
// Поддержка тёмной темы
[data-bs-theme="dark"] {
.card {
// Для тёмной темы - полностью прозрачный фон и светлая рамка
--bs-card-bg: transparent;
--bs-card-border-color: rgba(255, 255, 255, 0.1);
background: transparent !important;
border-color: rgba(255, 255, 255, 0.1) !important;
&:hover {
background: rgba(255, 255, 255, 0.03) !important;
border-color: rgba(255, 255, 255, 0.15) !important;
}
}
}
// =============================================================================
// 6. ПЕРЕОПРЕДЕЛЕНИЕ КНОПОК (ЕДИНЫЙ СТИЛЬ - ПРОЗРАЧНЫЕ)
// =============================================================================
// Единый источник правды для всех кнопок
// Философия: кнопки прозрачные, сливаются с фоном, БЕЗ hover эффектов
// Базовые стили для ВСЕХ кнопок - полностью прозрачные без hover
.btn {
background: transparent !important; // Всегда прозрачный фон
border: none !important; // Без рамок
color: var(--bs-secondary-color); // Серый цвет по умолчанию
font-weight: 500;
transition: color 0.2s ease; // Только цвет меняется
&:hover:not(:disabled) {
color: var(--bs-body-color); // Только текст становится ярче, фон НЕ меняется
}
&:active:not(:disabled) {
color: var(--bs-body-color);
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
// Primary кнопка (основное действие) - единственная с цветным фоном
.btn-primary {
color: #fff !important;
background: rgba(13, 110, 253, 0.7) !important; // Лёгкий синий фон
&:hover:not(:disabled) {
background: rgba(13, 110, 253, 0.85) !important;
box-shadow: 0 4px 16px rgba(13, 110, 253, 0.3);
}
&:active:not(:disabled) {
background: rgba(13, 110, 253, 0.95) !important;
}
}
// Secondary, outline, ghost - все прозрачные БЕЗ фона при hover
.btn-secondary,
.btn-outline-primary,
.btn-outline-secondary,
.btn-ghost {
background: transparent !important;
color: var(--bs-secondary-color);
&:hover:not(:disabled) {
background: transparent !important; // Фон НЕ меняется!
color: var(--bs-body-color); // Только цвет текста
}
&:active:not(:disabled) {
background: transparent !important;
}
}
// Особый цвет для outline-primary
.btn-outline-primary {
color: var(--bs-primary);
&:hover:not(:disabled) {
color: var(--bs-primary);
background: transparent !important;
}
}
// Кнопки в тёмной теме
[data-bs-theme="dark"] {
.btn {
&:hover:not(:disabled) {
background: transparent !important; // В тёмной теме тоже без фона
}
&:active:not(:disabled) {
background: transparent !important;
}
}
.btn-primary {
background: rgba(13, 110, 253, 0.6) !important;
&:hover:not(:disabled) {
background: rgba(13, 110, 253, 0.75) !important;
}
&:active:not(:disabled) {
background: rgba(13, 110, 253, 0.85) !important;
}
}
.btn-secondary,
.btn-outline-primary,
.btn-outline-secondary,
.btn-ghost {
&:hover:not(:disabled) {
background: transparent !important;
}
&:active:not(:disabled) {
background: transparent !important;
}
}
}
// Контейнер списка карточек
.card-list {
display: flex;
flex-direction: column;
gap: 0;
}
// Заголовок секции
.section-header {
display: flex;
align-items: center;
gap: var(--gap-component, 1rem);
margin-bottom: var(--space-3, 0.75rem);
.title {
font-weight: 800;
letter-spacing: 0.2px;
margin: 0;
}
}
// Переопределение card-header для гибкости
.card-header {
display: flex;
align-items: center;
gap: var(--gap-component, 1rem);
padding: var(--card-padding, 1rem);
padding-bottom: var(--space-1, 0.25rem);
background: transparent;
border-bottom: none;
}
// Иконка/аватар в карточке
.card-icon {
width: 42px;
height: 42px;
border-radius: 9999px;
overflow: hidden;
border: 1px solid color-mix(in srgb, var(--bs-border-color), transparent 20%);
background: var(--bs-tertiary-bg);
display: grid;
place-items: center;
flex: 0 0 auto;
img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
}
// Метаинформация
.card-meta {
line-height: 1.2;
flex: 1;
min-width: 0;
}
// Заголовок карточки
.card-title {
font-weight: 700;
color: var(--bs-body-color);
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 0;
}
// Подзаголовок
.card-subtitle {
font-size: 0.82rem;
color: var(--bs-secondary-color);
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 0;
}
// Тело карточки
.card-body {
padding: var(--space-1, 0.25rem) var(--card-padding, 1rem);
padding-bottom: var(--space-1, 0.25rem);
position: relative;
}
// Действия карточки
.card-actions {
display: flex;
align-items: center;
gap: var(--space-1, 0.25rem);
padding: var(--card-padding, 1rem);
padding-top: var(--space-2, 0.5rem);
border-top: 1px solid var(--bs-border-color);
position: relative;
z-index: 2;
// Кнопки в card-actions наследуют базовые стили, только добавляем активное состояние
.btn,
button {
&.active,
&.is-liked {
color: var(--bs-primary) !important;
font-weight: 600;
}
}
}
// Вариации карточек
.card.compact {
.card-header {
padding: var(--space-1, 0.25rem) var(--card-padding-sm, 0.5rem);
}
.card-body {
padding: var(--space-1, 0.25rem) var(--card-padding-sm, 0.5rem);
}
.card-icon {
width: 32px;
height: 32px;
}
}
.card.borderless {
border: none;
box-shadow: none;
border-radius: 0;
border-bottom: 1px solid var(--bs-border-color);
&:hover {
transform: none;
box-shadow: none;
background: var(--bs-tertiary-bg);
}
}
.card.highlighted {
border-left: 3px solid var(--bs-primary);
background: color-mix(in srgb, var(--bs-primary), transparent 95%);
}
// Адаптивность
@media (max-width: 576px) {
.section-header {
gap: var(--space-2, 0.5rem);
flex-wrap: wrap;
}
.card-header {
padding: var(--space-2, 0.5rem);
padding-bottom: var(--space-1, 0.25rem);
}
.card-icon {
width: 36px;
height: 36px;
}
.card-actions {
padding: var(--space-2, 0.5rem);
}
}
// =============================================================================
// 6. УТИЛИТАРНЫЕ КЛАССЫ
// =============================================================================
// Моноширинный шрифт для дат, цифр, кодов
.text-mono {
font-variant-numeric: tabular-nums;
font-family: ui-monospace, 'SF Mono', SFMono-Regular, 'Consolas', 'Liberation Mono', 'Menlo', 'Courier', monospace;
}