/* ── Lightbox Module ──────────────────────────────── */ .overlay { position: fixed; inset: 0; z-index: 1000; background: var(--bg-overlay); display: flex; align-items: center; justify-content: center; animation: lightbox-fade-in var(--transition-normal) ease forwards; } @keyframes lightbox-fade-in { from { opacity: 0; } to { opacity: 1; } } .overlay.closing { animation: lightbox-fade-out var(--transition-fast) ease forwards; } @keyframes lightbox-fade-out { from { opacity: 1; } to { opacity: 0; } } .imageContainer { position: relative; max-width: 95vw; max-height: 90vh; display: flex; align-items: center; justify-content: center; border-radius: var(--radius-sm); overflow: hidden; } .image { max-width: 95vw; max-height: 90vh; object-fit: contain; border-radius: var(--radius-sm); user-select: none; -webkit-user-drag: none; opacity: 0; transform: scale(0.96); transition: opacity var(--transition-normal), transform 600ms cubic-bezier(0.16, 1, 0.3, 1); } .imageLoaded { opacity: 1; transform: scale(1); } .close { position: fixed; top: 20px; right: 24px; z-index: 1001; background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 8px; transition: color var(--transition-fast); } .close:hover { color: var(--text-primary); } .close svg { width: 28px; height: 28px; } .nav { position: fixed; top: 50%; transform: translateY(-50%); z-index: 1001; background: rgba(255, 255, 255, 0.08); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 50%; width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: var(--text-secondary); transition: background var(--transition-fast), color var(--transition-fast); } .nav:hover { background: rgba(255, 255, 255, 0.15); color: var(--text-primary); } .navPrev { left: 20px; } .navNext { right: 20px; } .nav svg { width: 20px; height: 20px; } .counter { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); font-size: 0.85rem; color: var(--text-muted); font-weight: 300; letter-spacing: 0.1em; } /* ── EXIF Info Panel ──────────────────────────────── */ .infoToggle { position: fixed; bottom: 24px; right: 24px; z-index: 1001; background: rgba(255, 255, 255, 0.08); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: var(--radius-md); padding: 8px 12px; color: var(--text-secondary); cursor: pointer; font-size: 0.8rem; font-family: var(--font-sans); transition: background var(--transition-fast), color var(--transition-fast); } .infoToggle:hover { background: rgba(255, 255, 255, 0.15); color: var(--text-primary); } /* Proofing favourite button — sits left of the info toggle. */ .favToggle { right: 6.5rem; } .exifPanel { position: fixed; bottom: 60px; right: 24px; z-index: 1001; background: rgba(20, 20, 20, 0.92); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); padding: 20px; min-width: 240px; animation: exif-slide-up var(--transition-normal) ease forwards; } /* EXPERIMENTAL: editorial caption (Immich asset description) above the tech rows */ .exifCaption { margin: 0 0 12px; max-width: 280px; font-family: var(--font-caption); font-size: 0.85rem; line-height: 1.5; font-style: italic; color: rgba(255, 255, 255, 0.85); } @keyframes exif-slide-up { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .exifRow { display: flex; justify-content: space-between; align-items: baseline; padding: 6px 0; border-bottom: 1px solid var(--border-subtle); } .exifRow:last-child { border-bottom: none; } .exifLabel { font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.08em; } .exifValue { font-size: 0.85rem; color: var(--text-primary); font-weight: 400; } /* Marks the ISO row so a preset can keep its label — "200" alone reads as nothing once the labels are hidden. */ .exifRowIso { display: flex; } /* ── Responsive ──────────────────────────────────── */ @media (max-width: 640px) { .nav { width: 40px; height: 40px; } .navPrev { left: 8px; } .navNext { right: 8px; } } /* ── Studio-Inspired Lightbox Defaults ───────────── */ .overlay { background: rgba(0, 0, 0, 0.85); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); } .close, .nav, .counter { opacity: 0.5; transition: opacity 400ms ease; } .overlay:hover .close, .overlay:hover .nav, .overlay:hover .counter { opacity: 1; } /* ── Watermark Overlay ────────────────────────────── */ .watermark { position: absolute; z-index: 10; pointer-events: none; font-family: var(--font-sans); font-size: 0.85rem; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: #ffffff; text-shadow: 0 1px 4px rgba(0, 0, 0, 0.9), 0 0 10px rgba(0, 0, 0, 0.7); padding: 12px 16px; user-select: none; } .watermark_bottom_right { bottom: 12px; right: 16px; } .watermark_bottom_left { bottom: 12px; left: 16px; } .watermark_center { top: 50%; left: 50%; transform: translate(-50%, -50%); } @media (hover: none) { .close, .nav, .counter { opacity: 1; } } .imageContainer { border-radius: 0; } .image { border-radius: 0; } /* ══ Studio Modern ═══════════════════════════════════════════════ Topbar with a mono counter, square outlined controls and a film-edge EXIF strip along the bottom instead of a popup panel. */ :global([data-preset='studio-modern']) .overlay { background: rgba(10, 10, 10, 0.92); backdrop-filter: none; -webkit-backdrop-filter: none; } :global([data-preset='studio-modern']) .imageContainer, :global([data-preset='studio-modern']) .image { max-width: 88vw; max-height: 78vh; } /* Counter → top left, monospace */ :global([data-preset='studio-modern']) .counter { top: 20px; bottom: auto; left: 32px; transform: none; font-family: var(--font-caption); font-size: 0.6875rem; letter-spacing: 0.15em; color: rgba(255, 255, 255, 0.6); } :global([data-preset='studio-modern']) .close { top: 20px; right: 32px; color: rgba(255, 255, 255, 0.7); } :global([data-preset='studio-modern']) .close:hover { color: var(--accent); } :global([data-preset='studio-modern']) .close svg { width: 24px; height: 24px; } /* Square outlined navigation */ :global([data-preset='studio-modern']) .nav { width: 52px; height: 52px; border-radius: 0; background: none; backdrop-filter: none; -webkit-backdrop-filter: none; border: 1px solid rgba(255, 255, 255, 0.15); color: rgba(255, 255, 255, 0.6); transition: border-color var(--transition-fast), color var(--transition-fast); } :global([data-preset='studio-modern']) .nav:hover { background: none; border-color: var(--accent); color: var(--accent); } :global([data-preset='studio-modern']) .navPrev { left: 24px; } :global([data-preset='studio-modern']) .navNext { right: 24px; } /* Info + favourite toggles move up into the topbar */ :global([data-preset='studio-modern']) .infoToggle { top: 20px; bottom: auto; right: 76px; background: none; backdrop-filter: none; -webkit-backdrop-filter: none; border: 1px solid rgba(255, 255, 255, 0.15); border-radius: 0; padding: 8px 14px; font-family: var(--font-caption); font-size: 0.625rem; letter-spacing: 0.15em; text-transform: uppercase; color: rgba(255, 255, 255, 0.7); } :global([data-preset='studio-modern']) .infoToggle:hover { background: none; border-color: var(--accent); color: var(--accent); } :global([data-preset='studio-modern']) .favToggle { right: 176px; } /* Film-edge strip replaces the popup panel */ :global([data-preset='studio-modern']) .exifPanel { top: auto; bottom: 0; left: 0; right: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 0 12px; min-width: 0; padding: 18px 32px; background: rgba(10, 10, 10, 0.9); backdrop-filter: none; -webkit-backdrop-filter: none; border: none; border-top: 1px solid rgba(255, 255, 255, 0.08); border-radius: 0; } :global([data-preset='studio-modern']) .exifPanel::before { content: ''; width: 5px; height: 5px; border-radius: 50%; background: var(--accent); flex: 0 0 auto; margin-right: 5px; } :global([data-preset='studio-modern']) .exifRow { display: inline-flex; align-items: baseline; padding: 0; border-bottom: none; } :global([data-preset='studio-modern']) .exifRow + .exifRow::before { content: '·'; margin-right: 12px; color: rgba(255, 255, 255, 0.35); } :global([data-preset='studio-modern']) .exifLabel { display: none; } :global([data-preset='studio-modern']) .exifRowIso .exifLabel { display: inline; margin-right: 6px; font-family: var(--font-caption); font-size: 0.6875rem; letter-spacing: 0.06em; color: rgba(255, 255, 255, 0.85); } :global([data-preset='studio-modern']) .exifValue { font-family: var(--font-caption); font-size: 0.6875rem; letter-spacing: 0.06em; text-transform: uppercase; color: rgba(255, 255, 255, 0.85); } /* The "Loading…" / "no EXIF" fallback keeps its own label visible */ :global([data-preset='studio-modern']) .exifRow:only-child .exifLabel { display: inline; font-family: var(--font-caption); font-size: 0.6875rem; letter-spacing: 0.06em; color: rgba(255, 255, 255, 0.6); } @media (max-width: 640px) { /* No room next to the info toggle — park it in the opposite corner. */ :global([data-preset='studio-modern']) .favToggle { top: auto; bottom: 76px; right: auto; left: 16px; } :global([data-preset='studio-modern']) .navPrev { left: 8px; } :global([data-preset='studio-modern']) .navNext { right: 8px; } }