From e70ddea6849a7c6c4b505a6169819884c79aaa0c Mon Sep 17 00:00:00 2001 From: Jin Yi Date: Thu, 11 Sep 2025 19:01:06 +0900 Subject: [PATCH] fix: Add dropdown size control to Select components and improve UI (#5290) * feature: size adjust * feature: design adjust * fix: popover width, height added * fix: li style override * refactor: improve component readability and maintainability per PR feedback - Replace CardGridList component with createGridStyle utility function - Add runtime validation for grid column values - Remove !important usage in MultiSelect, use cn() function instead - Extract popover sizing logic into usePopoverSizing composable - Improve class string readability by splitting into logical groups - Use Tailwind size utilities (size-8, size-10) instead of separate width/height - Remove magic numbers in SearchBox, align with button sizes - Rename BaseWidgetLayout to BaseModalLayout for clarity - Enhance SearchBox click area to cover entire component - Refactor long class strings using cn() utility across components * fix: BaseWidgetLayout => BaseModalLayout * fix: CardGrid deleted * fix: unused exported types * Update test expectations [skip ci] * chore: code review * Update test expectations [skip ci] * chore: restore screenshot --------- Co-authored-by: github-actions --- .storybook/preview-head.html | 7 +- src/components/button/IconButton.vue | 5 +- src/components/button/IconGroup.vue | 16 +- src/components/button/IconTextButton.vue | 5 +- src/components/button/MoreButton.vue | 17 +- src/components/button/TextButton.vue | 5 +- src/components/card/Card.stories.ts | 289 +----------------- src/components/card/CardContainer.vue | 19 +- src/components/card/CardGridList.stories.ts | 69 +++++ src/components/input/MultiSelect.stories.ts | 152 +++++++++ src/components/input/MultiSelect.vue | 68 +++-- src/components/input/SearchBox.stories.ts | 32 +- src/components/input/SearchBox.vue | 48 ++- src/components/input/SingleSelect.stories.ts | 134 +++++++- src/components/input/SingleSelect.vue | 64 ++-- src/components/widget/SampleModelSelector.vue | 26 +- ....stories.ts => BaseModalLayout.stories.ts} | 32 +- ...seWidgetLayout.vue => BaseModalLayout.vue} | 77 +++-- src/components/widget/nav/NavItem.vue | 2 +- src/components/widget/nav/NavTitle.vue | 2 +- src/composables/usePopoverSizing.ts | 30 ++ src/types/buttonTypes.ts | 4 +- src/utils/gridUtil.ts | 45 +++ 23 files changed, 722 insertions(+), 426 deletions(-) create mode 100644 src/components/card/CardGridList.stories.ts rename src/components/widget/layout/{BaseWidget.stories.ts => BaseModalLayout.stories.ts} (95%) rename src/components/widget/layout/{BaseWidgetLayout.vue => BaseModalLayout.vue} (72%) create mode 100644 src/composables/usePopoverSizing.ts create mode 100644 src/utils/gridUtil.ts diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html index 76aca2401..05e082ef0 100644 --- a/.storybook/preview-head.html +++ b/.storybook/preview-head.html @@ -57,9 +57,8 @@ /* Override Storybook's problematic & selector styles */ /* Reset only the specific properties that Storybook injects */ - #storybook-root li+li, - #storybook-docs li+li { - margin: inherit; - padding: inherit; + li+li { + margin: 0; + padding: revert-layer; } \ No newline at end of file diff --git a/src/components/button/IconButton.vue b/src/components/button/IconButton.vue index 1038a82e4..5de7adfcd 100644 --- a/src/components/button/IconButton.vue +++ b/src/components/button/IconButton.vue @@ -21,6 +21,7 @@ import { getButtonTypeClasses, getIconButtonSizeClasses } from '@/types/buttonTypes' +import { cn } from '@/utils/tailwindUtil' interface IconButtonProps extends BaseButtonProps { onClick: (event: Event) => void @@ -46,8 +47,6 @@ const buttonStyle = computed(() => { ? getBorderButtonTypeClasses(type) : getButtonTypeClasses(type) - return [baseClasses, sizeClasses, typeClasses, className] - .filter(Boolean) - .join(' ') + return cn(baseClasses, sizeClasses, typeClasses, className) }) diff --git a/src/components/button/IconGroup.vue b/src/components/button/IconGroup.vue index 784a945eb..9c5bbd40c 100644 --- a/src/components/button/IconGroup.vue +++ b/src/components/button/IconGroup.vue @@ -1,7 +1,17 @@ + + diff --git a/src/components/button/IconTextButton.vue b/src/components/button/IconTextButton.vue index bdf40d4ed..a62aab08b 100644 --- a/src/components/button/IconTextButton.vue +++ b/src/components/button/IconTextButton.vue @@ -23,6 +23,7 @@ import { getButtonSizeClasses, getButtonTypeClasses } from '@/types/buttonTypes' +import { cn } from '@/utils/tailwindUtil' defineOptions({ inheritAttrs: false @@ -52,8 +53,6 @@ const buttonStyle = computed(() => { ? getBorderButtonTypeClasses(type) : getButtonTypeClasses(type) - return [baseClasses, sizeClasses, typeClasses, className] - .filter(Boolean) - .join(' ') + return cn(baseClasses, sizeClasses, typeClasses, className) }) diff --git a/src/components/button/MoreButton.vue b/src/components/button/MoreButton.vue index 5f4f81607..0ea645c7b 100644 --- a/src/components/button/MoreButton.vue +++ b/src/components/button/MoreButton.vue @@ -14,7 +14,7 @@ unstyled :pt="pt" > -
+
@@ -25,6 +25,8 @@ import Popover from 'primevue/popover' import { computed, ref } from 'vue' +import { cn } from '@/utils/tailwindUtil' + import IconButton from './IconButton.vue' const popover = ref>() @@ -39,13 +41,16 @@ const hide = () => { const pt = computed(() => ({ root: { - class: 'absolute z-50' + class: cn('absolute z-50') }, content: { - class: [ - 'mt-2 bg-white dark-theme:bg-zinc-800 text-neutral dark-theme:text-white rounded-lg', - 'shadow-lg border border-zinc-200 dark-theme:border-zinc-700' - ] + class: cn( + 'mt-2 rounded-lg', + 'bg-white dark-theme:bg-zinc-800', + 'text-neutral dark-theme:text-white', + 'shadow-lg', + 'border border-zinc-200 dark-theme:border-zinc-700' + ) } })) diff --git a/src/components/button/TextButton.vue b/src/components/button/TextButton.vue index 14d32cc73..4dbe53b9c 100644 --- a/src/components/button/TextButton.vue +++ b/src/components/button/TextButton.vue @@ -21,6 +21,7 @@ import { getButtonSizeClasses, getButtonTypeClasses } from '@/types/buttonTypes' +import { cn } from '@/utils/tailwindUtil' interface TextButtonProps extends BaseButtonProps { label: string @@ -48,8 +49,6 @@ const buttonStyle = computed(() => { ? getBorderButtonTypeClasses(type) : getButtonTypeClasses(type) - return [baseClasses, sizeClasses, typeClasses, className] - .filter(Boolean) - .join(' ') + return cn(baseClasses, sizeClasses, typeClasses, className) }) diff --git a/src/components/card/Card.stories.ts b/src/components/card/Card.stories.ts index 923327a79..f4252644e 100644 --- a/src/components/card/Card.stories.ts +++ b/src/components/card/Card.stories.ts @@ -49,14 +49,6 @@ const meta: Meta = { options: ['square', 'portrait', 'tallPortrait'], description: 'Card container aspect ratio' }, - maxWidth: { - control: { type: 'range', min: 200, max: 600, step: 10 }, - description: 'Maximum width in pixels' - }, - minWidth: { - control: { type: 'range', min: 150, max: 400, step: 10 }, - description: 'Minimum width in pixels' - }, topRatio: { control: 'select', options: ['square', 'landscape'], @@ -155,11 +147,10 @@ const createCardTemplate = (args: CardStoryArgs) => ({ } }, template: ` -
+