Corp/backend/static/scss/layout/_rightbar.scss
Игорь Надеин 9df9f78666 refactor: Complete SCSS architecture reorganization
SCSS Architecture 2.0 - Feature-based structure

### Major Changes:
- ✅ Reorganized 51 SCSS files into logical categories
- ✅ Created feature-based structure: core/, layout/, features/, utilities/
- ✅ Merged duplicate components: badges (2→1), modals (3→1), lists (2→1), spacing (2→1)
- ✅ Renamed files: ios-search→search, team-wheel→team-viz, recipientPicker→recipient-picker
- ✅ Cleaned custom-bootstrap.scss from all app components
- ✅ Moved chat components from custom-bootstrap to main.scss

### Results:
- Files: 51 → 38 (-13 files, -25%)
- bootstrap-custom.css: 301 KB → 229 KB (-72 KB, -24%)
- app.css: 95 KB → 137 KB (+42 KB, expected)
- Total CSS: 396 KB → 366 KB (-30 KB, -7.5%)

### New Structure:
scss/
├── abstracts/           # Variables, mixins (4 files)
├── core/               # UI Kit - reusable components (9 files)
│   ├── buttons, badges, cards, lists, modals, etc.
├── layout/             # App structure (6 files)
│   ├── grid, navbar, sidebar, rightbar, etc.
├── utilities/          # Utility classes (1 file)
│   └── spacing
└── features/           # Feature-specific styles (18 files in 6 folders)
    ├── feed/          (3 files)
    ├── requests/      (3 files)
    ├── documents/     (1 file)
    ├── employees/     (2 files)
    ├── notifications/ (1 file)
    └── chat/          (10 files)

### Benefits:
- Clear categorization
- No duplicate imports (removed 8 duplicates)
- Logical feature grouping
- Easier maintenance
- Clean architecture
- Better naming conventions

### Documentation:
- scss/README.md - full architecture documentation
- scss/MIGRATION_MATRIX.md - file migration matrix
- docs/reports/SCSS_REORGANIZATION_COMPLETE.md - completion report

Bootstrap remains as base UI framework.
2026-01-15 14:11:14 +03:00

332 lines
8.1 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.

/**
* rightbar-calendar.scss
* Стили для компонента правой панели с календарем
* Включает стили для FullCalendar, вертикальной ленты недели и модалов событий
*/
/* =====================================
БАЗА КАЛЕНДАРЯ
===================================== */
.calendar-wrap {
min-height: 360px;
border-radius: 10px;
overflow: hidden;
background: var(--bs-body-bg);
box-shadow: inset 0 1px 3px color-mix(in srgb, var(--bs-body-color), transparent 92%);
border: 0;
}
.rightbar-card {
height: 100%;
display: flex;
flex-direction: column;
border-radius: 16px;
overflow: hidden;
border: 1px solid color-mix(in srgb, var(--bs-border-color), transparent 10%);
background: var(--bs-body-bg);
box-shadow: 0 1px 2px rgba(0,0,0,.04), 0 8px 24px rgba(0,0,0,.08);
min-height: 0;
.card-header {
flex: 0 0 auto;
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
padding: var(--space-1) var(--space-2);
}
.card-body {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: var(--space-2);
}
}
// Поддержка многострочного header при длинных названиях отделов
.min-w-0 {
min-width: 0;
}
/* =====================================
DESKTOP STICKY LAYOUT
===================================== */
// На десктопе rightbar становится sticky с фиксированной высотой
// Высота = 100vh - navbar - 2*отступ (сверху и снизу)
// top = navbar + отступ сверху
// Не перемещается с основным скролом страницы, скролл только внутри .card-body
@media (min-width: 992px) {
.rightbar {
position: sticky;
top: calc(var(--navbar-h) + var(--layout-padding-y, 12px));
height: calc(100dvh - var(--navbar-h) - 2 * var(--layout-padding-y, 12px));
overflow: hidden;
// padding управляется через Bootstrap классы в шаблоне (px-0, py-3 и т.д.)
}
}
/* =====================================
FULLCALENDAR — КОМПАКТНО
===================================== */
.fc {
font-size: 0.7rem;
--fc-border-color: var(--bs-border-color);
--fc-page-bg-color: transparent;
--fc-neutral-bg-color: transparent;
--fc-today-bg-color: color-mix(in srgb, var(--bs-primary), transparent 85%);
--fc-event-bg-color: var(--bs-primary);
--fc-event-border-color: var(--bs-primary);
--fc-event-text-color: var(--bs-body-bg);
// Убираем границы
.fc-theme-standard .fc-scrollgrid {
border: 0 !important;
}
.fc-theme-standard td,
.fc-theme-standard th {
border: 0 !important;
}
// Toolbar
.fc-toolbar {
padding: var(--space-2);
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
justify-content: space-between;
}
.fc-toolbar-title {
font-size: 1rem;
font-weight: 600;
color: var(--bs-body-color);
}
.fc-button {
border-radius: 8px;
font-size: .82rem;
padding: var(--space-1);
background: transparent;
border: none;
color: var(--bs-primary);
&:hover {
background: rgba(var(--bs-primary-rgb), .1);
}
}
// Day cells
.fc-daygrid-day-frame {
padding: 2px 3px !important;
}
.fc-daygrid-day-number {
font-size: .82rem;
width: 100%;
height: 1.6rem;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
color: var(--bs-body-color);
text-decoration: none !important;
}
.fc-day-today {
background: none !important;
.fc-daygrid-day-number {
color: var(--bs-primary);
font-weight: 700;
border: 1px solid var(--bs-primary);
border-radius: 50%;
}
}
.fc-day-other .fc-daygrid-day-number {
opacity: .4;
}
// Events
.fc-daygrid-day-events {
padding: 0 2px 2px !important;
row-gap: 2px !important;
}
.fc-daygrid-event-harness {
margin: 0 0 2px 0 !important;
}
.fc-daygrid-event {
border-radius: 6px;
padding: var(--space-1) !important;
line-height: 1.02 !important;
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 75%);
border: 1px solid color-mix(in srgb, var(--bs-primary), transparent 60%);
color: var(--bs-body-color);
.fc-event-time {
display: none !important;
}
.fc-event-title {
font-size: .62rem !important;
line-height: 1.02 !important;
letter-spacing: -0.2px;
font-weight: 600;
font-family: "Arial Narrow","Roboto Condensed",system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
display: -webkit-box !important;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden !important;
white-space: normal !important;
text-overflow: ellipsis;
max-height: calc(1.02em * 3);
}
}
}
/* =====================================
ВЕРТИКАЛЬНАЯ ЛЕНТА НЕДЕЛИ
===================================== */
.week-strip-header {
margin-top: var(--space-2);
display: flex;
align-items: center;
justify-content: space-between;
color: var(--bs-secondary-color);
font-size: .8rem;
}
.week-vertical {
margin-top: var(--space-1);
display: flex;
flex-direction: column;
gap: var(--space-1);
.week-row {
display: grid;
grid-template-columns: 56px 1fr;
align-items: start;
gap: var(--space-1);
padding: var(--space-1);
border-radius: 12px;
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 86%);
border: 1px solid color-mix(in srgb, var(--bs-primary), transparent 70%);
&:hover {
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 82%);
}
}
.content {
.title {
font-size: .8rem;
font-weight: 600;
color: var(--bs-body-color);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
.meta {
margin-top: .15rem;
font-size: .72rem;
color: var(--bs-secondary-color);
}
}
}
.date-badge {
display: grid;
place-items: center;
border-radius: 10px;
padding: .35rem .25rem;
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 92%);
border: 1px solid color-mix(in srgb, var(--bs-primary), transparent 75%);
text-align: center;
line-height: 1.05;
.dow {
font-size: .7rem;
font-weight: 700;
color: var(--bs-primary);
text-transform: uppercase;
}
.md {
font-size: .74rem;
font-weight: 700;
color: var(--bs-body-color);
}
}
/* =====================================
OFFCANVAS (МОБАЙЛ)
===================================== */
#rightbarOffcanvas {
height: 100dvh;
height: 100svh;
.offcanvas-body {
display: flex;
flex-direction: column;
gap: var(--space-1);
height: calc(100dvh - var(--rb-offcanvas-head, 56px));
height: calc(100svh - var(--rb-offcanvas-head, 56px));
min-height: 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.calendar-wrap {
flex: 0 0 auto;
}
.week-vertical {
flex: 0 0 auto;
}
}
/* =====================================
COLOR PICKER (PALETTE)
===================================== */
.color-swatch {
width: 26px;
height: 26px;
border: 1px solid var(--bs-border-color);
border-radius: 9999px;
padding: 0;
cursor: pointer;
background: transparent;
&.active {
outline: 2px solid var(--bs-primary);
outline-offset: 2px;
}
}
/* =====================================
EVENT DETAILS MODAL
===================================== */
.color-dot {
width: 12px;
height: 12px;
border-radius: 9999px;
display: inline-block;
vertical-align: middle;
margin-right: 6px;
border: 1px solid #00000022;
}