/** * 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/. */ .candidate-board { padding: 24px; } .page-header { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 24px; .back-link { color: #718096; text-decoration: none; display: flex; align-items: center; margin-top: 4px; } h2 { font-size: 22px; font-weight: 600; margin: 0 0 4px; } .sub-title { font-size: 14px; color: #718096; margin: 0; } .btn-outline { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; background: #f7f8fc; color: #2563eb; border: 1px solid #e2e8f0; padding: 8px 16px; border-radius: 8px; text-decoration: none; font-size: 14px; mat-icon { font-size: 18px; } &.btn-analysis { margin-left: auto; background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); color: #fff; border-color: transparent; &:hover { opacity: 0.9; } } & + .btn-outline { margin-left: 8px; } } } .filter-row { display: flex; align-items: center; gap: 16px; margin-bottom: 24px; flex-wrap: wrap; .total-badge { background: #edf2f7; color: #4a5568; padding: 6px 14px; border-radius: 20px; font-size: 13px; font-weight: 600; } .post-filter { display: flex; gap: 8px; flex-wrap: wrap; } .filter-btn { padding: 6px 14px; border-radius: 20px; border: 1px solid #e2e8f0; background: #fff; color: #718096; font-size: 13px; cursor: pointer; transition: all 0.15s; &.active { background: #2563eb; color: #fff; border-color: #2563eb; } } } .post-section { margin-bottom: 32px; } .post-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; h3 { font-size: 18px; font-weight: 600; color: #2d3748; margin: 0; } .seat-count { font-size: 13px; color: #718096; background: #f7fafc; padding: 3px 10px; border-radius: 10px; } } .candidates-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; } .candidate-card { background: #fff; border-radius: 14px; box-shadow: 0 2px 8px rgb(0 0 0 / 8%); padding: 18px 16px 14px; position: relative; transition: box-shadow 0.2s, transform 0.15s; cursor: pointer; text-align: center; &:hover { box-shadow: 0 6px 20px rgb(0 0 0 / 14%); transform: translateY(-2px); } &.inactive { opacity: 0.5; } .serial-badge { position: absolute; top: 10px; right: 10px; background: #eff6ff; color: #2563eb; padding: 2px 8px; border-radius: 10px; font-size: 11px; font-weight: 700; } } .clickable-photo { cursor: zoom-in; transition: opacity 0.15s; &:hover { opacity: 0.85; } } .candidate-avatar { display: flex; justify-content: center; margin-bottom: 12px; img { width: 72px; height: 72px; border-radius: 50%; object-fit: cover; border: 3px solid #e2e8f0; } .avatar-placeholder { width: 72px; height: 72px; border-radius: 50%; background: linear-gradient(135deg, #2563eb, #1e40af); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 28px; font-weight: 700; } } .candidate-name { font-size: 14px; font-weight: 600; color: #2d3748; margin-bottom: 4px; line-height: 1.3; } .vote-count-badge { display: inline-flex; align-items: center; gap: 3px; background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; border-radius: 20px; padding: 2px 8px; font-size: 11px; font-weight: 700; margin: 0 auto 8px; mat-icon { font-size: 12px; height: 12px; width: 12px; } } .symbol-area { display: flex; flex-direction: column; align-items: center; gap: 6px; margin-bottom: 10px; .symbol-thumb { width: 64px; height: 64px; object-fit: contain; border-radius: 50%; background: #fff; padding: 6px; border: 3px solid #f59e0b; box-shadow: 0 0 0 3px #fef3c7, 0 4px 12px rgb(245 158 11 / 25%); transition: transform 0.2s ease, box-shadow 0.2s ease; &:hover { transform: scale(1.12); box-shadow: 0 0 0 3px #fde68a, 0 6px 18px rgb(245 158 11 / 40%); } } .symbol-label { font-size: 10px; font-weight: 600; color: #b45309; letter-spacing: 0.4px; text-transform: uppercase; } .no-symbol-text { font-size: 11px; color: #a0aec0; } } .btn-symbol-upload { display: inline-flex; align-items: center; gap: 3px; padding: 4px 10px; border: 1px dashed #a0aec0; border-radius: 6px; background: #f8fafc; color: #4a5568; font-size: 11px; cursor: pointer; transition: all 0.15s; mat-icon { font-size: 13px; height: 13px; width: 13px; } &:hover { border-color: #2563eb; color: #2563eb; background: #eff6ff; } &.uploading { opacity: 0.6; pointer-events: none; } } .candidate-actions { display: flex; justify-content: center; gap: 6px; margin-top: 6px; .btn-analyse { display: inline-flex; align-items: center; gap: 3px; background: #eff6ff; color: #2563eb; border: 1px solid #bfdbfe; padding: 4px 10px; border-radius: 6px; font-size: 11px; text-decoration: none; cursor: pointer; mat-icon { font-size: 13px; height: 13px; width: 13px; } &:hover { background: #dbeafe; } } .btn-remove { display: inline-flex; align-items: center; gap: 3px; background: #fff5f5; color: #e53e3e; border: 1px solid #fed7d7; padding: 4px 10px; border-radius: 6px; font-size: 11px; cursor: pointer; mat-icon { font-size: 13px; height: 13px; width: 13px; } &:hover { background: #fed7d7; } } .removed-badge { background: #edf2f7; color: #a0aec0; padding: 4px 10px; border-radius: 6px; font-size: 11px; } .locked-badge { display: inline-flex; align-items: center; gap: 3px; background: #fffbeb; color: #92400e; border: 1px solid #fde68a; padding: 4px 10px; border-radius: 6px; font-size: 11px; font-weight: 600; mat-icon { font-size: 12px; height: 12px; width: 12px; } } } .btn-locked { opacity: 0.5; pointer-events: none; cursor: not-allowed !important; } // ── Candidate Detail Drawer ──────────────────────────────────── .drawer-overlay { position: fixed; inset: 0; background: rgb(0 0 0 / 30%); z-index: 999; animation: fade-in 0.2s ease; } .candidate-drawer { position: fixed; top: 0; right: 0; width: 380px; height: 100vh; background: #fff; z-index: 1000; display: flex; flex-direction: column; box-shadow: -4px 0 24px rgb(0 0 0 / 15%); animation: slide-in 0.25s ease; overflow: hidden; @media (width <= 480px) { width: 100vw; } } @keyframes slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } } @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } } .drawer-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid #f0f0f0; background: #fafbfc; flex-shrink: 0; h3 { font-size: 16px; font-weight: 600; margin: 0; color: #2d3748; } .drawer-close { background: none; border: none; cursor: pointer; color: #718096; display: flex; align-items: center; padding: 4px; border-radius: 6px; &:hover { background: #f0f0f0; color: #2d3748; } } } .drawer-body { flex: 1; overflow-y: auto; padding: 20px; } .drawer-avatar-wrap { display: flex; justify-content: center; position: relative; margin-bottom: 14px; .drawer-avatar-img { width: 96px; height: 96px; border-radius: 50%; object-fit: cover; border: 3px solid #e2e8f0; } .drawer-avatar-placeholder { width: 96px; height: 96px; border-radius: 50%; background: linear-gradient(135deg, #2563eb, #1e40af); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 36px; font-weight: 700; } .drawer-serial { position: absolute; bottom: 0; right: calc(50% - 60px); background: #2563eb; color: #fff; padding: 2px 8px; border-radius: 10px; font-size: 11px; font-weight: 700; } } .drawer-name { text-align: center; font-size: 18px; font-weight: 700; color: #2d3748; margin-bottom: 4px; } .drawer-post { text-align: center; font-size: 13px; color: #718096; margin-bottom: 8px; } .drawer-vote-count { display: inline-flex; align-items: center; gap: 4px; background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; border-radius: 20px; padding: 4px 12px; font-size: 13px; font-weight: 700; margin: 0 auto 14px; mat-icon { font-size: 14px; height: 14px; width: 14px; } } .drawer-meta-row { display: flex; align-items: center; justify-content: center; gap: 6px; font-size: 12px; color: #718096; margin-bottom: 20px; mat-icon { font-size: 15px; height: 15px; width: 15px; color: #a0aec0; } } .drawer-section { margin-bottom: 20px; } .drawer-section-title { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: #a0aec0; text-transform: uppercase; letter-spacing: 0.6px; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid #f0f0f0; mat-icon { font-size: 15px; height: 15px; width: 15px; } } .symbol-preview-area { display: flex; flex-direction: column; align-items: center; gap: 14px; .symbol-seal-wrap { position: relative; display: flex; align-items: center; justify-content: center; width: 144px; height: 144px; border-radius: 50%; background: linear-gradient(135deg, #fef3c7, #fff); border: 4px solid #f59e0b; box-shadow: 0 0 0 6px #fef9e7, 0 8px 28px rgb(245 158 11 / 30%); } .symbol-preview-img { width: 110px; height: 110px; object-fit: contain; border-radius: 50%; background: #fff; padding: 10px; } .symbol-seal-label { position: absolute; bottom: -1px; background: #f59e0b; color: #fff; font-size: 9px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; padding: 2px 10px; border-radius: 10px; } .symbol-empty { display: flex; flex-direction: column; align-items: center; gap: 4px; color: #a0aec0; padding: 12px 0; width: 144px; height: 144px; border-radius: 50%; border: 3px dashed #e2e8f0; justify-content: center; mat-icon { font-size: 36px; height: 36px; width: 36px; } span { font-size: 11px; } } } .btn-upload-symbol { display: inline-flex; align-items: center; gap: 6px; padding: 8px 18px; background: #2563eb; color: #fff; border-radius: 8px; font-size: 13px; font-weight: 500; cursor: pointer; transition: background 0.15s; mat-icon { font-size: 16px; height: 16px; width: 16px; } &:hover { background: #1d4ed8; } &.uploading { background: #93c5fd; pointer-events: none; } } .drawer-profile-text { font-size: 13px; color: #4a5568; line-height: 1.6; margin: 0; } .drawer-info-grid { display: flex; flex-direction: column; gap: 10px; } .info-item { display: flex; justify-content: space-between; align-items: center; font-size: 13px; .info-label { color: #718096; } .info-value { font-weight: 500; color: #2d3748; &.text-green { color: #276749; } &.text-red { color: #e53e3e; } } .info-link { color: #2563eb; text-decoration: none; display: inline-flex; align-items: center; gap: 2px; font-weight: 500; mat-icon { font-size: 13px; height: 13px; width: 13px; } &:hover { text-decoration: underline; } } } .locked-notice { display: flex; align-items: center; gap: 8px; width: 100%; margin-top: 8px; padding: 10px 14px; background: #fffbeb; color: #92400e; border: 1px solid #fde68a; border-radius: 8px; font-size: 13px; font-weight: 500; mat-icon { font-size: 16px; height: 16px; width: 16px; flex-shrink: 0; } } .btn-remove-full { display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%; margin-top: 8px; padding: 10px; background: #fff5f5; color: #e53e3e; border: 1px solid #fed7d7; border-radius: 8px; font-size: 13px; font-weight: 500; cursor: pointer; transition: background 0.15s; mat-icon { font-size: 16px; height: 16px; width: 16px; } &:hover { background: #fed7d7; } } // ── Common states ────────────────────────────────────────────── .loading-state, .empty-state { display: flex; flex-direction: column; align-items: center; padding: 60px; color: #a0aec0; mat-icon { font-size: 56px; height: 56px; width: 56px; margin-bottom: 12px; } h3 { margin: 0 0 8px; } p { margin: 0; } } .spinner { width: 36px; height: 36px; border: 4px solid #e2e8f0; border-top-color: #2563eb; border-radius: 50%; animation: spin 0.7s linear infinite; margin-bottom: 12px; } @keyframes spin { to { transform: rotate(360deg); } } // ── Pagination ───────────────────────────────────────────────── .pagination-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; margin-top: 24px; padding: 12px 16px; background: #fff; border-radius: 12px; box-shadow: 0 1px 4px rgb(0 0 0 / 8%); } .pg-info { font-size: 13px; color: #718096; white-space: nowrap; } .pg-controls { display: flex; align-items: center; gap: 4px; } .pg-btn { display: inline-flex; align-items: center; justify-content: center; min-width: 34px; height: 34px; padding: 0 6px; border: 1px solid #e2e8f0; border-radius: 8px; background: #fff; color: #4a5568; font-size: 13px; font-weight: 500; cursor: pointer; transition: background 0.15s, border-color 0.15s; mat-icon { font-size: 18px; height: 18px; width: 18px; } &:hover:not(:disabled) { background: #eff6ff; border-color: #2563eb; color: #2563eb; } &:disabled { opacity: 0.4; cursor: not-allowed; } } .pg-num--active { background: #2563eb; color: #fff; border-color: #2563eb; &:hover { background: #1d4ed8; } } .pg-ellipsis { display: inline-flex; align-items: center; justify-content: center; min-width: 34px; height: 34px; color: #a0aec0; font-size: 14px; } .pg-size { select { padding: 6px 10px; border: 1px solid #e2e8f0; border-radius: 8px; font-size: 13px; color: #4a5568; outline: none; cursor: pointer; background: #fff; &:focus { border-color: #2563eb; } } }