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);
- // });
-
+
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+