/* Version: 01.10.2025 08:00 */ /* =============================================== */ /* === GLOBALS, VARIABLES & BASE STYLES === */ /* =============================================== */ *, *::before, *::after { box-sizing: border-box; } :root { --primary-color: #5E8C61; --secondary-color: #81A182; --background-color: #FCFCFC; --surface-color: #FFFFFF; --text-color: #3D403D; --text-light: #9E9E9E; --border-color: #EEEEEE; --shadow-color: rgba(61, 64, 61, 0.07); --shadow-color-hover: rgba(61, 64, 61, 0.12); --status-red: #E57373; --status-yellow: #FFB74D; --status-blue: #64B5F6; --milestone-bg-color: #fffbeb; --font-family: 'Alan Sans', sans-serif; --font-mono: 'Roboto Mono', monospace; --border-radius: 12px; --border-radius-large: 16px; } /* Manually toggled Dark Mode */ body[data-theme='dark'] { --primary-color: #6a9f6d; --background-color: #121212; --surface-color: #1E1E1E; --text-color: #E0E0E0; --text-light: #8A8A8A; --border-color: #333333; --shadow-color: rgba(0, 0, 0, 0.2); --shadow-color-hover: rgba(0, 0, 0, 0.3); --milestone-bg-color: #2c2a22; } /* Auto Dark Mode via System Settings */ @media (prefers-color-scheme: dark) { body[data-theme='auto'] { --primary-color: #6a9f6d; --background-color: #121212; --surface-color: #1E1E1E; --text-color: #E0E0E0; --text-light: #8A8A8A; --border-color: #333333; --shadow-color: rgba(0, 0, 0, 0.2); --shadow-color-hover: rgba(0, 0, 0, 0.3); --milestone-bg-color: #2c2a22; } } body { font-family: var(--font-family); background-color: var(--background-color); color: var(--text-color); margin: 0; line-height: 1.6; transition: background-color 0.3s ease, color 0.3s ease; } body.modal-open { overflow: hidden; } .container { max-width: 1200px; margin: 0 auto; padding: 20px; } /* --- Keyframe Animations --- */ @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } } @keyframes spin { to { transform: rotate(360deg); } } /* =============================================== */ /* === AUTH PAGE (Login/Register) === */ /* =============================================== */ .auth-container { display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; } .auth-box { width: 100%; max-width: 400px; background: var(--surface-color); padding: 40px; border-radius: var(--border-radius-large); box-shadow: 0 10px 30px var(--shadow-color-hover); } .auth-box .logo-title-container { justify-content: center; margin-bottom: 25px; } .auth-box h2 { text-align: center; margin-top: 0; margin-bottom: 5px; } .auth-subtitle { text-align: center; color: var(--text-light); margin-top: 0; margin-bottom: 30px; } .auth-switch { text-align: center; margin-top: 20px; font-size: 0.9rem; } .auth-switch a { color: var(--primary-color); font-weight: 600; text-decoration: none; } .auth-switch a:hover { text-decoration: underline; } /* =============================================== */ /* === HEADER & NAVIGATION === */ /* =============================================== */ .main-header { background: var(--surface-color); border-bottom: 1px solid var(--border-color); padding: 10px 0; margin-bottom: 15px; } .main-header .container { display: flex; justify-content: space-between; align-items: center; } .logo-title-container { display: flex; align-items: center; gap: 12px; color: var(--primary-color); } .header-logo { height: 36px; width: auto; } .main-header h1 { margin: 0; font-weight: 700; } .header-controls { display: flex; align-items: center; gap: 15px; } .header-button-group { display: flex; align-items: center; } .header-button-group > .add-btn { margin: 0; border-radius: 0; position: relative; } .header-button-group > .add-btn:not(:last-child)::after { content: ''; position: absolute; right: 0; top: 25%; bottom: 25%; width: 1px; background-color: rgba(255, 255, 255, 0.2); } .header-button-group > .add-btn:first-child { border-top-left-radius: var(--border-radius); border-bottom-left-radius: var(--border-radius); } .header-button-group > .add-btn:last-child { border-top-right-radius: var(--border-radius); border-bottom-right-radius: var(--border-radius); } .add-btn.icon-btn { padding: 10px 12px; } .add-btn.icon-btn span { display: none; } .add-btn span { display: block; } /* =============================================== */ /* === BUTTONS & TOASTS (Allgemein) === */ /* =============================================== */ .btn, .add-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 10px 20px; border: none; border-radius: var(--border-radius); background-color: var(--primary-color); color: white; font-family: var(--font-family); font-size: 1rem; line-height: 1.2; cursor: pointer; transition: background-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease; } .btn:hover, .add-btn:hover { background-color: #537d56; transform: translateY(-2px); box-shadow: 0 4px 10px var(--shadow-color-hover); } .header-button-group > .add-btn:hover { transform: translateY(0); } .btn:active, .add-btn:active { transform: translateY(0) scale(0.97); box-shadow: none; transition-duration: 0.1s; } .btn.btn-secondary { background-color: #e0e0e0; color: #3D403D; } .btn.btn-secondary:hover { background-color: #d0d0d0; } body[data-theme='dark'] .btn.btn-secondary { background-color: #4a4a4a; color: var(--text-color); } body[data-theme='dark'] .btn.btn-secondary:hover { background-color: #5a5a5a; } .btn.btn-danger { background-color: transparent; color: var(--status-red); border: 1px solid var(--status-red); } .btn.btn-danger:hover { background-color: var(--status-red); color: white; } .btn.btn-ai { background-color: #8e44ad; flex-grow: 1; justify-content: center; position: relative; overflow: hidden; min-height: 44.4px; } .btn.btn-ai:hover { background-color: #7d3c98; } .btn:disabled, .btn:disabled:hover { background-color: #cccccc; color: #888; cursor: not-allowed; transform: none; box-shadow: none; } .auth-btn { width: 100%; margin-top: 10px; } .btn-retry { background: none; border: none; color: var(--primary-color); cursor: pointer; font-size: 0.8rem; font-weight: 600; padding: 0; margin-top: 8px; text-align: left; display: block; width: 100%; } .btn-retry:hover { text-decoration: underline; } .btn.is-loading { color: transparent !important; pointer-events: none; position: relative; } .btn.is-loading::after { content: ''; display: block; position: absolute; left: 50%; top: 50%; width: 20px; height: 20px; margin-left: -10px; margin-top: -10px; border: 2px solid rgba(255, 255, 255, 0.5); border-top-color: white; border-radius: 50%; animation: spin 0.8s linear infinite; } /* --- Toast Notification --- */ .toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(100px); background-color: var(--primary-color); color: white; padding: 12px 25px; border-radius: var(--border-radius); box-shadow: 0 4px 15px rgba(0,0,0,0.2); z-index: 2000; opacity: 0; transition: transform 0.3s ease, opacity 0.3s ease; font-weight: 600; } .toast.show { transform: translateX(-50%) translateY(0); opacity: 1; } .toast.error { background-color: var(--status-red); } /* =============================================== */ /* === DASHBOARD LAYOUT & CONTROLS === */ /* =============================================== */ .dashboard-controls { display: flex; justify-content: space-between; align-items: center; margin-bottom: 25px; gap: 15px; flex-wrap: wrap; } .sort-container { position: relative; } .sort-container select { color:var(--text-light); -webkit-appearance: none; -moz-appearance: none; appearance: none; padding: 8px 30px 8px 12px; border-radius: 8px; border: 1px solid var(--border-color); background-color: var(--surface-color); font-family: var(--font-family); font-size: 0.9rem; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%239E9E9E' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 8px center; background-size: 16px; } .view-toggle { display: flex; background-color: #f3f4f6; border-radius: 8px; padding: 4px; } body[data-theme='dark'] .view-toggle { background-color: #121212; } .view-btn { padding: 6px 10px; border: none; background-color: transparent; border-radius: 6px; cursor: pointer; color: var(--text-light); transition: background-color 0.2s, color 0.2s; } .view-btn.active { background-color: var(--surface-color); color: var(--primary-color); box-shadow: 0 1px 3px var(--shadow-color); } .plant-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 30px; transition: grid-template-columns 0.3s ease; } .plant-grid.list-view { display: block; grid-template-columns: 1fr; gap: 15px; } .empty-state { grid-column: 1 / -1; text-align: center; padding: 60px 20px; background-color: var(--surface-color); border-radius: var(--border-radius-large); border: 2px dashed var(--border-color); } .empty-state h2 { color: var(--primary-color); margin-top: 0; } .empty-state p { color: var(--text-light); max-width: 400px; margin: 10px auto 0; } /* =============================================== */ /* === LEXIKON PAGE === */ /* =============================================== */ .lexicon-intro { text-align: center; margin-bottom: 30px; padding: 20px; background-color: var(--surface-color); border-radius: var(--border-radius-large); } .lexicon-intro h2 { margin-top: 0; } .search-bar-container { margin-bottom: 30px; } #lexiconSearch { width: 100%; padding: 15px 20px; font-size: 1.1rem; border-radius: var(--border-radius); border: 1px solid var(--border-color); background-color: var(--surface-color); color: var(--text-color); } #lexiconSearch:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(94, 140, 97, 0.2); } .lexicon-card { background-color: var(--surface-color); border-radius: var(--border-radius-large); overflow: hidden; border: 1px solid var(--border-color); box-shadow: 0 4px 10px var(--shadow-color); transition: transform 0.2s ease, box-shadow 0.2s ease; cursor: pointer; opacity: 0; transform: translateY(20px); animation: fadeIn 0.5s ease-out forwards; } .lexicon-card:hover { transform: translateY(-5px); box-shadow: 0 8px 20px var(--shadow-color-hover); } .lexicon-card-img-container { width: 100%; aspect-ratio: 1 / 1; overflow: hidden; } .lexicon-card-img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .lexicon-card:hover .lexicon-card-img { transform: scale(1.05); } .lexicon-card-info { padding: 15px 20px; } .lexicon-card-info h3 { margin: 0 0 5px 0; font-size: 1.2rem; } .lexicon-card-info p { margin: 0; font-style: italic; color: var(--text-light); font-size: 0.9rem; } /* =============================================== */ /* === MODAL WINDOWS (General) === */ /* =============================================== */ .modal { display: flex; align-items: center; justify-content: center; position: fixed; z-index: 1200; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); transition: opacity 0.3s ease, visibility 0.3s ease; opacity: 0; visibility: hidden; } .modal.show { opacity: 1; visibility: visible; } .modal-content { background-color: var(--surface-color); margin: auto; border: none; width: 90%; max-width: 500px; border-radius: var(--border-radius-large); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); transition: transform 0.3s ease; transform: scale(0.95); display: flex; flex-direction: column; max-height: 90vh; } .modal.show .modal-content { transform: scale(1); } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 15px 25px; border-bottom: 1px solid var(--border-color); background-color: #fcfcfc; flex-shrink: 0; } body[data-theme='dark'] .modal-header, body[data-theme='dark'] .modal-footer { background-color: #1a1a1a; } .modal-header h2 { margin: 0; font-size: 1.4rem; } .close-btn { background: none; border: none; font-size: 2rem; cursor: pointer; color: var(--text-light); } .modal-body { padding: 25px; overflow-y: auto; } .modal-footer { padding: 15px 25px; border-top: 1px solid var(--border-color); background-color: #fcfcfc; flex-shrink: 0; } /* --- Specific Modals --- */ .settings-modal-content { max-width: 420px; } .settings-modal-content .modal-body { padding: 0; background-color: var(--background-color); } .settings-profile-banner { background: var(--surface-color); padding: 25px; display: flex; flex-direction: column; align-items: center; gap: 15px; border-bottom: 1px solid var(--border-color); } .settings-modal-content .modal-body > .settings-card { margin: 15px; } .settings-card { background: var(--surface-color); border-radius: var(--border-radius-large); padding: 20px; border: 1px solid var(--border-color); } .settings-card:last-child { margin-bottom: 0; } .settings-card h3 { margin-top: 0; margin-bottom: 18px; font-size: 1.1rem; color: var(--primary-color); } .profile-pic-container { position: relative; flex-shrink: 0; } .profile-pic { width: 80px; height: 80px; border-radius: 50%; object-fit: cover; border: 3px solid var(--surface-color); box-shadow: 0 2px 6px rgba(0,0,0,0.1); } .btn-change-pic { position: absolute; bottom: 2px; right: 2px; width: 28px; height: 28px; border-radius: 50%; background: var(--primary-color); color: white; border: 2px solid white; display: flex; align-items: center; justify-content: center; cursor: pointer; } .profile-info { display: flex; align-items: center; gap: 8px; } .profile-username { font-size: 1.5rem; font-weight: 600; } .btn-edit-username { background: none; border: none; color: var(--text-light); cursor: pointer; padding: 5px; } .settings-row { display: flex; justify-content: space-between; align-items: flex-start; /* Geändert von 'center' zu 'flex-start' für bessere Ausrichtung */ margin-bottom: 15px; gap: 15px; /* Fügt etwas Abstand hinzu */ } .settings-row:last-child { margin-bottom: 0; } .settings-description { font-size: 0.85rem; color: var(--text-light); margin: 4px 0 0 0; line-height: 1.4; } .settings-value { font-weight: 600; color: var(--text-color); } .toggle-switch { position: relative; display: inline-block; width: 44px; height: 24px; flex-shrink: 0; /* NEU: Verhindert, dass der Schalter gequetscht wird */ } .toggle-switch input { display: none; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #767676; transition: .4s; border-radius: 24px; } .slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .slider { background-color: var(--primary-color); } input:checked + .slider:before { transform: translateX(20px); } .theme-selector { display: flex; background-color: var(--background-color); border-radius: 8px; padding: 4px; border: 1px solid var(--border-color); } .theme-btn { padding: 4px 12px; border: none; background-color: transparent; border-radius: 6px; cursor: pointer; color: var(--text-light); transition: background-color 0.2s, color 0.2s; font-family: var(--font-family); font-size: 0.85rem; font-weight: 600; } .theme-btn.active { background-color: var(--surface-color); color: var(--primary-color); box-shadow: 0 1px 3px var(--shadow-color); } .full-width { width: 100%; margin-bottom: 10px; } .full-width:last-child { margin-bottom: 0; } .danger-zone { border-color: var(--status-red); } .danger-zone h3 { color: var(--status-red); } .diary-modal-content { max-width: 450px; height: 85vh; max-height: 750px; } .diary-modal-content .modal-body { flex-grow: 1; padding: 0; display: flex; flex-direction: column; overflow: hidden; } #diaryContentWrapper { overflow-y: auto; padding: 0 25px 25px; } #diaryCameraView { padding: 25px; display: flex; flex-direction: column; justify-content: center; } .diary-timeline { position: relative; padding-left: 30px; border-left: 2px solid var(--border-color); margin-left: 15px; padding-top: 10px; } .diary-date-header { font-size: 0.8rem; font-weight: 600; color: var(--text-light); background-color: var(--background-color); padding: 2px 8px; border-radius: 6px; display: inline-block; position: relative; left: -48px; margin-top: 25px; margin-bottom: 20px; } .diary-date-header:first-of-type { margin-top: 0; } .diary-entry { position: relative; margin-bottom: 20px; } .diary-icon { position: absolute; left: -48px; top: 0; width: 30px; height: 30px; border-radius: 50%; background-color: var(--surface-color); border: 2px solid var(--border-color); display: flex; align-items: center; justify-content: center; font-size: 1rem; transition: all 0.2s ease; } .diary-entry-content { background-color: var(--surface-color); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 12px 15px; transition: all 0.2s ease; position: relative; } .diary-entry.is-milestone .diary-entry-content { background-color: var(--milestone-bg-color); border-color: var(--status-yellow); } .diary-entry.is-milestone .diary-icon { background-color: var(--status-yellow); border-color: var(--status-yellow); color: white; } .diary-entry-title { font-weight: 600; margin: 0 0 5px 0; } .diary-entry-notes { font-size: 0.9rem; color: var(--text-light); margin: 0; } .diary-entry-time { display: block; text-align: right; font-size: 0.75rem; color: #aaa; margin-top: 8px; } .diary-photo-container { position: relative; margin-top: 10px; border-radius: var(--border-radius); overflow: hidden; aspect-ratio: 1 / 1; } .diary-photo { width: 100%; height: 100%; object-fit: cover; display: block; } .delete-diary-entry-btn { position: absolute; top: 8px; right: 8px; width: 30px; height: 30px; opacity: 0; transition: opacity 0.2s; color: var(--status-red); } .diary-entry-content:hover .delete-diary-entry-btn { opacity: 0.8; } .diary-entry-content:hover .delete-diary-entry-btn:hover { opacity: 1; } .set-profile-btn { position: absolute; top: 8px; right: 42px; opacity: 0; transition: opacity 0.2s; } .diary-entry-content:hover .set-profile-btn { opacity: 0.8; } .diary-entry-content:hover .set-profile-btn:hover { opacity: 1; } .empty-diary { text-align: center; padding: 40px 0; color: var(--text-light); } .diary-form .form-group { margin-bottom: 10px; } .diary-input { width: 100%; padding: 10px; border: 1px solid var(--border-color); border-radius: 8px; resize: vertical; min-height: 40px; } .diary-form-options { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; margin-bottom: 15px; } .diary-form-attachments { display: flex; gap: 10px; align-items: center; } .diary-form .upload-area.small .btn { padding: 8px 12px; font-size: 0.9rem; } .diary-form-milestone { font-size: 0.9rem; display: flex; align-items: center; gap: 8px; cursor: pointer; font-weight: 600; color: var(--text-color); } .diary-form-milestone input { margin: 0; cursor: pointer; width: 16px; height: 16px; } .diary-form button[type="submit"] { width: 100%; } /* =============================================== */ /* === LEXIKON DETAIL MODAL === */ /* =============================================== */ .lexicon-detail-modal-content { max-width: 700px; width: 95%; } .lexicon-detail-modal-content .modal-body { padding: 0; } .lexicon-modal-layout { display: flex; flex-direction: column; } .lexicon-modal-image-gallery { display: flex; flex-direction: column; } .lexicon-modal-image-container { width: 100%; aspect-ratio: 4 / 3; max-height: 40vh; background-color: var(--background-color); flex-shrink: 0; } .lexicon-modal-image-container img { width: 100%; height: 100%; object-fit: cover; } .lexicon-modal-thumbnails { display: flex; gap: 10px; padding: 10px; overflow-x: auto; background-color: var(--background-color); border-top: 1px solid var(--border-color); } .thumbnail-img { width: 60px; height: 60px; object-fit: cover; border-radius: var(--border-radius); cursor: pointer; border: 2px solid transparent; transition: border-color 0.2s ease, opacity 0.2s ease; opacity: 0.7; flex-shrink: 0; } .thumbnail-img:hover { opacity: 1; } .thumbnail-img.active { border-color: var(--primary-color); opacity: 1; } body[data-theme='dark'] .lexicon-modal-thumbnails { background-color: #2a2a2a; } @media (prefers-color-scheme: dark) { body[data-theme='auto'] .lexicon-modal-thumbnails { background-color: #2a2a2a; } } .lexicon-modal-info { padding: 25px 30px 30px; } .lexicon-modal-latin { display: block; font-size: 1rem; color: var(--text-light); margin-top: -10px; margin-bottom: 20px; } .lexicon-modal-info h2 { margin-top: 0; margin-bottom: 10px; font-size: 1.8rem; } .lexicon-modal-meta { display: flex; gap: 25px; background-color: var(--background-color); padding: 15px 20px; border-radius: var(--border-radius); margin-bottom: 25px; border: 1px solid var(--border-color); } .lexicon-modal-meta div { font-size: 0.95rem; } .lexicon-modal-meta strong { display: block; color: var(--text-light); font-weight: 600; margin-bottom: 3px; font-size: 0.8rem; text-transform: uppercase; } body[data-theme='dark'] .lexicon-modal-meta { background-color: #2a2a2a; } @media (prefers-color-scheme: dark) { body[data-theme='auto'] .lexicon-modal-meta { background-color: #2a2a2a; } } .lexicon-modal-description p { margin-top: 0; margin-bottom: 1em; font-size: 1rem; line-height: 1.7; } .lexicon-modal-description h3 { font-weight: 600; font-size: 1.2rem; display: block; margin-top: 1.8em; margin-bottom: 0.6em; color: var(--primary-color); padding-bottom: 5px; border-bottom: 1px solid var(--border-color); } .lexicon-modal-description p:first-of-type + h3 { margin-top: 0; } /* =============================================== */ /* === FORMS (General) & CAMERA VIEW === */ /* =============================================== */ .form-group { margin-bottom: 20px; } #ai-analysis-section { display: flex; gap: 10px; align-items: center; } #ai-analysis-section .btn-ai { width: 100%; } .form-group label { display: block; margin-bottom: 8px; font-weight: 600; font-size: 0.9rem; display: flex; align-items: center; gap: 8px; } .form-group input, .form-group textarea { width: 100%; padding: 12px; border: 1px solid var(--border-color); border-radius: 8px; font-family: var(--font-family); box-sizing: border-box; transition: border-color 0.2s, box-shadow 0.2s; background-color: var(--surface-color); color: var(--text-color); } .form-group input:focus, .form-group textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(94, 140, 97, 0.2); } .form-group-upload { margin-bottom: 20px; } .upload-area { display: flex; align-items: center; justify-content: center; gap: 10px; } .image-preview-wrapper { position: relative; border-radius: var(--border-radius); overflow: hidden; border: 1px solid var(--border-color); width: 100%; max-width: 350px; margin: 0 auto; aspect-ratio: 1 / 1; background-color: var(--background-color); } .image-preview-wrapper.small { width: 100px; margin-right: auto; margin-left: 0; } .image-preview-wrapper img { width: 100%; height: 100%; object-fit: cover; display: block; } .preview-actions { position: absolute; bottom: 10px; right: 10px; display: flex; gap: 8px; } .preview-actions label.card-btn { padding: 0; } .remove-photo-btn { position: absolute; top: 5px; right: 5px; width: 28px; height: 28px; border-radius: 50%; border: none; background-color: rgba(0, 0, 0, 0.6); color: white; font-size: 1.2rem; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; } .video-container { position: relative; width: 100%; border-radius: var(--border-radius); overflow: hidden; background: #000; aspect-ratio: 1 / 1; } .video-container video { width: 100%; height: 100%; object-fit: cover; display: block; } .viewfinder-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; } .viewfinder-corner { position: absolute; width: 30px; height: 30px; border: 4px solid rgba(255, 255, 255, 0.8); } .viewfinder-corner.top-left { top: 25px; left: 25px; border-right: none; border-bottom: none; border-top-left-radius: 8px; } .viewfinder-corner.top-right { top: 25px; right: 25px; border-left: none; border-bottom: none; border-top-right-radius: 8px; } .viewfinder-corner.bottom-left { bottom: 25px; left: 25px; border-right: none; border-top: none; border-bottom-left-radius: 8px; } .viewfinder-corner.bottom-right { bottom: 25px; right: 25px; border-left: none; border-top: none; border-bottom-right-radius: 8px; } .viewfinder-focus-point { position: absolute; top: 50%; left: 50%; width: 24px; height: 24px; border: 4px solid rgba(255, 255, 255, 0.9); border-radius: 50%; transform: translate(-50%, -50%); } .camera-controls { margin-top: 15px; display: flex; justify-content: center; } .enrichment-loader { width: 16px; height: 16px; border: 2px solid var(--primary-color); border-bottom-color: transparent; border-radius: 50%; display: inline-block; box-sizing: border-box; animation: spin 1s linear infinite; } /* =============================================== */ /* === AI SCANNING ANIMATION (v2) === */ /* =============================================== */ @keyframes pulse-color { 0% { filter: invert(0); } 50% { filter: invert(1); } 100% { filter: invert(0); } } @keyframes ai-loader-anim { 0%,10% {border-radius:0} 30%,40% {border-radius:50% 0} 60%,70% {border-radius:50%} 90%,100% {border-radius:0 50%} } .ai-animation-overlay { position: absolute; inset: 0; background-color: rgba(0,0,0,0.5); display: flex; flex-direction: column; align-items: center; justify-content: center; pointer-events: none; opacity: 0; transition: opacity 0.3s ease; z-index: 2; } .image-preview-wrapper.scanning .ai-animation-overlay { opacity: 1; } .image-preview-wrapper.scanning #imagePreview { animation: pulse-color 6s infinite ease-in-out; } .ai-loader { width: 90px; aspect-ratio: 1; display: grid; } .ai-loader:before, .ai-loader:after { content: ""; grid-area: 1/1; width: 42px; aspect-ratio: 1; box-shadow: 0 0 0 3px #fff inset; filter: drop-shadow(48px 48px 0 #fff); animation: ai-loader-anim 2s infinite alternate; } .ai-loader:after { margin: 0 0 0 auto; filter: drop-shadow(-48px 48px 0 #fff); animation-delay: -1s; } .ai-analysis-text { position: absolute; top: 20px; left: 10px; right: 10px; font-weight:300; color: white; text-shadow: 0 0 2px rgba(0,0,0,0.7); text-align: center; }