forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			121 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| <script lang="ts">
 | |
|     /**
 | |
|      * Thin wrapper around 'TabGroup' which binds the state
 | |
|      */
 | |
| 
 | |
|     import {Tab, TabGroup, TabList, TabPanel, TabPanels} from "@rgossiaux/svelte-headlessui";
 | |
|     import {UIEventSource} from "../../Logic/UIEventSource";
 | |
| 
 | |
|     export let tab: UIEventSource<number>;
 | |
|     let tabElements: HTMLElement[] = [];
 | |
|     $: tabElements[$tab]?.click();
 | |
|     $: {
 | |
|         if (tabElements[tab.data]) {
 | |
|             window.setTimeout(() => tabElements[tab.data].click(), 50)
 | |
|         }
 | |
|     }
 | |
| </script>
 | |
| 
 | |
| <div class="tabbedgroup w-full h-full">
 | |
|     <TabGroup class="h-full w-full flex flex-col" defaultIndex={1}
 | |
|               on:change={(e) =>{if(e.detail >= 0){tab.setData( e.detail); }} }>
 | |
|         <div class="interactive flex items-center justify-between sticky top-0">
 | |
|             <TabList class="flex flex-wrap">
 | |
|                 {#if $$slots.title1}
 | |
|                     <Tab class={({selected}) => "tab "+(selected ? "primary" : "")}>
 | |
|                         <div bind:this={tabElements[0]} class="flex">
 | |
|                             <slot name="title0">
 | |
|                                 Tab 0
 | |
|                             </slot>
 | |
|                         </div>
 | |
|                     </Tab>
 | |
|                 {/if}
 | |
|                 {#if $$slots.title1}
 | |
|                     <Tab class={({selected}) => "tab "+(selected ? "primary" : "")}>
 | |
|                         <div bind:this={tabElements[1]} class="flex">
 | |
|                             <slot name="title1"/>
 | |
|                         </div>
 | |
|                     </Tab>
 | |
|                 {/if}
 | |
|                 {#if $$slots.title2}
 | |
|                     <Tab class={({selected}) => "tab "+(selected ? "primary" : "")}>
 | |
|                         <div bind:this={tabElements[2]} class="flex">
 | |
|                             <slot name="title2"/>
 | |
|                         </div>
 | |
|                     </Tab>
 | |
|                 {/if}
 | |
|                 {#if $$slots.title3}
 | |
|                     <Tab class={({selected}) => "tab "+(selected ? "primary" : "")}>
 | |
|                         <div bind:this={tabElements[3]} class="flex">
 | |
|                             <slot name="title3"/>
 | |
|                         </div>
 | |
|                     </Tab>
 | |
|                 {/if}
 | |
|                 {#if $$slots.title4}
 | |
|                     <Tab class={({selected}) => "tab "+(selected ? "primary" : "")}>
 | |
|                         <div bind:this={tabElements[4]} class="flex">
 | |
|                             <slot name="title4"/>
 | |
|                         </div>
 | |
|                     </Tab>
 | |
|                 {/if}
 | |
|             </TabList>
 | |
|             <slot name="post-tablist"/>
 | |
|         </div>
 | |
|         <div class="overflow-y-auto normal-background">
 | |
| 
 | |
|             <TabPanels defaultIndex={$tab}>
 | |
|                 <TabPanel>
 | |
|                     <slot name="content0">
 | |
|                         <div>Empty</div>
 | |
|                     </slot>
 | |
|                 </TabPanel>
 | |
|                 <TabPanel>
 | |
|                     <slot name="content1"/>
 | |
|                 </TabPanel>
 | |
|                 <TabPanel>
 | |
|                     <slot name="content2"/>
 | |
|                 </TabPanel>
 | |
|                 <TabPanel>
 | |
|                     <slot name="content3"/>
 | |
|                 </TabPanel>
 | |
|                 <TabPanel>
 | |
|                     <slot name="content4"/>
 | |
|                 </TabPanel>
 | |
|             </TabPanels>
 | |
|         </div>
 | |
|     </TabGroup>
 | |
| </div>
 | |
| <style>
 | |
|     .tabbedgroup {
 | |
|         max-height: 100vh;
 | |
|         height: 100%;
 | |
|     }
 | |
| 
 | |
|     :global(.tab) {
 | |
|         margin: 0.25rem;
 | |
|         padding: 0.25rem;
 | |
|         padding-left: 0.75rem;
 | |
|         padding-right: 0.75rem;
 | |
|         border-radius: 1rem;
 | |
|     }
 | |
| 
 | |
|     :global(.tab .flex) {
 | |
|         align-items: center;
 | |
|         gap: 0.25rem;
 | |
|     }
 | |
| 
 | |
|     :global(.tab span|div) {
 | |
|         align-items: center;
 | |
|         gap: 0.25rem;
 | |
|         display: flex;
 | |
|     }
 | |
| 
 | |
|     :global(.tab-selected svg) {
 | |
|         fill: var(--catch-detail-color-contrast);
 | |
|     }
 | |
| 
 | |
|     :global(.tab-unselected) {
 | |
|         background-color: var(--background-color) !important;
 | |
|         color: var(--foreground-color) !important;
 | |
|     }
 | |
| </style>
 |