/* 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; } 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; justify-content: space-between; align-items: center; padding: 0.25rem 0; border-radius: 4px; font-size: 0.9rem; word-break: break-all; } .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, .btn-remove-relay:active { background-color: var(--danger-color); color: var(--primary-background-color); } .add-relay-input { display: flex; gap: 0.5rem; } .btn-link.reset-relays { margin-top: 0.75rem; font-size: 0.85rem; } @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 include padding within their width like