/* Upload-specific CSS Variables (extending styles.css) */ :root { /* Upload-specific colors */ --upload-success-color: #22c55e; --upload-error-color: #ef4444; --upload-warning-color: #eab308; --upload-info-color: #4299e1; /* Upload overlay colors */ --upload-overlay-bg: rgba(0, 0, 0, 0.7); --upload-overlay-content-bg: transparent; /* Upload card colors */ --upload-card-bg: var(--content-bg); --upload-card-border: var(--content-border); --upload-card-shadow: var(--dashboard-shadow); /* Upload stats colors */ --upload-stat-bg: var(--input-bg); --upload-stat-border: var(--input-border); --upload-stat-success-bg: rgba(34, 197, 94, 0.1); --upload-stat-error-bg: rgba(239, 68, 68, 0.1); --upload-stat-warning-bg: rgba(234, 179, 8, 0.1); } @media (prefers-color-scheme: dark) { :root { /* Upload-specific colors for dark theme */ --upload-overlay-bg: rgba(0, 0, 0, 0.8); --upload-overlay-content-bg: transparent; /* Upload card colors for dark theme */ --upload-card-bg: rgba(30, 33, 43, 0.8); --upload-card-border: none; --upload-card-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); /* Upload stats colors for dark theme */ --upload-stat-bg: rgba(30, 33, 43, 0.8); --upload-stat-border: none; --upload-stat-success-bg: rgba(52, 211, 153, 0.1); --upload-stat-error-bg: rgba(248, 113, 113, 0.1); --upload-stat-warning-bg: rgba(245, 158, 11, 0.1); } } /* Upload Container */ .upload-container { position: relative; min-height: 400px; } /* Upload Overlay - Fixed positioning to be contained within upload section */ .upload-overlay, .removal-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--upload-overlay-bg); display: none; justify-content: center; align-items: center; z-index: 1000; border-radius: 0.5rem; backdrop-filter: blur(2px); } .upload-overlay.htmx-request, .removal-overlay.htmx-request { display: flex; } .upload-overlay-content { background-color: var(--upload-overlay-content-bg); padding: 2rem; border-radius: 0.5rem; text-align: center; max-width: 400px; width: 90%; } .upload-overlay h3, .removal-overlay h3 { margin: 0 0 1rem 0; color: white; font-size: 1.5rem; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } .upload-overlay p, .removal-overlay p { margin: 0 0 1.5rem 0; color: white; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } .upload-overlay .overlay-spinner, .removal-overlay .overlay-spinner { margin-bottom: 1rem; } /* Overlay Spinner */ .overlay-spinner { width: 50px; height: 50px; margin: 0 auto; border: 3px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: white; animation: spin 1s ease-in-out infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* File Chip and Modal Styles */ .selected-files-grid { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 1rem; margin-bottom: 1rem; } .file-chip { background-color: var(--input-bg); border: 1px solid var(--input-border); border-radius: 16px; padding: 0.4rem 0.8rem; display: flex; align-items: center; font-size: 0.875rem; box-shadow: var(--dashboard-shadow); transition: background-color 0.2s, opacity 0.2s, box-shadow 0.2s; color: var(--content-text); } .file-chip:hover { box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); } .file-chip.removed { opacity: 0.65; background-color: var(--progress-bg); text-decoration: line-through; box-shadow: none; } .file-chip.removed .file-chip-name { color: var(--label-color); } .file-chip-icon { margin-right: 0.5rem; font-size: 1.1em; color: var(--btn-primary-bg); } .file-chip.removed .file-chip-icon { color: var(--label-color); } .file-chip-name { margin-right: 0.5rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 150px; cursor: pointer; } .file-chip-doctype { font-size: 0.8em; color: var(--label-color); background-color: var(--content-bg); padding: 0.1em 0.4em; border-radius: 4px; margin-right: 0.5rem; white-space: nowrap; } .file-chip-edit, .file-chip-remove { background: none; border: none; color: var(--label-color); cursor: pointer; font-size: 1em; padding: 0 0.25rem; margin-left: 0.25rem; line-height: 1; opacity: 0.8; } .file-chip-edit:hover, .file-chip-remove:hover { color: var(--content-text); opacity: 1; } .file-chip.removed .file-chip-edit, .file-chip.removed .file-chip-remove { color: var(--label-color); cursor: not-allowed; opacity: 0.5; } #no-files-selected-placeholder { color: var(--label-color); font-style: italic; width: 100%; text-align: center; padding: 1rem 0; } /* Modal Styles */ .modal { display: none; position: fixed; z-index: 1002; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0, 0, 0, 0.4); justify-content: center; align-items: center; } .modal-content { background-color: var(--content-bg); color: var(--content-text); margin: auto; padding: 20px; border: 1px solid var(--input-border); border-radius: 8px; width: 90%; max-width: 500px; box-shadow: var(--dashboard-shadow); } .modal-content .form-group label { font-weight: bold; } .modal-content .card-input { width: 100%; box-sizing: border-box; } .close-button { color: var(--label-color); float: right; font-size: 1.75rem; font-weight: bold; line-height: 1; padding: 0; background: transparent; border: none; cursor: pointer; opacity: 0.7; } .close-button:hover { color: var(--content-text); opacity: 1; } .modal-content .form-actions { margin-top: 1.5rem; text-align: right; } .modal-content .btn-primary, .modal-content .btn-secondary { margin-left: 0.5rem; } /* Upload Results Container */ .upload-results-container { background-color: var(--upload-card-bg); border: var(--upload-card-border); border-radius: 0.5rem; box-shadow: var(--upload-card-shadow); padding: 1.5rem; margin-top: 1rem; max-width: 100%; width: 100%; box-sizing: border-box; overflow-x: hidden; /* Revert: avoid forcing gutter here to prevent content width reduction */ } .upload-results-header { margin-bottom: 1.5rem; display: flex; flex-direction: column; gap: 0.75rem; } /* Upload Stats Grid */ .upload-stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; margin-bottom: 1.5rem; max-width: 600px; width: 100%; box-sizing: border-box; padding: 0 0.5rem; /* ensure visual breathing room on both sides */ } /* Stat item card styling (works in light and dark via CSS variables) */ .stat-item { background-color: var(--upload-stat-bg); border: var(--upload-stat-border); border-radius: 0.5rem; padding: 1.25rem; text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: center; min-width: 120px; } .stat-value { font-size: 2.5rem; font-weight: bold; color: var(--text-color); line-height: 1.2; margin-bottom: 0.5rem; } .stat-label { font-size: 0.875rem; color: var(--label-color); text-align: center; } /* Clickable stat items (success/failed) */ .upload-stats .success-stat, .upload-stats .error-stat, .upload-stats .all-stat { cursor: pointer; } .upload-stats .success-stat:hover, .upload-stats .error-stat:hover, .upload-stats .all-stat:hover { box-shadow: 0 2px 8px rgba(0, 0, 0, .12); } /* Pagination Controls */ .pagination-controls { display: flex; justify-content: space-between; align-items: center; margin-top: 2rem; padding-top: 1rem; border-top: 1px solid var(--content-border); overflow-x: auto; } .pagination-info { font-size: 0.875rem; color: var(--label-color); } .pagination-buttons { display: flex; gap: 0.5rem; align-items: center; flex-wrap: wrap; } /* Prevent long error text from blowing out cards */ .clamp-text { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 5; overflow: hidden; word-break: break-word; white-space: pre-wrap; position: relative; } /* show pointer and underline hint on hover */ .error-text.clamp-text, .error-message.clamp-text { cursor: pointer; } .error-text.clamp-text:hover, .error-message.clamp-text:hover { text-decoration: underline dotted; } /* When expanded, remove clamping */ .clamp-text.expanded { -webkit-line-clamp: initial; overflow: visible; } .pagination-btn { padding: 0.5rem 1rem; border: 1px solid var(--input-border); background-color: var(--input-bg); color: var(--input-text); border-radius: 0.25rem; cursor: pointer; font-size: 0.875rem; transition: all 0.2s ease; } .pagination-btn:hover { background-color: var(--btn-primary-bg); color: white; border-color: var(--btn-primary-bg); } .pagination-btn.active { background-color: var(--btn-primary-bg); color: white; border-color: var(--btn-primary-bg); } .pagination-btn:disabled { opacity: 0.5; cursor: not-allowed; background-color: var(--btn-disabled); border-color: var(--btn-disabled); } /* Upload Summary (for removal results) */ .upload-summary { margin: 1.5rem 0; padding: 1.5rem; border-radius: 0.5rem; background-color: var(--upload-card-bg); box-shadow: var(--upload-card-shadow); color: var(--content-text); } .upload-summary h3 { margin-top: 0; font-size: 1.25rem; color: var(--dashboard-header-color); margin-bottom: 1rem; } /* Job Results (for removal results) */ .job-results { margin-top: 1.5rem; } .job-result { padding: 1rem; margin-bottom: 0.5rem; border-radius: 0.5rem; border: var(--upload-card-border); border-left-width: 4px; background-color: var(--upload-card-bg); box-shadow: var(--upload-card-shadow); color: var(--content-text); } .job-result.success { border-left-color: var(--upload-success-color); } .job-result.error { border-left-color: var(--upload-error-color); } .job-id { font-weight: 600; display: block; margin-bottom: 0.5rem; color: var(--dashboard-header-color); } .job-summary { font-size: 0.875rem; color: var(--label-color); margin-bottom: 0.5rem; } .error-message { color: var(--upload-error-color); font-size: 0.875rem; margin-bottom: 0.5rem; } .file-results { margin-left: 1rem; margin-top: 0.5rem; } .file-result { padding: 0.75rem; margin-bottom: 0.5rem; border-radius: 0.25rem; display: flex; align-items: center; background-color: var(--upload-stat-bg); border: var(--upload-stat-border); } .file-result.success { background-color: var(--upload-stat-success-bg); border-color: rgba(34, 197, 94, 0.3); } /* Error bubble refinement */ .file-result.error { background-color: var(--upload-stat-error-bg); border-color: rgba(239, 68, 68, 0.3); border-radius: 0.5rem; /* rounder corners like old version */ } .status-icon { font-size: 1.25rem; margin-right: 0.75rem; } .success .status-icon { color: var(--upload-success-color); } .error .status-icon { color: var(--upload-error-color); } .file-name { font-weight: 500; margin-right: 0.5rem; color: var(--content-text); } .file-message { color: var(--label-color); font-size: 0.875rem; } /* Form Elements */ .form-group { margin-bottom: 1.5rem; } .form-group label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: var(--label-color); } .form-actions { display: flex; gap: 1rem; justify-content: center; margin-top: 2rem; padding-top: 1rem; border-top: 1px solid var(--content-border); } .checkbox-group { display: flex; flex-wrap: wrap; gap: 1rem; } .checkbox-item { display: flex; align-items: center; gap: 0.5rem; } .checkbox-item input[type="checkbox"] { margin: 0; } /* Warning Button */ .warning-button { background-color: var(--btn-warning-bg); color: white; padding: 0.75rem 1.5rem; border: none; border-radius: 0.25rem; cursor: pointer; font-size: 1rem; font-weight: 500; transition: background-color 0.2s ease; } .warning-button:hover { background-color: var(--btn-warning-hover); } .warning-button:disabled { background-color: var(--btn-disabled); cursor: not-allowed; } /* CSV Preview */ #csv-preview, #csv-preview-removal { background-color: var(--upload-stat-success-bg); border: 1px solid rgba(34, 197, 94, 0.3); border-radius: 0.5rem; padding: 1rem; margin: 1rem 0; display: none; } #csv-preview h4, #csv-preview-removal h4 { color: var(--upload-success-color); margin: 0 0 0.5rem 0; font-size: 1.125rem; } #csv-preview p, #csv-preview-removal p { margin: 0; color: var(--content-text); font-size: 0.875rem; } .csv-preview-active { display: block; } /* Dark theme adjustments for modal */ @media (prefers-color-scheme: dark) { .modal { background-color: rgba(20, 20, 20, 0.75); } .close-button { color: var(--label-color); } .close-button:hover { color: var(--content-text); } .modal-content .btn-secondary { background-color: var(--input-bg); color: var(--content-text); border: 1px solid var(--input-border); } } /* Responsive Design */ @media (max-width: 768px) { .upload-results-header { flex-direction: column; gap: 1rem; } .upload-stats { grid-template-columns: 1fr; max-width: none; } .upload-results-grid { grid-template-columns: 1fr; } .upload-details { flex-direction: column; } .upload-actions { flex-direction: column; gap: 0.5rem; } .pagination-controls { flex-direction: column; gap: 1rem; align-items: stretch; } .pagination-buttons { justify-content: center; flex-wrap: wrap; } .checkbox-group { flex-direction: column; gap: 0.5rem; } .form-actions { flex-direction: column; } .selected-files-grid { gap: 0.5rem; } .file-chip { padding: 0.3rem 0.6rem; font-size: 0.8rem; } .file-chip-name { max-width: 100px; } } @media (max-width: 480px) { .upload-overlay-content { padding: 1.5rem; margin: 1rem; } .upload-results-container { padding: 1rem; } .stat-item { padding: 1rem; } .stat-value { font-size: 2rem; } .upload-result-card { padding: 1rem; } .upload-header { flex-direction: column; align-items: flex-start; gap: 0.5rem; } .modal-content { padding: 1rem; margin: 1rem; } .file-chip { padding: 0.25rem 0.5rem; font-size: 0.75rem; } .file-chip-name { max-width: 80px; } } /* File pagination controls within job cards */ .file-pagination-controls { margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid var(--input-border); display: flex; flex-direction: column; gap: 0.5rem; align-items: center; } .file-pagination-controls span { font-size: 0.875rem; color: var(--label-color); font-weight: 500; } .file-pagination-buttons { display: flex; gap: 0.5rem; align-items: center; justify-content: center; } .file-pagination-buttons .pagination-btn { background-color: var(--input-bg); border: 1px solid var(--input-border); color: var(--content-text); padding: 0.375rem 0.75rem; border-radius: 0.375rem; font-size: 0.875rem; cursor: pointer; transition: all 0.2s; text-decoration: none; display: inline-flex; align-items: center; gap: 0.25rem; } .file-pagination-buttons .pagination-btn:hover { background-color: var(--btn-primary-bg); color: white; border-color: var(--btn-primary-bg); } .file-pagination-buttons .pagination-btn:disabled { opacity: 0.5; cursor: not-allowed; background-color: var(--progress-bg); } @media (max-width: 768px) { .file-pagination-controls { margin-top: 0.5rem; padding-top: 0.5rem; } .file-pagination-buttons { flex-direction: column; width: 100%; } .file-pagination-buttons .pagination-btn { width: 100%; justify-content: center; } } /* Ensure the results grid has inner gutters and doesn't touch the edges */ .upload-results-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1rem; margin-top: 1.5rem; padding: 0 0.5rem; box-sizing: border-box; }