diff --git a/assets/js/accommodation_widget.js b/assets/js/accommodation_widget.js index 426c5cf32..cf6579191 100644 --- a/assets/js/accommodation_widget.js +++ b/assets/js/accommodation_widget.js @@ -14,10 +14,12 @@ const radioHandler = (event) => { hostingInterest.classList.remove('u:hidden'); hostingInterest.classList.add('u:block'); } - accommodationRadiobuttons.forEach( (radio) => { - radio.parentElement.classList.remove('u:bg-gray-400') + accommodationRadiobuttons.forEach((radio) => { + const optionContent = radio.parentElement.querySelector('.signup-finalize__accommodation-content'); + optionContent?.classList.remove('signup-finalize__accommodation-content--active'); }) - event.target.parentElement.classList.add('u:bg-gray-400'); + const selectedOptionContent = event.target.parentElement.querySelector('.signup-finalize__accommodation-content'); + selectedOptionContent?.classList.add('signup-finalize__accommodation-content--active'); } } @@ -39,15 +41,21 @@ const slider = document.querySelectorAll('input[type="range"]'); function updateValueOutput(value) { const valueOutput = document.getElementsByClassName('rangeSlider__value-output'); + const markerIndex = Math.max(0, Math.min(markers.length - 1, Number(value))); if (valueOutput.length) { - valueOutput[0].innerHTML = markers[value]; + valueOutput[0].innerHTML = markers[markerIndex]; } } const initializeHostingInterestSlider = () => { + if (slider.length && Number.parseInt(slider[0].value ?? '0', 10) <= 0) { + slider[0].value = '5'; + } + return rangeSlider.create(slider, { onInit: function () { - updateValueOutput(0); + const currentValue = Number.parseInt(slider[0]?.value ?? '0', 10); + updateValueOutput(Number.isNaN(currentValue) ? 5 : currentValue); }, onSlide: function (value, percent, position) { updateValueOutput(value); diff --git a/assets/js/gallery.js b/assets/js/gallery.js index e50c87e42..8b8d346f4 100644 --- a/assets/js/gallery.js +++ b/assets/js/gallery.js @@ -1,19 +1,2 @@ -let Masonry = require('masonry-layout'); -let imagesLoaded = require('imagesloaded'); - -document.addEventListener('DOMContentLoaded', function () { - // init Masonry - let grid = document.getElementById('masonry-grid'); - - if (grid !== null) - { - var msnry = new Masonry( grid, { - percentPosition: true - }); - - imagesLoaded( grid ).on( 'progress', function() { - // layout Masonry after each image loads - msnry.layout(); - }); - } -}); +// Gallery layout is handled entirely via CSS Grid (see #masonry-grid in _layouts.general.css). +// This entry file is kept so existing pages that include `gallery.js` continue to work without changes. diff --git a/assets/js/lightbox.js b/assets/js/lightbox.js index aba8d9dbc..c37829431 100644 --- a/assets/js/lightbox.js +++ b/assets/js/lightbox.js @@ -1,6 +1,8 @@ +import '../scss/_lightbox.scss'; import Lightbox from 'bs5-lightbox'; -document.querySelectorAll('[data-toggle="lightbox"]') - .forEach( - el => el.addEventListener('click', Lightbox.initialize) - ); +// bs5-lightbox registers `[data-toggle="lightbox"]` when this module loads. +// Only bind `[data-bs-toggle="lightbox"]` here — binding both would run two handlers on the same link. +document.querySelectorAll('[data-bs-toggle="lightbox"]').forEach((el) => { + el.addEventListener('click', Lightbox.initialize); +}); diff --git a/assets/js/profile/edit.js b/assets/js/profile/edit.js index 7a922fdbf..9afec3900 100644 --- a/assets/js/profile/edit.js +++ b/assets/js/profile/edit.js @@ -7,6 +7,8 @@ editLanguages.forEach(editLanguage => { editLanguages.forEach(editLanguage => { editLanguage.classList.add('btn-outline-primary') editLanguage.classList.remove('btn-primary') + editLanguage.classList.remove('p-edit-header__lang-tab--active') + editLanguage.setAttribute('aria-selected', 'false') }) const languages = document.querySelectorAll('[id^=profile-language-]') @@ -14,13 +16,15 @@ editLanguages.forEach(editLanguage => { language.classList.add('u:hidden!') }) - const language = e.target.dataset.editLanguage + const language = e.currentTarget.dataset.editLanguage const activeLanguage = document.getElementById("profile-language-" + language) - const editLanguageButton = document.querySelector("[data-edit-language=" + language + "]") + const editLanguageButton = e.currentTarget activeLanguage.classList.remove('u:hidden!') editLanguageButton.classList.add("btn-primary") editLanguageButton.classList.remove("btn-outline-primary") + editLanguageButton.classList.add("p-edit-header__lang-tab--active") + editLanguageButton.setAttribute('aria-selected', 'true') }) }) diff --git a/assets/js/profile/edit_languages.js b/assets/js/profile/edit_languages.js index 02d5a22b0..6e6222d59 100644 --- a/assets/js/profile/edit_languages.js +++ b/assets/js/profile/edit_languages.js @@ -1,4 +1,4 @@ -import {initializeTomSelects, destroyTomSelects} from "../tom-select"; +import {initializeTomSelects} from "../tom-select"; document .querySelectorAll('.js-add-language') @@ -20,7 +20,6 @@ function addFormToCollection(e) { ); collectionHolder.insertAdjacentHTML('beforeend', html) - collectionHolder.insertAdjacentHTML('beforeend', '
') collectionHolder.dataset.index++ addDeleteLanguageEventListener() @@ -29,7 +28,6 @@ function addFormToCollection(e) { function deleteFormFromCollection(e) { const current = document.getElementById(e.currentTarget.dataset.related); - console.log(current) current.remove() const collectionHolder = document.querySelector('.' + e.currentTarget.dataset.collectionHolderClass); diff --git a/assets/js/profile/preference.js b/assets/js/profile/preference.js index 551536e7f..f7ccc3226 100644 --- a/assets/js/profile/preference.js +++ b/assets/js/profile/preference.js @@ -18,8 +18,6 @@ preferences.forEach( await fetch("/members/update/preference", { method: 'POST', body: form }) .then(() => { /* Nothing to do here */ }) - - console.log(form) }) } ) diff --git a/assets/js/profile/profile.js b/assets/js/profile/profile.js index d96f267ab..13b03ac02 100644 --- a/assets/js/profile/profile.js +++ b/assets/js/profile/profile.js @@ -1,3 +1,6 @@ +import { Toast } from 'bootstrap'; +document.querySelectorAll('.p-toast[data-bs-autohide="true"]').forEach(el => new Toast(el).show()); + const L = require("leaflet"); const locationMaps = document.querySelectorAll('[id^=location-map]') @@ -8,7 +11,12 @@ locationMaps.forEach( locationMap => { const map = L.map(locationMap, { zoomControl: false, - boxZoom: false + boxZoom: false, + dragging: false, + scrollWheelZoom: false, + touchZoom: false, + doubleClickZoom: false, + keyboard: false, }).setView([latitude, longitude], 10) map.attributionControl.setPrefix(false) diff --git a/assets/js/profile/show.js b/assets/js/profile/show.js index f87f503fc..292ab3d1f 100644 --- a/assets/js/profile/show.js +++ b/assets/js/profile/show.js @@ -1,11 +1,12 @@ -const languageSwitch = document.getElementById("language-switch"); - -languageSwitch.addEventListener("change", e => { - const languages = document.querySelectorAll('[id^=profile-language-]'); - languages.forEach(language => { - language.classList.add('u:hidden!'); - }) - const current = document.getElementById("profile-language-" + e.target.value); - current.classList.remove('u:hidden!') -}) - +import { Tooltip } from 'bootstrap'; + +document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(el => new Tooltip(el)); + +document.querySelectorAll('.p-lang-pill').forEach(btn => { + btn.addEventListener('click', () => { + document.querySelectorAll('[id^=profile-language-]').forEach(el => el.classList.add('u:hidden!')); + document.getElementById('profile-language-' + btn.dataset.lang).classList.remove('u:hidden!'); + document.querySelectorAll('.p-lang-pill').forEach(b => b.classList.remove('p-lang-pill--active')); + btn.classList.add('p-lang-pill--active'); + }); +}); diff --git a/assets/scss/_gallery.scss b/assets/scss/_gallery.scss index cf5d05bb9..6f964910d 100644 --- a/assets/scss/_gallery.scss +++ b/assets/scss/_gallery.scss @@ -57,4 +57,457 @@ width: 100px; } -} \ No newline at end of file + // gallery/edit.image.html.twig + .p-gallery-edit { + max-width: 56rem; + margin-inline: auto; + padding: 0 0.5rem; + + @media (min-width: 576px) { + padding: 0; + } + + &__hero { + margin-bottom: 1.75rem; + padding: 1.25rem 1.35rem 1.35rem; + background: #fff; + border: 1px solid #e8ecf1; + border-radius: 0.875rem; + box-shadow: + 0 1px 2px rgba(15, 23, 42, 0.04), + 0 4px 24px rgba(15, 23, 42, 0.06); + } + + &__toolbar { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; + } + + &__back-btn { + font-weight: 600; + } + + &__intro { + margin: 0; + } + + &__title { + margin: 0; + font-size: clamp(1.25rem, 4vw, 1.65rem); + font-weight: 700; + letter-spacing: -0.03em; + line-height: 1.25; + color: #0f172a; + word-break: break-word; + } + + &__preview { + max-width: 100%; + overflow: hidden; + text-align: center; + border-radius: 0.75rem; + border: 1px solid #e8ecf1; + background: #f8fafc; + padding: 0.75rem; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8); + + .p-gallery-edit__preview-link { + display: inline-block; + max-width: 100%; + } + + img { + display: block; + margin-left: auto; + margin-right: auto; + max-width: 100%; + width: auto; + height: auto; + max-height: min(75vh, 640px); + object-fit: contain; + } + } + + &__full-link-wrap { + margin: 0.75rem 0 0; + font-size: 0.8125rem; + text-align: center; + + @media (min-width: 992px) { + text-align: left; + } + } + + &__full-link { + color: #64748b; + font-weight: 500; + text-decoration: none; + transition: color 0.15s ease; + + &:hover { + color: #f37000; + text-decoration: underline; + text-underline-offset: 0.15em; + } + } + + &__card { + border-radius: 0.875rem; + border: 1px solid #e8ecf1 !important; + box-shadow: + 0 1px 2px rgba(15, 23, 42, 0.04), + 0 6px 28px rgba(15, 23, 42, 0.07); + } + + &__form { + label { + display: block; + font-weight: 600; + margin-bottom: 0.375rem; + color: var(--bs-body-color); + } + } + + &__title-input { + font-size: 1.0625rem; + } + + &__textarea { + line-height: 1.45; + resize: vertical; + min-height: 9rem; + } + + &__actions { + display: flex; + justify-content: flex-end; + margin-top: 1.5rem; + padding-top: 1.25rem; + border-top: 1px solid #f1f5f9; + } + + &__submit { + width: 100%; + + @media (min-width: 576px) { + width: auto; + min-width: 12rem; + } + } + } + + .p-gallery-manage__pagehead-heading { + display: flex; + align-items: center; + gap: 0.75rem; + } + + /* + * Legacy /gallery/manage — header is PHP-only and loads bewelcome.css before tailwind.css. + * Keep back + title + upload styles here so the back control stays visible even with an old tailwind build. + */ + .p-gallery-manage__pagehead { + max-width: 1100px; + margin: 0.5rem auto 1rem; + padding: 0 1rem; + color: #1f2937; + } + + .p-gallery-manage__pagehead-row { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: space-between; + gap: 1rem; + } + + .p-gallery-manage__pagehead-copy { + flex: 1 1 0; + min-width: 0; + } + + .p-gallery-manage__pagehead-eyebrow { + margin: 0 0 0.15rem; + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #f37000; + } + + .p-gallery-manage__pagehead-title { + margin: 0; + font-size: 1.5rem; + font-weight: 700; + color: #0f172a; + line-height: 1.2; + word-break: break-word; + } + + .p-gallery-manage__pagehead-cta { + flex: 0 0 auto; + margin-left: auto; + align-self: center; + } + + .p-gallery-manage__subtitle { + margin: 0.35rem 0 0; + font-size: 0.85rem; + color: #64748b; + } + + .p-gallery-manage__upload-cta { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.65rem 1.25rem; + border-radius: 999px; + background: #f37000; + color: #fff !important; + font-size: 0.9rem; + font-weight: 600; + text-decoration: none !important; + box-shadow: 0 2px 6px rgba(243, 112, 0, 0.25); + transition: + background-color 0.15s ease, + box-shadow 0.15s ease, + transform 0.15s ease; + + &:hover, + &:focus-visible { + background: #d96400; + box-shadow: 0 4px 12px rgba(243, 112, 0, 0.35); + transform: translateY(-1px); + outline: none; + color: #fff !important; + } + + i { + font-size: 1rem; + } + } + + @media (max-width: 720px) { + .p-gallery-manage__pagehead-row { + flex-direction: column; + align-items: stretch; + } + + .p-gallery-manage__pagehead-cta { + margin-left: 0; + width: 100%; + } + + .p-gallery-manage__pagehead-cta .p-gallery-manage__upload-cta { + width: 100%; + justify-content: center; + } + } + + /* ── Gallery public show pages (show/user, show/sets) ── */ + .p-gallery-show { + max-width: 1100px; + margin: 0 auto; + padding: 0 1rem 2rem; + } + + .p-gallery-manage__pagehead-actions { + display: flex; + align-items: center; + align-self: center; + gap: 0.5rem; + } + + /* Album grid */ + .p-gallery-albums { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 1rem; + margin-top: 1.25rem; + } + + .p-gallery-album-card { + display: block; + text-decoration: none !important; + color: inherit; + border-radius: 0.85rem; + overflow: hidden; + border: 1px solid #eef2f7; + background: #fff; + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.04); + transition: box-shadow 0.15s ease; + + &:hover { + box-shadow: 0 4px 16px rgba(15, 23, 42, 0.1); + color: inherit; + } + } + + .p-gallery-album-card__thumb { + width: 100%; + aspect-ratio: 1; + object-fit: cover; + display: block; + } + + .p-gallery-album-card__thumb-empty { + width: 100%; + aspect-ratio: 1; + background: #f1f5f9; + display: flex; + align-items: center; + justify-content: center; + color: #cbd5e1; + font-size: 2rem; + } + + .p-gallery-album-card__info { + padding: 0.65rem 0.85rem; + } + + .p-gallery-album-card__title { + font-size: 0.875rem; + font-weight: 600; + color: #1e293b; + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .p-gallery-album-card__count { + font-size: 0.75rem; + color: #94a3b8; + margin: 0.2rem 0 0; + } + + /* Photo grid inside an album */ + .p-gallery-photo-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 0.65rem; + margin-top: 1.25rem; + } + + .p-gallery-photo-item { + position: relative; + aspect-ratio: 1; + border-radius: 0.65rem; + overflow: hidden; + background: #f1f5f9; + + a.p-gallery-photo-item__link { + display: block; + width: 100%; + height: 100%; + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + .p-gallery-photo-item__actions { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 0.4rem 0.5rem; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.55)); + display: flex; + gap: 0.35rem; + opacity: 0; + transition: opacity 0.15s ease; + + .p-gallery-photo-item:hover & { + opacity: 1; + } + } + + /* Persistent tap target — replaces hover-only actions on manage page */ + .p-gallery-photo-item__menu-btn { + position: absolute; + top: 0.4rem; + right: 0.4rem; + width: 2rem; + height: 2rem; + border: none; + border-radius: 0.5rem; + background: rgba(15, 23, 42, 0.5); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + color: #fff; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; + z-index: 2; + padding: 0; + transition: background 0.15s ease; + line-height: 1; + + &:hover { + background: rgba(15, 23, 42, 0.75); + } + } + + .p-gallery-photo-item__btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.75rem; + height: 1.75rem; + border-radius: 0.4rem; + font-size: 0.75rem; + border: 0; + cursor: pointer; + text-decoration: none !important; + padding: 0; + line-height: 1; + + &--edit { + background: #f37000; + color: #fff !important; + } + + &--remove { + background: rgba(255, 255, 255, 0.2); + color: #fff !important; + border: 1px solid rgba(255, 255, 255, 0.35); + } + + &--danger { + background: #ef4444; + color: #fff !important; + } + } + + // legacy class kept for any other use; edit page uses .p-gallery-edit__preview + .gallery-edit-preview { + max-width: 100%; + overflow: hidden; + text-align: center; + + a { + display: inline-block; + max-width: 100%; + } + + img { + display: block; + margin-left: auto; + margin-right: auto; + max-width: 100%; + width: auto; + height: auto; + max-height: min(75vh, 640px); + object-fit: contain; + } + } + +} diff --git a/assets/scss/_home-landing.scss b/assets/scss/_home-landing.scss index 20feea2ac..a23c96513 100644 --- a/assets/scss/_home-landing.scss +++ b/assets/scss/_home-landing.scss @@ -1052,42 +1052,6 @@ } } -.loginbar--slim { - .loginbar-slim__cta { - line-height: 1.35; - - a { - &:hover, - &:focus { - color: #fff; - text-decoration: underline; - } - } - } - - .loginbar-slim__sep { - font-weight: 300; - user-select: none; - } - - .loginbar-slim__lang-toggle { - &:hover, - &:focus, - &:active { - color: #fff !important; - background: transparent !important; - border: none !important; - box-shadow: none !important; - text-decoration: none; - } - - &:focus-visible { - outline: 2px solid rgba(255, 255, 255, 0.45); - outline-offset: 2px; - } - } -} - /* Cookie consent: bottom full-width banner */ .cc-window.cc-banner { left: 0; diff --git a/assets/scss/_lightbox.scss b/assets/scss/_lightbox.scss new file mode 100644 index 000000000..45f000415 --- /dev/null +++ b/assets/scss/_lightbox.scss @@ -0,0 +1,56 @@ +// bs5-lightbox sets inline background-color: #000 on .ratio — use transparent so only the image reads. +.modal.lightbox { + .modal-content { + background-color: transparent; + border: none; + box-shadow: none; + } + + .modal-body { + background-color: transparent; + } + + .carousel-inner { + background-color: transparent; + } + + .carousel-item .ratio { + background-color: transparent !important; + } + + .carousel-item { + background-color: transparent; + } +} + +// bs5-lightbox uses a 16:9 ratio wrapper; for still images that wastes space for portraits. +.modal.lightbox .carousel-item .ratio:has(> img) { + &::before { + display: none !important; + } + + min-height: min(72vh, 900px); + max-height: 90vh; + display: flex; + align-items: center; + justify-content: center; + + > img { + position: static !important; + z-index: 1; + max-height: min(88vh, 100%); + max-width: 100%; + width: auto !important; + height: auto !important; + object-fit: contain; + } +} + +.modal.lightbox.modal-fullscreen .carousel-item .ratio:has(> img) { + min-height: 100vh; + max-height: 100vh; + + > img { + max-height: min(96vh, 100%); + } +} diff --git a/assets/scss/_navbar.scss b/assets/scss/_navbar.scss index 1cd86ff6a..27fbaeb13 100644 --- a/assets/scss/_navbar.scss +++ b/assets/scss/_navbar.scss @@ -42,6 +42,42 @@ } } +.loginbar--slim { + .loginbar-slim__cta { + line-height: 1.35; + + a { + &:hover, + &:focus { + color: #fff; + text-decoration: underline; + } + } + } + + .loginbar-slim__sep { + font-weight: 300; + user-select: none; + } + + .loginbar-slim__lang-toggle { + &:hover, + &:focus, + &:active { + color: #fff !important; + background: transparent !important; + border: none !important; + box-shadow: none !important; + text-decoration: none; + } + + &:focus-visible { + outline: 2px solid rgba(255, 255, 255, 0.45); + outline-offset: 2px; + } + } +} + @include media-breakpoint-up(md) { #main_menu .bw-header-logo__text { height: 38px; diff --git a/assets/scss/_signup.scss b/assets/scss/_signup.scss new file mode 100644 index 000000000..df9325134 --- /dev/null +++ b/assets/scss/_signup.scss @@ -0,0 +1,641 @@ +.main--bare { + margin-top: 0; + margin-bottom: 0; + flex: 1 0 auto; + display: flex; + flex-direction: column; + min-height: calc(100vh - var(--bw-topbar-offset, 64px)); +} + +.signup-layout { + display: flex; + flex: 1 0 auto; + + &__image { + display: none; + flex: 0 0 50%; + position: relative; + overflow: hidden; + + @media (min-width: 992px) { + display: flex; + } + } + + &__img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; + } + + &__overlay { + position: absolute; + inset: 0; + background: linear-gradient( + to bottom, + rgba(0, 0, 0, 0.52) 0%, + rgba(0, 0, 0, 0.38) 50%, + rgba(0, 0, 0, 0.62) 100% + ); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 3rem 2.5rem; + text-align: center; + } + + &__brand { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 1.6rem; + } + + &__logo-full { + width: min(100%, 19rem); + height: auto; + object-fit: contain; + } + + &__logo-icon { + width: 56px; + height: 56px; + flex: 0 0 56px; + object-fit: contain; + } + + &__logo-text { + height: 38px; + object-fit: contain; + object-position: left center; + } + + &__tagline { + color: rgba(255, 255, 255, 0.9); + font-size: 1.125rem; + max-width: 400px; + line-height: 1.65; + margin-bottom: 0.75rem; + } + + &__subheading { + color: rgba(255, 255, 255, 0.92); + font-size: 0.9375rem; + max-width: 380px; + line-height: 1.6; + text-align: center; + margin-bottom: 0; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.55); + } + + &__form-panel { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + padding: 1.5rem; + background: #fff; + overflow-y: auto; + } + + &__form-inner { + width: 100%; + max-width: 460px; + + .o-input { + display: block; + width: 100%; + padding: 0.7rem 1rem; + font-size: 1rem; + line-height: 1.4; + color: #0f172a; + background: #f1f5f9; + border: 1.5px solid transparent; + border-radius: 0.875rem; + transition: + background-color 0.18s ease, + border-color 0.18s ease, + box-shadow 0.18s ease; + + &::placeholder { + color: #94a3b8; + } + + &:focus { + outline: none; + background: #fff; + border-color: #f37000; + box-shadow: 0 0 0 4px rgba(243, 112, 0, 0.13); + } + } + + .o-form-group, + .o-form-group-sm { + margin-bottom: 0.875rem; + } + + .form-text { + font-size: 0.78rem; + color: #9ca3af; + margin-top: 0.2rem; + line-height: 1.4; + } + + // Keep validation feedback subtle on signup: text only, no badge/box. + .invalid-feedback { + display: block; + margin-top: 0.3rem; + padding: 0; + background: transparent !important; + border: 0; + border-radius: 0; + color: #dc3545; + } + + .form-error-icon { + display: none; + } + + .form-error-message { + color: #dc3545; + font-size: 0.82rem; + line-height: 1.35; + } + } + + &__heading { + font-size: 1.75rem; + font-weight: 700; + margin-bottom: 1rem; + color: #111827; + } + + &__submit { + min-width: 180px; + min-height: 2.75rem; + padding: 0.75rem 1.5rem; + border: 0; + border-radius: 999px; + color: #fff; + font-size: 0.98rem; + font-weight: 700; + letter-spacing: 0.02em; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + box-shadow: none; + transition: filter 0.15s ease; + + &:hover, + &:focus { + color: #fff; + filter: brightness(1.07); + } + } + + &__terms { + margin-top: 1rem; + padding: 1rem 1.25rem; + border: 1px solid #e5e7eb; + border-radius: 0.5rem; + background: #f9fafb; + font-size: 0.875rem; + line-height: 1.55; + color: #374151; + + .o-form-group, + .o-form-group-sm { + margin-bottom: 0; + } + + .o-checkbox { + margin-bottom: 0; + } + + .o-checkbox__label { + font-size: 0.875rem; + font-weight: 400; + color: #374151; + line-height: 1.55; + } + + } + + &__actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-top: 1rem; + } + + &__login-link { + flex: 1 1 auto; + display: flex; + align-items: center; + margin: 0; + line-height: 1.2; + color: #6b7280; + font-size: 0.875rem; + text-align: left; + + a { + font-weight: 600; + } + } +} + +.signup-finalize { + display: flex; + justify-content: center; + padding: 1rem; + + &__inner { + width: 100%; + min-width: 320px; + max-width: 680px; + padding: 1.1rem 1.1rem 1rem; + background-color: transparent !important; + background: transparent !important; + border: 0; + border-radius: 0; + box-shadow: none; + } + + &__heading { + font-size: 1.75rem; + font-weight: 700; + margin-bottom: 0.75rem; + color: #111827; + } + + &__subheading { + color: #6b7280; + margin-bottom: 1rem; + font-size: 0.9375rem; + line-height: 1.5; + } + + &__section { + margin-bottom: 1rem; + padding: 1.2rem 1.35rem; + border: 1px solid #e5e7eb; + border-radius: 0.65rem; + background: rgba(255, 255, 255, 0.72); + + > :not(.signup-finalize__section-title) { + padding-left: 0.35rem; + padding-right: 0.35rem; + } + } + + &__section-title { + display: flex; + align-items: center; + gap: 0.55rem; + margin: 0 0 0.8rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.24); + font-size: 1.02rem; + font-weight: 700; + letter-spacing: 0.01em; + color: #1f2937; + + &::before { + content: ''; + width: 0.36rem; + height: 0.36rem; + border-radius: 999px; + background: #f37000; + flex: 0 0 auto; + box-shadow: 0 0 0 4px rgba(243, 112, 0, 0.12); + } + } + + &__gender { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.35rem 0.75rem; + + .o-radio-button { + position: relative; + margin: 0; + text-align: center; + } + + .o-radio-button__input { + position: absolute; + opacity: 0; + pointer-events: none; + } + + .o-radio-button__input + label { + display: inline-flex; + align-items: center; + justify-content: center; + width: 100%; + min-height: 2.4rem; + padding: 0.45rem 0.8rem; + border-radius: 999px; + border: 1px solid #dbe2ea; + background: #f8fafc; + color: #475569; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: + background-color 0.16s ease, + border-color 0.16s ease, + color 0.16s ease, + box-shadow 0.16s ease; + } + + .o-radio-button__input + label:hover { + background: #f1f5f9; + border-color: #cbd5e1; + } + + .o-radio-button__input:checked + label { + color: #fff; + border-color: #f37000; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.3); + } + + .o-radio-button__input:focus-visible + label { + outline: 2px solid rgba(243, 112, 0, 0.35); + outline-offset: 2px; + } + } + + .o-form-group, + .o-form-group-sm { + margin-bottom: 1.15rem; + + &:last-child { + margin-bottom: 0; + } + } + + .o-input { + display: block; + width: 100%; + padding: 0.7rem 1rem; + font-size: 1rem; + line-height: 1.4; + color: #0f172a; + background: #f1f5f9; + border: 1.5px solid transparent; + border-radius: 0.875rem; + transition: + background-color 0.18s ease, + border-color 0.18s ease, + box-shadow 0.18s ease; + + &::placeholder { + color: #94a3b8; + } + + &:focus { + outline: none; + background: #fff; + border-color: #f37000; + box-shadow: 0 0 0 4px rgba(243, 112, 0, 0.13); + } + } + + .auto-search-wrapper.loupe { + position: relative; + + .o-input.js-location-picker { + padding-left: 2.2rem; + } + } + + .form-text { + font-size: 0.78rem; + color: #9ca3af; + margin-top: 0.2rem; + line-height: 1.4; + } + + .o-form-group > label, + .o-form-group > .o-input-label { + display: block; + margin-bottom: 0.35rem; + } + + .invalid-feedback { + display: block; + margin-top: 0.3rem; + padding: 0; + background: transparent !important; + border: 0; + border-radius: 0; + color: #dc3545; + } + + .form-error-icon { + display: none; + } + + .form-error-message { + color: #dc3545; + font-size: 0.82rem; + line-height: 1.35; + } + + &__actions { + display: flex; + justify-content: flex-end; + margin-top: 0.25rem; + } + + &__accommodation-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.75rem; + margin: 0.65rem 0 0.35rem; + } + + &__accommodation-option { + margin: 0; + padding: 0; + border: 0; + background: transparent; + cursor: pointer; + display: block; + + input[type="radio"] { + position: absolute; + opacity: 0; + pointer-events: none; + } + } + + &__accommodation-content { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 0.6rem; + padding: 0.65rem 1rem; + border-radius: 0.875rem; + border: 1.5px solid #e5e7eb; + background: #f8fafc; + transition: border-color 0.16s ease, background 0.16s ease, box-shadow 0.16s ease; + + small { + font-size: 0.875rem; + font-weight: 600; + color: #64748b; + margin: 0; + transition: color 0.16s ease; + } + + &:hover { + border-color: #cbd5e1; + background: #f1f5f9; + } + + &--no#{&}--active { + border-color: #f87171; + background: rgba(239, 68, 68, 0.05); + box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1); + + small { color: #dc2626; } + } + + &--yes#{&}--active { + border-color: #4ade80; + background: rgba(22, 163, 74, 0.05); + box-shadow: 0 0 0 3px rgba(22, 163, 74, 0.1); + + small { color: #15803d; } + } + } + + &__accommodation-icon { + display: inline-flex; + width: 1.75rem; + height: 1.75rem; + align-items: center; + justify-content: center; + border-radius: 50%; + font-size: 0.85rem; + transition: background 0.16s ease, color 0.16s ease; + + &--no { + background: #f1f5f9; + color: #94a3b8; + } + + &--yes { + background: #f1f5f9; + color: #94a3b8; + } + + .signup-finalize__accommodation-content--no.signup-finalize__accommodation-content--active & { + background: rgba(239, 68, 68, 0.1); + color: #ef4444; + } + + .signup-finalize__accommodation-content--yes.signup-finalize__accommodation-content--active & { + background: rgba(22, 163, 74, 0.1); + color: #16a34a; + } + } + + .o-form-group > .o-input-label { + display: block; + margin: 0 0.35rem 0.35rem; + } +} + +// Setup completion banner +.setup-banner { + display: flex; + align-items: center; + gap: 1rem; + padding: 1rem 1.25rem; + margin: 1rem 0 0.25rem; + background: linear-gradient(135deg, rgba(59, 130, 246, 0.14) 0%, rgba(37, 99, 235, 0.08) 100%); + border: 1px solid rgba(59, 130, 246, 0.22); + border-left: 3.5px solid #2563eb; + border-radius: 0.875rem; + + &__body { + flex: 1 1 auto; + display: flex; + align-items: center; + gap: 0.75rem; + min-width: 0; + } + + &__icon { + flex: 0 0 auto; + width: 2.25rem; + height: 2.25rem; + display: flex; + align-items: center; + justify-content: center; + background: rgba(59, 130, 246, 0.1); + border-radius: 50%; + color: #2563eb; + } + + &__message { + font-size: 0.9375rem; + color: #1f2937; + font-weight: 500; + line-height: 1.5; + margin: 0; + min-width: 0; + } + + &__action { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.5625rem 1.25rem; + background: linear-gradient(135deg, #60a5fa 0%, #2563eb 60%, #1d4ed8 100%); + color: #fff !important; + border-radius: 999px; + font-size: 0.875rem; + font-weight: 700; + letter-spacing: 0.02em; + text-decoration: none; + white-space: nowrap; + transition: filter 0.15s ease, box-shadow 0.15s ease; + box-shadow: 0 2px 8px rgba(37, 99, 235, 0.28); + + &:hover, + &:focus { + filter: brightness(1.07); + box-shadow: 0 4px 14px rgba(37, 99, 235, 0.38); + color: #fff !important; + text-decoration: none; + } + + svg { + flex: 0 0 auto; + } + } + + @media (max-width: 576px) { + flex-wrap: wrap; + + &__body { + flex: 0 0 100%; + } + + &__action { + flex: 0 0 100%; + justify-content: center; + margin-top: 0.25rem; + } + } +} diff --git a/assets/scss/bewelcome.scss b/assets/scss/bewelcome.scss index b0bb9b6e6..505bf2019 100644 --- a/assets/scss/bewelcome.scss +++ b/assets/scss/bewelcome.scss @@ -616,3 +616,5 @@ object-fit: cover; } } + +@import "signup"; diff --git a/assets/tailwindcss/components/_components.modals.css b/assets/tailwindcss/components/_components.modals.css index 3395fd5a7..ff85e077b 100644 --- a/assets/tailwindcss/components/_components.modals.css +++ b/assets/tailwindcss/components/_components.modals.css @@ -1,3 +1,317 @@ +/* ── Photo action bottom sheet ── */ + +.p-photo-sheet { + position: fixed; + inset: 0; + z-index: 9100; + display: flex; + align-items: flex-end; + pointer-events: none; + visibility: hidden; +} + +.p-photo-sheet--open { + pointer-events: all; + visibility: visible; +} + +.p-photo-sheet__backdrop { + position: absolute; + inset: 0; + background: rgba(15, 23, 42, 0.55); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + opacity: 0; + transition: opacity 0.28s ease; +} + +.p-photo-sheet--open .p-photo-sheet__backdrop { + opacity: 1; +} + +.p-photo-sheet__panel { + position: relative; + z-index: 1; + width: 100%; + max-width: 480px; + margin: 0 auto; + background: #fff; + border-radius: 1.5rem 1.5rem 0 0; + padding: 0; + overflow: hidden; + transform: translateY(100%); + transition: transform 0.32s cubic-bezier(0.32, 0.72, 0, 1); + box-shadow: 0 -8px 48px rgba(15, 23, 42, 0.18); +} + +.p-photo-sheet--open .p-photo-sheet__panel { + transform: translateY(0); +} + +/* Hero image — full width, edge-to-edge */ +.p-photo-sheet__preview { + position: relative; + width: 100%; + height: 220px; + overflow: hidden; + background: #0f172a; +} + +.p-photo-sheet__img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + border-radius: 0; +} + +/* Gradient overlay so handle + close are readable on any photo */ +.p-photo-sheet__preview::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient( + to bottom, + rgba(15, 23, 42, 0.35) 0%, + transparent 45%, + rgba(15, 23, 42, 0.18) 100% + ); + pointer-events: none; +} + +/* Handle — overlaid on the hero image */ +.p-photo-sheet__handle { + position: absolute; + top: 0.65rem; + left: 50%; + transform: translateX(-50%); + width: 3rem; + height: 4px; + background: rgba(255, 255, 255, 0.55); + border-radius: 999px; + z-index: 2; + margin: 0; +} + +/* Close button — overlaid on the hero image */ +.p-photo-sheet__close { + position: absolute; + top: 0.75rem; + right: 0.75rem; + width: 2.1rem; + height: 2.1rem; + border: none; + background: rgba(15, 23, 42, 0.45); + backdrop-filter: blur(6px); + -webkit-backdrop-filter: blur(6px); + border-radius: 50%; + color: #fff; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.8rem; + transition: background 0.15s ease; + padding: 0; + z-index: 2; +} + +.p-photo-sheet__close:hover { + background: rgba(15, 23, 42, 0.7); +} + +/* Content below the hero */ +.p-photo-sheet__body { + padding: 1.1rem 1.5rem 2rem; +} + +.p-photo-sheet__title { + font-size: 1rem; + font-weight: 700; + color: #1e293b; + margin: 0 0 1.1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.p-photo-sheet__actions { + display: flex; + flex-direction: row; + align-items: stretch; + gap: 0.5rem; +} + +.p-photo-sheet__btn { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + width: 100%; + padding: 0.8rem 1rem; + border-radius: 0.85rem; + border: none; + font-family: inherit; + font-size: 0.9375rem; + font-weight: 600; + cursor: pointer; + text-decoration: none !important; + transition: filter 0.15s ease, transform 0.1s ease; + line-height: 1; +} + +.p-photo-sheet__btn:active { + transform: scale(0.97); +} + +.p-photo-sheet__btn--primary { + flex: 1; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + color: #fff !important; +} + + +.p-photo-sheet__btn--primary:hover { + filter: brightness(1.06); +} + +.p-photo-sheet__btn--danger { + flex: 1; + width: auto; + background: transparent; + color: #ef4444 !important; + border: 1.5px solid #fca5a5; +} + +.p-photo-sheet__btn--danger:hover { + background: #fef2f2; + border-color: #f87171; +} + +.p-photo-sheet__btn--danger-confirm { + background: #dc2626; + color: #fff !important; + border-color: #dc2626; +} + +/* Form fields inside the sheet (edit title / description) */ +.p-photo-sheet__form { + display: flex; + flex-direction: column; + gap: 0.35rem; + margin-bottom: 1.1rem; +} + +.p-photo-sheet__label { + font-size: 0.7rem; + font-weight: 700; + color: #94a3b8; + text-transform: uppercase; + letter-spacing: 0.06em; + margin-top: 0.5rem; +} + +.p-photo-sheet__input, +.p-photo-sheet__textarea { + width: 100%; + padding: 0.6rem 0.875rem; + border: 1.5px solid #e2e8f0; + border-radius: 0.65rem; + font-family: inherit; + font-size: 0.9375rem; + color: #1e293b; + background: #f8fafc; + outline: none; + box-sizing: border-box; + transition: border-color 0.15s ease, background 0.15s ease; +} + +.p-photo-sheet__input:focus, +.p-photo-sheet__textarea:focus { + border-color: #f37000; + background: #fff; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.1); +} + +.p-photo-sheet__textarea { + resize: vertical; + min-height: 4.5rem; + line-height: 1.5; +} + +/* ── Confirm modal (reusable lightweight confirm dialog) ── */ + +.c-confirm-modal { + display: none; + position: fixed; + inset: 0; + z-index: 9000; + align-items: center; + justify-content: center; + padding: 1rem; +} + +.c-confirm-modal--open { + display: flex; +} + +.c-confirm-modal__backdrop { + position: absolute; + inset: 0; + background: rgba(15, 23, 42, 0.5); + backdrop-filter: blur(3px); + -webkit-backdrop-filter: blur(3px); +} + +.c-confirm-modal__dialog { + position: relative; + z-index: 1; + background: #fff; + border-radius: 1rem; + padding: 1.5rem 1.75rem; + max-width: 360px; + width: 100%; + box-shadow: 0 8px 32px rgba(15, 23, 42, 0.2); +} + +.c-confirm-modal__text { + font-size: 0.9375rem; + color: #1e293b; + margin: 0 0 1.25rem; + line-height: 1.5; +} + +.c-confirm-modal__actions { + display: flex; + gap: 0.625rem; + justify-content: flex-end; +} + +.c-confirm-modal__btn { + display: inline-flex; + align-items: center; + gap: 0.375rem; + padding: 0.5rem 1rem; + border-radius: 999px; + border: none; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: filter 0.15s ease; +} + +.c-confirm-modal__btn:hover { filter: brightness(0.93); } + +.c-confirm-modal__btn--cancel { + background: #f1f5f9; + color: #475569; +} + +.c-confirm-modal__btn--danger { + background: #dc2626; + color: #fff; +} + /************************** Basic Modal Styles **************************/ diff --git a/assets/tailwindcss/layouts/_layouts.general.css b/assets/tailwindcss/layouts/_layouts.general.css index 0449a83bc..d2fe71136 100644 --- a/assets/tailwindcss/layouts/_layouts.general.css +++ b/assets/tailwindcss/layouts/_layouts.general.css @@ -77,40 +77,4434 @@ +/* ========================================================= + Landing welcome — full redesign + ========================================================= */ + .l-landing-welcome { display: grid; - grid-template-columns: 120px 1fr; - grid-gap: 32px; + grid-template-columns: 100px 1fr minmax(260px, 340px); + align-items: center; + gap: 1.5rem; + padding: 1.25rem 1.75rem; + background: #ffffff; + border-radius: 1.25rem; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 8px 28px rgba(15, 23, 42, 0.07); width: 100%; } @media (max-width: 900px) { .l-landing-welcome { - display: flex; - flex-direction: column; - align-items: center; + grid-template-columns: 88px 1fr; + margin-top: 0 !important; + grid-template-rows: auto auto; + gap: 0.75rem; + padding: 0.875rem 1rem; + } + + .l-welcome-strip__search { + grid-column: 1 / -1; + } + + .l-welcome-strip__label { + font-size: 0.5rem; + letter-spacing: 0.03em; + } +} + +@media (max-width: 540px) { + .l-landing-welcome { + grid-template-columns: 76px 1fr; + gap: 0.625rem; + padding: 0.75rem 0.875rem; + } + + .l-welcome-strip__meta { + justify-content: flex-start; + } +} + +/* ── Avatar ─────────────────────────────────────────────── */ + +#welcomeavatar .o-avatar__img-wrapper { + width: 100px !important; + height: 100px !important; + border: none !important; + border-radius: 50% !important; + box-shadow: none !important; +} + +#welcomeavatar .o-avatar--l { + width: 100px; + grid-template-rows: 100px 1fr; +} + +@media (max-width: 900px) { + #welcomeavatar .o-avatar__img-wrapper { + width: 88px !important; + height: 88px !important; + } + #welcomeavatar .o-avatar--l { + width: 88px; + grid-template-rows: 88px 1fr; } } -.l-landing-welcome a { - color: var(--u-color-bewelcome); +@media (max-width: 540px) { + #welcomeavatar .o-avatar__img-wrapper { + width: 76px !important; + height: 76px !important; + } + #welcomeavatar .o-avatar--l { + width: 76px; + grid-template-rows: 76px 1fr; + } +} + +#welcomeavatar .o-avatar__host-status { + display: none; +} + +/* ── Info strip ─────────────────────────────────────────── */ + +.l-welcome-strip__info { + min-width: 0; +} + +.l-welcome-strip__label { + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: #94a3b8; + margin: 0 0 0.2rem; +} + +.l-welcome-strip__name-row { + display: flex; + align-items: center; + gap: 0.5rem; + flex-wrap: wrap; + margin-bottom: 0.5rem; +} + +.l-welcome-strip__name { + font-size: 1.35rem; + font-weight: 700; + color: #0f172a; + line-height: 1.2; + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.l-welcome-strip__name a { + color: inherit; + text-decoration: none; +} + +.l-welcome-strip__name a:hover { + color: #f37000; +} + +.l-welcome-strip__meta { + display: flex; + align-items: center; + gap: 0.5rem; + flex-wrap: wrap; +} + +.l-welcome-strip__sep { + color: #cbd5e1; + font-size: 0.875rem; + user-select: none; +} + +.l-welcome-strip__not-setup { + font-size: 0.875rem; + color: #94a3b8; + margin: 0; +} + +/* Location button */ +.l-welcome-strip__city-form { + display: contents; +} + +.l-welcome-strip__city { + display: inline-flex !important; + align-items: center; + gap: 0.35rem; + font-size: 0.9375rem !important; + font-weight: 500 !important; + color: #64748b !important; + background: transparent; + border: none; + padding: 0 !important; + margin: 0 !important; + cursor: pointer; + transition: color 0.15s ease; + line-height: 1.4; +} + +.l-welcome-strip__city svg { + width: 15px; + height: 15px; + color: #f37000; + flex-shrink: 0; +} + +.l-welcome-strip__city:hover { + color: #f37000 !important; + text-decoration: none !important; +} + +/* ── Hosting segmented toggle ───────────────────────────── */ + +.l-hosting-toggle { + display: inline-flex; + align-items: center; + background: #f8fafc; + border: 1px solid #e2e8f0; + border-radius: 999px; + padding: 4px; + gap: 2px; + box-shadow: inset 0 1px 3px rgba(15, 23, 42, 0.06); +} + +.l-hosting-toggle__opt { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.48rem 1rem; + border-radius: 999px; + font-size: 0.875rem; + font-weight: 600; + color: #94a3b8; + text-decoration: none !important; + transition: color 0.18s ease, background 0.18s ease, box-shadow 0.18s ease; + cursor: pointer; + white-space: nowrap; +} + +.l-hosting-toggle__opt:hover { + color: #475569; + text-decoration: none !important; +} + +.l-hosting-toggle__opt--yes.l-hosting-toggle__opt--active { + background: linear-gradient(135deg, #00d068 0%, #00b855 100%); + color: #fff; + box-shadow: 0 1px 6px rgba(0, 184, 85, 0.35); } +.l-hosting-toggle__opt--no.l-hosting-toggle__opt--active { + background: linear-gradient(135deg, #64748b 0%, #475569 100%); + color: #fff; + box-shadow: 0 1px 6px rgba(71, 85, 105, 0.3); +} + +/* ── Search bar ─────────────────────────────────────────── */ + +.l-welcome-strip__search { + width: 100%; +} + +.l-welcome-strip__search-bar { + display: flex; + align-items: center; + background: #fff; + border: 1.5px solid #e2e8f0; + border-radius: 999px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06); + transition: border-color 0.18s ease, box-shadow 0.18s ease; +} + +.l-welcome-strip__search-bar:focus-within { + border-color: #f37000; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.1), 0 2px 8px rgba(15, 23, 42, 0.06); +} + +.l-welcome-strip__search-bar .auto-search-wrapper { + flex: 1; + min-width: 0; +} + +.l-welcome-strip__search-input { + display: block; + width: 100%; + padding: 0.7rem 0.75rem 0.7rem 35px !important; + font-size: 0.9375rem; + background: transparent; + border: none !important; + box-shadow: none !important; + outline: none !important; + color: #0f172a; +} + +.l-welcome-strip__search-input::placeholder { + color: #94a3b8; +} + +.l-welcome-strip__search-btn { + display: inline-flex; + align-items: center; + gap: 0.3rem; + flex-shrink: 0; + margin: 0.3rem; + padding: 0.5rem 1.1rem; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + color: #fff; + border: none; + border-radius: 999px; + font-size: 0.875rem; + font-weight: 700; + letter-spacing: 0.02em; + cursor: pointer; + transition: filter 0.15s ease, box-shadow 0.15s ease; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.28); +} + +.l-welcome-strip__search-btn:hover, +.l-welcome-strip__search-btn:focus { + filter: brightness(1.07); + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.36); + color: #fff; +} + + +/* ========================================================= + Profile — full redesign + ========================================================= */ + +/* ── Hero cover ─────────────────────────────────────────── */ + +/* ═══════════════════════════════════════════════════════════ + PROFILE HERO – LinkedIn-style + ══════════════════════════════════════════════════════════ */ + +main:has(.p-hero) { + margin-top: 0 !important; +} + +.p-hero { + background: #fff; + border-radius: 0; + box-shadow: 0 1px 4px rgba(15,23,42,0.08); + overflow: hidden; + margin-bottom: 0; + position: relative; +} + +/* Banner = map or fallback */ +.p-hero__banner { + height: 180px; + position: relative; + z-index: 1; +} + +.p-hero__banner .leaflet-tile-pane { + filter: grayscale(1) brightness(1.1) contrast(0.85); +} + +.p-hero__banner--fallback { + background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%); +} + +/* Body stacks above the Leaflet banner */ +.p-hero__body { + position: relative; + z-index: 2; +} + +/* Row below banner: avatar col + info */ +.p-hero__body { + display: flex; + align-items: flex-start; + gap: 1.75rem; + padding: 0 2rem 1.75rem; +} + +/* ── Avatar col ─────────────────────────────────────────── */ +.p-hero__avatar-col { + flex-shrink: 0; + display: flex; + flex-direction: column; + align-items: center; + gap: 0.6rem; + margin-top: -90px; + position: relative; + z-index: 10; +} + +.p-hero__avatar-wrap { + position: relative; + width: 210px; + height: 210px; + border-radius: 50%; + border: 4px solid #fff; + box-shadow: 0 4px 16px rgba(15,23,42,0.15); + overflow: hidden; + background: #f1f5f9; + flex-shrink: 0; +} +.p-hero__avatar-img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +/* Activity badge below avatar */ +.p-hero__activity-below { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.3rem; + font-size: 0.6875rem; + font-weight: 500; + border-radius: 999px; + padding: 0.22rem 0.65rem; + white-space: nowrap; +} +.p-hero__activity-below i { font-size: 0.4rem; } -.l-welcome-card { +.p-hero__activity-label { + font-weight: 400; + opacity: 0.75; + margin-right: 0.1rem; +} + +/* ── Info ───────────────────────────────────────────────── */ +.p-hero__info { + flex: 1; + min-width: 0; + padding-top: 0.875rem; display: grid; - grid-template-columns: 1fr 1fr; - border-radius: 16px; - box-shadow: 0 10px 30px -3px #d7d7d7; - background-color: var(--u-color-white); + grid-template-columns: 1fr auto; + column-gap: 1rem; + align-content: start; } -@media (max-width: 900px) { - .l-welcome-card { - display: flex; - flex-direction: column; - align-items: center; +/* All content children stay in col 1 */ +.p-hero__top-row, +.p-hero__location, +.p-hero__location--empty, +.p-hero__occupation, +.p-hero__meta { grid-column: 1; } + +/* Actions align with the name row on desktop */ +.p-hero__actions { + grid-column: 2; + grid-row: 1; + align-self: start; +} + +.p-hero__top-row { + margin-bottom: 0.25rem; +} + +.p-hero__identity { min-width: 0; } + +.p-hero__name-row { + display: flex; + align-items: center; + gap: 0.5rem; + flex-wrap: wrap; +} + +.p-hero__trophy { + display: inline-flex; + align-items: center; + gap: 0.3rem; + padding: 0.2rem 0.55rem; + border-radius: 999px; + font-size: 0.8125rem; + font-weight: 700; + background: linear-gradient(135deg, #fef3c7, #fde68a); + color: #92400e; + border: 1px solid #fcd34d; + text-decoration: none !important; + transition: transform 0.15s ease, box-shadow 0.15s ease; +} + +.p-hero__trophy:hover { + transform: scale(1.05); + box-shadow: 0 2px 8px rgba(251, 191, 36, 0.4); + color: #78350f; +} + +.p-hero__name { + font-size: 1.625rem; + font-weight: 700; + color: #0f172a; + margin: 0; + line-height: 1.2; +} + +.p-hero__username { + font-size: 0.9375rem; + color: #94a3b8; + font-weight: 400; +} + +.p-hero__realname { + font-size: 0.9375rem; + color: #64748b; + margin: 0; +} + +.p-hero__location { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.9375rem; + color: #475569; + margin: 0.5rem 0 0.25rem; + flex-wrap: wrap; +} + +.p-hero__location svg { color: #f37000; flex-shrink: 0; } +.p-hero__location a { color: #f37000; text-decoration: none; } +.p-hero__location a:hover { color: #c25a00; } + +.p-hero__location--empty { + color: #94a3b8; + font-style: italic; + font-size: 0.875rem; + margin: 0.5rem 0 0.25rem; +} + +.p-hero__occupation { + display: inline-flex; + align-items: center; + gap: 0.35rem; + font-size: 0.875rem; + color: #64748b; + margin: 0.2rem 0 0; +} + +.p-hero__occupation i { color: #94a3b8; font-size: 0.8125rem; } + +/* Meta row */ +.p-hero__meta { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.35rem; + margin-top: 0.75rem; +} + +.p-hero__meta-item { + display: inline-flex; + align-items: center; + gap: 0.25rem; + font-size: 0.75rem; + color: #64748b; + background: #f8fafc; + border: 1px solid #e2e8f0; + border-radius: 999px; + padding: 0.22rem 0.65rem; + white-space: nowrap; +} + +.p-hero__meta-item i { font-size: 0.65rem; color: #94a3b8; } +.p-hero__meta-item--lang { background: #fff; color: #334155; font-weight: 500; } +.p-hero__meta-item--muted { color: #94a3b8; background: transparent; border-color: transparent; font-size: 0.6875rem; flex-basis: 100%; white-space: normal; } + +/* ── Activity badge shared colors ───────────────────────── */ +.p-hero__activity-badge--active { background: #dcfce7; color: #16a34a; } +.p-hero__activity-badge--recent { background: #fef3c7; color: #d97706; } +.p-hero__activity-badge--inactive { background: #f1f5f9; color: #94a3b8; } + +/* ── About me quote block ────────────────────────────────── */ +.p-profile__quote { + font-size: 0.9375rem; + color: #475569; + font-style: italic; + background: #f8fafc; + border-left: 3px solid #f37000; + border-radius: 0 0.375rem 0.375rem 0; + padding: 0.5rem 0.75rem; + margin: 0; + position: relative; +} + +.p-profile__quote::before { + content: '\201C'; + font-style: normal; + font-size: 1.5rem; + line-height: 1; + color: #f37000; + opacity: 0.5; + margin-right: 0.15rem; + vertical-align: -0.2rem; +} + +.p-profile__quote::after { + content: '\201D'; + font-style: normal; + font-size: 1.5rem; + line-height: 1; + color: #f37000; + opacity: 0.5; + margin-left: 0.15rem; + vertical-align: -0.2rem; +} + +.p-hero__location { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.9375rem; + color: #475569; + font-weight: 500; + margin: 0 0 0.5rem; + flex-wrap: wrap; +} + +.p-hero__location svg { + color: #f37000; + flex-shrink: 0; +} + +.p-hero__location a { + color: #f37000; + text-decoration: none; +} + +.p-hero__location a:hover { + color: #c25a00; +} + +.p-hero__location--empty { + color: #94a3b8; + font-style: italic; + font-size: 0.875rem; + margin: 0 0 0.625rem; +} + +.p-hero__stats { + display: flex; + align-items: center; + gap: 0.35rem; + flex-wrap: wrap; +} + +.p-hero__stat { + display: inline-flex; + align-items: center; + font-size: 0.6875rem; + font-weight: 500; + color: #94a3b8; + background: #f8fafc; + border: 1px solid #e2e8f0; + border-radius: 999px; + padding: 0.2rem 0.6rem; + white-space: nowrap; +} + +/* ── Activity badge shared colors ───────────────────────── */ +.p-hero__activity-badge--active { + background: #dcfce7; + color: #16a34a; +} + +.p-hero__activity-badge--recent { + background: #fef3c7; + color: #d97706; +} + +.p-hero__activity-badge--inactive { + background: #f1f5f9; + color: #94a3b8; +} + +/* ── Stat icons ─────────────────────────────────────────── */ +.p-hero__stat-icon { + margin-right: 0.3rem; + font-size: 0.6rem; + color: #94a3b8; +} + +.p-hero__stat-icon--female { + color: #ec4899; +} + +.p-hero__stat-icon--male { + color: #3b82f6; +} + +.p-hero__stat-icon--other { + color: #8b5cf6; +} + +.p-hero__stat-icon--active { color: #16a34a; } +.p-hero__stat-icon--recent { color: #d97706; } +.p-hero__stat-icon--inactive { color: #94a3b8; } + +.p-hero__stat-icon--active { + color: #22c55e; +} + +.p-hero__stat-icon--recent { + color: #f59e0b; +} + +.p-hero__stat-icon--inactive { + color: #cbd5e1; +} + +/* ── Hosting badge ──────────────────────────────────────── */ + +.p-hero__hosting-badge { + display: inline-flex; + align-items: center; + gap: 0.3rem; + font-size: 0.8rem; + font-weight: 600; + border-radius: 999px; + padding: 0.3rem 0.8rem; + white-space: nowrap; +} + +.p-hero__hosting-badge--yes { + background: linear-gradient(135deg, #00d068 0%, #00b855 100%); + color: #fff; + box-shadow: 0 1px 6px rgba(0, 184, 85, 0.25); +} + +.p-hero__hosting-badge--no { + background: #f1f5f9; + color: #64748b; + border: 1px solid #e2e8f0; +} + +.p-hero__avatar-frame { + position: relative; + display: inline-block; + line-height: 0; +} + +.p-hero__accommodation-badge { + position: absolute; + bottom: 16px; + right: 16px; + width: 28px; + height: 28px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + font-size: 0.7rem; + pointer-events: none; + box-shadow: 0 1px 4px rgba(0,0,0,0.15); + z-index: 11; +} +.p-hero__accommodation-badge--yes { background: #00b855; color: #fff; } +.p-hero__accommodation-badge--no { background: rgba(255,255,255,0.9); color: #94a3b8; } + +/* ── Action buttons ─────────────────────────────────────── */ + +.p-hero__actions { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 0.5rem; + align-items: center; +} + +.p-hero__btn { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.5rem 1rem; + border-radius: 999px; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none !important; + cursor: pointer; + transition: filter 0.15s ease, box-shadow 0.15s ease, background 0.15s ease; + white-space: nowrap; + border: none; +} + +.p-hero__btn--primary { + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%); + color: #fff !important; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.25); +} + +.p-hero__btn--primary:hover { + filter: brightness(1.07); + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.35); +} + +.p-hero__btn--outline { + background: #f37000; + color: #fff !important; + border: none; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.25); +} + +.p-hero__btn--outline:hover { + background: #c25a00; + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.35); +} + +.p-hero__btn--secondary { + background: linear-gradient(135deg, #ff9a2e, #f37000); + color: #fff !important; + border: none; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.3); +} + +.p-hero__btn--secondary:hover { + background: linear-gradient(135deg, #ffaa44, #e06500); + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.45); +} + +.p-hero__btn--icon { + padding: 0.5rem 0.65rem; + background: #f8fafc; + color: #64748b !important; + border: 1px solid #e2e8f0; +} + +.p-hero__btn--icon:hover { + background: #f1f5f9; + color: #334155 !important; + border-color: #cbd5e1; +} + +.p-hero__btn--muted { + color: #94a3b8 !important; +} + +.p-hero__btn--muted:hover { + color: #ef4444 !important; + border-color: #fca5a5; + background: #fef2f2; +} + +.dropdown-toggle-no-arrow::after { display: none; } + +.p-hero__dropdown { + background: #fff !important; + border: 1px solid #e2e8f0 !important; + border-radius: 0.75rem !important; + box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12) !important; + padding: 0.35rem !important; + min-width: 190px; +} + +.p-hero__dropdown-item { + display: flex; + align-items: center; + gap: 0.6rem; + font-size: 0.875rem; + color: #334155; + border-radius: 0.5rem; + padding: 0.5rem 0.75rem; +} + +.p-hero__dropdown-item:hover { + background: #f8fafc; + color: #0f172a; +} + +.p-hero__dropdown-item--danger { color: #ef4444; } +.p-hero__dropdown-item--danger:hover { background: #fef2f2; color: #dc2626; } + +.p-hero__status-form { + display: flex; + flex-direction: row; + gap: 0.4rem; + align-items: center; +} + +/* ── Tab navigation ─────────────────────────────────────── */ + +.p-hero__tabs { + display: flex; + align-items: center; + gap: 0; + border-top: 1px solid #f1f5f9; + padding: 0 1.5rem; + overflow-x: auto; + scrollbar-width: none; +} + +.p-hero__tabs::-webkit-scrollbar { + display: none; +} + +.p-hero__tab { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.7rem 1rem; + font-size: 0.8125rem; + font-weight: 500; + color: #64748b; + text-decoration: none !important; + border-bottom: 2px solid transparent; + white-space: nowrap; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.p-hero__tab:hover { + color: #334155; + border-bottom-color: #e2e8f0; +} + +.p-hero__tab--active { + color: #f37000; + border-bottom-color: #f37000; + font-weight: 600; +} + +.p-hero__tab-count { + background: #f1f5f9; + color: #64748b; + border-radius: 999px; + padding: 0.1rem 0.45rem; + font-size: 0.7rem; + font-weight: 600; +} + +.p-hero__tab--active .p-hero__tab-count { + background: rgba(243, 112, 0, 0.1); + color: #f37000; +} + +/* ── Map ────────────────────────────────────────────────── */ + +.p-hero__map { + width: 100%; + height: 90px; + border-top: 1px solid #f1f5f9; +} + +.p-hero__map--bottom { + height: 220px; + border-top: none; + border-radius: 1rem; + margin-top: 1.5rem; + overflow: hidden; +} + +/* ── Profile body layout ────────────────────────────────── */ + +.p-profile-layout { + display: grid; + grid-template-columns: 1fr 300px; + gap: 1.25rem; + align-items: start; + padding-top: 1.5rem; +} + +/* Edit mode: single column, all cards full width */ +.p-profile-layout--edit { + grid-template-columns: 1fr; + padding-top: 0; +} + +.p-profile-layout--edit .p-profile-secondary { + position: static; + top: auto; +} + +.p-profile-main { min-width: 0; } + +/* ── Profile edit header ──────────────────────────────── */ +.p-edit-header { + background: #fff; + border-radius: 1rem; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 16px rgba(15, 23, 42, 0.06); + margin: 1rem 0 1.5rem; + overflow: hidden; +} + +.p-edit-header__top { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 1.25rem; + padding: 1.25rem 1.5rem; +} + +.p-edit-header__avatar { + position: relative; + flex-shrink: 0; + width: 88px; + height: 88px; + border-radius: 50%; + overflow: hidden; + border: 3px solid #fff; + box-shadow: 0 2px 10px rgba(15, 23, 42, 0.12); + display: block; +} + +.p-edit-header__avatar img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.p-edit-header__avatar-overlay { + position: absolute; + inset: 0; + background: rgba(15, 23, 42, 0.55); + color: #fff; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.25rem; + opacity: 0; + transition: opacity 0.18s ease; +} + +.p-edit-header__avatar:hover .p-edit-header__avatar-overlay, +.p-edit-header__avatar:focus-visible .p-edit-header__avatar-overlay { + opacity: 1; +} + +.p-edit-header__identity { + flex: 1 1 auto; + min-width: 0; +} + +.p-edit-header__eyebrow { + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #f37000; + margin: 0 0 0.2rem; +} + +.p-edit-header__name { + font-size: 1.5rem; + font-weight: 700; + color: #0f172a; + margin: 0; + line-height: 1.2; + word-break: break-word; +} + +.p-edit-header__actions { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + align-items: center; +} + +.p-edit-header__btn { + display: inline-flex; + align-items: center; + gap: 0.45rem; + padding: 0.5rem 1rem; + border-radius: 999px; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none !important; + cursor: pointer; + transition: filter 0.15s ease, box-shadow 0.15s ease, background 0.15s ease, color 0.15s ease, border-color 0.15s ease; + white-space: nowrap; + border: 1px solid transparent; + line-height: 1.2; +} + +.p-edit-header__btn i { font-size: 0.875rem; } + +.p-edit-header__btn--primary { + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%); + color: #fff !important; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.25); +} + +.p-edit-header__btn--primary:hover { + filter: brightness(1.07); + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.35); +} + +.p-edit-header__btn--secondary { + background: #f8fafc; + color: #475569 !important; + border-color: #e2e8f0; +} + +.p-edit-header__btn--secondary:hover { + background: #f1f5f9; + color: #0f172a !important; + border-color: #cbd5e1; +} + +/* Language tabs row */ +.p-edit-header__langs { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.75rem; + padding: 0.75rem 1.5rem 1rem; + border-top: 1px solid #f1f5f9; + background: #fafbfc; +} + +.p-edit-header__lang-tabs { + display: flex; + flex-wrap: wrap; + gap: 0.35rem; + flex: 1 1 auto; + min-width: 0; +} + +.p-edit-header__lang-tab { + display: inline-flex; + align-items: center; + padding: 0.4rem 0.9rem; + border-radius: 999px; + border: 1px solid #e2e8f0; + background: #fff; + color: #64748b; + font-size: 0.8125rem; + font-weight: 600; + cursor: pointer; + transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease; + line-height: 1.3; +} + +.p-edit-header__lang-tab:hover { + border-color: #f37000; + color: #f37000; +} + +.p-edit-header__lang-tab--active { + background: #f37000; + border-color: #f37000; + color: #fff; +} + +.p-edit-header__lang-tab--active:hover { + background: #c25a00; + border-color: #c25a00; + color: #fff; +} + +.p-edit-header__add-lang { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.4rem 0.9rem; + border-radius: 999px; + border: 1px dashed #cbd5e1; + background: transparent; + color: #475569; + font-size: 0.8125rem; + font-weight: 600; + text-decoration: none !important; + white-space: nowrap; + transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease; +} + +.p-edit-header__add-lang:hover { + background: #fff7ed; + border-color: #f37000; + color: #f37000; +} + +/* Quick secondary links row */ +.p-edit-header__quicklinks { + display: flex; + flex-wrap: wrap; + gap: 0.25rem 1.25rem; + padding: 0.6rem 1.5rem 0.75rem; + border-top: 1px solid #f1f5f9; + background: #fff; +} + +.p-edit-header__quicklink { + display: inline-flex; + align-items: center; + gap: 0.4rem; + font-size: 0.8125rem; + font-weight: 500; + color: #64748b !important; + text-decoration: none !important; + transition: color 0.15s ease; +} + +.p-edit-header__quicklink i { + font-size: 0.75rem; + color: #94a3b8; + transition: color 0.15s ease; +} + +.p-edit-header__quicklink:hover, +.p-edit-header__quicklink:focus-visible { + color: #f37000 !important; +} + +.p-edit-header__quicklink:hover i, +.p-edit-header__quicklink:focus-visible i { + color: #f37000; +} + +@media (max-width: 540px) { + .p-edit-header__top { padding: 1rem; gap: 1rem; } + .p-edit-header__avatar { width: 72px; height: 72px; } + .p-edit-header__name { font-size: 1.25rem; } + .p-edit-header__actions { + flex-basis: 100%; + justify-content: flex-start; + } + .p-edit-header__langs { padding: 0.75rem 1rem; } + .p-edit-header__quicklinks { + padding: 0.5rem 1rem 0.65rem; + gap: 0.5rem; + flex-wrap: nowrap; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + } + .p-edit-header__quicklinks::-webkit-scrollbar { display: none; } + .p-edit-header__quicklink { + flex: 0 0 auto; + padding: 0.35rem 0.75rem; + background: #f1f5f9; + border-radius: 999px; + font-size: 0.75rem; + white-space: nowrap; + } + .p-edit-header__quicklink:hover, + .p-edit-header__quicklink:focus-visible { + background: #fee8d6; + } +} + +/* ── Profile edit subpages (About me, Accommodation, Preferences, …) ── */ +.p-edit-subpage { + max-width: 880px; + margin: 1.5rem auto; + padding: 0; +} + +.p-edit-subpage__header { + display: flex; + flex-direction: row; + align-items: center; + gap: 1.25rem; + flex-wrap: nowrap; + margin-bottom: 1.25rem; +} + +.p-edit-subpage__back { + display: inline-flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 2.25rem; + height: 2.25rem; + border-radius: 50%; + background: #f3f4f6; + border: none; + color: #6b7280; + text-decoration: none !important; + transition: background 0.15s ease, color 0.15s ease; +} + +.p-edit-subpage__back i { + font-size: 0.75rem; +} + +.p-edit-subpage__back:hover, +.p-edit-subpage__back:focus-visible { + background: #e5e7eb; + color: #111827; + outline: none; +} + +.p-edit-subpage__back:active { + background: #d1d5db; +} + +.p-edit-subpage__heading { + flex: 1 1 auto; + min-width: 0; +} + +.p-edit-subpage__eyebrow { + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #f37000; + margin: 0 0 0.15rem; +} + +.p-edit-subpage__title { + font-size: 1.5rem; + font-weight: 700; + color: #0f172a; + margin: 0; + line-height: 1.2; + word-break: break-word; +} + +.p-edit-subpage__card { + background: #fff; + border-radius: 1rem; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 16px rgba(15, 23, 42, 0.06); + padding: 1.5rem; + color: #334155; + line-height: 1.6; +} + +/* Compact spacing between Symfony form rows inside the card */ +.p-edit-subpage__card .mb-3, +.p-edit-subpage__card .form-group { + margin-bottom: 1.1rem; +} + +.p-edit-subpage__card .form-label, +.p-edit-subpage__card legend.o-label, +.p-edit-subpage__card .o-label { + display: block; + font-size: 0.8125rem; + font-weight: 700; + color: #475569; + text-transform: uppercase; + letter-spacing: 0.04em; + margin-bottom: 0.4rem; +} + +.p-edit-subpage__card h1 { + font-size: 1.5rem; + font-weight: 700; + color: #0f172a; + margin: 0 0 0.5rem; +} + +.p-edit-subpage__card h2 { + font-size: 1.125rem; + font-weight: 700; + color: #1e293b; + margin: 1.25rem 0 0.5rem; +} + +.p-edit-subpage__card h3 { + font-size: 1rem; + font-weight: 700; + color: #1e293b; + margin: 1rem 0 0.4rem; +} + +.p-edit-subpage__actions { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + margin-top: 1.5rem; + padding-top: 1.25rem; + border-top: 1px solid #f1f5f9; +} + +.p-edit-subpage__actions .o-button, +.p-edit-subpage__actions button[type="submit"], +.p-edit-subpage__actions input[type="submit"] { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.75rem; + padding: 0.7rem 1.35rem; + border: 1px solid #f37000; + border-radius: 999px; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + color: #fff; + font-family: inherit; + font-size: 0.95rem; + font-weight: 700; + line-height: 1.2; + text-decoration: none !important; + cursor: pointer; + box-shadow: 0 4px 12px rgba(243, 112, 0, 0.24); + transition: + transform 0.15s ease, + box-shadow 0.15s ease, + filter 0.15s ease; +} + +.p-edit-subpage__actions .o-button:hover, +.p-edit-subpage__actions .o-button:focus-visible, +.p-edit-subpage__actions button[type="submit"]:hover, +.p-edit-subpage__actions button[type="submit"]:focus-visible, +.p-edit-subpage__actions input[type="submit"]:hover, +.p-edit-subpage__actions input[type="submit"]:focus-visible { + color: #fff; + filter: brightness(1.03); + box-shadow: 0 6px 18px rgba(243, 112, 0, 0.32); + outline: none; + transform: translateY(-1px); +} + +.p-edit-subpage__actions--split { + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +@media (max-width: 640px) { + .p-edit-subpage { margin: 1rem auto; padding: 0 0.75rem; } + .p-edit-subpage__card { padding: 1.1rem; } + .p-edit-subpage__title { font-size: 1.25rem; } + + .p-edit-subpage__header { + flex-direction: row; + align-items: center; + gap: 0.75rem; + } + + .p-edit-subpage__heading { + flex: 1 1 auto; + min-width: 0; + } + + .p-edit-subpage__actions { justify-content: stretch; } + .p-edit-subpage__actions .o-button, + .p-edit-subpage__actions button[type="submit"], + .p-edit-subpage__actions input[type="submit"] { + width: 100%; + } +} + +/* ── Translation field label (used by macros.field_translation) ── */ +.o-field-translation__label { + display: inline-block; + margin-bottom: 0.5rem; + font-size: 0.8125rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + color: #475569; +} + +.p-edit-subpage__card .o-field-translation + .o-field-translation { + margin-top: 1.25rem; +} + +/* ── Profile edit textareas (plain, no rich editor) ── */ +.p-edit-subpage__card textarea.o-input, +.p-edit-subpage__card input.o-input { + width: 100%; + background: #fff; + border: 1px solid #e2e8f0; + border-radius: 0.75rem; + padding: 0.65rem 0.85rem; + font-size: 0.95rem; + color: #1f2937; + line-height: 1.55; + font-family: inherit; + transition: + border-color 0.15s ease, + box-shadow 0.15s ease; +} + +.p-edit-subpage__card textarea.o-input { + resize: vertical; + min-height: 5rem; +} + +.p-edit-subpage__card textarea.o-input:hover, +.p-edit-subpage__card input.o-input:hover { + border-color: #cbd5e1; +} + +.p-edit-subpage__card textarea.o-input:focus, +.p-edit-subpage__card input.o-input:focus { + outline: none; + border-color: #f37000; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.15); +} + +.p-edit-subpage__card textarea.o-input::placeholder, +.p-edit-subpage__card input.o-input::placeholder { + color: #94a3b8; + font-style: italic; +} + +/* ── Account edit form ── */ +.p-account-form { + display: flex; + flex-direction: column; + gap: 0.875rem; +} + +.p-account-section { + display: flex; + flex-direction: column; + gap: 0.45rem; + padding: 1rem; + border: 1px solid #f1f5f9; + border-radius: 0.875rem; + background: #f8fafc; +} + +.p-account-section__label { + margin: 0; + color: #0f172a; + font-size: 0.95rem; + font-weight: 700; + line-height: 1.3; +} + +.p-account-section__help { + display: block; + margin: 0.25rem 0 0.75rem; + color: #64748b; + font-size: 0.8125rem; + line-height: 1.45; +} + +.p-account-section .invalid-feedback, +.p-account-section .form-error-message { + color: #dc2626; + font-size: 0.85rem; + margin: 0; +} + +.p-account-toggle { + display: flex; + align-items: flex-start; + gap: 0.55rem; + margin: 0.4rem 0 0; + cursor: pointer; + user-select: none; +} + +.p-account-toggle__label { + color: #475569; + font-size: 0.875rem; + font-weight: 600; + line-height: 1.45; + padding-top: 0.2rem; +} + +/* ── Profile language forms ── */ +.p-language-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.p-language-form__group { + min-width: 0; +} + +.p-language-form__label { + display: block; + margin-bottom: 0.45rem; + color: #475569; + font-size: 0.8125rem; + font-weight: 700; + letter-spacing: 0.04em; + line-height: 1.2; + text-transform: uppercase; +} + +.p-language-form__control, +.p-language-form select, +.p-language-form .ts-control { + width: 100%; + min-height: 2.75rem; + padding: 0.65rem 0.85rem; + border: 1px solid #e2e8f0; + border-radius: 0.75rem; + background: #fff; + color: #1f2937; + font-family: inherit; + font-size: 0.95rem; + line-height: 1.35; + box-shadow: none; + transition: + border-color 0.15s ease, + box-shadow 0.15s ease; +} + +.p-language-form select { + appearance: none; + background-image: + linear-gradient(45deg, transparent 50%, #94a3b8 50%), + linear-gradient(135deg, #94a3b8 50%, transparent 50%); + background-position: + calc(100% - 1.1rem) 50%, + calc(100% - 0.8rem) 50%; + background-size: 0.32rem 0.32rem; + background-repeat: no-repeat; + padding-right: 2.25rem; +} + +.p-language-form .ts-wrapper { + width: 100%; +} + +.p-language-form .ts-control { + display: flex; + align-items: center; +} + +.p-language-form .ts-control > input { + color: #1f2937; + font-size: 0.95rem; +} + +.p-language-form select:hover, +.p-language-form .ts-control:hover { + border-color: #cbd5e1; +} + +.p-language-form select:focus, +.p-language-form .ts-wrapper.focus .ts-control { + border-color: #f37000; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.15); + outline: none; +} + +.p-language-panel { + display: grid; + grid-template-columns: auto 1fr; + gap: 1rem; + align-items: start; + padding: 1rem; + border: 1px solid #f1f5f9; + border-radius: 0.875rem; + background: #f8fafc; +} + +.p-language-panel__icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.5rem; + height: 2.5rem; + border-radius: 999px; + background: rgba(243, 112, 0, 0.12); + color: #f37000; +} + +.p-language-panel__content { + min-width: 0; +} + +.collection-languages { + display: flex; + flex-direction: column; + gap: 0.875rem; +} + +.p-language-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 0.75rem; + align-items: end; + padding: 1rem; + border: 1px solid #f1f5f9; + border-radius: 0.875rem; + background: #f8fafc; +} + +.p-language-row__fields { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 0.875rem; + min-width: 0; +} + +.p-language-row__delete, +.p-language-add { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.45rem; + border: none; + font-family: inherit; + font-weight: 700; + transition: + background 0.15s ease, + color 0.15s ease, + transform 0.15s ease; +} + +.p-language-row__delete { + width: 2.75rem; + height: 2.75rem; + border-radius: 0.75rem; + background: #fff1f2; + color: #e11d48; +} + +.p-language-row__delete:hover, +.p-language-row__delete:focus-visible { + background: #e11d48; + color: #fff; +} + +.p-language-add { + min-height: 2.75rem; + padding: 0 1rem; + border-radius: 999px; + background: #fff7ed; + color: #f37000; +} + +.p-language-add:hover, +.p-language-add:focus-visible { + background: #f37000; + color: #fff; + transform: translateY(-1px); +} + +@media (max-width: 640px) { + .p-language-panel, + .p-language-row { + grid-template-columns: 1fr; + padding: 0.875rem; + } + + .p-language-row__fields { + grid-template-columns: 1fr; + } + + .p-language-row__delete { + width: 100%; + } +} + +/* ── Profile location edit ── */ +.p-location-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.p-location-panel { + padding: 1rem; + border: 1px solid #f1f5f9; + border-radius: 0.875rem; + background: #f8fafc; +} + +.p-location-search { + position: relative; + width: 100%; +} + +.p-location-search__icon { + position: absolute; + top: 50%; + left: 0.85rem; + transform: translateY(-50%); + color: #94a3b8; + font-size: 0.9rem; + pointer-events: none; + z-index: 1; +} + +.p-location-search .o-input, +.p-edit-subpage__card .p-location-search .o-input { + width: 100%; + min-height: 2.75rem; + padding: 0.65rem 0.85rem 0.65rem 2.35rem; + border: 1px solid #e2e8f0; + border-radius: 0.75rem; + color: #1f2937; + font-size: 0.95rem; + line-height: 1.35; + box-shadow: none; +} + +.p-location-search:focus-within .p-location-search__icon { + color: #f37000; +} + +.p-location-search .o-input:hover { + border-color: #cbd5e1; +} + +.p-location-search .o-input:focus { + border-color: #f37000; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.15); + outline: none; +} + +.p-location-form__errors { + margin-top: 0.5rem; + color: #dc2626; + font-size: 0.875rem; +} + +.p-location-map { + width: 100%; + height: 440px; + overflow: hidden; + border: 1px solid #e2e8f0; + border-radius: 1rem; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 16px rgba(15, 23, 42, 0.06); +} + +@media (max-width: 640px) { + .p-location-panel { + padding: 0.875rem; + } + + .p-location-map { + height: 320px; + } +} + +/* ── Profile preferences ── */ +.p-preferences-form { + display: block; +} + +.p-preferences-list { + display: flex; + flex-direction: column; + gap: 0.875rem; +} + +.p-preference-card { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 1rem; + align-items: center; + padding: 1rem; + border: 1px solid #f1f5f9; + border-radius: 0.875rem; + background: #f8fafc; +} + +.p-preference-card__copy { + min-width: 0; +} + +.p-preference-card__title { + margin: 0; + color: #0f172a; + font-size: 1rem; + font-weight: 700; + line-height: 1.25; +} + +.p-preference-card__help { + display: block; + margin-top: 0.35rem; + color: #64748b; + font-size: 0.875rem; + line-height: 1.45; +} + +.p-preference-card__control { + display: flex; + justify-content: flex-end; + min-width: min(100%, 16rem); +} + +.p-preference-toggle { + display: inline-flex; + align-items: center; + gap: 0.55rem; + margin: 0; + cursor: pointer; + user-select: none; +} + +.p-preference-toggle__input { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; +} + +.p-preference-toggle__label { + color: #64748b; + font-size: 0.875rem; + font-weight: 700; + line-height: 1; +} + +.p-preference-toggle__label--active { + color: #475569; +} + +.p-preference-toggle__track { + position: relative; + display: inline-flex; + align-items: center; + flex-shrink: 0; + width: 3.25rem; + height: 1.75rem; + padding: 0.18rem; + border-radius: 999px; + background: #cbd5e1; + overflow: hidden; + transition: + background 0.15s ease, + box-shadow 0.15s ease; +} + +.p-preference-toggle__thumb { + width: 1.38rem; + height: 1.38rem; + border-radius: 999px; + background: #fff; + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.25); + transform: translateX(0); + transition: transform 0.15s ease; +} + +.p-preference-toggle__input:checked + .p-preference-toggle__track { + background: #f37000; +} + +.p-preference-toggle__input:checked + .p-preference-toggle__track .p-preference-toggle__thumb { + transform: translateX(1.5rem); +} + +.p-preference-toggle__input:focus-visible + .p-preference-toggle__track { + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.2); +} + +.p-preference-select { + width: 100%; + min-height: 2.75rem; + padding: 0.65rem 2.25rem 0.65rem 0.85rem; + border: 1px solid #e2e8f0; + border-radius: 0.75rem; + appearance: none; + background: + linear-gradient(45deg, transparent 50%, #94a3b8 50%) calc(100% - 1.1rem) 50% / 0.32rem 0.32rem no-repeat, + linear-gradient(135deg, #94a3b8 50%, transparent 50%) calc(100% - 0.8rem) 50% / 0.32rem 0.32rem no-repeat, + #fff; + color: #1f2937; + font-family: inherit; + font-size: 0.95rem; + line-height: 1.35; + box-shadow: none; +} + +.p-preference-select:hover { + border-color: #cbd5e1; +} + +.p-preference-select:focus { + border-color: #f37000; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.15); + outline: none; +} + +@media (max-width: 720px) { + .p-preference-card { + grid-template-columns: 1fr; + align-items: start; + } + + .p-preference-card__control { + justify-content: flex-start; + width: 100%; + min-width: 0; + } +} + +.p-profile-secondary { + min-width: 0; + align-self: start; + position: sticky; + top: 80px; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.p-profile-secondary .card { + border-radius: 1rem; + border: none; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 16px rgba(15, 23, 42, 0.06); + margin-bottom: 0; +} + +.p-profile-secondary .card-header { + font-size: 0.8rem; + font-weight: 800; + letter-spacing: 0.1em; + text-transform: uppercase; + color: #1e293b; + background: #fff; + border-bottom: none; + padding: 0.9rem 3.5rem 1.15rem 1.25rem; + border-radius: 1rem 1rem 0 0; + position: relative; +} + +.p-profile-secondary .card-header::after { + content: ''; + position: absolute; + left: 1.25rem; + bottom: 0.55rem; + width: 2rem; + height: 3px; + background: #f37000; + border-radius: 2px; +} + +.p-profile-secondary .card-body { + padding: 0.75rem 1.25rem 1rem !important; + font-size: 0.9375rem; + color: #334155; + line-height: 1.6; +} + +/* ── Toasts ─────────────────────────────────────────────── */ +.p-toast { + min-width: 280px; + border-radius: 0.75rem; + box-shadow: 0 4px 20px rgba(15,23,42,0.15); + margin-bottom: 0.5rem; + font-size: 0.9rem; + font-weight: 500; +} +.p-toast--success { background: #16a34a; color: #fff; } +.p-toast--danger, .p-toast--error { background: #dc2626; color: #fff; } +.p-toast--warning { background: #d97706; color: #fff; } +.p-toast--info { background: #2563eb; color: #fff; } + +/* ── Global toast notifications (bw-toast) ──────────────── */ +@keyframes bw-toast-in { + from { opacity: 0; transform: translateX(1.5rem) scale(0.95); } + to { opacity: 1; transform: translateX(0) scale(1); } +} + +.bw-toast { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.875rem 0.875rem 0.875rem 1rem; + min-width: 280px; + max-width: 360px; + border-radius: 0.875rem; + background: #fff; + color: #334155; + box-shadow: + 0 0 0 1px rgba(15, 23, 42, 0.07), + 0 8px 32px rgba(15, 23, 42, 0.12), + 0 2px 8px rgba(15, 23, 42, 0.06); + margin-bottom: 0.5rem; + border: none !important; + animation: bw-toast-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1) both; +} + +.bw-toast__icon { + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + flex-shrink: 0; + font-size: 0.85rem; +} + +.bw-toast__body { + flex: 1; + font-size: 0.875rem; + font-weight: 500; + line-height: 1.4; + color: #334155; +} + +.bw-toast__close { + background: transparent; + border: none; + cursor: pointer; + padding: 0.25rem; + width: 26px; + height: 26px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + border-radius: 50%; + color: #94a3b8; + font-size: 0.75rem; + transition: color 0.15s ease, background 0.15s ease; +} + +.bw-toast__close:hover { + color: #475569; + background: #f1f5f9; +} + +/* Variants — tinted background + matching icon bubble */ +.bw-toast--notice { background: #eef4fd; } +.bw-toast--success { background: #f0fdf4; } +.bw-toast--error { background: #fef2f2; } +.bw-toast--warning { background: #fffbeb; } + +.bw-toast--notice .bw-toast__icon { background: rgba(55, 129, 235, 0.14); color: #3781eb; } +.bw-toast--success .bw-toast__icon { background: rgba( 22, 163, 74, 0.15); color: #16a34a; } +.bw-toast--error .bw-toast__icon { background: rgba(220, 38, 38, 0.15); color: #dc2626; } +.bw-toast--warning .bw-toast__icon { background: rgba(217, 119, 6, 0.15); color: #d97706; } + +.bw-toast--notice .bw-toast__body { color: #1a4d9e; } +.bw-toast--success .bw-toast__body { color: #15803d; } +.bw-toast--error .bw-toast__body { color: #b91c1c; } +.bw-toast--warning .bw-toast__body { color: #92400e; } + +.bw-toast--notice .bw-toast__close { color: #3781eb; } +.bw-toast--success .bw-toast__close { color: #16a34a; } +.bw-toast--error .bw-toast__close { color: #dc2626; } +.bw-toast--warning .bw-toast__close { color: #d97706; } + +.bw-toast--notice .bw-toast__close:hover { background: rgba(55, 129, 235, 0.1); } +.bw-toast--success .bw-toast__close:hover { background: rgba( 22, 163, 74, 0.1); } +.bw-toast--error .bw-toast__close:hover { background: rgba(220, 38, 38, 0.1); } +.bw-toast--warning .bw-toast__close:hover { background: rgba(217, 119, 6, 0.1); } + +/* ── About Me: full-bleed flush below hero ──────────────── */ +.p-about-hero { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: 0; + margin-bottom: 1.5rem !important; +} +.p-about-hero > .card { + border-radius: 0; + border-left: none; + border-right: none; + border-top: none; + box-shadow: 0 2px 6px rgba(15,23,42,0.06); +} +.p-about-hero > .card > .card-body { + padding-left: 1.25rem; + padding-right: 1.25rem; +} +.p-about-hero > .card > .card-header { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +/* ── Language switcher ──────────────────────────────────── */ +.p-lang-pills { + display: flex; + align-items: center; + gap: 0.3rem; +} + +.p-hero__body-wrap { + position: relative; +} + +.p-lang-pills--overlay { + position: absolute; + top: -38px; + right: 0; + z-index: 10; + background: rgba(255, 255, 255, 0.82); + backdrop-filter: blur(6px); + border-radius: 999px; + padding: 0.2rem 0.5rem; +} + +.p-lang-pills__globe { + font-size: 0.7rem; + color: #64748b; + margin-right: 0.15rem; +} + +.p-lang-pill { + padding: 0.2rem 0.55rem; + border-radius: 999px; + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.04em; + border: 1px solid #e2e8f0; + background: #fff; + color: #94a3b8; + cursor: pointer; + transition: all 0.15s ease; + line-height: 1.4; +} + +.p-lang-pill:hover { + border-color: #f37000; + color: #f37000; +} + +.p-lang-pill--active { + background: #f37000; + border-color: #f37000; + color: #fff; +} + +/* ── Sidebar cards ──────────────────────────────────────── */ + +.p-sidebar-card { + background: #fff; + border-radius: 1rem; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 16px rgba(15, 23, 42, 0.06); + overflow: hidden; +} + +.p-sidebar-card__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.6rem 0.875rem; + border-bottom: 1px solid #f8fafc; + font-size: 0.625rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #94a3b8; +} + +.p-sidebar-card__header a { + color: #94a3b8; + text-decoration: none; +} + +.p-sidebar-card__header a:hover { + color: #f37000; +} + +.p-sidebar-card__body { + padding: 0.75rem 0.875rem; + font-size: 0.875rem; + color: #475569; + line-height: 1.6; +} + +.p-sidebar-card__lang-level { + font-size: 0.625rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: #94a3b8; + margin: 0.625rem 0 0.15rem; +} + +.p-sidebar-card__lang-level:first-child { + margin-top: 0; +} + +.p-sidebar-card__lang-list { + color: #334155; + margin: 0 0 0.2rem; + font-size: 0.875rem; +} + +.p-sidebar-card__empty { + color: #94a3b8; + font-style: italic; + margin: 0; + font-size: 0.875rem; +} + +.p-sidebar-card__group-item { + display: flex; + align-items: center; + gap: 0.625rem; + margin-bottom: 0.625rem; +} + +.p-sidebar-card__group-item:last-of-type { + margin-bottom: 0; +} + +.p-sidebar-card__group-item img { + width: 38px; + height: 38px; + border-radius: 0.5rem; + object-fit: cover; + flex-shrink: 0; +} + +.p-sidebar-card__group-name { + font-size: 0.875rem; + font-weight: 500; + color: #334155; + text-decoration: none; + line-height: 1.3; + display: block; +} + +.p-sidebar-card__group-name:hover { + color: #f37000; +} + +.p-sidebar-card__more-link { + display: inline-flex; + align-items: center; + gap: 0.4rem; + font-size: 0.8125rem; + color: #f37000; + text-decoration: none; + font-weight: 500; + margin-top: 0.5rem; +} + +.p-sidebar-card__count-badge { + background: rgba(243, 112, 0, 0.1); + color: #f37000; + border-radius: 999px; + padding: 0.1rem 0.5rem; + font-size: 0.75rem; + font-weight: 600; +} + +/* ── Main content cards override ────────────────────────── */ + +.p-profile-main .card { + border-radius: 1rem; + border: none; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 16px rgba(15, 23, 42, 0.06); + margin-bottom: 1rem; +} + +.p-profile-main .card-header { + font-size: 0.8rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.1em; + background: #fff; + color: #1e293b; + border-bottom: none; + padding: 0.9rem 3.5rem 1.15rem 1.25rem !important; + border-left: none; + border-radius: 1rem 1rem 0 0; + position: relative; +} +.p-profile-main .card-header::after { + content: ''; + position: absolute; + left: 1.25rem; + bottom: 0.55rem; + width: 2rem; + height: 3px; + background: #f37000; + border-radius: 2px; +} + +.p-profile-main .card-header > div, +.p-profile-secondary .card-header > div { + position: absolute; + top: 50%; + right: 1rem; + transform: translateY(-50%); +} + +.p-profile-main .card-header a, +.p-profile-secondary .card-header a { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 8px; + background: #f37000; + color: #fff !important; + font-size: 0.875rem; + border: 1px solid #f37000; + box-shadow: 0 2px 6px rgba(243, 112, 0, 0.2); + transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, filter 0.15s ease; +} + +.p-profile-main .card-header a:hover, +.p-profile-main .card-header a:focus-visible, +.p-profile-secondary .card-header a:hover, +.p-profile-secondary .card-header a:focus-visible { + filter: brightness(1.07); + box-shadow: 0 4px 12px rgba(243, 112, 0, 0.3); +} + +.p-profile-main .card-body { + padding: 0.75rem 1.25rem 1rem !important; + font-size: 0.9375rem; + color: #334155; + line-height: 1.6; +} + +/* Same horizontal inset as .card-header; first subsection lines up with section title */ +.p-profile-main .card-body > .card-text > :first-child, +.p-profile-main .card-body > :first-child { + margin-top: 0 !important; +} + +.p-profile-main .card-body > .card-text > .h5:first-child { + margin-top: 0 !important; +} + +.p-profile-main .h5 { + font-size: 0.7rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #f37000; + margin-top: 1.1rem; + margin-bottom: 0.3rem; +} + +/* ── Accommodation location summary ─────────────────────── */ +.p-accom-summary { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr); + gap: 1.25rem; + align-items: stretch; + margin-bottom: 1.25rem; + padding: 1rem; + border: 1px solid #eef2f7; + border-radius: 1rem; + background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); +} + +.p-accom-summary__info { + display: flex; + flex-direction: column; + gap: 0.35rem; + min-width: 0; +} + +.p-accom-summary__eyebrow { + display: inline-flex; + align-items: center; + gap: 0.4rem; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #f37000; +} + +.p-accom-summary__eyebrow i { font-size: 0.75rem; } + +.p-accom-summary__city { + margin: 0; + font-size: 1.35rem; + font-weight: 700; + line-height: 1.2; + color: #0f172a; + letter-spacing: -0.01em; +} + +.p-accom-summary__region { + margin: 0 0 0.6rem; + font-size: 0.9rem; + color: #64748b; +} + +.p-accom-summary__change { + align-self: flex-start; + display: inline-flex; + align-items: center; + gap: 0.4rem; + margin-top: auto; + padding: 0.5rem 0.95rem; + border: 1px solid #fed7aa; + border-radius: 999px; + background: #fff7ed; + color: #c2410c; + font-size: 0.85rem; + font-weight: 600; + text-decoration: none !important; + transition: + background-color 0.16s ease, + border-color 0.16s ease, + color 0.16s ease, + box-shadow 0.16s ease; +} + +.p-accom-summary__change:hover, +.p-accom-summary__change:focus-visible { + background: #f37000; + border-color: #f37000; + color: #fff; + box-shadow: 0 4px 12px rgba(243, 112, 0, 0.25); + outline: none; +} + +.p-accom-summary__change i { font-size: 0.75rem; } + +.p-accom-summary__map { + min-height: 12rem; + border-radius: 0.85rem; + border: 1px solid #e2e8f0; + overflow: hidden; + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.04); +} + +@media (max-width: 768px) { + .p-accom-summary { + grid-template-columns: 1fr; + padding: 0.85rem; + } + .p-accom-summary__map { + min-height: 10rem; + aspect-ratio: 16 / 9; + } +} + +/* ── Accommodation stats ────────────────────────────────── */ +.p-accom-chips { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-bottom: 0.6rem; +} +.p-accom-chip { + display: inline-flex; + align-items: center; + gap: 0.35rem; + font-size: 0.8125rem; + color: #475569; + background: #f8fafc; + border: 1px solid #e2e8f0; + border-radius: 999px; + padding: 0.3rem 0.75rem; +} +.p-accom-chip i { color: #f37000; font-size: 0.7rem; } +.p-accom-chip strong { color: #1e293b; } +.p-accom-chip--access { color: #2563eb; border-color: #bfdbfe; background: #eff6ff; } +.p-accom-chip--access i { color: #2563eb; } +.p-accom-updated { + font-size: 0.75rem; + color: #94a3b8; + margin: 0; + display: flex; + align-items: center; + gap: 0.3rem; +} + +.p-accom-cta { + margin-top: 1.25rem; + display: flex; + justify-content: flex-end; +} + +@media (max-width: 768px) { + .p-accom-cta { justify-content: center; } +} + +/* ── Comments ───────────────────────────────────────────── */ +.p-comments-counts { + display: flex; + gap: 0.5rem; + margin-bottom: 1rem; +} +.p-comments-count { + display: inline-flex; + align-items: center; + gap: 0.35rem; + font-size: 0.875rem; + font-weight: 600; + border-radius: 999px; + padding: 0.3rem 0.75rem; + text-decoration: none !important; + border: 1px solid; +} +.p-comments-count--positive { color: #16a34a; background: #f0fdf4; border-color: #bbf7d0; } +.p-comments-count--positive:hover { background: #dcfce7; } +.p-comments-count--neutral { color: #64748b; background: #f8fafc; border-color: #e2e8f0; } +.p-comments-count--neutral:hover { background: #f1f5f9; } +.p-comments-count--negative { color: #dc2626; background: #fef2f2; border-color: #fecaca; } +.p-comments-count--negative:hover { background: #fee2e2; } + +.p-no-comments { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + padding: 1.5rem 1rem; + color: #94a3b8; + text-align: center; +} +.p-no-comments i { font-size: 1.75rem; opacity: 0.4; } +.p-no-comments p { margin: 0; font-size: 0.9rem; } + +/* ── Responsive ─────────────────────────────────────────── */ + +@media (max-width: 900px) { + .p-profile-layout { + grid-template-columns: 1fr; + } + + .p-profile-secondary { + position: static; + } + + .p-hero__banner { height: 150px; } + .p-hero__body { padding: 0 1.25rem 1.25rem; gap: 1.25rem; } + .p-hero__avatar-col { margin-top: -75px; } + .p-hero__avatar-wrap { width: 175px; height: 175px; } +} + +@media (max-width: 540px) { + .p-hero__banner { height: 130px; } + + .p-hero__body { + flex-direction: column; + align-items: stretch; + padding: 0 1rem 1.25rem; + gap: 0; + } + + .p-hero__avatar-col { + flex-direction: row; + align-items: flex-end; + gap: 0.75rem; + margin-top: -70px; + margin-bottom: 0.5rem; + } + + .p-hero__avatar-wrap { + width: 150px; + height: 150px; + border-width: 3px; + } + + .p-hero__activity-below { + font-size: 0.6875rem; + padding: 0.2rem 0.5rem; + } + + .p-hero__name { font-size: 1.375rem; } + + /* Single column: actions flow after meta chips, above tabs */ + .p-hero__info { + grid-template-columns: 1fr; + } + + .p-hero__top-row, + .p-hero__location, + .p-hero__location--empty, + .p-hero__occupation, + .p-hero__meta, + .p-hero__actions { + grid-column: 1; + grid-row: auto; + } + + .p-hero__actions { + padding: 0.75rem 0 0.25rem; + flex-wrap: wrap; + } + +} + +/* ── Photo strip (top of profile content) ──────────────── */ +.p-photo-strip { + display: flex; + gap: 4px; + overflow-x: auto; + scroll-snap-type: x mandatory; + scrollbar-width: none; + margin-bottom: 1rem; + border-radius: 0.75rem; + overflow-y: hidden; +} + +.p-photo-strip::-webkit-scrollbar { display: none; } + +.p-photo-strip__item { + flex-shrink: 0; + width: 72px; + height: 72px; + border-radius: 0.5rem; + overflow: hidden; + scroll-snap-align: start; + display: block; + background: #f1f5f9; +} + +.p-photo-strip__item img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + transition: transform 0.2s ease; +} + +.p-photo-strip__item:hover img { + transform: scale(1.08); +} + +/* ── Profile gallery grid ───────────────────────────────── */ +.p-gallery-card { + overflow: hidden; +} + +.p-gallery-empty { + display: flex; + align-items: center; + justify-content: center; + padding: 1.5rem 1rem; +} + +.p-gallery-empty__btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.55rem 1.25rem; + border-radius: 999px; + background: #f37000; + color: #fff !important; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none !important; + transition: background 0.15s ease; +} + +.p-gallery-empty__btn:hover { + background: #ea580c; +} + +.p-profile-empty-hint { + margin: 0.35rem 0 0; + padding: 0.45rem 0.75rem; + background: #f8fafc; + border: 1px dashed #cbd5e1; + border-radius: 6px; + color: #94a3b8; + font-size: 0.8rem; + font-style: italic; +} + +.p-gallery-grid { + display: grid; + grid-template-columns: 2fr 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 3px; + aspect-ratio: 2 / 1; + max-height: 360px; + border-radius: 0.75rem; + overflow: hidden; +} + +.p-gallery-cell:first-child { + grid-row: 1 / 3; +} + +.p-gallery-cell { + position: relative; + min-width: 0; + min-height: 0; + overflow: hidden; + display: block; + background: #f1f5f9; + background-position: center; + background-repeat: no-repeat; + background-size: cover; + transition: transform 0.25s ease; +} + +.p-gallery-cell:hover { + transform: scale(1.06); +} + +.p-gallery-cell::after { + content: ''; + position: absolute; + inset: 0; + background: rgba(0,0,0,0); + transition: background 0.2s ease; +} + +.p-gallery-cell:hover::after { + background: rgba(0,0,0,0.12); +} + +.p-gallery-cell--more { + position: relative; +} + +.p-gallery-cell--more::before { + content: ''; + position: absolute; + inset: 0; + background: rgba(0,0,0,0.55); +} + +.p-gallery-cell--more:hover { + transform: none; +} + +.p-gallery-cell--more::after { display: none; } + +.p-gallery-cell__more-label { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 1.5rem; + font-weight: 700; + letter-spacing: -0.01em; +} + +.p-gallery-footer { + padding: 0.6rem 1rem; + border-top: 1px solid #f1f5f9; + font-size: 0.8125rem; +} + +.p-gallery-footer a { + display: flex; + align-items: center; + gap: 0.4rem; + color: #64748b; + text-decoration: none !important; + font-weight: 500; +} + +.p-gallery-footer a:hover { color: #334155; } + +.p-gallery-footer__count { + background: #f1f5f9; + color: #64748b; + border-radius: 999px; + padding: 0.1rem 0.45rem; + font-size: 0.75rem; + font-weight: 600; +} + +/* ── Pill option groups (checkbox / radio) ── */ +.p-pill-group { + margin-bottom: 1.25rem; +} + +.p-pill-group__label { + display: block; + margin-bottom: 0.55rem; + color: #1f2937; + font-size: 0.95rem; + font-weight: 600; + line-height: 1.3; +} + +.p-pill-group__options { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.p-pill-option { + position: relative; + margin: 0; +} + +.p-pill-option__input { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + margin: 0; + opacity: 0; + pointer-events: none; +} + +.p-pill-option__label { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.4rem; + padding: 0.45rem 1rem; + border: 1px solid #dbe2ea; + border-radius: 999px; + background: #f8fafc; + color: #475569; + font-size: 0.9rem; + font-weight: 600; + line-height: 1.2; + cursor: pointer; + user-select: none; + transition: + background-color 0.16s ease, + border-color 0.16s ease, + color 0.16s ease, + box-shadow 0.16s ease; +} + +.p-pill-option__label:hover { + background: #f1f5f9; + border-color: #cbd5e1; +} + +.p-pill-option__input:checked + .p-pill-option__label { + color: #fff; + border-color: #f37000; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.3); +} + +.p-pill-option__input:focus-visible + .p-pill-option__label { + outline: 2px solid rgba(243, 112, 0, 0.35); + outline-offset: 2px; +} + +.p-pill-option__input:disabled + .p-pill-option__label { + opacity: 0.55; + cursor: not-allowed; +} + +/* ── Gallery manage page ────────────────────────────────── */ +.p-gallery-manage { + display: flex; + flex-direction: column; + gap: 1rem; + margin: 0 auto 1.25rem; + max-width: 1100px; + padding: 0 1rem; + color: #1f2937; +} + +/* Title row + upload (legacy manage header markup lives in bewelcome _gallery.scss) */ +.p-gallery-manage__header { + display: flex; + flex-direction: column; + align-items: stretch; + gap: 1rem; + max-width: 1100px; + margin: 0.75rem auto 1rem; + padding: 0 1rem; +} + +.p-gallery-manage__header-back { + width: 100%; + justify-content: center; + font-weight: 600; +} + +@media (min-width: 576px) { + .p-gallery-manage__header-back { + width: auto; + max-width: 22rem; + justify-content: flex-start; + } +} + +.p-gallery-manage__header-main { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.p-gallery-manage__header-info { + display: flex; + flex-direction: column; + gap: 0.15rem; + min-width: 0; +} + +.p-gallery-manage__title { + margin: 0; + font-size: 1.5rem; + font-weight: 700; + color: #0f172a; + line-height: 1.2; +} + +.p-gallery-manage__subtitle { + margin: 0; + font-size: 0.85rem; + color: #64748b; +} + +.p-gallery-manage__upload-cta { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.65rem 1.25rem; + border-radius: 999px; + background: #f37000; + color: #fff !important; + font-size: 0.9rem; + font-weight: 600; + text-decoration: none !important; + box-shadow: 0 2px 6px rgba(243, 112, 0, 0.25); + transition: + background-color 0.15s ease, + box-shadow 0.15s ease, + transform 0.15s ease; +} + +.p-gallery-manage__upload-cta:hover, +.p-gallery-manage__upload-cta:focus-visible { + background: #d96400; + box-shadow: 0 4px 12px rgba(243, 112, 0, 0.35); + transform: translateY(-1px); + outline: none; +} + +.p-gallery-manage__upload-cta i { + font-size: 1rem; +} + +/* Empty state */ +.p-gallery-manage__empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.75rem; + max-width: 1100px; + margin: 0 auto; + padding: 3rem 1.5rem; + border: 1px dashed #e2e8f0; + border-radius: 1.25rem; + background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%); + text-align: center; +} + +.p-gallery-manage__empty-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 4rem; + height: 4rem; + border-radius: 999px; + background: #fff7ed; + color: #f37000; + font-size: 1.75rem; + margin-bottom: 0.25rem; +} + +.p-gallery-manage__empty-title { + margin: 0; + font-size: 1.25rem; + font-weight: 700; + color: #0f172a; +} + +.p-gallery-manage__empty-text { + margin: 0; + max-width: 32rem; + color: #64748b; + font-size: 0.95rem; + line-height: 1.5; +} + +.p-gallery-manage__empty-btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin-top: 0.75rem; + padding: 0.75rem 1.5rem; + border-radius: 999px; + border: none; + background: #f37000; + color: #fff !important; + font-size: 0.95rem; + font-weight: 600; + font-family: inherit; + text-decoration: none !important; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.3); + cursor: pointer; + transition: + background-color 0.15s ease, + box-shadow 0.15s ease, + transform 0.15s ease; +} + +.p-gallery-manage__empty-btn:hover, +.p-gallery-manage__empty-btn:focus-visible { + background: #d96400; + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.4); + transform: translateY(-1px); + outline: none; +} + +/* ── Gallery upload page ────────────────────────────────── */ +.p-upload-page { + max-width: 880px; + margin: 0 auto 2rem; +} + +.p-upload { + display: flex; + flex-direction: column; + gap: 1.5rem; + padding: 0 1rem; + color: #1f2937; +} + +.p-upload__form { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.p-upload__card { + display: flex; + flex-direction: column; + gap: 1.5rem; + background: #fff; + border-radius: 1.25rem; + border: 1px solid #e5e7eb; + padding: 1.75rem; + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.05); +} + +.p-upload__abstract { + margin: 0; + font-size: 0.875rem; + color: #6b7280; + line-height: 1.6; + padding-bottom: 0.25rem; + border-bottom: 1px solid #f1f5f9; +} + + +/* Album field */ +.p-upload__field { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.p-upload__label { + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #64748b; + margin: 0; +} + +.p-upload__select { + width: 100%; + appearance: none; + background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 8L1 3h10z'/%3E%3C/svg%3E") no-repeat right 0.85rem center; + border: 1px solid #e2e8f0; + border-radius: 0.75rem; + padding: 0.65rem 2.5rem 0.65rem 0.85rem; + font-size: 0.95rem; + font-family: inherit; + color: #1f2937; + line-height: 1.5; + cursor: pointer; + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} + +.p-upload__select:hover { + border-color: #cbd5e1; +} + +.p-upload__select:focus { + outline: none; + border-color: #f37000; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.15); +} + +/* Dropzone */ +.p-upload__dropzone { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.5rem; + min-height: 12rem; + padding: 2.5rem 1.5rem; + border: 2px dashed #e2e8f0; + border-radius: 1.25rem; + background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%); + text-align: center; + cursor: pointer; + transition: + border-color 0.18s ease, + background-color 0.18s ease, + box-shadow 0.18s ease; +} + +.p-upload__dropzone:hover, +.p-upload__dropzone:focus-visible { + border-color: #fed7aa; + background: linear-gradient(135deg, #ffffff 0%, #fff7ed 100%); + outline: none; +} + +.p-upload__dropzone--active { + border-color: #f37000 !important; + background: linear-gradient(135deg, #ffedd5 0%, #ffe4cc 100%) !important; + box-shadow: 0 0 0 6px rgba(243, 112, 0, 0.1); +} + +.p-upload__dropzone-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 3.5rem; + height: 3.5rem; + border-radius: 999px; + background: #fff7ed; + color: #f37000; + font-size: 1.5rem; + margin-bottom: 0.25rem; +} + +.p-upload__dropzone-title { + font-size: 1.1rem; + font-weight: 700; + color: #0f172a; +} + +.p-upload__dropzone-subtitle { + font-size: 0.875rem; + color: #64748b; +} + +.p-upload__file-input { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.p-upload__dropzone-summary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin-top: 0.5rem; + padding: 0.4rem 0.45rem 0.4rem 0.85rem; + border-radius: 999px; + background: #eff6ff; + border: 1px solid #bfdbfe; + color: #1d4ed8; + font-size: 0.85rem; + font-weight: 600; +} + +.p-upload__dropzone-summary i { + color: #2563eb; +} + +.p-upload__dropzone-clear { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.5rem; + height: 1.5rem; + margin: 0; + padding: 0; + border: 0; + border-radius: 999px; + background: #dbeafe; + color: #1d4ed8; + cursor: pointer; + transition: background-color 0.15s ease, color 0.15s ease; +} + +.p-upload__dropzone-clear:hover, +.p-upload__dropzone-clear:focus-visible { + background: #2563eb; + color: #fff; + outline: none; +} + +/* Action buttons */ +.p-upload__actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.65rem; +} + +.p-upload__btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + min-height: 2.75rem; + padding: 0.7rem 1.5rem; + border-radius: 999px; + font-family: inherit; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + text-decoration: none !important; + border: 1px solid transparent; + transition: + background-color 0.15s ease, + border-color 0.15s ease, + box-shadow 0.15s ease, + color 0.15s ease, + transform 0.15s ease; +} + +.p-upload__btn--primary { + background: #f37000; + color: #fff; + box-shadow: 0 2px 8px rgba(243, 112, 0, 0.28); +} + +.p-upload__btn--primary:hover:not(:disabled), +.p-upload__btn--primary:focus-visible:not(:disabled) { + background: #d96400; + box-shadow: 0 4px 14px rgba(243, 112, 0, 0.38); + transform: translateY(-1px); + outline: none; +} + +.p-upload__btn--ghost { + background: #fff; + color: #475569; + border-color: #e2e8f0; +} + +.p-upload__btn--ghost:hover:not(:disabled), +.p-upload__btn--ghost:focus-visible:not(:disabled) { + border-color: #cbd5e1; + background: #f8fafc; + color: #1f2937; + outline: none; +} + +.p-upload__btn:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; + transform: none; +} + +/* Upload queue */ +.p-upload__queue { + display: flex; + flex-direction: column; + gap: 0.75rem; + padding: 1.25rem; + border: 1px solid #eef2f7; + border-radius: 1.25rem; + background: #fff; + box-shadow: + 0 1px 3px rgba(15, 23, 42, 0.04), + 0 4px 12px rgba(15, 23, 42, 0.05); +} + +.p-upload__queue-title { + margin: 0; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #64748b; +} + +.p-upload__queue-list { + display: flex; + flex-direction: column; + gap: 0.65rem; +} + +.p-upload__item { + display: flex; + align-items: center; + gap: 0.85rem; + padding: 0.65rem 0.85rem; + border: 1px solid #eef2f7; + border-radius: 0.85rem; + background: #fff; +} + +.p-upload__item-thumb { + position: relative; + flex-shrink: 0; + width: 56px; + height: 56px; + border-radius: 0.5rem; + overflow: hidden; + background: #f1f5f9; + display: flex; + align-items: center; + justify-content: center; +} + +.p-upload__item-thumb-check { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.38); + color: #4ade80; + font-size: 1.4rem; +} + +.p-upload__item-thumb img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.p-upload__item-thumb--placeholder { + color: #94a3b8; + font-size: 1.25rem; +} + +.p-upload__item-body { + flex: 1 1 auto; + min-width: 0; + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +.p-upload__item-filename { + font-size: 0.85rem; + font-weight: 600; + color: #1f2937; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.p-upload__progress { + position: relative; + width: 100%; + height: 0.5rem; + border-radius: 999px; + background: #f1f5f9; + overflow: hidden; +} + +.p-upload__progress-bar { + position: absolute; + inset: 0; + width: 0; + background: linear-gradient(90deg, #f37000 0%, #fb923c 100%); + transition: width 0.15s linear; +} + +.p-upload__item-message { + font-size: 0.8rem; + font-weight: 500; + margin: 0; +} + +.p-upload__item-message--success { + color: #15803d; +} + +.p-upload__item-message--error { + color: #b91c1c; +} + +.p-upload__item--error { + border-color: #fecaca; + background: #fffafa; +} + +@media (max-width: 720px) { + .p-upload__dropzone { + min-height: 9.5rem; + padding: 2rem 1rem; + } + + .p-upload__dropzone-title { + font-size: 1rem; + } + + .p-upload__actions { + flex-direction: column; + align-items: stretch; + } + + .p-upload__btn { + width: 100%; + } +} + +.p-gallery-manage__panel { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 0.75rem; + background: #fff; + border: 1px solid #e8ecf1; + border-radius: 0.85rem; + box-shadow: 0 1px 4px rgba(15, 23, 42, 0.06); + margin-bottom: 0.75rem; + flex-wrap: wrap; +} + +/* Make div wrappers transparent in the flex flow */ +.p-gallery-manage__panel-row { + display: contents; +} + +/* Select-all toggle */ +.p-gallery-manage__select-all { + display: inline-flex; + align-items: center; + gap: 0.4rem; + margin: 0; + padding: 0.3rem 0.7rem 0.3rem 0.4rem; + border: 1.5px solid #e2e8f0; + border-radius: 999px; + background: #f8fafc; + color: #475569; + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + user-select: none; + white-space: nowrap; + transition: border-color 0.15s ease, background 0.15s ease; +} + +.p-gallery-manage__select-all:hover { + border-color: #f37000; + background: #fff7ed; +} + +.p-gallery-manage__select-all-input { + position: absolute; + width: 1px; height: 1px; + margin: -1px; padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; +} + +.p-gallery-manage__select-all-box { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.1rem; height: 1.1rem; + border: 1.5px solid #cbd5e1; + border-radius: 0.3rem; + background: #fff; + color: transparent; + font-size: 0.6rem; + flex-shrink: 0; + transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease; +} + +.p-gallery-manage__select-all-input:checked ~ .p-gallery-manage__select-all-box { + background: #f37000; + border-color: #f37000; + color: #fff; +} + +.p-gallery-manage__select-all-input:focus-visible ~ .p-gallery-manage__select-all-box { + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.2); +} + +/* Album selector group — fieldset reset */ +.p-gallery-manage__album { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0; + border: 0; + margin: 0; + flex: 1 1 0; + min-width: 0; +} + +/* Each album row = just the input, no border wrapper */ +.p-gallery-manage__album-row { + display: inline-flex; + align-items: center; + flex: 1 1 0; + min-width: 0; + margin: 0; + padding: 0; + border: 0; + background: transparent; +} + +/* Radio buttons hidden — JS auto-selects on interaction */ +.p-gallery-manage__album-radio, +.p-gallery-manage__album-radio-dot { + display: none; +} + +.p-gallery-manage__album-select, +.p-gallery-manage__album-input { + width: 100%; + height: 2rem; + padding: 0 0.65rem; + border: 1.5px solid #e2e8f0; + border-radius: 0.55rem; + background: #f8fafc; + color: #1f2937; + font-family: inherit; + font-size: 0.8125rem; + line-height: 1.2; + outline: none; + transition: border-color 0.15s ease, background 0.15s ease; +} + +.p-gallery-manage__album-select:focus, +.p-gallery-manage__album-input:focus { + border-color: #f37000; + background: #fff; + box-shadow: 0 0 0 3px rgba(243, 112, 0, 0.1); +} + +.p-gallery-manage__album-select { + appearance: none; + cursor: pointer; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2394a3b8' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 0.6rem center; + padding-right: 1.75rem; + background-color: #f8fafc; +} + +.p-gallery-manage__album-input::placeholder { + color: #94a3b8; +} + +/* Action buttons */ +.p-gallery-manage__buttons { + display: flex; + align-items: center; + gap: 0.4rem; + flex: 0 0 auto; +} + +.p-gallery-manage__btn { + display: inline-flex; + align-items: center; + justify-content: center; + height: 2rem; + padding: 0 0.9rem; + border-radius: 0.55rem; + font-family: inherit; + font-size: 0.8125rem; + font-weight: 600; + line-height: 1; + white-space: nowrap; + cursor: pointer; + text-decoration: none !important; + transition: + transform 0.15s ease, + box-shadow 0.15s ease, + background 0.15s ease, + color 0.15s ease, + border-color 0.15s ease; +} + +.p-gallery-manage__btn--primary { + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + border: 1px solid #f37000; + color: #fff; + box-shadow: 0 4px 12px rgba(243, 112, 0, 0.24); +} + +.p-gallery-manage__btn--primary:hover, +.p-gallery-manage__btn--primary:focus-visible { + filter: brightness(1.03); + box-shadow: 0 6px 18px rgba(243, 112, 0, 0.32); + transform: translateY(-1px); + outline: none; + color: #fff; +} + +.p-gallery-manage__btn--danger { + background: linear-gradient(135deg, #f87171 0%, #ef4444 60%, #dc2626 100%); + border: 1px solid #ef4444; + color: #fff; + box-shadow: 0 4px 12px rgba(239, 68, 68, 0.24); +} + +.p-gallery-manage__btn--danger:hover, +.p-gallery-manage__btn--danger:focus-visible { + filter: brightness(1.06); + box-shadow: 0 6px 18px rgba(239, 68, 68, 0.32); + transform: translateY(-1px); + outline: none; + color: #fff; +} + +.p-gallery-manage__btn:disabled, +.p-gallery-manage__btn[disabled] { + cursor: not-allowed; + opacity: 0.5; + filter: none; + box-shadow: none; + transform: none; + pointer-events: none; +} + +/* Gallery grid — shared CSS replacement for Masonry */ +#masonry-grid { + --gallery-grid-gap: 0.875rem; + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: var(--gallery-grid-gap); + margin: 0 !important; + padding: 0 !important; + align-items: stretch; + align-content: start; + justify-content: start; +} + +#masonry-grid > * { + width: auto !important; + max-width: none !important; + min-width: 0 !important; + flex: none !important; + padding: 0 !important; + margin: 0 !important; +} + +#masonry-grid .card { + position: relative; + display: flex; + flex-direction: column; + height: 100%; + border: 1px solid #eef2f7; + border-radius: 0.85rem; + background: #fff; + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.04); + overflow: hidden; + transition: + transform 0.15s ease, + box-shadow 0.15s ease, + border-color 0.15s ease; +} + +#masonry-grid .card:hover { + transform: translateY(-2px); + box-shadow: 0 8px 20px rgba(15, 23, 42, 0.08); + border-color: #e2e8f0; +} + +#masonry-grid .card > a:first-of-type { + display: block; + aspect-ratio: 1; + overflow: hidden; + background: #f8fafc; + padding: 0 !important; +} + +#masonry-grid .card img.img-thumbnail, +#masonry-grid .card img.img-fluid { + width: 100%; + height: 100%; + object-fit: cover; + border: 0; + border-radius: 0; + padding: 0; + background: transparent; +} + +/* Default card-body for public gallery views (title + optional album) */ +#masonry-grid .card-body { + display: flex; + flex-direction: column; + gap: 0.2rem; + padding: 0.55rem 0.7rem !important; + margin: 0 !important; + background: #fff; + border-top: 1px solid #f1f5f9; + line-height: 1.3; +} + +#masonry-grid .card-body .card-title { display: none; } + +#masonry-grid .card-body > a[href*="gallery/img"] { + display: block; + font-size: 0.825rem; + font-weight: 600; + color: #1f2937; + text-decoration: none !important; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: color 0.15s ease; +} + +#masonry-grid .card-body > a[href*="gallery/img"]:hover { + color: #f37000; +} + +#masonry-grid .card-body > a[href*="gallery/show/sets"] { + display: inline-block; + font-size: 0.7rem; + color: #64748b; + text-decoration: none !important; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#masonry-grid .card-body > a[href*="gallery/show/sets"]:hover { + color: #f37000; +} + +/* Pagination shared with gallery pages */ +.p-gallery-manage__grid-wrap > .row { + display: flex; + justify-content: center; + margin: 0 !important; + padding: 0 !important; +} + +.p-gallery-manage__grid-wrap .pagination { + display: inline-flex; + flex-wrap: wrap; + align-items: center; + gap: 0.25rem; + margin: 0 !important; + padding: 0 !important; + list-style: none; + float: none !important; +} + +.p-gallery-manage__grid-wrap .pagination .page-item { + display: inline-block; +} + +.p-gallery-manage__grid-wrap .pagination .page-link { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2rem; + height: 2rem; + padding: 0 0.55rem; + border: 1px solid #e2e8f0; + border-radius: 0.5rem; + background: #fff; + color: #475569; + font-size: 0.85rem; + text-decoration: none !important; + transition: + background-color 0.15s ease, + border-color 0.15s ease, + color 0.15s ease; +} + +.p-gallery-manage__grid-wrap .pagination .page-item.active .page-link { + background: #f37000; + border-color: #f37000; + color: #fff; +} + +.p-gallery-manage__grid-wrap .pagination .page-item.disabled .page-link { + color: #cbd5e1; + background: #f8fafc; + cursor: not-allowed; +} + +.p-gallery-manage__grid-wrap .pagination .page-link:hover { + border-color: #cbd5e1; + background: #f1f5f9; + color: #1f2937; +} + +/* Manage page wrapper for vertical flow */ +.p-gallery-manage__grid-wrap { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.p-gallery-manage__grid-wrap #masonry-grid { + --gallery-grid-gap: 3px; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card { + border: 0; + box-shadow: none; + border-radius: 0.5rem; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card:hover { + transform: none; + box-shadow: none; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card > a:first-of-type { + padding: 0 !important; +} + +/* Hide title bar entirely — checkbox is absolutely positioned so it still shows */ +.p-gallery-manage__grid-wrap #masonry-grid .card-body { + display: none !important; +} + +/* Selection checkbox — top-left overlay on the photo */ +.p-gallery-manage__image-select { + position: absolute; + top: 0.5rem; + left: 0.5rem; + display: inline-flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + margin: 0 !important; + padding: 0; + border-radius: 0.7rem; + cursor: pointer; + z-index: 3; +} + +.p-gallery-manage__image-select-input { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + margin: 0; + opacity: 0; + cursor: pointer; +} + +.p-gallery-manage__image-select-box { + position: relative; + width: 1.35rem; + height: 1.35rem; + border: 2px solid rgba(255, 255, 255, 0.95); + border-radius: 0.45rem; + background: rgba(15, 23, 42, 0.45); + box-shadow: + 0 2px 8px rgba(15, 23, 42, 0.22), + inset 0 0 0 1px rgba(15, 23, 42, 0.08); + transition: + background-color 0.15s ease, + border-color 0.15s ease, + box-shadow 0.15s ease, + transform 0.15s ease; +} + +.p-gallery-manage__image-select-box::after { + content: ""; + position: absolute; + left: 0.38rem; + top: 0.18rem; + width: 0.42rem; + height: 0.72rem; + border: solid #fff; + border-width: 0 2px 2px 0; + opacity: 0; + transform: rotate(45deg) scale(0.8); + transition: + opacity 0.15s ease, + transform 0.15s ease; +} + +.p-gallery-manage__image-select:hover .p-gallery-manage__image-select-box, +.p-gallery-manage__image-select-input:focus-visible + .p-gallery-manage__image-select-box { + background: rgba(15, 23, 42, 0.65); + box-shadow: + 0 3px 10px rgba(15, 23, 42, 0.28), + 0 0 0 3px rgba(243, 112, 0, 0.22); +} + +.p-gallery-manage__image-select-input:checked + .p-gallery-manage__image-select-box { + border-color: #f37000; + background: #f37000; + box-shadow: 0 3px 10px rgba(243, 112, 0, 0.28); + transform: scale(1.03); +} + +.p-gallery-manage__image-select-input:checked + .p-gallery-manage__image-select-box::after { + opacity: 1; + transform: rotate(45deg) scale(1); +} + +/* Photo trigger — whole photo opens the edit sheet in manage mode */ +.p-gallery-manage__photo-trigger { + cursor: pointer; +} + +/* Hide legacy action links — replaced by the sheet */ +.p-gallery-manage__grid-wrap #masonry-grid .card-text { + display: none !important; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card-text small.text-muted { + display: none; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card-text a { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.65rem; + height: 1.65rem; + margin: 0 !important; + padding: 0; + border-radius: 0.4rem; + font-size: 0.7rem; + text-decoration: none !important; + border: 1px solid transparent; + float: none !important; + background: transparent; + color: #64748b; + transition: + background-color 0.15s ease, + border-color 0.15s ease, + color 0.15s ease; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card-text a.btn-outline-primary:hover { + color: #f37000; + border-color: #fed7aa; + background: #fff7ed; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card-text a.btn-danger { + color: #94a3b8; +} + +.p-gallery-manage__grid-wrap #masonry-grid .card-text a.btn-danger:hover { + color: #fff; + background: #ef4444; + border-color: #ef4444; +} + +@media (max-width: 720px) { + .p-gallery-manage__header-main { + flex-direction: column; + align-items: stretch; + } + + .p-gallery-manage__upload-cta { + width: 100%; + justify-content: center; + } + + .p-gallery-manage__title { + font-size: 1.25rem; + } + + .p-gallery-manage__empty { + padding: 2.25rem 1rem; + } + + .p-gallery-manage__empty-btn { + width: 100%; + justify-content: center; + } + + .p-gallery-manage__panel { + padding: 0.5rem 0.6rem; + gap: 0.4rem; + } + + .p-gallery-manage__album { + flex: 1 1 100%; + flex-wrap: wrap; + } + + .p-gallery-manage__album-row { + flex: 1 1 0; + min-width: 8rem; + } + + .p-gallery-manage__buttons { + flex: 1 1 100%; + justify-content: stretch; + } + + .p-gallery-manage__btn { + flex: 1 1 0; + } + + .p-gallery-manage__grid-wrap #masonry-grid { + --gallery-grid-gap: 0.5rem; + grid-template-columns: repeat(3, 1fr); + } +} + +/* ──────────────────────────────────────────────────────────── + Gallery consolidated page — tabs + per-tab content + ──────────────────────────────────────────────────────────── */ + +/* Tab bar — aligned with pagehead */ +.p-gallery-tabs { + display: flex; + max-width: 1100px; + margin: 0 auto 1.25rem; + padding: 0 1rem; + border-bottom: 2px solid #e5e7eb; + gap: 0; +} + +.p-gallery-tab-btn { + display: inline-flex; + align-items: center; + gap: 0.45rem; + padding: 0.75rem 1.25rem; + font-size: 0.875rem; + font-weight: 600; + color: #94a3b8; + background: none; + border: none; + border-bottom: 2.5px solid transparent; + margin-bottom: -2px; + cursor: pointer; + transition: color 0.18s ease, border-color 0.18s ease; + white-space: nowrap; + letter-spacing: 0.01em; +} + +.p-gallery-tab-btn i { + font-size: 0.85rem; + opacity: 0.7; + transition: opacity 0.18s ease; +} + +.p-gallery-tab-btn:hover { + color: #475569; +} + +.p-gallery-tab-btn:hover i { + opacity: 1; +} + +.p-gallery-tab-btn--active { + color: #f37000; + border-bottom-color: #f37000; +} + +.p-gallery-tab-btn--active i { + opacity: 1; +} + +/* Tab panels */ +.p-gallery-tab-panel { + display: none; +} + +.p-gallery-tab-panel--active { + display: block; + animation: galleryTabIn 0.18s ease; +} + +@keyframes galleryTabIn { + from { opacity: 0; transform: translateY(6px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ── Album set sub-view (within Albums tab) ── */ + +.p-gallery-set-view { + max-width: 1100px; + margin: 0 auto; + padding: 0 1rem 1.5rem; +} + +.p-gallery-set-nav { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.25rem 0 0.75rem; + font-size: 0.875rem; + color: #64748b; +} + +.p-gallery-set-nav__back { + display: inline-flex; + align-items: center; + gap: 0.35rem; + color: #f37000; + font-weight: 600; + text-decoration: none; + transition: color 0.15s ease; +} + +.p-gallery-set-nav__back:hover { + color: #d96400; +} + +.p-gallery-set-nav__sep { + color: #cbd5e1; +} + +.p-gallery-set-nav__title { + color: #1e293b; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; +} + +.p-gallery-set-nav__delete { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.4rem; + height: 2.5rem; + padding: 0.55rem 1.1rem; + border: 1px solid #ef4444; + border-radius: 999px; + background: linear-gradient(135deg, #f87171 0%, #ef4444 60%, #dc2626 100%); + color: #fff; + font-size: 0.875rem; + font-weight: 700; + cursor: pointer; + margin-left: auto; + box-shadow: 0 4px 12px rgba(239, 68, 68, 0.24); + transition: filter 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease; +} + +.p-gallery-set-nav__delete:hover { + filter: brightness(1.06); + box-shadow: 0 6px 18px rgba(239, 68, 68, 0.32); + transform: translateY(-1px); + color: #fff; +} + +/* ── Albums tab ── */ + +.p-gallery-albums-wrap { + max-width: 1100px; + margin: 0 auto; + padding: 0 1rem 1.5rem; +} + +/* Override Bootstrap's row/col grid with a modern CSS grid */ +.p-gallery-albums-wrap .row { + display: grid !important; + grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); + gap: 1.1rem; + margin: 0 !important; + padding: 0 !important; + width: auto !important; +} + +/* Flatten the col-* wrappers */ +.p-gallery-albums-wrap .row > [class*="col-"] { + width: 100% !important; + max-width: none !important; + flex: none !important; + padding: 0 !important; + margin: 0 !important; +} + +/* Album card */ +.p-gallery-albums-wrap .gallery_container { + position: relative; + border-radius: 1rem; + overflow: hidden; + background: #fff; + border: 1px solid #eef2f7; + box-shadow: 0 1px 4px rgba(15, 23, 42, 0.05); + transition: + transform 0.15s ease, + box-shadow 0.15s ease, + border-color 0.15s ease; +} + +.p-gallery-albums-wrap .gallery_container:hover { + transform: translateY(-3px); + box-shadow: 0 10px 24px rgba(15, 23, 42, 0.1); + border-color: #e2e8f0; +} + +/* Thumbnail link — forces square aspect ratio */ +.p-gallery-albums-wrap .gallery_container > a:first-child { + display: block; + position: relative; + aspect-ratio: 1; + overflow: hidden; + background: #f1f5f9; + text-decoration: none !important; +} + +/* Override inline styles on the thumbnail img */ +.p-gallery-albums-wrap .gallery_container > a:first-child img { + width: 100% !important; + height: 100% !important; + max-width: none !important; + margin: 0 !important; + object-fit: cover !important; + display: block; + border: 0 !important; +} + +/* Photo count badge — override Bootstrap alert */ +.p-gallery-albums-wrap .gallery_container .alert.alert-info { + position: absolute !important; + top: 0.5rem !important; + right: 0.5rem !important; + left: auto !important; + bottom: auto !important; + display: inline-flex !important; + align-items: center; + gap: 0.25rem; + padding: 0.2rem 0.5rem !important; + margin: 0 !important; + border-radius: 999px !important; + background: rgba(15, 23, 42, 0.55) !important; + backdrop-filter: blur(4px); + color: #fff !important; + font-size: 0.72rem !important; + font-weight: 700 !important; + border: none !important; + line-height: 1 !important; + box-shadow: none !important; +} + +/* Album title row */ +.p-gallery-albums-wrap .gallery_container h4 { + margin: 0; + padding: 0.6rem 0.75rem 0.65rem; + font-size: 0.85rem; + font-weight: 600; + color: #1f2937; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border-top: 1px solid #f1f5f9; +} + +.p-gallery-albums-wrap .gallery_container h4 a { + color: inherit !important; + text-decoration: none !important; + transition: color 0.15s ease; +} + +.p-gallery-albums-wrap .gallery_container h4 a:hover { + color: #f37000 !important; +} + +/* No albums message */ +.p-gallery-albums-wrap > p { + color: #64748b; + font-size: 0.9rem; + text-align: center; + padding: 2rem 0; +} + +/* Pagination inside albums tab */ +.p-gallery-albums-wrap .w-100, +.p-gallery-albums-wrap > .col-12 { + margin-top: 1.25rem; + padding: 0 !important; +} + +.p-gallery-albums-wrap .pagination { + display: inline-flex; + flex-wrap: wrap; + align-items: center; + gap: 0.25rem; + margin: 0 !important; + padding: 0 !important; + list-style: none; + float: none !important; +} + +.p-gallery-albums-wrap .pagination .page-item { + display: inline-block; +} + +.p-gallery-albums-wrap .pagination .page-link { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2rem; + height: 2rem; + padding: 0 0.55rem; + border: 1px solid #e2e8f0; + border-radius: 0.5rem; + background: #fff; + color: #475569; + font-size: 0.85rem; + text-decoration: none !important; + transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease; +} + +.p-gallery-albums-wrap .pagination .page-item.active .page-link { + background: #f37000; + border-color: #f37000; + color: #fff; +} + +.p-gallery-albums-wrap .pagination .page-item.disabled .page-link { + color: #cbd5e1; + background: #f8fafc; + cursor: not-allowed; +} + +.p-gallery-albums-wrap .pagination .page-link:hover { + border-color: #cbd5e1; + background: #f1f5f9; + color: #1f2937; +} + +/* ── Upload tab (inside manage page context) ── */ + +#tab-upload .p-upload { + max-width: 680px; + margin: 0 auto; + padding: 0 1rem 1.5rem; +} + +/* Flatten the card visual inside a tab — no heavy borders needed */ +#tab-upload .p-upload__card { + border-color: #eef2f7; + box-shadow: none; +} + +/* ── Responsive ── */ + +@media (max-width: 640px) { + .p-gallery-tabs { + padding: 0 0.5rem; + } + + .p-gallery-tab-btn { + flex: 1 1 0; + justify-content: center; + padding: 0.65rem 0.5rem; + font-size: 0.8rem; + gap: 0.3rem; + } + + .p-gallery-albums-wrap { + padding: 0 0.75rem 1.5rem; + } + + .p-gallery-albums-wrap .row { + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)) !important; + gap: 0.75rem; + } + + #tab-upload .p-upload { + padding: 0 0.75rem 1.5rem; } } diff --git a/assets/tailwindcss/layouts/_layouts.login.css b/assets/tailwindcss/layouts/_layouts.login.css new file mode 100644 index 000000000..ead6629a0 --- /dev/null +++ b/assets/tailwindcss/layouts/_layouts.login.css @@ -0,0 +1,325 @@ +/* ========================================================= + LOGIN PAGE – centered card, mobile-first + ========================================================= */ + +.p-login__body { + margin: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + background-color: #1f2937; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + background-attachment: fixed; + font-family: Signika, sans-serif; +} + +.p-login__overlay { + position: fixed; + inset: 0; + background: rgba(5, 14, 28, 0.52); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + z-index: 0; + pointer-events: none; +} + +.p-login { + position: relative; + z-index: 1; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 5rem 1rem 3rem; +} + +.p-login__flash { + max-width: 480px; + margin: 0 auto 1rem; +} + +.p-login__shell { + width: 100%; + max-width: 460px; + display: flex; + flex-direction: column; + gap: 1.5rem; + animation: loginShellIn 0.45s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +@keyframes loginShellIn { + from { opacity: 0; transform: translateY(18px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ── Transparent navbar on login page ─────────────────── */ +.p-login__body #main_menu { + background: transparent !important; + box-shadow: none; + position: absolute; + width: 100%; +} + +/* ── Intro (tagline above card) ────────────────────────── */ +.p-login__intro { + text-align: center; + color: #fff; + padding: 0 0.5rem; +} + +.p-login__title { + font-size: 1.875rem; + font-weight: 800; + line-height: 1.2; + margin: 0 0 0.6rem; + letter-spacing: -0.02em; +} + +.p-login__subtitle { + font-size: 1rem; + color: rgba(255, 255, 255, 0.8); + line-height: 1.55; + margin: 0; + font-weight: 400; +} + +/* ── Card ─────────────────────────────────────────────── */ +.p-login__card { + background: rgba(255, 255, 255, 0.97); + border: 1px solid rgba(255, 255, 255, 0.75); + border-radius: 1.75rem; + padding: 2rem 1.85rem 1.75rem; + box-shadow: + 0 2px 4px rgba(15, 23, 42, 0.06), + 0 32px 72px -8px rgba(15, 23, 42, 0.28); + backdrop-filter: blur(24px) saturate(180%); + -webkit-backdrop-filter: blur(24px) saturate(180%); +} + +@supports not (backdrop-filter: blur(1px)) { + .p-login__card { background: #fff; } +} + +.p-login__card-title { + font-size: 1.3rem; + font-weight: 500; + letter-spacing: -0.01em; + color: #d97a2e; + margin: 0 0 1.15rem; + text-align: left; +} + +/* ── Form ─────────────────────────────────────────────── */ +.p-login__form { + display: flex; + flex-direction: column; + gap: 0.875rem; +} + +.p-login__form .o-form-group > label { + font-size: 0.8125rem; + font-weight: 600; + color: #475569; + margin-bottom: 0.375rem; + display: block; +} + +.p-login__form .o-input { + height: 44px; + font-size: 0.9375rem; + border-radius: 0.875rem; + background: #f1f5f9; + border: 1.5px solid transparent; + color: #0f172a; + transition: background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease; +} + +.p-login__form .o-input::placeholder { + color: #94a3b8; +} + +.p-login__form .o-input:focus { + outline: none; + background: #fff; + border-color: #f37000; + box-shadow: 0 0 0 4px rgba(243, 112, 0, 0.13); +} + +/* Password field with toggle */ +.p-login__password { + position: relative; +} + +.p-login__password .o-input { + padding-right: 44px; +} + +.p-login__password-toggle { + position: absolute; + top: 50%; + right: 0.5rem; + transform: translateY(-50%); + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: 0; + border-radius: 0.5rem; + background: transparent; + color: #94a3b8; + cursor: pointer; + transition: color 0.15s ease, background 0.15s ease; +} + +.p-login__password-toggle:hover { + background: #f1f5f9; + color: #475569; +} + +/* Remember-me + forgot-password row */ +.p-login__row { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + margin: 0.25rem 0 0.25rem; +} + +.p-login__row .o-checkbox__label { + font-size: 0.8125rem; + color: #475569; +} + +.p-login__forgot { + font-size: 0.8125rem; + color: #f37000; + text-decoration: none; + font-weight: 500; +} + +.p-login__forgot:hover { + color: #c25a00; + text-decoration: underline; +} + +/* Submit button */ +.p-login__submit { + margin-top: 0.5rem; + border-radius: 999px; + border: none; + background: linear-gradient(135deg, #ff9a2e 0%, #f37000 60%, #e06000 100%); + box-shadow: + 0 4px 14px rgba(243, 112, 0, 0.32), + 0 1px 3px rgba(243, 112, 0, 0.15); + font-weight: 700; + font-size: 1rem; + letter-spacing: 0.01em; + transition: filter 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease; +} + +.p-login__submit:hover, +.p-login__submit:focus { + filter: brightness(1.07); + box-shadow: + 0 6px 20px rgba(243, 112, 0, 0.38), + 0 2px 6px rgba(243, 112, 0, 0.18); + transform: translateY(-1px); +} + +.p-login__submit:active { + transform: translateY(0); + filter: brightness(0.97); +} + +/* ── Help / error messages ────────────────────────────── */ +.p-login__help { + margin-top: 0.5rem; + padding: 0.75rem 0.875rem; + background: #fef2f2; + border: 1px solid #fecaca; + border-radius: 0.625rem; + font-size: 0.8125rem; + color: #7f1d1d; +} + +.p-login__help p { + margin: 0 0 0.4rem; + line-height: 1.5; +} + +.p-login__help p:last-child { + margin-bottom: 0; +} + +.p-login__help a { + color: #b91c1c; + font-weight: 600; + text-decoration: underline; +} + +.p-login__help a:hover { + color: #7f1d1d; +} + +.p-login__error, +.p-login__notice { + font-size: 0.875rem; + border-radius: 0.625rem; + padding: 0.625rem 0.875rem; + margin-bottom: 1rem; +} + +/* ── Separator + signup CTA ───────────────────────────── */ +.p-login__separator { + display: flex; + align-items: center; + gap: 0.75rem; + margin: 1.1rem 0 1rem; + padding-top: 0.9rem; + border-top: 1px solid rgba(15, 23, 42, 0.07); + color: #64748b; + font-size: 0.8125rem; + text-align: center; + justify-content: center; +} + +.p-login__separator::before, +.p-login__separator::after { + content: none; +} + +.p-login__signup { + border-radius: 999px; + height: 44px; + font-size: 0.9375rem; + font-weight: 700; +} + +/* ── Responsive ───────────────────────────────────────── */ +@media (max-width: 540px) { + .p-login { + padding: 1rem 0.75rem 2rem; + } + + .p-login__title { + font-size: 1.375rem; + } + + .p-login__subtitle { + font-size: 0.875rem; + } + + .p-login__card { + padding: 1.5rem 1.25rem; + border-radius: 1rem; + } + + .p-login__card-title { + font-size: 1.25rem; + } +} diff --git a/assets/tailwindcss/layouts/layouts.css b/assets/tailwindcss/layouts/layouts.css index bdc9893a4..f65aeb0bb 100644 --- a/assets/tailwindcss/layouts/layouts.css +++ b/assets/tailwindcss/layouts/layouts.css @@ -1,3 +1,4 @@ @import './_layouts.general.css'; @import './_layouts.search.css'; @import './_layouts.calendar.css'; +@import './_layouts.login.css'; diff --git a/build/gallery/gallery.ctrl.php b/build/gallery/gallery.ctrl.php index ccefbd26b..8a03fbd5b 100644 --- a/build/gallery/gallery.ctrl.php +++ b/build/gallery/gallery.ctrl.php @@ -319,6 +319,14 @@ public function manage() $page->statement = $this->_model->getLatestItems($this->member->id); $page->cnt_pictures = $page->statement ? $page->statement->numRows() : 0; $page->loggedInMember = $this->loggedInMember; + $setId = isset($_GET['set']) ? (int) $_GET['set'] : 0; + if ($setId > 0) { + $set = $this->_model->getGallery($setId); + if ($set && (int) $set->user_id_foreign === (int) $this->member->id) { + $page->activeSet = $set; + $page->setStatement = $this->_model->getLatestItems('', $setId); + } + } return $page; } @@ -591,10 +599,18 @@ public function manageCallback($args, $action, $mem_redirect, $mem_resend) return false; } $vars = $args->post; - $request = $args->request; if (array_key_exists('imageId', $vars)) $mem_redirect->message_gallery = count($vars['imageId']); - return $this->_model->updateGalleryProcess($vars); + $isDelete = isset($vars['deleteOrMove']) && $vars['deleteOrMove'] === 'Delete'; + $result = $this->_model->updateGalleryProcess($vars); + if (!$isDelete && is_string($result)) { + // result is 'gallery/show/sets/{id}' — redirect to manage sub-view instead + $setId = (int) str_replace('gallery/show/sets/', '', $result); + if ($setId > 0) { + return 'gallery/manage?set=' . $setId; + } + } + return 'gallery/manage?tab=photos'; } public function updateGalleryCallback($args, $action, $mem_redirect, $mem_resend) diff --git a/build/gallery/gallery.model.php b/build/gallery/gallery.model.php index 56a594e8e..c84082fcf 100644 --- a/build/gallery/gallery.model.php +++ b/build/gallery/gallery.model.php @@ -389,7 +389,7 @@ public function getLatestItems($userId = false, $galleryId = false, $numRows = f } $query .= '1 = 1'; $query .= ' -ORDER BY `created` DESC +ORDER BY i.`created` DESC '; $s = $this->dao->query($query); diff --git a/build/gallery/pages/gallerymanage.page.php b/build/gallery/pages/gallerymanage.page.php index f70d17d90..e2f3fd518 100644 --- a/build/gallery/pages/gallerymanage.page.php +++ b/build/gallery/pages/gallerymanage.page.php @@ -29,6 +29,17 @@ protected function getSubmenuActiveItem() return 'manage'; } + #[\Override] + protected function getSubmenuItems() + { + return []; + } + + #[\Override] + protected function teaser() + { + } + #[\Override] public function leftSidebar() { @@ -44,6 +55,9 @@ protected function column_col3() { $words = $this->getWords(); $member = $this->loggedInMember; $galleries = $this->galleries; +$backToEditHref = ($this->loggedInMember && $this->loggedInMember->Username) + ? '/members/' . rawurlencode((string) $this->loggedInMember->Username) . '/edit' + : '#'; $mem_redirect = $this->layoutkit->formkit->getMemFromRedirect(); $page_url = PVars::getObj('env')->baseuri . implode('/', PRequest::get()->request); $formkit = $this->layoutkit->formkit; diff --git a/build/gallery/pages/galleryset.page.php b/build/gallery/pages/galleryset.page.php index 19d2ad820..aa2a86391 100644 --- a/build/gallery/pages/galleryset.page.php +++ b/build/gallery/pages/galleryset.page.php @@ -30,51 +30,18 @@ protected function teaserHeadline() { } #[\Override] - protected function teaser() { - ?> -
-
- breadcrumbs()?> -
-
- teaserHeadline()?> -
-
- upload) return 'upload'; - return 'thumbnails'; + return []; } #[\Override] - protected function getSubmenuItems() + protected function getTopmenuActiveItem() { - $username = $this->member->Username; - $member = $this->member; - $gallery = $this->gallery; - $words = $this->getWords(); - $ww = $this->ww; - $wwsilent = $this->wwsilent; - - $tt = []; - $tt[]= ['albums', 'gallery/show/user/'. $username .'/sets', $ww->GalleryTitleSets]; - // $tt[]= array('details', 'gallery/show/sets/'.$gallery->id.'/details/'.$this->page.'', $ww->GalleryDetails); - if ($this->myself) { - $tt[]= ["manage", 'gallery/manage', $ww->GalleryManage, 'manage']; - $tt[]= ["upload", 'gallery/upload_multiple', $ww->GalleryUpload, 'upload']; - $tt[]= ["delete", 'gallery/show/sets/'.$gallery->id.'/delete', $ww->GalleryDelete, 'delete']; - } - return($tt) ; + return 'gallery'; } protected function column_col3() { diff --git a/build/gallery/pages/galleryusergalleries.page.php b/build/gallery/pages/galleryusergalleries.page.php index f9e398b01..5d9834595 100644 --- a/build/gallery/pages/galleryusergalleries.page.php +++ b/build/gallery/pages/galleryusergalleries.page.php @@ -18,6 +18,9 @@ protected function init() $this->addLateLoadScriptFile('build/gallery.js'); } + #[\Override] + protected function teaser() {} + #[\Override] protected function getSubmenuActiveItem() { @@ -42,13 +45,39 @@ public function leftSidebar() #[\Override] protected function column_col3() { + $member = $this->member; $statement = $this->statement; $galleries = $this->galleries; $words = new MOD_words(); ?> -

getFormatted('GalleryTitleSets'); ?>

+ request; $requestStr = implode('/', $request); @@ -13,47 +12,51 @@ } else { $page = 1; } - if (!isset($itemsPerPage)) $itemsPerPage = 12; + if (!isset($itemsPerPage)) $itemsPerPage = 24; $p = PFunctions::paginate($galleries, $page, $itemsPerPage); $galleriesonpage = $p[0]; - - ?> -
+?> +