:root { --color-bg: #f7f7f5; --color-surface: #ffffff; --color-border: #e0e0dc; --color-text: #1f2421; --color-text-muted: #6b7370; --color-primary: #1971c2; --color-primary-dark: #145591; --color-danger: #c92a2a; --color-success: #2f9e44; --radius: 8px; --spacing-1: 4px; --spacing-2: 8px; --spacing-3: 12px; --spacing-4: 16px; --spacing-5: 24px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root { --color-bg: #14171a; --color-surface: #1c2024; --color-border: #2b3136; --color-text: #e9ecef; --color-text-muted: #9aa4ab; color-scheme: dark; } } * { box-sizing: border-box; } html, body, #root { height: 100%; } body { margin: 0; font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; background: var(--color-bg); color: var(--color-text); } input, select, textarea, button { font: inherit; color: inherit; } a { color: var(--color-primary); } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--spacing-2); padding: var(--spacing-2) var(--spacing-4); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-surface); cursor: pointer; font-weight: 500; } .btn:disabled { opacity: 0.6; cursor: not-allowed; } .btn-primary { background: var(--color-primary); border-color: var(--color-primary); color: #fff; } .btn-primary:hover:not(:disabled) { background: var(--color-primary-dark); } .btn-ghost { background: transparent; } .btn-danger { color: var(--color-danger); border-color: var(--color-danger); background: transparent; } .btn-small { padding: var(--spacing-1) var(--spacing-3); font-size: 0.85rem; } /* App shell */ .app-shell { display: flex; flex-direction: column; height: 100%; } .app-header { display: flex; align-items: center; gap: var(--spacing-4); padding: var(--spacing-3) var(--spacing-4); border-bottom: 1px solid var(--color-border); background: var(--color-surface); flex-wrap: wrap; } .app-title { font-weight: 700; font-size: 1.1rem; } .app-nav { display: flex; gap: var(--spacing-3); } .app-nav a { text-decoration: none; color: var(--color-text-muted); padding: var(--spacing-1) var(--spacing-2); border-radius: var(--radius); } .app-nav a.active { color: var(--color-primary); background: rgba(25, 113, 194, 0.1); } .app-user { margin-left: auto; display: flex; align-items: center; gap: var(--spacing-3); } .app-user-name { color: var(--color-text-muted); } .app-main { flex: 1; overflow: auto; min-height: 0; } .page-loading { display: flex; align-items: center; justify-content: center; height: 100%; color: var(--color-text-muted); } /* Auth pages */ .auth-page { display: flex; align-items: center; justify-content: center; min-height: 100%; padding: var(--spacing-4); } .auth-form { display: flex; flex-direction: column; gap: var(--spacing-3); width: 100%; max-width: 360px; background: var(--color-surface); padding: var(--spacing-5); border-radius: var(--radius); border: 1px solid var(--color-border); } .auth-form h1 { margin: 0 0 var(--spacing-2); font-size: 1.4rem; } .auth-hint { margin: 0; color: var(--color-text-muted); font-size: 0.9rem; } .auth-form label { display: flex; flex-direction: column; gap: var(--spacing-1); font-size: 0.9rem; } .auth-form input { padding: var(--spacing-2); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg); } .form-error { color: var(--color-danger); font-size: 0.9rem; margin: 0; } /* Map dashboard */ .map-dashboard { display: flex; flex-direction: column; height: 100%; } .map-filters { display: flex; flex-wrap: wrap; gap: var(--spacing-2); justify-content: space-between; padding: var(--spacing-2) var(--spacing-3); background: var(--color-surface); border-bottom: 1px solid var(--color-border); } .filter-group { display: flex; gap: var(--spacing-2); flex-wrap: wrap; } .filter-group select { padding: var(--spacing-1) var(--spacing-2); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg); } .chip { padding: var(--spacing-1) var(--spacing-3); border-radius: 999px; border: 1px solid var(--color-border); background: var(--color-bg); cursor: pointer; font-size: 0.85rem; } .chip-active { background: var(--color-primary); border-color: var(--color-primary); color: #fff; } .map-container { position: relative; flex: 1; min-height: 0; } .city-map { height: 100%; width: 100%; } .fab { position: absolute; right: var(--spacing-4); bottom: var(--spacing-4); z-index: 1000; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25); } .marker-pin { display: block; width: 18px; height: 18px; border-radius: 50%; border: 2px solid #fff; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4); } .marker-heart { position: absolute; top: -8px; right: -6px; color: #e64980; font-size: 0.8rem; } .map-popup { display: flex; flex-direction: column; gap: var(--spacing-1); } /* City form */ .city-detail-page { max-width: 640px; margin: 0 auto; padding: var(--spacing-4); display: flex; flex-direction: column; gap: var(--spacing-5); } .city-form { display: flex; flex-direction: column; gap: var(--spacing-3); background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: var(--spacing-4); } .city-form label { display: flex; flex-direction: column; gap: var(--spacing-1); font-size: 0.9rem; } .city-form input, .city-form select, .city-form textarea { padding: var(--spacing-2); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg); } .form-row { display: flex; flex-direction: column; gap: var(--spacing-3); } @media (min-width: 640px) { .form-row { flex-direction: row; } .form-row > label { flex: 1; } } .like-toggle { flex-direction: row !important; align-items: center; gap: var(--spacing-2) !important; } .coords-hint { margin: 0; color: var(--color-text-muted); font-size: 0.85rem; } .form-actions { display: flex; flex-wrap: wrap; gap: var(--spacing-2); margin-top: var(--spacing-2); } .form-actions .btn-danger { margin-left: auto; } .city-section { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: var(--spacing-4); } .city-section h2 { margin-top: 0; font-size: 1rem; } /* City search */ .city-search { position: relative; } .city-search input { width: 100%; padding: var(--spacing-2); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg); } .search-results { list-style: none; margin: var(--spacing-1) 0 0; padding: 0; position: absolute; z-index: 10; width: 100%; max-height: 240px; overflow-y: auto; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .search-results li button { display: block; width: 100%; text-align: left; padding: var(--spacing-2) var(--spacing-3); border: none; background: none; cursor: pointer; } .search-results li button:hover { background: var(--color-bg); } .search-loading, .search-empty { font-size: 0.8rem; color: var(--color-text-muted); } /* Link editor */ .link-editor { display: flex; flex-direction: column; gap: var(--spacing-2); } .link-row { display: flex; gap: var(--spacing-2); } .link-row input { flex: 1; padding: var(--spacing-2); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg); } .link-actions { display: flex; gap: var(--spacing-2); } /* Participant picker */ .participant-picker { border: 1px solid var(--color-border); border-radius: var(--radius); padding: var(--spacing-3); display: flex; flex-direction: column; gap: var(--spacing-2); } .participant-option { display: flex !important; flex-direction: row !important; align-items: center; gap: var(--spacing-2) !important; } .participant-inactive { color: var(--color-text-muted); } /* Photo uploader */ .photo-uploader { display: flex; flex-direction: column; gap: var(--spacing-2); } .photo-preview img { max-width: 100%; border-radius: var(--radius); display: block; margin-bottom: var(--spacing-2); } /* Admin users */ .admin-users-page { max-width: 800px; margin: 0 auto; padding: var(--spacing-4); display: flex; flex-direction: column; gap: var(--spacing-5); } .users-table { width: 100%; border-collapse: collapse; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); overflow: hidden; } .users-table th, .users-table td { text-align: left; padding: var(--spacing-2) var(--spacing-3); border-bottom: 1px solid var(--color-border); font-size: 0.9rem; } .row-inactive { opacity: 0.5; } .create-user-form { display: flex; flex-direction: column; gap: var(--spacing-3); background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius); padding: var(--spacing-4); max-width: 360px; } .create-user-form label { display: flex; flex-direction: column; gap: var(--spacing-1); font-size: 0.9rem; } .create-user-form input { padding: var(--spacing-2); border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg); }