diff --git a/apps/web/package.json b/apps/web/package.json
index df21861..33f9d75 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -38,6 +38,8 @@
"dependencies": {
"bits-ui": "^0.15.1",
"clsx": "^2.1.0",
+ "lucide-svelte": "^0.316.0",
+ "mode-watcher": "^0.1.2",
"pocketbase": "^0.21.0",
"radix-icons-svelte": "^1.2.1",
"tailwind-merge": "^2.2.1",
diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml
index 72d83b3..161bb8b 100644
--- a/apps/web/pnpm-lock.yaml
+++ b/apps/web/pnpm-lock.yaml
@@ -11,6 +11,12 @@ dependencies:
clsx:
specifier: ^2.1.0
version: 2.1.0
+ lucide-svelte:
+ specifier: ^0.316.0
+ version: 0.316.0(svelte@4.2.9)
+ mode-watcher:
+ specifier: ^0.1.2
+ version: 0.1.2(svelte@4.2.9)
pocketbase:
specifier: ^0.21.0
version: 0.21.0
@@ -1651,6 +1657,14 @@ packages:
yallist: 4.0.0
dev: true
+ /lucide-svelte@0.316.0(svelte@4.2.9):
+ resolution: {integrity: sha512-6mtBw/aU1IIVXfN6AXLSwsbeCFX/2/tTy84rrDTDsOq7BEijFbvObQsPEWPxJ0EyCjUXOYfAvfkZzMosYjyGqA==}
+ peerDependencies:
+ svelte: '>=3 <5'
+ dependencies:
+ svelte: 4.2.9
+ dev: false
+
/magic-string@0.30.5:
resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
engines: {node: '>=12'}
@@ -1703,6 +1717,14 @@ packages:
minimist: 1.2.8
dev: true
+ /mode-watcher@0.1.2(svelte@4.2.9):
+ resolution: {integrity: sha512-XTdPCdqC3kqSvB+Q262Kor983YJkkB2Z3vj9uqg5IqKQpOdiz+xB99Jihp8sWbyM67drC7KKp0Nt5FzCypZi2g==}
+ peerDependencies:
+ svelte: ^4.0.0
+ dependencies:
+ svelte: 4.2.9
+ dev: false
+
/mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
diff --git a/apps/web/src/app.html b/apps/web/src/app.html
index 77a5ff5..50bf0af 100644
--- a/apps/web/src/app.html
+++ b/apps/web/src/app.html
@@ -2,11 +2,23 @@
-
-
+
+
+
+
+
+
+
+
+
%sveltekit.head%
-
- %sveltekit.body%
+
+
+ %sveltekit.body%
+
-
+
\ No newline at end of file
diff --git a/apps/web/src/app.pcss b/apps/web/src/app.pcss
index 5cd56fc..b97609b 100644
--- a/apps/web/src/app.pcss
+++ b/apps/web/src/app.pcss
@@ -3,69 +3,49 @@
@tailwind utilities;
@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 0 0% 3.9%;
-
- --muted: 0 0% 96.1%;
- --muted-foreground: 0 0% 45.1%;
-
- --popover: 0 0% 100%;
- --popover-foreground: 0 0% 3.9%;
-
- --card: 0 0% 100%;
- --card-foreground: 0 0% 3.9%;
-
- --border: 0 0% 89.8%;
- --input: 0 0% 89.8%;
-
- --primary: 0 0% 9%;
- --primary-foreground: 0 0% 98%;
-
- --secondary: 0 0% 96.1%;
- --secondary-foreground: 0 0% 9%;
-
- --accent: 0 0% 96.1%;
- --accent-foreground: 0 0% 9%;
-
- --destructive: 0 72.2% 50.6%;
- --destructive-foreground: 0 0% 98%;
-
- --ring: 0 0% 3.9%;
-
- --radius: 0.5rem;
- }
-
- .dark {
- --background: 0 0% 3.9%;
- --foreground: 0 0% 98%;
-
- --muted: 0 0% 14.9%;
- --muted-foreground: 0 0% 63.9%;
-
- --popover: 0 0% 3.9%;
- --popover-foreground: 0 0% 98%;
-
- --card: 0 0% 3.9%;
- --card-foreground: 0 0% 98%;
-
- --border: 0 0% 14.9%;
- --input: 0 0% 14.9%;
-
- --primary: 0 0% 98%;
- --primary-foreground: 0 0% 9%;
-
- --secondary: 0 0% 14.9%;
- --secondary-foreground: 0 0% 98%;
-
- --accent: 0 0% 14.9%;
- --accent-foreground: 0 0% 98%;
-
- --destructive: 0 62.8% 30.6%;
- --destructive-foreground: 0 0% 98%;
-
- --ring: 0 0% 83.1%;
- }
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 0 0% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 0 0% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 0 0% 3.9%;
+ --primary: 0 72.2% 50.6%;
+ --primary-foreground: 0 85.7% 97.3%;
+ --secondary: 0 0% 96.1%;
+ --secondary-foreground: 0 0% 9%;
+ --muted: 0 0% 96.1%;
+ --muted-foreground: 0 0% 45.1%;
+ --accent: 0 0% 96.1%;
+ --accent-foreground: 0 0% 9%;
+ --destructive: 0 72.22% 50.59%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 89.8%;
+ --input: 0 0% 89.8%;
+ --ring: 0 72.2% 50.6%;
+ --radius: 0rem;
+ }
+ .dark {
+ --background: 0 0% 3.9%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 3.9%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 3.9%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 72.2% 50.6%;
+ --primary-foreground: 0 85.7% 97.3%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 72.2% 50.6%;
+ }
}
@layer base {
diff --git a/apps/web/src/lib/components/site/icons/github.svelte b/apps/web/src/lib/components/site/icons/github.svelte
new file mode 100644
index 0000000..47cce76
--- /dev/null
+++ b/apps/web/src/lib/components/site/icons/github.svelte
@@ -0,0 +1,4 @@
+
diff --git a/apps/web/src/lib/components/site/icons/index.ts b/apps/web/src/lib/components/site/icons/index.ts
new file mode 100644
index 0000000..7a0a45b
--- /dev/null
+++ b/apps/web/src/lib/components/site/icons/index.ts
@@ -0,0 +1,14 @@
+import type { Icon as LucideIcon } from 'lucide-svelte';
+import { GithubLogo, VercelLogo, LinkedinLogo } from 'radix-icons-svelte';
+import Logo from './logo.svelte';
+import Svelte from './svelte.svelte';
+
+export type Icon = LucideIcon;
+
+export const Icons = {
+ logo: Logo,
+ gitHub: GithubLogo,
+ svelte: Svelte,
+ vercel: VercelLogo,
+ linkedIn: LinkedinLogo
+};
diff --git a/apps/web/src/lib/components/site/icons/logo.svelte b/apps/web/src/lib/components/site/icons/logo.svelte
new file mode 100644
index 0000000..4e83575
--- /dev/null
+++ b/apps/web/src/lib/components/site/icons/logo.svelte
@@ -0,0 +1,7 @@
+
diff --git a/apps/web/src/lib/components/site/icons/svelte.svelte b/apps/web/src/lib/components/site/icons/svelte.svelte
new file mode 100644
index 0000000..a0694cf
--- /dev/null
+++ b/apps/web/src/lib/components/site/icons/svelte.svelte
@@ -0,0 +1,15 @@
+
diff --git a/apps/web/src/lib/components/site/icons/vercel.svelte b/apps/web/src/lib/components/site/icons/vercel.svelte
new file mode 100644
index 0000000..b406fae
--- /dev/null
+++ b/apps/web/src/lib/components/site/icons/vercel.svelte
@@ -0,0 +1,4 @@
+
diff --git a/apps/web/src/lib/components/site/index.ts b/apps/web/src/lib/components/site/index.ts
new file mode 100644
index 0000000..a91975c
--- /dev/null
+++ b/apps/web/src/lib/components/site/index.ts
@@ -0,0 +1,8 @@
+export { default as Metadata } from './metadata.svelte';
+export { default as SiteFooter } from './site-footer.svelte';
+export { default as SiteNavBar } from './site-navbar.svelte';
+export { default as TailwindIndicator } from './tailwind-indicator.svelte';
+export { default as ModeToggle } from './mode-toggle.svelte';;
+
+export * from './icons';
+export * from './nav';
diff --git a/apps/web/src/lib/components/site/metadata.svelte b/apps/web/src/lib/components/site/metadata.svelte
new file mode 100644
index 0000000..03ff039
--- /dev/null
+++ b/apps/web/src/lib/components/site/metadata.svelte
@@ -0,0 +1,36 @@
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/site/mode-toggle.svelte b/apps/web/src/lib/components/site/mode-toggle.svelte
new file mode 100644
index 0000000..afffe5c
--- /dev/null
+++ b/apps/web/src/lib/components/site/mode-toggle.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+ setMode('light')}>Light
+ setMode('dark')}>Dark
+ resetMode()}>System
+
+
diff --git a/apps/web/src/lib/components/site/nav/index.ts b/apps/web/src/lib/components/site/nav/index.ts
new file mode 100644
index 0000000..c17dc31
--- /dev/null
+++ b/apps/web/src/lib/components/site/nav/index.ts
@@ -0,0 +1,2 @@
+export { default as MainNav } from './main-nav.svelte';
+export { default as MobileNav } from './mobile-nav.svelte';
diff --git a/apps/web/src/lib/components/site/nav/main-nav.svelte b/apps/web/src/lib/components/site/nav/main-nav.svelte
new file mode 100644
index 0000000..d9dbf1f
--- /dev/null
+++ b/apps/web/src/lib/components/site/nav/main-nav.svelte
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/site/nav/mobile-link.svelte b/apps/web/src/lib/components/site/nav/mobile-link.svelte
new file mode 100644
index 0000000..608aa0d
--- /dev/null
+++ b/apps/web/src/lib/components/site/nav/mobile-link.svelte
@@ -0,0 +1,23 @@
+
+
+ (open = false)}
+ class={cn(
+ $page.url.pathname === href ? 'text-foreground' : 'text-foreground/60',
+ 'hover:text-foreground',
+ className
+ )}
+ {...$$restProps}
+>
+
+
diff --git a/apps/web/src/lib/components/site/nav/mobile-nav.svelte b/apps/web/src/lib/components/site/nav/mobile-nav.svelte
new file mode 100644
index 0000000..8777ca7
--- /dev/null
+++ b/apps/web/src/lib/components/site/nav/mobile-nav.svelte
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+ Logo icon (return home)
+
+ {siteConfig.name}
+
+
+
+ {#each navConfig.mainNav as navItem, index (navItem + index.toString())}
+ {#if navItem.href}
+
+ {navItem.title}
+
+ {/if}
+ {/each}
+
+
+ {#each navConfig.sidebarNav as navItem, index (index)}
+
+
{navItem.title}
+ {#if navItem?.items?.length}
+ {#each navItem.items as item}
+ {#if !item.disabled && item.href}
+
+ {item.title}
+ {#if item.label}
+
+ {item.label}
+
+ {/if}
+
+ {/if}
+ {/each}
+ {/if}
+
+ {/each}
+
+
+
+
diff --git a/apps/web/src/lib/components/site/site-footer.svelte b/apps/web/src/lib/components/site/site-footer.svelte
new file mode 100644
index 0000000..27493e4
--- /dev/null
+++ b/apps/web/src/lib/components/site/site-footer.svelte
@@ -0,0 +1,13 @@
+
+
+
diff --git a/apps/web/src/lib/components/site/site-header.svelte b/apps/web/src/lib/components/site/site-header.svelte
new file mode 100644
index 0000000..c916958
--- /dev/null
+++ b/apps/web/src/lib/components/site/site-header.svelte
@@ -0,0 +1,12 @@
+
+
+
+ {title}
+
+ {subTitle}
+
+
+
diff --git a/apps/web/src/lib/components/site/site-navbar.svelte b/apps/web/src/lib/components/site/site-navbar.svelte
new file mode 100644
index 0000000..cefdf38
--- /dev/null
+++ b/apps/web/src/lib/components/site/site-navbar.svelte
@@ -0,0 +1,52 @@
+
+
+
diff --git a/apps/web/src/lib/components/site/tailwind-indicator.svelte b/apps/web/src/lib/components/site/tailwind-indicator.svelte
new file mode 100644
index 0000000..2ed9cc6
--- /dev/null
+++ b/apps/web/src/lib/components/site/tailwind-indicator.svelte
@@ -0,0 +1,10 @@
+
+
xs
+
sm
+
md
+
lg
+
xl
+
2xl
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte
new file mode 100644
index 0000000..727dbd5
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte
new file mode 100644
index 0000000..3d09fe9
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte
new file mode 100644
index 0000000..aaf9d71
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte
new file mode 100644
index 0000000..a7fb3c4
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte
new file mode 100644
index 0000000..1c74ae1
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte
new file mode 100644
index 0000000..e518364
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte
new file mode 100644
index 0000000..775f8fe
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte
@@ -0,0 +1,14 @@
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte
new file mode 100644
index 0000000..696d3bd
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte
new file mode 100644
index 0000000..eec9bfa
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte
@@ -0,0 +1,29 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte
new file mode 100644
index 0000000..0ffc09b
--- /dev/null
+++ b/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte
@@ -0,0 +1,32 @@
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/dropdown-menu/index.ts b/apps/web/src/lib/components/ui/dropdown-menu/index.ts
new file mode 100644
index 0000000..313213a
--- /dev/null
+++ b/apps/web/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/apps/web/src/lib/components/ui/sheet/index.ts b/apps/web/src/lib/components/ui/sheet/index.ts
new file mode 100644
index 0000000..b77b56b
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/index.ts
@@ -0,0 +1,106 @@
+import { Dialog as SheetPrimitive } from "bits-ui";
+import { tv, type VariantProps } from "tailwind-variants";
+
+import Portal from "./sheet-portal.svelte";
+import Overlay from "./sheet-overlay.svelte";
+import Content from "./sheet-content.svelte";
+import Header from "./sheet-header.svelte";
+import Footer from "./sheet-footer.svelte";
+import Title from "./sheet-title.svelte";
+import Description from "./sheet-description.svelte";
+
+const Root = SheetPrimitive.Root;
+const Close = SheetPrimitive.Close;
+const Trigger = SheetPrimitive.Trigger;
+
+export {
+ Root,
+ Close,
+ Trigger,
+ Portal,
+ Overlay,
+ Content,
+ Header,
+ Footer,
+ Title,
+ Description,
+ //
+ Root as Sheet,
+ Close as SheetClose,
+ Trigger as SheetTrigger,
+ Portal as SheetPortal,
+ Overlay as SheetOverlay,
+ Content as SheetContent,
+ Header as SheetHeader,
+ Footer as SheetFooter,
+ Title as SheetTitle,
+ Description as SheetDescription
+};
+
+export const sheetVariants = tv({
+ base: "fixed z-50 gap-4 bg-background p-6 shadow-lg",
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b ",
+ bottom: "inset-x-0 bottom-0 border-t",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
+ right: "inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm"
+ }
+ },
+ defaultVariants: {
+ side: "right"
+ }
+});
+
+export const sheetTransitions = {
+ top: {
+ in: {
+ y: "-100%",
+ duration: 500,
+ opacity: 1
+ },
+ out: {
+ y: "-100%",
+ duration: 300,
+ opacity: 1
+ }
+ },
+ bottom: {
+ in: {
+ y: "100%",
+ duration: 500,
+ opacity: 1
+ },
+ out: {
+ y: "100%",
+ duration: 300,
+ opacity: 1
+ }
+ },
+ left: {
+ in: {
+ x: "-100%",
+ duration: 500,
+ opacity: 1
+ },
+ out: {
+ x: "-100%",
+ duration: 300,
+ opacity: 1
+ }
+ },
+ right: {
+ in: {
+ x: "100%",
+ duration: 500,
+ opacity: 1
+ },
+ out: {
+ x: "100%",
+ duration: 300,
+ opacity: 1
+ }
+ }
+};
+
+export type Side = VariantProps["side"];
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-content.svelte b/apps/web/src/lib/components/ui/sheet/sheet-content.svelte
new file mode 100644
index 0000000..47d5f9e
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-content.svelte
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+ Close
+
+
+
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-description.svelte b/apps/web/src/lib/components/ui/sheet/sheet-description.svelte
new file mode 100644
index 0000000..6b348a5
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-description.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-footer.svelte b/apps/web/src/lib/components/ui/sheet/sheet-footer.svelte
new file mode 100644
index 0000000..3c41773
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-footer.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-header.svelte b/apps/web/src/lib/components/ui/sheet/sheet-header.svelte
new file mode 100644
index 0000000..b83aaad
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-header.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-overlay.svelte b/apps/web/src/lib/components/ui/sheet/sheet-overlay.svelte
new file mode 100644
index 0000000..416468d
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-overlay.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-portal.svelte b/apps/web/src/lib/components/ui/sheet/sheet-portal.svelte
new file mode 100644
index 0000000..df9e1b9
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-portal.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/ui/sheet/sheet-title.svelte b/apps/web/src/lib/components/ui/sheet/sheet-title.svelte
new file mode 100644
index 0000000..b50ea5f
--- /dev/null
+++ b/apps/web/src/lib/components/ui/sheet/sheet-title.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/config/nav.ts b/apps/web/src/lib/config/nav.ts
new file mode 100644
index 0000000..489181f
--- /dev/null
+++ b/apps/web/src/lib/config/nav.ts
@@ -0,0 +1,24 @@
+import type { NavItem, SidebarNavItem } from '$lib/types/nav';
+
+interface NavConfig {
+ mainNav: NavItem[];
+ sidebarNav: SidebarNavItem[];
+}
+
+export const navConfig: NavConfig = {
+ mainNav: [
+ {
+ title: 'Home',
+ href: '/'
+ },
+ {
+ title: 'Login',
+ href: '/login'
+ },
+ {
+ title: 'Signup',
+ href: '/signup'
+ }
+ ],
+ sidebarNav: []
+};
diff --git a/apps/web/src/lib/config/site.ts b/apps/web/src/lib/config/site.ts
new file mode 100644
index 0000000..8e8bd23
--- /dev/null
+++ b/apps/web/src/lib/config/site.ts
@@ -0,0 +1,17 @@
+const SITE_URL =
+ import.meta.env.VERCEL_ENV === 'preview' ? import.meta.env.VERCEL_URL : 'omnidash.io';
+
+export const siteConfig = {
+ name: 'Omnidash',
+ author: 'Bart van der Braak',
+ url: SITE_URL,
+ description: 'Self-hostable dashboard using connectors to a multitude of ticketing systems.',
+ ogImage: `https://${SITE_URL}/og.png`,
+ links: {
+ gitHubProfile: 'https://github.com/bartvdbraak',
+ gitHubProject: 'https://github.com/bartvdbraak/omnidash',
+ },
+ keywords: `Ticket,Dashboard,Self-hosted,${SITE_URL},Bart van der Braak,Omnidash`,
+};
+
+export type SiteConfig = typeof siteConfig;
diff --git a/apps/web/src/lib/types/nav.ts b/apps/web/src/lib/types/nav.ts
new file mode 100644
index 0000000..a4eecd2
--- /dev/null
+++ b/apps/web/src/lib/types/nav.ts
@@ -0,0 +1,18 @@
+import type { Icons } from '$lib/components/site/icons';
+
+export type NavItem = {
+ title: string;
+ href: string;
+ disabled?: boolean;
+ external?: boolean;
+ icon?: keyof typeof Icons;
+ label?: string;
+};
+
+export type SidebarNavItem = NavItem & {
+ items: SidebarNavItem[];
+};
+
+export type NavItemWithChildren = NavItem & {
+ items: NavItemWithChildren[];
+};
diff --git a/apps/web/src/routes/+layout.svelte b/apps/web/src/routes/+layout.svelte
index 17abf18..30ac010 100644
--- a/apps/web/src/routes/+layout.svelte
+++ b/apps/web/src/routes/+layout.svelte
@@ -1,5 +1,26 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if dev}
+
+ {/if}
+
diff --git a/apps/web/src/routes/+page.svelte b/apps/web/src/routes/+page.svelte
index 51e11f3..188bb5b 100644
--- a/apps/web/src/routes/+page.svelte
+++ b/apps/web/src/routes/+page.svelte
@@ -16,11 +16,3 @@
{/if}
-
diff --git a/apps/web/static/apple-touch-icon.png b/apps/web/static/apple-touch-icon.png
new file mode 100644
index 0000000..89fbaf5
Binary files /dev/null and b/apps/web/static/apple-touch-icon.png differ
diff --git a/apps/web/static/favicon-16x16.png b/apps/web/static/favicon-16x16.png
new file mode 100644
index 0000000..8936240
Binary files /dev/null and b/apps/web/static/favicon-16x16.png differ
diff --git a/apps/web/static/favicon-32x32.png b/apps/web/static/favicon-32x32.png
new file mode 100644
index 0000000..4c4bcca
Binary files /dev/null and b/apps/web/static/favicon-32x32.png differ
diff --git a/apps/web/static/favicon.ico b/apps/web/static/favicon.ico
new file mode 100644
index 0000000..eabb654
Binary files /dev/null and b/apps/web/static/favicon.ico differ
diff --git a/apps/web/static/favicon.png b/apps/web/static/favicon.png
deleted file mode 100644
index 825b9e6..0000000
Binary files a/apps/web/static/favicon.png and /dev/null differ
diff --git a/apps/web/static/omnidash.svg b/apps/web/static/omnidash.svg
new file mode 100644
index 0000000..4e83575
--- /dev/null
+++ b/apps/web/static/omnidash.svg
@@ -0,0 +1,7 @@
+
diff --git a/apps/web/static/safari-pinned-tab.svg b/apps/web/static/safari-pinned-tab.svg
new file mode 100644
index 0000000..7b9e6c2
--- /dev/null
+++ b/apps/web/static/safari-pinned-tab.svg
@@ -0,0 +1,40 @@
+
+
+
diff --git a/apps/web/static/site.webmanifest b/apps/web/static/site.webmanifest
new file mode 100644
index 0000000..b20abb7
--- /dev/null
+++ b/apps/web/static/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}