cobalt/web/src/components/sidebar/SidebarTab.svelte

132 lines
2.9 KiB
Svelte
Raw Normal View History

2024-06-14 12:33:01 +02:00
<script lang="ts">
import { page } from "$app/stores";
import { t } from "$lib/i18n/translations";
2024-06-14 12:33:01 +02:00
export let tabName: string;
export let tabLink: string;
const firstTabPage = ["save", "settings", "updates"];
let tab: HTMLElement;
$: currentTab = $page.url.pathname.split("/")[1];
$: baseTabPath = tabLink.split("/")[1];
$: isTabActive = currentTab === baseTabPath;
const showTab = (e: HTMLElement) => {
if (e) {
e.scrollIntoView({
inline: firstTabPage.includes(tabName) ? "end" : "start",
behavior: "smooth",
});
}
};
$: if (isTabActive && tab) {
showTab(tab);
}
2024-06-14 12:33:01 +02:00
</script>
<a
id="sidebar-tab-{tabName}"
class="sidebar-tab"
class:active={isTabActive}
href={tabLink}
bind:this={tab}
on:focus={() => showTab(tab)}
role="tab"
aria-selected={isTabActive}
2024-06-14 12:33:01 +02:00
>
<slot></slot>
{$t(`tabs.${tabName}`)}
2024-06-14 12:33:01 +02:00
</a>
<style>
.sidebar-tab {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 5px;
2024-06-14 17:48:57 +02:00
padding: var(--padding) 5px;
color: var(--sidebar-highlight);
2024-06-14 12:33:01 +02:00
font-size: var(--sidebar-font-size);
opacity: 0.8;
height: fit-content;
border-radius: var(--border-radius);
will-change: transform;
transition: transform 0.2s;
2024-06-14 12:33:01 +02:00
}
2024-06-14 12:38:10 +02:00
.sidebar-tab :global(svg) {
stroke-width: 1.2px;
height: 21px;
width: 21px;
}
2024-06-14 12:33:01 +02:00
.sidebar-tab.active {
color: var(--sidebar-bg);
background: var(--sidebar-highlight);
2024-06-14 12:33:01 +02:00
opacity: 1;
animation: pressButton 0.2s;
transition: none;
transform: none;
2024-06-14 12:33:01 +02:00
}
2024-06-14 12:38:10 +02:00
.sidebar-tab:active:not(.active) {
transform: scale(0.95);
}
@keyframes pressButton {
0% {
transform: scale(0.95)
}
50% {
transform: scale(1.01)
}
100% {
transform: none
}
}
@media (hover: hover) {
.sidebar-tab:active:not(.active) {
opacity: 1;
background-color: var(--sidebar-hover);
}
.sidebar-tab:hover:not(.active) {
opacity: 1;
background-color: var(--sidebar-hover);
}
}
2024-06-14 13:33:33 +02:00
@media screen and (max-width: 535px) {
.sidebar-tab {
2024-06-14 17:48:57 +02:00
padding: 5px var(--padding);
2024-06-14 13:33:33 +02:00
min-width: calc(var(--sidebar-width) / 2);
}
2024-06-14 13:33:33 +02:00
.sidebar-tab.active {
z-index: 2;
}
.sidebar-tab:active:not(.active) {
transform: scale(0.9);
}
@keyframes pressButton {
0% {
transform: scale(0.9)
}
60% {
transform: scale(1.01)
}
100% {
transform: scale(1)
}
}
2024-06-14 13:33:33 +02:00
}
2024-06-14 12:33:01 +02:00
</style>