/* Root Variables */
:root {
/* Light Mode Colors */
--primary-color: #3498db;
--primary-dark: #2980b9;
--secondary-color: #2ecc71;
--secondary-dark: #27ae60;
--accent-color: #9b59b6;
--accent-dark: #8e44ad;
--background-color: #f8f9fa;
--surface-color: #ffffff;
--text-primary: #2c3e50;
--text-secondary: #7f8c8d;
--border-color: #e0e0e0;
--shadow-sm: 0 2px 4px rgba(0,0,0,0.05);
--shadow-md: 0 4px 6px rgba(0,0,0,0.1);
--shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
/* Enhanced Typography */
--font-heading: 'Montserrat', 'Segoe UI', system-ui, -apple-system, sans-serif;
--font-body: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
--font-mono: 'JetBrains Mono', 'Courier New', monospace;
}
/* Dark Mode Colors */
[data-theme="dark"] {
--primary-color: #60a5fa;
--primary-dark: #3b82f6;
--secondary-color: #10b981;
--secondary-dark: #059669;
--accent-color: #c084fc;
--accent-dark: #a855f7;
--background-color: #111827;
--surface-color: #1f2937;
--text-primary: #f9fafb;
--text-secondary: #e5e7eb;
--border-color: #374151;
--shadow-sm: 0 2px 4px rgba(0,0,0,0.3);
--shadow-md: 0 4px 6px rgba(0,0,0,0.4);
--shadow-lg: 0 10px 15px rgba(0,0,0,0.5);
}
/* Reset & Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* Font imports */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Montserrat:wght@500;600;700&display=swap');
body {
font-family: var(--font-body);
background-color: var(--background-color);
color: var(--text-primary);
line-height: 1.6;
transition: background-color 0.3s ease, color 0.3s ease;
}
h1, h2, h3, h4, h5, h6 {
font-family: var(--font-heading);
font-weight: 600;
line-height: 1.3;
margin-bottom: 0.5em;
color: var(--text-primary);
}
code, pre {
font-family: var(--font-mono);
font-size: 0.9em;
}
/* Theme Toggle */
.theme-toggle {
position: fixed;
top: 1rem;
right: 1rem;
z-index: 1001;
display: flex;
align-items: center;
gap: 0.5rem;
background-color: var(--surface-color);
border-radius: 2rem;
padding: 0.35rem;
box-shadow: var(--shadow-md);
cursor: pointer;
border: 1px solid var(--border-color);
transition: all 0.2s ease;
}
.theme-toggle:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.theme-toggle-icon {
display: flex;
align-items: center;
justify-content: center;
width: 2rem;
height: 2rem;
font-size: 1.2rem;
border-radius: 50%;
color: var(--text-primary);
transition: all 0.3s ease;
}
.theme-toggle-icon.light-icon {
background-color: var(--primary-color);
color: white;
transform: var(--theme-light-transform, scale(1));
opacity: var(--theme-light-opacity, 1);
}
.theme-toggle-icon.dark-icon {
background-color: transparent;
transform: var(--theme-dark-transform, scale(0.8));
opacity: var(--theme-dark-opacity, 0.5);
}
[data-theme="dark"] .theme-toggle-icon.light-icon {
background-color: transparent;
transform: scale(0.8);
opacity: 0.5;
}
[data-theme="dark"] .theme-toggle-icon.dark-icon {
background-color: var(--accent-color);
color: white;
transform: scale(1);
opacity: 1;
}
/* Layout */
.app-container {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.app-header {
background-color: var(--surface-color);
padding: 1rem 2rem;
box-shadow: var(--shadow-sm);
}
.logo-container {
display: flex;
align-items: center;
gap: 1rem;
}
.logo-icon {
font-size: 2rem;
color: var(--primary-color);
}
.main-content {
flex: 1;
max-width: 1400px;
margin: 2rem auto;
padding: 0 2rem;
display: grid;
gap: 2rem;
grid-template-rows: auto minmax(0, 1fr);
}
/* Upload Panel */
.upload-panel {
background-color: var(--surface-color);
border-radius: var(--radius-lg);
padding: 2rem;
box-shadow: var(--shadow-md);
max-height: fit-content;
overflow: hidden;
}
.upload-section {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 2rem;
margin-bottom: 2rem;
}
.upload-container {
border: 2px dashed rgba(52, 152, 219, 0.3);
border-radius: var(--radius-lg);
padding: 2.5rem;
text-align: center;
transition: all 0.3s ease;
cursor: pointer;
background: linear-gradient(135deg, rgba(52, 152, 219, 0.02) 0%, rgba(52, 152, 219, 0.08) 100%);
position: relative;
overflow: hidden;
}
.upload-container::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(circle at center, rgba(52, 152, 219, 0.1) 0%, transparent 70%);
opacity: 0;
transition: opacity 0.3s ease;
}
.upload-container:hover {
border-color: var(--primary-color);
transform: translateY(-5px);
box-shadow: 0 15px 30px -10px rgba(52, 152, 219, 0.15);
}
.upload-container:hover::before {
opacity: 1;
}
.upload-icon-container {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: rgba(52, 152, 219, 0.1);
margin: 0 auto 1.5rem;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
}
.upload-container:hover .upload-icon-container {
background-color: rgba(52, 152, 219, 0.2);
transform: scale(1.1);
}
.upload-icon {
font-size: 2.5rem;
color: var(--primary-color);
transition: all 0.3s ease;
}
.upload-container:hover .upload-icon {
transform: translateY(-5px);
}
.upload-text {
font-family: var(--font-heading);
font-size: 1.25rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
.upload-subtext {
font-size: 0.95rem;
color: var(--text-secondary);
max-width: 80%;
margin: 0 auto;
}
/* Upload file particles */
.particles {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
opacity: 0;
transition: opacity 0.3s ease;
}
.particle {
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background-color: var(--primary-color);
opacity: 0;
}
.upload-container:hover .particles {
opacity: 1;
}
@keyframes particleAnimation {
0% { transform: translateY(0) scale(0); opacity: 0; }
50% { opacity: 0.8; }
100% { transform: translateY(-100px) scale(1); opacity: 0; }
}
/* Upload Progress Animations */
.upload-progress {
width: 100%;
height: 4px;
margin-top: 1.5rem;
background-color: rgba(52, 152, 219, 0.1);
border-radius: 2px;
overflow: hidden;
opacity: 0;
transition: opacity 0.3s ease;
}
.upload-progress-bar {
height: 100%;
width: 0;
background: linear-gradient(90deg, var(--primary-color), var(--primary-dark));
border-radius: 2px;
transition: width 0.3s ease;
}
.upload-container.uploading .upload-progress {
opacity: 1;
}
/* Dark Mode Adjustments */
[data-theme="dark"] .upload-container {
border-color: rgba(96, 165, 250, 0.3);
background: linear-gradient(135deg, rgba(30, 41, 59, 0.5) 0%, rgba(30, 41, 59, 0.8) 100%);
}
[data-theme="dark"] .upload-container::before {
background: radial-gradient(circle at center, rgba(96, 165, 250, 0.15) 0%, transparent 70%);
}
[data-theme="dark"] .upload-icon-container {
background-color: rgba(96, 165, 250, 0.15);
}
/* Model Selector */
.model-selector {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.model-label {
font-weight: 500;
color: var(--text-primary);
}
.select-wrapper {
position: relative;
}
.select-wrapper select {
width: 100%;
padding: 0.75rem;
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
appearance: none;
background-color: var(--surface-color);
font-size: 1rem;
color: var(--text-primary);
}
.select-icon {
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
color: var(--text-secondary);
pointer-events: none;
}
.model-status {
font-size: 0.9rem;
color: var(--text-secondary);
}
/* Video Preview */
.video-preview {
margin: 2rem 0;
border-radius: var(--radius-md);
overflow: hidden;
background-color: #000;
position: relative;
box-shadow: 0 15px 25px -5px rgba(0, 0, 0, 0.15),
0 10px 10px -5px rgba(0, 0, 0, 0.05);
}
.video-preview video {
width: 100%;
object-fit: contain;
display: block;
}
.video-preview::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 90px;
background: linear-gradient(to top, rgba(0,0,0,0.5) 0%, transparent 100%);
pointer-events: none;
opacity: 0;
transition: opacity 0.3s ease;
}
.video-preview:hover::after {
opacity: 1;
}
.video-controls {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 1rem;
display: flex;
align-items: center;
gap: 1rem;
z-index: 10;
opacity: 0;
transform: translateY(10px);
transition: all 0.3s ease;
}
.video-preview:hover .video-controls {
opacity: 1;
transform: translateY(0);
}
.video-progress {
flex: 1;
height: 4px;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 2px;
overflow: hidden;
cursor: pointer;
position: relative;
}
.video-progress-bar {
height: 100%;
width: 0;
background-color: var(--primary-color);
border-radius: 2px;
position: relative;
}
.video-progress-handle {
position: absolute;
right: -6px;
top: 50%;
transform: translateY(-50%);
width: 12px;
height: 12px;
border-radius: 50%;
background-color: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: opacity 0.2s ease;
}
.video-progress:hover .video-progress-handle {
opacity: 1;
}
.video-control-button {
background: transparent;
border: none;
color: white;
cursor: pointer;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.2s ease;
}
.video-control-button:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.video-time {
color: white;
font-family: var(--font-mono);
font-size: 0.85rem;
min-width: 50px;
text-align: center;
}
.video-preview.playing .video-play-icon {
display: none;
}
.video-preview:not(.playing) .video-pause-icon {
display: none;
}
/* Action Buttons */
.action-buttons {
display: flex;
gap: 1rem;
margin-bottom: 1.5rem;
}
.primary-button, .secondary-button {
padding: 0.75rem 1.5rem;
border: none;
border-radius: var(--radius-sm);
font-size: 1rem;
font-weight: 500;
cursor: pointer;
display: flex;
align-items: center;
gap: 0.5rem;
transition: all 0.2s ease;
}
.primary-button {
background-color: var(--primary-color);
color: white;
}
.primary-button:hover {
background-color: var(--primary-dark);
}
.secondary-button {
background-color: var(--secondary-color);
color: white;
}
.secondary-button:hover {
background-color: var(--secondary-dark);
}
.primary-button:disabled, .secondary-button:disabled {
background-color: var(--text-secondary);
cursor: not-allowed;
opacity: 0.7;
}
/* Progress Bar */
.progress-container {
background-color: var(--background-color);
padding: 1.5rem;
border-radius: var(--radius-md);
}
.status-text {
margin-bottom: 0.75rem;
color: var(--text-secondary);
}
.progress-bar {
height: 0.5rem;
background-color: var(--border-color);
border-radius: 999px;
overflow: hidden;
}
.progress {
height: 100%;
background-color: var(--primary-color);
transition: width 0.3s ease;
}
/* Results Panel */
.results-panel {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
max-height: calc(100vh - 600px);
min-height: 500px;
overflow: hidden;
}
.transcription-container, .topics-container {
background-color: var(--surface-color);
border-radius: var(--radius-lg);
padding: 1.5rem;
box-shadow: var(--shadow-md);
display: flex;
flex-direction: column;
max-height: 100%;
overflow: hidden;
}
h2 {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 1rem;
padding-bottom: 0.75rem;
border-bottom: 2px solid var(--border-color);
}
.transcription-content, .topics-content {
max-height: 500px;
overflow-y: auto;
padding: 1rem;
background-color: var(--background-color);
border-radius: var(--radius-md);
font-size: 0.95rem;
line-height: 1.7;
height: 500px;
overflow-y: auto;
overflow-x: hidden;
word-wrap: break-word;
}
/* Topic Styles */
.topic {
margin-bottom: 1.5rem;
padding: 1rem;
background-color: var(--surface-color);
border-left: 4px solid var(--primary-color);
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
box-shadow: var(--shadow-sm);
}
.topic-header {
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
.topic-content {
color: var(--text-secondary);
}
/* Mindmap Overlay */
.mindmap-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: var(--background-color);
z-index: 1000;
display: none;
}
.mindmap-overlay.active {
display: block;
}
.mindmap-content {
display: flex;
height: 100vh;
}
/* Video Section */
.video-section {
width: 40%;
padding: 2rem;
background-color: var(--surface-color);
border-right: 1px solid var(--border-color);
display: none;
}
.video-section.active {
display: block;
}
.video-player-container {
border-radius: var(--radius-md);
overflow: hidden;
background-color: #000;
margin-bottom: 1rem;
}
.video-player-container video {
width: 100%;
object-fit: contain;
display: block;
}
.video-info {
padding: 1rem;
background-color: var(--background-color);
border-radius: var(--radius-md);
font-size: 0.9rem;
color: var(--text-secondary);
}
/* Mindmap Section */
.mindmap-section {
flex: 1;
position: relative;
overflow: hidden;
}
.mindmap-toolbar {
position: absolute;
top: 1rem;
left: 1rem;
z-index: 100;
display: flex;
gap: 0.5rem;
background-color: var(--surface-color);
padding: 0.5rem;
border-radius: var(--radius-md);
box-shadow: var(--shadow-md);
}
.tool-button {
padding: 0.5rem 1rem;
border: none;
border-radius: var(--radius-sm);
background-color: var(--surface-color);
color: var(--text-primary);
cursor: pointer;
display: flex;
align-items: center;
gap: 0.5rem;
transition: all 0.2s ease;
}
.tool-button:hover {
background-color: var(--background-color);
color: var(--primary-color);
}
.tool-button.active {
background-color: var(--primary-color);
color: white;
}
.fullscreen-mindmap {
width: 100%;
height: calc(100vh - 4rem);
position: relative;
overflow: hidden;
}
/* Responsive Design */
@media (max-width: 1200px) {
.main-content {
padding: 0 1rem;
}
.results-panel {
grid-template-columns: 1fr;
}
}
@media (max-width: 768px) {
.upload-section {
grid-template-columns: 1fr;
}
.mindmap-content {
flex-direction: column;
}
.video-section {
width: 100%;
border-right: none;
border-bottom: 1px solid var(--border-color);
}
.tool-button {
padding: 0.5rem;
}
.tool-button span {
display: none;
}
}
@media (max-width: 480px) {
.action-buttons {
flex-direction: column;
}
.primary-button, .secondary-button {
width: 100%;
justify-content: center;
}
}
/* Custom Mindmap Node Styles */
jmnode {
box-shadow: var(--shadow-sm);
border-radius: var(--radius-md);
padding: 8px 12px !important;
transition: all 0.2s ease;
}
jmnode:hover {
box-shadow: var(--shadow-md);
transform: translateY(-1px);
}
/* Improved Expand/Collapse Buttons */
jmexpander {
width: 20px !important;
height: 20px !important;
border-radius: 50% !important;
background-color: var(--surface-color) !important;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
display: flex !important;
align-items: center;
justify-content: center;
font-size: 16px !important;
font-weight: bold;
color: var(--primary-color) !important;
transition: all 0.2s ease;
text-indent: -9999px !important;
overflow: hidden !important;
font-size: 0 !important;
}
jmexpander:hover {
background-color: var(--primary-color) !important;
color: white !important;
transform: scale(1.1);
}
/* Custom icons for expander instead of +/- */
jmexpander.expand {
background-image: url('data:image/svg+xml;utf8,') !important;
background-position: center !important;
background-repeat: no-repeat !important;
background-size: 12px !important;
}
jmexpander.collapse {
background-image: url('data:image/svg+xml;utf8,') !important;
background-position: center !important;
background-repeat: no-repeat !important;
background-size: 12px !important;
}
jmexpander.expand:hover, jmexpander.collapse:hover {
background-color: var(--primary-color) !important;
background-image: url('data:image/svg+xml;utf8,') !important;
background-size: 12px !important;
}
jmexpander.collapse:hover {
background-image: url('data:image/svg+xml;utf8,') !important;
}
/* Video Close Button */
.video-close-button {
position: absolute;
top: 1rem;
right: 1rem;
width: 36px;
height: 36px;
border-radius: 50%;
background-color: var(--surface-color);
color: var(--text-primary);
border: none;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
box-shadow: var(--shadow-sm);
transition: all 0.2s ease;
z-index: 10;
}
.video-close-button:hover {
background-color: #f8f9fa;
color: var(--primary-color);
box-shadow: var(--shadow-md);
}
/* Line style improvements */
jmnode.root {
background-color: var(--primary-color) !important;
color: white !important;
}
jmnode.root jmexpander {
background-color: white !important;
}
/* Connection lines styling */
jmexpander::before {
border-color: var(--primary-color) !important;
}
/* Node Context Menu */
.node-context-menu {
position: absolute;
background-color: var(--surface-color);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
padding: 0.5rem 0;
z-index: 2000;
min-width: 180px;
font-size: 0.9rem;
opacity: 0;
transform: scale(0.95);
transform-origin: top left;
transition: opacity 0.15s ease, transform 0.15s ease;
pointer-events: none;
}
.node-context-menu.visible {
opacity: 1;
transform: scale(1);
pointer-events: auto;
}
.context-menu-item {
padding: 0.6rem 1rem;
display: flex;
align-items: center;
gap: 0.75rem;
cursor: pointer;
transition: all 0.15s ease;
color: var(--text-primary);
}
.context-menu-item:hover {
background-color: rgba(52, 152, 219, 0.1);
color: var(--primary-color);
}
.context-menu-item i {
width: 16px;
text-align: center;
}
.context-menu-separator {
height: 1px;
background-color: var(--border-color);
margin: 0.5rem 0;
}
/* Node color picker */
.color-picker-container {
padding: 0.5rem 1rem;
}
.color-picker-label {
display: block;
margin-bottom: 0.5rem;
font-size: 0.9rem;
color: var(--text-secondary);
}
.color-options {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.color-option {
width: 24px;
height: 24px;
border-radius: 50%;
cursor: pointer;
position: relative;
transition: transform 0.2s ease;
}
.color-option:hover {
transform: scale(1.15);
}
.color-option.selected::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 10px;
height: 10px;
border-radius: 50%;
background-color: white;
}
/* Node edit input */
.node-edit-input {
position: absolute;
z-index: 2000;
padding: 8px 12px;
border: 2px solid var(--primary-color);
border-radius: var(--radius-md);
box-shadow: var(--shadow-md);
font-family: inherit;
font-size: 14px;
background-color: var(--surface-color);
width: auto;
min-width: 150px;
}
/* Custom node colors */
jmnode.node-blue {
background-color: #3498db !important;
color: white !important;
}
jmnode.node-green {
background-color: #2ecc71 !important;
color: white !important;
}
jmnode.node-red {
background-color: #e74c3c !important;
color: white !important;
}
jmnode.node-purple {
background-color: #9b59b6 !important;
color: white !important;
}
jmnode.node-orange {
background-color: #e67e22 !important;
color: white !important;
}
jmnode.node-yellow {
background-color: #f1c40f !important;
color: #34495e !important;
}
jmnode.node-teal {
background-color: #1abc9c !important;
color: white !important;
}
jmnode.node-gray {
background-color: #95a5a6 !important;
color: white !important;
}
/* Node hover states with color indication */
jmnode.node-blue:hover, jmnode.node-green:hover, jmnode.node-red:hover,
jmnode.node-purple:hover, jmnode.node-orange:hover, jmnode.node-yellow:hover,
jmnode.node-teal:hover, jmnode.node-gray:hover {
filter: brightness(1.1);
}
/* Floating Action Button (FAB) */
.fab-container {
position: fixed;
bottom: 2rem;
right: 2rem;
z-index: 999;
display: flex;
flex-direction: column-reverse;
align-items: center;
gap: 0.75rem;
}
.fab-button {
width: 3.5rem;
height: 3.5rem;
border-radius: 50%;
background-color: var(--primary-color);
color: white;
border: none;
box-shadow: var(--shadow-lg);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.fab-button:hover {
transform: scale(1.1);
background-color: var(--primary-dark);
}
.fab-button:active {
transform: scale(0.95);
}
.fab-options {
display: flex;
flex-direction: column;
gap: 0.75rem;
opacity: 0;
pointer-events: none;
transform: translateY(1rem);
transition: all 0.3s ease;
}
.fab-container.active .fab-options {
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.fab-container.active .fab-button {
transform: rotate(45deg);
background-color: var(--accent-color);
}
.fab-option {
width: 2.5rem;
height: 2.5rem;
border-radius: 50%;
background-color: var(--surface-color);
color: var(--text-primary);
border: none;
box-shadow: var(--shadow-md);
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
cursor: pointer;
transition: all 0.2s ease;
position: relative;
}
.fab-option:hover {
transform: scale(1.1);
color: var(--primary-color);
}
.fab-option:hover::after {
content: attr(title);
position: absolute;
right: calc(100% + 0.75rem);
background-color: var(--surface-color);
color: var(--text-primary);
padding: 0.25rem 0.5rem;
border-radius: var(--radius-sm);
font-size: 0.8rem;
white-space: nowrap;
box-shadow: var(--shadow-sm);
}
/* Results Gallery */
.gallery-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
pointer-events: none;
transition: opacity 0.3s ease;
}
.gallery-container.active {
opacity: 1;
pointer-events: auto;
}
.gallery-content {
width: 90%;
max-width: 1200px;
height: 80%;
background-color: var(--surface-color);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-lg);
overflow: hidden;
display: flex;
flex-direction: column;
transform: scale(0.95);
transition: transform 0.3s ease;
}
.gallery-container.active .gallery-content {
transform: scale(1);
}
.gallery-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--border-color);
}
.gallery-header h2 {
margin: 0;
font-size: 1.5rem;
color: var(--text-primary);
}
.gallery-close {
width: 2rem;
height: 2rem;
border-radius: 50%;
background-color: transparent;
color: var(--text-primary);
border: none;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
cursor: pointer;
transition: all 0.2s ease;
}
.gallery-close:hover {
background-color: rgba(0, 0, 0, 0.1);
color: var(--primary-color);
}
.gallery-content {
padding: 1.5rem;
overflow-y: auto;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5rem;
}
.gallery-item {
border-radius: var(--radius-md);
overflow: hidden;
box-shadow: var(--shadow-md);
background-color: var(--background-color);
transition: all 0.2s ease;
cursor: pointer;
aspect-ratio: 16/9;
position: relative;
}
.gallery-item:hover {
transform: translateY(-0.5rem);
box-shadow: var(--shadow-lg);
}
.gallery-item-preview {
width: 100%;
height: 75%;
object-fit: cover;
background-color: var(--primary-color);
opacity: 0.8;
}
.gallery-item-info {
padding: 0.75rem;
display: flex;
flex-direction: column;
}
.gallery-item-title {
font-weight: 600;
font-size: 1rem;
color: var(--text-primary);
margin-bottom: 0.25rem;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
.gallery-item-date {
font-size: 0.8rem;
color: var(--text-secondary);
}
/* Dark Mode Adjustments for existing components */
[data-theme="dark"] .app-header {
background-color: var(--surface-color);
border-bottom: 1px solid var(--border-color);
}
[data-theme="dark"] .logo-icon {
color: var(--primary-color);
}
[data-theme="dark"] .transcription-content,
[data-theme="dark"] .topics-content {
background-color: #2d3748;
border: 1px solid var(--border-color);
}
[data-theme="dark"] .progress-container {
background-color: #2d3748;
}
[data-theme="dark"] .topic {
background-color: #2d3748;
border-left: 4px solid var(--primary-color);
}
[data-theme="dark"] jmnode {
background-color: #2d3748 !important;
color: var(--text-primary) !important;
}
[data-theme="dark"] jmnode.root {
background-color: var(--primary-color) !important;
color: white !important;
}
[data-theme="dark"] jmexpander {
background-color: #4a5568 !important;
}
[data-theme="dark"] .node-context-menu {
background-color: #2d3748;
border: 1px solid var(--border-color);
}
[data-theme="dark"] .context-menu-separator {
background-color: var(--border-color);
}
[data-theme="dark"] .context-menu-item:hover {
background-color: #4a5568;
}
/* 1. Elevated Card Design System */
.card {
background-color: var(--surface-color);
border-radius: var(--radius-lg);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05),
0 8px 10px -6px rgba(0, 0, 0, 0.02);
overflow: hidden;
border: 1px solid rgba(0, 0, 0, 0.04);
transition: all 0.3s ease;
}
.card:hover {
box-shadow: 0 15px 30px -5px rgba(0, 0, 0, 0.07),
0 10px 15px -3px rgba(0, 0, 0, 0.04);
transform: translateY(-2px);
}
.card-header {
padding: 1.25rem 1.5rem;
border-bottom: 1px solid var(--border-color);
display: flex;
align-items: center;
justify-content: space-between;
}
.card-title {
font-family: var(--font-heading);
font-weight: 600;
font-size: 1.2rem;
margin: 0;
display: flex;
align-items: center;
gap: 0.75rem;
color: var(--text-primary);
}
.card-title i {
color: var(--primary-color);
font-size: 1.3rem;
}
.card-body {
padding: 1.5rem;
}
.card-footer {
padding: 1.25rem 1.5rem;
border-top: 1px solid var(--border-color);
background-color: rgba(0, 0, 0, 0.01);
}
/* 2. Micro-Interactions & Transitions */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
@keyframes shimmer {
0% { background-position: -1000px 0; }
100% { background-position: 1000px 0; }
}
.animate-fade-in {
animation: fadeIn 0.4s ease forwards;
}
.animate-pulse {
animation: pulse 2s infinite ease-in-out;
}
/* 4. Custom Video Player Controls */
.video-preview {
margin: 2rem 0;
border-radius: var(--radius-md);
overflow: hidden;
background-color: #000;
position: relative;
box-shadow: 0 15px 25px -5px rgba(0, 0, 0, 0.15),
0 10px 10px -5px rgba(0, 0, 0, 0.05);
}
.video-preview::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 90px;
background: linear-gradient(to top, rgba(0,0,0,0.5) 0%, transparent 100%);
pointer-events: none;
opacity: 0;
transition: opacity 0.3s ease;
}
.video-preview:hover::after {
opacity: 1;
}
.video-controls {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 1rem;
display: flex;
align-items: center;
gap: 1rem;
z-index: 10;
opacity: 0;
transform: translateY(10px);
transition: all 0.3s ease;
}
.video-preview:hover .video-controls {
opacity: 1;
transform: translateY(0);
}
.video-progress {
flex: 1;
height: 4px;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 2px;
overflow: hidden;
cursor: pointer;
position: relative;
}
.video-progress-bar {
height: 100%;
width: 0;
background-color: var(--primary-color);
border-radius: 2px;
position: relative;
}
.video-progress-handle {
position: absolute;
right: -6px;
top: 50%;
transform: translateY(-50%);
width: 12px;
height: 12px;
border-radius: 50%;
background-color: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: opacity 0.2s ease;
}
.video-progress:hover .video-progress-handle {
opacity: 1;
}
.video-control-button {
background: transparent;
border: none;
color: white;
cursor: pointer;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.2s ease;
}
.video-control-button:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.video-time {
color: white;
font-family: var(--font-mono);
font-size: 0.85rem;
min-width: 50px;
text-align: center;
}
.video-preview.playing .video-play-icon {
display: none;
}
.video-preview:not(.playing) .video-pause-icon {
display: none;
}
/* 5. Streamlined Action Buttons */
.action-button {
padding: 0.9rem 1.8rem;
border: none;
border-radius: var(--radius-md);
font-size: 1rem;
font-weight: 600;
font-family: var(--font-heading);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 0.75rem;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
position: relative;
overflow: hidden;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.action-button::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(120deg, rgba(255,255,255,0) 30%, rgba(255,255,255,0.3) 50%, rgba(255,255,255,0) 70%);
transform: translateX(-100%);
transition: all 0.6s ease;
}
.action-button:hover::before {
transform: translateX(100%);
}
.action-button i {
font-size: 1.1rem;
transition: transform 0.3s ease;
}
.action-button:hover i {
transform: scale(1.2);
}
.action-button:active {
transform: translateY(2px);
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.action-button.primary {
background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
color: white;
}
.action-button.primary:hover {
background: linear-gradient(135deg, var(--primary-dark), var(--primary-color));
box-shadow: 0 10px 15px -3px rgba(52, 152, 219, 0.3),
0 4px 6px -2px rgba(52, 152, 219, 0.15);
}
.action-button.secondary {
background: linear-gradient(135deg, var(--secondary-color), var(--secondary-dark));
color: white;
}
.action-button.secondary:hover {
background: linear-gradient(135deg, var(--secondary-dark), var(--secondary-color));
box-shadow: 0 10px 15px -3px rgba(46, 204, 113, 0.3),
0 4px 6px -2px rgba(46, 204, 113, 0.15);
}
.action-button.disabled {
opacity: 0.7;
cursor: not-allowed;
background: #95a5a6;
}
.action-button.disabled::before {
display: none;
}
.action-button.processing {
position: relative;
overflow: hidden;
}
.action-button.processing::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
transparent 25%,
rgba(255, 255, 255, 0.3) 50%,
transparent 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite linear;
}
/* 6. Content Container Improvements */
.content-container {
background-color: var(--surface-color);
border-radius: var(--radius-lg);
overflow: hidden;
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05),
0 8px 10px -6px rgba(0, 0, 0, 0.02);
display: flex;
flex-direction: column;
height: 100%;
transition: all 0.3s ease;
border: 1px solid var(--border-color);
}
.content-header {
padding: 1.25rem 1.5rem;
border-bottom: 1px solid var(--border-color);
display: flex;
align-items: center;
gap: 0.75rem;
}
.content-title {
font-family: var(--font-heading);
font-weight: 600;
font-size: 1.2rem;
margin: 0;
color: var(--text-primary);
display: flex;
align-items: center;
gap: 0.75rem;
}
.content-title i {
color: var(--primary-color);
font-size: 1.3rem;
}
.content-body {
flex: 1;
overflow: hidden;
position: relative;
}
.content-scroll {
height: 100%;
overflow-y: auto;
padding: 1.5rem;
scrollbar-width: thin;
scrollbar-color: var(--border-color) transparent;
}
.content-scroll::-webkit-scrollbar {
width: 6px;
}
.content-scroll::-webkit-scrollbar-track {
background: transparent;
}
.content-scroll::-webkit-scrollbar-thumb {
background-color: var(--border-color);
border-radius: 20px;
}
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3rem 1.5rem;
color: var(--text-secondary);
text-align: center;
}
.empty-state i {
font-size: 3rem;
margin-bottom: 1rem;
opacity: 0.5;
}
.empty-state-title {
font-weight: 600;
margin-bottom: 0.5rem;
color: var(--text-primary);
}
.empty-state-description {
max-width: 300px;
margin: 0 auto;
font-size: 0.95rem;
}
/* 7. Status/Progress Visualization */
.status-progress {
margin-top: 1.5rem;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.status-text {
display: flex;
align-items: center;
gap: 0.5rem;
color: var(--text-secondary);
font-size: 0.95rem;
}
.status-text i {
color: var(--primary-color);
}
.progress-container {
background-color: var(--background-color);
padding: 1.5rem;
border-radius: var(--radius-md);
overflow: hidden;
}
.progress-steps {
display: flex;
margin-bottom: 1rem;
position: relative;
}
.progress-step {
flex: 1;
text-align: center;
position: relative;
padding-bottom: 1.5rem;
}
.progress-step-indicator {
width: 24px;
height: 24px;
border-radius: 50%;
background-color: var(--surface-color);
border: 2px solid var(--border-color);
margin: 0 auto 0.5rem;
display: flex;
align-items: center;
justify-content: center;
position: relative;
z-index: 2;
transition: all 0.3s ease;
}
.progress-step-line {
position: absolute;
top: 12px;
left: 0;
right: 0;
height: 2px;
background-color: var(--border-color);
z-index: 1;
}
.progress-step-icon {
color: var(--text-secondary);
font-size: 0.8rem;
opacity: 0;
transition: all 0.3s ease;
}
.progress-step-label {
font-size: 0.8rem;
font-weight: 500;
color: var(--text-secondary);
transition: all 0.3s ease;
}
.progress-step.active .progress-step-indicator {
background-color: var(--primary-color);
border-color: var(--primary-color);
transform: scale(1.1);
box-shadow: 0 0 0 4px rgba(52, 152, 219, 0.2);
}
.progress-step.active .progress-step-icon {
opacity: 1;
color: white;
}
.progress-step.active .progress-step-label {
color: var(--primary-color);
font-weight: 600;
}
.progress-step.completed .progress-step-indicator {
background-color: var(--primary-color);
border-color: var(--primary-color);
}
.progress-step.completed .progress-step-icon {
opacity: 1;
color: white;
}
.progress-step.completed + .progress-step .progress-step-line,
.progress-step.active + .progress-step .progress-step-line {
background: linear-gradient(to right, var(--primary-color) 0%, var(--border-color) 100%);
}
.progress-step.completed .progress-step-line {
background-color: var(--primary-color);
}
.progress-bar {
height: 6px;
background-color: var(--border-color);
border-radius: 3px;
overflow: hidden;
margin: 0.5rem 0;
}
.progress-bar-fill {
height: 100%;
background: linear-gradient(90deg, var(--primary-color), var(--primary-dark));
border-radius: 3px;
transition: width 0.3s ease;
position: relative;
overflow: hidden;
}
.progress-bar-fill::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.4) 50%,
rgba(255, 255, 255, 0) 100%
);
animation: shimmer 2s infinite linear;
transform: translateX(-100%);
}
/* Dark mode adjustments */
[data-theme="dark"] .content-container {
border-color: var(--border-color);
}
[data-theme="dark"] .progress-container {
background-color: #2d3748;
}
[data-theme="dark"] .progress-step-indicator {
background-color: #4a5568;
border-color: #4a5568;
}
[data-theme="dark"] .progress-step-line {
background-color: #4a5568;
}
[data-theme="dark"] .progress-bar {
background-color: #4a5568;
}
.transcription-content {
width: 100%;
line-height: 1.6;
}
.transcription-content p {
margin-bottom: 8px;
padding: 8px;
border-radius: var(--radius-sm);
transition: background-color 0.2s ease;
}
.transcription-content p:hover {
background-color: rgba(52, 152, 219, 0.1);
}