mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-09-02 08:42:31 +00:00
simplify mode management
This commit is contained in:
@@ -1,20 +1,22 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { base } from '$app/paths';
|
import { base } from '$app/paths';
|
||||||
import { mode } from 'mode-watcher';
|
import { mode, systemPrefersMode } from 'mode-watcher';
|
||||||
|
|
||||||
export let iconOnly = false;
|
export let iconOnly = false;
|
||||||
export let company = 'gpx.studio';
|
export let company = 'gpx.studio';
|
||||||
|
|
||||||
|
$: effectiveMode = $mode ?? $systemPrefersMode ?? 'light';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if company === 'gpx.studio'}
|
{#if company === 'gpx.studio'}
|
||||||
<img
|
<img
|
||||||
src="{base}/{iconOnly ? 'icon' : 'logo'}{$mode === 'dark' ? '-dark' : ''}.svg"
|
src="{base}/{iconOnly ? 'icon' : 'logo'}{effectiveMode === 'dark' ? '-dark' : ''}.svg"
|
||||||
alt="Logo of gpx.studio."
|
alt="Logo of gpx.studio."
|
||||||
{...$$restProps}
|
{...$$restProps}
|
||||||
/>
|
/>
|
||||||
{:else if company === 'mapbox'}
|
{:else if company === 'mapbox'}
|
||||||
<img
|
<img
|
||||||
src="{base}/mapbox-logo-{$mode === 'dark' ? 'white' : 'black'}.svg"
|
src="{base}/mapbox-logo-{effectiveMode === 'dark' ? 'white' : 'black'}.svg"
|
||||||
alt="Logo of Mapbox."
|
alt="Logo of Mapbox."
|
||||||
{...$$restProps}
|
{...$$restProps}
|
||||||
/>
|
/>
|
||||||
|
@@ -70,9 +70,7 @@
|
|||||||
import LayerControlSettings from '$lib/components/layer-control/LayerControlSettings.svelte';
|
import LayerControlSettings from '$lib/components/layer-control/LayerControlSettings.svelte';
|
||||||
import { allowedPastes, ListFileItem, ListTrackItem } from '$lib/components/file-list/FileList';
|
import { allowedPastes, ListFileItem, ListTrackItem } from '$lib/components/file-list/FileList';
|
||||||
import Export from '$lib/components/Export.svelte';
|
import Export from '$lib/components/Export.svelte';
|
||||||
|
import { mode, setMode, systemPrefersMode } from 'mode-watcher';
|
||||||
import { resetMode, setMode, systemPrefersMode } from 'mode-watcher';
|
|
||||||
|
|
||||||
import { _, locale } from 'svelte-i18n';
|
import { _, locale } from 'svelte-i18n';
|
||||||
import { languages } from '$lib/languages';
|
import { languages } from '$lib/languages';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
@@ -84,7 +82,6 @@
|
|||||||
temperatureUnits,
|
temperatureUnits,
|
||||||
elevationProfile,
|
elevationProfile,
|
||||||
verticalFileView,
|
verticalFileView,
|
||||||
mode,
|
|
||||||
currentBasemap,
|
currentBasemap,
|
||||||
previousBasemap,
|
previousBasemap,
|
||||||
currentOverlays,
|
currentOverlays,
|
||||||
@@ -94,12 +91,6 @@
|
|||||||
streetViewSource
|
streetViewSource
|
||||||
} = settings;
|
} = settings;
|
||||||
|
|
||||||
$: if ($mode === 'system') {
|
|
||||||
resetMode();
|
|
||||||
} else {
|
|
||||||
setMode($mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
let undoDisabled = derived(canUndo, ($canUndo) => !$canUndo);
|
let undoDisabled = derived(canUndo, ($canUndo) => !$canUndo);
|
||||||
let redoDisabled = derived(canRedo, ($canRedo) => !$canRedo);
|
let redoDisabled = derived(canRedo, ($canRedo) => !$canRedo);
|
||||||
|
|
||||||
@@ -126,6 +117,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
let layerSettingsOpen = false;
|
let layerSettingsOpen = false;
|
||||||
|
|
||||||
|
$: selectedMode = $mode ?? $systemPrefersMode ?? 'light';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="absolute md:top-2 left-0 right-0 z-20 flex flex-row justify-center pointer-events-none">
|
<div class="absolute md:top-2 left-0 right-0 z-20 flex flex-row justify-center pointer-events-none">
|
||||||
@@ -385,26 +378,22 @@
|
|||||||
</Menubar.Sub>
|
</Menubar.Sub>
|
||||||
<Menubar.Sub>
|
<Menubar.Sub>
|
||||||
<Menubar.SubTrigger>
|
<Menubar.SubTrigger>
|
||||||
{#if $mode === 'system'}
|
{#if selectedMode === 'light'}
|
||||||
{#if $systemPrefersMode === 'light'}
|
|
||||||
<Sun size="16" class="mr-1" />
|
|
||||||
{:else if $systemPrefersMode === 'dark'}
|
|
||||||
<Moon size="16" class="mr-1" />
|
|
||||||
{:else}
|
|
||||||
<Sun size="16" class="mr-1" />
|
|
||||||
{/if}
|
|
||||||
{:else if $mode === 'light'}
|
|
||||||
<Sun size="16" class="mr-1" />
|
<Sun size="16" class="mr-1" />
|
||||||
{:else if $mode === 'dark'}
|
{:else}
|
||||||
<Moon size="16" class="mr-1" />
|
<Moon size="16" class="mr-1" />
|
||||||
{/if}
|
{/if}
|
||||||
{$_('menu.mode')}
|
{$_('menu.mode')}
|
||||||
</Menubar.SubTrigger>
|
</Menubar.SubTrigger>
|
||||||
<Menubar.SubContent>
|
<Menubar.SubContent>
|
||||||
<Menubar.RadioGroup bind:value={$mode}>
|
<Menubar.RadioGroup
|
||||||
|
bind:value={selectedMode}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
setMode(value);
|
||||||
|
}}
|
||||||
|
>
|
||||||
<Menubar.RadioItem value="light">{$_('menu.light')}</Menubar.RadioItem>
|
<Menubar.RadioItem value="light">{$_('menu.light')}</Menubar.RadioItem>
|
||||||
<Menubar.RadioItem value="dark">{$_('menu.dark')}</Menubar.RadioItem>
|
<Menubar.RadioItem value="dark">{$_('menu.dark')}</Menubar.RadioItem>
|
||||||
<Menubar.RadioItem value="system">{$_('menu.system')}</Menubar.RadioItem>
|
|
||||||
</Menubar.RadioGroup>
|
</Menubar.RadioGroup>
|
||||||
</Menubar.SubContent>
|
</Menubar.SubContent>
|
||||||
</Menubar.Sub>
|
</Menubar.Sub>
|
||||||
|
@@ -2,45 +2,30 @@
|
|||||||
import * as Popover from '$lib/components/ui/popover';
|
import * as Popover from '$lib/components/ui/popover';
|
||||||
import { Button } from '$lib/components/ui/button';
|
import { Button } from '$lib/components/ui/button';
|
||||||
import { Moon, Sun } from 'lucide-svelte';
|
import { Moon, Sun } from 'lucide-svelte';
|
||||||
import { resetMode, setMode, systemPrefersMode } from 'mode-watcher';
|
import { mode, resetMode, setMode, systemPrefersMode } from 'mode-watcher';
|
||||||
import { settings } from '$lib/db';
|
|
||||||
import { _ } from 'svelte-i18n';
|
import { _ } from 'svelte-i18n';
|
||||||
|
|
||||||
const { mode } = settings;
|
|
||||||
|
|
||||||
$: if ($mode === 'system') {
|
|
||||||
resetMode();
|
|
||||||
} else {
|
|
||||||
setMode($mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
export let size = '20';
|
export let size = '20';
|
||||||
let open = false;
|
let open = false;
|
||||||
|
|
||||||
|
$: selectedMode = $mode ?? $systemPrefersMode ?? 'light';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Popover.Root bind:open>
|
<Popover.Root bind:open>
|
||||||
<Popover.Trigger {...$$restProps}>
|
<Popover.Trigger {...$$restProps}>
|
||||||
{#if $mode === 'system'}
|
{#if selectedMode === 'light'}
|
||||||
{#if $systemPrefersMode === 'light'}
|
|
||||||
<Sun {size} class="mr-1" />
|
|
||||||
{:else if $systemPrefersMode === 'dark'}
|
|
||||||
<Moon {size} class="mr-1" />
|
|
||||||
{:else}
|
|
||||||
<Sun {size} class="mr-1" />
|
|
||||||
{/if}
|
|
||||||
{:else if $mode === 'light'}
|
|
||||||
<Sun {size} class="mr-1" />
|
<Sun {size} class="mr-1" />
|
||||||
{:else if $mode === 'dark'}
|
{:else}
|
||||||
<Moon {size} class="mr-1" />
|
<Moon {size} class="mr-1" />
|
||||||
{/if}
|
{/if}
|
||||||
</Popover.Trigger>
|
</Popover.Trigger>
|
||||||
<Popover.Content class=" w-fit flex flex-col p-2">
|
<Popover.Content class=" w-fit flex flex-col p-2">
|
||||||
{#each ['light', 'dark', 'system'] as m}
|
{#each ['light', 'dark'] as m}
|
||||||
<Button
|
<Button
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
class="h-8 justify-start"
|
class="h-8 justify-start"
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
$mode = m;
|
setMode(m);
|
||||||
open = false;
|
open = false;
|
||||||
}}>{$_(`menu.${m}`)}</Button
|
}}>{$_(`menu.${m}`)}</Button
|
||||||
>
|
>
|
||||||
|
@@ -3,7 +3,6 @@ import { GPXFile, GPXStatistics, Track, TrackSegment, Waypoint, TrackPoint, type
|
|||||||
import { enableMapSet, enablePatches, applyPatches, type Patch, type WritableDraft, freeze, produceWithPatches } from 'immer';
|
import { enableMapSet, enablePatches, applyPatches, type Patch, type WritableDraft, freeze, produceWithPatches } from 'immer';
|
||||||
import { writable, get, derived, type Readable, type Writable } from 'svelte/store';
|
import { writable, get, derived, type Readable, type Writable } from 'svelte/store';
|
||||||
import { gpxStatistics, initTargetMapBounds, splitAs, updateAllHidden, updateTargetMapBounds } from './stores';
|
import { gpxStatistics, initTargetMapBounds, splitAs, updateAllHidden, updateTargetMapBounds } from './stores';
|
||||||
import { mode } from 'mode-watcher';
|
|
||||||
import { defaultBasemap, defaultBasemapTree, defaultOverlayTree, defaultOverlays, type CustomLayer, defaultOpacities } from './assets/layers';
|
import { defaultBasemap, defaultBasemapTree, defaultOverlayTree, defaultOverlays, type CustomLayer, defaultOpacities } from './assets/layers';
|
||||||
import { applyToOrderedItemsFromFile, applyToOrderedSelectedItemsFromFile, selection } from '$lib/components/file-list/Selection';
|
import { applyToOrderedItemsFromFile, applyToOrderedSelectedItemsFromFile, selection } from '$lib/components/file-list/Selection';
|
||||||
import { ListFileItem, ListItem, ListTrackItem, ListLevel, ListTrackSegmentItem, ListWaypointItem, ListRootItem } from '$lib/components/file-list/FileList';
|
import { ListFileItem, ListItem, ListTrackItem, ListLevel, ListTrackSegmentItem, ListWaypointItem, ListRootItem } from '$lib/components/file-list/FileList';
|
||||||
@@ -88,13 +87,6 @@ export const settings = {
|
|||||||
additionalDatasets: dexieSettingStore<string[]>('additionalDatasets', []),
|
additionalDatasets: dexieSettingStore<string[]>('additionalDatasets', []),
|
||||||
elevationFill: dexieSettingStore<'slope' | 'surface' | undefined>('elevationFill', undefined),
|
elevationFill: dexieSettingStore<'slope' | 'surface' | undefined>('elevationFill', undefined),
|
||||||
verticalFileView: dexieSettingStore<boolean>('fileView', false),
|
verticalFileView: dexieSettingStore<boolean>('fileView', false),
|
||||||
mode: dexieSettingStore('mode', (() => {
|
|
||||||
let currentMode: string | undefined = get(mode);
|
|
||||||
if (currentMode === undefined) {
|
|
||||||
currentMode = 'system';
|
|
||||||
}
|
|
||||||
return currentMode;
|
|
||||||
})()),
|
|
||||||
minimizeRoutingMenu: dexieSettingStore('minimizeRoutingMenu', false),
|
minimizeRoutingMenu: dexieSettingStore('minimizeRoutingMenu', false),
|
||||||
routing: dexieSettingStore('routing', true),
|
routing: dexieSettingStore('routing', true),
|
||||||
routingProfile: dexieSettingStore('routingProfile', 'bike'),
|
routingProfile: dexieSettingStore('routingProfile', 'bike'),
|
||||||
|
@@ -45,7 +45,6 @@
|
|||||||
"mode": "Mode",
|
"mode": "Mode",
|
||||||
"light": "Light",
|
"light": "Light",
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"system": "System",
|
|
||||||
"street_view_source": "Street view source",
|
"street_view_source": "Street view source",
|
||||||
"mapillary": "Mapillary",
|
"mapillary": "Mapillary",
|
||||||
"google": "Google",
|
"google": "Google",
|
||||||
|
Reference in New Issue
Block a user