Files
cbsnexora/src/app/election/components/committee-board/committee-board.component.scss
T

1976 lines
38 KiB
SCSS

/**
* Copyright since 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
// ── Theme Variables ──────────────────────────────────────────────────
$primary: #6366f1; // Indigo
$primary-light: #818cf8;
$primary-dark: #4f46e5;
$accent: #a855f7; // Purple
$accent-dark: #7c3aed;
$text-main: #0f172a; // Slate 900
$text-sub: #475569; // Slate 600
$text-muted: #94a3b8; // Slate 400
$bg-main: #f8fafc; // Slate 50
$bg-card: rgb(255 255 255 / 75%);
$border-glass: 1px solid rgb(226 232 240 / 70%);
$border-focus: 1px solid rgb(99 102 241 / 50%);
$radius-card: 16px; // Compact: was 20px
$radius-btn: 10px; // Compact: was 12px
$radius-pill: 24px; // Compact: was 30px
$shadow-sm: 0 2px 6px rgb(15 23 42 / 4%);
$shadow-md: 0 8px 24px -8px rgb(15 23 42 / 8%);
$shadow-lg: 0 16px 32px -12px rgb(15 23 42 / 12%);
$shadow-glow: 0 0 16px rgb(99 102 241 / 12%);
$font-family:
'Inter',
-apple-system,
blinkmacsystemfont,
'Segoe UI',
sans-serif;
// ── General Layout ───────────────────────────────────────────────────
.committee-page {
position: relative;
padding: 24px; // Compact: was 40px
background: $bg-main;
min-height: 100vh;
font-family: $font-family;
color: $text-main;
box-sizing: border-box;
overflow-x: hidden;
}
// Ambient Background Glows (Slightly smaller blur/blobs)
.ambient-glow {
position: absolute;
border-radius: 50%;
filter: blur(100px);
z-index: 0;
pointer-events: none;
opacity: 0.2;
&.blob-1 {
top: -10%;
right: 5%;
width: 380px;
height: 380px;
background: radial-gradient(circle, rgb(99 102 241 / 40%) 0%, rgb(168 85 247 / 20%) 100%);
}
&.blob-2 {
bottom: 10%;
left: -5%;
width: 340px;
height: 340px;
background: radial-gradient(circle, rgb(168 85 247 / 30%) 0%, rgb(99 102 241 / 10%) 100%);
}
&.blob-3 {
top: 40%;
right: -10%;
width: 300px;
height: 300px;
background: radial-gradient(circle, rgb(99 102 241 / 20%) 0%, rgb(244 63 94 / 15%) 100%);
}
}
// ── Header Area ──────────────────────────────────────────────────────
.page-header {
position: relative;
z-index: 1;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 24px; // Compact: was 36px
flex-wrap: wrap;
.header-left {
display: flex;
align-items: center;
gap: 12px;
}
h2 {
font-size: 21px; // Compact: was 26px
font-weight: 800;
margin: 0 0 3px;
letter-spacing: -0.5px;
background: linear-gradient(135deg, $text-main 0%, #3b0764 100%);
background-clip: text;
-webkit-text-fill-color: transparent;
}
.header-sub {
font-size: 13px; // Compact: was 14px
color: $text-sub;
margin: 0;
font-weight: 500;
}
}
.back-btn {
width: 36px; // Compact: was 44px
height: 36px; // Compact: was 44px
border-radius: 50%;
background: rgb(255 255 255 / 85%);
border: $border-glass;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
color: $text-sub;
box-shadow: $shadow-sm;
transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
flex-shrink: 0;
backdrop-filter: blur(8px);
mat-icon {
font-size: 18px; // Compact: was 20px
height: 18px;
width: 18px;
transition: transform 0.2s;
}
&:hover {
color: $primary-dark;
background: #fff;
box-shadow: $shadow-md;
transform: translateX(-2px);
mat-icon {
transform: scale(1.08);
}
}
}
.btn-create {
display: inline-flex;
align-items: center;
gap: 6px;
background: linear-gradient(135deg, $primary 0%, $primary-dark 100%);
color: #fff;
border: none;
border-radius: $radius-pill;
padding: 8px 18px; // Compact: was 12px 24px
font-size: 13px; // Compact: was 14px
font-weight: 600;
cursor: pointer;
box-shadow: 0 4px 14px rgb(99 102 241 / 20%);
transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
mat-icon {
font-size: 18px; // Compact: was 20px
height: 18px;
width: 18px;
}
&:hover {
transform: translateY(-1.5px);
box-shadow: 0 6px 18px rgb(99 102 241 / 30%);
background: linear-gradient(135deg, $primary-light 0%, $primary-dark 100%);
}
&:active {
transform: translateY(0);
}
}
// ── States ───────────────────────────────────────────────────────────
.loading-state,
.empty-state {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 16px;
padding: 60px 20px; // Compact: was 100px 24px
text-align: center;
color: $text-sub;
background: $bg-card;
backdrop-filter: blur(16px);
border-radius: $radius-card;
border: $border-glass;
box-shadow: $shadow-md;
max-width: 500px;
margin: 30px auto;
h3 {
font-size: 17px; // Compact: was 20px
font-weight: 700;
color: $text-main;
margin: 0;
}
p {
font-size: 13px; // Compact: was 14px
max-width: 320px;
margin: 0;
line-height: 1.5;
}
}
.empty-icon {
font-size: 48px; // Compact: was 64px
height: 48px;
width: 48px;
color: $primary-light;
opacity: 0.6;
}
.spinner {
width: 36px; // Compact: was 44px
height: 36px;
border: 3px solid rgb(99 102 241 / 10%);
border-top-color: $primary;
border-radius: 50%;
animation: spin 0.8s cubic-bezier(0.5, 0.1, 0.4, 0.9) infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
// ── Committees Grid ──────────────────────────────────────────────────
.committees-grid {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(310px, 1fr)); // Compact: was 360px
gap: 20px; // Compact: was 28px
}
// ── Committee Card ───────────────────────────────────────────────────
.committee-card {
background: $bg-card;
backdrop-filter: blur(16px);
border-radius: $radius-card;
border: $border-glass;
box-shadow: $shadow-md;
padding: 18px; // Compact: was 24px
display: flex;
flex-direction: column;
gap: 12px; // Compact: was 16px
transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px; // Compact: was 4px
background: linear-gradient(90deg, $primary 0%, $accent 100%);
opacity: 0;
transition: opacity 0.3s ease;
}
&:hover {
box-shadow: $shadow-lg;
transform: translateY(-3px);
border-color: rgb(99 102 241 / 25%);
&::before {
opacity: 1;
}
}
&.dissolved {
opacity: 0.6;
background: rgb(241 245 249 / 60%);
&::before {
background: #94a3b8;
}
}
}
.card-header {
display: flex;
align-items: center;
gap: 12px;
}
.committee-icon {
width: 42px; // Compact: was 52px
height: 42px; // Compact: was 52px
border-radius: 10px; // Compact: was 14px
background: linear-gradient(135deg, $primary 0%, $accent 100%);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
box-shadow: 0 3px 8px rgb(99 102 241 / 15%);
mat-icon {
font-size: 20px; // Compact: was 24px
height: 20px;
width: 20px;
color: #fff;
}
}
.committee-img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 10px;
}
.clickable-photo {
cursor: zoom-in;
transition:
transform 0.2s,
opacity 0.2s;
&:hover {
opacity: 0.9;
transform: scale(1.03);
}
}
.committee-meta {
flex: 1;
min-width: 0;
h3 {
font-size: 15px; // Compact: was 18px
font-weight: 750;
margin: 0 0 4px;
color: $text-main;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.status-chip {
font-size: 8px; // Compact: was 9px
font-weight: 700;
padding: 2px 8px; // Compact: was 3px 10px
border-radius: $radius-pill;
text-transform: uppercase;
letter-spacing: 0.5px;
display: inline-block;
box-shadow: inset 0 1px 0 rgb(255 255 255 / 20%);
}
.statusColor {
&.active {
background: rgb(16 185 129 / 12%) !important;
color: #10b981 !important;
}
&.dissolved {
background: rgb(148 163 184 / 12%) !important;
color: #94a3b8 !important;
}
}
.committee-desc {
font-size: 13px; // Compact: was 14px
color: $text-sub;
margin: 0;
line-height: 1.5;
}
.member-count-row {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px; // Compact: was 13px
font-weight: 600;
color: $text-sub;
mat-icon {
font-size: 16px; // Compact: was 18px
height: 16px;
width: 16px;
color: $primary-light;
}
}
// ── Overlapping Member Avatars ───────────────────────────────────────
.member-avatars {
display: flex;
align-items: center;
padding-left: 6px;
margin-bottom: 2px;
}
.member-avatar {
width: 30px; // Compact: was 36px
height: 30px; // Compact: was 36px
border-radius: 50%;
background: linear-gradient(135deg, $primary-light 0%, $accent 100%);
color: #fff;
font-size: 11px; // Compact: was 13px
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
border: 2px solid #fff; // Compact: was 3px
margin-left: -8px; // Compact: was -10px
overflow: hidden;
flex-shrink: 0;
box-shadow: 0 1px 4px rgb(0 0 0 / 6%);
transition:
transform 0.2s ease,
z-index 0.2s;
&:hover {
transform: translateY(-3px) scale(1.08);
z-index: 10;
}
&:first-child {
margin-left: 0;
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.more-avatar {
background: #f1f5f9;
color: $text-sub;
font-size: 10px;
font-weight: 600;
border-color: #fff;
}
// ── Detailed Member List ─────────────────────────────────────────────
.member-list {
display: flex;
flex-direction: column;
gap: 8px; // Compact: was 10px
border-top: $border-glass;
padding-top: 12px; // Compact: was 16px
}
.member-row {
display: flex;
align-items: center;
gap: 10px;
padding: 2px 0;
}
.member-avatar-sm {
width: 28px; // Compact: was 34px
height: 28px; // Compact: was 34px
border-radius: 50%;
background: linear-gradient(135deg, $primary 0%, $accent 100%);
color: #fff;
font-size: 11px; // Compact: was 12px
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
box-shadow: $shadow-sm;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.member-info {
flex: 1;
min-width: 0;
.member-name {
display: block;
font-size: 13px; // Compact: was 14px
font-weight: 600;
color: $text-main;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.member-desig {
display: inline-block;
font-size: 10px; // Compact: was 11px
font-weight: 650;
color: $accent-dark;
background: rgb(168 85 247 / 7%);
padding: 0 6px;
border-radius: $radius-pill;
margin-top: 1px;
}
}
// ── Collapsible Meetings Panel ────────────────────────────────────────
.meetings-section {
border-top: $border-glass;
margin-top: 4px;
}
.meetings-toggle {
display: flex;
align-items: center;
gap: 6px;
width: 100%;
padding: 10px 2px; // Compact: was 14px 4px
background: none;
border: none;
cursor: pointer;
font-size: 13px; // Compact: was 14px
font-weight: 700;
color: $text-sub;
text-align: left;
transition: all 0.2s ease;
mat-icon {
font-size: 16px;
height: 16px;
width: 16px;
color: $text-muted;
transition: color 0.2s;
}
.chevron {
margin-left: auto;
font-size: 18px;
height: 18px;
width: 18px;
color: $text-muted;
transition: transform 0.2s;
}
&.expanded {
color: $primary-dark;
mat-icon {
color: $primary-dark;
}
}
&:hover {
color: $text-main;
mat-icon {
color: $text-main;
}
}
}
.meeting-count-badge {
background: $primary;
color: #fff;
font-size: 9px;
font-weight: 700;
padding: 1px 5px;
border-radius: $radius-pill;
min-width: 15px;
text-align: center;
box-shadow: 0 2px 4px rgb(99 102 241 / 25%);
}
.meetings-panel {
padding: 2px 0 10px;
display: flex;
flex-direction: column;
gap: 10px; // Compact: was 12px
animation: slide-down 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes slide-down {
from {
opacity: 0;
transform: translateY(-6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.btn-schedule {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 12px; // Compact: was 8px 16px
border: 1.5px dashed rgb(99 102 241 / 30%);
border-radius: 8px;
background: rgb(99 102 241 / 3%);
color: $primary-dark;
font-size: 11px; // Compact: was 12px
font-weight: 650;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
align-self: flex-start;
mat-icon {
font-size: 14px;
height: 14px;
width: 14px;
}
&:hover {
background: rgb(99 102 241 / 6%);
border-color: $primary;
box-shadow: $shadow-glow;
}
}
.meetings-empty {
display: flex;
align-items: center;
gap: 6px;
padding: 10px 12px; // Compact
font-size: 12px;
color: $text-muted;
background: rgb(241 245 249 / 40%);
border-radius: 8px;
border: 1px solid rgb(226 232 240 / 40%);
mat-icon {
font-size: 16px;
height: 16px;
width: 16px;
}
}
.meeting-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.meeting-row {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 10px 12px; // Compact: was 12px 14px
background: #f8fafc;
border-radius: 10px; // Compact: was 12px
border: 1px solid #e2e8f0;
transition: all 0.2s ease;
&:hover {
background: #f1f5f9;
border-color: #cbd5e1;
transform: translateX(1px);
}
}
.meeting-mode-icon {
width: 28px; // Compact: was 32px
height: 28px; // Compact: was 32px
border-radius: 8px;
background: rgb(99 102 241 / 6%);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
mat-icon {
font-size: 14px;
height: 14px;
width: 14px;
color: $primary;
}
}
.meeting-info {
flex: 1;
min-width: 0;
}
.meeting-title {
display: block;
font-size: 13px; // Compact: was 14px
font-weight: 700;
color: $text-main;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 2px;
}
.meeting-meta-row {
display: flex;
align-items: center;
gap: 5px;
flex-wrap: wrap;
font-size: 11px; // Compact: was 12px
color: $text-sub;
font-weight: 500;
.meta-icon {
font-size: 12px;
height: 12px;
width: 12px;
color: $text-muted;
}
.meta-sep {
color: #cbd5e1;
font-weight: 300;
}
}
.meeting-status-chip {
font-size: 8px;
font-weight: 750;
padding: 1px 6px;
border-radius: 5px;
text-transform: uppercase;
letter-spacing: 0.4px;
box-shadow: inset 0 1px 0 rgb(255 255 255 / 15%);
}
.meeting-platform-row {
display: flex;
align-items: center;
gap: 5px;
margin-top: 4px;
font-size: 11px;
color: $text-sub;
font-weight: 500;
.meta-icon {
font-size: 12px;
height: 12px;
width: 12px;
color: $text-muted;
}
}
.join-link {
display: inline-flex;
align-items: center;
gap: 2px;
color: $primary-dark;
font-size: 11px;
font-weight: 700;
text-decoration: none;
margin-left: 4px;
padding: 1px 6px;
border-radius: 5px;
background: rgb(99 102 241 / 5%);
transition: all 0.2s;
mat-icon {
font-size: 11px;
height: 11px;
width: 11px;
}
&:hover {
background: rgb(99 102 241 / 10%);
text-decoration: none;
box-shadow: $shadow-sm;
}
}
.meeting-actions {
display: flex;
align-items: center;
gap: 3px;
flex-shrink: 0;
}
.btn-icon {
width: 24px; // Compact: was 28px
height: 24px; // Compact: was 28px
border-radius: 6px;
border: none;
background: none;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: $text-sub;
transition: all 0.2s;
mat-icon {
font-size: 14px;
height: 14px;
width: 14px;
}
&:hover {
background: #e2e8f0;
color: $text-main;
}
&.green:hover {
background: #dcfce7;
color: #10b981;
}
&.red:hover {
background: #fee2e2;
color: #f59e0b;
}
&.danger:hover {
background: rgb(239 68 68 / 10%);
color: #ef4444;
}
&.purple:hover {
background: rgb(124 58 237 / 10%);
color: #7c3aed;
}
}
// ── Card Actions (Bottom) ────────────────────────────────────────────
.card-actions {
display: flex;
gap: 10px;
margin-top: auto;
border-top: $border-glass;
padding-top: 12px;
}
.btn-edit,
.btn-dissolve {
flex: 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 5px;
padding: 8px 0; // Compact: was 10px
border-radius: 8px; // Compact: was 10px
font-size: 12px; // Compact: was 13px
font-weight: 700;
cursor: pointer;
transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
}
.btn-edit {
border: 1px solid #e2e8f0;
background: #fff;
color: $text-sub;
mat-icon {
font-size: 14px;
height: 14px;
width: 14px;
}
&:hover {
background: #f1f5f9;
color: $text-main;
border-color: #cbd5e1;
box-shadow: $shadow-sm;
}
}
.btn-dissolve {
border: 1px solid rgb(239 68 68 / 15%);
background: rgb(239 68 68 / 1%);
color: #ef4444;
mat-icon {
font-size: 14px;
height: 14px;
width: 14px;
}
&:hover {
background: rgb(239 68 68 / 6%);
border-color: #ef4444;
box-shadow: 0 3px 8px rgb(239 68 68 / 8%);
}
}
.dissolved-label {
display: flex;
align-items: center;
gap: 5px;
font-size: 12px;
font-weight: 700;
color: $text-muted;
background: rgb(148 163 184 / 6%);
padding: 5px 12px;
border-radius: 6px;
mat-icon {
font-size: 16px;
height: 16px;
width: 16px;
}
}
// ── Overlays, Drawers and Modals (Glassmorphic) ──────────────────────
.overlay {
position: fixed;
inset: 0;
background: rgb(15 23 42 / 30%); // Less dark overlay
z-index: 100;
backdrop-filter: blur(6px);
animation: fade-in 0.3s ease forwards;
}
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.form-drawer {
position: fixed;
top: 0;
right: 0;
bottom: 0;
width: 410px; // Compact: was 480px
max-width: 100vw;
background: rgb(255 255 255 / 95%);
backdrop-filter: blur(20px);
z-index: 101;
display: flex;
flex-direction: column;
box-shadow: -8px 0 30px rgb(15 23 42 / 12%);
border-left: $border-glass;
animation: slide-in-right 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes slide-in-right {
from {
transform: translateX(100%);
}
to {
transform: translateX(0);
}
}
.drawer-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 20px; // Compact: was 24px
border-bottom: $border-glass;
flex-shrink: 0;
h3 {
font-size: 17px; // Compact: was 20px
font-weight: 800;
margin: 0;
background: linear-gradient(135deg, $text-main 0%, $accent-dark 100%);
background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.close-btn {
width: 30px; // Compact: was 36px
height: 30px; // Compact: was 36px
border-radius: 50%;
border: none;
background: #f1f5f9;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: $text-sub;
transition: all 0.2s;
mat-icon {
font-size: 18px; // Compact: was 20px
height: 18px;
width: 18px;
}
&:hover {
background: #e2e8f0;
color: $text-main;
transform: rotate(90deg);
}
}
.drawer-body {
flex: 1;
overflow-y: auto;
padding: 20px; // Compact: was 24px
display: flex;
flex-direction: column;
gap: 16px; // Compact: was 20px
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: rgb(99 102 241 / 20%);
border-radius: 2px;
}
}
// ── Image Upload Component ───────────────────────────────────────────
.image-upload-section {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
padding: 10px 0;
}
.image-upload-ring {
width: 90px; // Compact: was 110px
height: 90px; // Compact: was 110px
border-radius: 50%;
border: 2px dashed #cbd5e1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
position: relative;
overflow: hidden;
transition: all 0.25s ease;
background: #f8fafc;
box-shadow: inset 0 2px 4px rgb(0 0 0 / 3%);
&:hover {
border-color: $primary;
background: rgb(99 102 241 / 3%);
box-shadow: $shadow-glow;
.upload-overlay {
opacity: 1;
}
}
}
.upload-preview {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
.upload-overlay {
position: absolute;
inset: 0;
border-radius: 50%;
background: rgb(15 23 42 / 60%);
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
opacity: 0;
transition: opacity 0.25s;
mat-icon {
color: #fff;
font-size: 20px;
height: 20px;
width: 20px;
}
.view-icon {
font-size: 18px;
height: 18px;
width: 18px;
opacity: 0.85;
cursor: zoom-in;
&:hover {
opacity: 1;
transform: scale(1.1);
}
}
}
.upload-placeholder-icon {
font-size: 26px; // Compact: was 32px
height: 26px;
width: 26px;
color: $text-muted;
margin-bottom: 2px;
}
.upload-placeholder-text {
font-size: 10px;
font-weight: 700;
color: $text-muted;
letter-spacing: 0.4px;
}
.btn-remove-image {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 12px; // Compact
border: 1px solid rgb(239 68 68 / 20%);
border-radius: 16px;
background: #fff;
font-size: 11px;
font-weight: 600;
color: #ef4444;
cursor: pointer;
transition: all 0.2s;
mat-icon {
font-size: 13px;
height: 13px;
width: 13px;
}
&:hover {
background: rgb(239 68 68 / 5%);
box-shadow: $shadow-sm;
}
}
// ── Interactive Form Controls ───────────────────────────────────────
.form-group {
display: flex;
flex-direction: column;
gap: 4px;
label {
font-size: 10px; // Compact: was 11px
font-weight: 700;
color: $text-sub;
text-transform: uppercase;
letter-spacing: 0.5px;
}
input,
textarea {
padding: 10px 12px; // Compact: was 12px 14px
border: 1.5px solid #e2e8f0;
border-radius: 8px;
font-size: 13px; // Compact: was 14px
color: $text-main;
font-family: $font-family;
outline: none;
transition: all 0.2s ease;
background: #fff;
&:focus {
border-color: $primary;
box-shadow: 0 0 0 3px rgb(99 102 241 / 8%);
}
&.input-error {
border-color: #ef4444;
&:focus {
box-shadow: 0 0 0 3px rgb(239 68 68 / 8%);
}
}
}
}
.error-msg {
font-size: 11px;
color: #ef4444;
margin-top: 1px;
font-weight: 500;
}
.req {
color: #ef4444;
margin-left: 2px;
}
.section-title {
font-size: 10px; // Compact: was 11px
font-weight: 850;
color: $text-sub;
text-transform: uppercase;
letter-spacing: 0.7px;
padding-bottom: 6px;
border-bottom: $border-glass;
margin-top: 6px;
}
// ── Director Select List (Interactive Cards) ─────────────────────────
.director-select-list {
display: flex;
flex-direction: column;
gap: 6px;
}
.director-option {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px; // Compact: was 12px 14px
border: 1.5px solid #e2e8f0;
border-radius: 10px;
cursor: pointer;
transition: all 0.2s ease;
background: #fff;
&:hover {
border-color: $primary;
background: rgb(99 102 241 / 2%);
}
&.selected {
border-color: $primary;
background: rgb(99 102 241 / 4%);
box-shadow: 0 3px 8px rgb(99 102 241 / 3%);
}
}
.dir-avatar {
width: 34px; // Compact: was 42px
height: 34px; // Compact: was 42px
border-radius: 50%;
background: linear-gradient(135deg, $primary-light 0%, $accent 100%);
color: #fff;
font-size: 14px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
box-shadow: $shadow-sm;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.dir-info {
flex: 1;
min-width: 0;
.dir-name {
display: block;
font-size: 13px; // Compact: was 14px
font-weight: 700;
color: $text-main;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.dir-desig {
display: block;
font-size: 10px;
color: $text-sub;
margin-top: 1px;
font-weight: 500;
}
}
.dir-check {
flex-shrink: 0;
.check-icon {
font-size: 18px; // Compact: was 22px
height: 18px;
width: 18px;
color: $primary;
}
.uncheck-icon {
font-size: 18px; // Compact: was 22px
height: 18px;
width: 18px;
color: #cbd5e1;
}
}
.selected-count {
font-size: 12px;
font-weight: 700;
color: $primary-dark;
text-align: right;
margin-top: 2px;
}
// ── Drawer Footer ────────────────────────────────────────────────────
.drawer-footer {
display: flex;
gap: 10px;
padding: 14px 20px; // Compact: was 20px 24px
border-top: $border-glass;
flex-shrink: 0;
background: #fafbfe;
}
.btn-cancel {
flex: 1;
padding: 10px;
border: 1.5px solid #e2e8f0;
border-radius: 10px;
background: #fff;
font-size: 13px;
font-weight: 700;
color: $text-sub;
cursor: pointer;
transition: all 0.2s;
&:hover {
background: #f1f5f9;
color: $text-main;
border-color: #cbd5e1;
}
}
.btn-save {
flex: 2;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 10px;
border: none;
border-radius: 10px;
background: linear-gradient(135deg, $primary 0%, $primary-dark 100%);
color: #fff;
font-size: 13px;
font-weight: 700;
cursor: pointer;
box-shadow: 0 3px 10px rgb(99 102 241 / 20%);
transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
mat-icon {
font-size: 16px;
height: 16px;
width: 16px;
}
&:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 5px 14px rgb(99 102 241 / 25%);
}
&:disabled {
opacity: 0.55;
cursor: not-allowed;
}
}
// ── Meeting Drawer specific sizing ───────────────────────────────────
.meeting-drawer {
width: 440px; // Compact: was 520px
}
.mode-toggle {
display: flex;
gap: 8px;
}
.mode-btn {
flex: 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 10px;
border: 1.5px solid #e2e8f0;
border-radius: 10px;
background: #fff;
font-size: 12px;
font-weight: 700;
color: $text-sub;
cursor: pointer;
transition: all 0.2s ease;
mat-icon {
font-size: 16px;
height: 16px;
width: 16px;
}
&.active {
border-color: $primary;
background: rgb(99 102 241 / 5%);
color: $primary;
}
&:hover:not(.active) {
background: #f8fafc;
border-color: #cbd5e1;
}
}
.mode-fields-group {
display: flex;
flex-direction: column;
gap: 10px;
padding: 12px;
border-radius: 10px;
border: 1.5px solid rgb(226 232 240 / 80%);
background: #f8fafc;
}
.mode-label {
display: flex;
align-items: center;
gap: 4px;
font-size: 10px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.6px;
mat-icon {
font-size: 14px;
height: 14px;
width: 14px;
}
&.online-label {
color: #2563eb;
mat-icon {
color: #2563eb;
}
}
&.offline-label {
color: #16a34a;
mat-icon {
color: #16a34a;
}
}
}
.form-row-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
// ── Agenda Items list design ─────────────────────────────────────────
.agenda-list {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 8px;
}
.agenda-item-row {
display: flex;
align-items: center;
gap: 8px;
.agenda-num {
font-size: 12px;
font-weight: 700;
color: $text-muted;
min-width: 16px;
text-align: right;
flex-shrink: 0;
}
input {
flex: 1;
}
}
.btn-remove-agenda {
background: none;
border: none;
cursor: pointer;
color: #ef4444;
padding: 4px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 6px;
flex-shrink: 0;
transition: all 0.2s;
mat-icon {
font-size: 18px;
height: 18px;
width: 18px;
}
&:hover {
background: rgb(239 68 68 / 6%);
}
}
.btn-add-agenda {
display: inline-flex;
align-items: center;
gap: 4px;
background: none;
border: 1.5px dashed #cbd5e1;
border-radius: 8px;
cursor: pointer;
color: $primary-dark;
padding: 6px 12px;
font-size: 11px;
font-weight: 700;
transition: all 0.2s;
align-self: flex-start;
mat-icon {
font-size: 16px;
height: 16px;
width: 16px;
}
&:hover {
border-color: $primary;
background: rgb(99 102 241 / 3%);
}
}
// ── Vote Summary & Resolution Modal (Glassmorphic) ───────────────────
.modal-backdrop {
position: fixed;
inset: 0;
background: rgb(15 23 42 / 30%);
z-index: 200;
backdrop-filter: blur(6px);
}
.vote-modal {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 201;
width: min(840px, calc(100vw - 24px)); // Compact: was 920px
max-height: calc(100vh - 48px); // Compact
background: rgb(255 255 255 / 95%);
backdrop-filter: blur(24px);
border-radius: 16px; // Compact: was 24px
box-shadow: 0 20px 50px rgb(15 23 42 / 20%);
border: $border-glass;
display: flex;
flex-direction: column;
overflow: hidden;
animation: zoom-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
@keyframes zoom-in {
from {
opacity: 0;
transform: translate(-50%, -46%) scale(0.96);
}
to {
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
}
.vm-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px 18px; // Compact: was 20px 24px
background: linear-gradient(135deg, rgb(99 102 241 / 8%) 0%, rgb(168 85 247 / 8%) 100%);
border-bottom: 1px solid rgb(124 58 237 / 15%);
flex-shrink: 0;
.vm-header-left {
display: flex;
align-items: center;
gap: 10px;
}
.vm-icon {
font-size: 24px; // Compact: was 28px
width: 24px;
height: 24px;
color: $accent-dark;
flex-shrink: 0;
}
.vm-title {
font-size: 15px; // Compact: was 18px
font-weight: 800;
color: $text-main;
line-height: 1.2;
}
.vm-subtitle {
font-size: 11px; // Compact: was 13px
font-weight: 600;
color: $accent-dark;
margin-top: 2px;
}
.vm-header-right {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
}
.vm-close {
width: 28px; // Compact: was 32px
height: 28px;
border-radius: 50%;
border: none;
background: rgb(15 23 42 / 6%);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: $text-sub;
flex-shrink: 0;
transition: all 0.2s;
mat-icon {
font-size: 16px;
width: 16px;
height: 16px;
}
&:hover {
background: rgb(15 23 42 / 12%);
color: $text-main;
transform: rotate(90deg);
}
}
.vm-body {
flex: 1;
overflow-y: auto;
min-height: 0;
padding: 16px; // Compact: was 24px
display: grid;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); // Compact
gap: 14px; // Compact: was 20px
align-content: start;
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: rgb(124 58 237 / 20%);
border-radius: 2px;
}
}
.vm-footer {
display: flex;
gap: 10px;
padding: 12px 18px; // Compact: was 16px 24px
border-top: 1px solid #e2e8f0;
flex-shrink: 0;
background: #fafbfe;
justify-content: flex-end;
}
.btn-resend {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 12px; // Compact: was 8px 16px
background: linear-gradient(135deg, $accent 0%, $accent-dark 100%);
color: #fff;
border: none;
border-radius: 6px;
font-size: 11px; // Compact
font-weight: 700;
cursor: pointer;
white-space: nowrap;
transition: all 0.25s;
box-shadow: 0 3px 8px rgb(168 85 247 / 15%);
mat-icon {
font-size: 14px;
width: 14px;
height: 14px;
}
&:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 5px 12px rgb(168 85 247 / 25%);
}
&:disabled {
opacity: 0.55;
cursor: not-allowed;
}
}
.vote-item-card {
background: #fff;
border: 1.5px solid #e2e8f0;
border-radius: 12px; // Compact
box-shadow: $shadow-sm;
overflow: hidden;
transition: all 0.25s ease;
display: flex;
flex-direction: column;
&:hover {
border-color: rgb(124 58 237 / 20%);
box-shadow: $shadow-md;
}
.vi-header {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px; // Compact: was 16px
background: #f8fafc;
border-bottom: 1.5px solid #e2e8f0;
.vi-num {
background: $accent-dark;
color: #fff;
border-radius: 50%;
width: 20px; // Compact: was 24px
height: 20px; // Compact: was 24px
min-width: 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px; // Compact
font-weight: 700;
box-shadow: 0 2px 4px rgb(124 58 237 / 20%);
}
.vi-label {
font-size: 12px; // Compact: was 14px
font-weight: 700;
color: $text-main;
line-height: 1.4;
}
}
}
.vote-counts {
display: flex;
gap: 6px;
padding: 10px 12px; // Compact: was 14px 16px
flex-wrap: wrap;
border-bottom: 1px solid #f1f5f9;
.vc {
display: flex;
align-items: center;
gap: 3px;
font-size: 11px; // Compact: was 12px
font-weight: 700;
padding: 3px 8px; // Compact
border-radius: 20px;
box-shadow: inset 0 1px 0 rgb(255 255 255 / 15%);
mat-icon {
font-size: 12px;
width: 12px;
height: 12px;
}
&.approved {
background: #dcfce7;
color: #15803d;
}
&.rejected {
background: #fee2e2;
color: #b91c1c;
}
&.abstain {
background: #fef3c7;
color: #b45309;
}
&.pending {
background: #f1f5f9;
color: #475569;
}
}
}
.resolution-row {
padding: 10px 12px 6px; // Compact
.res-label {
font-size: 10px; // Compact
font-weight: 800;
color: $text-sub;
letter-spacing: 0.5px;
text-transform: uppercase;
display: block;
margin-bottom: 8px;
}
.res-badge {
display: inline-block;
padding: 4px 12px;
border-radius: 20px;
font-size: 11px;
font-weight: 700;
&.res-badge-approved {
background: #dcfce7;
color: #15803d;
}
&.res-badge-rejected {
background: #fee2e2;
color: #b91c1c;
}
&.res-badge-deferred {
background: #fef3c7;
color: #b45309;
}
&.res-badge-pending {
background: #f1f5f9;
color: #94a3b8;
font-style: italic;
font-weight: 400;
}
}
}
.btn-res {
display: flex;
align-items: center;
gap: 3px;
padding: 6px 10px; // Compact
border-radius: 6px;
border: 1.5px solid #e2e8f0;
background: #fff;
font-size: 11px; // Compact
font-weight: 700;
cursor: pointer;
color: $text-sub;
transition: all 0.2s ease;
mat-icon {
font-size: 14px;
width: 14px;
height: 14px;
}
&:hover {
background: #f8fafc;
border-color: #cbd5e1;
}
&.approve.active {
background: rgb(16 185 129 / 10%);
border-color: #10b981;
color: #10b981;
}
&.reject.active {
background: rgb(239 68 68 / 10%);
border-color: #ef4444;
color: #ef4444;
}
&.defer.active {
background: rgb(245 158 11 / 10%);
border-color: #f59e0b;
color: #f59e0b;
}
}
.notes-row {
padding: 4px 12px 12px; // Compact
.notes-input {
width: 100%;
padding: 8px 10px;
font-size: 12px; // Compact
border: 1.5px solid #e2e8f0;
border-radius: 8px; // Compact
resize: vertical;
font-family: inherit;
color: $text-main;
background: #fff;
box-sizing: border-box;
transition: border-color 0.2s;
&:focus {
outline: none;
border-color: $accent;
box-shadow: 0 0 0 3px rgb(168 85 247 / 8%);
}
}
}
.purple-btn {
background: linear-gradient(135deg, $accent 0%, $accent-dark 100%) !important;
color: #fff !important;
border: none !important;
&:hover:not(:disabled) {
background: linear-gradient(135deg, #be185d 0%, $accent-dark 100%) !important;
transform: translateY(-1px);
box-shadow: 0 3px 10px rgb(124 58 237 / 25%);
}
}
// ── Responsive Layout Adaptations ────────────────────────────────────
@media (width <= 900px) {
.vm-body {
grid-template-columns: 1fr;
}
}
@media (width <= 600px) {
.committee-page {
padding: 16px; // Compact
}
.committees-grid {
grid-template-columns: 1fr;
gap: 16px; // Compact
}
.page-header {
margin-bottom: 20px;
h2 {
font-size: 19px;
}
}
.form-drawer {
width: 100vw;
}
.form-row-2 {
grid-template-columns: 1fr;
}
}