/* Reusable Components for Kayal Aqua */ /* Modal Component */ .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1050; opacity: 0; visibility: hidden; transition: all 0.3s ease; } .modal.active { opacity: 1; visibility: visible; } .modal-content { background: var(--white); border-radius: var(--border-radius-lg); width: 90%; max-width: 500px; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-lg); transform: scale(0.9); transition: transform 0.3s ease; } .modal.active .modal-content { transform: scale(1); } .modal-header { padding: var(--space-lg); border-bottom: 1px solid var(--light-gray); display: flex; justify-content: space-between; align-items: center; background: var(--primary-navy); color: var(--white); border-top-left-radius: var(--border-radius-lg); border-top-right-radius: var(--border-radius-lg); } .modal-title { margin: 0; font-size: var(--font-size-lg); font-weight: 600; } .modal-close { background: none; border: none; color: var(--white); font-size: 1.5rem; cursor: pointer; padding: var(--space-sm); border-radius: var(--border-radius); } .modal-close:hover { background: rgba(255, 255, 255, 0.1); } .modal-body { padding: var(--space-lg); } .modal-footer { padding: var(--space-lg); border-top: 1px solid var(--light-gray); display: flex; justify-content: flex-end; gap: var(--space-md); } /* Tabs Component */ .tabs { margin-bottom: var(--space-lg); } .tab-nav { display: flex; border-bottom: 2px solid var(--light-gray); margin-bottom: var(--space-lg); overflow-x: auto; } .tab-nav-item { background: none; border: none; padding: var(--space-md) var(--space-lg); cursor: pointer; border-bottom: 2px solid transparent; color: var(--gray); font-weight: 500; white-space: nowrap; transition: all 0.3s ease; } .tab-nav-item.active { color: var(--primary-navy); border-bottom-color: var(--primary-yellow); } .tab-nav-item:hover { color: var(--primary-navy); background: var(--light-gray); } .tab-content { display: none; } .tab-content.active { display: block; animation: fadeIn 0.3s ease; } /* Accordion Component */ .accordion-item { border: 1px solid var(--light-gray); border-radius: var(--border-radius); margin-bottom: var(--space-sm); overflow: hidden; } .accordion-header { background: var(--white); border: none; width: 100%; padding: var(--space-lg); text-align: left; cursor: pointer; display: flex; justify-content: space-between; align-items: center; font-weight: 500; color: var(--primary-navy); transition: background 0.3s ease; } .accordion-header:hover { background: var(--light-gray); } .accordion-header.active { background: var(--primary-navy); color: var(--white); } .accordion-icon { transition: transform 0.3s ease; } .accordion-header.active .accordion-icon { transform: rotate(180deg); } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; } .accordion-content.active { max-height: 500px; } .accordion-body { padding: var(--space-lg); background: var(--white); border-top: 1px solid var(--light-gray); } /* Progress Bar Component */ .progress { background: var(--light-gray); border-radius: var(--border-radius); height: 8px; overflow: hidden; margin-bottom: var(--space-sm); } .progress-bar { height: 100%; background: linear-gradient(90deg, var(--primary-yellow), var(--primary-yellow-dark)); transition: width 0.6s ease; border-radius: var(--border-radius); } .progress-text { font-size: var(--font-size-sm); color: var(--gray); text-align: center; } /* Badge Component */ .badge { display: inline-flex; align-items: center; padding: 0.25rem 0.5rem; font-size: var(--font-size-xs); font-weight: 500; border-radius: 0.375rem; text-transform: uppercase; letter-spacing: 0.5px; } .badge-primary { background: var(--primary-navy); color: var(--white); } .badge-secondary { background: var(--primary-yellow); color: var(--primary-navy); } .badge-success { background: var(--success); color: var(--white); } .badge-danger { background: var(--danger); color: var(--white); } .badge-warning { background: var(--warning); color: var(--primary-navy); } .badge-info { background: var(--info); color: var(--white); } .badge-outline { background: transparent; border: 1px solid currentColor; } /* Dropdown Component */ .dropdown { position: relative; display: inline-block; } .dropdown-toggle { background: var(--white); border: 1px solid #ced4da; padding: var(--space-md); border-radius: var(--border-radius); cursor: pointer; display: flex; align-items: center; gap: var(--space-sm); min-width: 150px; } .dropdown-toggle:hover { border-color: var(--primary-yellow); } .dropdown-menu { position: absolute; top: 100%; left: 0; background: var(--white); border: 1px solid #ced4da; border-radius: var(--border-radius); box-shadow: var(--shadow-md); min-width: 200px; z-index: 1000; opacity: 0; visibility: hidden; transform: translateY(-10px); transition: all 0.3s ease; } .dropdown.active .dropdown-menu { opacity: 1; visibility: visible; transform: translateY(0); } .dropdown-item { display: block; width: 100%; padding: var(--space-md); background: none; border: none; text-align: left; cursor: pointer; color: var(--dark-gray); text-decoration: none; transition: background 0.3s ease; } .dropdown-item:hover { background: var(--light-gray); } .dropdown-divider { height: 1px; background: var(--light-gray); margin: var(--space-xs) 0; } /* Tooltip Component */ .tooltip { position: relative; display: inline-block; } .tooltip-text { visibility: hidden; width: 120px; background: var(--primary-navy); color: var(--white); text-align: center; border-radius: var(--border-radius); padding: var(--space-sm); font-size: var(--font-size-xs); position: absolute; z-index: 1000; bottom: 125%; left: 50%; margin-left: -60px; opacity: 0; transition: opacity 0.3s; } .tooltip-text::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: var(--primary-navy) transparent transparent transparent; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } /* Breadcrumb Component */ .breadcrumb { display: flex; flex-wrap: wrap; padding: var(--space-md) 0; margin-bottom: var(--space-lg); list-style: none; } .breadcrumb-item { display: flex; align-items: center; } .breadcrumb-item + .breadcrumb-item { padding-left: var(--space-sm); } .breadcrumb-item + .breadcrumb-item::before { content: "/"; color: var(--gray); padding-right: var(--space-sm); } .breadcrumb-link { color: var(--primary-navy); text-decoration: none; } .breadcrumb-link:hover { text-decoration: underline; } .breadcrumb-item.active { color: var(--gray); } /* Card with Image Component */ .image-card { background: var(--white); border-radius: var(--border-radius); overflow: hidden; box-shadow: var(--shadow-sm); transition: transform 0.3s ease, box-shadow 0.3s ease; } .image-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); } .image-card-img { width: 100%; height: 200px; object-fit: cover; background: var(--light-gray); } .image-card-body { padding: var(--space-lg); } .image-card-title { font-size: var(--font-size-lg); font-weight: 600; color: var(--primary-navy); margin: 0 0 var(--space-sm) 0; } .image-card-text { color: var(--gray); line-height: 1.5; } /* Timeline Component */ .timeline { position: relative; padding-left: var(--space-xl); } .timeline::before { content: ''; position: absolute; left: 15px; top: 0; height: 100%; width: 2px; background: var(--primary-yellow); } .timeline-item { position: relative; margin-bottom: var(--space-xl); } .timeline-marker { position: absolute; left: -25px; width: 12px; height: 12px; border-radius: 50%; background: var(--primary-yellow); border: 3px solid var(--white); box-shadow: 0 0 0 3px var(--primary-yellow); } .timeline-content { background: var(--white); border-radius: var(--border-radius); padding: var(--space-lg); box-shadow: var(--shadow-sm); } .timeline-date { color: var(--gray); font-size: var(--font-size-sm); margin-bottom: var(--space-sm); } .timeline-title { color: var(--primary-navy); font-weight: 600; margin-bottom: var(--space-sm); } /* Data Table Component */ .data-table-wrapper { background: var(--white); border-radius: var(--border-radius); box-shadow: var(--shadow-sm); overflow: hidden; } .data-table-header { padding: var(--space-lg); background: var(--light-gray); border-bottom: 1px solid #dee2e6; display: flex; justify-content: space-between; align-items: center; } .data-table-title { font-size: var(--font-size-lg); font-weight: 600; color: var(--primary-navy); margin: 0; } .data-table-actions { display: flex; gap: var(--space-sm); } .data-table { width: 100%; border-collapse: collapse; } .data-table th { background: var(--primary-navy); color: var(--white); padding: var(--space-md); text-align: left; font-weight: 600; } .data-table td { padding: var(--space-md); border-bottom: 1px solid #dee2e6; } .data-table tbody tr:hover { background: var(--light-gray); } /* Empty State Component */ .empty-state { text-align: center; padding: var(--space-xxl); color: var(--gray); } .empty-state-icon { font-size: 3rem; margin-bottom: var(--space-lg); color: var(--primary-yellow); } .empty-state-title { font-size: var(--font-size-lg); color: var(--primary-navy); margin-bottom: var(--space-md); } .empty-state-text { margin-bottom: var(--space-lg); line-height: 1.5; } /* Filter Component */ .filter-bar { background: var(--white); padding: var(--space-lg); border-radius: var(--border-radius); box-shadow: var(--shadow-sm); margin-bottom: var(--space-lg); } .filter-row { display: flex; flex-wrap: wrap; gap: var(--space-md); align-items: end; } .filter-group { flex: 1; min-width: 200px; } .filter-actions { display: flex; gap: var(--space-sm); } /* Status Indicator */ .status-indicator { display: inline-flex; align-items: center; gap: var(--space-xs); font-size: var(--font-size-sm); } .status-dot { width: 8px; height: 8px; border-radius: 50%; } .status-active .status-dot { background: var(--success); } .status-inactive .status-dot { background: var(--danger); } .status-pending .status-dot { background: var(--warning); } /* Loading States */ .skeleton { background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: loading 1.5s infinite; border-radius: var(--border-radius); } .skeleton-text { height: 1rem; margin-bottom: var(--space-sm); } .skeleton-title { height: 1.5rem; width: 60%; margin-bottom: var(--space-md); } .skeleton-paragraph { height: 1rem; margin-bottom: var(--space-xs); } .skeleton-paragraph:last-child { width: 40%; } @keyframes loading { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }