Fraser's picture
clr
6e3de95
<script lang="ts">
export type TabId = 'scanner' | 'encounters' | 'pictuary';
interface Tab {
id: TabId;
label: string;
icon: string;
}
interface Props {
activeTab: TabId;
onTabChange: (tab: TabId) => void;
}
let { activeTab, onTabChange }: Props = $props();
const tabs: Tab[] = [
{ id: 'scanner', label: 'Scanner', icon: 'https://huggingface.co/spaces/Fraser/piclets/resolve/main/assets/snap_logo.png' },
{ id: 'encounters', label: 'Encounters', icon: 'https://huggingface.co/spaces/Fraser/piclets/resolve/main/assets/encounters_logo.png' },
{ id: 'pictuary', label: 'Pictuary', icon: 'https://huggingface.co/spaces/Fraser/piclets/resolve/main/assets/pictuary_logo.png' }
];
function handleTabClick(tabId: TabId) {
onTabChange(tabId);
}
</script>
<nav class="tab-bar">
<div class="tab-bar-inner">
{#each tabs as tab}
<button
class="tab-item"
class:active={activeTab === tab.id}
onclick={() => handleTabClick(tab.id)}
>
<div class="icon-wrapper">
<img
src={tab.icon}
alt={tab.label}
class="tab-icon"
/>
</div>
</button>
{/each}
</div>
</nav>
<style>
.tab-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #f5f5f5;
border-top: 1px solid #e0e0e0;
z-index: 1000;
padding-bottom: env(safe-area-inset-bottom, 0);
}
.tab-bar-inner {
display: flex;
justify-content: space-around;
align-items: center;
height: 70px;
}
.tab-item {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
background: none;
border: none;
padding: 6px;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
.icon-wrapper {
position: relative;
width: 48px;
height: 48px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
}
.tab-item.active .icon-wrapper {
background: rgb(190, 210, 238);
}
.tab-icon {
width: 32px;
height: 32px;
object-fit: contain;
opacity: 0.4;
}
.tab-item.active .tab-icon {
filter: brightness(0) saturate(100%) invert(27%) sepia(51%) saturate(2878%) hue-rotate(192deg) brightness(104%) contrast(97%);
opacity: 1;
}
</style>