diff --git a/public/images/login/asset-1.png b/public/images/login/asset-1.png deleted file mode 100644 index 04fcb88..0000000 Binary files a/public/images/login/asset-1.png and /dev/null differ diff --git a/public/images/login/asset-2.png b/public/images/login/asset-2.png deleted file mode 100644 index b74c926..0000000 Binary files a/public/images/login/asset-2.png and /dev/null differ diff --git a/public/images/login/asset-3.png b/public/images/login/asset-3.png deleted file mode 100644 index c6051fa..0000000 Binary files a/public/images/login/asset-3.png and /dev/null differ diff --git a/public/images/login/asset-4.png b/public/images/login/asset-4.png deleted file mode 100644 index b15f8d3..0000000 Binary files a/public/images/login/asset-4.png and /dev/null differ diff --git a/public/images/login/asset-5.png b/public/images/login/asset-5.png deleted file mode 100644 index edf1ddd..0000000 Binary files a/public/images/login/asset-5.png and /dev/null differ diff --git a/public/images/login/asset-6.png b/public/images/login/asset-6.png deleted file mode 100644 index 14feba4..0000000 Binary files a/public/images/login/asset-6.png and /dev/null differ diff --git a/public/images/login/asset-7.png b/public/images/login/asset-7.png deleted file mode 100644 index 7552f53..0000000 Binary files a/public/images/login/asset-7.png and /dev/null differ diff --git a/public/images/login/asset-8.png b/public/images/login/asset-8.png deleted file mode 100644 index 1549808..0000000 Binary files a/public/images/login/asset-8.png and /dev/null differ diff --git a/public/images/login/asset-9.png b/public/images/login/asset-9.png deleted file mode 100644 index f6e9cbb..0000000 Binary files a/public/images/login/asset-9.png and /dev/null differ diff --git a/public/images/login/logo.svg b/public/images/login/logo.svg deleted file mode 100644 index 40256b4..0000000 --- a/public/images/login/logo.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/public/images/login/v1/1.png b/public/images/login/v1/1.png deleted file mode 100644 index ecbbef5..0000000 Binary files a/public/images/login/v1/1.png and /dev/null differ diff --git a/public/images/login/v1/10.png b/public/images/login/v1/10.png deleted file mode 100644 index e595a8d..0000000 Binary files a/public/images/login/v1/10.png and /dev/null differ diff --git a/public/images/login/v1/2.png b/public/images/login/v1/2.png deleted file mode 100644 index d404b5e..0000000 Binary files a/public/images/login/v1/2.png and /dev/null differ diff --git a/public/images/login/v1/3.png b/public/images/login/v1/3.png deleted file mode 100644 index 6fd5b27..0000000 Binary files a/public/images/login/v1/3.png and /dev/null differ diff --git a/public/images/login/v1/4.png b/public/images/login/v1/4.png deleted file mode 100644 index cb69558..0000000 Binary files a/public/images/login/v1/4.png and /dev/null differ diff --git a/public/images/login/v1/5.png b/public/images/login/v1/5.png deleted file mode 100644 index 82fb6ad..0000000 Binary files a/public/images/login/v1/5.png and /dev/null differ diff --git a/public/images/login/v1/6.png b/public/images/login/v1/6.png deleted file mode 100644 index d141dad..0000000 Binary files a/public/images/login/v1/6.png and /dev/null differ diff --git a/public/images/login/v1/7.png b/public/images/login/v1/7.png deleted file mode 100644 index 7ee4c90..0000000 Binary files a/public/images/login/v1/7.png and /dev/null differ diff --git a/public/images/login/v1/8.png b/public/images/login/v1/8.png deleted file mode 100644 index b03cc31..0000000 Binary files a/public/images/login/v1/8.png and /dev/null differ diff --git a/public/images/login/v1/9.png b/public/images/login/v1/9.png deleted file mode 100644 index fcdee7c..0000000 Binary files a/public/images/login/v1/9.png and /dev/null differ diff --git a/public/images/login/v1/bg.png b/public/images/login/v1/bg.png deleted file mode 100644 index 4bc4d5f..0000000 Binary files a/public/images/login/v1/bg.png and /dev/null differ diff --git a/public/images/login/v1/icon-star-right.svg b/public/images/login/v1/icon-star-right.svg deleted file mode 100644 index d546643..0000000 --- a/public/images/login/v1/icon-star-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/app/(main)/character/[id]/page.tsx b/src/app/(main)/character/[id]/page.tsx index e25c2c9..8438848 100644 --- a/src/app/(main)/character/[id]/page.tsx +++ b/src/app/(main)/character/[id]/page.tsx @@ -19,7 +19,7 @@ export default async function Page({ params }: { params: Promise<{ id: string }> {/* 内容区 */} -
+
@@ -37,9 +37,7 @@ export default async function Page({ params }: { params: Promise<{ id: string }>
-
- -
+
@@ -67,7 +65,9 @@ export default async function Page({ params }: { params: Promise<{ id: string }>
{character?.description}
-
+ + {/* 移动端聊天按钮 */} +
diff --git a/src/app/(main)/chat/[id]/Background.tsx b/src/app/(main)/chat/[id]/Background.tsx new file mode 100644 index 0000000..6864821 --- /dev/null +++ b/src/app/(main)/chat/[id]/Background.tsx @@ -0,0 +1,45 @@ +'use client'; + +import React from 'react'; + +function Background({ imageUrl }: { imageUrl: string }) { + if (!imageUrl) { + return null; + } + + return ( +
+
+ {imageUrl && ( + Background + )} +
+
+
+
+
+ ); +} +export default React.memo(Background); diff --git a/src/app/(main)/chat/[id]/CharacterHeader.tsx b/src/app/(main)/chat/[id]/CharacterHeader.tsx index a4d5df4..0f554b0 100644 --- a/src/app/(main)/chat/[id]/CharacterHeader.tsx +++ b/src/app/(main)/chat/[id]/CharacterHeader.tsx @@ -7,15 +7,25 @@ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { useCharacter } from '@/hooks/services/character'; import { useParams } from 'next/navigation'; import React from 'react'; -// import CrushLevelAvatar from './CrushLevelAvatar' +import Link from 'next/link'; -export const CharacterAvatorAndName = ({ name, avator }: { name: string; avator: string }) => { +export const CharacterAvatorAndName = ({ + name, + avator, + id, +}: { + name: string; + avator: string; + id?: string; +}) => { return (
- - - {name?.slice(0, 1)} - + + + + {name?.slice(0, 1)} + +
{name}
); @@ -26,7 +36,8 @@ function ChatMessageUserHeader() { const [shouldShowExpandButton, setShouldShowExpandButton] = useState(false); const textRef = useRef(null); const { id } = useParams<{ id: string }>(); - const { data: character = {} } = useCharacter(id.split('-')[2]); + const characterId = id.split('-')[2]; + const { data: character = {} } = useCharacter(characterId); // 检测文本是否超过三行 useEffect(() => { @@ -40,8 +51,11 @@ function ChatMessageUserHeader() { return (
- - +
- + {/* Tags */}
diff --git a/src/app/(main)/chat/[id]/Input.tsx b/src/app/(main)/chat/[id]/Input.tsx index bcaa178..8ac2efd 100644 --- a/src/app/(main)/chat/[id]/Input.tsx +++ b/src/app/(main)/chat/[id]/Input.tsx @@ -86,7 +86,7 @@ export default function Input() { }; return ( -
+
{/* 打电话按钮 */} diff --git a/src/app/(main)/chat/[id]/MessageList.tsx b/src/app/(main)/chat/[id]/MessageList.tsx index c4462c2..508e88e 100644 --- a/src/app/(main)/chat/[id]/MessageList.tsx +++ b/src/app/(main)/chat/[id]/MessageList.tsx @@ -34,7 +34,7 @@ export default function MessageList() { }; return ( -
+
); diff --git a/src/app/(main)/chat/[id]/page.tsx b/src/app/(main)/chat/[id]/page.tsx index 670063b..af71614 100644 --- a/src/app/(main)/chat/[id]/page.tsx +++ b/src/app/(main)/chat/[id]/page.tsx @@ -7,12 +7,16 @@ import SettingDialog from './Drawer'; import { useStreamChatStore } from '@/app/(main)/chat/[id]/stream-chat'; import { useParams } from 'next/navigation'; import { useEffect, useState } from 'react'; +import { useCharacter } from '@/hooks/services/character'; +import Background from './Background'; export default function ChatPage() { - const { id } = useParams(); + const { id } = useParams<{ id: string }>(); + const characterId = id?.split('-')[2] || ''; const [settingOpen, setSettingOpen] = useState(false); const switchToChannel = useStreamChatStore((s) => s.switchToChannel); const client = useStreamChatStore((s) => s.client); + const { data: character } = useCharacter(characterId); useEffect(() => { if (id && client) { @@ -21,9 +25,10 @@ export default function ChatPage() { }, [id, client]); return ( -
+
-
+
+
diff --git a/src/app/(main)/home/components/Character/index.tsx b/src/app/(main)/home/components/Character/index.tsx index 847b2ae..3c57a18 100644 --- a/src/app/(main)/home/components/Character/index.tsx +++ b/src/app/(main)/home/components/Character/index.tsx @@ -24,7 +24,7 @@ const Character = () => { items={dataSource} columns={(width) => { - const cardWidth = width > 1200 ? 256 : width > 588 ? 200 : 170; + const cardWidth = width > 1200 ? 256 : width > 588 ? 200 : width > 375 ? 170 : 150; return Math.floor(width / cardWidth); }} renderItem={(character) => } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1555df6..7f7edd4 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -36,8 +36,8 @@ const NumDisplay = localFont({ export const metadata: Metadata = { metadataBase: new URL(process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'), - title: 'CrushLevel', - description: 'CrushLevel - Next Generation Social Platform', + title: 'Spicyxx.AI', + description: 'Spicyxx.AI - Next Generation Social Platform', }; export default async function RootLayout({ diff --git a/src/app/login/components/LeftPanel.tsx b/src/app/login/components/LeftPanel.tsx deleted file mode 100644 index 90b6fff..0000000 --- a/src/app/login/components/LeftPanel.tsx +++ /dev/null @@ -1,108 +0,0 @@ -'use client' - -import Image from 'next/image' -import { useState, useEffect, useMemo } from 'react' -import { ScrollingBackground } from './ScrollingBackground' - -interface LeftPanelProps { - scrollBg: string - images: string[] -} - -// 基础文字内容 -const baseTexts = [ - { title: 'AI Date', subtitle: "From 'Hi' to 'I Do', sparked by every chat." }, - { title: 'Crush', subtitle: "From 'Hi' to 'I Do', sparked by every chat." }, - { title: 'Chat', subtitle: "From 'Hi' to 'I Do', sparked by every chat." }, -] - -// 根据图片数量循环生成文字内容 -const generateImageTexts = (count: number) => { - return Array.from({ length: count }, (_, i) => baseTexts[i % baseTexts.length]) -} - -export function LeftPanel({ scrollBg, images }: LeftPanelProps) { - const [currentIndex, setCurrentIndex] = useState(0) - const [isTransitioning, setIsTransitioning] = useState(false) - - // 根据图片数量动态生成文案(使用 useMemo 优化性能) - const imageTexts = useMemo(() => generateImageTexts(images.length), [images.length]) - - useEffect(() => { - if (images.length <= 1) return - - const timer = setInterval(() => { - setIsTransitioning(true) - setTimeout(() => { - setCurrentIndex((prevIndex) => (prevIndex === images.length - 1 ? 0 : prevIndex + 1)) - setIsTransitioning(false) - }, 300) - }, 3000) // 每3秒切换一次 - - return () => clearInterval(timer) - }, [images.length]) - - const currentText = imageTexts[currentIndex] || imageTexts[0] - - return ( -
- {/* 滚动背景 */} - - - {/* 内容层 */} -
- {/* 底部遮罩层 - 铺满背景底部,高度500px */} -
- - {/* 文字内容 - 在图片上方 */} -
-
-

- {currentText.title} - logo -

-
-

- {currentText.subtitle} -

-
- - {/* 角色图片 - 尽可能放大,紧贴底部 */} -
- {images.map((image, index) => ( -
- {`Character -
- ))} -
-
-
- ) -} diff --git a/src/app/login/login-page.tsx b/src/app/login/login-page.tsx index c39aa66..cf51037 100644 --- a/src/app/login/login-page.tsx +++ b/src/app/login/login-page.tsx @@ -1,24 +1,9 @@ 'use client'; import Image from 'next/image'; import { LoginForm } from './components/login-form'; -import { LeftPanel } from './components/LeftPanel'; import { IconButton } from '@/components/ui/button'; import { useRouter } from 'next/navigation'; -const scrollBg = '/images/login/v1/bg.png'; -const images = [ - '/images/login/v1/1.png', - '/images/login/v1/2.png', - '/images/login/v1/3.png', - '/images/login/v1/4.png', - '/images/login/v1/5.png', - '/images/login/v1/6.png', - '/images/login/v1/7.png', - '/images/login/v1/8.png', - '/images/login/v1/9.png', - '/images/login/v1/10.png', -]; - export default function LoginPage() { const router = useRouter(); @@ -38,7 +23,7 @@ export default function LoginPage() {
{/* Logo */} -
+
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 46a9d5d..fe933f9 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,31 +1,31 @@ -import type { Metadata } from 'next' -import LoginPage from './login-page' +import type { Metadata } from 'next'; +import LoginPage from './login-page'; export const metadata: Metadata = { - title: 'Login - CrushLevel AI', + title: 'Login - Spicyxx.AI', description: - 'Sign in to CrushLevel AI to start your love story. Login with Discord, Google, or Apple to connect with AI companions and begin chatting.', + 'Sign in to Spicyxx.AI to start your love story. Login with Discord, Google, or Apple to connect with AI companions and begin chatting.', keywords: [ - 'CrushLevel login', - 'CrushLevel sign in', + 'Spicyxx.AI login', + 'Spicyxx.AI sign in', 'AI companion login', 'Discord login', 'Google login', 'Apple login', - 'CrushLevel account', + 'Spicyxx.AI account', ], openGraph: { - title: 'Login - CrushLevel AI', + title: 'Login - Spicyxx.AI', description: - 'Sign in to CrushLevel AI to start your love story. Login with Discord, Google, or Apple to connect with AI companions.', + 'Sign in to Spicyxx.AI to start your love story. Login with Discord, Google, or Apple to connect with AI companions.', url: 'https://www.crushlevel.com/login', - siteName: 'CrushLevel AI', + siteName: 'Spicyxx.AI', images: [ { url: '/logo.svg', width: 1200, height: 630, - alt: 'CrushLevel AI Login', + alt: 'Spicyxx.AI Login', }, ], locale: 'en_US', @@ -33,9 +33,9 @@ export const metadata: Metadata = { }, twitter: { card: 'summary_large_image', - title: 'Login - CrushLevel AI', + title: 'Login - Spicyxx.AI', description: - 'Sign in to CrushLevel AI to start your love story. Login with Discord, Google, or Apple.', + 'Sign in to Spicyxx.AI to start your love story. Login with Discord, Google, or Apple.', images: ['/logo.svg'], }, robots: { @@ -52,10 +52,10 @@ export const metadata: Metadata = { alternates: { canonical: 'https://www.crushlevel.com/login', }, -} +}; const Page = () => { - return -} + return ; +}; -export default Page +export default Page; diff --git a/src/css/tailwindcss.css b/src/css/tailwindcss.css index e8e6f13..c4200b2 100644 --- a/src/css/tailwindcss.css +++ b/src/css/tailwindcss.css @@ -380,7 +380,7 @@ --color-emphasis-onpic-normal: rgba(78, 72, 255, 0.85); /* Background */ - --color-background-default: rgba(6, 3, 24, 1); + --color-background-default: #0d0f29; /* Surface */ --color-surface-base-normal: rgba(26, 21, 42, 1); diff --git a/src/layout/Topbar.tsx b/src/layout/Topbar.tsx index 400d71f..163ddf0 100644 --- a/src/layout/Topbar.tsx +++ b/src/layout/Topbar.tsx @@ -25,6 +25,8 @@ function matchRoutePattern(pathname: string, patterns: string[]): boolean { }); } +const blurPages = ['/chat/:id']; + function Topbar() { const [isBlur, setIsBlur] = useState(false); const { data: user } = useCurrentUser(); @@ -68,7 +70,10 @@ function Topbar() { if (response.sm || items.some((item) => item.path === pathname)) { return ( - + ); } @@ -86,7 +91,7 @@ function Topbar() { if (!user) return ( - + ); return ( @@ -110,13 +115,15 @@ function Topbar() { if (response && !response.sm && matchRoutePattern(pathname, mobileHidenMenus)) return null; + const finalIgBlur = isBlur || matchRoutePattern(pathname, blurPages); + return (
- {isBlur &&
} + {finalIgBlur &&
}
{leftDomRender()} {rightDomRender()}