Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
279 changes: 279 additions & 0 deletions static/css/main.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');

/* Tailwind CSS Base */
@tailwind base;
@tailwind components;
@tailwind utilities;

/* Custom CSS Variables for Dark Theme */
:root {
--bg-primary: #030712; /* gray-950 */
--bg-secondary: #111827; /* gray-900 */
--bg-tertiary: #1f2937; /* gray-800 */
--text-primary: #f3f4f6; /* gray-100 */
--text-secondary: #9ca3af; /* gray-400 */
--text-muted: #6b7280; /* gray-500 */
--border-color: #1f2937; /* gray-800 */
--accent-blue: #3b82f6; /* blue-500 */
--accent-purple: #8b5cf6; /* purple-500 */
--accent-green: #10b981; /* green-500 */
--accent-red: #ef4444; /* red-500 */
}

/* Base Styles */
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
}

/* Scrollbar Styling */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}

::-webkit-scrollbar-track {
background: var(--bg-secondary);
}

::-webkit-scrollbar-thumb {
background: var(--bg-tertiary);
border-radius: 4px;
}

::-webkit-scrollbar-thumb:hover {
background: #374151;
}

/* HTMX Loading Indicators */
.htmx-indicator {
display: none;
}

.htmx-request .htmx-indicator {
display: inline-block;
}

.htmx-request.htmx-indicator {
display: inline-block;
}

/* Transition Classes */
.transition-all-300 {
transition: all 300ms ease;
}

/* Custom Component Styles */

/* Player Progress Bar */
input[type="range"] {
-webkit-appearance: none;
appearance: none;
background: transparent;
}

input[type="range"]::-webkit-slider-track {
background: #374151;
height: 4px;
border-radius: 2px;
}

input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--accent-blue);
cursor: pointer;
margin-top: -4px;
opacity: 0;
transition: opacity 200ms;
}

input[type="range"]:hover::-webkit-slider-thumb {
opacity: 1;
}

/* Track List Hover Effects */
.track-item {
transition: background-color 150ms ease;
}

.track-item:hover {
background-color: var(--bg-tertiary);
}

.track-item:hover .track-actions {
opacity: 1;
}

/* Album Grid */
.album-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 1.5rem;
}

.album-card {
background: var(--bg-secondary);
border-radius: 8px;
padding: 1rem;
transition: transform 150ms ease, box-shadow 150ms ease;
cursor: pointer;
}

.album-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3);
}

.album-card img {
width: 100%;
height: auto;
aspect-ratio: 1;
object-fit: cover;
border-radius: 4px;
margin-bottom: 0.75rem;
}

/* Now Playing Animation */
@keyframes music-bars {
0%, 100% {
height: 3px;
}
50% {
height: 12px;
}
}

.music-bars {
display: flex;
align-items: flex-end;
gap: 2px;
height: 12px;
}

.music-bars span {
width: 3px;
background: var(--accent-blue);
animation: music-bars 1s ease-in-out infinite;
transform-origin: bottom;
}

.music-bars span:nth-child(2) {
animation-delay: 0.2s;
}

.music-bars span:nth-child(3) {
animation-delay: 0.4s;
}

/* Modal Backdrop */
.modal-backdrop {
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(4px);
}

/* Context Menu */
.context-menu {
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
min-width: 180px;
}

.context-menu-item {
padding: 0.5rem 1rem;
transition: background-color 150ms;
cursor: pointer;
}

.context-menu-item:hover {
background: var(--bg-tertiary);
}

/* Toast Animations */
@keyframes slide-in {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}

@keyframes slide-out {
from {
transform: translateX(0);
opacity: 1;
}
to {
transform: translateX(100%);
opacity: 0;
}
}

.toast-enter {
animation: slide-in 300ms ease-out;
}

.toast-leave {
animation: slide-out 200ms ease-in;
}

/* Skeleton Loading */
.skeleton {
background: linear-gradient(
90deg,
var(--bg-tertiary) 0%,
#374151 50%,
var(--bg-tertiary) 100%
);
background-size: 200% 100%;
animation: skeleton-loading 1.5s ease-in-out infinite;
border-radius: 4px;
}

@keyframes skeleton-loading {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}

/* Utility Classes */
.no-scrollbar::-webkit-scrollbar {
display: none;
}

.no-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
}

.text-gradient {
background: linear-gradient(135deg, var(--accent-blue) 0%, var(--accent-purple) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}

/* Responsive Utilities */
@media (max-width: 768px) {
.album-grid {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
}

@media (max-width: 640px) {
.album-grid {
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 1rem;
}
}
Loading