-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
131 additions
and
129 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
<script lang="ts"> | ||
import { Separator } from '$lib/components/ui/separator'; | ||
import { | ||
ChartColumn, | ||
GitBranchPlus, | ||
Grip, | ||
LayoutList, | ||
Map, | ||
Settings, | ||
} from '@o7/icon/lucide'; | ||
import { | ||
Dock, | ||
DockDropdownItem, | ||
DockFloatingItem, | ||
DockTooltipItem, | ||
} from '$lib/components/dock'; | ||
import { page } from '$app/stores'; | ||
import { flyAndScale } from '$lib/utils'; | ||
import { openModalsState } from '$lib/stores.svelte'; | ||
const addFlightItem = { | ||
label: 'Add flight', | ||
icon: GitBranchPlus, | ||
onClick: () => { | ||
openModalsState.addFlight = true; | ||
}, | ||
}; | ||
const listFlightsItem = { | ||
label: 'List flights', | ||
icon: LayoutList, | ||
onClick: () => { | ||
openModalsState.listFlights = true; | ||
}, | ||
}; | ||
const flightsStatisticsItem = { | ||
label: 'Statistics', | ||
icon: ChartColumn, | ||
onClick: () => { | ||
openModalsState.statistics = true; | ||
}, | ||
}; | ||
const settingsItem = { | ||
label: 'Settings', | ||
icon: Settings, | ||
onClick: () => { | ||
openModalsState.settings = true; | ||
}, | ||
}; | ||
const OTHER = [ | ||
{ | ||
label: 'Visited countries', | ||
href: '/visited-countries', | ||
}, | ||
]; | ||
</script> | ||
|
||
<div class="absolute bottom-6 left-1/2 translate-x-[-50%]"> | ||
<div class="flex gap-4"> | ||
{#if $page.url.pathname !== '/'} | ||
<div transition:flyAndScale> | ||
<DockFloatingItem href="/" label="Home"> | ||
<Map /> | ||
</DockFloatingItem> | ||
</div> | ||
{/if} | ||
<Dock> | ||
<DockTooltipItem item={addFlightItem} /> | ||
{#if $page.url.pathname === '/'} | ||
<DockTooltipItem item={listFlightsItem} /> | ||
<DockTooltipItem item={flightsStatisticsItem} /> | ||
{/if} | ||
<DockDropdownItem items={OTHER} label="More"> | ||
<Grip /> | ||
</DockDropdownItem> | ||
<Separator orientation="vertical" class="h-full w-[1px]" /> | ||
<DockTooltipItem item={settingsItem} /> | ||
</Dock> | ||
</div> | ||
</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,55 +1,46 @@ | ||
<script lang="ts"> | ||
import { Motion } from 'svelte-motion'; | ||
import { tv, type VariantProps } from 'tailwind-variants'; | ||
import { cn } from '$lib/utils'; | ||
interface DockProps extends VariantProps<typeof dockVariants> { | ||
className?: string; | ||
magnification?: number; | ||
distance?: number; | ||
import { dockContext } from './context.svelte'; | ||
import type { Snippet } from 'svelte'; | ||
let { | ||
class: className = undefined, | ||
direction = 'middle', | ||
children, | ||
}: { | ||
class?: string; | ||
direction?: 'top' | 'middle' | 'bottom'; | ||
} | ||
let className: DockProps['className'] = undefined; | ||
export { className as class }; | ||
export let magnification: DockProps['magnification'] = 60; | ||
export let distance: DockProps['distance'] = 140; | ||
export let direction: DockProps['direction'] = 'middle'; | ||
const dockVariants = tv({ | ||
base: 'h-[58px] p-2 flex gap-2 rounded-2xl border bg-background/70 backdrop-blur-md', | ||
}); | ||
let dockElement: HTMLDivElement; | ||
let mouseX = Infinity; | ||
children: Snippet; | ||
} = $props(); | ||
function handleMouseMove(e: MouseEvent) { | ||
mouseX = e.pageX; | ||
dockContext.mouseX = e.pageX; | ||
} | ||
function handleMouseLeave() { | ||
mouseX = Infinity; | ||
dockContext.mouseX = Infinity; | ||
} | ||
let dockClass = cn(dockVariants({ className }), { | ||
'items-start': direction === 'top', | ||
'items-center': direction === 'middle', | ||
'items-end': direction === 'bottom', | ||
}); | ||
let dockClass = cn( | ||
'h-[58px] p-2 flex gap-2 rounded-2xl border bg-background/70 backdrop-blur-md', | ||
className, | ||
{ | ||
'items-start': direction === 'top', | ||
'items-center': direction === 'middle', | ||
'items-end': direction === 'bottom', | ||
}, | ||
); | ||
</script> | ||
|
||
<Motion let:motion> | ||
<!-- svelte-ignore a11y-no-static-element-interactions --> | ||
<!-- svelte-ignore a11y_no_static_element_interactions --> | ||
<div | ||
use:motion | ||
bind:this={dockElement} | ||
on:mousemove={(e) => handleMouseMove(e)} | ||
on:mouseleave={handleMouseLeave} | ||
onmousemove={(e) => handleMouseMove(e)} | ||
onmouseleave={handleMouseLeave} | ||
class={dockClass} | ||
> | ||
<slot {mouseX} {magnification} {distance}> | ||
<!-- Your Content --> | ||
Default | ||
</slot> | ||
{@render children()} | ||
</div> | ||
</Motion> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
export const dockContext: { | ||
mouseX: number; | ||
magnification: number; | ||
distance: number; | ||
} = $state({ | ||
mouseX: Infinity, | ||
magnification: 60, | ||
distance: 140, | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export { default as NavigationDock } from './NavigationDock.svelte'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters