diff --git a/index.html b/index.html
index 34e08ff..fb8a614 100644
--- a/index.html
+++ b/index.html
@@ -1,37 +1,36 @@
-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
- The Hideout
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ The Hideout
+
+
+
+
+
+
diff --git a/src/global.css b/src/global.css
new file mode 100644
index 0000000..7059075
--- /dev/null
+++ b/src/global.css
@@ -0,0 +1,1292 @@
+* {
+ font-family: "SF-Pro-Rounded";
+ box-sizing: border-box;
+}
+
+/* Improve scrolling performance */
+.th-app-container,
+.th-page-wrapper,
+.th-page-container {
+ will-change: transform;
+ transform: translateZ(0); /* Force hardware acceleration */
+}
+
+.th-app-container-locked {
+ overflow: hidden;
+}
+
+.th-sub-page-wrapper {
+ padding-right: var(--th-images-width);
+}
+
+.th-hidden {
+ opacity: 0;
+}
+
+body,
+html {
+ height: 100%;
+ touch-action: pan-y; /* Allow vertical scrolling */
+}
+
+body {
+ overflow: hidden;
+}
+
+.th-root {
+ height: var(--unit-100vh);
+ overflow: hidden;
+}
+body.th-body-bg {
+ transition: background-color 0.5s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+p,
+span,
+label,
+input,
+textarea {
+ font-weight: 500;
+ font-size: 14px;
+ line-height: 1;
+ letter-spacing: 0.04em;
+}
+
+:root {
+ --unit-100vh: 100vh;
+ --th-images-width: 45vw;
+ --th-page-padding: 70px;
+ --th-page-mobile-padding: 30px;
+}
+@supports (height: 100dvh) {
+ :root {
+ --unit-100vh: 100dvh;
+ }
+}
+
+.th-title:first-child {
+ margin-top: 0;
+}
+
+h1.th-title,
+h1.th-title a span,
+h2.th-title,
+h2.th-title a span {
+ font-family: "Libre Baskerville", serif;
+ font-weight: 400;
+ font-style: normal;
+ font-weight: "bold";
+ text-align: left;
+ margin: 0.09em 0;
+}
+
+h1.th-title,
+h1.th-title a span {
+ font-size: 3em;
+ line-height: 52px;
+}
+
+h2.th-title,
+h2.th-title a span {
+ margin-bottom: 0;
+ margin-top: 0.5em;
+ font-size: 2.5em;
+}
+
+h3.th-title,
+h3.th-title a span {
+ font-family: "Libre Baskerville", serif;
+ font-size: 1em;
+ margin-bottom: 0;
+ margin-top: 0.5em;
+ font-weight: 600;
+}
+
+h4.th-title,
+h4.th-title a span {
+ font-size: 1.25em;
+ margin-bottom: 0;
+ margin-top: 0.5em;
+}
+
+@media (max-width: 600px) {
+ h1.th-title,
+ h1.th-title a span {
+ font-size: 2.5em; /* Adjust as needed */
+ line-height: 46px;
+ }
+
+ h2.th-title,
+ h2.th-title a {
+ font-size: 1.5em; /* Adjust as needed */
+ }
+}
+
+.th-title i {
+ font-family: "Libre Baskerville", serif;
+ font-weight: 400;
+ font-style: italic;
+}
+
+p.th-paragraph,
+ul.th-list,
+ol.th-list {
+ margin: 7.5px 0;
+}
+
+ul.th-list,
+ol.th-list {
+ padding-left: 22.5px;
+}
+
+/* Icon after the text */
+a.th-link .th-link-icon {
+ fill: var(--th-textColor);
+}
+
+a.th-link .th-link-icon > svg {
+ width: 8px;
+}
+/* Link styling */
+a.th-link {
+ color: unset;
+ display: inline-flex;
+ align-items: center;
+ gap: 5px; /* space between text and icon */
+ text-decoration: none;
+}
+
+/* Text wrapper for underline */
+a.th-link .th-link-text {
+ position: relative;
+ display: inline-block;
+}
+
+/* Base underline (50% opacity) */
+a.th-link .th-link-text::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ bottom: -2px;
+ height: 2px;
+ width: 100%;
+ background-color: var(--th-textColor);
+ opacity: 0.15;
+ border-radius: 1px;
+}
+
+/* Hover underline (100% opacity, animates from left to right) */
+a.th-link .th-link-text::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ bottom: -2px;
+ height: 2px;
+ width: 0;
+ background-color: var(--th-textColor);
+ opacity: 1;
+ border-radius: 1px;
+ transition: width 0.3s ease;
+}
+
+/* Animate hover underline */
+a.th-link:hover .th-link-text::after {
+ width: 100%;
+}
+/* Keep underline on active item */
+.th-menu-nav-item-active a.th-link .th-link-text::after {
+ width: 100%;
+}
+
+.th-menu-nav-item:hover::after {
+ width: 100%;
+}
+
+.th-menu-nav-item-active::after {
+ width: 100%;
+}
+
+label.th-form-label {
+ text-transform: lowercase;
+}
+
+hr.th-divider {
+ width: 100px;
+ height: 2px;
+ min-height: 2px;
+ border: none;
+ border-radius: 1px;
+ background-color: var(--th-textColor);
+ margin: 1em 0;
+}
+
+.th-inline-emoji {
+ height: 1.25em;
+ vertical-align: middle;
+ display: inline;
+ width: auto;
+ fill: var(--th-textColor);
+}
+
+.th-loading-modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: var(--unit-100vh);
+ background-color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0;
+ visibility: hidden;
+ transition: opacity 0.5s ease, visibility 0.5s ease;
+ z-index: 9999;
+}
+
+.th-loading-modal-visible {
+ opacity: 1;
+ visibility: visible;
+}
+
+.th-loading-modal-hidden {
+ opacity: 0;
+ visibility: hidden;
+}
+
+.th-loading-logo {
+ width: 200px;
+ display: block;
+ margin: 0 auto;
+ animation: scale-pulse 2s infinite ease-in-out;
+ transform-origin: center center;
+}
+
+@keyframes scale-pulse {
+ 0% {
+ transform: scale(1);
+ }
+ 50% {
+ transform: scale(1.2);
+ }
+ 100% {
+ transform: scale(1);
+ }
+}
+
+/* Page component styles */
+.th-page-wrapper {
+ height: var(--unit-100vh);
+ width: 100%;
+ padding-right: var(--th-images-width);
+ scroll-snap-align: start;
+ scroll-snap-stop: normal;
+ /* Allow react-scroll to handle smooth transitions */
+}
+
+.th-page-wrapper-mobile {
+ padding-right: 0;
+}
+
+.th-page-container {
+ height: var(--unit-100vh);
+ width: 100%;
+ gap: 25px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+}
+
+.th-page-content {
+ flex: 0 0 0%;
+ flex-grow: 3;
+ padding: 0 var(--th-page-padding);
+ margin: 0;
+ height: 100%; /* Use fixed height instead of min-height */
+ min-height: 0;
+ width: 100%;
+ color: var(--th-textColor);
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ text-align: left;
+ transition: opacity 0.3s ease-in-out;
+}
+
+.th-content-scroll {
+ height: 100%;
+ width: 100%;
+ flex: 1 1 auto;
+}
+
+.simplebar-scrollbar:before {
+ background: var(--th-textColor);
+}
+
+.simplebar-track.simplebar-vertical {
+ width: 6px;
+}
+
+.simplebar-scrollbar.simplebar-visible:before {
+ opacity: 1;
+}
+
+/* Ensure Simplebar fills and scrolls correctly */
+.th-content-scroll .simplebar-content-wrapper {
+ height: 100%;
+ overflow-y: auto;
+}
+
+.th-content-scroll .simplebar-content {
+ min-height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.th-page-content-mobile {
+ padding: var(--th-page-mobile-padding);
+ padding-bottom: 0;
+}
+
+.th-page-content:last-child {
+ padding-bottom: var(--th-page-padding);
+}
+
+.th-page-content-mobile:last-child {
+ padding-bottom: var(--th-page-mobile-padding);
+}
+
+.th-page-content-hidden {
+ opacity: 0;
+}
+
+.th-scroll-icon-text {
+ color: var(--th-textColor);
+}
+
+.th-menu-page {
+ background-color: var(--th-backgroundColor);
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: var(--unit-100vh);
+ padding-right: var(--th-images-width);
+}
+
+.th-mobile-menu-page {
+ padding-right: 0;
+}
+
+.th-menu-page-container {
+ padding: var(--th-page-padding);
+}
+
+.th-menu-nav {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ text-align: end;
+}
+
+.th-menu-nav-item {
+ border: none;
+ padding: 0.25em 0;
+ font-size: 2.5em;
+ text-transform: lowercase;
+ background: none;
+ font-family: "Libre Baskerville", serif;
+ font-weight: 500;
+ color: var(--th-textColor);
+ position: relative; /* Needed for pseudo-element positioning */
+ cursor: pointer;
+}
+
+.th-menu-nav-item::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ bottom: 13px;
+ height: 2px;
+ width: 0;
+ background-color: var(--th-textColor);
+ border-radius: 1px;
+ transition: width 0.3s ease;
+}
+
+.th-menu-nav-item:hover::after {
+ width: 100%;
+}
+
+.th-menu-nav-item-active::after {
+ width: 100%;
+}
+
+.menu-icon {
+ cursor: pointer;
+ width: 64px;
+ height: 64px;
+}
+
+.th-line {
+ transition: transform 0.4s ease, opacity 0.4s ease;
+ transform-origin: 32px 32px; /* Center of SVG */
+}
+
+.th-menu-icon.th-menu-icon-open .line1 {
+ transform: rotate(45deg) translate(0px, 0px);
+}
+
+.th-menu-icon.th-menu-icon-open .line2 {
+ opacity: 0;
+}
+
+.th-menu-icon.th-menu-icon-open .line3 {
+ transform: rotate(-45deg) translate(0px, 0px);
+}
+
+.th-mobile-menu-page-container {
+ padding: var(--th-page-mobile-padding);
+}
+
+/* ContentRenderer component styles */
+.th-content-default {
+ font-size: 1.2rem;
+ max-width: 600px;
+}
+
+.th-content-container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ justify-content: center;
+ align-items: flex-start;
+}
+
+.th-content-container-mobile-image {
+ justify-content: start;
+}
+
+.th-content-container-wrapper {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ flex-grow: 1;
+}
+
+.th-content-container-wrapper-scroll {
+ padding-right: 20px;
+}
+
+/* App component styles */
+.th-app-container {
+ height: var(--unit-100vh);
+ overflow-y: auto;
+ scroll-snap-type: y mandatory;
+ /* Let react-scroll handle smooth scrolling */
+ -webkit-overflow-scrolling: touch; /* Smooth scrolling on iOS */
+ scrollbar-width: none; /* Hide scrollbar on Firefox */
+ -ms-overflow-style: none; /* Hide scrollbar on IE/Edge */
+ width: 100%;
+}
+
+/* Hide scrollbar on WebKit browsers */
+.th-app-container::-webkit-scrollbar {
+ display: none;
+}
+
+.th-loading-container {
+ height: var(--unit-100vh);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.th-error-container {
+ height: var(--unit-100vh);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+}
+
+/* Images Sidebar Styles - Floating Overlay */
+.th-images-sidebar {
+ position: fixed;
+ top: 0;
+ right: 0;
+ width: var(--th-images-width);
+ height: var(--unit-100vh);
+ background: rgba(248, 249, 250, 0.95);
+ z-index: 1000;
+ pointer-events: none;
+}
+
+.th-images-sidebar::-webkit-scrollbar {
+ display: none;
+}
+
+.th-images-container {
+ display: flex;
+ flex-direction: column;
+ height: var(--unit-100vh);
+ transition: opacity 0.5s ease-in-out;
+ opacity: 1;
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 100%;
+}
+
+/* Grid layouts for different numbers of images */
+.th-single-image-grid {
+ display: grid;
+ grid-template-columns: 1fr;
+ grid-template-rows: 1fr;
+ height: var(--unit-100vh);
+}
+
+.th-two-images-grid {
+ display: grid;
+ grid-template-columns: 1fr;
+ grid-template-rows: 1fr 1fr;
+ height: var(--unit-100vh);
+}
+
+.th-three-images-grid {
+ display: grid;
+ grid-template-columns: 1fr;
+ grid-template-rows: 1fr 1fr 1fr;
+ height: var(--unit-100vh);
+}
+
+.th-four-images-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-template-rows: 1fr 1fr;
+ height: var(--unit-100vh);
+}
+
+.th-multiple-images-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-template-rows: repeat(auto-fit, minmax(20vh, 1fr));
+ height: var(--unit-100vh);
+ gap: 2px;
+}
+
+.th-image-wrapper {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ position: relative;
+}
+
+.th-image-carousel {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+
+.th-carousel-image-wrapper {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ transition: opacity 1s ease-in-out;
+}
+
+.th-carousel-image-wrapper.th-active {
+ opacity: 1;
+ z-index: 1;
+}
+
+.th-carousel-image-wrapper.th-hidden {
+ opacity: 0;
+ z-index: 0;
+}
+
+.th-carousel-image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.th-single-image-wrapper {
+ width: 100%;
+ height: var(--unit-100vh);
+ overflow: hidden;
+}
+
+.th-sidebar-image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.th-no-images {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ padding: 20px;
+ grid-column: 1 / -1;
+ grid-row: 1 / -1;
+}
+
+/* Header Logo Styles */
+.th-header-logo {
+ position: relative;
+ display: inline-block;
+}
+
+.th-logo-image {
+ width: auto;
+ opacity: 1;
+ transition: opacity 0.3s ease-in-out;
+}
+
+.th-logo-image svg {
+ fill: var(--th-textColor);
+ height: 45px;
+ display: block;
+ width: auto;
+}
+
+.th-logo-image-large svg {
+ height: 120px;
+}
+
+.th-logo-image-large-mobile svg {
+ height: 75px;
+}
+
+/* Utility classes */
+.th-logo-image-hidden {
+ opacity: 0;
+}
+
+.th-header {
+ width: 100%;
+ display: flex;
+ margin-top: var(--th-page-padding);
+ padding-left: var(--th-page-padding);
+ padding-right: var(--th-page-padding);
+ justify-content: space-between;
+ align-items: center;
+ transition: opacity 0.3s ease-in-out;
+ opacity: 1;
+}
+
+.th-menu-header {
+ align-items: center;
+ justify-content: end;
+ height: 45px;
+}
+
+.th-header-mobile {
+ margin-top: var(--th-page-mobile-padding);
+ padding-left: var(--th-page-mobile-padding);
+ padding-right: var(--th-page-mobile-padding);
+}
+
+.th-header-float {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 9;
+}
+
+.th-page-mobile-image-wrapper > .th-top-gradient {
+ position: absolute;
+ inset: 0;
+ z-index: 2;
+ opacity: 1;
+ height: 160px;
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
+ -webkit-mask-image: linear-gradient(
+ to bottom,
+ rgba(0, 0, 0, 1),
+ rgba(0, 0, 0, 0)
+ );
+ transition: opacity 0.01s;
+}
+
+.th-page-mobile-image-wrapper > .th-top-gradient.refresh {
+ opacity: 0.9998;
+}
+
+.th-header-hidden {
+ opacity: 0;
+}
+
+.th-header-button {
+ background: none;
+ border: none;
+ width: 48px;
+ height: 48px;
+ padding: 0;
+ z-index: 99;
+ cursor: pointer;
+}
+
+.th-header-button-menu {
+ width: unset;
+}
+
+.th-header-button > svg {
+ width: 16px;
+ stroke: var(--th-textColor);
+ transition: width 0.3s ease;
+}
+
+.th-header-button:hover > svg {
+ width: 18px;
+}
+.th-scroll-icon-wrapper {
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ column-gap: 15px;
+ width: 100%;
+ padding: var(--th-page-padding);
+ padding-top: 0;
+ transition: opacity 0.3s ease-in-out;
+}
+
+.th-scroll-icon-wrapper-mobile {
+ padding: var(--th-page-mobile-padding);
+}
+
+.th-scroll-icon-text {
+ margin: 0;
+ font-weight: 400;
+ letter-spacing: 3px;
+ font-size: 0.8em;
+}
+
+.th-page-mobile-image-wrapper {
+ width: 100%;
+ flex-grow: 2;
+ flex-shrink: 1;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden; /* Prevent overflow */
+ border-bottom: 1px solid var(--th-textColor);
+ transition: opacity 0.3s ease-in-out,
+ max-height 0.75s cubic-bezier(0, 0.5, 0.5, 1),
+ min-height 0.75s cubic-bezier(0, 0.5, 0.5, 1);
+ opacity: 1;
+ min-height: 260px;
+ max-height: 260px;
+}
+
+.th-page-mobile-image-wrapper-hidden {
+ opacity: 0;
+}
+
+.th-page-mobile-image-wrapper-shrunk {
+ min-height: 110px;
+ max-height: 110px;
+}
+
+.th-mobile-image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover; /* Scale image to fit both width and height */
+ display: block;
+ max-width: 100%;
+ max-height: 100%;
+}
+
+/* Image component styles */
+.th-image-container {
+ position: relative;
+}
+
+.th-image-blurhash {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ filter: blur(0px); /* Blurhash is already blurred */
+}
+
+.th-image-content {
+ position: absolute;
+ top: 0;
+ left: 0;
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+ transition: opacity 0.3s ease-in-out, height 0.5s, width 0.5s;
+ opacity: 1;
+}
+
+.th-image-error {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ padding: 20px;
+}
+
+.th-image-loading {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ padding: 20px;
+}
+
+.th-images-container-hidden {
+ opacity: 0;
+ position: absolute;
+}
+
+/* App component styles */
+
+.th-page-container-mobile {
+ gap: 0;
+}
+
+/* Mobile overlay styles */
+.th-mobile-overlay {
+ background-color: black;
+ position: float;
+ top: var(--100vh);
+ left: 0;
+ width: 100vw;
+ height: calc(100vh - var(--100vh));
+}
+
+/* CacheReloadView component styles */
+.tbview {
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 5px 25px;
+ padding-bottom: 10px;
+}
+
+.tbcard-mobile {
+ width: 100% !important;
+ height: 100% !important;
+ display: flex !important;
+ flex-direction: column !important;
+}
+
+.tbcard-desktop {
+ width: 70% !important;
+ height: 70% !important;
+ display: flex !important;
+ flex-direction: column !important;
+}
+
+.tb-loading-container {
+ padding: 20px;
+}
+
+.tb-loading-icon {
+ font-size: 48px;
+ color: white;
+}
+
+/* PropertyCards.css */
+.th-property-cards-container {
+ position: relative;
+ width: 100%;
+ overflow: hidden; /* hides scrollbar outside container */
+ padding: 1em 0 0 0;
+ flex-grow: 1;
+}
+
+.th-property-cards {
+ overflow-x: auto;
+ scroll-behavior: smooth;
+ scroll-snap-type: x mandatory;
+ -webkit-overflow-scrolling: touch; /* smooth scrolling on iOS */
+ display: flex;
+ flex-wrap: nowrap; /* prevent wrapping */
+ gap: 5px;
+ position: relative;
+ height: 100%;
+}
+
+.th-property-card {
+ flex: 0 0 auto; /* prevent shrinking */
+ width: 40vh; /* fixed width */
+ height: 100%;
+ border: 1px solid var(--th-textColor);
+ border-radius: 10px;
+ scroll-snap-align: start; /* align each card when scrolling */
+ background-color: var(--th-backgroundColor);
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ transition: transform 0.25s ease, box-shadow 0.25s ease;
+}
+
+.th-property-card-wrapper {
+ padding: 7px;
+}
+
+.th-property-card:hover {
+ transform: scale(1.03);
+}
+
+.th-property-card-content {
+ padding: 15px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.th-property-card-image-wrapper {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+
+.th-property-card-image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ border-bottom: 1px solid var(--th-textColor);
+}
+
+.th-property-card-placeholder-image {
+ width: 100%;
+ height: 200px;
+ background-color: #eee;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 10px;
+ color: #666;
+}
+
+.th-property-card-title {
+ font-family: "Libre Baskerville", serif;
+ font-weight: 400;
+ text-transform: lowercase;
+ font-size: 1.2rem;
+ margin: 0;
+}
+
+.th-property-card-address {
+ text-transform: lowercase;
+ font-size: 14px;
+ margin: 0;
+}
+
+.th-features-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ font-size: 14px;
+ margin: 0.75em 0;
+ margin-top: 0.25em;
+ max-width: 600px;
+ /* Force 2 rows with horizontal scroll if needed */
+ overflow: hidden;
+ position: relative;
+ align-items: center;
+}
+
+.th-features-listItem {
+ background-color: var(--th-textColor);
+ color: var(--th-backgroundColor);
+ padding: 4px 8px;
+ border-radius: 15px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: lowercase;
+}
+
+.th-features-overflow-counter {
+ background-color: transparent;
+ color: var(--th-textColor);
+ font-weight: 700;
+ position: relative;
+ display: flex;
+ align-items: center;
+ opacity: 0.8;
+ padding: 0;
+ padding-left: 1px;
+}
+
+.th-property-card .th-features-list {
+ margin: 0;
+ margin-top: 5px;
+}
+
+.th-scroll-btn {
+ font-family: "Libre Baskerville", serif;
+ font-weight: 400;
+ position: absolute;
+ top: 50%;
+ font-size: 16px;
+ transform: translateY(-50%);
+ border: 1px solid var(--th-textColor);
+ backdrop-filter: blur(5px);
+ background-color: color-mix(
+ in srgb,
+ var(--th-backgroundColor) 50%,
+ transparent
+ );
+ font-size: 2rem;
+ cursor: pointer;
+ z-index: 10;
+ padding: 0;
+ width: 35px;
+ height: 35px;
+ line-height: 0.1px;
+ border-radius: 50%;
+ transition: background-color 0.2s ease, transform 0.2s ease;
+}
+
+.th-scroll-btn:hover {
+ background-color: color-mix(
+ in srgb,
+ var(--th-backgroundColor) 75%,
+ transparent
+ );
+ transform: translateY(-50%) scale(1.075);
+}
+
+.th-scroll-btn.th-left {
+ left: 10px;
+}
+
+.th-scroll-btn.th-right {
+ right: 10px;
+}
+
+/* Optional: hide scrollbar but keep scrolling functional */
+.th-property-cards::-webkit-scrollbar {
+ display: none;
+}
+
+.th-property-cards {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+.th-property-cards-gradient {
+ position: absolute;
+ width: 70px;
+ z-index: 9;
+ transition: opacity 0.2s ease;
+}
+
+.th-property-cards-gradient-left {
+ top: 0;
+ left: 0;
+ bottom: 0;
+ background: linear-gradient(90deg, var(--th-backgroundColor), transparent);
+}
+
+.th-property-cards-gradient-right {
+ top: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(90deg, transparent, var(--th-backgroundColor));
+}
+
+p.th-property-address {
+ font-weight: 600;
+}
+
+.th-property-specs {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1em;
+ margin-top: 0.25em;
+ margin-bottom: 0.75em;
+}
+
+.th-property-specs > p {
+ margin: 0;
+ font-weight: 600;
+}
+
+.th-property-specs > .th-features-list {
+ margin: 0;
+}
+
+.th-property-specs span {
+ font-family: "Libre Baskerville", serif;
+ font-weight: 600;
+}
+
+.th-button {
+ padding: 5px 10px;
+ background-color: var(--th-backgroundColor);
+ color: var(--th-textColor);
+ fill: var(--th-textColor);
+ border: 1px solid var(--th-textColor);
+ border-radius: 10px;
+ transition: background-color 0.3s ease, color 0.3s ease, fill 0.3s ease;
+ display: inline-flex;
+ align-items: center;
+ text-transform: lowercase;
+ margin: 0.74em 0;
+ line-height: 1;
+ font-weight: 500;
+ min-height: 30px;
+}
+
+.th-button:disabled {
+ opacity: 0.5;
+}
+
+.th-button img {
+ width: 24px;
+ margin-right: 24px;
+}
+
+.th-button > .th-icon,
+.th-button > svg {
+ fill: var(--th-textColor);
+ stroke: var(--th-textColor);
+ height: 16px;
+ width: auto;
+ margin-right: 4px;
+}
+
+.th-button:not(:disabled):hover {
+ background-color: var(--th-textColor);
+ color: var(--th-backgroundColor);
+}
+
+.th-button:not(:disabled):hover > .th-icon,
+.th-button:not(:disabled):hover > svg {
+ fill: var(--th-backgroundColor);
+ stroke: var(--th-backgroundColor);
+}
+
+.th-booking-buttons {
+ display: flex;
+ gap: 15px;
+ margin-top: 5px;
+}
+
+.th-mobile-booking-buttons {
+ width: 100%;
+}
+
+.th-booking-buttons > button {
+ background: none;
+ border-radius: 8px;
+ padding: 8px 12px;
+ font-weight: 500;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-grow: 1;
+ cursor: pointer;
+ transition: background-color 0.3s ease, color 0.3s ease;
+}
+
+.th-booking-buttons > button > svg {
+ display: inline-block;
+ height: 18px;
+ width: auto;
+ margin-right: 8px;
+}
+
+.th-airbnb-button {
+ border: 1px solid #ff385c;
+ color: #ff385c;
+ fill: #ff385c;
+}
+
+.th-airbnb-button:hover {
+ background-color: #ff385c;
+ color: white;
+ fill: white;
+}
+
+.th-bookingcom-button {
+ border: 1px solid #003b95;
+ color: #003b95;
+ fill: #003b95;
+}
+
+.th-bookingcom-button:hover {
+ background-color: #003b95;
+ color: white;
+ fill: white;
+}
+
+.th-contact-form-wrapper {
+ width: 100%;
+}
+
+.th-form {
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+ margin: 0.75em 0;
+ width: 100%;
+}
+
+.th-form-input:focus {
+ outline: none; /* Removes the default outline */
+ box-shadow: none; /* Removes Chrome's blue glow */
+}
+
+.th-form-input {
+ border: 1px solid var(--th-textColor);
+ border-radius: 8px;
+ padding: 5px 10px;
+ max-width: 400px;
+ min-width: 0;
+}
+
+.th-form-input:disabled {
+ opacity: 0.5;
+}
+
+.th-form-actions {
+ display: flex;
+ gap: 15px;
+ align-items: center;
+}
+
+.th-form-actions > .th-button {
+ margin: 0;
+}
+
+.th-form-actions > .th-form-error {
+ margin: 0;
+ border: 1px solid #ff42457d;
+ padding: 3px 6px;
+ color: #ff4245;
+ border-radius: 12px;
+ font-size: 12px;
+ text-transform: lowercase;
+}