Skip to content

Add new logo to hero section#472

Merged
yamcodes merged 27 commits intomainfrom
471-update-www-hero-section-to-use-new-logo
Dec 1, 2025
Merged

Add new logo to hero section#472
yamcodes merged 27 commits intomainfrom
471-update-www-hero-section-to-use-new-logo

Conversation

@yamcodes
Copy link
Owner

@yamcodes yamcodes commented Nov 29, 2025

Closes #471

Summary by CodeRabbit

  • New Features

    • Redesigned hero with a responsive two-column layout and integrated media section.
    • Theme-aware hero video that auto-plays and switches between light and dark variants, plus a dedicated demo area.
  • Style

    • Improved dark-mode background and gradient overlay handling.
    • Buttons now have smoother transitions and richer hover shadows.
  • Tests

    • Added end-to-end theme/hydration tests and tightened responsive test selectors.
    • Removed an older unit test for the video demo.
  • Documentation

    • Added design, proposal, spec, and task docs for the hero video update.

✏️ Tip: You can customize this high-level summary in your review settings.

@yamcodes yamcodes linked an issue Nov 29, 2025 that may be closed by this pull request
@changeset-bot
Copy link

changeset-bot bot commented Nov 29, 2025

⚠️ No Changeset found

Latest commit: 359f796

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 29, 2025

Walkthrough

Adds a theme-aware HeroVideo component and reworks the homepage hero into a responsive two-column layout with gradient overlay, updates dark-mode styles, adds video metadata assets, introduces Playwright theme/hydration tests, removes a VideoDemo unit test, and adds the next-themes dependency.

Changes

Cohort / File(s) Summary
Homepage Restructuring
apps/www/app/(home)/page.tsx
Replaced the prior hero with a responsive two-column layout, SVG gradient overlay, integrated HeroVideo on the right, grouped action buttons, and moved/added a constrained VideoDemo section.
New Hero Video Component
apps/www/components/hero-video.tsx
Added a client-only React component that uses next-themes to detect theme, gates mounting to avoid hydration issues, and renders two overlaid video elements (light/dark) with opacity switching.
Theme & Styling Updates
apps/www/app/globals.css, apps/www/app/styles/theme/dark.css
Appended dark-mode CSS to enforce background color and remove background-image; changed dark theme background color to #081021 and reformatted comments.
Video Assets & Metadata
apps/www/videos/3d-dark.mp4.json, apps/www/videos/3d-light.mp4.json
Added Mux metadata/manifest files with playback URLs, poster images, sizes, timestamps, and blurDataURL placeholders for both assets.
Component Styling
apps/www/components/page/video-demo.tsx
Updated VideoDemo button shadow to transition-enabled Tailwind classes with hover and dark-mode shadow variants.
Tests Removed
apps/www/components/page/video-demo.test.tsx
Deleted the VideoDemo component unit test file and its mocks/assertions.
Playwright Tests
tooling/playwright-www/tests/responsive.test.ts, tooling/playwright-www/tests/theme-switching.test.ts
Scoped media element lookup to the interactive demo button in responsive test; added theme-switching and hydration tests to assert dark-mode application and absence of hydration errors.
Dependency
apps/www/package.json
Added next-themes dependency (0.4.6).
Documentation / Specs
openspec/changes/update-hero-videos/...
Added design doc, proposal, spec, and task checklist describing the hero-video implementation, theme handling, assets, and rollout tasks.
sequenceDiagram
    actor Browser
    participant HomePage as "Home Page"
    participant HeroVideo as "HeroVideo Component"
    participant Theme as "ThemeProvider (next-themes)"
    participant Assets as "Video Assets (Mux)"

    Browser->>HomePage: Navigate to homepage
    HomePage->>HeroVideo: Mount component
    HeroVideo->>Theme: Read current theme
    Theme-->>HeroVideo: Return light/dark
    HeroVideo->>Assets: Select video source (3d-light / 3d-dark)
    HeroVideo-->>Browser: Render video(s) (autoplay, loop, muted) with theme-based opacity
    Browser->>Theme: User toggles theme
    Theme-->>HeroVideo: New theme value
    HeroVideo->>HeroVideo: Transition opacity to switch visible video
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Check HeroVideo mounting/gating for SSR/hydration safety (mounted logic and client-only directive).
  • Verify theme switching correctness (opacity transitions) and that both video elements are accessible/performant.
  • Confirm z-index/gradient overlay interactions in page.tsx and globals.css to avoid visual clipping.
  • Review added Playwright tests for flakiness and correct element scoping.

Possibly related PRs

Poem

🐰 I hop to the hero with a playful spin,
Light and dark frames loop, a soft ribboned din.
Buttons gather close, the demo takes the stage,
A rabbit's quick clap — welcome to the page! 🎬✨

Pre-merge checks and finishing touches

❌ Failed checks (4 warnings)
Check name Status Explanation Resolution
Title check ⚠️ Warning The PR title states 'Add new logo to hero section', but the changes show theme-aware video implementation with HeroVideo component, not logo addition. Update the PR title to accurately reflect the primary change, such as 'Implement theme-aware hero video component' or 'Add hero video with theme switching'.
Linked Issues check ⚠️ Warning Issue #471 requests adding a hero effect showcasing the new logo with reference to formia.so for inspiration. The implementation adds a theme-aware video component but no logo is integrated into the hero section. Either integrate the new logo into the hero section as specified in #471, or clarify if the video serves as the intended 'hero effect' and update requirements accordingly.
Out of Scope Changes check ⚠️ Warning The PR introduces video-related changes (HeroVideo component, video files, theme switching tests) that go beyond the stated objective of adding a new logo to the hero section. Either align changes with the logo-focused objective in #471, or update the PR title and description to reflect the actual video implementation scope.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 471-update-www-hero-section-to-use-new-logo

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e5b846f and 359f796.

📒 Files selected for processing (1)
  • apps/www/components/hero-video.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/www/components/hero-video.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: test-e2e (e2e)
  • GitHub Check: test-e2e (a11y)
  • GitHub Check: test-build (lts/*)

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 and usage tips.

@vercel
Copy link

vercel bot commented Nov 29, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
arkenv Ready Ready Preview Comment Dec 1, 2025 8:25pm

@github-actions github-actions bot added the www Improvements or additions to arkenv.js.org label Nov 29, 2025
@github-actions github-actions bot added docs Improvements or additions to documentation tests This issue or PR is about adding, removing or changing tests labels Dec 1, 2025
@yamcodes yamcodes marked this pull request as ready for review December 1, 2025 19:39
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (1)
apps/www/package.json (1)

15-40: Test next-themes@0.4.6 with React 19.2.0 before production

next-themes v0.4.6 supports the Next.js app router, but React 19 compatibility is not explicitly verified. GitHub issues report compatibility problems with React 19 RC. Add to your testing checklist: verify hydration behavior, client-side script execution, and theme switching with React 19.2.0 in the app router environment. If issues occur, consider forking/patching or using an alternative theme solution.

🧹 Nitpick comments (4)
openspec/changes/update-hero-videos/tasks.md (1)

1-5: Number the checklist items per openspec convention

Tasks are correctly using - [ ] but they’re not numbered in the text. To align with openspec/changes/*/tasks.md guidance, consider prefixing each item with an explicit number (e.g. - [ ] 1. Replace …, - [ ] 2. Implement …) so the implementation order is clear.
Based on learnings, this keeps tasks.md consistent with the repo’s checklist style.

apps/www/components/page/video-demo.tsx (1)

31-37: Updated glow/hover treatment is fine; keep class string maintainable

The new class list adds smooth transitions and more nuanced light/dark hover shadows while preserving structure (rounded, bordered, full‑width button). Functionally this is solid for the demo. If the styles evolve further, consider extracting these classes to a shared constant or using clsx/variants to keep the JSX line manageable.

openspec/changes/update-hero-videos/specs/hero-video/spec.md (1)

1-33: Tighten normative language in the requirement statement

The structure under ## ADDED Requirements with multiple #### Scenario: blocks looks good and satisfies the scenario requirement. Minor spec nit: Line 4 mixes “must” and “should”:

“must display a looping, autoplaying video … This video should be theme-aware and responsive.”

If theme awareness and responsiveness are normative (not optional), consider changing the second sentence to “This video must be theme-aware and responsive.” to align with the SHALL/MUST guidance for requirements in openspec/**/spec.md.
Based on learnings, this keeps requirement wording strictly normative.

openspec/changes/update-hero-videos/design.md (1)

1-11: Design doc scope matches change; no blocking gaps

This is an appropriate use of a design doc for a cross-cutting visual change with a new dependency and theme behavior. The architecture and considerations match the implemented HeroVideo and homepage layout; nothing here seems misleading or incomplete for this scope. If you iterate further (fallback behavior, reduced motion, loading strategy), consider adding a short “Accessibility & perf trade‑offs” section, but not required for this PR.

Based on learnings, this aligns with when we create design.md.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 437782e and 15af5b6.

⛔ Files ignored due to path filters (3)
  • apps/www/public/assets/3d-dark.mp4 is excluded by !**/*.mp4
  • apps/www/public/assets/3d-light.mp4 is excluded by !**/*.mp4
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (14)
  • apps/www/app/(home)/page.tsx (2 hunks)
  • apps/www/app/globals.css (1 hunks)
  • apps/www/app/styles/theme/dark.css (1 hunks)
  • apps/www/components/hero-video.tsx (1 hunks)
  • apps/www/components/page/video-demo.test.tsx (0 hunks)
  • apps/www/components/page/video-demo.tsx (1 hunks)
  • apps/www/package.json (1 hunks)
  • apps/www/videos/3d-dark.mp4.json (1 hunks)
  • apps/www/videos/3d-light.mp4.json (1 hunks)
  • openspec/changes/update-hero-videos/design.md (1 hunks)
  • openspec/changes/update-hero-videos/proposal.md (1 hunks)
  • openspec/changes/update-hero-videos/specs/hero-video/spec.md (1 hunks)
  • openspec/changes/update-hero-videos/tasks.md (1 hunks)
  • tooling/playwright-www/tests/responsive.test.ts (2 hunks)
💤 Files with no reviewable changes (1)
  • apps/www/components/page/video-demo.test.tsx
🧰 Additional context used
📓 Path-based instructions (13)
**/*.{ts,tsx,json,md}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Use Biome for linting and formatting instead of ESLint and Prettier

Files:

  • openspec/changes/update-hero-videos/design.md
  • apps/www/videos/3d-dark.mp4.json
  • apps/www/videos/3d-light.mp4.json
  • apps/www/app/(home)/page.tsx
  • apps/www/package.json
  • openspec/changes/update-hero-videos/proposal.md
  • apps/www/components/page/video-demo.tsx
  • openspec/changes/update-hero-videos/tasks.md
  • tooling/playwright-www/tests/responsive.test.ts
  • openspec/changes/update-hero-videos/specs/hero-video/spec.md
  • apps/www/components/hero-video.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

**/*.{ts,tsx}: Prefer type over interface for type definitions in TypeScript
Use TypeScript 5.1+ features when appropriate
Leverage const type parameters for better inference in TypeScript
Use JSDoc comments for public APIs
Use tabs for indentation (configured in Biome)
Use double quotes for strings (configured in Biome)
Organize imports automatically (Biome handles this)
Avoid explicit types when TypeScript can infer them (noInferrableTypes error)
Use as const where appropriate for immutable values (useAsConstAssertion error)
Don't reassign function parameters (noParameterAssign error)
Place default parameters last in function signatures (useDefaultParameterLast error)
Always initialize enum values (useEnumInitializers error)
Declare one variable per statement (useSingleVarDeclarator error)
Avoid unnecessary template literals (noUnusedTemplateLiteral error)
Prefer Number.parseInt over global parseInt (useNumberNamespace error)
Use kebab-case for TypeScript filenames (e.g., create-env.ts)
Use camelCase for function names (e.g., createEnv)
Use PascalCase for type names (e.g., ArkEnvError)
Use UPPER_SNAKE_CASE for environment variables and constants
Include examples in JSDoc comments when helpful for public APIs
Document complex type logic with JSDoc comments
Use ArkEnvError for environment variable validation errors
Provide clear, actionable error messages that include the variable name and expected type

**/*.{ts,tsx}: Use createEnv(schema) as the main function for validated environment objects, available as the default export
Use built-in validators (host, port, url, email) from src/types.ts when available instead of custom validation
Use ArkEnvError for environment variable errors, not generic errors
Environment schema definitions should use built-in validators, ArkType string literals, and support default values in the schema pattern
Use logical grouping for related environment variables in schemas
Use descriptive env...

Files:

  • apps/www/app/(home)/page.tsx
  • apps/www/components/page/video-demo.tsx
  • tooling/playwright-www/tests/responsive.test.ts
  • apps/www/components/hero-video.tsx
**/*.tsx

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

Use self-closing JSX elements (useSelfClosingElements error)

Files:

  • apps/www/app/(home)/page.tsx
  • apps/www/components/page/video-demo.tsx
  • apps/www/components/hero-video.tsx
apps/www/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (apps/www/.cursor/rules/posthog-integration.mdc)

apps/www/**/*.{ts,tsx,js,jsx}: If using TypeScript, use an enum to store feature flag names. If using JavaScript, store feature flag names as strings to an object declared as a constant to simulate an enum. Use UPPERCASE_WITH_UNDERSCORE naming convention for enum/const object members.
If a custom property for a person or event is referenced in two or more files or two or more callsites in the same file, use an enum or const object with UPPERCASE_WITH_UNDERSCORE naming convention, similar to feature flags.

Files:

  • apps/www/app/(home)/page.tsx
  • apps/www/components/page/video-demo.tsx
  • apps/www/components/hero-video.tsx
apps/*/package.json

📄 CodeRabbit inference engine (.cursor/rules/monorepo.mdc)

Applications in apps/ directory are not published to npm and may depend on workspace packages

Files:

  • apps/www/package.json
**/package.json

📄 CodeRabbit inference engine (.cursor/rules/monorepo.mdc)

Use workspace:* protocol for workspace dependencies between packages

Files:

  • apps/www/package.json
{packages,apps,tooling}/**/package.json

📄 CodeRabbit inference engine (.cursor/rules/pnpm.mdc)

When referencing workspace packages in dependencies, use the workspace:* protocol instead of version numbers

Files:

  • apps/www/package.json
openspec/changes/*/proposal.md

📄 CodeRabbit inference engine (openspec/AGENTS.md)

Create proposal.md with sections: Why, What Changes (with BREAKING markers), and Impact

Files:

  • openspec/changes/update-hero-videos/proposal.md
openspec/changes/*/tasks.md

📄 CodeRabbit inference engine (openspec/AGENTS.md)

Create tasks.md with numbered implementation checklist items as checkboxes (- [ ] format)

Files:

  • openspec/changes/update-hero-videos/tasks.md
**/*.test.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

Co-locate tests with components: Component.tsx next to Component.test.tsx

**/*.test.{ts,tsx}: Test individual functions, components, and hooks in isolation with mocked dependencies in unit tests
Keep unit tests fast with execution under 100ms per test
Co-locate unit tests with source files using naming convention: source.tssource.test.ts
Focus component tests on public API, user behavior, state transitions, and accessibility rather than styling or implementation details
Query component tests by role, name, label, and text using accessibility-first selectors
Use Vitest as the test framework for unit and integration tests
Use Testing Library with user-event for real user simulation in component tests

**/*.test.{ts,tsx}: Test individual functions, components, and hooks in isolation with mocked dependencies using the *.test.ts or *.test.tsx suffix
Mock process.env in tests for different scenarios and save/restore original env in beforeEach/afterEach hooks
Use Vitest's describe/it structure in test files
Test edge cases including invalid and missing environment variable values
Use Vitest for testing framework

Files:

  • tooling/playwright-www/tests/responsive.test.ts
tooling/playwright-www/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

End-to-end tests should be located in tooling/playwright-www/ and test complete user workflows in real browsers with no mocking

Files:

  • tooling/playwright-www/tests/responsive.test.ts
openspec/changes/*/specs/**/spec.md

📄 CodeRabbit inference engine (openspec/AGENTS.md)

openspec/changes/*/specs/**/spec.md: Use ## ADDED|MODIFIED|REMOVED|RENAMED Requirements as delta headers in spec.md files under changes
Ensure change proposals contain delta specs for each affected capability under changes/[change-id]/specs/[capability]/spec.md

Files:

  • openspec/changes/update-hero-videos/specs/hero-video/spec.md
openspec/**/spec.md

📄 CodeRabbit inference engine (openspec/AGENTS.md)

openspec/**/spec.md: Include at least one scenario per requirement using #### Scenario: header format with WHEN and THEN bullet points
Use SHALL/MUST for normative requirements rather than should/may unless intentionally non-normative

Files:

  • openspec/changes/update-hero-videos/specs/hero-video/spec.md
🧠 Learnings (10)
📚 Learning: 2025-11-24T16:05:35.714Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: openspec/AGENTS.md:0-0
Timestamp: 2025-11-24T16:05:35.714Z
Learning: Create design.md only when needed: for cross-cutting changes, new dependencies, significant data model changes, security/performance complexity, or ambiguity

Applied to files:

  • openspec/changes/update-hero-videos/design.md
📚 Learning: 2025-11-29T08:00:08.031Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/pnpm.mdc:0-0
Timestamp: 2025-11-29T08:00:08.031Z
Learning: Applies to package.json : Configure only built dependencies (native modules) in `pnpm.onlyBuiltDependencies`, including: biomejs/biome, sentry/cli, swc/core, tailwindcss/oxide, vercel/speed-insights, esbuild, and sharp

Applied to files:

  • apps/www/package.json
📚 Learning: 2025-11-24T16:05:35.714Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: openspec/AGENTS.md:0-0
Timestamp: 2025-11-24T16:05:35.714Z
Learning: Applies to openspec/changes/*/tasks.md : Create tasks.md with numbered implementation checklist items as checkboxes (- [ ] format)

Applied to files:

  • openspec/changes/update-hero-videos/tasks.md
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to tooling/playwright-www/**/*.spec.ts : Test complete user workflows and validate real browser behavior across Chromium, Firefox, and WebKit in end-to-end tests

Applied to files:

  • tooling/playwright-www/tests/responsive.test.ts
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to tooling/playwright-www/**/*.spec.ts : Use Playwright for end-to-end tests

Applied to files:

  • tooling/playwright-www/tests/responsive.test.ts
📚 Learning: 2025-11-29T22:11:39.920Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-29T22:11:39.920Z
Learning: Applies to tooling/playwright-www/**/*.{ts,tsx} : End-to-end tests should be located in `tooling/playwright-www/` and test complete user workflows in real browsers with no mocking

Applied to files:

  • tooling/playwright-www/tests/responsive.test.ts
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to **/*.test.{ts,tsx} : Query component tests by role, name, label, and text using accessibility-first selectors

Applied to files:

  • tooling/playwright-www/tests/responsive.test.ts
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to **/*.test.{ts,tsx} : Focus component tests on public API, user behavior, state transitions, and accessibility rather than styling or implementation details

Applied to files:

  • tooling/playwright-www/tests/responsive.test.ts
📚 Learning: 2025-11-24T16:05:35.714Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: openspec/AGENTS.md:0-0
Timestamp: 2025-11-24T16:05:35.714Z
Learning: Applies to openspec/**/spec.md : Include at least one scenario per requirement using #### Scenario: header format with **WHEN** and **THEN** bullet points

Applied to files:

  • openspec/changes/update-hero-videos/specs/hero-video/spec.md
📚 Learning: 2025-11-24T16:05:35.714Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: openspec/AGENTS.md:0-0
Timestamp: 2025-11-24T16:05:35.714Z
Learning: For MODIFIED requirements, copy the entire existing requirement block and paste under ## MODIFIED Requirements, then edit to reflect new behavior

Applied to files:

  • openspec/changes/update-hero-videos/specs/hero-video/spec.md
🧬 Code graph analysis (6)
openspec/changes/update-hero-videos/design.md (1)
apps/www/components/page/video-demo.test.tsx (8)
  • default (48-84)
  • props (49-83)
  • render (113-130)
  • render (291-313)
  • render (151-171)
  • default (16-45)
  • render (262-272)
  • render (132-140)
apps/www/videos/3d-light.mp4.json (1)
apps/www/components/page/video-demo.test.tsx (1)
  • props (49-83)
openspec/changes/update-hero-videos/proposal.md (1)
apps/www/components/page/video-demo.test.tsx (8)
  • default (48-84)
  • render (113-130)
  • props (49-83)
  • render (291-313)
  • render (151-171)
  • default (16-45)
  • render (239-250)
  • render (142-149)
apps/www/components/page/video-demo.tsx (1)
apps/www/components/ui/button.tsx (1)
  • ButtonProps (37-41)
openspec/changes/update-hero-videos/tasks.md (1)
apps/www/components/page/video-demo.test.tsx (2)
  • default (48-84)
  • render (151-171)
tooling/playwright-www/tests/responsive.test.ts (1)
apps/www/components/page/video-demo.test.tsx (8)
  • render (252-260)
  • render (113-130)
  • render (173-181)
  • render (239-250)
  • render (204-217)
  • render (105-111)
  • render (336-342)
  • render (291-313)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: test-e2e (e2e)
  • GitHub Check: test-e2e (a11y)
  • GitHub Check: test-build (latest)
🔇 Additional comments (6)
apps/www/videos/3d-light.mp4.json (1)

1-23: Hero light video metadata looks consistent

Mux metadata (status, providerMetadata, HLS source, poster, blurDataURL) and originalFilePath all look consistent for videos/3d-light.mp4. No issues from a code/config perspective.

apps/www/videos/3d-dark.mp4.json (1)

1-23: Hero dark video metadata looks consistent

Structure and fields mirror the light variant and reference a distinct Mux asset for videos/3d-dark.mp4. This is appropriate for theme-aware switching.

apps/www/app/globals.css (1)

25-29: Global dark-mode background override looks good; validate other pages

Forcing .dark body, .dark html to use background-color: var(--background) and background-image: none !important should resolve the gradient/hero blending issue and give the video a clean canvas. Just make sure no other dark-mode pages relied on a document‑level background image; if they did, those should move to more local containers.

apps/www/app/styles/theme/dark.css (1)

2-15: Dark theme token tweaks look consistent

The updated --background and standalone comments keep the palette coherent and preserve the documented WCAG contrast for --muted-foreground. No issues from a theming standpoint.

tooling/playwright-www/tests/responsive.test.ts (1)

61-63: Scoped media locators improve test robustness

Scoping the media locator to the interactive demo button and targeting both video and img[alt*='Demo' i] is a nice improvement: it avoids accidentally matching unrelated media (like the new hero video) and still covers the fallback image path. Assertions below remain valid and focused on responsiveness.

Also applies to: 167-174

apps/www/app/(home)/page.tsx (1)

68-103: Hero layout + VideoDemo placement look good

The two-column hero with text left and HeroVideo right, plus the constrained VideoDemo section below, reads cleanly and keeps the primary actions (Sail / Star buttons) prominent. Hiding HeroVideo below md while keeping VideoDemo full-width should work well across breakpoints.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
apps/www/app/(home)/page.tsx (1)

18-68: Decorative gradient SVG is now correctly hidden from assistive tech

Marking the top gradient SVG with aria-hidden="true", role="presentation", and focusable="false", and dropping the <title>, cleanly treats it as decorative and removes unnecessary screen reader noise while preserving the visual effect.

🧹 Nitpick comments (2)
tooling/playwright-www/tests/theme-switching.test.ts (1)

4-64: Theme switching test bypasses real UI and doesn’t actually switch back to light

Right now this test:

  • Forces dark mode via page.evaluate and direct classList/colorScheme tweaks.
  • Never toggles back to light.
  • Contains a lot of exploratory comments about “not knowing” the UI.

That makes the test name a bit misleading and means you’re not exercising the real theme toggle workflow.

I’d recommend:

  • Once the theme toggle UI is settled, drive it via an accessible selector (e.g. a labeled button) instead of mutating documentElement directly.
  • Either extend the test to switch dark → light (and assert both states) or rename it to reflect that it’s only asserting dark-mode application + no hydration errors.
  • Trim the speculative comments so the test reads as intentional rather than exploratory.

Based on learnings, E2E tests here should cover real user workflows and observable behavior rather than internal DOM manipulation.

apps/www/app/(home)/page.tsx (1)

70-105: Hero layout and CTA grouping look solid; consider mobile hero video + decorative video semantics

The new two-column hero reads well: heading hierarchy is intact, copy + CTAs are prominent, and HeroVideo is visually separated on larger screens.

Two small, optional follow-ups:

  • HeroVideo is entirely hidden on small screens (hidden md:flex). If showcasing the new 3D logo is important on mobile too, consider a simplified mobile placement (e.g. stacked below the text) rather than hiding it completely.
  • Since the hero video is primarily visual flair, it might be worth marking the video(s) inside HeroVideo as decorative (e.g. aria-hidden, role="presentation", or appropriate labeling) so screen readers don’t announce an unlabeled media element.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 15af5b6 and 8b185e1.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (3)
  • apps/www/app/(home)/page.tsx (2 hunks)
  • apps/www/package.json (1 hunks)
  • tooling/playwright-www/tests/theme-switching.test.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (9)
apps/*/package.json

📄 CodeRabbit inference engine (.cursor/rules/monorepo.mdc)

Applications in apps/ directory are not published to npm and may depend on workspace packages

Files:

  • apps/www/package.json
**/package.json

📄 CodeRabbit inference engine (.cursor/rules/monorepo.mdc)

Use workspace:* protocol for workspace dependencies between packages

Files:

  • apps/www/package.json
{packages,apps,tooling}/**/package.json

📄 CodeRabbit inference engine (.cursor/rules/pnpm.mdc)

When referencing workspace packages in dependencies, use the workspace:* protocol instead of version numbers

Files:

  • apps/www/package.json
**/*.{ts,tsx,json,md}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Use Biome for linting and formatting instead of ESLint and Prettier

Files:

  • apps/www/package.json
  • tooling/playwright-www/tests/theme-switching.test.ts
  • apps/www/app/(home)/page.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

**/*.{ts,tsx}: Prefer type over interface for type definitions in TypeScript
Use TypeScript 5.1+ features when appropriate
Leverage const type parameters for better inference in TypeScript
Use JSDoc comments for public APIs
Use tabs for indentation (configured in Biome)
Use double quotes for strings (configured in Biome)
Organize imports automatically (Biome handles this)
Avoid explicit types when TypeScript can infer them (noInferrableTypes error)
Use as const where appropriate for immutable values (useAsConstAssertion error)
Don't reassign function parameters (noParameterAssign error)
Place default parameters last in function signatures (useDefaultParameterLast error)
Always initialize enum values (useEnumInitializers error)
Declare one variable per statement (useSingleVarDeclarator error)
Avoid unnecessary template literals (noUnusedTemplateLiteral error)
Prefer Number.parseInt over global parseInt (useNumberNamespace error)
Use kebab-case for TypeScript filenames (e.g., create-env.ts)
Use camelCase for function names (e.g., createEnv)
Use PascalCase for type names (e.g., ArkEnvError)
Use UPPER_SNAKE_CASE for environment variables and constants
Include examples in JSDoc comments when helpful for public APIs
Document complex type logic with JSDoc comments
Use ArkEnvError for environment variable validation errors
Provide clear, actionable error messages that include the variable name and expected type

**/*.{ts,tsx}: Use createEnv(schema) as the main function for validated environment objects, available as the default export
Use built-in validators (host, port, url, email) from src/types.ts when available instead of custom validation
Use ArkEnvError for environment variable errors, not generic errors
Environment schema definitions should use built-in validators, ArkType string literals, and support default values in the schema pattern
Use logical grouping for related environment variables in schemas
Use descriptive env...

Files:

  • tooling/playwright-www/tests/theme-switching.test.ts
  • apps/www/app/(home)/page.tsx
**/*.test.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

Co-locate tests with components: Component.tsx next to Component.test.tsx

**/*.test.{ts,tsx}: Test individual functions, components, and hooks in isolation with mocked dependencies in unit tests
Keep unit tests fast with execution under 100ms per test
Co-locate unit tests with source files using naming convention: source.tssource.test.ts
Focus component tests on public API, user behavior, state transitions, and accessibility rather than styling or implementation details
Query component tests by role, name, label, and text using accessibility-first selectors
Use Vitest as the test framework for unit and integration tests
Use Testing Library with user-event for real user simulation in component tests

**/*.test.{ts,tsx}: Test individual functions, components, and hooks in isolation with mocked dependencies using the *.test.ts or *.test.tsx suffix
Mock process.env in tests for different scenarios and save/restore original env in beforeEach/afterEach hooks
Use Vitest's describe/it structure in test files
Test edge cases including invalid and missing environment variable values
Use Vitest for testing framework

Files:

  • tooling/playwright-www/tests/theme-switching.test.ts
tooling/playwright-www/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

End-to-end tests should be located in tooling/playwright-www/ and test complete user workflows in real browsers with no mocking

Files:

  • tooling/playwright-www/tests/theme-switching.test.ts
**/*.tsx

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

Use self-closing JSX elements (useSelfClosingElements error)

Files:

  • apps/www/app/(home)/page.tsx
apps/www/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (apps/www/.cursor/rules/posthog-integration.mdc)

apps/www/**/*.{ts,tsx,js,jsx}: If using TypeScript, use an enum to store feature flag names. If using JavaScript, store feature flag names as strings to an object declared as a constant to simulate an enum. Use UPPERCASE_WITH_UNDERSCORE naming convention for enum/const object members.
If a custom property for a person or event is referenced in two or more files or two or more callsites in the same file, use an enum or const object with UPPERCASE_WITH_UNDERSCORE naming convention, similar to feature flags.

Files:

  • apps/www/app/(home)/page.tsx
🧠 Learnings (8)
📚 Learning: 2025-11-29T08:00:08.031Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/pnpm.mdc:0-0
Timestamp: 2025-11-29T08:00:08.031Z
Learning: Applies to package.json : Configure only built dependencies (native modules) in `pnpm.onlyBuiltDependencies`, including: biomejs/biome, sentry/cli, swc/core, tailwindcss/oxide, vercel/speed-insights, esbuild, and sharp

Applied to files:

  • apps/www/package.json
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to tooling/playwright-www/**/*.spec.ts : Test complete user workflows and validate real browser behavior across Chromium, Firefox, and WebKit in end-to-end tests

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to tooling/playwright-www/**/*.spec.ts : Use Playwright for end-to-end tests

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
📚 Learning: 2025-11-29T22:11:39.920Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-29T22:11:39.920Z
Learning: Applies to tooling/playwright-www/**/*.{ts,tsx} : End-to-end tests should be located in `tooling/playwright-www/` and test complete user workflows in real browsers with no mocking

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to **/*.test.{ts,tsx} : Focus component tests on public API, user behavior, state transitions, and accessibility rather than styling or implementation details

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
📚 Learning: 2025-11-29T22:11:39.920Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-29T22:11:39.920Z
Learning: Applies to **/*.test.{ts,tsx} : Test edge cases including invalid and missing environment variable values

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
📚 Learning: 2025-11-24T16:04:36.939Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: .cursor/rules/test-patterns.mdc:0-0
Timestamp: 2025-11-24T16:04:36.939Z
Learning: Applies to **/*.integration.test.{ts,tsx} : Test how multiple units (components, hooks, functions) work together without mocking their interactions in integration tests

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
📚 Learning: 2025-11-29T08:57:24.044Z
Learnt from: CR
Repo: yamcodes/arkenv PR: 0
File: examples/with-bun-react/.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-11-29T08:57:24.044Z
Learning: Applies to examples/with-bun-react/**/*.test.{ts,tsx,js,jsx} : Use test syntax from `bun:test` with `test` and `expect` functions

Applied to files:

  • tooling/playwright-www/tests/theme-switching.test.ts
🧬 Code graph analysis (1)
apps/www/app/(home)/page.tsx (4)
apps/www/components/page/sail-button.tsx (1)
  • SailButton (8-69)
apps/www/components/page/star-us-button.tsx (1)
  • StarUsButton (68-221)
apps/www/components/hero-video.tsx (1)
  • HeroVideo (6-42)
apps/www/components/page/video-demo.tsx (1)
  • VideoDemo (15-62)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: test-e2e (e2e)
  • GitHub Check: test-e2e (a11y)
  • GitHub Check: test-build (latest)
🔇 Additional comments (2)
apps/www/package.json (1)

38-38: next-themes dependency addition looks appropriate for theme-aware hero/video

Pinning next-themes here aligns with the new theme-aware HeroVideo and theme tests and keeps builds deterministic. Just double-check the version against your Next/React stack and upstream docs when you upgrade frameworks in the future.

tooling/playwright-www/tests/theme-switching.test.ts (1)

66-86: Hydration-mismatch console check is well-scoped

Attaching the console listener before navigation and then filtering for known hydration-mismatch signatures gives you a clear signal if SSR/CSR diverge, without overfitting to a single exact error string. This is a solid, low-noise E2E safeguard around the new theme/video setup.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8b185e1 and e5b846f.

📒 Files selected for processing (2)
  • apps/www/components/hero-video.tsx (1 hunks)
  • openspec/changes/update-hero-videos/proposal.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • openspec/changes/update-hero-videos/proposal.md
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

**/*.{ts,tsx}: Prefer type over interface for type definitions in TypeScript
Use TypeScript 5.1+ features when appropriate
Leverage const type parameters for better inference in TypeScript
Use JSDoc comments for public APIs
Use tabs for indentation (configured in Biome)
Use double quotes for strings (configured in Biome)
Organize imports automatically (Biome handles this)
Avoid explicit types when TypeScript can infer them (noInferrableTypes error)
Use as const where appropriate for immutable values (useAsConstAssertion error)
Don't reassign function parameters (noParameterAssign error)
Place default parameters last in function signatures (useDefaultParameterLast error)
Always initialize enum values (useEnumInitializers error)
Declare one variable per statement (useSingleVarDeclarator error)
Avoid unnecessary template literals (noUnusedTemplateLiteral error)
Prefer Number.parseInt over global parseInt (useNumberNamespace error)
Use kebab-case for TypeScript filenames (e.g., create-env.ts)
Use camelCase for function names (e.g., createEnv)
Use PascalCase for type names (e.g., ArkEnvError)
Use UPPER_SNAKE_CASE for environment variables and constants
Include examples in JSDoc comments when helpful for public APIs
Document complex type logic with JSDoc comments
Use ArkEnvError for environment variable validation errors
Provide clear, actionable error messages that include the variable name and expected type

**/*.{ts,tsx}: Use createEnv(schema) as the main function for validated environment objects, available as the default export
Use built-in validators (host, port, url, email) from src/types.ts when available instead of custom validation
Use ArkEnvError for environment variable errors, not generic errors
Environment schema definitions should use built-in validators, ArkType string literals, and support default values in the schema pattern
Use logical grouping for related environment variables in schemas
Use descriptive env...

Files:

  • apps/www/components/hero-video.tsx
**/*.tsx

📄 CodeRabbit inference engine (.cursor/rules/coding-guidelines.mdc)

Use self-closing JSX elements (useSelfClosingElements error)

Files:

  • apps/www/components/hero-video.tsx
apps/www/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (apps/www/.cursor/rules/posthog-integration.mdc)

apps/www/**/*.{ts,tsx,js,jsx}: If using TypeScript, use an enum to store feature flag names. If using JavaScript, store feature flag names as strings to an object declared as a constant to simulate an enum. Use UPPERCASE_WITH_UNDERSCORE naming convention for enum/const object members.
If a custom property for a person or event is referenced in two or more files or two or more callsites in the same file, use an enum or const object with UPPERCASE_WITH_UNDERSCORE naming convention, similar to feature flags.

Files:

  • apps/www/components/hero-video.tsx
**/*.{ts,tsx,json,md}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Use Biome for linting and formatting instead of ESLint and Prettier

Files:

  • apps/www/components/hero-video.tsx
🪛 GitHub Actions: autofix.ci
apps/www/components/hero-video.tsx

[error] 20-20: lint/a11y/noAriaHiddenOnFocusable: aria-hidden on a focusable element is not allowed.


[error] 32-32: lint/a11y/noInteractiveElementToNoninteractiveRole: Interactive element assigned non-interactive role.


[warning] 32-42: lint/a11y/noAriaHiddenOnFocusable / noInteractiveElementToNoninteractiveRole: Accessibility issues related to video element usage.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: test-e2e (a11y)
  • GitHub Check: test-e2e (e2e)
🔇 Additional comments (1)
apps/www/components/hero-video.tsx (1)

6-12: LGTM: Correct hydration pattern.

The mounted state guard correctly prevents hydration mismatches when theme values differ between server and client.

@yamcodes yamcodes merged commit 68cca64 into main Dec 1, 2025
15 checks passed
@yamcodes yamcodes deleted the 471-update-www-hero-section-to-use-new-logo branch December 1, 2025 20:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation tests This issue or PR is about adding, removing or changing tests www Improvements or additions to arkenv.js.org

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update www hero section to use new logo

1 participant