[feat] Enhance MultiSelect component and update Storybook stories

- Improved MultiSelect component layout with proper spacing and conditional rendering
- Added default args to MultiSelect and SearchBox stories for better control
- Added new story variants: WithSearchBox, WithSelectedCount, WithClearButton, AllHeaderFeatures, CustomSearchPlaceholder
- Added WithBorder and NoBorder variants to SearchBox story
- Updated BaseWidget story to showcase MultiSelect with all header features enabled
- Fixed conditional rendering of header section in MultiSelect based on feature flags

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jin Yi
2025-08-21 23:30:21 +09:00
parent c4e42e5125
commit 2ec38694fc
4 changed files with 75 additions and 5 deletions

View File

@@ -29,6 +29,13 @@ const meta: Meta<typeof MultiSelect> = {
searchPlaceholder: {
control: 'text'
}
},
args: {
label: 'Select',
hasSearchBox: false,
showSelectedCount: false,
hasClearButton: false,
searchPlaceholder: 'Search...'
}
}
@@ -164,3 +171,41 @@ export const MultipleSelectors: Story = {
`
})
}
export const WithSearchBox: Story = {
...Default,
args: {
hasSearchBox: true
}
}
export const WithSelectedCount: Story = {
...Default,
args: {
showSelectedCount: true
}
}
export const WithClearButton: Story = {
...Default,
args: {
hasClearButton: true
}
}
export const AllHeaderFeatures: Story = {
...Default,
args: {
hasSearchBox: true,
showSelectedCount: true,
hasClearButton: true
}
}
export const CustomSearchPlaceholder: Story = {
...Default,
args: {
hasSearchBox: true,
searchPlaceholder: 'Filter packages...'
}
}

View File

@@ -13,14 +13,18 @@
v-if="hasSearchBox || showSelectedCount || hasClearButton"
#header
>
<div class="p-2 flex flex-col gap-y-4 pb-0">
<div class="p-2 flex flex-col pb-0">
<SearchBox
v-if="hasSearchBox"
v-model="searchQuery"
:class="showSelectedCount || hasClearButton ? 'mb-2' : ''"
:has-border="true"
:place-holder="searchPlaceholder"
/>
<div class="flex items-center justify-between">
<div
v-if="showSelectedCount || hasClearButton"
class="mt-2 flex items-center justify-between"
>
<span
v-if="showSelectedCount"
class="text-sm text-neutral-400 dark-theme:text-zinc-500 px-1"
@@ -40,7 +44,7 @@
@click.stop="selectedItems = []"
/>
</div>
<div class="h-px bg-zinc-200 dark-theme:bg-zinc-700"></div>
<div class="mt-4 h-px bg-zinc-200 dark-theme:bg-zinc-700"></div>
</div>
</template>

View File

@@ -15,6 +15,10 @@ const meta: Meta<typeof SearchBox> = {
control: 'boolean',
description: 'Toggle border prop'
}
},
args: {
placeHolder: 'Search...',
hasBorder: false
}
}
@@ -29,9 +33,23 @@ export const Default: Story = {
return { searchText, args }
},
template: `
<div>
<SearchBox v-model:="searchQuery" />
<div style="max-width: 320px;">
<SearchBox v-bind="args" v-model="searchText" />
</div>
`
})
}
export const WithBorder: Story = {
...Default,
args: {
hasBorder: true
}
}
export const NoBorder: Story = {
...Default,
args: {
hasBorder: false
}
}

View File

@@ -240,6 +240,9 @@ const createStoryTemplate = (args: StoryArgs) => ({
v-model="selectedFrameworks"
label="Select Frameworks"
:options="frameworkOptions"
:has-search-box="true"
:show-selected-count="true"
:has-clear-button="true"
/>
<MultiSelect
v-model="selectedProjects"