diff --git a/public/images/private-room/banner.png b/public/images/private-room/banner.png new file mode 100644 index 00000000..dd57cde9 Binary files /dev/null and b/public/images/private-room/banner.png differ diff --git a/src/app/private-room/private-room-screen.module.css b/src/app/private-room/private-room-screen.module.css index ad38acca..c96ee2ec 100644 --- a/src/app/private-room/private-room-screen.module.css +++ b/src/app/private-room/private-room-screen.module.css @@ -2,10 +2,10 @@ position: relative; min-height: var(--app-viewport-height, 100dvh); padding: - calc(var(--app-safe-top, 0px) + clamp(18px, 4.444vw, 24px)) - calc(var(--app-safe-right, 0px) + clamp(18px, 5.185vw, 28px)) + 0 + 0 calc(var(--app-safe-bottom, 0px) + 96px) - calc(var(--app-safe-left, 0px) + clamp(18px, 5.185vw, 28px)); + 0; overflow: hidden auto; background: radial-gradient(circle at 12% 10%, rgba(255, 193, 121, 0.32), transparent 30%), @@ -48,89 +48,74 @@ .hero { display: flex; flex-direction: column; - gap: clamp(14px, 3.333vw, 18px); - padding: clamp(18px, 4.444vw, 24px); - border: 1px solid rgba(255, 116, 159, 0.18); - border-radius: clamp(26px, 6.667vw, 36px); - background: - linear-gradient(135deg, rgba(255, 255, 255, 0.92), rgba(255, 236, 223, 0.8)), - #ffffff; - box-shadow: 0 22px 58px rgba(131, 72, 85, 0.13); + gap: 12px; + margin: 0; animation: riseIn 0.45s ease both; } -.heroTopline { - display: inline-flex; - width: fit-content; - align-items: center; - gap: 8px; - padding: 8px 12px; - border: 1px solid rgba(255, 116, 159, 0.2); - border-radius: 999px; - background: rgba(255, 255, 255, 0.72); - color: #a94c64; - font-size: clamp(11px, 2.593vw, 14px); - font-weight: 780; - letter-spacing: 0.02em; +.heroCover { + position: relative; + min-height: clamp(220px, 66vw, 350px); + overflow: hidden; + background: #f1eeee; + isolation: isolate; } -.liveDot { - width: 8px; - height: 8px; - border-radius: 999px; - background: #ff4f91; - box-shadow: 0 0 0 5px rgba(255, 79, 145, 0.16); +.heroBanner { + position: absolute; + inset: 0; + z-index: 0; + width: 100%; + height: 100%; + object-fit: cover; + transform: scale(1.01); + animation: coverEaseIn 0.75s ease both; } .identity { + position: absolute; + bottom: 14px; + left: calc(var(--app-safe-left, 0px) + clamp(14px, 3.704vw, 20px)); + z-index: 2; display: flex; + width: fit-content; + max-width: calc(100% - var(--app-safe-left, 0px) - var(--app-safe-right, 0px) - clamp(28px, 7.407vw, 40px)); + min-height: 42px; align-items: center; - gap: clamp(14px, 3.704vw, 20px); + gap: 7px; + padding: 5px 10px 5px 5px; + border: 1px solid rgba(255, 255, 255, 0.72); + border-radius: 999px; + background: rgba(255, 255, 255, 0.82); + box-shadow: 0 10px 24px rgba(39, 28, 32, 0.1); + backdrop-filter: blur(16px); + animation: riseIn 0.45s ease both; + animation-delay: 80ms; } .avatarFrame { display: grid; - width: clamp(68px, 16.667vw, 90px); - height: clamp(68px, 16.667vw, 90px); + width: 32px; + height: 32px; flex: 0 0 auto; place-items: center; - border: 3px solid rgba(255, 255, 255, 0.92); + border: 2px solid rgba(255, 255, 255, 0.92); border-radius: 9999px; background: linear-gradient(145deg, #ffb36d, #ff5d95); - box-shadow: 0 16px 34px rgba(255, 95, 128, 0.23); + box-shadow: 0 6px 14px rgba(131, 72, 85, 0.12); overflow: hidden; } -.identityText { +.identityName { min-width: 0; -} - -.title { margin: 0; - color: #201417; - font-size: clamp(24px, 6.667vw, 36px); - font-weight: 920; - letter-spacing: -0.04em; - line-height: 0.95; -} - -.handle, -.bio { - color: #755f66; -} - -.handle { - margin: 7px 0 0; - font-size: clamp(13px, 3.148vw, 17px); - font-weight: 720; -} - -.bio { - max-width: 360px; - margin: 0; - font-size: clamp(14px, 3.333vw, 18px); - font-weight: 620; - line-height: 1.55; + overflow: hidden; + color: #33282b; + font-size: clamp(11px, 2.963vw, 14px); + font-weight: 760; + line-height: 1.2; + text-overflow: ellipsis; + white-space: nowrap; } .primaryCta, @@ -149,15 +134,33 @@ } .primaryCta { - padding: 0 18px; - background: linear-gradient(135deg, #262026, #7f5861); + width: auto; + margin: + 0 + calc(var(--app-safe-right, 0px) + clamp(18px, 5.185vw, 28px)) + 0 + calc(var(--app-safe-left, 0px) + clamp(18px, 5.185vw, 28px)); + min-height: 40px; + padding: 0 16px; + background: linear-gradient(135deg, #928e89, #72706c); color: #ffffff; - font-size: clamp(13px, 3.148vw, 16px); - box-shadow: 0 14px 30px rgba(47, 35, 40, 0.18); + font-size: clamp(12px, 3.148vw, 15px); + box-shadow: 0 10px 22px rgba(47, 35, 40, 0.12); +} + +.primaryCta span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .postsSection { - margin-top: clamp(18px, 4.815vw, 26px); + margin-top: clamp(20px, 5.185vw, 28px); + padding: + 0 + calc(var(--app-safe-right, 0px) + clamp(18px, 5.185vw, 28px)) + 0 + calc(var(--app-safe-left, 0px) + clamp(18px, 5.185vw, 28px)); } .sectionHeader { @@ -501,3 +504,15 @@ transform: translateY(0); } } + +@keyframes coverEaseIn { + from { + opacity: 0.82; + transform: scale(1.05); + } + + to { + opacity: 1; + transform: scale(1.01); + } +} diff --git a/src/app/private-room/private-room-screen.tsx b/src/app/private-room/private-room-screen.tsx index 7b1a88ba..4b370274 100644 --- a/src/app/private-room/private-room-screen.tsx +++ b/src/app/private-room/private-room-screen.tsx @@ -1,7 +1,8 @@ "use client"; import { useMemo } from "react"; -import { RefreshCw, Sparkles } from "lucide-react"; +import Image from "next/image"; +import { RefreshCw } from "lucide-react"; import { CharacterAvatar } from "@/app/_components"; import { AppBottomNav, MobileShell } from "@/app/_components/core"; @@ -32,7 +33,6 @@ const FALLBACK_PROFILE = { avatar: "/images/chat/pic-chat-elio.png", title: "Elio Private room", subtitle: "Join me, unlock my private room", - bio: "Soft moments, private photos, and a little sweetness just for you.", } as const; export function PrivateRoomScreen() { @@ -85,40 +85,39 @@ export function PrivateRoomScreen() {
-
-
-
+
+
+ -
-
- -
+
+
+ +
-
-

- {displayName} -

-

{title}

+

{displayName}

-

{subtitle || FALLBACK_PROFILE.bio}

-