Skip to content

Commit 5abfd33

Browse files
imick-ioclaude
andauthored
feat(website): home model release carousel of split-content cards (#15377)
## Summary Replaces the single-model release card on the home page with a carousel of the four latest model drops, built from the ["Module-Latest drops" Figma design](https://www.figma.com/design/11vkE4FAn4plEYpawd57zS/Comfy----Website-Design?node-id=11421-45207&m=dev). ### New block: `FeaturedCarousel02` A carousel of `CardSplitContent01`-style cards (media left, content right, dot pagination): - **Timer-driven autoplay** — each slide advances after its own `autoplayMs` (default 5000ms per the Figma annotation); video slides use their clip's real duration so the carousel moves on as the video ends - **Video via `VideoPlayer`** (`mute-only` + `loop`), mounted only on the active slide so unmuted audio can never leak across slides; inactive slides show their poster - **Accessibility** — hover/focus pauses auto-advance (WCAG 2.2.2), `prefers-reduced-motion` disables auto-advance and slide animation, inactive slides are `aria-hidden` + `inert`, dots are labeled by slide title - Stories: `Default` (the four real slides), `SingleSlide`, `ImageSlides` ### Home page wiring `ModelReleaseSection` now renders the carousel with four localized slides (en + zh-CN): | Slide | autoplayMs (video duration) | CTAs | |---|---|---| | Seedance 2.5 | 17000 | `/seedance-2.5` · cloud template | | LTX 2.5 | 20000 | `/ltx-2.5` · cloud template | | Wan Animate 2 | 18400 | `/wan-animate-2` · cloud template | | MiniMax H3 | 8000 | `/minimax-h3` · cloud share | i18n: per-model `modelRelease.*` keys replace the old single-card keys; zh-CN bodies reuse/derive from the existing model-page hero translations. Adds reusable `tags.openSource` and `cta.tryForFree`. ### VideoPlayer fix Fixes a pre-existing hydration race in the shared `VideoPlayer`: a server-rendered autoplay video can start playing before `useMediaControls` attaches its listeners, leaving the play/mute icons rendering stale state. The refs now sync from the element when it binds. ## Test plan - [x] `pnpm --filter @comfyorg/website typecheck` — clean - [x] `pnpm --filter @comfyorg/website test:unit` — 440/440 pass - [x] Browser-matched against the Figma node at 1440px and 390px widths - [x] Verified live on `/` and `/zh-CN/`: video autoplay + mute/pause controls, dot navigation, timer advance, localized copy 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 9bd3f6b commit 5abfd33

9 files changed

Lines changed: 1101 additions & 31 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3-vite'
2+
3+
import FeaturedCarousel02 from './FeaturedCarousel02.vue'
4+
import type { FeaturedSplitSlide } from './FeaturedCarousel02.vue'
5+
6+
const slides: FeaturedSplitSlide[] = [
7+
{
8+
id: 'seedance-2-5',
9+
media: {
10+
type: 'video',
11+
src: 'https://media.comfy.org/website/seedance-2.5/hero.mp4',
12+
poster: 'https://media.comfy.org/website/seedance-2.5/hero-poster.webp',
13+
alt: 'Seedance 2.5 cinematic video reel'
14+
},
15+
eyebrow: 'New model release',
16+
title: 'Seedance 2.5',
17+
body: "ByteDance's cinematic video model — multi-shot sequences with native audio, text or image in. You direct on the canvas; Seedance renders the cut.",
18+
primaryCta: { label: 'Explore Seedance 2.5', href: '/seedance-2.5' },
19+
secondaryCta: {
20+
label: 'Try workflow',
21+
href: 'https://cloud.comfy.org/?template=api_seedance2_5_r2v'
22+
},
23+
tags: ['Partner Node'],
24+
autoplayMs: 17000
25+
},
26+
{
27+
id: 'ltx-2-5',
28+
media: {
29+
type: 'video',
30+
src: 'https://media.comfy.org/website/ltx-2.5/hero.mp4',
31+
poster: 'https://media.comfy.org/website/ltx-2.5/hero-poster.webp',
32+
alt: 'LTX 2.5 video generation reel'
33+
},
34+
eyebrow: 'New model release',
35+
title: 'LTX 2.5',
36+
body: 'The fastest video generation model, now with sharper prompt adherence and audio. Cinematic detail on faces and fine textures with Diffusion Fidelity Rendering.',
37+
primaryCta: { label: 'Explore LTX 2.5', href: '/ltx-2.5' },
38+
secondaryCta: {
39+
label: 'Try for free',
40+
href: 'https://cloud.comfy.org/?template=video_ltx2_5_i2v'
41+
},
42+
tags: ['Open Source', 'Partner Node'],
43+
autoplayMs: 20000
44+
},
45+
{
46+
id: 'wan-animate-2',
47+
media: {
48+
type: 'video',
49+
src: 'https://media.comfy.org/website/wan-animate-2/hero.mp4',
50+
poster: 'https://media.comfy.org/website/wan-animate-2/hero-poster.webp',
51+
alt: 'Wan Animate 2 character motion transfer reel'
52+
},
53+
eyebrow: 'New model release',
54+
title: 'Wan Animate 2',
55+
body: 'Upload a reference image of your character and a video of the motion you want. Wan Animate 2 transfers that motion onto your character, end to end.',
56+
primaryCta: { label: 'Explore Wan Animate 2', href: '/wan-animate-2' },
57+
secondaryCta: {
58+
label: 'Try for free',
59+
href: 'https://cloud.comfy.org/?template=video_wan_animate2'
60+
},
61+
tags: ['Open Weights'],
62+
autoplayMs: 18400
63+
},
64+
{
65+
id: 'minimax-h3',
66+
media: {
67+
type: 'video',
68+
src: 'https://media.comfy.org/website/minimax/hero.mp4',
69+
poster: 'https://media.comfy.org/website/minimax/hero-poster.webp',
70+
alt: 'MiniMax H3 multi-modal video reel'
71+
},
72+
eyebrow: 'New model release',
73+
title: 'MiniMax H3',
74+
body: 'Full multi-modal I/O, native stereo clip. Up to 2K, 5 to 15s per generation. H3 actually conditions on input audio where others overwrite or drop it.',
75+
primaryCta: { label: 'Explore MiniMax H3', href: '/minimax-h3' },
76+
secondaryCta: {
77+
label: 'Try for free',
78+
href: 'https://cloud.comfy.org/?share=a781503cf508'
79+
},
80+
tags: ['Open Weights', 'Partner Node'],
81+
autoplayMs: 8000
82+
}
83+
]
84+
85+
const meta: Meta<typeof FeaturedCarousel02> = {
86+
title: 'Website/Blocks/FeaturedCarousel02',
87+
component: FeaturedCarousel02,
88+
tags: ['autodocs'],
89+
args: { slides }
90+
}
91+
92+
export default meta
93+
type Story = StoryObj<typeof meta>
94+
95+
export const Default: Story = {}
96+
97+
export const SingleSlide: Story = {
98+
args: {
99+
slides: slides.slice(0, 1)
100+
}
101+
}
102+
103+
export const ImageSlides: Story = {
104+
args: {
105+
slides: [
106+
{
107+
id: 'headphones',
108+
media: {
109+
type: 'image',
110+
src: 'https://media.comfy.org/website/fdct/headphones.png',
111+
alt: 'Product render of headphones'
112+
},
113+
eyebrow: 'Community spotlight',
114+
title: 'Product renders in one pass',
115+
body: 'Photoreal product shots straight from a workflow — swap materials, lighting, and camera moves without re-rendering from scratch.',
116+
primaryCta: {
117+
label: 'Open workflow',
118+
href: 'https://comfy.org/workflows/e8099b642c9f-e8099b642c9f/'
119+
},
120+
tags: ['Workflow']
121+
},
122+
{
123+
id: 'walkthrough',
124+
media: {
125+
type: 'image',
126+
src: 'https://media.comfy.org/website/learning/cleanplate_walkthrough_v03_thumbnail.jpg',
127+
alt: 'Clean plate walkthrough thumbnail'
128+
},
129+
eyebrow: 'Tutorial',
130+
title: 'Clean plates, start to finish',
131+
body: 'A guided walkthrough of the clean-plate pipeline, from ingest to final comp.',
132+
primaryCta: { label: 'Watch now', href: '/learning' },
133+
secondaryCta: {
134+
label: 'Read the docs',
135+
href: 'https://docs.comfy.org/',
136+
newTab: true
137+
}
138+
}
139+
]
140+
}
141+
}

0 commit comments

Comments
 (0)