Skip to content

feat(landing): add image generation showcase - #6904

Merged
AmyShang-alt merged 3 commits into
mainfrom
feat/image-generation-landing
Aug 18, 2026
Merged

feat(landing): add image generation showcase#6904
AmyShang-alt merged 3 commits into
mainfrom
feat/image-generation-landing

Conversation

@open-design-crew

Copy link
Copy Markdown
Contributor

Why

Open Design now supports image generation through an active membership, but the public site did not have a dedicated solution page that explains the capability or demonstrates the range of results. This adds a production landing page aligned with the existing solution-page information architecture so visitors can understand the supported models, inspect complete prompts, and download the desktop client.

What users will see

  • A new /solutions/image-generation/ page, including /zh/solutions/image-generation/
  • Hero and membership messaging for Seedream 5.0 Pro, GPT Image 2, and Nano Banana 2
  • 19 generated-image examples with complete prompts in a centered modal
  • Workflow, membership, FAQ, and final CTA sections
  • Desktop download and GitHub actions aligned with existing solution pages

Surface area

  • UI — landing-page solution route, responsive layout, image gallery, prompt modal, and CTA hierarchy
  • Daemon / API
  • Installer / packaging
  • Build / CI
  • Docs only

Screenshots

Validated locally at http://127.0.0.1:17674/zh/solutions/image-generation/. The per-PR landing-page preview will be generated by CI for visual review.

Bug fix verification

Not a bug fix.

Validation

  • pnpm guard
  • pnpm --filter @open-design/landing-page test — 137 passed
  • pnpm --filter @open-design/landing-page build — 6631 pages built
  • Verified English and Chinese static outputs contain all 19 image assets

@lefarcen
lefarcen requested a review from mrcfps August 14, 2026 09:57
@lefarcen lefarcen added size/XL PR changes 700-1500 lines risk/medium Medium risk: regular code changes type/feature New feature labels Aug 14, 2026
@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

🚀 Landing page preview

This PR is deployed to a Cloudflare Pages preview — not staging or production:

@mrcfps mrcfps 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.

Thanks @app/open-design-crew — this is a lovely showcase. The 19-image gallery, prompt modal, membership/model story, and locale wrapper all land cleanly, and the hero/footer download CTAs match the existing solution-page contract.

A few non-blocking maintainability notes below. The page itself works; these are about keeping the copy, mosaic, and discoverability from drifting the next time this route is edited.

🔁 Powered by Looper · runner=reviewer · agent=grok-build · An autonomous AI dev team for your GitHub repos.

Comment on lines +25 to +57
const pageCopy = isZh
? {
pageName: 'AI 图片生成',
promptLabel: '提示词',
modelRailTitle: '一个工作区,三种图片模型',
modelRailBody: '无需单独配置供应商 API Key',
galleryTitle: '看看 Open Design 能生成什么',
galleryBody: '这些图片均由 Open Design 实时生成。点击任意案例,即可查看完整提示词。',
workflowTitle: '从一句话,到最终成图',
accessTitle: '一个订阅,无需配置供应商 Key',
accessBody: '登录 Open Design 并开通会员,即可在同一个项目里生成图片、继续调整并保留完整提示词。',
faqTitle: '图片生成常见问题',
finalTitle: '把下一条提示词,变成一张图片',
finalBody: '下载 Open Design,使用会员订阅开始生成图片。',
dialogTitle: '生成提示词',
close: '关闭',
}
: {
pageName: 'AI image generation',
promptLabel: 'Prompt',
modelRailTitle: 'One workspace, three image models',
modelRailBody: 'No separate provider API keys',
galleryTitle: 'See what Open Design can generate',
galleryBody: 'Every image is generated live in Open Design. Select any example to inspect its complete prompt.',
workflowTitle: 'From one sentence to a finished image',
accessTitle: 'One subscription. No provider-key setup.',
accessBody: 'Sign in with an active membership to generate, refine, and keep every prompt inside the same Open Design project.',
faqTitle: 'Image generation FAQ',
finalTitle: 'Turn your next prompt into an image',
finalBody: 'Download Open Design and start generating with your membership.',
dialogTitle: 'Generation prompt',
close: 'Close',
};

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.

Visible copy is split across two sources, and they have already drifted.

pageCopy hardcodes the section titles and bodies that the template actually renders (galleryTitle, galleryBody, workflowTitle, accessTitle, accessBody, faqTitle, finalTitle, finalBody, dialogTitle, close). IMAGE_GENERATION_COPY already defines the same slots (galleryHeading, galleryLead, howHeading, accessHeading, accessBody, faqTitle, finalHeading, finalBody, promptTitle, close) plus a large unused set (copyPrompt, copied, viewPrompt, generatedLive, liveLabel, modelsEyebrow, modelsHeading, …).

Those two sources already disagree. For example:

  • pageCopy.galleryBody says visitors should “inspect its complete prompt”
  • IMAGE_GENERATION_COPY.en.galleryLead says “Open any prompt, copy it, and make it your own”
  • pageCopy.accessBody / copy.accessBody and pageCopy.finalBody / copy.finalBody also differ

The template only reads copy.title, copy.description, copy.eyebrow, copy.headingA / headingB, copy.lead, copy.secondaryCta, copy.steps, copy.accessItems, and copy.faq. Everything else in the data file is dead.

This matters because the next copy edit will almost certainly go into IMAGE_GENERATION_COPY and silently miss the page. The leftover “copy it” / copyPrompt strings also describe a copy button that was never wired.

Suggested change: delete pageCopy. Keep one locale map in IMAGE_GENERATION_COPY and render from it. Reconcile the drifted strings first, then drop the unused keys so the data file only contains fields the template reads.

🔁 Powered by Looper · runner=reviewer · agent=grok-build · An autonomous AI dev team for your GitHub repos.

Comment on lines +253 to +276
.image-generation-solution .ig-gallery-card:nth-child(1),
.image-generation-solution .ig-gallery-card:nth-child(14) {
grid-column: span 8;
grid-row: span 2;
}

.image-generation-solution .ig-gallery-card:nth-child(2),
.image-generation-solution .ig-gallery-card:nth-child(3),
.image-generation-solution .ig-gallery-card:nth-child(6),
.image-generation-solution .ig-gallery-card:nth-child(7),
.image-generation-solution .ig-gallery-card:nth-child(8),
.image-generation-solution .ig-gallery-card:nth-child(15),
.image-generation-solution .ig-gallery-card:nth-child(16) {
grid-column: span 4;
grid-row: span 1;
}

.image-generation-solution .ig-gallery-card:nth-child(4),
.image-generation-solution .ig-gallery-card:nth-child(5),
.image-generation-solution .ig-gallery-card:nth-child(12),
.image-generation-solution .ig-gallery-card:nth-child(13) {
grid-column: span 6;
grid-row: span 2;
}

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.

Desktop mosaic is load-bearing on example order, not on the layout field the data already has.

Each example already carries layout: 'wide' | 'portrait' | 'square', and index.astro applies ig-gallery-card-${example.layout}. On desktop those classes do not control placement. This block assigns grid-column / grid-row with hardcoded :nth-child(1), :nth-child(14), :nth-child(2,3,6,7,8,15,16), and :nth-child(4,5,12,13). The layout-class rules only appear later, inside the max-width: 720px breakpoint.

That means IMAGE_GENERATION_EXAMPLES order is part of the visual contract, but nothing enforces it. Adding a 20th image, swapping two portraits, or reordering the celestial-world set will silently break the 12-column mosaic. The layout field looks like the source of truth and is not.

Suggested change: drive desktop spans from the layout class (or a data-span derived from example.layout) the same way mobile already does. If this exact 19-card mosaic is intentional, keep the nth-child rules but add a short comment that the example order is load-bearing, and a test that the array length / layout sequence still matches these selectors.

🔁 Powered by Looper · runner=reviewer · agent=grok-build · An autonomous AI dev team for your GitHub repos.

Comment on lines +105 to +112
<Layout
title={copy.title}
description={copy.description}
active="solution"
jsonLd={jsonLd}
mainClassName="sub-main container image-generation-main"
>
<article class="info-page solution-page image-generation-solution" data-image-generation-page>

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.

This new route is not reachable from the existing Image solution surfaces.

The page ships at /solutions/image-generation/ (and locale prefixes), but this PR does not register it in:

  • apps/landing-page/app/pages/solutions/index.astro USE_CASES — still only { key: 'image', slug: 'image' }
  • apps/landing-page/app/_components/site-footer.astro USE_CASE_HREFS — still /solutions/image/
  • the header Solution → Image item, which continues to open /solutions/image/
  • apps/landing-page/app/pages/solutions/image/index.astro, whose browse/gallery link still points at /plugins/templates/

So a visitor who follows the current Image use-case never sees this showcase. The two URLs will also compete for the same intent.

I would not expand the fixed 6-item useCaseItems nav tuple just for this. A lighter close is: point /solutions/image/’s browse/gallery CTA (exampleHref) at /solutions/image-generation/, and/or add a hub card on /solutions/ that links here. That keeps the existing Image nav entry and makes the showcase discoverable.

🔁 Powered by Looper · runner=reviewer · agent=grok-build · An autonomous AI dev team for your GitHub repos.

@lefarcen
lefarcen requested a review from mrcfps August 18, 2026 12:22

@mrcfps mrcfps 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.

@app/open-design-crew thank you for the follow-up polish on this showcase — the simplified hero CTAs and refined prompt-dialog close control look clean and match the existing solution-page contract.

I re-checked this head (a2b0580) end to end: locale wrapper, 19-example gallery + prompt modal wiring, membership/model FAQ copy, download/GitHub CTA hierarchy, asset/id alignment, and the solution-page count test bump. No new correctness, safety, or test issues on the changed ranges.

The three earlier non-blocking threads (single copy source, mosaic order vs layout, and discoverability from /solutions/image/) are still open as follow-ups and do not block merge. Nice work shipping this page 🙌

🔁 Powered by Looper · runner=reviewer · agent=opencode · An autonomous AI dev team for your GitHub repos.

@AmyShang-alt AmyShang-alt added the validated Runtime change validated (via /explore Pass or manual QA). label Aug 18, 2026
@AmyShang-alt

Copy link
Copy Markdown
Contributor

@app/open-design-crew

Thanks for the contribution. I completed QA validation for this PR.

QA Acceptance Record

Scope:

  • Image-generation solution routes, localized rendering, 19-image gallery, prompt dialog, responsive mobile layouts, static assets, SEO metadata, and download/GitHub CTA behavior.

Scope-to-evidence:

  • Automated coverage -> pnpm --filter @open-design/landing-page test passed 137/137; pnpm guard passed.
  • Build and routing -> landing-page build completed with 6,631 static pages and 11 locale variants for this route.
  • Static assets -> all 19 WebP assets returned HTTP 200 with image/webp and loaded successfully during full-page scrolling.
  • Runtime layout -> verified at 1280x720, 390x844, and 320x568 with no page-level horizontal overflow.
  • Prompt dialog -> verified hero and gallery data mapping, close button, backdrop close, focus restoration, and narrow-screen bounds.

Verified:

  • EN/ZH content, 19 gallery cards, workflow, FAQ, CTA hierarchy, canonical/hreflang metadata, responsive single-column mobile layout, and installer-link rewriting.

Not verified:

  • No blocking items. Escape behavior in the in-app browser remains a non-blocking compatibility note; close button and backdrop paths work.

Risks / notes:

  • Existing review follow-ups on copy-source consolidation, order-dependent desktop mosaic rules, and route discoverability remain non-blocking maintainability items.

Conclusion:

  • Accepted.

@AmyShang-alt
AmyShang-alt added this pull request to the merge queue Aug 18, 2026
Merged via the queue into main with commit b800b91 Aug 18, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk/medium Medium risk: regular code changes size/XL PR changes 700-1500 lines type/feature New feature validated Runtime change validated (via /explore Pass or manual QA).

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants