diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index 12f48e9..7faf5d6 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -1,20 +1,24 @@ - - +{#if href} + + {@render children()} + +{:else} + +{/if} diff --git a/src/lib/components/Card.svelte b/src/lib/components/Card.svelte new file mode 100644 index 0000000..a0a9af5 --- /dev/null +++ b/src/lib/components/Card.svelte @@ -0,0 +1,7 @@ + + +
+ {@render children()} +
diff --git a/src/lib/components/FileInput.svelte b/src/lib/components/FileInput.svelte deleted file mode 100644 index e3f4249..0000000 --- a/src/lib/components/FileInput.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - -{#if disabled} - - -{:else} - -{/if} - diff --git a/src/lib/components/Input.svelte b/src/lib/components/Input.svelte index e3c9953..01e4b6d 100644 --- a/src/lib/components/Input.svelte +++ b/src/lib/components/Input.svelte @@ -1,29 +1,10 @@ - +
+
+ {@render children()} +
+ +
diff --git a/src/lib/components/Password.svelte b/src/lib/components/Password.svelte deleted file mode 100644 index 93ff5ad..0000000 --- a/src/lib/components/Password.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/src/lib/components/Username.svelte b/src/lib/components/Username.svelte deleted file mode 100644 index 27321f3..0000000 --- a/src/lib/components/Username.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index 9aa9168..f968087 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -1,7 +1,9 @@ -import FileInput from "./FileInput.svelte"; import Input from "./Input.svelte"; -import Password from "./Password.svelte"; -import Username from "./Username.svelte"; import Button from "./Button.svelte"; +import Card from "./Card.svelte"; -export { FileInput, Input, Username, Password, Button }; +import MenuDrawerIcon from "./svg/MenuDrawerIcon.svelte"; +import UserIcon from "./svg/UserIcon.svelte"; +import PasswordIcon from "./svg/PasswordIcon.svelte"; + +export { Input, Button, Card, MenuDrawerIcon, UserIcon, PasswordIcon }; diff --git a/src/lib/components/svg/MenuDrawerIcon.svelte b/src/lib/components/svg/MenuDrawerIcon.svelte new file mode 100644 index 0000000..222df9d --- /dev/null +++ b/src/lib/components/svg/MenuDrawerIcon.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/lib/components/svg/PasswordIcon.svelte b/src/lib/components/svg/PasswordIcon.svelte new file mode 100644 index 0000000..6e8de4f --- /dev/null +++ b/src/lib/components/svg/PasswordIcon.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/svg/UserIcon.svelte b/src/lib/components/svg/UserIcon.svelte new file mode 100644 index 0000000..ae1743a --- /dev/null +++ b/src/lib/components/svg/UserIcon.svelte @@ -0,0 +1,10 @@ + + + diff --git a/src/lib/image.ts b/src/lib/image.ts index 43f218c..c39926f 100644 --- a/src/lib/image.ts +++ b/src/lib/image.ts @@ -1,11 +1,37 @@ -export const get_image_preview_event_handler = (id: string) => { - const handler = (event) => { - const target = event.target; - const files = target.files; +/** + * Use this on components. + */ +export const get_avatar_preview_event_handler = (id: string) => { + const handler = (event: Event) => { + const target: HTMLInputElement = event.target as HTMLInputElement; + const files: FileList | null = target.files; - if (files.length > 0) { - const src = URL.createObjectURL(files[0]); - const preview = document.getElementById(id) as HTMLImageElement; + if (files && files.length > 0) { + const src: string = URL.createObjectURL(files[0]); + const preview: HTMLImageElement = document.querySelector( + `#${id} > img:first-of-type`, + ) as HTMLImageElement; + if (preview) { + preview.src = src; + preview.hidden = false; + } + } + }; + + return handler; +}; + +/** + * Use this on raw elements. + */ +export const get_image_preview_event_handler = (id: string) => { + const handler = (event: Event) => { + const target: HTMLInputElement = event.target as HTMLInputElement; + const files: FileList | null = target.files; + + if (files && files.length > 0) { + const src: string = URL.createObjectURL(files[0]); + const preview: HTMLImageElement = document.getElementById(id) as HTMLImageElement; if (preview) { preview.src = src; preview.hidden = false; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 82f9543..4bb7d9d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -2,182 +2,221 @@ import "../app.css"; import type { Snippet } from "svelte"; import type { LayoutData } from "./$types"; - import { FileInput, Password, Username } from "$lib/components"; - import { get_image_preview_event_handler } from "$lib/image"; + import { Button, MenuDrawerIcon, UserIcon, Input, PasswordIcon, Card } from "$lib/components"; + import { get_avatar_preview_event_handler, get_image_preview_event_handler } from "$lib/image"; + import { + AppBar, + popup, + storePopup, + type PopupSettings, + initializeStores, + Drawer, + getDrawerStore, + type DrawerSettings, + Avatar, + FileDropzone, + } from "@skeletonlabs/skeleton"; + import { computePosition, autoUpdate, offset, shift, flip, arrow } from "@floating-ui/dom"; let { data, children }: { data: LayoutData; children: Snippet } = $props(); + + // Drawer config + initializeStores(); + const drawerStore = getDrawerStore(); + + const menu_drawer = () => { + const drawerSettings: DrawerSettings = { + id: "menu_drawer", + position: "top", + height: "auto", + padding: "lg:px-96", + }; + drawerStore.open(drawerSettings); + }; + + const data_drawer = () => { + const drawerSettings: DrawerSettings = { + id: "data_drawer", + position: "top", + height: "auto", + padding: "lg:px-96", + }; + drawerStore.open(drawerSettings); + }; + + const login_drawer = () => { + const drawerSettings: DrawerSettings = { + id: "login_drawer", + position: "top", + height: "auto", + padding: "lg:px-96", + }; + drawerStore.open(drawerSettings); + }; + + const profile_drawer = () => { + const drawerSettings: DrawerSettings = { + id: "profile_drawer", + position: "top", + height: "auto", + padding: "lg:px-96", + }; + drawerStore.open(drawerSettings); + }; + + const close_drawer = () => drawerStore.close(); + + // Popups config + storePopup.set({ computePosition, autoUpdate, offset, shift, flip, arrow }); + + // Example: https://www.skeleton.dev/utilities/popups + // const data_popup_settings: PopupSettings = { + // event: "click", + // target: "data_popup", + // placement: "bottom", + // middleware: { + // offset: { mainAxis: 22, crossAxis: 0 }, + // // shift: { mainAxis: true, crossAxis: false }, + // }, + // }; + + {#if $drawerStore.id === "menu_drawer"} + + + +
+ + + + + +
+ {:else if $drawerStore.id === "data_drawer"} + + + +
+ + +
+ {:else if $drawerStore.id === "login_drawer"} + + + +
+

Enter Username and Password

+
+ + + + + +
+ + +
+ +
+ {:else if $drawerStore.id === "profile_drawer"} + + + +
+

Edit Profile

+
+ + + + Upload Avatar or Drag and Drop + +
+ + +
+ +
+ {/if} +
+ diff --git a/src/routes/data/seasondata/+layout.svelte b/src/routes/data/seasondata/+layout.svelte index 26dc395..472ed5f 100644 --- a/src/routes/data/seasondata/+layout.svelte +++ b/src/routes/data/seasondata/+layout.svelte @@ -1,34 +1,31 @@

Season Data

-
- Teams - Drivers - Races -
+ + Teams + Drivers + Races +
{@render children()} diff --git a/src/routes/data/seasondata/teams/+page.server.ts b/src/routes/data/seasondata/teams/+page.server.ts index 060b8cf..56838e3 100644 --- a/src/routes/data/seasondata/teams/+page.server.ts +++ b/src/routes/data/seasondata/teams/+page.server.ts @@ -1,9 +1,5 @@ import type { Actions, PageServerLoad } from "./$types"; -import { - form_data_clean, - form_data_ensure_keys, - form_data_get_and_remove_id, -} from "$lib/form"; +import { form_data_clean, form_data_ensure_keys, form_data_get_and_remove_id } from "$lib/form"; // These "actions" run serverside only, as they're located inside +page.server.ts export const actions = { diff --git a/src/routes/data/seasondata/teams/+page.svelte b/src/routes/data/seasondata/teams/+page.svelte index 31c812a..9d23153 100644 --- a/src/routes/data/seasondata/teams/+page.svelte +++ b/src/routes/data/seasondata/teams/+page.svelte @@ -1,7 +1,8 @@ @@ -10,109 +11,90 @@ F11 - Teams -
+
{#each data.teams as team} -
+ -
- Logo of {team.name} F1 team. -
+ Logo of {team.name} F1 team.
-
- +
+ Name - + > + Upload Logo or Drag and Drop + -
-
-
- -
- {/each} - - - {#if data.admin} -
- -
- -
-
-
-

Add a New Team

- - - - - - - - -
- - - - + +
-
+
+ {/each} + + + {#if data.admin} + + + +
+
+

Add a New Team

+ + + Name + + + + Upload Logo or Drag and Drop + + + +
+ + + + +
+
+
+
{/if}