mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-02 04:02:20 +00:00
## Summary Unify the search bar + action buttons layout across all left sidebar panels (Node Library, Workflows, Model Library, Media Assets) using a shared `SidebarTopArea` presentation component. ## Changes - **What**: - Add `SidebarTopArea.vue` — layout component with `flex-1` default slot (search) and `#actions` slot (buttons), plus optional `bottomDivider` prop - Replace raw `<button>` elements in Node Library with `<Button variant="secondary" size="icon">` - Replace reka-ui `TabsTrigger` with shared `Tab/TabList` component in Node Library - Move Media Assets tab list from hover-only `#tool-buttons` to always-visible header below search area - Unify spacing (`gap-2`, `p-2 2xl:px-4`) and divider styles across all sidebar panels - Remove unused `assetType` prop and header from `AssetsSidebarGridView`/`AssetsSidebarListView` ## Review Focus - `SidebarTopArea` API simplicity — just slots + one optional prop - Node Library still requires `TabsRoot` in the body for reka-ui `TabsContent` in child panels - Media Assets tabs are now always visible instead of hover-only [screen-capture (1).webm](https://github.com/user-attachments/assets/fe1d8f7b-5674-4bb3-9842-569e4c3af6c9) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9740-feat-unify-sidebar-panel-header-layout-with-SidebarTopArea-component-3206d73d365081ea8ba7fd6ac54e0169) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com>
53 lines
1.6 KiB
Vue
53 lines
1.6 KiB
Vue
<template>
|
|
<div
|
|
:class="
|
|
cn(
|
|
'comfy-vue-side-bar-container group/sidebar-tab flex size-full flex-col',
|
|
props.class
|
|
)
|
|
"
|
|
>
|
|
<div class="comfy-vue-side-bar-header flex flex-col">
|
|
<Toolbar
|
|
class="min-h-16 rounded-none border-x-0 border-t-0 bg-transparent px-3 2xl:px-4"
|
|
:pt="sidebarPt"
|
|
>
|
|
<template #start>
|
|
<span class="truncate font-bold" :title="props.title">
|
|
{{ props.title }}
|
|
</span>
|
|
<slot name="alt-title" />
|
|
</template>
|
|
<template #end>
|
|
<div
|
|
class="flex flex-row overflow-hidden transition-all duration-200 motion-safe:w-0 motion-safe:opacity-0 motion-safe:group-focus-within/sidebar-tab:w-auto motion-safe:group-focus-within/sidebar-tab:opacity-100 motion-safe:group-hover/sidebar-tab:w-auto motion-safe:group-hover/sidebar-tab:opacity-100 touch:w-auto touch:opacity-100 [&_.p-button]:py-1 2xl:[&_.p-button]:py-2"
|
|
>
|
|
<slot name="tool-buttons" />
|
|
</div>
|
|
</template>
|
|
</Toolbar>
|
|
<slot name="header" />
|
|
</div>
|
|
<!-- h-0 to force scrollpanel to grow -->
|
|
<ScrollPanel class="comfy-vue-side-bar-body h-0 grow">
|
|
<slot name="body" />
|
|
</ScrollPanel>
|
|
<slot name="footer" />
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import ScrollPanel from 'primevue/scrollpanel'
|
|
import Toolbar from 'primevue/toolbar'
|
|
|
|
import { cn } from '@/utils/tailwindUtil'
|
|
|
|
const props = defineProps<{
|
|
title: string
|
|
class?: string
|
|
}>()
|
|
const sidebarPt = {
|
|
start: 'min-w-0 flex-1 overflow-hidden'
|
|
}
|
|
</script>
|