Skip to content

feat(website): hero 360 turntable, one-shot demo, industries section - #14494

Open
marawan206 wants to merge 76 commits into
mainfrom
feat/hero-turntable-industries
Open

feat(website): hero 360 turntable, one-shot demo, industries section#14494
marawan206 wants to merge 76 commits into
mainfrom
feat/hero-turntable-industries

Conversation

@marawan206

Copy link
Copy Markdown
Contributor

Summary

Real 16-frame 360° turntable for the hero pipeline, a one-shot idle demo, and the new Industries section replacing the showcase/use-case sections on the homepage.

Changes

  • What:
    • Hero renders replaced with a 16-frame 4:3 turntable (22.5° steps); the input frame anchors azimuth 0 and the resolver snaps by nearest azimuth in degrees, so elevation/distance variants can slot in later
    • Input image is textured onto the 3D ANGLE node's plane, and the halo ring sits concentric with it
    • Idle demo now plays exactly one full orbit (landing back on the starting pose) and cancels permanently on any interaction; never re-triggers
    • Headline link piece keeps a floor size so it stays legible on smaller canvases; hero canvas keeps scaling proportionally on 2xl+ screens
    • Mobile hero shows the input photo, 3D node and OUTPUT in the first viewport, CTA after the flow
    • New IndustriesSection (en/zh-CN) with node-shaped media cluster replaces ProductShowcaseSection and UseCaseSection on the homepage; the pin-scrub scroll hijack and its composable are removed
  • Breaking: none — ProductShowcaseSection is retained for the models pages

Review Focus

  • Industries clip paths are traced from the design mock; if exact vectors exist in Figma they can replace the path data verbatim
  • Turntable phase/direction: azimuth 0 reproduces the input view; verify drag feel on the 3D node
  • Third cluster tile plays a constant community reel (no per-industry third asset exists yet)

Marwan Ahmed and others added 30 commits July 20, 2026 15:26
Replace the landing hero with an interactive recreation of a real
ComfyUI workflow (Load Image → Qwen Multiangle Camera → Image Edit →
Save Image). Nodes are draggable and collapsible; the camera node is a
vendored Three.js scene whose pose drives sliders, preset dropdowns, and
the live prompt string. Pressing Run resolves the current pose to a
pre-rendered output — no inference backend.

three.js and the camera widget are dynamically imported and hydrate only
on scroll + idle, so the landing route no longer ships three.js eagerly
(the old hero pulled it in via useHeroLogo).

Camera engine vendored from jtydhr88/ComfyUI-qwenmultiangle (MIT); see
src/components/hero/camera/ATTRIBUTION.md.
Rework the hero from a full four-node graph into the simplified Figma
flow: an input image card, a compact "3D ANGLE" node, and an OUTPUT
image card joined by yellow links. The camera scene is recoloured to a
white / grey / yellow palette (added via a `palette` option on the
vendored widget). Output updates live as the camera moves — the Run
button and the Image Edit / Save nodes (and the seed widget) are gone.
The live prompt renders as yellow highlighter word-chips below the flow.
Add the yellow bezel border on the 3D ANGLE node, raise the inner-panel
contrast, brighten the node label, and give the prompt word-chips the
skewed highlighter-marker treatment from the design.
Replace the live prompt words below the flow with the site headline
("Professional Control of Visual AI") rendered in the same skewed
highlighter-chip treatment, restoring a visible h1. The camera pose
still drives the 3D scene and output image live.
Reuse the existing NodeBadge component so the headline matches the
site's interlocking yellow-pill treatment (as used by the "HOW Comfy
WORKS" section) instead of a bespoke chip style.
Match the Figma: swap the 3D ANGLE node's yellow bezel for a neutral
dark border with a lighter inset scene panel, and align the image cards
to the same corner radius and border. Restyle the OUTPUT pill as the
dark-plum rounded rectangle from the design.
Give the 3D ANGLE node a proper header strip — label and port dots
inside the node's top band, scene panel inset below — and move the link
anchors onto the header dots. Render the headline as one tilted
highlighter pill per line, tightly stacked, per the design.
Recreate the connected two-pill headline: yellow rounded pills fused by
a small bridge through an SVG goo filter (blur + alpha contrast), with
crisp text layered on top. The bridge is static — no glide animation.
…ards

Place the goo headline at the top of the hero. Rework the connectors to
match the design reference: endpoints are dots drawn inside the cards
(input card interior, OUTPUT pill), wires render above the cards and
cross their edges, with endpoint dots drawn by the links layer.
End the output wire on the OUTPUT pill's own dot instead of drawing a
near-duplicate endpoint, raise the input anchor to the same height as
the output pill, and set draggable=false on card images so grabbing
them moves the node rather than ghost-dragging the image.
Rearrange the hero per the design mock: small input card top-left, the
goo headline overlaid top-center inside the scaling canvas, the 3D ANGLE
node full-size lower-centre, and a large output card that bleeds off the
right edge of the viewport while staying draggable. Headline sizing is
now em-relative so it scales with the canvas; drag clamps allow cards to
sit partially outside the canvas with a reachable margin.
Add 11 new pre-rendered poses (full left-side ring across low/eye/high
elevations, right-side eye-level, front and back close-ups) and refresh
the back-view medium render, growing the resolver's asset set from 5 to
16 so dragging the camera lands on real renders far more often.
Add a COLOR node between the 3D ANGLE node and the output: a draggable
hue ring plus a saturation slider that apply a CSS hue-rotate/saturate
filter to the output image in real time, recolouring the render's neon
without any new assets. Wires it in as 3D ANGLE -> COLOR -> OUTPUT.
…dots

Replace the hue ring with two quiet gradient sliders (hue spectrum and a
saturation track that follows the current hue), no numeric readouts.
Wire splines now end exactly on the nodes' own dots: port constants
match the header dot centres and the links layer only draws a dot where
no DOM dot exists (the input card), removing the doubled dots.
Restore slider/button exclusions in the node-drag guard so pointer drags
on a slider track scrub the value instead of moving the node.
Swap in the corrected renders: a denser eye-level medium ring (front,
both front quarters, both sides, back, back-left quarter), refreshed
high-angle poses for front/back/left/right, and keep the low-angle
trio. The set is now 14 consistent poses.
Make the zoom handle drag relative to its grab point (no jump) and add
oversized invisible hit targets for all three camera handles. Slant the
headline pills per the design. Render wires beneath nodes so they dip
under elements they cross, with every endpoint's dot drawn by its own
element (input card dot restored as DOM).
The node-left/right cap SVGs were intrinsically 94.14 tall while
node-union is 95.23; replaced flex items never stretch, so the yellow
segments stood ~1px taller than the caps and poked out below the badge.
Scale the caps to the same intrinsic height.
Project the pointer ray onto the centre-to-camera line, subtract the
grab offset, and invert the handle-position curve, so the zoom handle
tracks the pointer along its visible direction at every azimuth instead
of upstream's vertical-only mapping that inverted direction and jumped
on grab.
Replace the static mobile fallback with the full pipeline as a vertical
stack (input, touch-driven 3D ANGLE node, COLOR sliders, live OUTPUT),
sharing the pose/colour state logic with the desktop graph via a
composable. Below md the headline renders as solid skewed pills — the
goo filter's fixed-pixel blur turned small pills to mush.
Add the front-view eye-level close-up and wide-shot renders so the zoom
axis resolves real assets across its whole range on the default view.
On mobile, drop the input card and lead with the 3D ANGLE node followed
directly by the OUTPUT, with the colour sliders after.
Rebuild the headline from the node-pill cap geometry used across the rest
of the site, replacing the goo-filter approximation. Real geometry scales
cleanly, so this also drops the separate below-md rendering path the
device-pixel blur required.

Apply the node label type spec and resize the slider thumbs to sit flush
with their tracks.

Drive the camera pose and colour grade after three seconds without input so
the interaction is discoverable. Motion resumes from wherever the visitor
left the pose, runs only while the graph is on screen so the desktop and
mobile copies never animate at once, and is disabled under
prefers-reduced-motion.

Enlarge the camera gizmo, thin its strokes, and swap the output image
immediately instead of cross-fading.
Render the subject as a plain grey card and enable the inner base ring, so
the widget reads as a camera diagram rather than a thumbnail preview. The
ring already existed in the vendored widget and was only switched off by
the palette, so no new geometry was needed.
Place the primary CTA under the headline in both the desktop graph overlay
and the mobile flow, pointing at the same cloud destination as the header's
primary button.

The desktop overlay is pointer-events-none so drags reach the graph nodes
beneath it, so the button opts back in explicitly.
Add ten renders: the full eight-azimuth elevated medium ring, plus the two
azimuths missing from the eye-level medium ring.

The elevated band previously shipped nothing at all, so every pose between
15 and 45 degrees snapped to a neighbouring elevation — about a quarter of
the idle self-demo's travel. Both medium rings are now complete, which also
means no azimuth bucket is empty and the resolver's circular snapping is no
longer reachable; the two tests that asserted that fallback now cover the
exact-resolution and same-azimuth degradation that replaced it.
…raph-bert

# Conflicts:
#	apps/website/src/components/home/HeroSection.vue
Carry the intent of #14250 (hero CTA -> cloudCta with UTM content) into
the new hero graph's Get started buttons after merging main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Move the 3D ANGLE and COLOR nodes up under the headline and reposition
the Get started for free button beneath them at the bottom of the
canvas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Comment thread apps/website/src/components/home/ProductShowcaseSection.vue Outdated
Comment thread apps/website/src/components/home/ProductShowcaseSection.vue Outdated
@imick-io

Copy link
Copy Markdown
Collaborator

The website-e2e failure is caused by this PR. Two homepage smoke tests check for sections that this PR removes:

  • e2e/homepage.spec.ts:42 — "UseCaseSection is visible" expects the text "Industries that create with ComfyUI", which no longer exists (the section was replaced by IndustriesSection, whose label is just "Industries").
  • e2e/homepage.spec.ts:116 — "BuildWhatSection is visible" expects the badge text "DOESN'T EXIST", and that section is deleted from the homepage.

Both tests will fail on every run until the spec is updated to the new page composition.

While you're in there, could you also add equivalent smoke tests for the new sections (ModelRelease, FeaturedWorkflows, Industries)? The sections being removed had coverage, and it would be good for their replacements to keep that.

Comment thread apps/website/src/components/home/FeaturedWorkflowsSection.vue Outdated
Comment thread apps/website/src/components/home/IndustriesSection.vue Outdated
Comment thread apps/website/src/components/home/VideoMaskScene.vue Outdated
Comment thread apps/website/src/components/home/LottieScene.vue Outdated
Comment thread apps/website/src/components/home/ModelReleaseSection.vue Outdated
- ProductShowcaseSection: render VideoMaskScene on mobile, drop dead video plumbing
- Extract useAutoAdvance composable; share it between Industries and FeaturedWorkflows
- FeaturedWorkflowsSection: play/pause slide videos on advance and visibility
- VideoMaskScene: template-rendered scenes, dedup in-flight load, retry on failure
- LottieScene: lottie-web AnimationItem type, same load guard, unmount race fix
- ModelReleaseSection: MiniMax CTA via routes config (/minimax-h3, mirrors main)
- Disable hero node pointer interactions under prefers-reduced-motion
- e2e: replace removed-section smoke tests, cover new sections, stub hub assets
@socket-security

socket-security Bot commented Aug 13, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​lottie-web@​5.13.09910010084100

View full report

@marawan206

Copy link
Copy Markdown
Contributor Author

I have read and agree to the Contributor License Agreement

comfy-legal added a commit to Comfy-Org/comfy-cla that referenced this pull request Aug 13, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 13, 2026
@marawan206
marawan206 changed the base branch from feat/comfy-org-hero-graph-bert to main August 13, 2026 22:07
@marawan206
marawan206 dismissed coderabbitai[bot]’s stale review August 13, 2026 22:07

The base branch was changed.

@marawan206
marawan206 requested a review from a team August 13, 2026 22:07

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are some merge conflicts.

@github-actions github-actions Bot added the risk:R3 PR risk grade (advisory shadow check; grader-owned) label Aug 17, 2026
@marawan206

Copy link
Copy Markdown
Contributor Author

Merge conflicts resolved @christian-byrne

@imick-io

Copy link
Copy Markdown
Collaborator

binary-size check is failing — could you move these five clips to GCP and serve them from the CDN?

swings.webm (1.63 MiB), flower.webm (1.59 MiB), eye.webm (1.56 MiB), paul_trillo.webm (1.52 MiB) and dududu.webm (1.23 MiB) all exceed the repo's 1 MiB cap for committed binaries, so CI blocks the merge as-is. Rather than keeping them in git, please upload them to the media bucket (e.g. media.comfy.org/website/homepage/animations/scene-3/) per the Frontend Binary Upload Playbook linked in the failing job, and reference them by URL — the same way this PR already serves the Industries reels from media.comfy.org/website/homepage/use-case/.

@datadog-official

This comment has been minimized.

@imick-io
imick-io self-requested a review August 19, 2026 23:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:R3 PR risk grade (advisory shadow check; grader-owned) size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants