Skip to content

Conversation

@Justin322322
Copy link

@Justin322322 Justin322322 commented Aug 12, 2025

Summary

Fix broken homepage background image by switching to an existing asset and adding error handling to prevent broken image icons from appearing.

Why

The homepage Hero component referenced /landing-page-bg.png which doesn't exist in the public directory. This caused a broken image icon to appear in the top corner of the homepage, degrading the user experience. The issue was reported in #543 with screenshots showing the broken image placeholder.

What changed

  • Updated image source: Changed from non-existent /landing-page-bg.png to existing /landing-page-dark.png
  • Added error fallback: Introduced useState to track image load errors and conditionally hide the image if it fails to load
  • Improved accessibility: Updated alt text from generic "landing-page.bg" to descriptive "Landing page background"
  • Enhanced performance: Added priority prop to ensure the background image loads quickly

In apps/web/src/components/landing/hero.tsx:

  • Import useState from React
  • Add bgError state to track image loading failures
  • Wrap <Image> in conditional rendering {!bgError && (...)}
  • Add onError={() => setBgError(true)} handler
  • Switch src to /landing-page-dark.png (confirmed to exist in apps/web/public/)

Testing

  • Verified /landing-page-dark.png exists in the public directory
  • The existing CSS classes invert dark:invert-0 ensure the dark image works correctly across light/dark themes
  • If the image fails to load for any reason, it gracefully disappears instead of showing a broken icon
  • Background styling and layout remain unchanged

Notes

This fix is minimal and focused - it addresses the immediate broken image issue without changing the overall design or layout. The solution follows the expected behavior outlined in the issue: "If the image file is missing or invalid, the image element should be removed or replaced with a placeholder."

Closes #543

Summary by CodeRabbit

  • New Features

    • Sound search now returns a clear "not configured" response and reports which sound-service credentials are missing.
    • Added a helper to detect Freesound configuration status.
  • Bug Fixes

    • Prevents repeated hero background image load attempts; hides the background on failure to avoid flicker.
  • Style

    • Switched the landing hero to a darker background image and updated alt text for accessibility.
  • Chores

    • Relaxed handling of several server environment variables to allow partial deployments.

Before

image

After

image

@vercel
Copy link

vercel bot commented Aug 12, 2025

@Justin322322 is attempting to deploy a commit to the OpenCut OSS Team on Vercel.

A member of the Team first needs to authorize it.

@netlify
Copy link

netlify bot commented Aug 12, 2025

👷 Deploy request for appcut pending review.

Visit the deploys page to approve it

Name Link
🔨 Latest commit fb5de2f

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 12, 2025

Walkthrough

Adds client-side guarding for the landing hero background image with onError handling; introduces an isFreesoundConfigured() check used by the sounds search API route to return 503 when Freesound is not configured; relaxes several server env var validations to optional; adds non-null assertions where env vars are used.

Changes

Cohort / File(s) Summary
Landing hero background handling
apps/web/src/components/landing/hero.tsx
Added useState guard bgError, conditional rendering of background <Image>, onError={() => setBgError(true)}, switched src to /landing-page-dark.png, updated alt and added priority; outer container made relative.
Freesound search route update
apps/web/src/app/api/sounds/search/route.ts
Calls isFreesoundConfigured() after rate-limit; logs missing vars and returns 503 with error/message when not configured; uses env.FREESOUND_API_KEY! for the token.
Env schema changes
apps/web/src/env.ts
Made several server env vars optional in zod schema: FREESOUND_CLIENT_ID, FREESOUND_API_KEY, CLOUDFLARE_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET_NAME, MODAL_TRANSCRIPTION_URL.
Freesound helper
apps/web/src/lib/transcription-utils.ts
Added export function isFreesoundConfigured() returning { configured: boolean, missingVars: string[] } (checks FREESOUND_CLIENT_ID, FREESOUND_API_KEY).
R2 & Modal non-null assertions
apps/web/src/app/api/get-upload-url/route.ts, apps/web/src/app/api/transcribe/route.ts
Added ! non-null assertions for R2 credentials/URL construction and env.MODAL_TRANSCRIPTION_URL! in fetch call.

Sequence Diagram(s)

sequenceDiagram
  participant U as User
  participant H as Hero Component
  participant I as Next/Image

  U->>H: Load homepage
  H->>I: Attempt render background (/landing-page-dark.png)
  alt Image loads
    I-->>H: onLoad
    H-->>U: Background visible
  else Image fails
    I-->>H: onError
    H->>H: setBgError(true)
    H-->>U: Re-render without background
  end
Loading
sequenceDiagram
  participant C as Client
  participant S as /api/sounds/search
  participant F as isFreesoundConfigured()
  participant API as Freesound API

  C->>S: Request search
  S->>S: Rate-limit check
  S->>F: isFreesoundConfigured()
  alt Not configured
    F-->>S: {configured: false, missingVars: [...]}
    S-->>C: 503 "Sound search not configured" (logs missing vars)
  else Configured
    F-->>S: {configured: true}
    S->>API: perform Freesound search (uses env.FREESOUND_API_KEY!)
    API-->>S: results
    S-->>C: results
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~15 minutes

Assessment against linked issues

Objective Addressed Explanation
Fix broken homepage image link to ensure it loads correctly [#543]
Hide/remove image element if the file is missing or invalid [#543]

Out-of-scope changes

Code Change Explanation
Freesound runtime check and 503 handling (apps/web/src/app/api/sounds/search/route.ts) This API/config validation is unrelated to the homepage image bug objectives.
Made server env vars optional (apps/web/src/env.ts) Broad schema relaxation affects multiple services and is not part of the image fix requested in #543.
Added isFreesoundConfigured() helper (apps/web/src/lib/transcription-utils.ts) New helper supports Freesound checks and is unrelated to fixing the homepage image.

Possibly related PRs

Poem

I hopped across the code tonight,
Swapped a pic and hid a broken sight;
If pixels flee and fail to show,
I tuck the gap and let it go.
A quiet hop — the homepage bright. 🐇✨


📜 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 357998a and fb5de2f.

📒 Files selected for processing (4)
  • apps/web/src/app/api/get-upload-url/route.ts (2 hunks)
  • apps/web/src/app/api/sounds/search/route.ts (3 hunks)
  • apps/web/src/app/api/transcribe/route.ts (1 hunks)
  • apps/web/src/components/landing/hero.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • apps/web/src/app/api/get-upload-url/route.ts
  • apps/web/src/app/api/transcribe/route.ts
  • apps/web/src/components/landing/hero.tsx
  • apps/web/src/app/api/sounds/search/route.ts
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

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

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

- Make FREESOUND_CLIENT_ID, FREESOUND_API_KEY, CLOUDFLARE_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET_NAME, MODAL_TRANSCRIPTION_URL optional in env.ts
- Add isFreesoundConfigured() utility function
- Update sounds search API to check configuration before using Freesound vars
- Fixes CI build errors where these optional features caused required env validation failures
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: 2

🧹 Nitpick comments (2)
apps/web/src/components/landing/hero.tsx (2)

24-24: Decorative background: consider empty alt to reduce screen-reader noise.
Because this is a purely decorative background image, using alt="" prevents redundant announcements and improves a11y.

-          alt="Landing page background"
+          alt=""

19-27: Optional: Provide sizes for better responsive hinting (if not switching to fill).
If you keep explicit width/height instead of fill, adding sizes helps the browser choose the optimal source sooner.

         <Image
           className="absolute top-0 left-0 -z-50 size-full object-cover invert dark:invert-0 opacity-85"
           src="/landing-page-dark.png"
           height={1903.5}
           width={1269}
-          alt="Landing page background"
+          alt="Landing page background"
           onError={() => setBgError(true)}
+          sizes="100vw"
           priority
         />
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a1e4861 and 55ddf9f.

📒 Files selected for processing (1)
  • apps/web/src/components/landing/hero.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{jsx,tsx}

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.{jsx,tsx}: Don't use accessKey attribute on any HTML element.
Don't set aria-hidden="true" on focusable elements.
Don't add ARIA roles, states, and properties to elements that don't support them.
Don't use distracting elements like <marquee> or <blink>.
Only use the scope prop on <th> elements.
Don't assign non-interactive ARIA roles to interactive HTML elements.
Make sure label elements have text content and are associated with an input.
Don't assign interactive ARIA roles to non-interactive HTML elements.
Don't assign tabIndex to non-interactive HTML elements.
Don't use positive integers for tabIndex property.
Don't include "image", "picture", or "photo" in img alt prop.
Don't use explicit role property that's the same as the implicit/default role.
Make static elements with click handlers use a valid role attribute.
Always include a title element for SVG elements.
Give all elements requiring alt text meaningful information for screen readers.
Make sure anchors have content that's accessible to screen readers.
Assign tabIndex to non-interactive HTML elements with aria-activedescendant.
Include all required ARIA attributes for elements with ARIA roles.
Make sure ARIA properties are valid for the element's supported roles.
Always include a type attribute for button elements.
Make elements with interactive roles and handlers focusable.
Give heading elements content that's accessible to screen readers (not hidden with aria-hidden).
Always include a lang attribute on the html element.
Always include a title attribute for iframe elements.
Accompany onClick with at least one of: onKeyUp, onKeyDown, or onKeyPress.
Accompany onMouseOver/onMouseOut with onFocus/onBlur.
Include caption tracks for audio and video elements.
Use semantic elements instead of role attributes in JSX.
Make sure all anchors are valid and navigable.
Ensure all ARIA properties (aria-*) are valid.
Use valid, non-abstract ARIA roles for elements with...

Files:

  • apps/web/src/components/landing/hero.tsx
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.{ts,tsx}: Don't use TypeScript enums.
Don't export imported variables.
Don't add type annotations to variables, parameters, and class properties that are initialized with literal expressions.
Don't use TypeScript namespaces.
Don't use non-null assertions with the ! postfix operator.
Don't use parameter properties in class constructors.
Don't use user-defined types.
Use as const instead of literal types and type annotations.
Use either T[] or Array<T> consistently.
Initialize each enum member value explicitly.
Use export type for types.
Use import type for types.
Make sure all enum members are literal values.
Don't use TypeScript const enum.
Don't declare empty interfaces.
Don't let variables evolve into any type through reassignments.
Don't use the any type.
Don't misuse the non-null assertion operator (!) in TypeScript files.
Don't use implicit any type on variable declarations.
Don't merge interfaces and classes unsafely.
Don't use overload signatures that aren't next to each other.
Use the namespace keyword instead of the module keyword to declare TypeScript namespaces.
Don't use empty type parameters in type aliases and interfaces.
Don't use any or unknown as type constraints.
Don't use the TypeScript directive @ts-ignore.
Use consistent accessibility modifiers on class properties and methods.
Use function types instead of object types with call signatures.
Don't use void type outside of generic or return types.

Files:

  • apps/web/src/components/landing/hero.tsx
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.{js,jsx,ts,tsx}: Don't use the return value of React.render.
Don't use consecutive spaces in regular expression literals.
Don't use the arguments object.
Don't use primitive type aliases or misleading types.
Don't use the comma operator.
Don't write functions that exceed a given Cognitive Complexity score.
Don't use unnecessary boolean casts.
Don't use unnecessary callbacks with flatMap.
Use for...of statements instead of Array.forEach.
Don't create classes that only have static members (like a static namespace).
Don't use this and super in static contexts.
Don't use unnecessary catch clauses.
Don't use unnecessary constructors.
Don't use unnecessary continue statements.
Don't export empty modules that don't change anything.
Don't use unnecessary escape sequences in regular expression literals.
Don't use unnecessary labels.
Don't use unnecessary nested block statements.
Don't rename imports, exports, and destructured assignments to the same name.
Don't use unnecessary string or template literal concatenation.
Don't use String.raw in template literals when there are no escape sequences.
Don't use useless case statements in switch statements.
Don't use ternary operators when simpler alternatives exist.
Don't use useless this aliasing.
Don't initialize variables to undefined.
Don't use the void operators (they're not familiar).
Use arrow functions instead of function expressions.
Use Date.now() to get milliseconds since the Unix Epoch.
Use .flatMap() instead of map().flat() when possible.
Use literal property access instead of computed property access.
Don't use parseInt() or Number.parseInt() when binary, octal, or hexadecimal literals work.
Use concise optional chaining instead of chained logical expressions.
Use regular expression literals instead of the RegExp constructor when possible.
Don't use number literal object member names that aren't base 10 or use underscore separators.
Remove redundant terms from logical expressions.
Use while loops instead of...

Files:

  • apps/web/src/components/landing/hero.tsx
🧬 Code Graph Analysis (1)
apps/web/src/components/landing/hero.tsx (1)
apps/web/src/app/page.tsx (1)
  • Home (13-21)
🔇 Additional comments (5)
apps/web/src/components/landing/hero.tsx (5)

12-12: LGTM: Local state import is appropriate for client-side image error handling.
Importing useState here is the right approach given the client-only behavior.


15-15: LGTM: Simple, top-level hook for error guard is clear and correct.
The bgError flag is well-named and placed; hook usage complies with rules-of-hooks.


18-19: LGTM: Conditional render prevents broken-image icon from appearing.
Wrapping the Image with a guard and flipping the flag on error meets the issue’s requirement cleanly.

Also applies to: 27-28


26-26: LGTM: Using priority for the above-the-fold hero background is appropriate.
This aligns with Next.js guidance for critical imagery.


21-21: Image reference is valid—no changes needed

  • Confirmed that apps/web/public/landing-page-dark.png exists.
  • There are no width/height props to reconcile against the image’s pixel dimensions.

This commit addresses TypeScript compilation errors that occurred after making
optional API environment variables truly optional in the previous commit.

## Changes Made

### API Route Updates
  - env.R2_ACCESS_KEY_ID! and env.R2_SECRET_ACCESS_KEY! in AwsClient constructor
  - env.R2_BUCKET_NAME! and env.CLOUDFLARE_ACCOUNT_ID! in URL construction
  - Safe because isTranscriptionConfigured() check ensures these exist before usage

- transcribe/route.ts: Added non-null assertion for Modal transcription URL
  - env.MODAL_TRANSCRIPTION_URL! in fetch() call
  - Safe because isTranscriptionConfigured() check validates this beforehand

- sounds/search/route.ts: Added non-null assertion for Freesound API key
  - env.FREESOUND_API_KEY! in URLSearchParams construction
  - Safe because new isFreesoundConfigured() check validates this beforehand

### Configuration Validation
- transcription-utils.ts: Added isFreesoundConfigured() utility function
  - Checks for FREESOUND_CLIENT_ID and FREESOUND_API_KEY availability
  - Returns {configured: boolean, missingVars: string[]} for consistent error handling
  - Mirrors existing isTranscriptionConfigured() pattern

- sounds/search/route.ts: Added Freesound configuration check
  - Early return with 503 status if Freesound credentials missing
  - Provides clear error message listing required environment variables
  - Prevents runtime errors when optional sound search feature is not configured

## Why These Changes Are Safe

1. Non-null assertions are protected: All usage of env.VAR! is preceded by
   configuration checks that verify the variables exist
2. Graceful degradation: Missing optional features return proper HTTP 503
   responses instead of crashing
3. Consistent error handling: All optional features follow the same pattern
   of checking configuration before usage
4. Build-time validation: Environment variables are optional at build time
   but validated at runtime when features are accessed

## Testing
- Local build passes: bun run build completes successfully
- TypeScript compilation: No type errors
- Lint checks: All pass
- Optional features degrade gracefully when env vars missing

This ensures the CI/CD pipeline passes while maintaining proper runtime
validation for optional features like sound search and auto-transcription.
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

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 55ddf9f and e382f61.

📒 Files selected for processing (3)
  • apps/web/src/app/api/sounds/search/route.ts (2 hunks)
  • apps/web/src/env.ts (1 hunks)
  • apps/web/src/lib/transcription-utils.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.{ts,tsx}: Don't use TypeScript enums.
Don't export imported variables.
Don't add type annotations to variables, parameters, and class properties that are initialized with literal expressions.
Don't use TypeScript namespaces.
Don't use non-null assertions with the ! postfix operator.
Don't use parameter properties in class constructors.
Don't use user-defined types.
Use as const instead of literal types and type annotations.
Use either T[] or Array<T> consistently.
Initialize each enum member value explicitly.
Use export type for types.
Use import type for types.
Make sure all enum members are literal values.
Don't use TypeScript const enum.
Don't declare empty interfaces.
Don't let variables evolve into any type through reassignments.
Don't use the any type.
Don't misuse the non-null assertion operator (!) in TypeScript files.
Don't use implicit any type on variable declarations.
Don't merge interfaces and classes unsafely.
Don't use overload signatures that aren't next to each other.
Use the namespace keyword instead of the module keyword to declare TypeScript namespaces.
Don't use empty type parameters in type aliases and interfaces.
Don't use any or unknown as type constraints.
Don't use the TypeScript directive @ts-ignore.
Use consistent accessibility modifiers on class properties and methods.
Use function types instead of object types with call signatures.
Don't use void type outside of generic or return types.

Files:

  • apps/web/src/lib/transcription-utils.ts
  • apps/web/src/app/api/sounds/search/route.ts
  • apps/web/src/env.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.{js,jsx,ts,tsx}: Don't use the return value of React.render.
Don't use consecutive spaces in regular expression literals.
Don't use the arguments object.
Don't use primitive type aliases or misleading types.
Don't use the comma operator.
Don't write functions that exceed a given Cognitive Complexity score.
Don't use unnecessary boolean casts.
Don't use unnecessary callbacks with flatMap.
Use for...of statements instead of Array.forEach.
Don't create classes that only have static members (like a static namespace).
Don't use this and super in static contexts.
Don't use unnecessary catch clauses.
Don't use unnecessary constructors.
Don't use unnecessary continue statements.
Don't export empty modules that don't change anything.
Don't use unnecessary escape sequences in regular expression literals.
Don't use unnecessary labels.
Don't use unnecessary nested block statements.
Don't rename imports, exports, and destructured assignments to the same name.
Don't use unnecessary string or template literal concatenation.
Don't use String.raw in template literals when there are no escape sequences.
Don't use useless case statements in switch statements.
Don't use ternary operators when simpler alternatives exist.
Don't use useless this aliasing.
Don't initialize variables to undefined.
Don't use the void operators (they're not familiar).
Use arrow functions instead of function expressions.
Use Date.now() to get milliseconds since the Unix Epoch.
Use .flatMap() instead of map().flat() when possible.
Use literal property access instead of computed property access.
Don't use parseInt() or Number.parseInt() when binary, octal, or hexadecimal literals work.
Use concise optional chaining instead of chained logical expressions.
Use regular expression literals instead of the RegExp constructor when possible.
Don't use number literal object member names that aren't base 10 or use underscore separators.
Remove redundant terms from logical expressions.
Use while loops instead of...

Files:

  • apps/web/src/lib/transcription-utils.ts
  • apps/web/src/app/api/sounds/search/route.ts
  • apps/web/src/env.ts
🧬 Code Graph Analysis (2)
apps/web/src/lib/transcription-utils.ts (1)
apps/web/src/env.ts (1)
  • env (7-45)
apps/web/src/app/api/sounds/search/route.ts (1)
apps/web/src/lib/transcription-utils.ts (1)
  • isFreesoundConfigured (15-22)
🔇 Additional comments (4)
apps/web/src/env.ts (2)

18-26: Aligning Freesound envs with runtime gating — LGTM

Making FREESOUND_CLIENT_ID and FREESOUND_API_KEY optional matches the new isFreesoundConfigured() guard and prevents app boot from failing when these are intentionally unset.


18-26: All optionalized R2/Modal env vars are properly gated

I audited every reference to the newly optionalized variables (CLOUDFLARE_ACCOUNT_ID, R2_*, MODAL_TRANSCRIPTION_URL) across the codebase and confirmed that each usage is preceded by the appropriate isTranscriptionConfigured() or isFreesoundConfigured() check. No unguarded accesses were found. Safe to proceed.

apps/web/src/app/api/sounds/search/route.ts (1)

5-5: Importing isFreesoundConfigured here is the right place

Route-level gating right after rate-limit is an appropriate integration point. Nice.

apps/web/src/lib/transcription-utils.ts (1)

15-22: Helper function is concise and mirrors isTranscriptionConfigured — LGTM

Checks the two required vars and returns a clear result object. Consistent with the existing pattern.

@Justin322322 Justin322322 force-pushed the fix/broken-homepage-image-543 branch from 357998a to 5951adb Compare August 12, 2025 04:50
- Remove sensitive environment variable names from client error responses
- Simplify error message to 'Sound search is not configured' for production
- Keep detailed logging server-side for operational visibility
- Conditionally include missingVars in response only for non-production environments
- Prevents information disclosure while maintaining developer debugging capability

Security improvement: Production clients no longer see internal configuration details
- Replace invalid float height (1903.5) with proper fill prop
- Add relative positioning to container for proper image anchoring
- Use fill + sizes='100vw' for optimized full-bleed background
- Remove redundant size-full class (covered by fill)
- Maintains responsive behavior and all existing styling

Fixes invalid HTML attributes and improves image loading performance
@Justin322322 Justin322322 force-pushed the fix/broken-homepage-image-543 branch from e01afce to fb5de2f Compare August 12, 2025 05:04
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 12, 2025

@Justin322322 I'll review this PR that fixes the broken homepage image link and addresses environment variable configuration issues.

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Justin322322
Copy link
Author

Closing PR issue has been addressed

@Justin322322 Justin322322 deleted the fix/broken-homepage-image-543 branch August 12, 2025 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG]: Broken image link on homepage

1 participant