57 lines
1.7 KiB
Svelte
57 lines
1.7 KiB
Svelte
|
<script lang="ts">
|
||
|
/**
|
||
|
* Shows one or more wikidata info boxes or wikipedia articles in a tabbed component.
|
||
|
*/
|
||
|
import type { FullWikipediaDetails } from "../../Logic/Web/Wikipedia";
|
||
|
import Wikipedia from "../../Logic/Web/Wikipedia";
|
||
|
import Locale from "../i18n/Locale";
|
||
|
import { Store } from "../../Logic/UIEventSource";
|
||
|
import { Tab, TabGroup, TabList, TabPanel, TabPanels } from "@rgossiaux/svelte-headlessui";
|
||
|
import WikipediaTitle from "./WikipediaTitle.svelte";
|
||
|
import WikipediaArticle from "./WikipediaArticle.svelte";
|
||
|
import { onDestroy } from "svelte";
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Either a wikidata item or a '<language>:<article>' link
|
||
|
*/
|
||
|
export let wikiIds: Store<string[]>;
|
||
|
let wikipediaStores: Store<Store<FullWikipediaDetails>[]> = Locale.language.bind(language =>
|
||
|
wikiIds.map(wikiIds => wikiIds.map(id => Wikipedia.fetchArticleAndWikidata(id, language))));
|
||
|
let _wikipediaStores;
|
||
|
onDestroy(wikipediaStores.addCallbackAndRunD(wikipediaStores => {
|
||
|
_wikipediaStores = wikipediaStores;
|
||
|
}));
|
||
|
</script>
|
||
|
{#if _wikipediaStores !== undefined}
|
||
|
<TabGroup>
|
||
|
<TabList>
|
||
|
{#each _wikipediaStores as store (store.tag)}
|
||
|
<Tab class={({selected}) => selected ? "tab-selected" : "tab-unselected"}>
|
||
|
<WikipediaTitle wikipediaDetails={store} />
|
||
|
</Tab>
|
||
|
{/each}
|
||
|
</TabList>
|
||
|
<TabPanels>
|
||
|
|
||
|
{#each _wikipediaStores as store (store.tag)}
|
||
|
<TabPanel>
|
||
|
<WikipediaArticle wikipediaDetails={store} />
|
||
|
|
||
|
</TabPanel>
|
||
|
{/each}
|
||
|
</TabPanels>
|
||
|
</TabGroup>
|
||
|
{/if}
|
||
|
<style>
|
||
|
.tab-selected {
|
||
|
background-color: rgb(59 130 246);
|
||
|
color: rgb(255 255 255);
|
||
|
}
|
||
|
|
||
|
.tab-unselected {
|
||
|
background-color: rgb(255 255 255);
|
||
|
color: rgb(0 0 0);
|
||
|
}
|
||
|
</style>
|