2024-06-14 12:33:01 +02:00
|
|
|
<script lang="ts">
|
|
|
|
import { page } from "$app/stores";
|
|
|
|
|
2024-07-02 20:16:03 +02:00
|
|
|
import { t } from "$lib/i18n/translations";
|
|
|
|
|
2024-06-14 12:33:01 +02:00
|
|
|
export let tabName: string;
|
|
|
|
export let tabLink: string;
|
|
|
|
|
2024-07-02 20:16:03 +02:00
|
|
|
const firstTabPage = ["save", "settings", "updates"];
|
2024-06-16 21:00:18 +02:00
|
|
|
|
2024-06-16 20:31:07 +02:00
|
|
|
let tab: HTMLElement;
|
|
|
|
|
2024-07-02 20:16:03 +02:00
|
|
|
$: currentTab = $page.url.pathname.split("/")[1];
|
|
|
|
$: baseTabPath = tabLink.split("/")[1];
|
2024-06-24 11:47:20 +02:00
|
|
|
|
|
|
|
$: isTabActive = currentTab === baseTabPath;
|
2024-06-16 20:31:07 +02:00
|
|
|
|
2024-07-10 17:46:14 +02:00
|
|
|
const showTab = (e: HTMLElement) => {
|
2024-06-16 20:31:07 +02:00
|
|
|
if (e) {
|
2024-06-16 21:00:18 +02:00
|
|
|
e.scrollIntoView({
|
2024-07-02 20:16:03 +02:00
|
|
|
inline: firstTabPage.includes(tabName) ? "end" : "start",
|
|
|
|
behavior: "smooth",
|
2024-06-16 21:00:18 +02:00
|
|
|
});
|
2024-06-16 20:31:07 +02:00
|
|
|
}
|
2024-07-02 20:16:03 +02:00
|
|
|
};
|
2024-06-16 20:31:07 +02:00
|
|
|
|
2024-07-10 17:46:14 +02:00
|
|
|
$: if (isTabActive && tab) {
|
2024-07-02 20:16:03 +02:00
|
|
|
showTab(tab);
|
2024-07-12 13:06:05 +02:00
|
|
|
|
|
|
|
tab.classList.add("animate")
|
|
|
|
setTimeout(() => {
|
|
|
|
tab.classList.remove("animate")
|
|
|
|
}, 220)
|
2024-06-16 20:31:07 +02:00
|
|
|
}
|
2024-06-14 12:33:01 +02:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<a
|
|
|
|
id="sidebar-tab-{tabName}"
|
|
|
|
class="sidebar-tab"
|
|
|
|
class:active={isTabActive}
|
|
|
|
href={tabLink}
|
2024-06-16 20:31:07 +02:00
|
|
|
bind:this={tab}
|
|
|
|
on:focus={() => showTab(tab)}
|
2024-07-02 20:16:03 +02:00
|
|
|
role="tab"
|
2024-07-08 08:58:21 +02:00
|
|
|
aria-selected={isTabActive}
|
2024-06-14 12:33:01 +02:00
|
|
|
>
|
|
|
|
<slot></slot>
|
2024-07-02 20:16:03 +02:00
|
|
|
{$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;
|
2024-06-16 17:45:24 +02:00
|
|
|
color: var(--sidebar-highlight);
|
2024-06-14 12:33:01 +02:00
|
|
|
font-size: var(--sidebar-font-size);
|
|
|
|
opacity: 0.8;
|
2024-06-16 18:26:06 +02:00
|
|
|
height: fit-content;
|
2024-06-16 18:59:16 +02:00
|
|
|
border-radius: var(--border-radius);
|
2024-07-10 17:46:14 +02:00
|
|
|
transition: transform 0.2s;
|
2024-06-14 12:33:01 +02:00
|
|
|
}
|
2024-06-14 12:38:10 +02:00
|
|
|
|
2024-06-24 19:46:37 +02:00
|
|
|
.sidebar-tab :global(svg) {
|
|
|
|
stroke-width: 1.2px;
|
|
|
|
height: 21px;
|
|
|
|
width: 21px;
|
|
|
|
}
|
|
|
|
|
2024-07-12 13:16:26 +02:00
|
|
|
:global(.on-iPhone .sidebar-tab svg) {
|
|
|
|
will-change: transform;
|
|
|
|
}
|
|
|
|
|
2024-06-14 12:33:01 +02:00
|
|
|
.sidebar-tab.active {
|
2024-06-16 17:45:24 +02:00
|
|
|
color: var(--sidebar-bg);
|
|
|
|
background: var(--sidebar-highlight);
|
2024-06-14 12:33:01 +02:00
|
|
|
opacity: 1;
|
2024-07-10 17:46:14 +02:00
|
|
|
transition: none;
|
2024-07-11 08:26:39 +02:00
|
|
|
transform: none;
|
2024-06-14 12:33:01 +02:00
|
|
|
}
|
2024-06-14 12:38:10 +02:00
|
|
|
|
2024-07-12 13:06:05 +02:00
|
|
|
:global(.sidebar-tab.animate) {
|
|
|
|
animation: pressButton 0.2s;
|
|
|
|
}
|
|
|
|
|
2024-06-25 16:59:25 +02:00
|
|
|
.sidebar-tab:active:not(.active) {
|
2024-07-10 17:46:14 +02:00
|
|
|
transform: scale(0.95);
|
|
|
|
}
|
|
|
|
|
|
|
|
@keyframes pressButton {
|
|
|
|
0% {
|
|
|
|
transform: scale(0.95)
|
|
|
|
}
|
|
|
|
50% {
|
|
|
|
transform: scale(1.01)
|
|
|
|
}
|
|
|
|
100% {
|
2024-07-11 08:26:39 +02:00
|
|
|
transform: none
|
2024-07-10 17:46:14 +02:00
|
|
|
}
|
2024-06-25 16:59:25 +02:00
|
|
|
}
|
|
|
|
|
2024-06-16 21:12:59 +02:00
|
|
|
@media (hover: hover) {
|
2024-07-10 17:46:14 +02:00
|
|
|
.sidebar-tab:active:not(.active) {
|
|
|
|
opacity: 1;
|
|
|
|
background-color: var(--sidebar-hover);
|
|
|
|
}
|
2024-06-25 16:59:25 +02:00
|
|
|
.sidebar-tab:hover:not(.active) {
|
2024-06-16 21:12:59 +02:00
|
|
|
opacity: 1;
|
2024-06-25 16:59:25 +02:00
|
|
|
background-color: var(--sidebar-hover);
|
2024-06-16 21:12:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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-16 18:26:06 +02:00
|
|
|
|
2024-06-14 13:33:33 +02:00
|
|
|
.sidebar-tab.active {
|
|
|
|
z-index: 2;
|
|
|
|
}
|
2024-07-10 17:46:14 +02:00
|
|
|
|
|
|
|
.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>
|