diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..cca4eb1a Binary files /dev/null and b/.gitignore differ diff --git a/backend/.gitignore b/backend/.gitignore index 5f493be1..e69de29b 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,49 +0,0 @@ -# Environment -.env -*.env -.env.* -!example.env # keep a template if you have one - -# Virtual Environment -venv/ -.env/ -env/ -.venv/ - -# Python cache and compiled files -__pycache__/ -*.pyc -*.pyo -*.pyd - -# Database files -*.db -*.sqlite3 - -# Django specific -/staticfiles/ -/media/ -/*.log -*.pot -*.py[cod] -local_settings.py - -# IDE / Editor settings -.vscode/ -.idea/ -*.sublime-project -*.sublime-workspace - -# Testing & coverage -.coverage -htmlcov/ -*.cover -*.log -pytest_cache/ -.tox/ -.mypy_cache/ - -# Docker / Build artifacts -build/ -dist/ -*.egg-info/ diff --git a/backend/streamify_api/settings.py b/backend/streamify_api/settings.py index cc860b13..933e4af7 100644 --- a/backend/streamify_api/settings.py +++ b/backend/streamify_api/settings.py @@ -12,6 +12,7 @@ from pathlib import Path import os + from dotenv import load_dotenv load_dotenv() import dj_database_url @@ -24,7 +25,9 @@ # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.environ["DJANGO_SECRET_KEY"] +SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY", "fallback-dev-secret-key") + + # SECURITY WARNING: don't run with debug turned on in production! DEBUG = os.environ["DEBUG"] diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2d7e5f47..993fcc06 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -888,13 +888,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", - "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.0", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -902,9 +902,9 @@ } }, "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", - "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3671,9 +3671,9 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/src/components/Miniplayer.css b/frontend/src/components/Miniplayer.css index 936f22f1..6666e39b 100644 --- a/frontend/src/components/Miniplayer.css +++ b/frontend/src/components/Miniplayer.css @@ -1,3 +1,4 @@ +/* === Base (Desktop / Tablet) === */ .mini-player { display: flex; justify-content: space-between; @@ -69,8 +70,9 @@ gap: 0.8rem; } -.mini-like { - background: #3a2323; /* dark brown */ +.mini-like, +.mini-play { + background: #3a2323; border: none; color: white; cursor: pointer; @@ -86,57 +88,83 @@ padding: 0; } -.mini-like svg { - display: block; - margin: auto; +.mini-like:active, +.mini-play:active { + background: #4a2f2f; } -.mini-like svg path { - fill: none; - stroke: #fff; - stroke-width: 2.2; - transition: fill 0.2s, stroke 0.2s; +/* === Tablet view (below 700px) === */ +@media (max-width: 700px) { + .mini-player { + bottom: 64px; /* Above navbar */ + z-index: 1003; + } } -.mini-like.liked svg path { - fill: #fff !important; - stroke: #fff !important; -} +/* === Mobile view (below 480px) === */ +@media (max-width: 400px) { + .mini-player { + flex-direction: row; + height: auto; + justify-content: space-between; + padding: 0.6rem 0.8rem; + border-radius: 0; + bottom: 56px; /* slightly adjusted for smaller navbars */ + } -.mini-like:active { - background: #4a2f2f; -} + .mini-meta { + gap: 0.5rem; + } -.mini-play { - background: #3a2323; /* dark brown */ - border: none; - color: white; - cursor: pointer; - font-size: 1rem; - width: 40px; - height: 40px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - transition: background 0.2s; - box-shadow: 0 2px 8px rgba(0,0,0,0.10); - padding: 0; -} + .mini-cover { + width: 30px; + height: 30px; + } -.mini-play svg { - display: block; - margin: auto; -} + .mini-title { + font-size: 0.8rem; + } -.mini-play:active { - background: #4a2f2f; + .mini-artist { + font-size: 0.7rem; + } + + .mini-controls { + gap: 0.5rem; + } + + .mini-like, + .mini-play { + width: 34px; + height: 34px; + font-size: 0.9rem; + } + + .mini-text { + max-width: 100px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } } -@media (max-width: 700px) { +/* === Very small devices (below 360px) === */ +@media (max-width: 360px) { .mini-player { - bottom: 64px; /* Place above navbar (navbar height is 64px) */ - z-index: 1003; + padding: 0.5rem 0.6rem; + } + + .mini-title { + font-size: 0.75rem; + } + + .mini-artist { + display: none; /* hide artist text to save space */ + } + + .mini-cover { + width: 36px; + height: 36px; } } .volume-container {