style(private-room): redesign hero banner
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 2.5 MiB |
@@ -2,10 +2,10 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
min-height: var(--app-viewport-height, 100dvh);
|
min-height: var(--app-viewport-height, 100dvh);
|
||||||
padding:
|
padding:
|
||||||
calc(var(--app-safe-top, 0px) + clamp(18px, 4.444vw, 24px))
|
0
|
||||||
calc(var(--app-safe-right, 0px) + clamp(18px, 5.185vw, 28px))
|
0
|
||||||
calc(var(--app-safe-bottom, 0px) + 96px)
|
calc(var(--app-safe-bottom, 0px) + 96px)
|
||||||
calc(var(--app-safe-left, 0px) + clamp(18px, 5.185vw, 28px));
|
0;
|
||||||
overflow: hidden auto;
|
overflow: hidden auto;
|
||||||
background:
|
background:
|
||||||
radial-gradient(circle at 12% 10%, rgba(255, 193, 121, 0.32), transparent 30%),
|
radial-gradient(circle at 12% 10%, rgba(255, 193, 121, 0.32), transparent 30%),
|
||||||
@@ -48,89 +48,74 @@
|
|||||||
.hero {
|
.hero {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: clamp(14px, 3.333vw, 18px);
|
gap: 12px;
|
||||||
padding: clamp(18px, 4.444vw, 24px);
|
margin: 0;
|
||||||
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);
|
|
||||||
animation: riseIn 0.45s ease both;
|
animation: riseIn 0.45s ease both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.heroTopline {
|
.heroCover {
|
||||||
display: inline-flex;
|
position: relative;
|
||||||
width: fit-content;
|
min-height: clamp(220px, 66vw, 350px);
|
||||||
align-items: center;
|
overflow: hidden;
|
||||||
gap: 8px;
|
background: #f1eeee;
|
||||||
padding: 8px 12px;
|
isolation: isolate;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.liveDot {
|
.heroBanner {
|
||||||
width: 8px;
|
position: absolute;
|
||||||
height: 8px;
|
inset: 0;
|
||||||
border-radius: 999px;
|
z-index: 0;
|
||||||
background: #ff4f91;
|
width: 100%;
|
||||||
box-shadow: 0 0 0 5px rgba(255, 79, 145, 0.16);
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
transform: scale(1.01);
|
||||||
|
animation: coverEaseIn 0.75s ease both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.identity {
|
.identity {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 14px;
|
||||||
|
left: calc(var(--app-safe-left, 0px) + clamp(14px, 3.704vw, 20px));
|
||||||
|
z-index: 2;
|
||||||
display: flex;
|
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;
|
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 {
|
.avatarFrame {
|
||||||
display: grid;
|
display: grid;
|
||||||
width: clamp(68px, 16.667vw, 90px);
|
width: 32px;
|
||||||
height: clamp(68px, 16.667vw, 90px);
|
height: 32px;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
place-items: center;
|
place-items: center;
|
||||||
border: 3px solid rgba(255, 255, 255, 0.92);
|
border: 2px solid rgba(255, 255, 255, 0.92);
|
||||||
border-radius: 9999px;
|
border-radius: 9999px;
|
||||||
background: linear-gradient(145deg, #ffb36d, #ff5d95);
|
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;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.identityText {
|
.identityName {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: #201417;
|
overflow: hidden;
|
||||||
font-size: clamp(24px, 6.667vw, 36px);
|
color: #33282b;
|
||||||
font-weight: 920;
|
font-size: clamp(11px, 2.963vw, 14px);
|
||||||
letter-spacing: -0.04em;
|
font-weight: 760;
|
||||||
line-height: 0.95;
|
line-height: 1.2;
|
||||||
}
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
.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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.primaryCta,
|
.primaryCta,
|
||||||
@@ -149,15 +134,33 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.primaryCta {
|
.primaryCta {
|
||||||
padding: 0 18px;
|
width: auto;
|
||||||
background: linear-gradient(135deg, #262026, #7f5861);
|
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;
|
color: #ffffff;
|
||||||
font-size: clamp(13px, 3.148vw, 16px);
|
font-size: clamp(12px, 3.148vw, 15px);
|
||||||
box-shadow: 0 14px 30px rgba(47, 35, 40, 0.18);
|
box-shadow: 0 10px 22px rgba(47, 35, 40, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.primaryCta span {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.postsSection {
|
.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 {
|
.sectionHeader {
|
||||||
@@ -501,3 +504,15 @@
|
|||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes coverEaseIn {
|
||||||
|
from {
|
||||||
|
opacity: 0.82;
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1.01);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useMemo } from "react";
|
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 { CharacterAvatar } from "@/app/_components";
|
||||||
import { AppBottomNav, MobileShell } from "@/app/_components/core";
|
import { AppBottomNav, MobileShell } from "@/app/_components/core";
|
||||||
@@ -32,7 +33,6 @@ const FALLBACK_PROFILE = {
|
|||||||
avatar: "/images/chat/pic-chat-elio.png",
|
avatar: "/images/chat/pic-chat-elio.png",
|
||||||
title: "Elio Private room",
|
title: "Elio Private room",
|
||||||
subtitle: "Join me, unlock my private room",
|
subtitle: "Join me, unlock my private room",
|
||||||
bio: "Soft moments, private photos, and a little sweetness just for you.",
|
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export function PrivateRoomScreen() {
|
export function PrivateRoomScreen() {
|
||||||
@@ -85,11 +85,17 @@ export function PrivateRoomScreen() {
|
|||||||
<div className={styles.backgroundGlowOne} />
|
<div className={styles.backgroundGlowOne} />
|
||||||
<div className={styles.backgroundGlowTwo} />
|
<div className={styles.backgroundGlowTwo} />
|
||||||
|
|
||||||
<section className={styles.hero} aria-labelledby="private-room-title">
|
<section className={styles.hero} aria-label={title}>
|
||||||
<div className={styles.heroTopline}>
|
<div className={styles.heroCover}>
|
||||||
<span className={styles.liveDot} aria-hidden="true" />
|
<Image
|
||||||
<span>Private room is open</span>
|
src="/images/private-room/banner.png"
|
||||||
</div>
|
alt=""
|
||||||
|
width={2048}
|
||||||
|
height={1152}
|
||||||
|
className={styles.heroBanner}
|
||||||
|
priority
|
||||||
|
sizes="(max-width: 540px) 100vw, 540px"
|
||||||
|
/>
|
||||||
|
|
||||||
<div className={styles.identity}>
|
<div className={styles.identity}>
|
||||||
<div className={styles.avatarFrame}>
|
<div className={styles.avatarFrame}>
|
||||||
@@ -97,28 +103,21 @@ export function PrivateRoomScreen() {
|
|||||||
src={avatarUrl}
|
src={avatarUrl}
|
||||||
alt={displayName}
|
alt={displayName}
|
||||||
size="100%"
|
size="100%"
|
||||||
imageSize={72}
|
imageSize={32}
|
||||||
priority
|
priority
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.identityText}>
|
<p className={styles.identityName}>{displayName}</p>
|
||||||
<h1 id="private-room-title" className={styles.title}>
|
|
||||||
{displayName}
|
|
||||||
</h1>
|
|
||||||
<p className={styles.handle}>{title}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className={styles.bio}>{subtitle || FALLBACK_PROFILE.bio}</p>
|
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className={styles.primaryCta}
|
className={styles.primaryCta}
|
||||||
onClick={handleTopUpClick}
|
onClick={handleTopUpClick}
|
||||||
>
|
>
|
||||||
<Sparkles size={16} aria-hidden="true" />
|
<span>{subtitle}</span>
|
||||||
<span>Top up credits</span>
|
|
||||||
</button>
|
</button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user