feat: tabs component accordion

This commit is contained in:
Alexander Petric
2025-01-24 09:42:15 -05:00
parent a88fbb238a
commit da80f2582a
2 changed files with 71 additions and 23 deletions
@@ -48,6 +48,8 @@
selectedTabIndex: 0
})
const titleBarHeight = 40; // Example height of a single accordion title bar in pixels
function handleTabSelection() {
selectedIndex = tabs?.indexOf(selected)
outputs?.selectedTabIndex.set(selectedIndex)
@@ -170,28 +172,74 @@
</button>
{/each}
</div>
{:else if resolvedConfig.tabsKind == 'accordion'}
<div class="flex flex-col w-full">
{#each tabs ?? [] as res, index}
<div class="mb-2">
<button
on:pointerdown|stopPropagation
on:click={() => (selected = res)}
class={twMerge(
'w-full text-left p-2 cursor-pointer flex items-center text-secondary',
css?.allTabs?.class,
'wm-tabs-alltabs',
selected == res
? twMerge(
'bg-surface text-primary',
css?.selectedTab?.class,
'wm-tabs-selectedTab'
)
: ''
)}
>
<span class="mr-2">{selected == res ? '-' : '+'}</span>
{res}
</button>
{#if selected == res}
<div class="p-2 border-t">
<SubGridEditor
{id}
visible={render && index === selectedIndex}
subGridId={`${id}-${index}`}
class={twMerge(css?.container?.class, 'wm-tabs-container')}
style={css?.container?.style}
containerHeight={componentContainerHeight - (titleBarHeight * tabs.length + 40)}
on:focus={() => {
if (!$connectingInput.opened) {
$selectedComponent = [id]
handleTabSelection()
}
}}
/>
</div>
{/if}
</div>
{/each}
</div>
{/if}
<div class="w-full">
{#if $app.subgrids}
{#each tabs ?? [] as _res, i}
<SubGridEditor
{id}
visible={render && i === selectedIndex}
subGridId={`${id}-${i}`}
class={twMerge(css?.container?.class, 'wm-tabs-container')}
style={css?.container?.style}
containerHeight={resolvedConfig.tabsKind !== 'sidebar' && $mode !== 'preview'
? componentContainerHeight - tabHeight
: componentContainerHeight}
on:focus={() => {
if (!$connectingInput.opened) {
$selectedComponent = [id]
handleTabSelection()
}
}}
/>
{/each}
{/if}
</div>
{#if resolvedConfig.tabsKind !== 'accordion'}
<div class="w-full">
{#if $app.subgrids}
{#each tabs ?? [] as _res, i}
<SubGridEditor
{id}
visible={render && i === selectedIndex}
subGridId={`${id}-${i}`}
class={twMerge(css?.container?.class, 'wm-tabs-container')}
style={css?.container?.style}
containerHeight={resolvedConfig.tabsKind !== 'sidebar' && $mode !== 'preview'
? componentContainerHeight - tabHeight
: componentContainerHeight}
on:focus={() => {
if (!$connectingInput.opened) {
$selectedComponent = [id]
handleTabSelection()
}
}}
/>
{/each}
{/if}
</div>
{/if}
</div>
@@ -446,7 +446,7 @@ const buttonColorOptions = [...BUTTON_COLORS]
export const selectOptions = {
buttonColorOptions,
tabsKindOptions: ['tabs', 'sidebar', 'invisibleOnView'],
tabsKindOptions: ['tabs', 'sidebar', 'accordion', 'invisibleOnView'],
buttonSizeOptions: ['xs', 'sm', 'md', 'lg', 'xl'],
tableSearchOptions: ['By Component', 'By Runnable', 'Disabled'],
chartThemeOptions: ['theme1', 'theme2', 'theme3'],