diff --git a/src/lib/components/header/index.svelte b/src/lib/components/header/index.svelte index 3d56e5c..7deadd9 100644 --- a/src/lib/components/header/index.svelte +++ b/src/lib/components/header/index.svelte @@ -1,10 +1,9 @@ + + + + + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 0000000..81de2e2 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 0000000..c8e6719 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 0000000..a7fb3c4 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte new file mode 100644 index 0000000..1c74ae1 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 0000000..21d4b3a --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 0000000..775f8fe --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 0000000..caf24ad --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 0000000..6690085 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,30 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 0000000..75cf264 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,32 @@ + + + + + + diff --git a/src/lib/components/ui/dropdown-menu/index.ts b/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..313213a --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,48 @@ +import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; +import Item from "./dropdown-menu-item.svelte"; +import Label from "./dropdown-menu-label.svelte"; +import Content from "./dropdown-menu-content.svelte"; +import Shortcut from "./dropdown-menu-shortcut.svelte"; +import RadioItem from "./dropdown-menu-radio-item.svelte"; +import Separator from "./dropdown-menu-separator.svelte"; +import RadioGroup from "./dropdown-menu-radio-group.svelte"; +import SubContent from "./dropdown-menu-sub-content.svelte"; +import SubTrigger from "./dropdown-menu-sub-trigger.svelte"; +import CheckboxItem from "./dropdown-menu-checkbox-item.svelte"; + +const Sub = DropdownMenuPrimitive.Sub; +const Root = DropdownMenuPrimitive.Root; +const Trigger = DropdownMenuPrimitive.Trigger; +const Group = DropdownMenuPrimitive.Group; + +export { + Sub, + Root, + Item, + Label, + Group, + Trigger, + Content, + Shortcut, + Separator, + RadioItem, + SubContent, + SubTrigger, + RadioGroup, + CheckboxItem, + // + Root as DropdownMenu, + Sub as DropdownMenuSub, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + Group as DropdownMenuGroup, + Content as DropdownMenuContent, + Trigger as DropdownMenuTrigger, + Shortcut as DropdownMenuShortcut, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + RadioGroup as DropdownMenuRadioGroup, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + CheckboxItem as DropdownMenuCheckboxItem +}; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index e2bbf35..5516ea0 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,6 +1,47 @@ -import { type ClassValue, clsx } from "clsx"; -import { twMerge } from "tailwind-merge"; - +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; +import { cubicOut } from 'svelte/easing'; +import type { TransitionConfig } from 'svelte/transition'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === 'none' ? '' : style.transform; + const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + return valueB; + }; + const styleToString = (style: Record): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + key + ':' + style[key] + ';'; + }, ''); + }; + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + return styleToString({ + transform: transform + 'translate3d(' + x + 'px, ' + y + 'px, 0) scale(' + scale + ')', + opacity: t + }); + }, + easing: cubicOut + }; +}; diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index d0bd6df..2f3b8c7 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -4,159 +4,20 @@ import Header from '$lib/components/header/index.svelte'; import Footer from '$lib/components/footer.svelte'; - // $: { - // if ($navigating) { - // debounce(() => { - // boredState.update((n) => ({ ...n, loading: true })); - // }, 250); - // } - // if (!$navigating) { - // boredState.update((n) => ({ ...n, loading: false })); - // } - // } - - // $: isOpen = $boredState?.dialog?.isOpen; - - // if (browser) { - // const collator = new Intl.Collator('en'); - - // let collectionEmpty = $collectionStore.length === 0 || false; - // let wishlistEmpty = $wishlistStore.length === 0 || false; - // if (wishlistEmpty && localStorage?.wishlist && localStorage?.wishlist?.length !== 0) { - // const wishlist: SavedGameType[] = JSON.parse(localStorage.wishlist); - // if (wishlist?.length !== 0) { - // wishlist.sort((a, b) => collator.compare(a.name, b.name)); - // for (const item of wishlist) { - // if (!item?.searchTerms) { - // item.searchTerms = `${item?.name?.toLowerCase()}`; - // } - // if (!item?.includeInRandom) { - // item.includeInRandom = false; - // } - // } - // wishlistStore.addAll(wishlist); - // } - // } - // if (collectionEmpty && localStorage?.collection && localStorage?.collection?.length !== 0) { - // const collection: SavedGameType[] = JSON.parse(localStorage.collection); - // if (collection?.length !== 0) { - // collection.sort((a, b) => collator.compare(a.name, b.name)); - // for (const item of collection) { - // if (!item?.searchTerms) { - // item.searchTerms = `${item?.name?.toLowerCase()}`; - // } - // } - // collectionStore.addAll(collection); - // } - // } - // } - - // const dev = process.env.NODE_ENV !== 'production'; - export let data; - // $: ({ user } = data); - - // const flash = getFlash(page, { - // clearAfterMs: 6000 - // }); - // let flashType; - // let flashMessage; - // $: flashType = $flash?.type; - // $: flashMessage = $flash?.message; - - // if ($flash && flashType && flashMessage) { - // switch (flashType) { - // case 'success': - // toast.success(flashMessage); - // break; - // case 'error': - // toast.error(flashMessage); - // break; - // default: - // toast.error(flashMessage); - // } - // } - - // onMount(() => { - // // set the theme to the user's active theme - // $theme = user?.theme || 'system'; - // document.querySelector('html')?.setAttribute('data-theme', $theme); - // }); - - // flash.subscribe(($flash) => { - // if (!$flash) return; - - // if ($flash.type == 'success') { - // toast.success($flash.message); - // } else { - // toast.error($flash.message, { - // duration: 5000 - // }); - // } - - // // Clearing the flash message could sometimes - // // be required here to avoid double-toasting. - // flash.set(undefined); - // }); - +
- -
+
+ + + +
-
- - - -
- -