1
0
mirror of https://github.com/garraflavatra/rolens.git synced 2025-07-13 20:24:06 +00:00

Multiline tabbar

This commit is contained in:
2023-06-23 14:33:39 +02:00
parent c41572dbb7
commit bd265d0548
4 changed files with 30 additions and 8 deletions

View File

@ -1,26 +1,39 @@
<script>
import { createEventDispatcher } from 'svelte';
import { createEventDispatcher, onMount } from 'svelte';
import Icon from './icon.svelte';
export let tabs = [];
export let selectedKey = {};
export let canAddTab = false;
export let multiline = false;
const dispatch = createEventDispatcher();
const maxPixelsPerMultilineTab = 120;
let navEl;
let pixelsPerTab = 0;
$: tabs && navEl && updateMeasurements();
function updateMeasurements() {
pixelsPerTab = (navEl.offsetWidth ?? 0) / tabs.length;
}
function select(tabKey) {
selectedKey = tabKey;
dispatch('select', tabKey);
}
onMount(() => {
window.addEventListener('resize', updateMeasurements);
});
</script>
<nav class="tabs">
<nav class="tabs" class:multiline={multiline || (pixelsPerTab < maxPixelsPerMultilineTab)} bind:this={navEl}>
<ul>
{#each tabs as tab (tab.key)}
<li class:active={tab.key === selectedKey}>
<button class="tab" on:click={() => select(tab.key)}>
{#if tab.icon} <Icon name={tab.icon} /> {/if}
{tab.title}
<span class="label">{tab.title}</span>
</button>
{#if tab.closable}
<button class="button-small" on:click={() => dispatch('closeTab', tab.key)}>
@ -88,6 +101,10 @@
border-color: #00008b;
cursor: not-allowed;
}
nav.tabs.multiline button.tab .label {
display: block;
margin-top: 4px;
}
.button-small {
position: absolute;