diff --git a/apps/web/package.json b/apps/web/package.json index cdfe6d9..4eab644 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -17,7 +17,8 @@ "media:prepare-showcase": "node scripts/prepare-showcase-retail.mjs", "media:capture-showcase": "node scripts/capture-showcase.mjs", "media:showcase": "tsx scripts/generate-showcase.ts", - "media:verify-showcase": "node scripts/verify-showcase.mjs", + "media:verify-showcase": "pnpm media:verify-home", + "media:verify-home": "node scripts/verify-home.mjs", "metrics:update-fallback": "tsx scripts/generate-metrics.ts --update-fallback", "og:generate": "tsx scripts/generate-og.ts", "preview": "astro preview", diff --git a/apps/web/scripts/verify-showcase.mjs b/apps/web/scripts/verify-home.mjs similarity index 76% rename from apps/web/scripts/verify-showcase.mjs rename to apps/web/scripts/verify-home.mjs index af0ec04..49cdbcd 100644 --- a/apps/web/scripts/verify-showcase.mjs +++ b/apps/web/scripts/verify-home.mjs @@ -5,8 +5,8 @@ import { fileURLToPath } from 'node:url' import { chromium } from '@playwright/test' import sharp from 'sharp' -const output = new URL('../.cache/showcase-qa/', import.meta.url) -const before = new URL('../.cache/visual-qa/', import.meta.url) +const output = new URL('../.cache/demo-qa/', import.meta.url) +const before = new URL('../.cache/showcase-qa/', import.meta.url) const baseURL = process.env.SHOWCASE_BASE_URL ?? 'http://127.0.0.1:4321' const routes = ['/', '/en/', '/projects/weapp-tailwindcss/', '/projects/weapp-vite/', '/projects/varo/', '/pricing/', '/en/pricing/'] const records = [] @@ -52,6 +52,25 @@ try { { input: fileURLToPath(new URL(`${name}.png`, output)), left: viewport.width, top: 0 }, ]).png().toFile(fileURLToPath(new URL(`${name}-comparison.png`, output))) } + const lab = page.locator('hero-demos') + for (const [index, kind] of ['style', 'build', 'registry'].entries()) { + await lab.getByRole('tab').nth(index).click() + if (kind === 'style') { + await lab.locator('style-demo input[value="1"]').check() + await lab.locator('style-demo select').selectOption('2') + await lab.locator('[data-compact]').check() + } + if (kind === 'build') { + await lab.locator('build-demo input[value="2"]').check() + } + if (kind === 'registry') { + await lab.locator('registry-demo input[value="card"]').uncheck() + await lab.locator('[data-registry-button]').click() + } + await page.screenshot({ path: fileURLToPath(new URL(`${name}-${kind}.png`, output)) }) + await lab.screenshot({ path: fileURLToPath(new URL(`${name}-${kind}-detail.png`, output)) }) + assert.equal(await page.evaluate(() => document.documentElement.scrollWidth > document.documentElement.clientWidth + 1), false) + } } records.push({ route, viewport, theme, name, ...checks, errors }) page.off('pageerror', onError) diff --git a/apps/web/src/components/ShowcasePicture.astro b/apps/web/src/components/ShowcasePicture.astro deleted file mode 100644 index 5c6ec5c..0000000 --- a/apps/web/src/components/ShowcasePicture.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import type { Locale, ProjectVisual } from '../types/project' - -interface Props { - visual: ProjectVisual - locale: Locale - sizes: string - priority?: boolean -} - -const { visual, locale, sizes, priority = false } = Astro.props -const variants = visual.variants ?? [visual] -const responsiveSizes = priority ? sizes : `auto, ${sizes}` ---- - - - `${image.avif} ${image.width}w`).join(', ')} sizes={responsiveSizes} /> - `${image.src} ${image.width}w`).join(', ')} sizes={responsiveSizes} width={visual.width} height={visual.height} alt={visual.locales[locale].alt} loading={priority ? 'eager' : 'lazy'} fetchpriority={priority ? 'high' : 'auto'} decoding="async" /> - diff --git a/apps/web/src/components/home/HomeHero.astro b/apps/web/src/components/home/HomeHero.astro index d7e9a1c..f903b4c 100644 --- a/apps/web/src/components/home/HomeHero.astro +++ b/apps/web/src/components/home/HomeHero.astro @@ -4,7 +4,7 @@ import type { Locale } from '../../types/project' import type { HomeProject } from '../../lib/home-projects' import { localizePath, siteCopy } from '../../i18n/ui' import { buttonPrimary, buttonSecondary, shell } from '../../styles/classes' -import ShowcasePicture from '../ShowcasePicture.astro' +import HeroDemos from './demos/HeroDemos.astro' interface Props { locale: Locale @@ -13,17 +13,15 @@ interface Props { const { locale, projects } = Astro.props const copy = siteCopy[locale] -const heroRatios = projects.map(project => project.showcase[0].width / project.showcase[0].height) -const heroRatioTotal = heroRatios.reduce((sum, ratio) => sum + ratio, 0) ---
-

{copy.hero.eyebrow}

-

{copy.hero.title}

-

{copy.hero.description}

- @@ -49,7 +42,7 @@ const heroRatioTotal = heroRatios.reduce((sum, ratio) => sum + ratio, 0) {projects.map((project, index) => { const content = project.data.locales[locale] return ( - + {String(index + 1).padStart(2, '0')} {content.name}{project.stage[locale]} / {content.tagline} diff --git a/apps/web/src/components/home/HomeProjectRow.astro b/apps/web/src/components/home/HomeProjectRow.astro index dd85e51..bc14aba 100644 --- a/apps/web/src/components/home/HomeProjectRow.astro +++ b/apps/web/src/components/home/HomeProjectRow.astro @@ -1,12 +1,12 @@ --- -import { ArrowRight, BadgeCheck, BookOpen } from '@lucide/astro' +import { ArrowRight, ArrowUpRight, BadgeCheck, BookOpen } from '@lucide/astro' import type { Locale, ProjectMetrics } from '../../types/project' import type { HomeProject } from '../../lib/home-projects' import { formatCompactNumber } from '../../lib/metrics' import { projectPath, siteCopy } from '../../i18n/ui' import { buttonPrimary, buttonSecondary, projectTone } from '../../styles/classes' -import ShowcasePicture from '../ShowcasePicture.astro' -import { showcaseSizes } from './media-sizes' +import HomeDemo from './demos/HomeDemo.astro' +import { demoCopy } from './demos/copy' interface Props { locale: Locale @@ -22,16 +22,15 @@ const numberLocale = locale === 'zh-CN' ? 'zh-CN' : 'en-US' ---
- -