diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..60c69e7 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,449 @@ +/* === Reset & Base === */ +*, *::before, *::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, body { + width: 100%; + height: 100%; + overflow: hidden; + background: #000; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + cursor: none; +} + +body.setup-mode { + cursor: default; +} + +/* === Screens === */ +.screen { + position: absolute; + top: 0; left: 0; + width: 100%; height: 100%; +} + +/* === Setup Screen === */ +#setup-screen { + background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 50%, #16213e 100%); + display: flex; + align-items: center; + justify-content: center; + cursor: default; +} + +.setup-container { + width: 90%; + max-width: 600px; + max-height: 90vh; + overflow-y: auto; + padding: 2rem; +} + +.setup-header { + text-align: center; + margin-bottom: 2rem; +} + +.setup-header h1 { + font-size: 2.2rem; + font-weight: 300; + letter-spacing: 0.05em; + margin-bottom: 0.5rem; +} + +.subtitle { + font-size: 0.95rem; + color: #888; +} + +.subtitle.connected { + color: #4ade80; +} + +.subtitle.error { + color: #f87171; +} + +/* === Source Buttons === */ +.section h2 { + font-size: 1rem; + font-weight: 500; + color: #aaa; + text-transform: uppercase; + letter-spacing: 0.1em; + margin-bottom: 1rem; +} + +.source-buttons { + display: flex; + gap: 0.75rem; + margin-bottom: 1rem; +} + +.source-btn { + flex: 1; + padding: 1rem; + background: rgba(255, 255, 255, 0.06); + border: 2px solid rgba(255, 255, 255, 0.1); + border-radius: 12px; + color: #fff; + font-size: 0.95rem; + cursor: pointer; + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + transition: all 0.2s ease; +} + +.source-btn:hover { + background: rgba(255, 255, 255, 0.1); + border-color: rgba(255, 255, 255, 0.25); +} + +.source-btn.selected { + background: rgba(99, 102, 241, 0.2); + border-color: #6366f1; +} + +.source-icon { + font-size: 1.5rem; +} + +/* === Albums List === */ +.albums-list { + max-height: 300px; + overflow-y: auto; + margin-bottom: 1.5rem; +} + +.loading-text { + text-align: center; + color: #666; + padding: 1rem; +} + +.album-item { + display: flex; + align-items: center; + gap: 1rem; + padding: 0.75rem 1rem; + background: rgba(255, 255, 255, 0.04); + border: 2px solid transparent; + border-radius: 10px; + margin-bottom: 0.5rem; + cursor: pointer; + transition: all 0.2s ease; +} + +.album-item:hover { + background: rgba(255, 255, 255, 0.08); +} + +.album-item.selected { + background: rgba(99, 102, 241, 0.15); + border-color: #6366f1; +} + +.album-thumb { + width: 48px; + height: 48px; + border-radius: 8px; + object-fit: cover; + background: #222; +} + +.album-info { + flex: 1; +} + +.album-name { + font-size: 1rem; + font-weight: 500; +} + +.album-count { + font-size: 0.8rem; + color: #888; + margin-top: 2px; +} + +/* === Start Button === */ +.start-btn { + display: block; + width: 100%; + padding: 1rem; + background: #6366f1; + border: none; + border-radius: 12px; + color: #fff; + font-size: 1.1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + letter-spacing: 0.03em; +} + +.start-btn:hover:not(:disabled) { + background: #4f46e5; + transform: translateY(-1px); +} + +.start-btn:disabled { + opacity: 0.3; + cursor: not-allowed; +} + +/* === Setup Error === */ +.setup-error { + text-align: center; + padding: 2rem; +} + +.setup-error p { + margin-bottom: 0.75rem; +} + +.error-detail { + color: #888; + font-size: 0.85rem; +} + +.setup-error button { + margin-top: 1rem; + padding: 0.75rem 2rem; + background: #6366f1; + border: none; + border-radius: 8px; + color: #fff; + font-size: 1rem; + cursor: pointer; +} + +/* === Slideshow === */ +#slideshow-screen { + background: #000; +} + +.bg-blur { + position: absolute; + top: -20px; left: -20px; + width: calc(100% + 40px); + height: calc(100% + 40px); + background-size: cover; + background-position: center; + filter: blur(30px) brightness(0.35); + opacity: 0; + transition: opacity 1.5s ease; + z-index: 1; +} + +.bg-blur.visible { + opacity: 1; +} + +.photo-layer { + position: absolute; + top: 0; left: 0; + width: 100%; height: 100%; + background-size: contain; + background-position: center; + background-repeat: no-repeat; + opacity: 0; + transition: opacity 2s ease; + z-index: 2; +} + +.photo-layer.active { + opacity: 1; +} + +/* === Overlay === */ +.overlay { + position: absolute; + top: 0; left: 0; + width: 100%; height: 100%; + z-index: 10; + pointer-events: none; + opacity: 1; + transition: opacity 0.5s ease; +} + +.overlay.hidden { + opacity: 0; +} + +.overlay-top-right { + position: absolute; + top: 1.5rem; + right: 2rem; + text-align: right; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.8), 0 0 20px rgba(0, 0, 0, 0.5); +} + +.clock { + font-size: 2.5rem; + font-weight: 200; + letter-spacing: 0.05em; + line-height: 1.2; +} + +.date-display { + font-size: 0.95rem; + font-weight: 300; + color: rgba(255, 255, 255, 0.8); + margin-top: 0.25rem; +} + +.overlay-bottom { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + padding: 1.5rem 2rem 1rem; + background: linear-gradient(to top, rgba(0,0,0,0.6) 0%, transparent 100%); +} + +.exif-info { + font-size: 0.85rem; + font-weight: 300; + color: rgba(255, 255, 255, 0.75); + margin-bottom: 0.75rem; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); +} + +.progress-bar { + width: 100%; + height: 3px; + background: rgba(255, 255, 255, 0.15); + border-radius: 2px; + overflow: hidden; +} + +.progress-fill { + height: 100%; + width: 0%; + background: rgba(255, 255, 255, 0.5); + border-radius: 2px; + transition: width 0.3s linear; +} + +/* === Touch Zones === */ +.touch-zone { + position: absolute; + top: 0; + height: 100%; + z-index: 20; + cursor: pointer; +} + +.touch-left { + left: 0; + width: 20%; +} + +.touch-center { + left: 20%; + width: 60%; +} + +.touch-right { + right: 0; + width: 20%; +} + +/* === Settings Button === */ +.settings-btn { + position: absolute; + top: 1rem; + left: 1rem; + width: 44px; + height: 44px; + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 50%; + color: #fff; + font-size: 1.2rem; + cursor: pointer; + z-index: 30; + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; +} + +.settings-btn.visible { + opacity: 1; + pointer-events: auto; +} + +/* === Scrollbar Styling === */ +.albums-list::-webkit-scrollbar, +.setup-container::-webkit-scrollbar { + width: 6px; +} + +.albums-list::-webkit-scrollbar-track, +.setup-container::-webkit-scrollbar-track { + background: transparent; +} + +.albums-list::-webkit-scrollbar-thumb, +.setup-container::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.15); + border-radius: 3px; +} + +/* === Responsive === */ +@media (max-width: 600px) { + .setup-container { + padding: 1.25rem; + } + .setup-header h1 { + font-size: 1.6rem; + } + .clock { + font-size: 1.8rem; + } + .overlay-top-right { + top: 1rem; + right: 1rem; + } + .overlay-bottom { + padding: 1rem 1rem 0.5rem; + } + .source-buttons { + flex-direction: column; + } +} + +/* === Loading Spinner === */ +.spinner { + display: inline-block; + width: 24px; + height: 24px; + border: 2px solid rgba(255,255,255,0.2); + border-top-color: #fff; + border-radius: 50%; + animation: spin 0.8s linear infinite; + margin-right: 0.5rem; + vertical-align: middle; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* === Fade-in Animation === */ +@keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } +} + +.album-item { + animation: fadeIn 0.3s ease forwards; +}