From 2c14ee428aed77b471b4c9865a052d02b8250467 Mon Sep 17 00:00:00 2001 From: Michael B Date: Fri, 10 Jul 2026 16:21:13 -0400 Subject: [PATCH] feat(website): rebuild vfx page hero, logos, and tutorial cards - Rebuild vfx HeroSection on HeroBackdrop01 with video backdrop, new copy, and Contact Sales / Try Now CTAs; add tone prop (light/dark) to HeroBackdrop01 for dark backdrops with white text - Extract logo marquee into LogosAll01 block with clientLogos data; SocialProofBarSection is now a thin wrapper; add logos under vfx hero - Extract shared TutorialCard and TutorialDetailDialog into common/, dedupe Tutorial type and poster helper from both tutorial data files - Remove FeaturedWorkflowSection from vfx pages; update tutorials heading/description and CTA copy (with zh-CN); balance CTA heading line wrapping; point vfx tutorial assets at website/vfx Co-Authored-By: Claude Fable 5 --- .../blocks/HeroBackdrop01.stories.ts | 6 + .../src/components/blocks/HeroBackdrop01.vue | 26 +++- .../components/blocks/LogosAll01.stories.ts | 18 +++ .../src/components/blocks/LogosAll01.vue | 83 ++++++++++++ .../components/common/CallToActionSection.vue | 2 +- .../common/SocialProofBarSection.vue | 80 +----------- .../components/common/TutorialCard.stories.ts | 19 +++ .../src/components/common/TutorialCard.vue | 120 ++++++++++++++++++ .../TutorialDetailDialog.vue | 17 ++- .../components/learning/TutorialsSection.vue | 96 ++------------ .../vfx/FeaturedWorkflowSection.vue | 67 ---------- .../src/components/vfx/HeroSection.vue | 44 +++++-- .../components/vfx/TutorialDetailDialog.vue | 81 ------------ .../src/components/vfx/TutorialsSection.vue | 101 +++------------ apps/website/src/data/clientLogos.ts | 20 +++ apps/website/src/data/learningTutorials.ts | 24 +--- apps/website/src/data/vfxTutorials.ts | 61 +++------ apps/website/src/i18n/translations.ts | 43 +++---- apps/website/src/pages/vfx.astro | 4 +- apps/website/src/pages/zh-CN/vfx.astro | 4 +- 20 files changed, 408 insertions(+), 508 deletions(-) create mode 100644 apps/website/src/components/blocks/LogosAll01.stories.ts create mode 100644 apps/website/src/components/blocks/LogosAll01.vue create mode 100644 apps/website/src/components/common/TutorialCard.stories.ts create mode 100644 apps/website/src/components/common/TutorialCard.vue rename apps/website/src/components/{learning => common}/TutorialDetailDialog.vue (87%) delete mode 100644 apps/website/src/components/vfx/FeaturedWorkflowSection.vue delete mode 100644 apps/website/src/components/vfx/TutorialDetailDialog.vue create mode 100644 apps/website/src/data/clientLogos.ts diff --git a/apps/website/src/components/blocks/HeroBackdrop01.stories.ts b/apps/website/src/components/blocks/HeroBackdrop01.stories.ts index b5175d88ff..a2c682f19c 100644 --- a/apps/website/src/components/blocks/HeroBackdrop01.stories.ts +++ b/apps/website/src/components/blocks/HeroBackdrop01.stories.ts @@ -39,3 +39,9 @@ export const NoBackdrop: Story = { backdrop: undefined } } + +export const DarkTone: Story = { + args: { + tone: 'dark' + } +} diff --git a/apps/website/src/components/blocks/HeroBackdrop01.vue b/apps/website/src/components/blocks/HeroBackdrop01.vue index cb687beed9..dcbea52967 100644 --- a/apps/website/src/components/blocks/HeroBackdrop01.vue +++ b/apps/website/src/components/blocks/HeroBackdrop01.vue @@ -20,6 +20,7 @@ const { title, subtitle, footnote, + tone = 'light', class: className } = defineProps<{ backdrop?: Backdrop @@ -30,9 +31,19 @@ const { title: string subtitle?: string footnote?: string + tone?: 'light' | 'dark' class?: HTMLAttributes['class'] }>() +// Light tone assumes a light backdrop: dark ink text on desktop plus a +// warm-white radial scrim for contrast. Dark tone assumes a dark backdrop +// and uses white text at all breakpoints, with no scrim. +const toneTextClass = computed(() => + tone === 'light' + ? 'text-primary-comfy-canvas lg:text-primary-comfy-ink' + : 'text-white' +) + // Respect prefers-reduced-motion: don't autoplay the looping backdrop video // (WCAG 2.2.2). The paused video falls back to its poster/first frame. const reduceMotion = computed(() => prefersReducedMotion()) @@ -151,6 +162,7 @@ const scrimStyle = { >