From b03dcbaf2d9ca721b8b10e227cf76e3b9cc10b48 Mon Sep 17 00:00:00 2001 From: Bart van der Braak Date: Mon, 29 Jan 2024 00:55:20 +0100 Subject: [PATCH] feat: additional component and styling choices --- apps/web/package.json | 2 + apps/web/pnpm-lock.yaml | 22 ++++ apps/web/src/app.html | 22 +++- apps/web/src/app.pcss | 106 +++++++----------- .../lib/components/site/icons/github.svelte | 4 + .../src/lib/components/site/icons/index.ts | 14 +++ .../src/lib/components/site/icons/logo.svelte | 7 ++ .../lib/components/site/icons/svelte.svelte | 15 +++ .../lib/components/site/icons/vercel.svelte | 4 + apps/web/src/lib/components/site/index.ts | 8 ++ .../src/lib/components/site/metadata.svelte | 36 ++++++ .../lib/components/site/mode-toggle.svelte | 25 +++++ apps/web/src/lib/components/site/nav/index.ts | 2 + .../lib/components/site/nav/main-nav.svelte | 23 ++++ .../components/site/nav/mobile-link.svelte | 23 ++++ .../lib/components/site/nav/mobile-nav.svelte | 65 +++++++++++ .../lib/components/site/site-footer.svelte | 13 +++ .../lib/components/site/site-header.svelte | 12 ++ .../lib/components/site/site-navbar.svelte | 52 +++++++++ .../components/site/tailwind-indicator.svelte | 10 ++ .../dropdown-menu-checkbox-item.svelte | 35 ++++++ .../dropdown-menu-content.svelte | 26 +++++ .../dropdown-menu/dropdown-menu-item.svelte | 31 +++++ .../dropdown-menu/dropdown-menu-label.svelte | 19 ++++ .../dropdown-menu-radio-group.svelte | 11 ++ .../dropdown-menu-radio-item.svelte | 35 ++++++ .../dropdown-menu-separator.svelte | 14 +++ .../dropdown-menu-shortcut.svelte | 13 +++ .../dropdown-menu-sub-content.svelte | 29 +++++ .../dropdown-menu-sub-trigger.svelte | 32 ++++++ .../lib/components/ui/dropdown-menu/index.ts | 48 ++++++++ apps/web/src/lib/components/ui/sheet/index.ts | 106 ++++++++++++++++++ .../components/ui/sheet/sheet-content.svelte | 41 +++++++ .../ui/sheet/sheet-description.svelte | 13 +++ .../components/ui/sheet/sheet-footer.svelte | 16 +++ .../components/ui/sheet/sheet-header.svelte | 13 +++ .../components/ui/sheet/sheet-overlay.svelte | 21 ++++ .../components/ui/sheet/sheet-portal.svelte | 13 +++ .../components/ui/sheet/sheet-title.svelte | 16 +++ apps/web/src/lib/config/nav.ts | 24 ++++ apps/web/src/lib/config/site.ts | 17 +++ apps/web/src/lib/types/nav.ts | 18 +++ apps/web/src/routes/+layout.svelte | 25 ++++- apps/web/src/routes/+page.svelte | 8 -- apps/web/static/apple-touch-icon.png | Bin 0 -> 3245 bytes apps/web/static/favicon-16x16.png | Bin 0 -> 801 bytes apps/web/static/favicon-32x32.png | Bin 0 -> 1053 bytes apps/web/static/favicon.ico | Bin 0 -> 15086 bytes apps/web/static/favicon.png | Bin 1571 -> 0 bytes apps/web/static/omnidash.svg | 7 ++ apps/web/static/safari-pinned-tab.svg | 40 +++++++ apps/web/static/site.webmanifest | 19 ++++ 52 files changed, 1077 insertions(+), 78 deletions(-) create mode 100644 apps/web/src/lib/components/site/icons/github.svelte create mode 100644 apps/web/src/lib/components/site/icons/index.ts create mode 100644 apps/web/src/lib/components/site/icons/logo.svelte create mode 100644 apps/web/src/lib/components/site/icons/svelte.svelte create mode 100644 apps/web/src/lib/components/site/icons/vercel.svelte create mode 100644 apps/web/src/lib/components/site/index.ts create mode 100644 apps/web/src/lib/components/site/metadata.svelte create mode 100644 apps/web/src/lib/components/site/mode-toggle.svelte create mode 100644 apps/web/src/lib/components/site/nav/index.ts create mode 100644 apps/web/src/lib/components/site/nav/main-nav.svelte create mode 100644 apps/web/src/lib/components/site/nav/mobile-link.svelte create mode 100644 apps/web/src/lib/components/site/nav/mobile-nav.svelte create mode 100644 apps/web/src/lib/components/site/site-footer.svelte create mode 100644 apps/web/src/lib/components/site/site-header.svelte create mode 100644 apps/web/src/lib/components/site/site-navbar.svelte create mode 100644 apps/web/src/lib/components/site/tailwind-indicator.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte create mode 100644 apps/web/src/lib/components/ui/dropdown-menu/index.ts create mode 100644 apps/web/src/lib/components/ui/sheet/index.ts create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-content.svelte create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-description.svelte create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-footer.svelte create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-header.svelte create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-overlay.svelte create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-portal.svelte create mode 100644 apps/web/src/lib/components/ui/sheet/sheet-title.svelte create mode 100644 apps/web/src/lib/config/nav.ts create mode 100644 apps/web/src/lib/config/site.ts create mode 100644 apps/web/src/lib/types/nav.ts create mode 100644 apps/web/static/apple-touch-icon.png create mode 100644 apps/web/static/favicon-16x16.png create mode 100644 apps/web/static/favicon-32x32.png create mode 100644 apps/web/static/favicon.ico delete mode 100644 apps/web/static/favicon.png create mode 100644 apps/web/static/omnidash.svg create mode 100644 apps/web/static/safari-pinned-tab.svg create mode 100644 apps/web/static/site.webmanifest 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) + icon of hellob.art + {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
+ + + + + +
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 0000000000000000000000000000000000000000..89fbaf5daa77d6286a63e9ccde7176a62aeba1e3 GIT binary patch literal 3245 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 literal 0 HcmV?d00001 diff --git a/apps/web/static/favicon-16x16.png b/apps/web/static/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..89362407ea77703b8dfac5daffa12029c77066e5 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>$07Y{mZ*I6xvm#zfBllerKIIvJoUCvpI_YMac|F`Wq{^~`7g z&sF)Kqo`>*1IX1fo%R3Rtp68gg3#5e|1Zn{q4P6A=ps-MCUt3sE>Pvg*&q?1)c^lF zCNuv79WaR#Xb4E}|Nl-!X{ta+o0SCl1vAJ_URBD-Shi}i%ws#d$6;Xsp~si-o_yg9 z7Lu6+6mofSif763(12B8lONmJ%SG6*tDoHoVQ z`NraP_x~TYP&^>?<9Ot+l%Gux@{1M*X~kXQXq^WbE{iJ6-xluM6+2fOSd|7 z_ZYtIbJ*_g^0%>J%bxkioU?O{n0nOL-^yg0p;}~dUf`ONn0H#-T2`~@=Q8hE_PBqD zdrev1V_(*tHp9Q*1wZt`|BqgyV)hf9t6-Y4{85o)9 z8W`#tS%erFSs58v85nCD07-)rZYzMv07*k`eoAIqC2kEnr3F-g8YDqB1m~xflqVLY zGL)B>>t*I;7bhncr0V4trO$q6BL!3xUKJ8i5|mi3P*9YgmYI{PP*Pcts*qVwlFYzR zG3W6o9*)8=4UJR&r_Xpk4Pszc=GIH*7FHJao-D#Ftl-jMayW%qd2@)u=^Iy09657D i<_P=g29E_^dJM0`1xr3TnN9^-!QkoY=d#Wzp$PzJl03`+ literal 0 HcmV?d00001 diff --git a/apps/web/static/favicon-32x32.png b/apps/web/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4bccaddbcdeecaf5d5077aa0c64c37b541edf6 GIT binary patch literal 1053 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 + + + + + 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 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + + 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" +}