DataScience / shared /css /components.css
AashishAIHub's picture
feat: Update all modules with latest UI enhancements and content
13d9acc
/**
* DataScience Masterclass - Reusable Components
* Version: 2.0.0
*/
/* ========================================
1. CARDS
======================================== */
.card {
background: var(--color-bg-secondary);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-lg);
padding: var(--space-6);
transition: transform var(--transition-base),
border-color var(--transition-base),
box-shadow var(--transition-base);
}
.card:hover {
transform: translateY(-4px);
border-color: var(--color-border-hover);
box-shadow: var(--shadow-lg);
}
.card-header {
margin-bottom: var(--space-4);
}
.card-title {
font-size: var(--font-size-xl);
font-weight: var(--font-weight-semibold);
color: var(--color-text-primary);
margin-bottom: var(--space-2);
}
.card-subtitle {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
}
.card-body {
color: var(--color-text-secondary);
line-height: var(--line-height-relaxed);
}
.card-footer {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: var(--space-4);
padding-top: var(--space-4);
border-top: 1px solid var(--color-border-muted);
}
/* Card Variants */
.card-dl {
--card-accent: var(--color-accent-dl);
}
.card-ml {
--card-accent: var(--color-accent-ml);
}
.card-math {
--card-accent: var(--color-accent-math);
}
.card-stats {
--card-accent: var(--color-accent-stats);
}
.card-viz {
--card-accent: var(--color-accent-viz);
}
.card-prompt {
--card-accent: var(--color-accent-prompt);
}
.card-dl:hover,
.card-ml:hover,
.card-math:hover,
.card-stats:hover,
.card-viz:hover,
.card-prompt:hover {
border-color: var(--card-accent);
transform: translateY(-6px) scale(1.01);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.5),
0 0 30px color-mix(in srgb, var(--card-accent) 25%, transparent);
}
/* ========================================
2. BADGES
======================================== */
.badge {
display: inline-flex;
align-items: center;
padding: var(--space-1) var(--space-3);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
border-radius: var(--border-radius-full);
background: var(--color-bg-tertiary);
color: var(--color-text-secondary);
}
.badge-dl {
background: rgba(255, 107, 53, 0.15);
color: var(--color-accent-dl);
}
.badge-ml {
background: rgba(0, 212, 255, 0.15);
color: var(--color-accent-ml);
}
.badge-math {
background: rgba(163, 113, 247, 0.15);
color: var(--color-accent-math);
}
.badge-stats {
background: rgba(46, 204, 113, 0.15);
color: var(--color-accent-stats);
}
.badge-viz {
background: rgba(255, 206, 86, 0.15);
color: var(--color-accent-viz);
}
.badge-prompt {
background: rgba(247, 113, 182, 0.15);
color: var(--color-accent-prompt);
}
.badge-new {
background: rgba(231, 76, 60, 0.15);
color: #e74c3c;
}
.badge-core {
background: rgba(52, 152, 219, 0.15);
color: #3498db;
}
/* ========================================
3. BUTTONS
======================================== */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: var(--space-3) var(--space-5);
font-family: inherit;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
line-height: 1;
text-decoration: none;
border: 2px solid transparent;
border-radius: var(--border-radius-md);
cursor: pointer;
transition: all var(--transition-base);
white-space: nowrap;
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.btn-primary {
background: var(--color-accent-ml);
color: var(--color-bg-primary);
border-color: var(--color-accent-ml);
}
.btn-primary:hover:not(:disabled) {
background: transparent;
color: var(--color-accent-ml);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 212, 255, 0.3);
}
.btn-secondary {
background: var(--color-bg-tertiary);
color: var(--color-text-primary);
border-color: var(--color-border-default);
}
.btn-secondary:hover:not(:disabled) {
border-color: var(--color-border-hover);
background: var(--color-bg-elevated);
}
.btn-ghost {
background: transparent;
color: var(--color-text-secondary);
}
.btn-ghost:hover:not(:disabled) {
background: var(--color-bg-tertiary);
color: var(--color-text-primary);
}
.btn-icon {
padding: var(--space-2);
width: 40px;
height: 40px;
}
.btn-lg {
padding: var(--space-4) var(--space-6);
font-size: var(--font-size-base);
}
.btn-sm {
padding: var(--space-2) var(--space-3);
font-size: var(--font-size-xs);
}
/* ========================================
4. CALLOUTS / ALERTS
======================================== */
.callout {
padding: var(--space-4) var(--space-5);
border-radius: var(--border-radius-md);
border-left: 4px solid;
margin: var(--space-4) 0;
}
.callout-title {
display: flex;
align-items: center;
gap: var(--space-2);
font-weight: var(--font-weight-bold);
margin-bottom: var(--space-2);
}
.callout-info {
background: rgba(0, 212, 255, 0.08);
border-color: var(--color-accent-ml);
}
.callout-info .callout-title {
color: var(--color-accent-ml);
}
.callout-success {
background: rgba(46, 204, 113, 0.08);
border-color: var(--color-success);
}
.callout-success .callout-title {
color: var(--color-success);
}
.callout-warning {
background: rgba(243, 156, 18, 0.08);
border-color: var(--color-warning);
}
.callout-warning .callout-title {
color: var(--color-warning);
}
.callout-error {
background: rgba(231, 76, 60, 0.08);
border-color: var(--color-error);
}
.callout-error .callout-title {
color: var(--color-error);
}
.callout-tip {
background: rgba(163, 113, 247, 0.08);
border-color: var(--color-accent-math);
}
.callout-tip .callout-title {
color: var(--color-accent-math);
}
/* ========================================
5. SIDEBAR
======================================== */
.sidebar {
position: fixed;
top: 0;
left: 0;
width: var(--sidebar-width);
height: 100vh;
background: var(--color-bg-secondary);
border-right: 1px solid var(--color-border-default);
overflow-y: auto;
z-index: var(--z-sticky);
transition: transform var(--transition-slow);
}
.sidebar-header {
padding: var(--space-6);
border-bottom: 1px solid var(--color-border-default);
}
.sidebar-logo {
font-size: var(--font-size-xl);
font-weight: var(--font-weight-bold);
color: var(--color-text-primary);
}
.sidebar-nav {
padding: var(--space-4);
}
.sidebar-section {
margin-bottom: var(--space-4);
}
.sidebar-section-title {
font-size: var(--font-size-xs);
font-weight: var(--font-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--color-text-muted);
padding: var(--space-2) var(--space-3);
}
.sidebar-link {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-3) var(--space-4);
color: var(--color-text-secondary);
text-decoration: none;
border-radius: var(--border-radius-md);
transition: all var(--transition-fast);
font-size: var(--font-size-sm);
}
.sidebar-link:hover {
background: var(--color-bg-tertiary);
color: var(--color-text-primary);
text-decoration: none;
}
.sidebar-link.active {
background: var(--color-accent-ml);
color: var(--color-bg-primary);
font-weight: var(--font-weight-semibold);
}
/* ========================================
6. PROGRESS BAR
======================================== */
.progress {
width: 100%;
height: 8px;
background: var(--color-bg-tertiary);
border-radius: var(--border-radius-full);
overflow: hidden;
}
.progress-bar {
height: 100%;
background: linear-gradient(90deg, var(--color-accent-ml), var(--color-accent-math));
border-radius: var(--border-radius-full);
transition: width var(--transition-slow);
}
.progress-sm {
height: 4px;
}
.progress-lg {
height: 12px;
}
.progress-label {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--space-2);
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
}
/* ========================================
7. SEARCH
======================================== */
.search-container {
position: relative;
}
.search-input {
width: 100%;
padding: var(--space-3) var(--space-4);
padding-left: var(--space-10);
background: var(--color-bg-tertiary);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-md);
color: var(--color-text-primary);
font-family: inherit;
font-size: var(--font-size-sm);
transition: all var(--transition-fast);
}
.search-input:focus {
outline: none;
border-color: var(--color-accent-ml);
box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.2);
}
.search-input::placeholder {
color: var(--color-text-muted);
}
.search-icon {
position: absolute;
left: var(--space-4);
top: 50%;
transform: translateY(-50%);
color: var(--color-text-muted);
pointer-events: none;
}
.search-shortcut {
position: absolute;
right: var(--space-3);
top: 50%;
transform: translateY(-50%);
padding: var(--space-1) var(--space-2);
background: var(--color-bg-elevated);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-sm);
font-size: var(--font-size-xs);
color: var(--color-text-muted);
}
/* Search Modal */
.search-modal {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(4px);
display: flex;
align-items: flex-start;
justify-content: center;
padding-top: 15vh;
z-index: var(--z-modal);
opacity: 0;
visibility: hidden;
transition: all var(--transition-base);
}
.search-modal.open {
opacity: 1;
visibility: visible;
}
.search-modal-content {
width: 100%;
max-width: 600px;
background: var(--color-bg-secondary);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-lg);
box-shadow: var(--shadow-lg);
overflow: hidden;
}
.search-results {
max-height: 400px;
overflow-y: auto;
}
.search-result-item {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-3) var(--space-4);
cursor: pointer;
transition: background var(--transition-fast);
}
.search-result-item:hover,
.search-result-item.selected {
background: var(--color-bg-tertiary);
}
.search-result-title {
font-weight: var(--font-weight-medium);
color: var(--color-text-primary);
}
.search-result-module {
font-size: var(--font-size-xs);
color: var(--color-text-muted);
}
/* ========================================
8. THEME TOGGLE
======================================== */
.theme-toggle {
position: relative;
width: 60px;
height: 30px;
background: var(--color-bg-tertiary);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-full);
cursor: pointer;
transition: all var(--transition-base);
}
.theme-toggle-thumb {
position: absolute;
top: 2px;
left: 2px;
width: 24px;
height: 24px;
background: var(--color-accent-ml);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: transform var(--transition-base);
}
[data-theme="light"] .theme-toggle-thumb {
transform: translateX(30px);
background: var(--color-warning);
}
.theme-toggle-icon {
font-size: 14px;
}
/* ========================================
9. TABLES
======================================== */
.table-container {
overflow-x: auto;
border-radius: var(--border-radius-md);
border: 1px solid var(--color-border-default);
}
.table {
width: 100%;
border-collapse: collapse;
}
.table th,
.table td {
padding: var(--space-3) var(--space-4);
text-align: left;
border-bottom: 1px solid var(--color-border-default);
}
.table th {
background: var(--color-bg-tertiary);
font-weight: var(--font-weight-semibold);
font-size: var(--font-size-sm);
color: var(--color-text-primary);
}
.table td {
color: var(--color-text-secondary);
}
.table tbody tr:hover {
background: var(--color-bg-tertiary);
}
.table tbody tr:last-child td {
border-bottom: none;
}
/* ========================================
10. FORMULAS & CODE
======================================== */
.formula {
background: var(--color-bg-tertiary);
border: 1px solid var(--color-border-default);
border-left: 4px solid var(--color-accent-ml);
border-radius: var(--border-radius-md);
padding: var(--space-4) var(--space-5);
margin: var(--space-4) 0;
font-family: var(--font-family-mono);
overflow-x: auto;
}
.formula-title {
display: block;
font-weight: var(--font-weight-bold);
color: var(--color-accent-ml);
margin-bottom: var(--space-3);
font-family: var(--font-family-base);
}
.formula-main {
font-size: var(--font-size-lg);
color: var(--color-text-primary);
margin-bottom: var(--space-3);
}
.formula-explanation {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
font-family: var(--font-family-base);
}
/* ========================================
11. LOADING STATES
======================================== */
.skeleton {
background: linear-gradient(90deg,
var(--color-bg-tertiary) 25%,
var(--color-bg-elevated) 50%,
var(--color-bg-tertiary) 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
border-radius: var(--border-radius-sm);
}
@keyframes shimmer {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
.skeleton-text {
height: 1em;
margin-bottom: var(--space-2);
}
.skeleton-title {
height: 1.5em;
width: 60%;
margin-bottom: var(--space-4);
}
.skeleton-card {
height: 200px;
}
/* Spinner */
.spinner {
width: 24px;
height: 24px;
border: 3px solid var(--color-bg-tertiary);
border-top-color: var(--color-accent-ml);
border-radius: 50%;
animation: spin 1s linear infinite;
}
.spinner-lg {
width: 48px;
height: 48px;
border-width: 4px;
}
/* ========================================
12. TOOLTIPS
======================================== */
.tooltip {
position: relative;
}
.tooltip-content {
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
padding: var(--space-2) var(--space-3);
background: var(--color-bg-elevated);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-sm);
font-size: var(--font-size-xs);
color: var(--color-text-primary);
white-space: nowrap;
opacity: 0;
visibility: hidden;
transition: all var(--transition-fast);
z-index: var(--z-tooltip);
margin-bottom: var(--space-2);
}
.tooltip:hover .tooltip-content {
opacity: 1;
visibility: visible;
}
/* ========================================
13. INTERACTIVE CANVAS
======================================== */
.canvas-container {
position: relative;
background: var(--color-bg-tertiary);
border: 1px solid var(--color-border-default);
border-radius: var(--border-radius-md);
overflow: hidden;
}
.canvas-container canvas {
display: block;
width: 100%;
height: auto;
}
.canvas-controls {
display: flex;
gap: var(--space-2);
padding: var(--space-3);
background: var(--color-bg-secondary);
border-top: 1px solid var(--color-border-default);
}