/** * 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/. */ $primary: #6366f1; $primary-dark: #4f46e5; $text: #0f172a; $sub: #64748b; $bg: #f8fafc; $border: 1px solid rgb(226 232 240 / 80%); $radius: 16px; $shadow: 0 4px 20px rgb(15 23 42 / 8%); $font: 'Inter', -apple-system, blinkmacsystemfont, 'Segoe UI', sans-serif; .committee-page { padding: 32px; background: $bg; min-height: 100vh; font-family: $font; color: $text; box-sizing: border-box; } // ── Header ──────────────────────────────────────────────────────── .page-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 28px; flex-wrap: wrap; .header-left { display: flex; align-items: center; gap: 14px; } h2 { font-size: 22px; font-weight: 800; margin: 0 0 3px; letter-spacing: -0.4px; } .header-sub { font-size: 13px; color: $sub; margin: 0; } } .back-btn { width: 38px; height: 38px; border-radius: 50%; background: #fff; border: $border; display: flex; align-items: center; justify-content: center; text-decoration: none; color: $sub; transition: all 0.2s; flex-shrink: 0; mat-icon { font-size: 18px; height: 18px; width: 18px; } &:hover { color: $text; transform: translateX(-2px); } } .btn-create { display: inline-flex; align-items: center; gap: 7px; background: linear-gradient(135deg, $primary 0%, $primary-dark 100%); color: #fff; border: none; border-radius: 24px; padding: 10px 20px; font-size: 14px; font-weight: 600; cursor: pointer; box-shadow: 0 4px 12px rgb(99 102 241 / 30%); transition: all 0.2s; mat-icon { font-size: 18px; height: 18px; width: 18px; } &:hover { transform: translateY(-1px); box-shadow: 0 6px 16px rgb(99 102 241 / 40%); } } // ── States ──────────────────────────────────────────────────────── .loading-state, .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; padding: 80px 20px; text-align: center; color: $sub; h3 { font-size: 18px; font-weight: 700; color: $text; margin: 0; } p { font-size: 14px; max-width: 360px; margin: 0; } } .empty-icon { font-size: 56px; height: 56px; width: 56px; color: #cbd5e1; } .spinner { width: 36px; height: 36px; border: 3px solid #e2e8f0; border-top-color: $primary; border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } // ── Grid ────────────────────────────────────────────────────────── .committees-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 20px; } // ── Committee Card ──────────────────────────────────────────────── .committee-card { background: #fff; border-radius: $radius; border: $border; box-shadow: $shadow; padding: 20px; display: flex; flex-direction: column; gap: 14px; transition: all 0.25s; &:hover { box-shadow: 0 8px 28px rgb(15 23 42 / 12%); transform: translateY(-2px); } &.dissolved { opacity: 0.65; } } .card-header { display: flex; align-items: center; gap: 12px; } .committee-icon { width: 46px; height: 46px; border-radius: 12px; background: linear-gradient(135deg, $primary 0%, $primary-dark 100%); display: flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; mat-icon { font-size: 22px; height: 22px; width: 22px; color: #fff; } } .committee-img { width: 100%; height: 100%; object-fit: cover; border-radius: 12px; } .clickable-photo { cursor: zoom-in; transition: opacity 0.15s; &:hover { opacity: 0.85; } } .committee-meta { flex: 1; min-width: 0; h3 { font-size: 16px; font-weight: 700; margin: 0 0 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } } .status-chip { font-size: 10px; font-weight: 700; padding: 2px 9px; border-radius: 10px; text-transform: uppercase; letter-spacing: 0.3px; } .committee-desc { font-size: 13px; color: $sub; margin: 0; line-height: 1.5; } .member-count-row { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; color: $sub; mat-icon { font-size: 16px; height: 16px; width: 16px; } } // ── Member Avatars (stacked) ────────────────────────────────────── .member-avatars { display: flex; flex-direction: row; } .member-avatar { width: 36px; height: 36px; border-radius: 50%; background: linear-gradient(135deg, $primary 0%, $primary-dark 100%); color: #fff; font-size: 14px; font-weight: 700; display: flex; align-items: center; justify-content: center; border: 2px solid #fff; margin-left: -8px; overflow: hidden; flex-shrink: 0; &:first-child { margin-left: 0; } img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; } } .more-avatar { background: #e2e8f0; color: $sub; font-size: 11px; font-weight: 700; } // ── Member List ─────────────────────────────────────────────────── .member-list { display: flex; flex-direction: column; gap: 8px; border-top: $border; padding-top: 12px; } .member-row { display: flex; align-items: center; gap: 10px; } .member-avatar-sm { width: 32px; height: 32px; border-radius: 50%; background: linear-gradient(135deg, $primary 0%, $primary-dark 100%); color: #fff; font-size: 13px; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; } } .member-info { flex: 1; min-width: 0; .member-name { display: block; font-size: 13px; font-weight: 600; color: $text; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .member-desig { display: block; font-size: 11px; color: $sub; margin-top: 1px; } } // ── Card Actions ────────────────────────────────────────────────── .card-actions { display: flex; gap: 8px; margin-top: auto; } .btn-edit { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 4px; padding: 8px 0; border: $border; border-radius: 8px; background: #fff; font-size: 13px; font-weight: 600; color: $text; cursor: pointer; transition: background 0.15s; mat-icon { font-size: 15px; height: 15px; width: 15px; } &:hover { background: #f1f5f9; } } .btn-dissolve { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 4px; padding: 8px 0; border: 1px solid #fecaca; border-radius: 8px; background: #fff; font-size: 13px; font-weight: 600; color: #ef4444; cursor: pointer; transition: background 0.15s; mat-icon { font-size: 15px; height: 15px; width: 15px; } &:hover { background: #fef2f2; } } .dissolved-label { display: flex; align-items: center; gap: 5px; font-size: 13px; font-weight: 600; color: #94a3b8; mat-icon { font-size: 16px; height: 16px; width: 16px; } } // ── Drawer ──────────────────────────────────────────────────────── .overlay { position: fixed; inset: 0; background: rgb(0 0 0 / 30%); z-index: 100; backdrop-filter: blur(2px); } .form-drawer { position: fixed; top: 0; right: 0; bottom: 0; width: 460px; max-width: 100vw; background: #fff; z-index: 101; display: flex; flex-direction: column; box-shadow: -8px 0 32px rgb(0 0 0 / 15%); } .drawer-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px; border-bottom: $border; flex-shrink: 0; h3 { font-size: 18px; font-weight: 700; margin: 0; } } .close-btn { width: 32px; height: 32px; border-radius: 50%; border: none; background: #f1f5f9; display: flex; align-items: center; justify-content: center; cursor: pointer; color: $sub; mat-icon { font-size: 18px; height: 18px; width: 18px; } &:hover { background: #e2e8f0; color: $text; } } .drawer-body { flex: 1; overflow-y: auto; padding: 24px; display: flex; flex-direction: column; gap: 16px; } // ── Image Upload ────────────────────────────────────────────────── .image-upload-section { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 16px 0 8px; } .image-upload-ring { width: 90px; height: 90px; 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: border-color 0.2s, background 0.2s; background: #f8fafc; &:hover { border-color: $primary; background: rgb(99 102 241 / 4%); .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(0 0 0 / 45%); display: flex; align-items: center; justify-content: center; gap: 8px; opacity: 0; transition: opacity 0.2s; mat-icon { color: #fff; font-size: 22px; height: 22px; width: 22px; } .view-icon { font-size: 20px; height: 20px; width: 20px; opacity: 0.85; cursor: zoom-in; &:hover { opacity: 1; transform: scale(1.1); } } } .upload-placeholder-icon { font-size: 28px; height: 28px; width: 28px; color: #94a3b8; margin-bottom: 2px; } .upload-placeholder-text { font-size: 10px; font-weight: 600; color: #94a3b8; letter-spacing: 0.3px; } .btn-remove-image { display: inline-flex; align-items: center; gap: 4px; padding: 4px 12px; border: 1px solid #fecaca; border-radius: 20px; background: #fff; font-size: 12px; font-weight: 600; color: #ef4444; cursor: pointer; transition: background 0.15s; mat-icon { font-size: 14px; height: 14px; width: 14px; } &:hover { background: #fef2f2; } } .form-group { display: flex; flex-direction: column; gap: 5px; label { font-size: 12px; font-weight: 600; color: $sub; text-transform: uppercase; letter-spacing: 0.4px; } input, textarea { padding: 10px 12px; border: $border; border-radius: 8px; font-size: 14px; color: $text; font-family: $font; outline: none; transition: border-color 0.15s; resize: vertical; &:focus { border-color: $primary; box-shadow: 0 0 0 3px rgb(99 102 241 / 10%); } &.input-error { border-color: #ef4444; } } } .error-msg { font-size: 11px; color: #ef4444; margin-top: 2px; } .req { color: #ef4444; } .section-title { font-size: 11px; font-weight: 700; color: $sub; text-transform: uppercase; letter-spacing: 0.5px; padding-bottom: 6px; border-bottom: $border; } .loading-inline { display: flex; align-items: center; gap: 10px; color: $sub; font-size: 13px; } .spinner-sm { width: 20px; height: 20px; border: 2px solid #e2e8f0; border-top-color: $primary; border-radius: 50%; animation: spin 0.8s linear infinite; } .empty-directors { display: flex; align-items: center; gap: 8px; padding: 14px; background: #f8fafc; border-radius: 10px; font-size: 13px; color: $sub; mat-icon { font-size: 18px; height: 18px; width: 18px; } } // ── Director Selection List ─────────────────────────────────────── .director-select-list { display: flex; flex-direction: column; gap: 6px; } .director-option { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: $border; border-radius: 10px; cursor: pointer; transition: all 0.15s; background: #fff; &:hover { border-color: $primary; background: rgb(99 102 241 / 2%); } &.selected { border-color: $primary; background: rgb(99 102 241 / 5%); } } .dir-avatar { width: 38px; height: 38px; border-radius: 50%; background: linear-gradient(135deg, $primary 0%, $primary-dark 100%); color: #fff; font-size: 15px; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; } } .dir-info { flex: 1; min-width: 0; .dir-name { display: block; font-size: 14px; font-weight: 600; color: $text; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .dir-desig { display: block; font-size: 11px; color: $sub; margin-top: 1px; } } .dir-check { flex-shrink: 0; .check-icon { font-size: 20px; height: 20px; width: 20px; color: $primary; } .uncheck-icon { font-size: 20px; height: 20px; width: 20px; color: #cbd5e1; } } .selected-count { font-size: 12px; font-weight: 600; color: $primary; text-align: right; } // ── Footer ──────────────────────────────────────────────────────── .drawer-footer { display: flex; gap: 10px; padding: 16px 24px; border-top: $border; flex-shrink: 0; } .btn-cancel { flex: 1; padding: 10px; border: $border; border-radius: 10px; background: #fff; font-size: 14px; font-weight: 600; color: $sub; cursor: pointer; &:hover { background: #f1f5f9; } } .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: 14px; font-weight: 600; cursor: pointer; box-shadow: 0 4px 10px rgb(99 102 241 / 25%); mat-icon { font-size: 16px; height: 16px; width: 16px; } &:hover:not(:disabled) { transform: translateY(-1px); } &:disabled { opacity: 0.6; cursor: not-allowed; } } // ── Meetings Section ────────────────────────────────────────────── .meetings-section { border-top: $border; margin-top: 4px; } .meetings-toggle { display: flex; align-items: center; gap: 6px; width: 100%; padding: 10px 4px; background: none; border: none; cursor: pointer; font-size: 13px; font-weight: 600; color: $sub; text-align: left; transition: color 0.15s; mat-icon { font-size: 16px; height: 16px; width: 16px; color: $sub; } .chevron { margin-left: auto; font-size: 18px; height: 18px; width: 18px; transition: transform 0.2s; } &.expanded { color: $primary; mat-icon { color: $primary; } } &:hover { color: $text; } } .meeting-count-badge { background: $primary; color: #fff; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 10px; min-width: 18px; text-align: center; } .meetings-panel { padding: 4px 0 8px; display: flex; flex-direction: column; gap: 8px; } .btn-schedule { display: inline-flex; align-items: center; gap: 4px; padding: 6px 12px; border: 1px dashed #a5b4fc; border-radius: 8px; background: rgb(99 102 241 / 4%); color: $primary; font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.15s; align-self: flex-start; mat-icon { font-size: 14px; height: 14px; width: 14px; } &:hover { background: rgb(99 102 241 / 10%); border-color: $primary; } } .meetings-empty { display: flex; align-items: center; gap: 6px; padding: 10px 0; font-size: 12px; color: #94a3b8; mat-icon { font-size: 16px; height: 16px; width: 16px; } } .meeting-list { display: flex; flex-direction: column; gap: 6px; } .meeting-row { display: flex; align-items: flex-start; gap: 8px; padding: 8px 10px; background: #f8fafc; border-radius: 8px; border: $border; } .meeting-mode-icon { width: 28px; height: 28px; border-radius: 8px; background: rgb(99 102 241 / 10%); 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; font-weight: 600; color: $text; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .meeting-meta-row { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin-top: 3px; font-size: 11px; color: $sub; .meta-icon { font-size: 11px; height: 11px; width: 11px; } .meta-sep { color: #cbd5e1; } } .meeting-status-chip { font-size: 9px; font-weight: 700; padding: 1px 6px; border-radius: 8px; text-transform: uppercase; letter-spacing: 0.3px; } .meeting-platform-row { display: flex; align-items: center; gap: 4px; margin-top: 3px; font-size: 11px; color: $sub; .meta-icon { font-size: 11px; height: 11px; width: 11px; } } .join-link { display: inline-flex; align-items: center; gap: 2px; color: $primary; font-size: 11px; font-weight: 600; text-decoration: none; margin-left: 4px; mat-icon { font-size: 11px; height: 11px; width: 11px; } &:hover { text-decoration: underline; } } .meeting-actions { display: flex; align-items: center; gap: 2px; flex-shrink: 0; } .btn-icon { width: 24px; height: 24px; border-radius: 6px; border: none; background: none; display: flex; align-items: center; justify-content: center; cursor: pointer; color: $sub; transition: all 0.15s; mat-icon { font-size: 14px; height: 14px; width: 14px; } &:hover { background: #f1f5f9; color: $text; } &.green:hover { background: #dcfce7; color: #10b981; } &.red:hover { background: #fef9c3; color: #f59e0b; } &.danger:hover { background: #fee2e2; color: #ef4444; } } // ── Meeting Drawer ──────────────────────────────────────────────── .meeting-drawer { width: 500px; } .mode-toggle { display: flex; gap: 8px; } .mode-btn { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 10px; border: $border; border-radius: 10px; background: #fff; font-size: 13px; font-weight: 600; color: $sub; cursor: pointer; transition: all 0.15s; mat-icon { font-size: 16px; height: 16px; width: 16px; } &.active { border-color: $primary; background: rgb(99 102 241 / 6%); color: $primary; } &:hover:not(.active) { background: #f8fafc; } } .mode-fields-group { display: flex; flex-direction: column; gap: 12px; padding: 14px; border-radius: 10px; border: $border; background: #f8fafc; } .mode-label { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; mat-icon { font-size: 15px; height: 15px; width: 15px; } &.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: 12px; } @media (width <= 600px) { .committee-page { padding: 16px; } .committees-grid { grid-template-columns: 1fr; } .form-drawer { width: 100vw; } .form-row-2 { grid-template-columns: 1fr; } }