mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-26 01:09:46 +00:00
## Summary - Add Storybook stories for `Slider` component matching Figma design system variants 1:1 - Stories at `Components/Slider`: **Default** and **Disabled** - Add hover background (`hover:bg-component-node-widget-background-hovered`) to `WidgetInputNumberSlider` only ## Figma reference [Comfy Design System — Slider](https://www.figma.com/design/vALUV83vIdBzEsTJAhQgXq/Comfy-Design-System?node-id=2-9718&m=dev) ## Scope decisions - **Hover**: Added to `WidgetInputNumberSlider.vue` only — other widgets need separate verification before applying - **Invalid**: Not implemented in `Slider.vue` — excluded until component supports it ## Files changed - `src/components/ui/slider/Slider.stories.ts` — new - `src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.vue` — add hover background ## Test plan - [ ] `pnpm storybook` — verify Default and Disabled render under `Components/Slider` - [ ] Hover background visible on slider widget in app (e.g. KSampler `cfg` slider) - [ ] Other widget inputs (text, textarea, select) unchanged - [ ] `pnpm typecheck` — passes - [ ] `pnpm lint` — passes 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
import type {
|
|
ComponentPropsAndSlots,
|
|
Meta,
|
|
StoryObj
|
|
} from '@storybook/vue3-vite'
|
|
import { computed, ref, toRefs } from 'vue'
|
|
|
|
import Slider from './Slider.vue'
|
|
|
|
interface StoryArgs extends ComponentPropsAndSlots<typeof Slider> {
|
|
disabled: boolean
|
|
}
|
|
|
|
const meta: Meta<StoryArgs> = {
|
|
title: 'Components/Slider',
|
|
component: Slider,
|
|
tags: ['autodocs'],
|
|
parameters: { layout: 'centered' },
|
|
argTypes: {
|
|
min: { control: 'number' },
|
|
max: { control: 'number' },
|
|
step: { control: 'number' },
|
|
disabled: { control: 'boolean' }
|
|
},
|
|
args: {
|
|
min: 0,
|
|
max: 100,
|
|
step: 1,
|
|
disabled: false
|
|
},
|
|
decorators: [
|
|
(story) => ({
|
|
components: { story },
|
|
template: '<div class="w-72"><story /></div>'
|
|
})
|
|
]
|
|
}
|
|
|
|
export default meta
|
|
type Story = StoryObj<typeof meta>
|
|
|
|
export const Default: Story = {
|
|
render: (args) => ({
|
|
components: { Slider },
|
|
setup() {
|
|
const { min, max, step, disabled } = toRefs(args)
|
|
const value = ref([36])
|
|
const display = computed(() => value.value[0])
|
|
return { value, display, min, max, step, disabled }
|
|
},
|
|
template: `
|
|
<div class="flex items-center gap-4 rounded-lg bg-component-node-widget-background px-3 py-2">
|
|
<Slider v-model="value" :min :max :step :disabled class="flex-1" />
|
|
<span class="w-14 shrink-0 text-right text-xs text-component-node-foreground">{{ display }}</span>
|
|
</div>
|
|
`
|
|
})
|
|
}
|
|
|
|
export const Disabled: Story = {
|
|
args: { disabled: true },
|
|
render: (args) => ({
|
|
components: { Slider },
|
|
setup() {
|
|
const { min, max, step, disabled } = toRefs(args)
|
|
const value = ref([36])
|
|
const display = computed(() => value.value[0])
|
|
return { value, display, min, max, step, disabled }
|
|
},
|
|
template: `
|
|
<div class="flex items-center gap-4 rounded-lg bg-component-node-widget-background px-3 py-2">
|
|
<Slider v-model="value" :min :max :step :disabled class="flex-1" />
|
|
<span class="w-14 shrink-0 text-right text-xs text-component-node-foreground">{{ display }}</span>
|
|
</div>
|
|
`
|
|
})
|
|
}
|