2021-04-14 14:52:25 +02:00
|
|
|
<script>
|
2021-04-23 11:48:19 +02:00
|
|
|
import "@spectrum-css/tabs/dist/index-vars.css"
|
|
|
|
import { writable } from "svelte/store"
|
|
|
|
import { onMount, setContext, createEventDispatcher } from "svelte"
|
2021-04-15 14:42:39 +02:00
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
export let selected
|
|
|
|
export let vertical = false
|
2021-06-22 10:14:17 +02:00
|
|
|
export let noPadding = false
|
2021-12-03 19:39:05 +01:00
|
|
|
// added as a separate option as noPadding is used for vertical padding
|
|
|
|
export let noHorizPadding = false
|
2021-08-09 16:47:30 +02:00
|
|
|
export let quiet = false
|
|
|
|
export let emphasized = false
|
2021-06-22 10:14:17 +02:00
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
let _id = id()
|
2021-08-09 16:47:30 +02:00
|
|
|
const tab = writable({ title: selected, id: _id, emphasized })
|
2021-04-23 11:48:19 +02:00
|
|
|
setContext("tab", tab)
|
2021-04-15 15:39:00 +02:00
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
let container
|
2021-04-15 14:42:39 +02:00
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
const dispatch = createEventDispatcher()
|
2021-04-15 14:42:39 +02:00
|
|
|
|
2021-07-06 16:53:52 +02:00
|
|
|
$: {
|
|
|
|
if ($tab.title !== selected) {
|
|
|
|
selected = $tab.title
|
|
|
|
dispatch("select", selected)
|
|
|
|
}
|
|
|
|
}
|
2021-04-23 11:48:19 +02:00
|
|
|
|
|
|
|
let top, left, width, height
|
|
|
|
$: calculateIndicatorLength($tab)
|
|
|
|
$: calculateIndicatorOffset($tab)
|
2021-04-15 14:42:39 +02:00
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
function calculateIndicatorLength() {
|
|
|
|
if (!vertical) {
|
|
|
|
width = $tab.info?.width + "px"
|
|
|
|
height = $tab.info?.height
|
|
|
|
} else {
|
|
|
|
height = $tab.info?.height + 4 + "px"
|
|
|
|
width = $tab.info?.width
|
2021-04-15 14:42:39 +02:00
|
|
|
}
|
2021-04-23 11:48:19 +02:00
|
|
|
}
|
2021-04-15 14:42:39 +02:00
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
function calculateIndicatorOffset() {
|
|
|
|
if (!vertical) {
|
|
|
|
left = $tab.info?.left - container?.getBoundingClientRect().left + "px"
|
|
|
|
} else {
|
|
|
|
top = $tab.info?.top - container?.getBoundingClientRect().top + "px"
|
2021-04-15 14:42:39 +02:00
|
|
|
}
|
2021-04-23 11:48:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
onMount(() => {
|
|
|
|
calculateIndicatorLength()
|
|
|
|
calculateIndicatorOffset()
|
|
|
|
})
|
|
|
|
|
|
|
|
function id() {
|
2021-05-04 12:04:42 +02:00
|
|
|
return "_" + Math.random().toString(36).substr(2, 9)
|
2021-04-23 11:48:19 +02:00
|
|
|
}
|
2021-04-14 14:52:25 +02:00
|
|
|
</script>
|
2021-04-23 11:48:19 +02:00
|
|
|
|
|
|
|
<div
|
|
|
|
bind:this={container}
|
2021-08-09 16:47:30 +02:00
|
|
|
class:quiet
|
2021-12-03 19:39:05 +01:00
|
|
|
class:noHorizPadding
|
2021-08-09 16:47:30 +02:00
|
|
|
class="selected-border spectrum-Tabs {quiet &&
|
|
|
|
'spectrum-Tabs--quiet'} spectrum-Tabs--{vertical
|
2021-05-04 12:04:42 +02:00
|
|
|
? 'vertical'
|
|
|
|
: 'horizontal'}"
|
|
|
|
>
|
2021-04-23 11:48:19 +02:00
|
|
|
<slot />
|
|
|
|
{#if $tab.info}
|
|
|
|
<div
|
|
|
|
class="spectrum-Tabs-selectionIndicator indicator-transition"
|
2021-08-09 16:56:05 +02:00
|
|
|
style="{emphasized &&
|
2021-08-09 16:55:03 +02:00
|
|
|
'background-color: var(--spectrum-global-color-blue-400)'}; width: {width}; height: {height}; left: {left}; top: {top};"
|
2021-05-04 12:04:42 +02:00
|
|
|
/>
|
2021-04-23 11:48:19 +02:00
|
|
|
{/if}
|
2021-04-14 16:07:45 +02:00
|
|
|
</div>
|
|
|
|
|
2021-06-22 10:14:17 +02:00
|
|
|
<div
|
|
|
|
class="spectrum-Tabs-content spectrum-Tabs-content-{_id}"
|
|
|
|
class:noPadding
|
|
|
|
/>
|
2021-04-14 16:07:45 +02:00
|
|
|
|
|
|
|
<style>
|
2021-08-09 16:47:30 +02:00
|
|
|
.quiet {
|
|
|
|
border-bottom: none !important;
|
|
|
|
}
|
|
|
|
|
2021-04-23 11:48:19 +02:00
|
|
|
.spectrum-Tabs {
|
|
|
|
padding-left: var(--spacing-xl);
|
|
|
|
padding-right: var(--spacing-xl);
|
2021-04-23 12:30:17 +02:00
|
|
|
position: relative;
|
2021-06-22 10:14:17 +02:00
|
|
|
border-bottom: var(--border-light);
|
2021-04-23 11:48:19 +02:00
|
|
|
}
|
|
|
|
.spectrum-Tabs-content {
|
|
|
|
margin-top: var(--spectrum-global-dimension-static-size-150);
|
|
|
|
}
|
|
|
|
.indicator-transition {
|
|
|
|
transition: all 200ms;
|
|
|
|
}
|
2021-04-23 12:30:17 +02:00
|
|
|
.spectrum-Tabs--horizontal .spectrum-Tabs-selectionIndicator {
|
|
|
|
bottom: 0 !important;
|
|
|
|
}
|
2021-12-03 19:39:05 +01:00
|
|
|
.noHorizPadding {
|
|
|
|
padding: 0;
|
|
|
|
}
|
2021-06-22 10:14:17 +02:00
|
|
|
.noPadding {
|
|
|
|
margin: 0;
|
|
|
|
}
|
2021-04-23 11:48:19 +02:00
|
|
|
</style>
|