update: login & register page

This commit is contained in:
alikia2x (寒寒) 2025-04-27 00:51:25 +08:00
parent 358dd1ee5e
commit 175ec047cf
Signed by: alikia2x
GPG Key ID: 56209E0CCD8420C6
13 changed files with 159 additions and 37 deletions

View File

@ -0,0 +1,46 @@
<script lang="ts">
import {onMount} from 'svelte';
import {fly} from 'svelte/transition';
import {fade} from 'svelte/transition';
export let show: boolean = false;
export let onClose: () => void;
let drawer: HTMLDivElement;
let cover: HTMLDivElement;
onMount(() => {
const handleOutsideClick = (event: MouseEvent) => {
if (show && event.target === cover) {
onClose();
}
};
window.addEventListener('click', handleOutsideClick);
return () => {
window.removeEventListener('click', handleOutsideClick);
};
});
</script>
<div class="absolute z-50 ">
{#if show}
<div
bind:this={cover}
transition:fade="{{ duration: 300 }}"
class="fixed top-0 left-0 w-full h-full z-40 bg-[#00000020]"
aria-hidden="true">
</div>
<div
bind:this={drawer}
transition:fly="{{ x: -500, duration: 300 }}" class="fixed top-0 left-0 h-full
bg-[#fff0ee] dark:bg-[#231918] z-50"
style="width: min(22.5rem, 70vw);"
role="dialog" aria-modal="true">
<slot></slot>
</div>
{/if}
</div>

View File

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import SearchIcon from "@components/SearchIcon.svelte"; import SearchIcon from "src/components/icon/SearchIcon.svelte";
import CloseIcon from "@components/CloseIcon.svelte"; import CloseIcon from "src/components/icon/CloseIcon.svelte";
let inputBox: HTMLInputElement | null = null; let inputBox: HTMLInputElement | null = null;
export let close = () => {}; export let close = () => {};
@ -43,7 +43,8 @@
<div class="w-full h-10 lg:h-12 px-4 rounded-full bg-surface-container-high dark:bg-zinc-800/70 <div class="w-full h-10 lg:h-12 px-4 rounded-full bg-surface-container-high dark:bg-zinc-800/70
backdrop-blur-lg flex justify-between md:px-5"> backdrop-blur-lg flex justify-between md:px-5">
<button class="w-6" on:click={() => search(inputBox?.value ?? "")}> <button class="w-6" on:click={() => search(inputBox?.value ?? "")}>
<SearchIcon className="h-full inline-flex items-center text-[1.5rem] text-on-surface-variant" /> <SearchIcon className="h-full inline-flex items-center text-[1.5rem]
text-on-surface-variant dark:text-dark-on-surface-variant" />
</button> </button>
<!--suppress HtmlUnknownAttribute --> <!--suppress HtmlUnknownAttribute -->
<input <input
@ -56,8 +57,9 @@
class="top-0 h-full bg-transparent flex-grow px-4 focus:outline-none" class="top-0 h-full bg-transparent flex-grow px-4 focus:outline-none"
on:keydown={handleKeydown} on:keydown={handleKeydown}
/> />
<button class="w-6" on:click={close}> <button class="w-6" on:click={() => {inputBox.value = ""; close();}}>
<CloseIcon className="h-full w-6 inline-flex items-center text-[1.5rem] text-on-surface-variant"/> <CloseIcon className="h-full w-6 inline-flex items-center text-[1.5rem]
text-on-surface-variant dark:text-dark-on-surface-variant"/>
</button> </button>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@ import DarkModeImage from "@components/DarkModeImage.svelte";
import SearchBox from "@components/SearchBox.svelte"; import SearchBox from "@components/SearchBox.svelte";
--- ---
<div class="hidden md:flex relative top-0 left-0 w-full h-28 z-50 justify-between"> <div class="hidden md:flex relative top-0 left-0 w-full h-28 z-20 justify-between">
<div class="w-[305px] xl:ml-8 inline-flex items-center"> <div class="w-[305px] xl:ml-8 inline-flex items-center">
<a href="/"> <a href="/">
<DarkModeImage <DarkModeImage

View File

@ -1,22 +1,46 @@
<script lang="ts"> <script lang="ts">
import logoMobileDark from "@assets/TitleBar Mobile Dark.svg"; import logoMobileDark from "@assets/TitleBar Mobile Dark.svg";
import logoMobileLight from "@assets/TitleBar Mobile Light.svg"; import logoMobileLight from "@assets/TitleBar Mobile Light.svg";
import SearchBox from "./SearchBox.svelte"; import SearchBox from "@components/SearchBox.svelte";
import SearchIcon from "./SearchIcon.svelte"; import SearchIcon from "src/components/icon/SearchIcon.svelte";
import MenuIcon from "./MenuIcon.svelte"; import MenuIcon from "@components/icon/MenuIcon.svelte";
import DarkModeImage from "./DarkModeImage.svelte"; import DarkModeImage from "@components/DarkModeImage.svelte";
import NavigationDrawer from "@components/NavigationDrawer.svelte";
import HomeIcon from "@components/icon/HomeIcon.svelte";
import InfoIcon from "@components/icon/InfoIcon.svelte";
import RegisterIcon from "@components/icon/RegisterIcon.svelte";
let searchBox: SearchBox | null = null; let searchBox: SearchBox | null = null;
let showSearchBox = false; let showSearchBox = false;
let showDrawer = false;
$: if (showSearchBox && searchBox) { $: if (showSearchBox && searchBox) {
searchBox.changeFocusState(true); searchBox.changeFocusState(true);
} }
</script> </script>
<div class="md:hidden relative top-0 left-0 w-full h-16 z-50"> <NavigationDrawer show={showDrawer} onClose={() => showDrawer = false}>
<div class="flex flex-col w-full">
<div class="w-full h-14 flex items-center px-4">
<HomeIcon className="text-2xl pr-4"/>
<a href="/">首页</a>
</div>
<div class="w-full h-14 flex items-center px-4">
<InfoIcon className="text-2xl pr-4"/>
<a href="/about">关于</a>
</div>
<div class="w-full h-14 flex items-center px-4">
<RegisterIcon className="text-2xl pr-4"/>
<a href="/register">注册</a>
</div>
</div>
</NavigationDrawer>
<div class="md:hidden relative top-0 left-0 w-full h-16 z-20">
{#if !showSearchBox} {#if !showSearchBox}
<button class="inline-flex absolute left-0 ml-4 h-full items-center dark:text-white"> <button class="inline-flex absolute left-0 ml-4 h-full items-center dark:text-white"
onclick={() => showDrawer = true}
>
<MenuIcon/> <MenuIcon/>
</button> </button>
<div class="absolute left-1/2 -translate-x-1/2 -translate-y-0.5 inline-flex h-full items-center"> <div class="absolute left-1/2 -translate-x-1/2 -translate-y-0.5 inline-flex h-full items-center">

View File

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
export let className = ""; export let className = '';
</script> </script>
<div class={className}> <div class={className}>

View File

@ -0,0 +1,10 @@
<script lang="ts">
export let className = '';
</script>
<div class={className}>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24">
<path fill="currentColor"
d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1"/>
</svg>
</div>

View File

@ -0,0 +1,9 @@
<script lang="ts">
export let className = '';
</script>
<div class={className}>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24">
<path fill="currentColor" d="M11 17h2v-6h-2zm1-8q.425 0 .713-.288T13 8t-.288-.712T12 7t-.712.288T11 8t.288.713T12 9m0 13q-2.075 0-3.9-.788t-3.175-2.137T2.788 15.9T2 12t.788-3.9t2.137-3.175T8.1 2.788T12 2t3.9.788t3.175 2.137T21.213 8.1T22 12t-.788 3.9t-2.137 3.175t-3.175 2.138T12 22" />
</svg>
</div>

View File

@ -0,0 +1,9 @@
<script lang="ts">
export let className = '';
</script>
<div class={className}>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24">
<path fill="currentColor" d="M15 14c-2.67 0-8 1.33-8 4v2h16v-2c0-2.67-5.33-4-8-4m-9-4V7H4v3H1v2h3v3h2v-3h3v-2m6 2a4 4 0 0 0 4-4a4 4 0 0 0-4-4a4 4 0 0 0-4 4a4 4 0 0 0 4 4" />
</svg>
</div>

View File

@ -0,0 +1,13 @@
---
import Layout from "@layouts/Layout.astro";
---
<Layout title="登录">
<main class="relative flex-grow pt-36 px-4 md:w-full md:flex md:items-center md:flex-col">
<div class="md:w-[40rem] rounded-md md:p-8 md:bg-container md:dark:bg-dark-container">
<h1 class="text-5xl leading-[4rem] font-extralight">登录</h1>
<p class="mt-4 leading-8 font-medium">很抱歉,但您现在无法登录。</p>
<p class="text-sm text-[#534341] dark:text-[#d8c2be]">因为目前还没有写好啦~</p>
</div>
</main>
</Layout>

View File

@ -1,12 +1,13 @@
--- ---
import Layout from "@layouts/Layout.astro"; import Layout from "@layouts/Layout.astro";
import RightArrow from "../../components/icon/RightArrow.astro"; import RightArrow from "@components/icon/RightArrow.astro";
--- ---
<Layout title="注册"> <Layout title="注册">
<main class="relative flex-grow pt-36 px-4 "> <main class="relative flex-grow pt-36 px-4 md:w-full md:flex md:items-center md:flex-col">
<div class="md:w-[40rem] rounded-md md:p-8 md:bg-container md:dark:bg-dark-container">
<h1 class="text-5xl leading-[4rem] font-extralight">欢迎</h1> <h1 class="text-5xl leading-[4rem] font-extralight">欢迎</h1>
<p class="h-14 mt-2.5"> <p class="h-14 mt-2.5 md:mt-4">
欢迎来到中V档案馆。<br/> 欢迎来到中V档案馆。<br/>
这里是中文虚拟歌手相关信息的收集站与档案馆。 这里是中文虚拟歌手相关信息的收集站与档案馆。
</p> </p>
@ -14,12 +15,16 @@ import RightArrow from "../../components/icon/RightArrow.astro";
注册一个账号,<br/> 注册一个账号,<br/>
让我们一起见证中V的历史现在与未来。 让我们一起见证中V的历史现在与未来。
</p> </p>
<p> <p class="md:mt-2">
已有账户? 已有账户?
<a> <a href="/login">
<span>登录</span> <span>登录</span>
<RightArrow class="inline -translate-y-0.5" aria-hidden="true"/> <RightArrow class="inline -translate-y-0.5" aria-hidden="true"/>
</a> </a>
</p> </p>
<p class="mt-4 leading-8 font-medium">很抱歉,但您现在无法注册。</p>
<p class="text-sm text-[#534341] dark:text-[#d8c2be]">因为目前还没有写好啦~</p>
<p class="mt-4"><a href="/">返回首页</a></p>
</div>
</main> </main>
</Layout> </Layout>

View File

@ -5,6 +5,10 @@
@theme { @theme {
--color-surface-container-high: #f7e4e1; --color-surface-container-high: #f7e4e1;
--color-on-surface-variant: #534341; --color-on-surface-variant: #534341;
--color-dark-on-surface-variant: #d8c2be;
--color-dark-surface-container-high: #322826;
--color-dark-container: #271d1c;
--color-container: #fceae7;
} }
a { a {