mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-08-30 23:30:04 +00:00
toolbar
This commit is contained in:
44
website/package-lock.json
generated
44
website/package-lock.json
generated
@@ -8,12 +8,15 @@
|
||||
"name": "website",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"@fortawesome/free-brands-svg-icons": "^6.5.2",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.5.2",
|
||||
"@maplibre/maplibre-gl-geocoder": "^1.5.0",
|
||||
"bits-ui": "^0.21.2",
|
||||
"clsx": "^2.1.0",
|
||||
"gpx": "file:../gpx",
|
||||
"lucide-svelte": "^0.365.0",
|
||||
"maplibre-gl": "^4.1.2",
|
||||
"svelte-fa": "^4.0.2",
|
||||
"tailwind-merge": "^2.2.2",
|
||||
"tailwind-variants": "^0.2.1"
|
||||
},
|
||||
@@ -544,6 +547,39 @@
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
|
||||
"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
|
||||
},
|
||||
"node_modules/@fortawesome/fontawesome-common-types": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz",
|
||||
"integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==",
|
||||
"hasInstallScript": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/@fortawesome/free-brands-svg-icons": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.2.tgz",
|
||||
"integrity": "sha512-zi5FNYdmKLnEc0jc0uuHH17kz/hfYTg4Uei0wMGzcoCL/4d3WM3u1VMc0iGGa31HuhV5i7ZK8ZlTCQrHqRHSGQ==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-common-types": "6.5.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/@fortawesome/free-solid-svg-icons": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz",
|
||||
"integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-common-types": "6.5.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array": {
|
||||
"version": "0.11.14",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
||||
@@ -4352,6 +4388,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/svelte-fa": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/svelte-fa/-/svelte-fa-4.0.2.tgz",
|
||||
"integrity": "sha512-lza8Jfii6jcpMQB73mBStONxaLfZsUS+rKJ/hH6WxsHUd+g68+oHIL9yQTk4a0uY9HQk78T/CPvQnED0msqJfg==",
|
||||
"peerDependencies": {
|
||||
"svelte": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svelte-hmr": {
|
||||
"version": "0.15.3",
|
||||
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
|
||||
|
@@ -37,12 +37,15 @@
|
||||
},
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@fortawesome/free-brands-svg-icons": "^6.5.2",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.5.2",
|
||||
"@maplibre/maplibre-gl-geocoder": "^1.5.0",
|
||||
"bits-ui": "^0.21.2",
|
||||
"clsx": "^2.1.0",
|
||||
"gpx": "file:../gpx",
|
||||
"lucide-svelte": "^0.365.0",
|
||||
"maplibre-gl": "^4.1.2",
|
||||
"svelte-fa": "^4.0.2",
|
||||
"tailwind-merge": "^2.2.2",
|
||||
"tailwind-variants": "^0.2.1"
|
||||
}
|
||||
|
@@ -11,9 +11,9 @@
|
||||
</script>
|
||||
|
||||
<div class="absolute top-2 left-0 right-0 z-10 flex flex-row justify-center pointer-events-none">
|
||||
<div class="w-fit flex flex-row items-center px-1 bg-background rounded-md pointer-events-auto">
|
||||
<Logo class="h-5 mt-1 mx-2" />
|
||||
<Menubar.Root class="border-none">
|
||||
<div class="w-fit flex flex-row items-center p-1 bg-background rounded-md pointer-events-auto">
|
||||
<Logo class="h-5 mt-0.5 mx-2" />
|
||||
<Menubar.Root class="border-none h-fit p-0">
|
||||
<Menubar.Menu>
|
||||
<Menubar.Trigger>File</Menubar.Trigger>
|
||||
<Menubar.Content>
|
||||
@@ -86,20 +86,31 @@
|
||||
</Menubar.Content>
|
||||
</Menubar.Menu>
|
||||
</Menubar.Root>
|
||||
<div class="py-1 h-10">
|
||||
<Button
|
||||
variant="ghost"
|
||||
href="/about"
|
||||
target="_blank"
|
||||
class="cursor-default py-1.5 px-3 h-fit rounded-sm">About</Button
|
||||
<div class="h-fit flex flex-row items-center">
|
||||
<Button variant="ghost" href="/about" target="_blank" class="cursor-default h-fit rounded-sm"
|
||||
>About</Button
|
||||
>
|
||||
<Button
|
||||
variant="ghost"
|
||||
href="https://ko-fi.com/gpxstudio"
|
||||
target="_blank"
|
||||
class="cursor-default py-1.5 px-3 h-fit rounded-sm"
|
||||
class="cursor-default h-fit rounded-sm"
|
||||
>Donate <HeartHandshake size="18" class="ml-1" /></Button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style lang="postcss">
|
||||
div :global(button) {
|
||||
@apply hover:bg-accent;
|
||||
@apply px-3;
|
||||
@apply py-0.5;
|
||||
}
|
||||
|
||||
div :global(a) {
|
||||
@apply hover:bg-accent;
|
||||
@apply px-3;
|
||||
@apply py-0.5;
|
||||
}
|
||||
</style>
|
||||
|
76
website/src/lib/components/Toolbar.svelte
Normal file
76
website/src/lib/components/Toolbar.svelte
Normal file
@@ -0,0 +1,76 @@
|
||||
<script lang="ts">
|
||||
import ToolbarItem from './ToolbarItem.svelte';
|
||||
import Fa from 'svelte-fa';
|
||||
import {
|
||||
faPencil,
|
||||
faStopwatch,
|
||||
faExchange,
|
||||
faPlusCircle,
|
||||
faListUl,
|
||||
faCopy,
|
||||
faMapMarkerAlt,
|
||||
faCompressAlt,
|
||||
faVectorSquare,
|
||||
faEyeSlash,
|
||||
faPalette,
|
||||
faFolderTree,
|
||||
faTrashAlt
|
||||
} from '@fortawesome/free-solid-svg-icons';
|
||||
</script>
|
||||
|
||||
<div class="absolute top-0 bottom-0 left-0 z-10 flex flex-col justify-center pointer-events-none">
|
||||
<div class="flex flex-col p-1 space-y-1 bg-background rounded-md pointer-events-auto">
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faPencil} />
|
||||
<span slot="tooltip">Edit the track points</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faStopwatch} />
|
||||
<span slot="tooltip">Change time and speed data</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faExchange} />
|
||||
<span slot="tooltip">Reverse the order of the track points</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faPlusCircle} />
|
||||
<span slot="tooltip">Merge with another file</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faListUl} />
|
||||
<span slot="tooltip">Extract the tracks or track segments to new files</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faCopy} />
|
||||
<span slot="tooltip">Duplicate the file</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faMapMarkerAlt} />
|
||||
<span slot="tooltip">Create a new point of interest</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faCompressAlt} />
|
||||
<span slot="tooltip">Reduce the number of track points</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faVectorSquare} />
|
||||
<span slot="tooltip">Clean track points and POIs with a rectangle selection</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faEyeSlash} />
|
||||
<span slot="tooltip">Hide/unhide the trace</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faPalette} />
|
||||
<span slot="tooltip">Change the styling of the trace</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faFolderTree} />
|
||||
<span slot="tooltip">Manage the file structure</span>
|
||||
</ToolbarItem>
|
||||
<ToolbarItem>
|
||||
<Fa slot="icon" icon={faTrashAlt} />
|
||||
<span slot="tooltip">Delete the file</span>
|
||||
</ToolbarItem>
|
||||
</div>
|
||||
</div>
|
15
website/src/lib/components/ToolbarItem.svelte
Normal file
15
website/src/lib/components/ToolbarItem.svelte
Normal file
@@ -0,0 +1,15 @@
|
||||
<script lang="ts">
|
||||
import { Button } from '$lib/components/ui/button';
|
||||
import * as Tooltip from '$lib/components/ui/tooltip/index.js';
|
||||
</script>
|
||||
|
||||
<Tooltip.Root openDelay="300">
|
||||
<Tooltip.Trigger asChild let:builder>
|
||||
<Button builders={[builder]} variant="ghost" class="h-fit px-1 py-1.5">
|
||||
<slot name="icon" />
|
||||
</Button>
|
||||
</Tooltip.Trigger>
|
||||
<Tooltip.Content side="right">
|
||||
<slot name="tooltip" />
|
||||
</Tooltip.Content>
|
||||
</Tooltip.Root>
|
15
website/src/lib/components/ui/tooltip/index.ts
Normal file
15
website/src/lib/components/ui/tooltip/index.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
||||
import Content from "./tooltip-content.svelte";
|
||||
|
||||
const Root = TooltipPrimitive.Root;
|
||||
const Trigger = TooltipPrimitive.Trigger;
|
||||
|
||||
export {
|
||||
Root,
|
||||
Trigger,
|
||||
Content,
|
||||
//
|
||||
Root as Tooltip,
|
||||
Content as TooltipContent,
|
||||
Trigger as TooltipTrigger,
|
||||
};
|
28
website/src/lib/components/ui/tooltip/tooltip-content.svelte
Normal file
28
website/src/lib/components/ui/tooltip/tooltip-content.svelte
Normal file
@@ -0,0 +1,28 @@
|
||||
<script lang="ts">
|
||||
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
||||
import { cn, flyAndScale } from "$lib/utils.js";
|
||||
|
||||
type $$Props = TooltipPrimitive.ContentProps;
|
||||
|
||||
let className: $$Props["class"] = undefined;
|
||||
export let sideOffset: $$Props["sideOffset"] = 4;
|
||||
export let transition: $$Props["transition"] = flyAndScale;
|
||||
export let transitionConfig: $$Props["transitionConfig"] = {
|
||||
y: 8,
|
||||
duration: 150,
|
||||
};
|
||||
export { className as class };
|
||||
</script>
|
||||
|
||||
<TooltipPrimitive.Content
|
||||
{transition}
|
||||
{transitionConfig}
|
||||
{sideOffset}
|
||||
class={cn(
|
||||
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md",
|
||||
className
|
||||
)}
|
||||
{...$$restProps}
|
||||
>
|
||||
<slot />
|
||||
</TooltipPrimitive.Content>
|
@@ -1,11 +1,13 @@
|
||||
<script lang="ts">
|
||||
import Map from '$lib/components/Map.svelte';
|
||||
import Menu from '$lib/components/Menu.svelte';
|
||||
import Toolbar from '$lib/components/Toolbar.svelte';
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col w-screen h-screen">
|
||||
<div class="grow relative">
|
||||
<Menu />
|
||||
<Toolbar />
|
||||
<Map class="h-full" />
|
||||
</div>
|
||||
<div class="h-1/3">Test</div>
|
||||
|
Reference in New Issue
Block a user