/* ============================================================================= * RBAC Export/Import Component Styles * ============================================================================= */ .rbacExportImport { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; } @media (max-width: 768px) { .rbacExportImport { grid-template-columns: 1fr; } } /* ============================================================================= * Section * ============================================================================= */ .section { background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 8px; overflow: hidden; } .sectionHeader { display: flex; align-items: center; gap: 0.5rem; padding: 1rem; background: var(--bg-secondary); border-bottom: 1px solid var(--border-color); } .sectionIcon { color: var(--primary-color); font-size: 1.125rem; } .sectionTitle { font-size: 1rem; font-weight: 600; margin: 0; color: var(--text-primary); } .sectionContent { padding: 1rem; display: flex; flex-direction: column; gap: 1rem; } .sectionDescription { font-size: 0.875rem; color: var(--text-secondary); margin: 0; line-height: 1.5; } /* ============================================================================= * Buttons * ============================================================================= */ .primaryButton { display: flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.625rem 1rem; background: var(--primary-color); color: white; border: none; border-radius: 6px; font-size: 0.875rem; font-weight: 500; cursor: pointer; transition: background 0.2s; } .primaryButton:hover:not(:disabled) { background: var(--primary-color-dark); } .primaryButton:disabled { opacity: 0.6; cursor: not-allowed; } .primaryButton.danger { background: #c53030; } .primaryButton.danger:hover:not(:disabled) { background: #9b2c2c; } .clearButton { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; background: none; border: 1px solid var(--border-color); border-radius: 4px; color: var(--text-tertiary); cursor: pointer; transition: all 0.2s; } .clearButton:hover { background: #fed7d7; color: #c53030; border-color: #fc8181; } .previewButton { display: flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: 4px; font-size: 0.8125rem; color: var(--text-secondary); cursor: pointer; transition: all 0.2s; } .previewButton:hover { background: var(--bg-tertiary); color: var(--text-primary); } .closeButton { background: none; border: none; font-size: 1.25rem; color: var(--text-tertiary); cursor: pointer; padding: 0.25rem; line-height: 1; } .closeButton:hover { color: var(--text-primary); } /* ============================================================================= * File Upload * ============================================================================= */ .fileUpload { display: flex; align-items: center; gap: 0.5rem; } .fileInput { display: none; } .fileLabel { flex: 1; display: flex; align-items: center; gap: 0.75rem; padding: 1rem; border: 2px dashed var(--border-color); border-radius: 6px; cursor: pointer; transition: all 0.2s; color: var(--text-secondary); font-size: 0.875rem; } .fileLabel:hover { border-color: var(--primary-color); background: var(--bg-secondary); } .fileIcon { font-size: 1.25rem; } /* ============================================================================= * Import Info & Stats * ============================================================================= */ .importInfo { display: flex; align-items: center; justify-content: space-between; padding: 0.75rem; background: var(--bg-secondary); border-radius: 6px; } .importStats { display: flex; gap: 1rem; font-size: 0.8125rem; color: var(--text-secondary); } /* ============================================================================= * Import Mode Selection * ============================================================================= */ .importModeSection { display: flex; flex-direction: column; gap: 0.75rem; } .importModeTitle { font-size: 0.875rem; font-weight: 600; margin: 0; color: var(--text-primary); } .importModes { display: flex; flex-direction: column; gap: 0.5rem; } .importModeOption { display: grid; grid-template-columns: auto auto 1fr; grid-template-rows: auto auto; gap: 0.25rem 0.5rem; padding: 0.75rem; border: 1px solid var(--border-color); border-radius: 6px; cursor: pointer; transition: all 0.2s; } .importModeOption:hover { background: var(--bg-secondary); } .importModeOption.selected { border-color: var(--primary-color); background: var(--primary-color-light); } .radioInput { grid-row: span 2; align-self: center; accent-color: var(--primary-color); } .modeIcon { grid-row: span 2; align-self: center; font-size: 1.125rem; } .modeLabel { font-weight: 500; color: var(--text-primary); font-size: 0.875rem; } .modeDescription { font-size: 0.75rem; color: var(--text-tertiary); grid-column: 3; } /* ============================================================================= * Messages * ============================================================================= */ .errorMessage { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem; background: #fed7d7; color: #c53030; border-radius: 6px; font-size: 0.875rem; } .warningMessage { display: flex; align-items: flex-start; gap: 0.5rem; padding: 0.75rem; background: #fefcbf; color: #744210; border-radius: 6px; font-size: 0.8125rem; line-height: 1.4; } /* ============================================================================= * Modal * ============================================================================= */ .modalOverlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: 1rem; } .modal { background: var(--bg-primary); border-radius: 8px; max-width: 500px; width: 100%; max-height: 80vh; overflow: auto; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); } /* ============================================================================= * Preview * ============================================================================= */ .preview { display: flex; flex-direction: column; } .previewHeader { display: flex; align-items: center; justify-content: space-between; padding: 1rem; border-bottom: 1px solid var(--border-color); } .previewTitle { margin: 0; font-size: 1rem; font-weight: 600; } .previewContent { padding: 1rem; display: flex; flex-direction: column; gap: 1rem; } .previewSection { display: flex; flex-direction: column; gap: 0.5rem; } .previewSection h5 { margin: 0; font-size: 0.875rem; font-weight: 600; color: var(--text-secondary); } .previewList { margin: 0; padding-left: 1.25rem; font-size: 0.8125rem; color: var(--text-primary); display: flex; flex-direction: column; gap: 0.25rem; } .previewList code { background: var(--bg-secondary); padding: 0.125rem 0.375rem; border-radius: 3px; font-family: 'Monaco', 'Menlo', monospace; font-size: 0.75rem; } .featureBadge, .contextBadge { display: inline-block; padding: 0.125rem 0.375rem; background: var(--primary-color-light); color: var(--primary-color); font-size: 0.625rem; font-weight: 600; border-radius: 3px; margin-left: 0.5rem; text-transform: uppercase; } .contextBadge { background: var(--bg-tertiary); color: var(--text-secondary); margin-left: 0; margin-right: 0.5rem; } .moreItems { color: var(--text-tertiary); font-style: italic; } /* ============================================================================= * Import Result * ============================================================================= */ .importResult { display: flex; flex-direction: column; } .resultHeader { display: flex; align-items: center; gap: 0.75rem; padding: 1rem; border-bottom: 1px solid var(--border-color); } .importResult.success .resultHeader { background: #c6f6d5; } .importResult.error .resultHeader { background: #fed7d7; } .resultIcon { font-size: 1.25rem; } .importResult.success .resultIcon { color: #38a169; } .importResult.error .resultIcon { color: #c53030; } .resultTitle { flex: 1; margin: 0; font-size: 1rem; font-weight: 600; } .resultContent { padding: 1rem; } .resultStats { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 0.375rem; font-size: 0.875rem; } .resultErrors { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--border-color); } .resultErrors h5 { margin: 0 0 0.5rem; font-size: 0.875rem; color: #c53030; } .resultErrors ul { margin: 0; padding-left: 1.25rem; font-size: 0.8125rem; color: #c53030; } /* ============================================================================= * Spinning Animation * ============================================================================= */ .spinning { animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }