| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <script>
- import "$lib/global.css";
- import {PUBLIC_API_URL} from "$env/static/public";
- import {goto} from "$app/navigation";
- import {toast} from "$lib/toast.svelte.js";
- import favicon from "$lib/assets/favicon.png";
- let name = $state("");
- let email = $state("");
- let password = $state("");
- let confirmPassword = $state("");
- let url = $state("");
- const submit = async ()=>{
- const body = {
- name: name,
- email: email,
- password: password,
- confirm_password: confirmPassword,
- url: url
- };
- const response = await fetch(`${PUBLIC_API_URL}/user`, {
- method: "POST",
- headers: {"Content-Type": "application/json"},
- body: JSON.stringify(body)
- });
- const responseBody = await response.json();
- if(!response.ok){
- toast(responseBody.error.message, "error")
- console.log(responseBody.error.message);
- }else{
- goto("/login");
- }
- }
- </script>
- <main>
- <a href="/" class="logo">
- <span class="logo-icon">
- <img src={favicon} alt="ChatRPG logo" width="35" height="35" />
- </span>
- <span class="logo-text">ChatRPG</span>
- </a>
- <div class="form-glow">
- <form class="standardForm" onsubmit={submit}>
- <h2>Join The Adventure</h2>
- <label>Name
- <input bind:value={name} type="text" required>
- </label>
- <label>Email
- <input bind:value={email} type="email" required>
- </label>
- <label>Password
- <input bind:value={password} type="password" required>
- </label>
- <label>Confirm Password
- <input bind:value={confirmPassword} type="password" required>
- </label>
- <input bind:value={url} type="hidden" required>
- <button type="submit">Register</button>
- <p>Already have an account? <a href="/login">Log in</a></p>
- </form>
- </div>
- </main>
- <style>
- main {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 1.75rem;
- padding: 2rem 1rem;
- }
- a.logo {
- display: flex;
- align-items: center;
- gap: 14px;
- text-decoration: none;
- color: #e5e5ea;
- font-weight: 700;
- font-size: 32px;
- letter-spacing: -0.5px;
- }
- a.logo img {
- width: 48px;
- height: 48px;
- }
- a.logo .logo-icon {
- color: #c084fc;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- h2{
- text-align: center;
- }
- .form-glow {
- position: relative;
- border-radius: 14px;
- width: min(660px, 100%);
- }
- .form-glow::before {
- content: "";
- position: absolute;
- inset: -2px;
- border-radius: 14px;
- background: conic-gradient(
- from var(--angle, 0deg),
- transparent 0%,
- #c084fc 20%,
- #5a5aff 40%,
- transparent 60%
- );
- animation: spin-border 10s linear infinite;
- z-index: 0;
- }
- .form-glow::after {
- content: "";
- position: absolute;
- inset: 1px;
- border-radius: 13px;
- background: #1a1a2e;
- z-index: 1;
- }
- .form-glow .standardForm {
- position: relative;
- z-index: 2;
- border-color: transparent;
- max-width: 660px;
- }
- @property --angle {
- syntax: "<angle>";
- inherits: false;
- initial-value: 0deg;
- }
- @keyframes spin-border {
- to { --angle: 360deg; }
- }
- </style>
|