Skip to content

feat(website): add brand portal page at /brand#13484

Open
mobeenabdullah wants to merge 10 commits into
mainfrom
feat/website-brand-portal
Open

feat(website): add brand portal page at /brand#13484
mobeenabdullah wants to merge 10 commits into
mainfrom
feat/website-brand-portal

Conversation

@mobeenabdullah

@mobeenabdullah mobeenabdullah commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

Add the Brand Portal page at /brand (and /zh-CN/brand), implementing the Figma design in English and Simplified Chinese.

Changes

  • What: New marketing page with hero, logo system, color palette, voice guidelines, trademark, and questions sections. Reuses BaseLayout, Button, and SectionHeader; adds data/brandColors.ts (palette with hex/rgb/hsl/cmyk) and templates/brand/ sections. The hero "View brand guidelines" downloads the guidelines PDF; both "Download logos" actions download the brand-assets zip. Route registered in config/routes.ts; copy in i18n/translations.ts (en + zh-CN).
  • Dependencies: none

Review Focus

  • Typography, spacing, and palette values were matched to the Figma per section; the Chinese is a first-pass translation.
  • The guidelines PDF and logo zip are served from media.comfy.org with Content-Disposition: attachment so the buttons download rather than open inline.
  • Contact links point to /contact in the same tab (the Figma prototype annotation used a new tab).

Implements FE-1217.

Screenshots

Desktop

brand-portal-desktop

Mobile

brand-portal-mobile

Test plan

  • pnpm --filter @comfyorg/website typecheck
  • pnpm lint
  • pnpm format
  • e2e/brand.spec.ts (sections render; logo bundle and guidelines-PDF download links)
  • Verified responsive at 1440 / 834 / 390

Implement the Brand Portal page (FE-1217) from the Figma design: hero, logo system with downloadable assets, color palette, voice guidelines, trademark, and questions sections. Ships English and Simplified Chinese, reusing the shared Button, SectionHeader, and BaseLayout.
@mobeenabdullah mobeenabdullah requested review from a team and imick-io July 7, 2026 20:00
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

🌐 Website E2E

Tip

All tests passed.

Status ✅ Passed
Report View Report

🔗 Website Preview

Website Preview: https://comfy-website-preview-pr-13484.vercel.app

This commit: https://website-frontend-62jt1e72l-comfyui.vercel.app

Last updated: 2026-07-08T18:30:14Z for 53f9536

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a localized Brand Portal page at /brand and /zh-CN/brand, with shared brand assets, section components, animated background rendering, and Playwright coverage for key page links and headings.

Changes

Brand Portal Page

Layer / File(s) Summary
Route, asset, color data and translations
apps/website/src/config/routes.ts, apps/website/src/data/brandAssets.ts, apps/website/src/data/affiliateBrandAssets.ts, apps/website/src/data/brandColors.ts, apps/website/src/i18n/translations.ts
Adds the brand route, shared brand asset URLs, the affiliate asset import update, the brandColors dataset, and brand.* translation keys for the new page.
Brand hero and logos sections
apps/website/src/templates/brand/BrandHeroSection.vue, apps/website/src/templates/brand/BrandLogosSection.vue
Adds the hero section with localized copy and download CTAs, and the logos section with a ZIP download link plus the asset grid.
Brand color and voice sections
apps/website/src/templates/brand/BrandColorSection.vue, apps/website/src/templates/brand/BrandVoiceSection.vue
Adds the color gallery and the voice guidance section, including translated labels, color specs, principles, and do/don't examples.
Trademark and questions sections
apps/website/src/templates/brand/BrandTrademarkSection.vue, apps/website/src/templates/brand/BrandQuestionsSection.vue
Adds the trademark guidance section and the questions section with localized text and contact links.
Background animation and page composition
apps/website/src/templates/brand/BrandBackground.vue, apps/website/src/pages/brand.astro, apps/website/src/pages/zh-CN/brand.astro
Adds the animated brand background canvas and composes the English and zh-CN brand pages with the brand sections inside BaseLayout.
Brand page smoke tests
apps/website/e2e/brand.spec.ts
Adds Playwright checks for the brand page headings, the logos download link and labels, and the hero guidelines link.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested reviewers: AustinMroz

🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
End-To-End Regression Coverage For Fixes ✅ Passed PASS: Changes are exclusively in apps/website, and the PR description already includes an added e2e brand.spec.ts test, so the browser_tests rule doesn’t apply.
Adr Compliance For Entity/Litegraph Changes ✅ Passed No changed files touch src/lib/litegraph, src/ecs, or graph-entity paths, so ADR 0003/0008 checks are not applicable.
Title check ✅ Passed The title clearly and concisely describes the main change: adding the brand portal page at /brand.
Description check ✅ Passed The description matches the template well, covering Summary, Changes, Review Focus, Screenshots, and testing details.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/website-brand-portal
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/website-brand-portal

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/website/e2e/brand.spec.ts`:
- Around line 5-8: The brand asset URL literals in brand.spec.ts are duplicated
from the source of truth, so replace the local constants with imports from
affiliateBrandAssets.ts. Update the test to use the exported BRAND_ASSETS_ZIP
and BRAND_GUIDELINES_PDF symbols directly, keeping the spec aligned with the
shared data module and preventing drift if the URLs change.

In `@apps/website/src/data/affiliateBrandAssets.ts`:
- Around line 10-11: The shared brand asset constants are in a file named for
affiliate-specific assets, but they are also used by the general brand page.
Move BRAND_ASSETS_ZIP and BRAND_GUIDELINES_PDF into a more appropriately named
shared brand assets module, then update the imports in BrandHeroSection.vue,
BrandLogosSection.vue, and any other consumers to reference the new location.
Keep affiliate-only assets separate so the module name matches its actual
responsibility.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a2edbf8b-f59e-4e49-ad18-848d519311ec

📥 Commits

Reviewing files that changed from the base of the PR and between 747f76d and eeef6b3.

📒 Files selected for processing (13)
  • apps/website/e2e/brand.spec.ts
  • apps/website/src/config/routes.ts
  • apps/website/src/data/affiliateBrandAssets.ts
  • apps/website/src/data/brandColors.ts
  • apps/website/src/i18n/translations.ts
  • apps/website/src/pages/brand.astro
  • apps/website/src/pages/zh-CN/brand.astro
  • apps/website/src/templates/brand/BrandColorSection.vue
  • apps/website/src/templates/brand/BrandHeroSection.vue
  • apps/website/src/templates/brand/BrandLogosSection.vue
  • apps/website/src/templates/brand/BrandQuestionsSection.vue
  • apps/website/src/templates/brand/BrandTrademarkSection.vue
  • apps/website/src/templates/brand/BrandVoiceSection.vue

Comment thread apps/website/e2e/brand.spec.ts Outdated
Comment thread apps/website/src/data/affiliateBrandAssets.ts Outdated
Move BRAND_ASSETS_ZIP and BRAND_GUIDELINES_PDF into a shared brandAssets module (out of affiliateBrandAssets) and import them in the e2e spec instead of duplicating literals. Baseline-align and resize the brand portal download-logos icon to match the design.

@coderabbitai coderabbitai Bot 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/website/src/templates/brand/BrandLogosSection.vue (1)

1-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Logo grid still borrows the affiliate-only data source.

affiliateBrandAssets (and its AffiliateBrandAsset type with a per-item download field) is now consumed by this general Brand Portal section too, even though only title/preview are used here — the download field per item goes unused since the section-level link uses BRAND_ASSETS_ZIP directly. This is the same cohesion smell previously flagged for the constants, just now surfacing on the shared array/type itself.

Consider moving the four logo entries (title/preview) into brandAssets.ts (or a new shared module) with a leaner type that doesn't carry the unused download field, keeping affiliateBrandAssets.ts focused on its own page's needs.

Also applies to: 34-56

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/website/src/templates/brand/BrandLogosSection.vue` around lines 1 - 12,
The BrandLogosSection component is still importing affiliate-only brand data, so
move the shared logo entries out of affiliateBrandAssets and into brandAssets.ts
or a new shared module with a leaner type that only includes title and preview.
Update BrandLogosSection to consume that shared source directly, keeping
affiliateBrandAssets and its per-item download field limited to the affiliate
page’s needs. Use the existing identifiers BrandLogosSection,
affiliateBrandAssets, and BRAND_ASSETS_ZIP to locate the affected wiring.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@apps/website/src/templates/brand/BrandLogosSection.vue`:
- Around line 1-12: The BrandLogosSection component is still importing
affiliate-only brand data, so move the shared logo entries out of
affiliateBrandAssets and into brandAssets.ts or a new shared module with a
leaner type that only includes title and preview. Update BrandLogosSection to
consume that shared source directly, keeping affiliateBrandAssets and its
per-item download field limited to the affiliate page’s needs. Use the existing
identifiers BrandLogosSection, affiliateBrandAssets, and BRAND_ASSETS_ZIP to
locate the affected wiring.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 195a9fdc-76a9-4e93-b227-1e46612243bf

📥 Commits

Reviewing files that changed from the base of the PR and between eeef6b3 and e7cadc1.

📒 Files selected for processing (5)
  • apps/website/e2e/brand.spec.ts
  • apps/website/src/data/affiliateBrandAssets.ts
  • apps/website/src/data/brandAssets.ts
  • apps/website/src/templates/brand/BrandHeroSection.vue
  • apps/website/src/templates/brand/BrandLogosSection.vue

Port the hero node field from the brand guidelines reference: 14 drifting yellow nodes with halo rings, linked by faint bezier curves, rendered on a canvas across the first viewport behind the content. Uses a VueUse rAF loop paused via IntersectionObserver when off screen, and honours reduced-motion by painting a single static frame.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/website/src/templates/brand/BrandBackground.vue`:
- Around line 20-21: The dpr value in BrandBackground.vue is only read once at
setup time, so it can become stale if the window moves between displays with
different pixel ratios. Update the logic around the dpr calculation to react to
devicePixelRatio changes during the component lifecycle, and make sure the
drawing code that uses dpr stays in sync by recalculating or re-running when the
ratio changes.
- Around line 32-37: The resize logic in BrandBackground.vue clears the canvas
by resetting width and height, but it never redraws the frame afterward, so the
canvas can stay blank when the RAF animation is paused. Update the resize()
function to always trigger a draw after resizing, and make sure this happens
regardless of whether the animation loop is running in the pause/resume flow
used by BrandBackground and its resize listener.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 56d24543-0bff-4695-8837-39b13c482a50

📥 Commits

Reviewing files that changed from the base of the PR and between e7cadc1 and 14e5109.

📒 Files selected for processing (3)
  • apps/website/src/pages/brand.astro
  • apps/website/src/pages/zh-CN/brand.astro
  • apps/website/src/templates/brand/BrandBackground.vue

Comment thread apps/website/src/templates/brand/BrandBackground.vue Outdated
Comment thread apps/website/src/templates/brand/BrandBackground.vue Outdated
resize() now recomputes dpr and redraws after resetting the canvas bitmap, so the node field stays visible after a window resize even while the RAF loop is paused (off screen or reduced-motion).
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 7, 2026
Add click-to-copy on all four swatch values, swap the Icon card to the ink square / yellow C (brand page only), route the contact links to the support site, match the stacked hero CTA widths on mobile, and remove the halo ring from the background nodes.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/website/src/templates/brand/BrandColorSection.vue`:
- Around line 58-70: The copy button in BrandColorSection uses a hardcoded
English aria-label and lacks screen-reader confirmation after copy. Update the
button’s accessible label to use the existing translations.ts t() helper with
locale instead of embedding “Copy”, and add an aria-live polite, visually hidden
message near the button that announces success when copy completes. Use the
existing copied/copiedId state and copyValue handler to wire the live feedback
without changing the visible UI.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 51556d3c-704a-45a5-9b72-6eca21d9cf53

📥 Commits

Reviewing files that changed from the base of the PR and between 8771ca1 and 7744bc6.

📒 Files selected for processing (9)
  • apps/website/src/i18n/translations.ts
  • apps/website/src/pages/brand.astro
  • apps/website/src/pages/zh-CN/brand.astro
  • apps/website/src/templates/brand/BrandBackground.vue
  • apps/website/src/templates/brand/BrandColorSection.vue
  • apps/website/src/templates/brand/BrandHeroSection.vue
  • apps/website/src/templates/brand/BrandLogosSection.vue
  • apps/website/src/templates/brand/BrandQuestionsSection.vue
  • apps/website/src/templates/brand/BrandTrademarkSection.vue

Comment thread apps/website/src/templates/brand/BrandColorSection.vue Outdated
Point the hero 'View brand guidelines' CTA at the Google Drive copy (shared to Comfy Org only) opened in a new tab, instead of the public media-bucket PDF, so Google enforces the comfy.org sign-in.
Use the ink app icon (comfyicon.svg) for the Icon card. Make swatches copyable: clicking the card copies the hex, clicking a value copies that value, with a 'Copied {value}' overlay that replaces the card content until it reverts.
Localize the copy aria-label and the 'Copied' overlay text via t(), and announce the copied value through a persistent visually-hidden aria-live region for screen readers.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant