import type { Meta, StoryObj } from '@storybook/vue3-vite' import { ref } from 'vue' import MultiSelect from './MultiSelect.vue' import SingleSelect from './SingleSelect.vue' import type { SelectOption } from './types' const meta: Meta = { title: 'Components/Select/SelectDropdown', tags: ['autodocs'], parameters: { layout: 'padded' }, decorators: [ () => ({ template: '
' }) ] } export default meta type Story = StoryObj const modelOptions: SelectOption[] = [ { name: 'ACE-Step', value: 'ace-step' }, { name: 'Anima', value: 'anima' }, { name: 'BRIA', value: 'bria' }, { name: 'ByteDance', value: 'bytedance' }, { name: 'Capybara', value: 'capybara' }, { name: 'Chatter Box', value: 'chatter-box' }, { name: 'Chroma', value: 'chroma' }, { name: 'ChronoEdit', value: 'chronoedit' }, { name: 'DWPose', value: 'dwpose' }, { name: 'Depth Anything v2', value: 'depth-anything-v2' }, { name: 'ElevenLabs', value: 'elevenlabs' }, { name: 'Flux', value: 'flux' }, { name: 'HunyuanVideo', value: 'hunyuan-video' }, { name: 'Stable Diffusion', value: 'stable-diffusion' }, { name: 'SDXL', value: 'sdxl' } ] const useCaseOptions: SelectOption[] = [ { name: 'Text to Image', value: 'text-to-image' }, { name: 'Image to Image', value: 'image-to-image' }, { name: 'Inpainting', value: 'inpainting' }, { name: 'Upscaling', value: 'upscaling' }, { name: 'Video Generation', value: 'video-generation' }, { name: 'Audio Generation', value: 'audio-generation' }, { name: '3D Generation', value: '3d-generation' } ] const sortOptions: SelectOption[] = [ { name: 'Default', value: 'default' }, { name: 'Recommended', value: 'recommended' }, { name: 'Popular', value: 'popular' }, { name: 'Newest', value: 'newest' }, { name: 'VRAM Usage (Low to High)', value: 'vram-low-to-high' }, { name: 'Model Size (Low to High)', value: 'model-size-low-to-high' }, { name: 'Alphabetical (A-Z)', value: 'alphabetical' } ] export const ModelFilter: Story = { render: () => ({ components: { MultiSelect }, setup() { const selected = ref([ modelOptions[1], modelOptions[2], modelOptions[3] ]) return { selected, modelOptions } }, template: ` ` }), parameters: { controls: { disable: true } } } export const UseCaseFilter: Story = { render: () => ({ components: { MultiSelect }, setup() { const selected = ref([]) return { selected, useCaseOptions } }, template: ` ` }), parameters: { controls: { disable: true } } } export const SortDropdown: Story = { render: () => ({ components: { SingleSelect }, setup() { const selected = ref('default') return { selected, sortOptions } }, template: ` ` }), parameters: { controls: { disable: true } } } export const TemplateFilterBar: Story = { render: () => ({ components: { MultiSelect, SingleSelect }, setup() { const selectedModels = ref([ modelOptions[1], modelOptions[2], modelOptions[3] ]) const selectedUseCases = ref([]) const sortBy = ref('default') const modelLabel = () => { if (selectedModels.value.length === 0) return 'Models' if (selectedModels.value.length === 1) return selectedModels.value[0].name return selectedModels.value.length + ' Models' } const useCaseLabel = () => { if (selectedUseCases.value.length === 0) return 'Use Case' if (selectedUseCases.value.length === 1) return selectedUseCases.value[0].name return selectedUseCases.value.length + ' Use Cases' } return { selectedModels, selectedUseCases, sortBy, modelOptions, useCaseOptions, sortOptions, modelLabel, useCaseLabel } }, template: `
` }), parameters: { controls: { disable: true } } }