feature: base modal layout modified & add button variant size

This commit is contained in:
Jin Yi
2026-01-14 13:12:30 +09:00
parent 7ef4ea6f25
commit 672b78b9fa
5 changed files with 55 additions and 48 deletions

View File

@@ -1,7 +1,7 @@
<template>
<div class="relative inline-flex items-center">
<Button
size="icon"
:size="size"
variant="secondary"
v-bind="$attrs"
@click="popover?.toggle"
@@ -11,8 +11,7 @@
cn(
!isVertical
? 'icon-[lucide--ellipsis]'
: 'icon-[lucide--more-vertical]',
'text-sm'
: 'icon-[lucide--more-vertical]'
)
"
/>
@@ -63,6 +62,7 @@ import Popover from 'primevue/popover'
import { ref } from 'vue'
import Button from '@/components/ui/button/Button.vue'
import type { ButtonVariants } from '@/components/ui/button/button.variants'
import { cn } from '@/utils/tailwindUtil'
defineOptions({
@@ -71,9 +71,10 @@ defineOptions({
interface MoreButtonProps {
isVertical?: boolean
size?: ButtonVariants['size']
}
const { isVertical = false } = defineProps<MoreButtonProps>()
const { isVertical = false, size = 'icon' } = defineProps<MoreButtonProps>()
defineEmits<{
menuOpened: []

View File

@@ -2,7 +2,7 @@
<div
:class="
cn(
'relative flex w-full items-center gap-2 bg-comfy-input cursor-text text-comfy-input-foreground',
'relative flex w-full items-center gap-2 bg-secondary-background cursor-text',
customClass,
wrapperStyle
)
@@ -27,15 +27,11 @@
<i :class="filterIcon" />
</Button>
<InputIcon v-if="!modelValue" :class="icon" />
<Button
v-if="modelValue"
class="clear-button absolute left-0"
variant="textonly"
size="icon"
<InputIcon
v-else
class="icon-[lucide--x] cursor-pointer"
@click="modelValue = ''"
>
<i class="icon-[lucide--x] size-4" />
</Button>
/>
</div>
<div v-if="filters?.length" class="search-filters flex flex-wrap gap-2 pt-2">
<SearchFilterChip
@@ -63,7 +59,7 @@ import SearchFilterChip from './SearchFilterChip.vue'
const {
placeholder = 'Search...',
icon = 'pi pi-search',
icon = 'icon-[lucide--search]',
debounceTime = 300,
filterIcon,
filters = [],

View File

@@ -2,7 +2,7 @@ import type { VariantProps } from 'cva'
import { cva } from 'cva'
export const buttonVariants = cva({
base: 'relative inline-flex items-center justify-center gap-2 cursor-pointer whitespace-nowrap appearance-none border-none rounded-md text-sm font-medium font-inter transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
base: 'relative inline-flex items-center justify-center gap-2 cursor-pointer whitespace-nowrap appearance-none border-none rounded-md text-sm font-medium font-inter transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_i]:pointer-events-none [&_i]:size-4 [&_i]:shrink-0',
variants: {
variant: {
secondary:
@@ -26,7 +26,8 @@ export const buttonVariants = cva({
md: 'h-8 rounded-lg p-2 text-xs',
lg: 'h-10 rounded-lg px-4 py-2 text-sm',
icon: 'size-8',
'icon-sm': 'size-5 p-0'
'icon-sm': 'size-5 p-0',
'icon-lg': 'size-10'
}
},
@@ -48,8 +49,13 @@ const variants = [
'destructive-textonly',
'overlay-white'
] as const satisfies Array<ButtonVariants['variant']>
const sizes = ['sm', 'md', 'lg', 'icon', 'icon-sm'] as const satisfies Array<
ButtonVariants['size']
>
const sizes = [
'sm',
'md',
'lg',
'icon',
'icon-sm',
'icon-lg'
] as const satisfies Array<ButtonVariants['size']>
export const FOR_STORIES = { variants, sizes } as const

View File

@@ -179,10 +179,10 @@ const createStoryTemplate = (args: StoryArgs) => ({
<template v-if="args.hasLeftPanel" #leftPanel>
<LeftSidePanel v-model="selectedNavItem" :nav-items="tempNavigation">
<template #header-icon>
<i class="icon-[lucide--puzzle] size-4 text-neutral" />
<i class="icon-[lucide--puzzle]" />
</template>
<template #header-title>
<span class="text-neutral text-base">Title</span>
<span>Title</span>
</template>
</LeftSidePanel>
</template>
@@ -200,30 +200,32 @@ const createStoryTemplate = (args: StoryArgs) => ({
<!-- Header Right Area -->
<template v-if="args.hasHeaderRightArea" #header-right-area>
<div class="flex gap-2">
<Button variant="primary" @click="() => {}">
<i class="icon-[lucide--upload] size-3" />
<span> Upload Model </span>
<Button variant="primary" size="lg" @click="() => {}">
<i class="icon-[lucide--upload]" />
<span>Upload Model</span>
</Button>
<MoreButton>
<MoreButton size="icon-lg">
<template #default="{ close }">
<Button
variant="secondary"
size="lg"
label="Settings"
@click="() => { close() }"
>
<template #icon>
<i class="icon-[lucide--download] size-3" />
<i class="icon-[lucide--download]" />
</template>
</Button>
<Button
variant="primary"
size="lg"
label="Profile"
@click="() => { close() }"
>
<template #icon>
<i class="icon-[lucide--scroll] size-3" />
<i class="icon-[lucide--scroll]" />
</template>
</Button>
</template>
@@ -254,7 +256,7 @@ const createStoryTemplate = (args: StoryArgs) => ({
class="w-[135px]"
>
<template #icon>
<i class="icon-[lucide--filter] size-3" />
<i class="icon-[lucide--filter]" />
</template>
</SingleSelect>
</div>
@@ -274,8 +276,8 @@ const createStoryTemplate = (args: StoryArgs) => ({
<div class="w-full h-full bg-blue-500"></div>
</template>
<template #top-right>
<Button size="icon" class="!bg-white !text-neutral-900" @click="() => {}">
<i class="icon-[lucide--info] size-4" />
<Button size="icon-lg" @click="() => {}">
<i class="icon-[lucide--info]" />
</Button>
</template>
<template #bottom-right>
@@ -283,7 +285,7 @@ const createStoryTemplate = (args: StoryArgs) => ({
<SquareChip label="1.2 MB" />
<SquareChip label="LoRA">
<template #icon>
<i class="icon-[lucide--folder] size-3" />
<i class="icon-[lucide--folder]" />
</template>
</SquareChip>
</template>
@@ -303,10 +305,10 @@ const createStoryTemplate = (args: StoryArgs) => ({
<template v-if="args.hasLeftPanel" #leftPanel>
<LeftSidePanel v-model="selectedNavItem" :nav-items="tempNavigation">
<template #header-icon>
<i class="icon-[lucide--puzzle] size-4 text-neutral" />
<i class="icon-[lucide--puzzle]" />
</template>
<template #header-title>
<span class="text-neutral text-base">Title</span>
<span>Title</span>
</template>
</LeftSidePanel>
</template>
@@ -324,26 +326,28 @@ const createStoryTemplate = (args: StoryArgs) => ({
<!-- Header Right Area -->
<template v-if="args.hasHeaderRightArea" #header-right-area>
<div class="flex gap-2">
<Button variant="primary" @click="() => {}">
<i class="icon-[lucide--upload] size-3" />
<Button variant="primary" size="lg" @click="() => {}">
<i class="icon-[lucide--upload]" />
<span>Upload Model</span>
</Button>
<MoreButton>
<MoreButton size="icon-lg">
<template #default="{ close }">
<Button
variant="secondary"
size="lg"
@click="() => { close() }"
>
<i class="icon-[lucide--download] size-3" />
<i class="icon-[lucide--download]" />
<span>Settings</span>
</Button>
<Button
variant="primary"
size="lg"
@click="() => { close() }"
>
<i class="icon-[lucide--scroll] size-3" />
<i class="icon-[lucide--scroll]" />
<span>Profile</span>
</Button>
</template>
@@ -371,7 +375,7 @@ const createStoryTemplate = (args: StoryArgs) => ({
class="w-[135px]"
>
<template #icon>
<i class="icon-[lucide--filter] size-3" />
<i class="icon-[lucide--filter]" />
</template>
</SingleSelect>
</div>
@@ -391,8 +395,8 @@ const createStoryTemplate = (args: StoryArgs) => ({
<div class="w-full h-full bg-blue-500"></div>
</template>
<template #top-right>
<Button size="icon" class="!bg-white !text-neutral-900" @click="() => {}">
<i class="icon-[lucide--info] size-4" />
<Button size="icon-lg" @click="() => {}">
<i class="icon-[lucide--info]" />
</Button>
</template>
<template #bottom-right>
@@ -400,7 +404,7 @@ const createStoryTemplate = (args: StoryArgs) => ({
<SquareChip label="1.2 MB" />
<SquareChip label="LoRA">
<template #icon>
<i class="icon-[lucide--folder] size-3" />
<i class="icon-[lucide--folder]" />
</template>
</SquareChip>
</template>

View File

@@ -2,7 +2,7 @@
<div class="base-widget-layout rounded-2xl overflow-hidden relative">
<Button
v-show="!isRightPanelOpen && hasRightPanel"
size="lg"
size="icon-lg"
:class="
cn('absolute top-4 right-18 z-10', 'transition-opacity duration-200', {
'opacity-0 pointer-events-none': isRightPanelOpen || !hasRightPanel
@@ -13,11 +13,11 @@
<i class="icon-[lucide--panel-right]" />
</Button>
<Button
size="lg"
class="absolute top-4 right-6 z-10 transition-opacity duration-200 w-10"
size="icon-lg"
class="absolute top-4 right-6 z-10 transition-opacity duration-200"
@click="closeDialog"
>
<i class="pi pi-times" />
<i class="icon-[lucide--x]" />
</Button>
<div class="flex h-full w-full">
<Transition name="slide-panel">
@@ -40,7 +40,7 @@
class="w-full h-18 px-6 flex items-center justify-between gap-2"
>
<div class="flex flex-1 shrink-0 gap-2">
<Button v-if="!notMobile" size="icon" @click="toggleLeftPanel">
<Button v-if="!notMobile" size="icon-lg" @click="toggleLeftPanel">
<i
:class="
cn(
@@ -64,7 +64,7 @@
>
<Button
v-if="isRightPanelOpen && hasRightPanel"
size="lg"
size="icon-lg"
@click="toggleRightPanel"
>
<i class="icon-[lucide--panel-right-close]" />