- Removed floating action button (FAB) for calendar - Added calendar icon in navbar next to notification bell - Calendar button only visible on mobile devices (d-lg-none) - Fixed issue where FAB could overlap message send button - Commented out calendar-fab CSS in all relevant files
346 lines
12 KiB
CSS
346 lines
12 KiB
CSS
/**
|
||
* base-app.css
|
||
* Базовые стили приложения: layout, navbar, sidebar, кнопки, feed-элементы
|
||
*
|
||
* Зависимости: variables.css (все переменные размеров, цветов, теней)
|
||
*/
|
||
|
||
:root {
|
||
--bs-primary: #007AFF;
|
||
--bs-link-color: var(--bs-primary);
|
||
--bs-link-hover-color: #0062CC;
|
||
}
|
||
|
||
[data-bs-theme="dark"] {
|
||
--bs-body-bg: #1C1C1E;
|
||
--bs-body-color: #F2F2F7;
|
||
--bs-border-color: #3A3A3C;
|
||
--bs-tertiary-bg: #2C2C2E;
|
||
--bs-primary: #0A84FF;
|
||
--bs-link-color: var(--bs-primary);
|
||
--bs-link-hover-color: #59AFFF;
|
||
}
|
||
|
||
body {
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||
font-size: 17px;
|
||
padding-top: var(--navbar-h);
|
||
overflow-x: hidden;
|
||
background-color: var(--bs-body-bg);
|
||
}
|
||
|
||
@supports(padding-top: env(safe-area-inset-top)) {
|
||
body {
|
||
padding-top: calc(var(--navbar-h) + env(safe-area-inset-top));
|
||
}
|
||
}
|
||
|
||
.btn {
|
||
border-radius: 10px;
|
||
min-height: 44px;
|
||
transition: background-color .3s, transform .1s;
|
||
}
|
||
|
||
.btn:hover {
|
||
transform: scale(1.02);
|
||
}
|
||
|
||
.form-control {
|
||
border-radius: 10px;
|
||
height: 44px;
|
||
font-size: 17px;
|
||
}
|
||
|
||
.form-control:focus {
|
||
box-shadow: 0 0 0 2px rgba(var(--bs-primary-rgb), .25);
|
||
border-color: var(--bs-primary);
|
||
}
|
||
|
||
.dropdown-menu {
|
||
border-radius: 13px;
|
||
box-shadow: 0 6px 24px rgba(0, 0, 0, .12);
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
NAVBAR
|
||
────────────────────────────────────────────────────────────── */
|
||
.app-navbar {
|
||
position: fixed;
|
||
inset: 0 0 auto 0;
|
||
z-index: 1030;
|
||
border-bottom: .5px solid var(--bs-border-color);
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
LAYOUT
|
||
────────────────────────────────────────────────────────────── */
|
||
.app-layout {
|
||
display: block;
|
||
}
|
||
|
||
/* Адаптивный контейнер для контента внутри main
|
||
Работает как обычный Bootstrap container, но адаптируется к grid-layout */
|
||
.content-container {
|
||
width: 100%;
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
}
|
||
|
||
/* На мобильных - ведет себя как обычный container */
|
||
@media (max-width: 991.98px) {
|
||
.content-container {
|
||
padding-left: var(--bs-gutter-x, 0.75rem);
|
||
padding-right: var(--bs-gutter-x, 0.75rem);
|
||
}
|
||
}
|
||
|
||
@media (min-width: 992px) {
|
||
/* При наличии grid-layout (с сайдбарами) - убираем padding и max-width */
|
||
.app-layout.with-sidebar .content-container,
|
||
.app-layout.with-rightbar .content-container {
|
||
max-width: none;
|
||
padding-left: 0;
|
||
padding-right: 0;
|
||
}
|
||
|
||
/* Grid layout для аутентифицированных пользователей */
|
||
.app-layout.with-sidebar.with-rightbar {
|
||
display: grid;
|
||
grid-template-columns: var(--sidebar-w) 1fr var(--rightbar-w);
|
||
gap: var(--layout-gap);
|
||
align-items: start;
|
||
}
|
||
|
||
.app-layout.with-sidebar:not(.with-rightbar) {
|
||
display: grid;
|
||
grid-template-columns: var(--sidebar-w) 1fr;
|
||
gap: var(--layout-gap);
|
||
align-items: start;
|
||
}
|
||
|
||
/* Если нет сайдбаров - применяем стандартные max-width и padding */
|
||
.app-layout:not(.with-sidebar):not(.with-rightbar) .content-container {
|
||
padding-left: var(--bs-gutter-x, 0.75rem);
|
||
padding-right: var(--bs-gutter-x, 0.75rem);
|
||
max-width: 960px;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 1200px) {
|
||
.app-layout:not(.with-sidebar):not(.with-rightbar) .content-container {
|
||
max-width: 1140px;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 1400px) {
|
||
.app-layout:not(.with-sidebar):not(.with-rightbar) .content-container {
|
||
max-width: 1320px;
|
||
}
|
||
}
|
||
|
||
/* Компенсация для .row внутри .content-container при grid-layout */
|
||
@media (min-width: 992px) {
|
||
.app-layout.with-sidebar .content-container > .row,
|
||
.app-layout.with-rightbar .content-container > .row {
|
||
margin-left: 0;
|
||
margin-right: 0;
|
||
}
|
||
|
||
/* Убираем gutter для прямых колонок в row, чтобы не было переполнения */
|
||
.app-layout.with-sidebar .content-container > .row > [class*="col-"],
|
||
.app-layout.with-rightbar .content-container > .row > [class*="col-"] {
|
||
padding-left: calc(var(--bs-gutter-x) * 0.5);
|
||
padding-right: calc(var(--bs-gutter-x) * 0.5);
|
||
}
|
||
|
||
/* Принудительная коррекция для .card внутри колонок */
|
||
.app-layout.with-sidebar .container > .row > [class*="col-"] > .card,
|
||
.app-layout.with-rightbar .container > .row > [class*="col-"] > .card,
|
||
.app-layout.with-sidebar .container > .row > [class*="col-"] > section.card,
|
||
.app-layout.with-rightbar .container > .row > [class*="col-"] > section.card {
|
||
max-width: 100%;
|
||
min-width: 0;
|
||
overflow: hidden;
|
||
}
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
SIDEBAR
|
||
────────────────────────────────────────────────────────────── */
|
||
#sidebar {
|
||
--bs-offcanvas-width: var(--sidebar-w);
|
||
border-radius: 0 13px 13px 0;
|
||
}
|
||
|
||
@media (min-width: 992px) {
|
||
#sidebar.offcanvas-lg {
|
||
position: sticky;
|
||
top: var(--navbar-h);
|
||
height: calc(100dvh - var(--navbar-h));
|
||
align-self: start;
|
||
overflow: auto;
|
||
border-right: .5px solid var(--bs-border-color);
|
||
background: var(--bs-body-bg);
|
||
transform: none !important;
|
||
visibility: visible !important;
|
||
}
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
NOTIFICATION BELL
|
||
────────────────────────────────────────────────────────────── */
|
||
.bell-wrapper {
|
||
position: relative;
|
||
line-height: 1;
|
||
display: inline-block;
|
||
}
|
||
|
||
.bell-dot {
|
||
position: absolute;
|
||
top: -2px;
|
||
right: -2px;
|
||
width: 9px;
|
||
height: 9px;
|
||
border-radius: 999px;
|
||
background: var(--bs-danger);
|
||
color: #fff;
|
||
font-size: 7px;
|
||
line-height: 9px;
|
||
font-weight: 700;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
box-shadow: 0 0 0 1px rgba(255, 255, 255, .65);
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
MOBILE FAB (REMOVED - now using navbar button)
|
||
────────────────────────────────────────────────────────────── */
|
||
/* .calendar-fab {
|
||
position: fixed;
|
||
right: 1rem;
|
||
bottom: 1rem;
|
||
z-index: 1060;
|
||
width: 52px;
|
||
height: 52px;
|
||
border-radius: 9999px;
|
||
box-shadow: 0 8px 24px rgba(0, 0, 0, .18);
|
||
} */
|
||
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
BUTTONS & GHOST BUTTONS
|
||
────────────────────────────────────────────────────────────── */
|
||
.btn-ghost {
|
||
background: color-mix(in srgb, var(--bs-body-bg) 94%, transparent);
|
||
color: var(--bs-body-color);
|
||
padding: var(--space-1);
|
||
border-radius: 999px;
|
||
font-size: .9rem;
|
||
}
|
||
|
||
.btn-ghost:hover {
|
||
background: color-mix(in srgb, var(--bs-body-bg) 88%, transparent);
|
||
}
|
||
|
||
.btn-ghost .bi {
|
||
font-size: 1rem;
|
||
margin-right: .35rem;
|
||
vertical-align: -2px;
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
FEED ELEMENTS
|
||
────────────────────────────────────────────────────────────── */
|
||
/* «Новые сотрудники» и другие информационные блоки */
|
||
.feed-new {
|
||
border-radius: var(--feed-radius);
|
||
border: 1px solid color-mix(in srgb, var(--bs-border-color), transparent 10%);
|
||
background: var(--bs-body-bg);
|
||
box-shadow: var(--feed-shadow);
|
||
padding: var(--card-padding); /* 16px со всех сторон - унифицировано */
|
||
}
|
||
|
||
/* stretched-link не перекрывает футер/формы */
|
||
.card-body .stretched-link::after,
|
||
.feed-img .stretched-link::after {
|
||
z-index: 1;
|
||
}
|
||
|
||
.collapse {
|
||
position: relative;
|
||
z-index: 2;
|
||
}
|
||
|
||
/* подпись «Скрыть/число» у кнопки комментариев по aria-expanded */
|
||
.btn-ghost .txt-close {
|
||
display: none;
|
||
}
|
||
|
||
.btn-ghost[aria-expanded="true"] .txt-open {
|
||
display: none;
|
||
}
|
||
|
||
.btn-ghost[aria-expanded="true"] .txt-close {
|
||
display: inline;
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
ALPHA HEADERS (буквенные разделители)
|
||
────────────────────────────────────────────────────────────── */
|
||
.alpha-header {
|
||
position: sticky;
|
||
top: calc(var(--navbar-h) + var(--space-1)); /* +8px - унифицировано */
|
||
z-index: 1;
|
||
background: color-mix(in srgb, var(--bs-body-bg) 92%, transparent);
|
||
backdrop-filter: blur(6px);
|
||
border: 1px solid color-mix(in srgb, var(--bs-border-color), transparent 30%);
|
||
color: var(--bs-secondary-color);
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: var(--space-1); /* 8px - унифицировано */
|
||
padding: var(--space-1); /* 8px - унифицировано */
|
||
border-radius: 999px;
|
||
font-weight: 700;
|
||
font-size: .85rem;
|
||
margin: var(--space-1) 0 var(--space-1) var(--space-1); /* 8px отступы */
|
||
}
|
||
|
||
.alpha-dot {
|
||
width: 6px;
|
||
height: 6px;
|
||
border-radius: 999px;
|
||
background: var(--bs-primary);
|
||
opacity: .6;
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
ACTION BUTTONS
|
||
────────────────────────────────────────────────────────────── */
|
||
.action-btn {
|
||
min-height: unset;
|
||
padding: var(--space-1); /* 8px - унифицировано */
|
||
}
|
||
|
||
.action-btn .bi {
|
||
font-size: 1rem;
|
||
}
|
||
|
||
/* ─────────────────────────────────────────────────────────────
|
||
TEXT UTILITIES
|
||
────────────────────────────────────────────────────────────── */
|
||
/* Переносим длинные слова/ссылки, сохраняем переносы строк */
|
||
.feed-text,
|
||
.feed-full {
|
||
overflow-wrap: anywhere;
|
||
width: 100%;
|
||
margin-right: 0;
|
||
padding-right: 0;
|
||
}
|
||
|
||
/* чтобы кнопка «Подробнее» не была перекрыта stretched-link */
|
||
.readmore-toggle {
|
||
position: relative;
|
||
z-index: 2;
|
||
}
|