Files
marco/app/styles/app.css
T
raucao 474bc8cd63 Add relay trust settings, provenance cache
By default, only automatically show photos for relays marked as trusted
(which by default is the required read relay). For other relays, only
show the user's own events by default, but allow showing all events via
link in place details (drawer bottom)
2026-08-26 18:06:06 -06:00

2640 lines
47 KiB
CSS

/* Ember supports plain CSS out of the box. More info: https://cli.emberjs.com/release/advanced-use/stylesheets/ */
:root {
--body-text-color: #333;
--primary-background-color: #fff;
--hover-bg: #f8f9fa;
--divider-color: #eee;
--sidebar-width: 350px;
--link-color: #2a7fff;
--link-color-visited: #6a4fbf;
--marker-color-primary: #ea4335;
--marker-color-dark: #b31412;
--danger-color: var(--marker-color-primary);
--danger-color-dark: var(--marker-color-dark);
--default-list-color: #fc3;
--secondary-text-color: #898989;
--border-color: #d8d8d8;
--success-color: #2e7d32;
--secondary-background-color: #f0f0f0;
}
html,
body {
height: 100%;
overscroll-behavior: none; /* Prevent pull-to-refresh on mobile */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: transparent;
}
button {
-webkit-tap-highlight-color: transparent;
}
body {
margin: 0;
font-family: 'Noto Sans', sans-serif;
font-size: 16px;
font-weight: normal;
color: var(--body-text-color);
}
#root,
#ember-testing {
height: 100%;
}
/* Ensure map container has a visible background while tiles load */
.map-container {
background: #f8f9fa;
-webkit-tap-highlight-color: transparent;
outline: none; /* Prevent focus outline on click */
position: absolute;
inset: 0;
}
/* Ensure RS widget is above the map but potentially hidden initially if needed */
#rs-widget-container {
position: absolute;
top: 60px; /* Below header */
right: 10px;
z-index: 4000;
display: none; /* Hidden by default */
}
#rs-widget-container.visible {
display: block;
}
.rs-backdrop {
position: fixed;
inset: 0;
z-index: 3999; /* Below widget container but above everything else */
/* background: rgb(0 0 0 / 20%); Optional: dim background */
}
/* App Header */
.app-header {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 60px;
padding: 0.5rem 1rem;
z-index: 3000; /* Above sidebar (2000) and map */
pointer-events: none; /* Let clicks pass through to map where transparent */
/* Layout */
display: grid;
/* Desktop: 1fr auto 1fr ensures the center element is absolutely centered */
grid-template-columns: 1fr auto 1fr;
grid-template-areas: 'search chips user';
align-items: center;
gap: 1rem;
}
@media (width <= 768px) {
.app-header {
padding: 0.5rem 0.5rem 0;
height: auto;
grid-template-columns: 1fr auto;
grid-template-areas:
'search user'
'chips chips';
row-gap: 8px; /* Increased spacing */
}
}
.header-left,
.header-right,
.header-center {
pointer-events: auto; /* Re-enable clicks */
}
.header-left {
display: flex;
align-items: center;
grid-area: search;
justify-self: start;
width: 100%;
}
@media (width > 768px) {
.header-left {
min-width: 300px;
max-width: 400px;
}
}
@media (width > 768px) {
.header-left {
min-width: 300px;
max-width: 350px;
}
}
.header-right {
grid-area: user;
justify-self: end;
}
.header-center {
grid-area: chips;
display: flex;
justify-content: center;
min-width: 0; /* Allow shrinking */
}
/* Adjust scroll container for desktop centering */
@media (width > 768px) {
.header-center .category-chips-scroll {
width: auto;
max-width: 100%;
}
}
@media (width <= 768px) {
.header-center {
width: 100%;
overflow: hidden;
justify-content: start;
}
/* Hide chips on mobile when searching to save space */
.header-center.searching {
display: none;
}
}
.btn-press {
transition: transform 0.1s;
}
.btn-press:active {
transform: scale(0.95);
}
.user-btn {
background: none;
border: none;
cursor: pointer;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
}
.user-avatar-placeholder {
width: 40px;
height: 40px;
background: #2a3743;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
display: block;
}
.photo-preview-img {
max-width: 100%;
height: auto;
}
.dropzone {
border: 2px dashed #ccc;
border-radius: 8px;
text-align: center;
transition: all 0.2s ease;
margin: 1.5rem 0 1rem;
background-color: rgb(255 255 255 / 2%);
cursor: pointer;
aspect-ratio: 4 / 3;
}
.dropzone.is-dragging {
border-color: #61afef;
background-color: rgb(97 175 239 / 5%);
}
.dropzone-label {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1rem;
cursor: pointer;
color: #898989;
width: 100%;
height: 100%;
}
.dropzone-label p {
margin: 0;
}
.file-input-hidden {
display: none;
}
.photo-upload-item {
position: relative;
aspect-ratio: 4 / 3;
border-radius: 6px;
overflow: hidden;
background: #1e262e;
width: 100%;
margin-bottom: 1.25rem;
}
.photo-upload-item img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: contain;
display: block;
z-index: 1;
}
.photo-upload-item .overlay,
.photo-upload-item .btn-remove-photo {
z-index: 2;
}
.photo-upload-item .overlay {
position: absolute;
inset: 0;
background: rgb(0 0 0 / 60%);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.upload-status-text {
color: white;
margin-top: 1rem;
font-size: 0.9rem;
text-shadow: 0 1px 3px rgb(0 0 0 / 80%);
text-align: center;
padding: 0 1rem;
}
.photo-upload-item .error-overlay {
background: rgb(224 108 117 / 80%);
cursor: pointer;
border: none;
padding: 0;
margin: 0;
width: 100%;
}
.photo-upload-item .btn-remove-photo {
position: absolute;
top: 4px;
right: 4px;
background: rgb(0 0 0 / 70%);
border: none;
border-radius: 50%;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: white;
padding: 0;
}
.photo-upload-item .btn-remove-photo:hover {
background: var(--danger-color);
}
.spin-animation {
animation: spin 1s linear infinite;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.btn-publish {
width: 100%;
}
/* User Menu Popover */
.user-menu-container {
position: relative;
}
.user-menu-popover {
position: absolute;
top: 100%;
right: 0;
margin-top: 10px;
width: 280px;
background: white;
border-radius: 8px;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
padding: 1rem;
z-index: 3001;
}
.menu-backdrop {
position: fixed;
inset: 0;
z-index: 3000; /* Below popover but above everything else */
/* background: rgb(0 0 0 / 10%); Optional dimming */
}
.account-list {
list-style: none;
padding: 0;
margin: 0;
}
.account-item {
display: flex;
flex-direction: column;
padding: 1rem 0;
border-bottom: 1px solid var(--divider-color);
}
.account-item:last-child {
border-bottom: none;
padding-bottom: 0;
}
.account-item:first-child {
padding-top: 0;
}
.account-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.account-status {
font-size: 0.85rem;
color: #898989;
margin-top: 0.35rem;
margin-left: calc(18px + 0.75rem);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.account-status strong {
font-weight: 600;
}
.account-item.disabled {
opacity: 0.5;
pointer-events: none;
}
.account-info {
display: flex;
align-items: center;
gap: 0.75rem;
}
.btn-text {
background: none;
border: none;
padding: 0;
font-weight: 600;
cursor: pointer;
font-size: 0.9rem;
}
.text-primary {
color: var(--link-color);
}
.text-danger {
color: #dc3545;
}
.btn-text:hover {
text-decoration: underline;
}
/* Sidebar Styles */
.sidebar {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: var(--sidebar-width);
background: white;
z-index: 3100; /* Higher than Header (3000) */
box-shadow: 2px 0 5px rgb(0 0 0 / 10%);
display: flex;
flex-direction: column;
overflow: hidden; /* Ensure flex children are contained */
will-change: transform;
}
.sidebar-opening .sidebar {
animation: sidebar-slide-in-left 0.18s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
.sidebar.app-menu-pane {
z-index: 3200; /* Higher than Places Sidebar (3100) */
}
@media (width <= 768px) {
.sidebar.app-menu-pane {
width: 100%;
right: 0;
border-radius: 16px 16px 0 0;
height: 66vh;
top: auto;
bottom: 0;
}
}
.sidebar-header {
height: 56px; /* Strictly enforce identical vertical height */
padding: 0 1rem; /* Keep horizontal padding, remove vertical padding */
border-bottom: 1px solid var(--divider-color);
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box; /* Guarantee strict height boundaries */
}
.sidebar-header.no-border {
border-bottom-color: transparent;
}
.sidebar-header h2 {
margin: 0;
font-size: 1.1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.sidebar-content {
padding: 1rem;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
flex: 1;
min-height: 0;
touch-action: pan-y;
overscroll-behavior: contain;
}
.app-menu-pane .sidebar-content {
padding-top: 0.5rem;
}
.app-menu {
list-style: none;
padding: 0;
margin: 0 -1rem;
}
.app-menu button {
width: 100%;
display: flex;
align-items: center;
gap: 0.8rem;
padding: 1rem;
padding-left: 1.4rem;
background: none;
border: none;
color: var(--body-text-color);
cursor: pointer;
text-align: left;
font-size: 0.95rem;
font-family: inherit;
transition: background-color 0.2s;
}
.app-menu button:hover {
background-color: var(--hover-bg);
}
.app-menu .icon {
color: #666;
width: 20px;
height: 20px;
}
.sidebar-content details {
margin: 0 -1rem; /* Top margin, negative side margins to span full width */
}
.sidebar-content details summary {
list-style: none; /* Hide default triangle */
display: flex;
align-items: center;
gap: 0.8rem;
padding: 1rem;
padding-left: 1.4rem;
cursor: pointer;
font-size: 0.95rem;
color: var(--body-text-color);
transition: background-color 0.2s;
}
.sidebar-content details summary::-webkit-details-marker {
display: none; /* Hide default triangle in WebKit */
}
.sidebar-content details summary:hover {
background-color: var(--hover-bg);
}
.sidebar-content details summary .icon {
width: 20px;
height: 20px;
}
.sidebar-content details summary::after {
content: '';
width: 20px;
height: 20px;
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'/%3E%3C/svg%3E");
background-size: 20px 20px;
background-repeat: no-repeat;
background-position: center;
margin-left: auto;
transition: transform 0.2s ease;
}
.sidebar-content details[open] summary::after {
transform: rotate(90deg);
}
.sidebar-content details .details-content {
padding: 0 1.4rem 1rem;
animation: details-slide-down 0.2s ease-out;
font-size: 0.9rem;
}
.sidebar-content details .details-content.form-layout {
display: flex;
flex-direction: column;
gap: 16px;
}
.relay-list {
list-style: none;
padding: 0;
margin: 0 0 0.75rem;
display: flex;
flex-direction: column;
gap: 4px;
}
.relay-list li {
display: flex;
align-items: center;
gap: 8px;
padding: 0.25rem 0;
border-radius: 4px;
font-size: 0.9rem;
word-break: break-all;
}
.relay-actions {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
margin-left: auto;
}
.relay-list-hint {
margin: 0 0 0.5rem;
font-size: 0.8rem;
color: var(--secondary-text-color);
}
.btn-remove-relay {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: var(--primary-background-color);
border: 1px solid var(--danger-color);
color: var(--danger-color);
cursor: pointer;
padding: 0;
transition: all 0.1s ease;
flex-shrink: 0;
}
.btn-remove-relay svg {
stroke: currentcolor;
}
.btn-remove-relay:hover:not(:disabled),
.btn-remove-relay:active:not(:disabled) {
background-color: var(--danger-color);
color: var(--primary-background-color);
}
.btn-remove-relay:disabled {
border-color: var(--border-color);
color: var(--secondary-text-color);
cursor: default;
opacity: 0.6;
}
.add-relay-input {
display: flex;
gap: 0.5rem;
}
.btn-link.reset-relays {
margin-top: 0.75rem;
font-size: 0.85rem;
}
.btn-trust-relay {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: var(--primary-background-color);
border: 1px solid var(--border-color);
color: var(--secondary-text-color);
cursor: pointer;
padding: 0;
transition: all 0.1s ease;
flex-shrink: 0;
}
.btn-trust-relay svg {
stroke: currentcolor;
}
.btn-trust-relay.is-trusted {
border-color: var(--success-color);
color: var(--success-color);
}
.btn-trust-relay:hover,
.btn-trust-relay:active {
background-color: var(--secondary-background-color);
}
.btn-trust-relay:disabled {
cursor: default;
opacity: 0.6;
}
@keyframes details-slide-down {
from {
opacity: 0;
transform: translateY(-5px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.edit-form {
margin: -1rem;
margin-bottom: 1rem;
background: var(--hover-bg);
padding: 1rem;
border-bottom: 1px solid var(--divider-color);
}
.form-group {
margin-bottom: 0.75rem;
}
.form-group label {
display: block;
font-size: 0.85rem;
color: #666;
margin-bottom: 0.5rem;
}
.form-control {
width: 100%;
padding: 0.5rem;
border: 1px solid #ddd;
border-radius: 4px;
font-family: inherit;
font-size: 1rem;
box-sizing: border-box; /* Ensure padding doesn't overflow width */
color: var(--body-text-color);
background-color: var(--primary-background-color);
}
.form-control:focus {
outline: none;
border-color: var(--link-color);
box-shadow: 0 0 0 2px rgb(42 127 255 / 10%);
}
select.form-control {
appearance: none;
background-color: var(--primary-background-color);
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.75rem center;
background-size: 16px 16px;
padding-right: 2.5rem;
cursor: pointer;
}
.edit-actions {
display: flex;
gap: 0.5rem;
justify-content: flex-end;
}
.settings-section {
margin-bottom: 2rem;
font-size: 0.95rem;
}
.settings-section .form-group {
margin-top: 0.5rem;
margin-bottom: 0;
}
.settings-section .form-group:first-of-type {
margin-top: 1rem;
}
.about-section {
margin-bottom: 2rem;
}
.about-section a {
color: var(--link-color);
text-decoration: none;
}
.about-section a:visited {
color: var(--link-color-visited);
}
.about-section a:hover {
text-decoration: underline;
}
.about-section p + ul {
margin-top: 0.25rem;
}
.about-section ul {
padding-inline-start: 1.2em;
margin: 0.5rem 0 0;
}
.about-section li {
padding-inline-start: 0.5rem;
margin-block: 0.15rem;
}
.about-section li::marker {
content: '♥';
color: #898989;
}
.btn-full {
width: 100%;
}
.btn-primary {
background: var(--link-color);
color: white;
border: none;
padding: 0.75rem;
border-radius: 4px;
font-weight: 500;
cursor: pointer;
}
.btn-primary:hover {
background: #0069d9;
}
.meta-info {
font-size: 0.9rem;
}
.meta-info p {
margin-top: 1rem;
margin-bottom: 1rem;
}
.meta-info p:first-child {
margin-top: 1.2rem;
padding-top: 1.2rem;
border-top: 1px solid var(--divider-color);
}
.meta-info a,
.meta-info .btn-link {
color: var(--link-color);
text-decoration: none;
background: none;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
}
.meta-info a:hover,
.meta-info .btn-link:hover {
text-decoration: underline;
}
.sidebar-content table {
width: 100%;
border-collapse: collapse;
}
.sidebar-content table th,
.sidebar-content table td {
padding: 0.5rem 0;
text-align: left;
}
.sidebar-content table th {
font-size: 0.75rem;
font-weight: bold;
text-transform: uppercase;
color: #898989;
}
.sidebar-content table td {
border-bottom: 1px solid #f9f9f9;
}
.sidebar-content table tr:last-child td {
border-bottom: none;
}
abbr[title] {
text-decoration: underline dotted;
}
.places-list {
list-style: none;
padding: 0;
margin: -1rem -1rem 0;
}
.place-item {
width: 100%;
text-align: left;
border: none;
border-bottom: 1px solid var(--divider-color);
background: var(--primary-background-color);
color: var(--body-text-color);
padding: 1rem;
cursor: pointer;
transition: background 0.2s;
font-family: inherit;
}
.place-item:hover {
background: var(--hover-bg);
}
.place-name {
font-size: 1rem;
font-weight: bold;
margin-bottom: 0.25rem;
}
.place-type {
color: #666;
font-size: 0.85rem;
}
.back-btn {
background: none;
border: none;
cursor: pointer;
padding: 0 0.5rem;
margin-left: -0.5rem;
display: flex;
align-items: center;
justify-content: center;
}
.close-btn {
background: none;
border: none;
cursor: pointer;
padding: 0 0.5rem;
margin-right: -0.5rem;
display: flex;
align-items: center;
justify-content: center;
}
.place-details {
padding-bottom: 2rem;
}
.photo-carousel {
position: relative;
}
.photo-carousel.inline {
margin: -1rem -1rem 1rem;
}
.photo-carousel-track {
display: flex;
overflow-x: auto;
scroll-behavior: smooth;
scroll-snap-type: x mandatory;
scrollbar-width: none; /* Firefox */
background-color: var(--hover-bg);
}
.photo-carousel-track::-webkit-scrollbar {
display: none; /* Safari and Chrome */
}
.carousel-slide {
cursor: pointer;
position: relative;
flex: 0 0 100%;
scroll-snap-align: start;
aspect-ratio: 16 / 9;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.carousel-placeholder {
display: none;
}
.place-header-photo-blur {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.place-header-photo {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: block;
opacity: 0;
transition: opacity 0.3s ease-in-out;
z-index: 1; /* Stay above blurhash */
}
.place-header-photo.landscape {
object-fit: cover;
}
.place-header-photo.portrait {
object-fit: contain;
}
.place-header-photo.loaded {
opacity: 1;
}
.place-header-photo.loaded-instant {
opacity: 1;
transition: none;
}
.carousel-nav-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgb(0 0 0 / 50%);
color: white;
border: none;
border-radius: 50%;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 2;
opacity: 0;
transition:
opacity 0.2s,
background-color 0.2s;
padding: 0;
}
.photo-carousel:hover .carousel-nav-btn:not(.disabled) {
opacity: 1;
}
.carousel-nav-btn:not(.disabled):hover {
background: rgb(0 0 0 / 80%);
}
.carousel-nav-btn.disabled {
opacity: 0;
pointer-events: none;
}
.carousel-nav-btn.prev {
left: 0.5rem;
}
.carousel-nav-btn.next {
right: 0.5rem;
}
@media (width <= 768px) {
.photo-carousel.inline .photo-carousel-track {
scroll-snap-type: none;
gap: 2px;
background-color: var(--primary-background-color);
}
.photo-carousel.inline .carousel-slide {
flex: 0 0 auto;
height: 100px;
width: auto;
scroll-snap-align: none;
}
.photo-carousel.inline .carousel-slide.landscape {
aspect-ratio: var(--slide-ratio, 16 / 9);
}
.photo-carousel.inline .carousel-slide.portrait {
aspect-ratio: 1 / 1;
}
.photo-carousel.inline .carousel-placeholder {
display: block;
background-color: var(--hover-bg);
flex: 1 1 0%;
min-width: 0;
}
.photo-carousel.inline .place-header-photo.landscape,
.photo-carousel.inline .place-header-photo.portrait {
object-fit: cover;
}
.photo-carousel.inline .carousel-nav-btn {
display: none;
}
}
.place-details h3 {
font-size: 1.2rem;
margin-top: 0;
margin-bottom: 0.5rem;
}
.place-details .place-type {
color: #666;
font-size: 0.9rem;
margin: 0 0 1rem;
}
.place-details p.place-description {
line-height: 1.4;
}
.place-details .actions {
padding-bottom: 0.3rem;
display: flex;
flex-direction: row;
gap: 1rem;
margin-top: 1.5rem;
}
.btn {
/* TODO: remove this scoped rule in favor of a global box-sizing reset
(e.g. `*, *::before, *::after { box-sizing: border-box; }`) at the top
of this file. Needed so `width: 100%` .btn elements like <a class="btn-full">
include padding within their width like <button> does. */
box-sizing: border-box;
padding: 0.6rem 1.2rem;
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
text-decoration: none;
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
.btn-outline {
background: transparent;
color: var(--body-text-color);
border: 1px solid #ccc;
}
.btn-outline:hover {
border: 1px solid #898989;
}
.btn-secondary {
color: var(--body-text-color);
border: 1px solid rgb(255 204 51 / 20%);
background: rgb(255 204 51 / 30%);
}
.btn-secondary:hover {
background: rgb(255 204 51 / 40%);
}
.btn-blue {
background: var(--link-color);
color: white;
border: none;
}
.btn-blue:hover {
background: #0056b3;
}
.btn-green {
background: #198754;
color: white;
border: none;
}
.btn-green:hover {
background: #157347;
}
/* Map Search Pulse Animation */
.search-pulse {
border-radius: 50%;
border: 2px solid rgb(255 204 51 / 80%); /* Gold/Yellow to match markers */
background: rgb(255 204 51 / 20%);
position: absolute;
/* Use translate3d for GPU acceleration on iOS */
transform: translate3d(-50%, -50%, 0);
pointer-events: none;
animation: pulse 1.5s infinite ease-out;
box-sizing: border-box; /* Ensure border is included in width/height */
display: none; /* Hidden by default */
will-change: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.search-pulse.active {
display: block;
}
.search-pulse.blue {
border-color: rgb(51 153 204 / 80%);
background: rgb(51 153 204 / 20%);
}
@keyframes pulse {
0% {
transform: translate3d(-50%, -50%, 0) scale(0.8);
opacity: 0.8;
}
100% {
transform: translate3d(-50%, -50%, 0) scale(1.4);
opacity: 0;
}
}
/* Map controls */
.ol-control.ol-attribution {
bottom: 1rem;
}
.ol-touch .ol-control.ol-attribution {
bottom: 0.5rem;
}
.ol-control.ol-zoom {
bottom: 3rem;
}
.ol-touch .ol-control.ol-zoom {
bottom: 3.5rem;
}
.ol-control.ol-locate {
bottom: 6.5rem;
}
.ol-touch .ol-control.ol-locate {
bottom: 8.5rem;
}
.ol-control.ol-rotate {
bottom: 9rem;
}
.ol-touch .ol-control.ol-rotate {
bottom: 11.5rem;
}
.ol-control.ol-attribution,
.ol-control.ol-zoom,
.ol-control.ol-locate,
.ol-control.ol-rotate {
top: auto;
left: auto;
right: 1rem;
}
.ol-touch .ol-control.ol-attribution,
.ol-touch .ol-control.ol-zoom,
.ol-touch .ol-control.ol-locate,
.ol-touch .ol-control.ol-rotate {
right: 0.5rem;
}
/* Icons */
.app-logo-icon {
display: inline-flex;
width: 32px;
height: 32px;
margin: -6px 0;
}
.app-logo-icon svg {
width: 100%;
height: 100%;
}
span.icon {
display: inline-block;
}
.icon {
flex-shrink: 0;
}
.icon svg {
width: 100%;
height: 100%;
stroke: currentcolor;
fill: none;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
.icon-filled svg {
stroke: none;
fill: currentcolor;
}
.content-with-icon {
display: flex;
flex-direction: row;
align-items: flex-start;
gap: 0.5rem;
}
.content-with-icon > span:not(.icon) {
min-width: 0;
flex: 1;
}
.content-with-icon > span:not(.icon) a {
display: inline-block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: bottom;
}
.content-with-icon .icon {
margin-top: 0.15rem;
}
/* Selected Pin Animation */
.selected-pin-container {
position: absolute;
/* Center the bottom tip of the pin at the coordinate */
transform: translate(-50%, -100%);
pointer-events: none; /* Let clicks pass through to the map features below if needed */
display: none;
}
.selected-pin-container.active {
display: block;
animation: drop-in 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
}
.selected-pin {
width: 40px;
height: 40px;
color: var(--marker-color-primary);
filter: drop-shadow(0 4px 6px rgb(0 0 0 / 30%));
}
.selected-pin svg {
width: 100%;
height: 100%;
fill: var(--marker-color-primary);
stroke: var(--marker-color-dark);
stroke-width: 1;
}
/* Optional: Small dot at the bottom to ground it */
.selected-pin-shadow {
width: 10px;
height: 4px;
background: rgb(0 0 0 / 30%);
border-radius: 50%;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
z-index: -1;
opacity: 0;
animation: shadow-fade 0.5s 0.2s forwards;
}
@keyframes drop-in {
0% {
transform: translate(-50%, -200%) scale(0);
opacity: 0;
}
60% {
opacity: 1;
}
100% {
transform: translate(-50%, -100%) scale(1);
opacity: 1;
}
}
@keyframes shadow-fade {
to {
opacity: 1;
}
}
/* Map Crosshair for "Create Place" mode */
.map-crosshair {
position: absolute;
/* Default Center */
top: 50%;
left: 50%;
width: 24px;
height: 24px;
transform: translate(-50%, -50%);
color: var(--body-text-color);
pointer-events: none;
z-index: 2000;
display: none;
transition:
top 0.3s ease,
left 0.3s ease;
}
.map-crosshair.visible {
display: block;
}
/* Sidebar is open (Desktop: Left var(--sidebar-width)) */
/* We want to center in the remaining space (width - var(--sidebar-width)) */
/* Center X = var(--sidebar-width) + (width - var(--sidebar-width)) / 2 = var(--sidebar-width)/2 + 50% */
.map-container.sidebar-open .map-crosshair {
left: calc(50% + var(--sidebar-width) / 2);
}
@media (width <= 768px) {
/* Sidebar/Bottom Sheet is open (Mobile: Bottom 50%) */
/* Center Y = (height/2) / 2 = height/4 = 25% + half header height */
.map-container.sidebar-open .map-crosshair {
left: 50%; /* Reset desktop shift */
top: calc(25% + 30px); /* 30px approx half header height */
}
}
.helper-text {
background: #eef4fc;
color: #1a5c9b;
padding: 0.75rem;
border-radius: 4px;
font-size: 0.9rem;
margin-top: 0;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
button.create-place {
width: 100%;
margin: 1.5rem auto;
}
@media (width <= 768px) {
.sidebar {
width: 100%;
height: 50vh;
box-shadow: 0 -2px 10px rgb(0 0 0 / 10%);
border-top-left-radius: 16px;
border-top-right-radius: 16px;
inset: auto 0 0;
}
.sidebar-opening .sidebar {
animation: sidebar-slide-up-bottom 0.18s cubic-bezier(0.16, 1, 0.3, 1)
forwards;
}
.sidebar-content {
overflow-y: auto;
/* Ensure content doesn't get hidden behind bottom safe areas on mobile */
padding-bottom: env(safe-area-inset-bottom, 20px);
}
}
/* Search Box Component */
.search-box {
position: relative;
width: 100%;
max-width: 400px;
margin-left: 0;
z-index: 3002; /* Higher than menu button to be safe */
}
@media (width <= 768px) {
.search-box {
max-width: calc(100vw - 65px);
}
}
.search-form {
display: flex;
align-items: center;
background: white;
border-radius: 24px; /* Pill shape */
box-shadow: 0 2px 5px rgb(0 0 0 / 15%);
padding: 0 0.5rem;
height: 48px; /* Slightly taller for touch targets */
transition: box-shadow 0.2s;
}
.search-form:focus-within {
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
}
/* Integrated Menu Button */
.menu-btn-integrated {
background: transparent;
border: none;
padding: 8px;
margin-right: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
color: #5f6368;
}
.menu-btn-integrated:hover {
background: rgb(0 0 0 / 5%);
}
/* Fallback Search Icon (Left) */
.search-icon {
display: flex;
align-items: center;
justify-content: center;
color: #5f6368;
margin-right: 0.5rem;
padding: 8px; /* Match button size */
}
.search-input {
border: none;
background: transparent;
flex: 1;
min-width: 0;
height: 100%;
font-size: 1rem;
color: var(--body-text-color);
outline: none;
width: 100%;
padding: 0 4px;
/* Remove native search cancel button in WebKit */
-webkit-appearance: none;
}
/* Remove 'x' from search input in Chrome/Safari */
.search-input::-webkit-search-cancel-button {
-webkit-appearance: none;
}
/* Submit Button (Right) */
.search-submit-btn {
background: transparent;
border: none;
padding: 8px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
color: #5f6368;
border-radius: 50%;
margin-left: 4px;
}
.search-submit-btn:hover {
background: rgb(0 0 0 / 5%);
color: var(--body-text-color);
}
.search-clear-btn {
background: none;
border: none;
padding: 8px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
color: #5f6368;
border-radius: 50%;
margin-left: 2px;
}
.search-clear-btn:hover {
background: rgb(0 0 0 / 5%);
color: var(--body-text-color);
}
/* Search Results Popover */
.search-results-popover {
position: absolute;
top: 100%;
left: 0;
right: 0;
margin-top: 8px;
background: white;
border-radius: 8px;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
overflow: hidden;
max-height: 400px;
overflow-y: auto;
z-index: 3002;
}
.search-results-list {
list-style: none;
padding: 0;
margin: 0;
}
.search-result-item {
width: 100%;
display: flex;
align-items: center; /* Vertical center alignment */
gap: 0.75rem;
padding: 0.75rem 1rem;
border: none;
background: white;
text-align: left;
cursor: pointer;
transition: background 0.1s;
border-bottom: 1px solid #f0f0f0;
}
.search-result-item:last-child {
border-bottom: none;
}
.search-result-item:hover,
.search-result-item:focus {
background: var(--hover-bg);
outline: none;
}
.result-icon {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: #f0f0f0;
border-radius: 50%;
flex-shrink: 0;
color: #666;
}
.result-info {
display: flex;
flex-direction: column;
overflow: hidden; /* For text truncation if needed */
}
.result-title {
font-weight: 500;
color: var(--body-text-color);
font-size: 0.95rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.result-desc {
font-size: 0.8rem;
color: #777;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 2px;
}
/* Place Lists Manager */
.save-button-wrapper {
position: relative;
}
.place-lists-manager {
position: absolute;
top: 100%;
left: 0;
margin-top: 0.5rem;
background: white;
border-radius: 8px;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
width: 220px;
z-index: 10;
padding: 0.5rem 0;
}
.place-lists-manager .list-item {
padding: 0.5rem 1rem;
display: flex;
align-items: center;
}
.place-lists-manager .list-item:hover {
background: var(--hover-bg);
}
.place-lists-manager label {
display: flex;
align-items: center;
gap: 0.75rem;
width: 100%;
cursor: pointer;
margin: 0;
font-size: 0.95rem;
color: var(--body-text-color);
}
.place-lists-manager input[type='checkbox'] {
accent-color: var(--link-color);
width: 16px;
height: 16px;
cursor: pointer;
}
/* Shared List Color Dot */
.list-color-dot {
width: 12px;
height: 12px;
background-color: var(--default-list-color);
border-radius: 50%;
flex-shrink: 0;
border: 1px solid rgb(0 0 0 / 10%);
}
.place-lists-manager .divider {
height: 1px;
background: var(--divider-color);
margin: 0.5rem 0;
}
/* Category Chips */
.category-chips-scroll {
width: 100%;
overflow-x: auto;
/* Add padding for shadows */
padding: 4px 0;
-webkit-overflow-scrolling: touch;
/* Hide scrollbar but keep functionality */
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE/Edge */
/* Remove top margin as spacing is handled by grid/layout */
margin-top: 0;
}
.category-chips-scroll::-webkit-scrollbar {
display: none;
}
.category-chips-container {
display: flex;
gap: 8px;
/* Padding on sides so first/last chip isn't flush with screen edge */
padding: 0 4px;
width: max-content; /* Ensure it scrolls */
}
.category-chip {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
background: white;
border: 1px solid #ddd;
border-radius: 16px; /* Pill shape */
font-size: 0.9rem;
color: var(--body-text-color);
cursor: pointer;
white-space: nowrap;
box-shadow: 0 1px 3px rgb(0 0 0 / 10%);
transition: background-color 0.2s;
}
.category-chip:hover {
background: var(--hover-bg);
}
.category-chip:active {
background: var(--divider-color);
}
.category-chip:disabled {
opacity: 0.75;
cursor: not-allowed;
pointer-events: none;
}
/* Toast Notification */
.toast-notification {
position: fixed;
bottom: 2rem;
left: 50%;
transform: translateX(-50%);
background-color: rgb(51 51 51 / 85%);
backdrop-filter: blur(4px);
color: white;
padding: 0.75rem 1.5rem;
border-radius: 999px;
z-index: 9999;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
animation: fade-in-up 0.3s ease-out forwards;
text-align: center;
max-width: 90%;
font-size: 0.9rem;
font-weight: 500;
pointer-events: none;
}
@keyframes fade-in-up {
from {
opacity: 0;
transform: translate(-50%, 1rem);
}
to {
opacity: 1;
transform: translate(-50%, 0);
}
}
/* Nostr Connect */
.nostr-connect-modal h2 {
margin-top: 0;
}
.nostr-connect-options {
display: flex;
flex-direction: column;
gap: 1rem;
margin-top: 1.5rem;
}
.mobile-connect-actions {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-top: 1rem;
}
.nostr-connect-status {
margin-top: 1.5rem;
text-align: center;
}
.qr-code-container {
display: flex;
justify-content: center;
margin-top: 1rem;
}
.qr-code-container canvas {
border-radius: 8px;
background: white; /* Ensure good contrast for scanning */
}
/* Modal */
.modal-overlay {
position: fixed;
inset: 0;
background: rgb(0 0 0 / 50%);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
}
.modal-content {
background: white;
border-radius: 8px;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
padding: 1.5rem;
max-width: 90vw;
width: 450px;
position: relative;
}
.close-modal-btn {
position: absolute;
top: 1rem;
right: 1rem;
cursor: pointer;
color: #898989;
}
.close-modal-btn.disabled {
color: #ccc;
cursor: not-allowed;
}
.place-photo-upload h2 {
margin-top: 0;
font-size: 1.2rem;
}
.place-photo-upload .form-group {
margin-bottom: 1.5rem;
}
.photo-tag-suggestions {
margin-bottom: 1.25rem;
}
.photo-tag-suggestions-title {
color: #898989;
margin: 0 0 0.75rem;
font-weight: normal;
font-size: 0.9rem;
}
.photo-tag-suggestions-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.photo-tag-chip {
background: #f8f9fa;
color: var(--body-text-color);
border: none;
border-radius: 16px;
padding: 6px 12px;
font-size: 0.9rem;
cursor: pointer;
transition: background-color 0.1s;
}
.photo-tag-chip:hover {
background: var(--divider-color);
}
.photo-tag-chip.is-selected {
background: rgb(255 204 51 / 30%);
}
.alert {
padding: 0.5rem;
margin-bottom: 1rem;
border-radius: 0.25rem;
}
.alert-error {
background: #fee;
color: #c00;
}
.preview-group {
margin-bottom: 1rem;
}
.preview-group p {
margin-bottom: 0.25rem;
font-weight: bold;
}
.preview-group img {
max-width: 100%;
border-radius: 0.25rem;
}
.btn-link {
background: none;
border: none;
padding: 0;
color: var(--link-color);
text-decoration: none;
cursor: pointer;
font: inherit;
}
.btn-link:hover {
text-decoration: underline;
}
/* Photo Gallery */
.photo-gallery-overlay {
position: fixed;
inset: 0;
background: rgb(0 0 0 / 90%);
z-index: 9999;
display: flex;
flex-direction: column;
}
.photo-gallery-overlay .photo-gallery-content {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
position: relative;
}
.photo-gallery-overlay .close-btn {
position: absolute;
top: 0.5rem;
right: 1rem;
width: 48px;
height: 48px;
z-index: 10;
color: white;
background: transparent;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s ease;
}
@media (width <= 768px) {
.photo-gallery-overlay .close-btn {
right: 0.5rem;
}
}
.photo-gallery-overlay .main-photo-container {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
padding: 2rem;
overflow: hidden;
}
@media (width <= 768px) {
.photo-gallery-overlay .main-photo-container {
padding: 2rem 0;
}
}
.photo-gallery-overlay .main-photo-container img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
/* Photo Carousel: Gallery Main Variant */
.photo-carousel.gallery-main {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.photo-carousel.gallery-main .photo-carousel-track {
height: 100%;
background: transparent;
}
.photo-carousel.gallery-main .carousel-slide {
height: 100%;
flex: 0 0 100%;
aspect-ratio: auto;
cursor: default;
}
.photo-carousel.gallery-main .carousel-nav-btn {
width: 48px;
height: 48px;
}
.photo-carousel.gallery-main .place-header-photo-blur,
.photo-carousel.gallery-main .place-header-photo.landscape,
.photo-carousel.gallery-main .place-header-photo.portrait {
object-fit: contain;
}
@media (width <= 768px) {
.photo-carousel.gallery-main .carousel-nav-btn {
display: none;
}
}
/* Photo Carousel: Gallery Thumbnails Variant */
.photo-carousel.gallery-thumbnails {
width: 100%;
height: 100px;
background: rgb(0 0 0 / 50%);
padding-bottom: env(safe-area-inset-bottom, 0); /* Support mobile safe area */
}
.photo-carousel.gallery-thumbnails .photo-carousel-track {
height: 100%;
background: transparent;
gap: 4px;
scroll-snap-type: none;
padding: 0;
}
.photo-carousel.gallery-thumbnails .carousel-slide {
flex: 0 0 auto;
height: 100%;
width: auto;
scroll-snap-align: none;
opacity: 0.6;
transition: opacity 0.2s;
}
.photo-carousel.gallery-thumbnails .carousel-slide.landscape {
aspect-ratio: var(--slide-ratio, 16 / 9);
}
.photo-carousel.gallery-thumbnails .carousel-slide.portrait {
aspect-ratio: 1 / 1;
}
.photo-carousel.gallery-thumbnails .carousel-slide:hover,
.photo-carousel.gallery-thumbnails .carousel-slide.active {
opacity: 1;
}
.photo-carousel.gallery-thumbnails .place-header-photo.landscape,
.photo-carousel.gallery-thumbnails .place-header-photo.portrait {
object-fit: cover;
height: 100%;
}
.photo-carousel.gallery-thumbnails .carousel-nav-btn {
display: none;
}
/* Dropdown Menu Component */
.dropdown-menu-container {
position: relative;
display: inline-block;
}
.dropdown-trigger-btn {
background: transparent;
border: none;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.dropdown-popover {
position: absolute;
top: 100%;
left: 0;
margin-top: 5px;
background: white;
border-radius: 8px;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
padding: 0.5rem 0;
z-index: 3001;
min-width: 150px;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.dropdown-item {
background: transparent;
border: none;
padding: 0.5rem 1rem;
text-align: left;
cursor: pointer;
font-size: 0.95rem;
color: var(--body-text-color);
white-space: nowrap;
}
.dropdown-item:hover {
background: #f0f0f0;
}
/* Photo gallery header (actions button + uploader info) */
.photo-gallery-overlay .photo-gallery-header {
position: absolute;
top: 0.5rem;
left: 1rem;
z-index: 10;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.25rem;
}
.photo-gallery-overlay .photo-gallery-header .actions-btn-container {
position: relative;
z-index: 2;
height: 48px;
display: flex;
align-items: center;
justify-content: flex-start;
flex-shrink: 0;
}
/* Uploader info (name + date) in photo gallery */
.photo-gallery-overlay .photo-gallery-uploader-info {
color: rgb(255 255 255 / 90%);
display: flex;
flex-direction: column;
gap: 0.1rem;
pointer-events: none;
text-shadow: 0 1px 2px rgb(0 0 0 / 60%);
max-width: calc(100vw - 4rem);
overflow: hidden;
}
.photo-gallery-overlay .photo-gallery-uploader-name {
font-size: 0.95rem;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.photo-gallery-overlay .photo-gallery-uploader-date {
font-size: 0.8rem;
color: rgb(255 255 255 / 70%);
white-space: nowrap;
}
@media (width <= 768px) {
.photo-gallery-overlay .photo-gallery-header {
flex-direction: row;
align-items: flex-start;
gap: 0.5rem;
left: 0.5rem;
}
.photo-gallery-overlay .photo-gallery-uploader-info {
flex-direction: row;
align-items: center;
gap: 0.35rem;
align-self: center;
}
}
/* Snappy slide-in from left (Desktop) */
@keyframes sidebar-slide-in-left {
from {
transform: translateX(-100%);
}
to {
transform: translateX(0);
}
}
/* Snappy slide-up from bottom (Mobile) */
@keyframes sidebar-slide-up-bottom {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
/* Lists Index Sidebar Menu */
.lists-index-item {
width: 100%;
text-align: left;
border: none;
border-bottom: 1px solid var(--divider-color);
background: var(--primary-background-color);
color: var(--body-text-color);
padding: 1rem;
cursor: pointer;
transition: background 0.2s;
font-family: inherit;
display: flex;
align-items: center;
justify-content: space-between;
}
.lists-index-item:hover {
background: var(--hover-bg);
}
.lists-index-item-left {
display: flex;
align-items: center;
gap: 12px;
min-width: 0;
}
.lists-index-name {
font-size: 0.95rem;
font-weight: normal;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.lists-index-count {
color: #666;
font-size: 0.85rem;
margin: 0;
white-space: nowrap;
flex-shrink: 0;
}
/* Centered layout when back button is present */
.sidebar-header.has-back-btn {
position: relative;
justify-content: center; /* Center horizontally */
}
/* Absolute positioning for buttons in centered header */
.sidebar-header.has-back-btn .back-btn {
position: absolute;
left: 1rem;
z-index: 10;
}
.sidebar-header.has-back-btn .close-btn {
position: absolute;
right: 1rem;
z-index: 10;
}
/* Centralized Title text */
.sidebar-header-text-centered {
position: relative;
margin: 0;
font-size: 1.2rem;
font-weight: bold;
display: inline-flex;
align-items: center;
justify-content: center;
text-align: center;
max-width: 60%;
}
.sidebar-header-icon-wrapper {
position: absolute;
right: 100%;
margin-right: 0.5rem;
display: flex;
align-items: center;
}
/* Sidebar Loading State */
.sidebar-loading {
display: flex;
align-items: center;
justify-content: center;
padding: 4rem 1rem;
}
/* Contributions Timeline */
.contributions-list {
list-style: none;
padding: 0;
margin: -1rem -1rem 0;
}
.contribution-item {
width: 100%;
text-align: left;
border: none;
border-bottom: 1px solid var(--divider-color);
background: var(--primary-background-color);
color: var(--body-text-color);
padding: 0.75rem 1rem;
cursor: pointer;
transition: background 0.2s;
font-family: inherit;
display: flex;
align-items: flex-start;
gap: 12px;
}
.contribution-item:hover {
background: var(--hover-bg);
}
.contribution-thumb {
position: relative;
flex-shrink: 0;
width: 56px;
height: 56px;
border-radius: 6px;
overflow: hidden;
background: #f0f0f0;
}
.contribution-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.contribution-thumb-badge {
position: absolute;
bottom: 2px;
right: 2px;
background: rgb(0 0 0 / 65%);
color: #fff;
font-size: 0.7rem;
font-weight: bold;
padding: 1px 4px;
border-radius: 4px;
}
.contribution-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.contribution-place {
font-size: 1rem;
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.contribution-name-loading {
color: #999;
font-weight: normal;
font-style: italic;
}
.contribution-meta {
color: #666;
font-size: 0.85rem;
}
.contribution-tags {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 4px;
}
.contribution-tag {
background: #f0f0f0;
color: #555;
font-size: 0.72rem;
padding: 2px 6px;
border-radius: 10px;
}
/* Generic modal heading reset (shared by all modals) */
.modal-content h2,
.modal-content h3 {
margin-top: 0;
}
/* Zap Photo Modal — scoped, nested styles */
.zap-photo-modal {
text-align: left;
& h2 {
margin-bottom: 1rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid var(--divider-color);
}
& section.status {
padding-bottom: 0.75rem;
margin-bottom: 1.5rem;
border-bottom: 1px solid var(--divider-color);
}
& section.slider {
text-align: center;
margin-bottom: 1.5rem;
}
& .amount-display {
display: flex;
align-items: baseline;
justify-content: center;
gap: 0.4rem;
margin-bottom: 0.75rem;
}
& .amount-value {
font-size: 2rem;
font-weight: 700;
color: var(--default-list-color);
}
& .amount-unit {
font-size: 0.9rem;
color: var(--body-text-color);
opacity: 0.7;
}
& .zap-slider {
width: 100%;
accent-color: var(--default-list-color);
cursor: pointer;
}
& .slider-ticks {
display: flex;
justify-content: space-between;
font-size: 0.85rem;
color: var(--body-text-color);
opacity: 0.5;
padding: 0 0.25rem;
}
& .form-group {
margin-bottom: 1.5rem;
}
& .lightning-address {
display: flex;
align-items: center;
gap: 0.5rem;
}
& .lightning-badge {
background: var(--default-list-color);
color: white;
font-size: 0.7rem;
font-weight: 600;
padding: 2px 8px;
border-radius: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
& .lightning-address-text {
font-family: monospace;
font-size: 0.9rem;
color: var(--body-text-color);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
& .zap-pay-prompt {
text-align: center;
}
& .qr-code-container {
margin-bottom: 1.5rem;
}
& .btn-full + .btn-full {
margin-top: 0.75rem;
}
& .alert-error {
font-size: 0.95rem;
}
& .meta-info {
font-size: 0.95rem;
}
& .centered {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1rem;
padding-top: 1.5rem;
}
& .success {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 0.5rem;
}
& .success-icon {
font-size: 3rem;
}
& .success h4 {
margin: 0;
font-size: 1.2rem;
}
& .success p {
margin: 0;
margin-bottom: 1.5rem;
font-size: 0.9rem;
color: var(--body-text-color);
}
}