cobalt/web/src/components/sidebar/Sidebar.svelte
wukko a43e7a629b
web: add local processing setting & api type
response is not handled at all yet, this is a raw draft
2025-01-29 15:06:16 +06:00

137 lines
4.3 KiB
Svelte

<script lang="ts">
import settings from "$lib/state/settings";
import { device } from "$lib/device";
import { t } from "$lib/i18n/translations";
import { defaultNavPage } from "$lib/subnav";
import CobaltLogo from "$components/sidebar/CobaltLogo.svelte";
import SidebarTab from "$components/sidebar/SidebarTab.svelte";
import IconDownload from "@tabler/icons-svelte/IconDownload.svelte";
import IconSettings from "@tabler/icons-svelte/IconSettings.svelte";
import IconRepeat from "@tabler/icons-svelte/IconRepeat.svelte";
import IconComet from "@tabler/icons-svelte/IconComet.svelte";
import IconHeart from "@tabler/icons-svelte/IconHeart.svelte";
import IconInfoCircle from "@tabler/icons-svelte/IconInfoCircle.svelte";
import IconCut from "@tabler/icons-svelte/IconCut.svelte";
let screenWidth: number;
let settingsLink = defaultNavPage("settings");
let aboutLink = defaultNavPage("about");
$: screenWidth,
(settingsLink = defaultNavPage("settings")),
(aboutLink = defaultNavPage("about"));
</script>
<svelte:window bind:innerWidth={screenWidth} />
<nav id="sidebar" aria-label={$t("a11y.tabs.tab_panel")}>
<CobaltLogo />
<div id="sidebar-tabs" role="tablist">
<div id="sidebar-actions" class="sidebar-inner-container">
<SidebarTab name="save" path="/" icon={IconDownload} />
<SidebarTab name="remux" path="/remux" icon={IconRepeat} beta />
{#if $settings.advanced.localProcessing && !device.is.mobile && $settings.advanced.debug}
<SidebarTab name="cutout" path="/cutout" icon={IconCut} beta />
{/if}
</div>
<div id="sidebar-info" class="sidebar-inner-container">
<SidebarTab name="settings" path={settingsLink} icon={IconSettings} />
<SidebarTab name="donate" path="/donate" icon={IconHeart} />
<SidebarTab name="updates" path="/updates" icon={IconComet} />
<SidebarTab name="about" path={aboutLink} icon={IconInfoCircle} />
</div>
</div>
</nav>
<style>
#sidebar,
#sidebar-tabs,
.sidebar-inner-container {
display: flex;
flex-direction: column;
}
#sidebar {
background: var(--sidebar-bg);
height: 100vh;
width: calc(var(--sidebar-width) + var(--sidebar-inner-padding) * 2);
position: sticky;
}
#sidebar-tabs {
height: 100%;
justify-content: space-between;
padding: var(--sidebar-inner-padding);
padding-bottom: var(--sidebar-tab-padding);
overflow-y: scroll;
}
@media screen and (max-width: 535px) {
#sidebar,
#sidebar-tabs,
.sidebar-inner-container {
flex-direction: row;
}
#sidebar {
width: 100%;
height: var(--sidebar-height-mobile);
position: fixed;
bottom: 0;
justify-content: center;
align-items: flex-start;
z-index: 3;
padding: var(--sidebar-inner-padding) 0;
}
#sidebar::before {
content: "";
z-index: 1;
width: 100%;
height: 100%;
display: block;
position: absolute;
pointer-events: none;
background: var(--sidebar-mobile-gradient);
}
#sidebar-tabs {
overflow-y: visible;
overflow-x: scroll;
padding: 0;
height: fit-content;
}
#sidebar :global(.sidebar-inner-container:first-child) {
padding-left: calc(var(--border-radius) * 1.5);
}
#sidebar :global(.sidebar-inner-container:last-child) {
padding-right: calc(var(--border-radius) * 1.5);
}
#sidebar :global(.sidebar-inner-container:first-child:dir(rtl)) {
padding-left: 0;
padding-right: calc(var(--border-radius) * 1.5);
}
#sidebar :global(.sidebar-inner-container:last-child:dir(rtl)) {
padding-right: 0;
padding-left: calc(var(--border-radius) * 1.5);
}
}
/* add padding for notch / dynamic island in landscape */
@media screen and (orientation: landscape) {
:global([data-iphone="true"]) #sidebar {
padding-left: env(safe-area-inset-left);
}
}
</style>