Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(web): finish website v1 #185

Open
wants to merge 33 commits into
base: main
Choose a base branch
from

Conversation

HasithDeAlwis
Copy link
Collaborator

@HasithDeAlwis HasithDeAlwis commented Nov 28, 2024

Pull Request Template

PR Requirements Checklist

  • Commit messages follow guidelines
  • Tests added
  • Tests pass
  • Docs added/updated (for bug fixes/features)
  • Rebased onto main
  • Tested for mobile/tablet/desktop (if applicable)

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced a TerminalText component for rendering styled text elements.
    • Added a Typography component for managing various text styles.
    • Implemented SplineComponent for lazy loading 3D scenes.
    • Created FAQItem and FAQPresenter components for displaying FAQs in an accordion format.
    • Added SponsorshipPresenter for rendering sponsorship information dynamically.
    • Included new constants for CUHacking 2025 event URLs and sponsorship details.
    • Added new WelcomeSection and MissionSection components for enhanced webpage layout.
  • Bug Fixes

    • Updated import paths for several components to streamline access.
    • Removed unused components to improve code organization.
  • Documentation

    • Added new documents on "Bullet-Proof React" and "Feature-Sliced Design" methodologies.
    • Introduced a "Style Guide" outlining coding standards.
  • Tests

    • Established comprehensive end-to-end tests for navbar, footer, and welcome sections.
    • Integrated Lighthouse testing functionality for performance audits.
    • Enhanced test coverage for sponsorship-related UI components.

Copy link

coderabbitai bot commented Nov 28, 2024

📝 Walkthrough

Walkthrough

This pull request introduces several updates across the CUHacking website's codebase, focusing on improvements to file management, component structure, and testing capabilities. Key changes include the addition of deno.lock to the .gitignore file, updates to the Storybook configuration for various components, and the introduction of new components and testing functions. The refactoring enhances organization and clarity within the project.

Changes

File/Directory Change Summary
.gitignore Added deno.lock to ignored files
.storybook/main.ts Expanded stories array to include new paths for UI components
apps/website/app/root.tsx Removed links export, updated <html> class attributes
apps/website/app/routes/_index.tsx Modified import path for Icon component
libs/shared/ui/accordion/accordion.tsx Updated import for cn utility and reformatted JSX
libs/shared/ui/button/button.tsx Changed import path for cn and reformatted default variant string
libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx Updated import for cn and reformatted function signature
libs/shared/ui/icon/icon.tsx Changed import path for cn and made minor formatting changes
libs/shared/ui/navigation-menu/navigation-menu.tsx Updated import for cn, added ChevronDown icon to NavigationMenuTrigger
libs/shared/ui/navigation/navbar/ui/nav-item.tsx Updated import for Link, introduced styling utilities
libs/shared/ui/terminal-text/terminal-text.tsx New component added for rendering terminal text with variations
libs/website/feature/faq/constants/faq.constants.ts Deleted file containing FAQ constants
libs/website/feature/introduction/ui/welcome/welcome.section.tsx Deleted file containing WelcomeSection component
libs/website/ui/faq/faq-item/faq-item.tsx New component added for rendering FAQ items in an accordion format
libs/website/ui/faq/faq-presenter/faq.presenter.tsx New component added to render FAQs using FAQItem
libs/website/ui/sponsorship/sponsorship-section.tsx Deleted file containing SponsorshipSection component
libs/website/ui/stats/index.ts New exports added for statistics-related components
libs/shared/utils/ErrorBoundary.tsx New error boundary component added for error handling
package.json New dependencies added for 3D rendering support

Possibly related PRs

Suggested labels

frontend, enhancement

Suggested reviewers

  • MFarabi619

Poem

🐰 A Rabbit's Code Odyssey 🌈
Through paths of import, we now roam
Refactoring our digital home
Components dance, tests take flight
Our website shines so crisp and bright!
Code hops forward with gleeful might! 🚀

Tip

CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command @coderabbitai generate docstrings to have CodeRabbit automatically generate docstrings for your pull request. We would love to hear your feedback on Discord.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ 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.
    • Generate unit testing code for this file.
    • 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. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • 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 src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

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

Documentation and Community

  • 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.

Copy link

netlify bot commented Nov 28, 2024

Deploy Preview for website-cuhacking ready!

Name Link
🔨 Latest commit a338bfd
🔍 Latest deploy log https://app.netlify.com/sites/website-cuhacking/deploys/67482c681ec19800085a4411
😎 Deploy Preview https://deploy-preview-185--website-cuhacking.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

Copy link

@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: 56

🧹 Outside diff range and nitpick comments (65)
libs/website/shared/ui/navigation/index.ts (1)

4-4: Documentation needed for architectural change

The shift from Presenter to Container pattern represents a significant architectural change. Given that this is website v1 and documentation updates are pending in the PR checklist, please add:

  1. Documentation explaining the Container pattern implementation
  2. Migration guide for any components still using NavbarPresenter

Would you like me to help create a documentation template or open an issue to track this task?

libs/website/shared/ui/navigation/navbar/ui/nav-item-mobile.tsx (1)

4-8: Consider enhancing the TypeScript interface definition.

The interface is well-structured but could benefit from the following improvements:

  1. Make props optional where appropriate
  2. Add JSDoc comments for better documentation
  3. Consider using React's event types for onClick

Consider this enhancement:

+/**
+ * Props for the MobileNavItem component
+ */
 interface MobileNavItemProps {
+  /** The destination URL for the navigation item */
   link: string
+  /** The display text for the navigation item */
   name: string
-  onClick: () => void
+  /** Handler for click events */
+  onClick?: (event: React.MouseEvent<HTMLDivElement>) => void
 }
libs/website/shared/ui/spline/spline.client.tsx (2)

6-9: Add JSDoc comments and make className optional.

Consider adding documentation and making the className prop optional for better developer experience.

+/**
+ * Props for the SplineComponent
+ * @param link - URL to the Spline scene to be rendered
+ * @param className - Optional CSS classes for styling
+ */
 interface SplineComponentProps {
   link: string
-  className: string
+  className?: string
 }

1-20: Add tests for the SplineComponent.

As per the PR checklist, tests are required. Consider adding:

  1. Unit tests for prop validation
  2. Integration tests for error boundary scenarios
  3. Loading state tests

Would you like me to help create a test suite for this component? I can provide a template with the necessary test cases.

libs/shared/ui/separator/separator.tsx (2)

Line range hint 1-24: Add tests for the Separator component.

As this is part of website v1 completion and the component is part of the shared UI library, it's critical to have proper test coverage. Consider testing:

  • Default rendering
  • Orientation prop behavior
  • className prop composition
  • ref forwarding

Would you like me to help create a test suite for this component? I can generate tests using React Testing Library that cover all the essential functionality.


Line range hint 1-24: Add JSDoc documentation for the component.

As a shared UI component, proper documentation will help other developers understand its purpose and usage.

Add documentation like this:

+/**
+ * A visual separator that can be oriented horizontally or vertically.
+ * Built on top of Radix UI Separator primitive for accessibility.
+ *
+ * @param orientation - 'horizontal' or 'vertical' (default: 'horizontal')
+ * @param decorative - Whether the separator is purely decorative (default: true)
+ * @param className - Additional CSS classes to apply
+ */
export const Separator = React.forwardRef<
libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (2)

1-2: Consider using absolute imports and adding type imports

For better maintainability and type safety:

  1. Consider using absolute imports instead of relative paths
  2. Consider separating type imports from value imports
-import React from 'react'
-import { NavbarPresenter } from './navbar.presenter'
+import React from 'react'
+import type { FC } from 'react'
+import { NavbarPresenter } from '@website/shared/ui/navigation/navbar/ui/navbar.presenter'

30-38: Consider performance implications of backdrop-blur

The backdrop-blur CSS property can impact performance on mobile devices. Consider:

  1. Using a solid background color on mobile devices
  2. Implementing progressive enhancement for the blur effect
libs/website/ui/sponsorship/sponsor-presenter/sponsor.presenter.tsx (1)

Line range hint 10-24: Add accessibility improvements and tests

  1. Accessibility:

    • Add an aria-label to the main element to describe the sponsor section
    • Consider adding aria-live for dynamic sponsor updates
  2. Testing:

    • Add unit tests for the component rendering
    • Add integration tests for sponsor data handling

Here's a suggested improvement for accessibility:

-      <main className="flex flex-row flex-wrap gap-3 justify-center md:justify-start lg:items-start">
+      <main 
+        className="flex flex-row flex-wrap gap-3 justify-center md:justify-start lg:items-start"
+        aria-label={`${isPresent ? 'Present' : 'Past'} sponsors section`}
+      >

Would you like me to help generate:

  1. A comprehensive test suite for this component?
  2. Additional accessibility enhancements?
libs/shared/utils/ErrorBoundary.tsx (1)

1-10: Consider adding customization options for error handling

The current implementation could benefit from additional props to customize the error handling behavior and fallback UI.

Consider extending the ErrorBoundaryProps interface:

 interface ErrorBoundaryProps {
   children: ReactNode
+  fallback?: ReactNode
+  onError?: (error: Error, errorInfo: React.ErrorInfo) => void
 }
libs/website/ui/faq/constants/faq.constants.ts (1)

26-28: Simplify the constants export

The current export wraps a single property in an object, which adds unnecessary nesting.

Consider simplifying the export:

-export const FAQ_CONSTANTS = {
-  QUESTIONS: questions,
-}
+export const FAQ_QUESTIONS = questions;

This makes imports more straightforward: import { FAQ_QUESTIONS } from './faq.constants'

libs/website/ui/introduction/welcome/welcome.section.tsx (2)

12-15: Consider moving the Spline URL to constants

The hardcoded Spline URL should be moved to a constants file for better maintainability and reusability.

Consider moving the URL to your constants file:

// in welcome.constants.ts
export const WELCOME_CONSTANTS = {
  SOCIALS: {...},
+ SPLINE_SCENE_URL: 'https://prod.spline.design/nnjZJFW1wThAacUS/scene.splinecode'
}

// in this file
<SplineComponent
  className="absolute -bottom-16 lg:left-0 lg:top-0 lg:scale-[1.2]"
- link="https://prod.spline.design/nnjZJFW1wThAacUS/scene.splinecode"
+ link={WELCOME_CONSTANTS.SPLINE_SCENE_URL}
/>

Line range hint 7-24: Add tests and improve error handling

As per the PR objectives, tests are missing. Additionally, consider adding error handling and loading states for a better user experience.

Key points to address:

  1. Add unit tests for the WelcomeSection component
  2. Implement error handling for Spline loading failures
  3. Add a loading state while Spline initializes

Would you like me to help with:

  1. Generating test cases for the WelcomeSection component?
  2. Implementing error boundaries and loading states?
libs/website/ui/faq/faq-item/faq-item.tsx (2)

9-12: Add JSDoc documentation and prop validation.

Consider enhancing the interface with:

  1. JSDoc documentation explaining the purpose and usage
  2. Prop validation for non-empty arrays and strings
+/**
+ * Props for the FAQ item component
+ * @property {string} question - The FAQ question to display
+ * @property {string[]} answers - Array of answers to display for the question
+ */
 interface FAQItemProps {
-  question: string
-  answers: string[]
+  question: string & {}  // ensures non-empty string
+  answers: [string, ...string[]]  // ensures non-empty array
 }

16-23: Consider adding hover and focus states for better interactivity.

The accordion trigger could benefit from visual feedback states to improve user experience.

 <AccordionItem value={question}>
-  <AccordionTrigger>
+  <AccordionTrigger className="hover:bg-primary/10 focus:outline-none focus:ring-2 focus:ring-primary">
     <p>
       <span className="text-primary">faq(</span>
       {question}
       <span className="text-primary">)</span>
     </p>
   </AccordionTrigger>
libs/website/ui/introduction/mission/mission.section.tsx (1)

Line range hint 7-26: Add tests for the MissionSection component

The PR objectives indicate that tests are missing. Consider adding:

  1. Unit tests for component rendering
  2. Integration tests for Spline interaction
  3. Responsive design tests

Would you like me to help create a test suite for this component? I can provide a template with test cases covering the main functionality.

libs/website/shared/ui/socials/socials.tsx (1)

Line range hint 1-34: Add component tests as per PR requirements

As mentioned in the PR objectives, tests are missing. For this UI component, consider adding:

  1. Visual regression tests using Storybook
  2. Accessibility tests for aria-labels
  3. Unit tests for link generation

Would you like me to help set up:

  1. A Storybook story for visual testing?
  2. Jest tests for component rendering and accessibility?
  3. Cypress tests for interaction testing?
libs/website/shared/ui/navigation/navbar/ui/nav-item.tsx (2)

1-5: Remove outdated TODO comment

The TODO comment suggests refactoring to use Remix's Link component, but this has already been implemented in the code.

 import { cn } from '@cuhacking/shared/utils/cn'
 import { Link } from '@remix-run/react'
 import { cva } from 'class-variance-authority'
 import React from 'react'
-// TODO: Refactor to use <Link> from Remix

6-15: Enhance styling configuration with type safety and flexibility

The current implementation has several potential improvements:

  1. Add TypeScript types for the index values
  2. Consider adding a default variant
  3. The hard-coded limit of 4 navigation items might be restrictive
+type NavItemIndex = 0 | 1 | 2 | 3;
+
 const navItemStyles = cva('text-xs font-bold', {
   variants: {
-    index: {
+    index: {
     },
   },
+  defaultVariants: {
+    index: 0,
+  },
 })
+
+interface NavItemProps {
+  index: NavItemIndex;
+  link: string;
+  name: string;
+}
libs/website/ui/introduction/mission/mission.stories.tsx (3)

6-32: Add component documentation for Storybook.

The 'autodocs' tag is present, but the component lacks JSDoc documentation. Consider adding comprehensive documentation to improve the Storybook documentation generation.

Example documentation:

+/**
+ * Mission component for displaying the organization's mission statement
+ * @component
+ * @param {Object} props - Component props
+ * @param {string} props.logo - Path to the logo image
+ */
const meta: Meta<typeof Mission> = {

11-23: Consider improving the Remix stub implementation.

The current implementation uses a catch-all route with basic redirects, which might not provide the most realistic testing scenario.

Consider this improvement:

-      const remixStub = createRemixStub([
-        {
-          path: '/*',
-          action: () => ({ redirect: '/' }),
-          loader: () => ({ redirect: '/' }),
-          Component: () => story(),
-        },
-      ])
+      const remixStub = createRemixStub([
+        {
+          path: '/mission',
+          action: () => ({}),
+          loader: () => ({ 
+            // Add mock data that the component might need
+            missionData: {
+              title: 'Our Mission',
+              description: 'Test description'
+            }
+          }),
+          Component: () => story(),
+        },
+      ])

36-38: Consider adding more story variants.

While the default story is good, additional variants would help showcase different states or configurations of the Mission component.

Consider adding these story variants:

export const WithoutLogo: Story = { args: { logo: undefined } }

export const WithCustomStyling: Story = {
  args: { logo: asciiLogo.src },
  parameters: {
    backgrounds: { default: 'dark' },
  }
}
libs/website/shared/ui/navigation/footer/ui/footer.presenter.tsx (2)

18-24: Consider reducing the hover scale factor

The scale factor of 1.2 (20% increase) might be too aggressive for a logo element. Consider reducing it to 1.1 for a more subtle effect.

-            className="transition-transform duration-300 hover:scale-[1.2]"
+            className="transition-transform duration-300 hover:scale-110"

18-24: Add tests for the FooterPresenter component

As per the PR objectives, tests are missing. Consider adding the following test cases:

  1. Logo rendering and link functionality
  2. Hover state interactions
  3. Responsive layout behavior

Would you like me to help create these test cases using React Testing Library?

libs/shared/ui/terminal-text/terminal-text.tsx (2)

28-33: Add JSDoc documentation and improve accessibility.

As this is a shared UI component, please consider:

  1. Adding JSDoc documentation to describe the component's purpose and props
  2. Including aria labels for better accessibility

Consider adding documentation like this:

+/**
+ * TerminalText - A component that displays text in a terminal-like format
+ * @param {Object} props - Component props
+ * @param {ReactNode} props.children - The content to display
+ * @param {Media} [props.icon] - Optional icon to display instead of the terminal prompt
+ * @param {string} [props.className] - Additional CSS classes
+ * @param {boolean} [props.callToAction] - Whether to apply call-to-action styling
+ */
export function TerminalText({

And improve accessibility:

-    <div className={cn(terminalTextVariation({ className }))}>
+    <div 
+      className={cn(terminalTextVariation({ className }))}
+      role="text"
+      aria-label="Terminal text display"
+    >

Line range hint 1-42: Add component tests as per PR requirements.

The PR checklist indicates missing tests. For this shared UI component, consider adding:

  1. Unit tests for the callToActionVariation and terminalTextVariation functions
  2. Component render tests with different prop combinations
  3. Snapshot tests for visual regression testing

Would you like me to help generate a test suite for this component?

libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx (2)

Line range hint 13-13: Add aria-label to info icon for accessibility

The info icon should have proper accessibility attributes to improve screen reader support.

   {variant === 'info'
     ? (
         <div className="absolute top-1.5 right-1.5">
-          <img src={InfoIcon.src} />
+          <img src={InfoIcon.src} alt="Information" aria-label="Additional information" role="img" />
         </div>
       )
     : null}

Also applies to: 38-42


Line range hint 1-42: Add unit tests for the GlassmorphicCard component

Based on the PR objectives, tests are missing. This component should have tests for:

  1. Rendering with different variants
  2. Proper className merging
  3. Conditional info icon rendering

Would you like me to help create a test suite for this component? I can generate tests using React Testing Library that cover all the key functionality.

libs/website/ui/sponsorship/sponsor-presenter/sponsor-item.tsx (2)

35-40: Add error handling for image loading

Consider adding error handling for image loading failures to improve user experience and prevent layout shifts.

         <img
           src={sponsor.logo}
           alt={`${sponsor.name} logo`}
           loading="lazy"
           className={cn(sponsorPresenterVariation({ isPresent }))}
+          onError={(e) => {
+            e.currentTarget.src = '/fallback-sponsor-logo.png'
+          }}
         />

25-43: Add tests for the SponsorItem component

The PR objectives mention that tests are missing. This component should have tests for:

  • Rendering with different sponsor data
  • Image loading states
  • Link functionality
  • Responsive behavior based on isPresent prop

Would you like me to help generate test cases for this component using React Testing Library?

libs/website/ui/introduction/welcome/welcome.tsx (3)

31-32: Consider extracting date as a constant or configuration.

The event date is currently hardcoded. Consider moving it to a constants file or configuration to make future updates easier and maintain consistency across the site.

- Mar. 14 - 16 2025 @ Carleton University 💚
+ {EVENT_DATE} @ {EVENT_LOCATION} 💚

Line range hint 15-16: TODO comment needs addressing.

The comment indicates that color customization functionality is pending. This should be addressed before finalizing v1.

Would you like me to help implement a color props system for this component?


Line range hint 13-43: Documentation needed for the Welcome component.

As per PR objectives, documentation updates are required. Please add:

  • Component purpose and usage examples
  • Props documentation (especially the IntroProps interface)
  • Responsive behavior expectations

Consider adding JSDoc comments:

/**
 * Welcome component displays the main introduction section of the website.
 * @component
 * @param {IntroProps} props - The props for the Welcome component
 * @param {Array<{link: string, media: Media}>} props.socials - Social media links and their associated media
 * @returns {JSX.Element} A glassmorphic card containing welcome message and social links
 */
libs/website/shared/ui/navigation/footer/constants/footer.constants.ts (2)

Line range hint 12-66: Consider reordering social links by importance

Consider reordering the social media links based on their importance and usage frequency. Typically, primary communication channels (e.g., Discord for a hackathon) should be positioned first, followed by secondary channels.

Suggested order:

  1. Discord (primary communication)
  2. Instagram (primary social media)
  3. GitHub (code repository)
  4. Documentation
  5. LinkedIn
  6. Email
  7. Other links (Figma, Linktree)

Update social media and documentation links before deployment

The current implementation uses placeholder URLs that need to be updated with actual organization links:

  • https://instagram.com should be updated to a specific Instagram profile
  • https://github.com should point to the organization's GitHub repository
  • https://discord.com needs the actual Discord server invite link
  • https://docs.com requires the proper documentation site URL
  • https://figma.com should link to the specific Figma project
  • [email protected] needs to be replaced with the organization's contact email
  • https://linkedin.com should point to the organization's LinkedIn profile
  • https://linktr.ee needs the organization's Linktree URL
🔗 Analysis chain

Line range hint 12-66: Verify social media presence and documentation links

Let's verify that all social media accounts and documentation sites are properly set up and accessible before deploying to production.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if the organization's social media profiles and documentation exist
# Note: Using curl to check HTTP response codes

echo "Checking social media profiles and documentation links..."

# Extract URLs from the file
urls=$(rg -o 'link: .+' | sed "s/link: '//;s/'//g")

# Check each URL
while IFS= read -r url; do
  if [[ $url != mailto:* ]]; then
    response=$(curl -sL -w "%{http_code}" "$url" -o /dev/null)
    echo "URL: $url - Status: $response"
  fi
done <<< "$urls"

# Check if documentation is properly set up
echo "Checking for documentation setup..."
fd -g "docs/**"

Length of output: 59865

libs/website/ui/introduction/constants/welcome.constants.ts (2)

Line range hint 49-51: Fix typo in exported constant name

There's a typo in the exported constant name "CONSTATNTS".

-export const WELCOME_CONSTATNTS = {
+export const WELCOME_CONSTANTS = {
   SOCIALS: socials,
 }

Line range hint 1-51: Add tests and perform cross-platform verification

According to the PR objectives, several important items are missing:

  1. Unit tests for these constants
  2. Cross-platform testing (mobile, tablet, desktop)

Please add:

  1. Unit tests to verify the structure of the social media links
  2. Visual regression tests to ensure icons render correctly across platforms

Would you like me to help generate:

  1. Unit tests for the constants?
  2. A Storybook story for visual testing?
libs/shared/ui/accordion/accordion.tsx (1)

Line range hint 1-50: Add test coverage and improve documentation

The accordion component is a critical UI element but lacks tests. Consider adding:

  1. Unit tests for open/close behavior
  2. Integration tests for keyboard navigation
  3. Accessibility tests for screen reader compatibility
  4. Props documentation using JSDoc or similar

Would you like me to help generate:

  1. A test suite template for this component?
  2. JSDoc documentation for the exported components?
libs/shared/ui/button/button.tsx (2)

Line range hint 5-6: Address TODO comment regarding button variants refactoring.

The TODO comment indicates a need to extract buttonVariants into a separate file, which would improve modularity and reusability.

Would you like me to help create a new file for the button variants and update the imports accordingly?


Based on the gathered information, I can now provide the final response:

Partially revising the testing requirements

The component already has good coverage through Storybook:

  • Stories exist for all button variants and sizes
  • Accessibility testing is supported (@storybook/addon-a11y is installed)
  • Viewport testing capability exists (@storybook/addon-viewport is installed)

However, unit tests are still missing. Add:

  1. Unit tests using the available @testing-library/react to verify:
    • Button click handlers
    • Proper className application for variants
    • Slot component behavior
  2. Basic accessibility assertions in unit tests

The cross-platform compatibility concern is already addressed through Storybook's viewport addon.

🔗 Analysis chain

Line range hint 1-58: Add tests and verify cross-platform compatibility.

Given this is a core UI component for website v1:

  1. Add unit tests to verify button behavior across variants and sizes
  2. Add Storybook stories for mobile, tablet, and desktop viewports
  3. Consider adding accessibility tests

This aligns with the PR objectives and unfinished checklist items.


Let me check the content of the existing stories file to verify if it covers the required test scenarios.


Let me check for any accessibility testing setup and test utilities in the project.


Let me check the actual test setup and accessibility configurations.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for existing test files and stories
fd -e test.tsx -e spec.tsx -e stories.tsx button

Length of output: 145


Script:

#!/bin/bash
# Check content of the stories file
cat libs/shared/ui/button/button.stories.tsx

# Check if there are any test files with different extensions
fd -e test.ts -e test.jsx -e spec.ts -e spec.jsx button

# Look for viewport configurations in the stories
rg -A 5 "parameters.*viewport" libs/shared/ui/button/button.stories.tsx

Length of output: 2267


Script:

#!/bin/bash
# Look for testing utilities and accessibility testing setup
rg -l "testing-library|jest|vitest|cypress" package.json
rg -l "@storybook/addon-a11y" package.json

# Check for any existing accessibility tests
rg -l "aria|role|accessibility" libs/shared/ui/button/

Length of output: 258


Script:

#!/bin/bash
# Check package.json for test setup details
cat package.json | jq '.dependencies, .devDependencies'

# Check if there are any test setup files
fd -e setup.ts -e setup.js -e config.ts -e config.js test

# Look for accessibility-related code in button files
rg "aria-|role=|accessibility" libs/shared/ui/button/button.tsx libs/shared/ui/button/button.stories.tsx

Length of output: 4467

libs/shared/ui/typography/typography.stories.tsx (1)

55-63: Consider extracting variant types to reduce duplication

To improve maintainability, consider extracting the variant options to a shared constant or type. This would prevent potential inconsistencies when variants are added or removed.

+const TYPOGRAPHY_VARIANTS = [
+  'h1',
+  'h2',
+  'h3',
+  'h4',
+  'h5',
+  'h6',
+  'paragraph-base',
+  'paragraph-sm',
+  'paragraph-xs',
+] as const;
+
+type TypographyVariant = typeof TYPOGRAPHY_VARIANTS[number];

-function createVariantStory(variant: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'paragraph-base' | 'paragraph-sm' | 'paragraph-xs'): Story {
+function createVariantStory(variant: TypographyVariant): Story {
   // ... rest of the function
}

// Update argTypes to use the same constant
argTypes: {
  variant: {
    control: {
      type: 'select',
-     options: [
-       'h1',
-       'h2',
-       // ...
-     ],
+     options: TYPOGRAPHY_VARIANTS,
    },
    // ... rest of the configuration
  },
}
libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (3)

9-12: Consider adding type refinements and validation.

The interface could benefit from:

  1. More specific types for text content (e.g., non-empty string)
  2. Runtime validation for required fields

Consider this improvement:

+import { z } from 'zod'

+const TextSchema = z.object({
+  content: z.string().min(1),
+  isCallToAction: z.boolean()
+})

 interface SponsorshipContainerProps {
-  text: { content: string, isCallToAction: boolean }[]
+  text: z.infer<typeof TextSchema>[]
   sponsors: { present: Sponsor[], past: Sponsor[] }
 }

33-37: Create an issue for implementing Toast functionality.

The TODO comment should be tracked in the issue system for better visibility and tracking.

Would you like me to create a GitHub issue for implementing the Toast functionality for the email copy feature?


44-55: Add error boundary for sponsor sections.

The conditional rendering of sponsor sections should be wrapped in an error boundary to gracefully handle rendering failures.

+import { ErrorBoundary } from '@cuhacking/shared/ui/error-boundary'

 <div className="flex flex-col gap-y-5">
+  <ErrorBoundary fallback={<div>Failed to load sponsors</div>}>
     {sponsors.present.length
       ? (
           <SponsorPresenter isPresent sponsors={sponsors.present} />
         )
       : null}
     {sponsors.past.length
       ? (
           <SponsorPresenter isPresent={false} sponsors={sponsors.past} />
         )
       : null}
+  </ErrorBoundary>
 </div>
libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (2)

84-84: Fix typo in alt text

There's a typo in the hamburger icon's alt text.

-    alt: 'Hambuger icon',
+    alt: 'Hamburger icon',

Add test coverage for the navbar component

The codebase currently lacks test coverage for the navbar component. Given that:

  • No test files exist for the navbar functionality
  • The component has both presenter and container implementations
  • It manages critical navigation state and social links

Required test coverage:

  • Unit tests for navbar.constants.ts to verify link structures
  • Integration tests for navbar.container.tsx to validate mobile/desktop behavior
  • Storybook stories exist (navbar.presenter.stories.tsx), but automated tests are needed
🔗 Analysis chain

Line range hint 1-90: Add tests for navbar functionality

According to the PR objectives, tests are missing. As the navbar is a critical navigation component, please ensure:

  1. Unit tests for the navbar constants
  2. Integration tests for mobile and desktop navigation
  3. Cross-browser compatibility tests

Let's check if there are any existing tests:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for navbar-related test files
fd -e spec.ts -e spec.tsx -e test.ts -e test.tsx . | grep -i navbar

# Search for any existing test imports of navbar constants
rg -l "navbar.constants" | grep -i "test\|spec"

Length of output: 117


Script:

#!/bin/bash
# Let's try a broader search to find any test files in the website directory
fd -e spec.ts -e spec.tsx -e test.ts -e test.tsx . libs/website/

# Check if there's a test directory structure
fd -t d "test" -t d "__tests__" libs/website/

# Look for any imports or usage of navbar component
rg -l "navbar" libs/website/ 

Length of output: 376

libs/website/feature/events/ui/event-item/event-item.tsx (3)

24-25: Consider improving the formatting of the conditional assignment.

The multi-line assignment could be more readable.

-  const buttonMessage
-    = event.status === 'upcoming' ? 'REGISTER NOW' : 'VIEW PHOTOS'
+  const buttonMessage = event.status === 'upcoming' 
+    ? 'REGISTER NOW' 
+    : 'VIEW PHOTOS'

27-32: Consider adding ARIA attributes for better accessibility.

While the card implementation is good, consider adding appropriate ARIA attributes to improve accessibility.

 <GlassmorphicCard
   variant="nested"
+  role="article"
+  aria-label={`Event: ${event.title}`}
   className={cn(
     'flex flex-col lg:flex-row px-3 py-4 gap-x-3 gap-y-2.5 items-center h-full',
     className,
   )}
 >

1-1: Add unit tests for the EventItem component.

As per the PR objectives, tests are required. Consider adding unit tests to verify:

  1. Correct rendering of event details
  2. Responsive behavior
  3. Button state based on event status
  4. Link behavior

Would you like me to help generate the test suite for this component?

libs/website/ui/introduction/welcome/welcome.stories.tsx (1)

53-66: Consider enhancing the decorator implementation

While the Remix stub setup is good, consider these improvements:

  1. Add comments explaining the purpose of the redirect behavior
  2. Consider making the redirect path configurable through story parameters

Here's a suggested enhancement:

  decorators: [
    (story) => {
+     // Set up Remix stub with redirect handling for navigation simulation
      const remixStub = createRemixStub([
        {
          path: '/*',
-         action: () => ({ redirect: '/' }),
-         loader: () => ({ redirect: '/' }),
+         action: () => ({ redirect: window?.location?.pathname ?? '/' }),
+         loader: () => ({ redirect: window?.location?.pathname ?? '/' }),
          Component: () => story(),
        },
      ])

      return remixStub({ initialEntries: ['/'] })
    },
  ],
libs/website/shared/ui/socials/social.stories.tsx (1)

22-35: Consider enhancing the Remix stub configuration.

While the basic setup works, consider these improvements:

  1. Use a specific route instead of catch-all to match real routing
  2. Add test cases for error states and loading states
  3. Test actual route behavior instead of always redirecting
  decorators: [
    (story) => {
      const remixStub = createRemixStub([
        {
-         path: '/*',
+         path: '/socials',
          action: () => ({ redirect: '/' }),
-         loader: () => ({ redirect: '/' }),
+         loader: () => ({
+           // Mock actual data structure
+           socials: [
+             { link: 'https://discord.com', media: { /* ... */ } },
+             // ... other social links
+           ]
+         }),
          Component: () => story(),
        },
+       {
+         path: '/socials/error',
+         loader: () => { throw new Error('Test error state') },
+         Component: () => story(),
+       }
      ])

-     return remixStub({ initialEntries: ['/'] })
+     return remixStub({ initialEntries: ['/socials'] })
    },
  ],
libs/website/ui/faq/faq-presenter/faq.presenter.tsx (2)

8-10: Add JSDoc documentation and improve type safety

Consider enhancing the interface with documentation and readonly properties:

+/**
+ * Props for the FAQPresenter component
+ * @property {ReadonlyArray<{readonly question: string, readonly answers: ReadonlyArray<string>}>} questions - Array of FAQ items
+ */
 interface FAQPresenterProps {
-  questions: { question: string, answers: string[] }[]
+  readonly questions: ReadonlyArray<{
+    readonly question: string;
+    readonly answers: ReadonlyArray<string>;
+  }>;
 }

38-65: Refactor repeated link styling pattern

The social links section contains repeated styling code that could be abstracted.

interface SocialLink {
  to: string;
  hoverColor: string;
  children: React.ReactNode;
}

const SocialLink: React.FC<SocialLink> = ({ to, hoverColor, children }) => (
  <Link
    to={to}
    target="_blank"
    className={`underline hover:text-${hoverColor}-400 hover:underline decoration-${hoverColor}-400 duration-300`}
  >
    {children}
  </Link>
);
libs/website/shared/ui/navigation/footer/ui/footer.stories.tsx (3)

19-32: Consider expanding test scenarios in the decorator.

While the current setup works, consider adding more specific test scenarios instead of using a catch-all route with redirects. This would help catch potential routing issues early.

 decorators: [
   (story) => {
     const remixStub = createRemixStub([
       {
-        path: '/*',
+        path: '/',
         action: () => ({ redirect: '/' }),
-        loader: () => ({ redirect: '/' }),
+        loader: () => ({ success: true }),
         Component: () => story(),
       },
+      {
+        path: '/about',
+        loader: () => ({ success: true }),
+        Component: () => story(),
+      },
     ])

     return remixStub({ initialEntries: ['/'] })
   },
 ],

Line range hint 1-106: Additional test coverage needed for website v1.

While this Storybook story provides component testing, the PR checklist indicates missing tests and documentation. Consider:

  1. Adding unit tests for the FooterPresenter component
  2. Including integration tests for the navigation flow
  3. Documenting the footer component's usage and props
  4. Testing across mobile, tablet, and desktop platforms as mentioned in the PR objectives

Would you like help generating:

  • Unit tests for the FooterPresenter?
  • Integration tests for navigation?
  • Component documentation?

Social media URLs need to be configured in both stories and constants

The review comment is valid as placeholder/incomplete URLs are found in both the stories file and the actual implementation in footer.constants.ts. The constants file uses generic URLs like 'https://instagram.com' and 'mailto:[email protected]' which also need to be updated with the organization's actual social media profiles.

🔗 Analysis chain

Line range hint 46-106: Replace placeholder social media URLs with actual endpoints.

The social media configuration contains template URLs (e.g., 'https://discord.com/invite/your-discord', 'https://docs.yourwebsite.com'). These should be replaced with actual endpoints before the website goes live.

Let's verify if these placeholder URLs exist elsewhere in the codebase:


Since this is a .stories.tsx file, which is typically used for Storybook component documentation and testing, having placeholder URLs is actually a common and acceptable practice. Let me verify this by checking if there's a separate footer component file that contains the actual production URLs:


Let me check the actual footer component and constants files to see where the production URLs are defined:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for placeholder URLs to ensure they're not used elsewhere
rg -l "yourwebsite\.com|your-discord|your-org|your-linktree" --type-add 'story:*.stories.*' --type story

Length of output: 169


Script:

#!/bin/bash
# Look for the actual footer component file
fd footer "libs/website/shared/ui/navigation" --type f --exclude "*.stories.*"

# Also check for any other potential files that might contain the actual social media URLs
rg -l "discord\.com/invite|docs\.|github\.com|instagram\.com|linkedin\.com|linktree\.com" --type typescript --type tsx --exclude "*.stories.*"

Length of output: 771


Script:

#!/bin/bash
# Check the content of the footer constants and presenter files
cat libs/website/shared/ui/navigation/footer/constants/footer.constants.ts
cat libs/website/shared/ui/navigation/footer/ui/footer.presenter.tsx

Length of output: 2914

libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.stories.tsx (2)

107-107: Track the cross animation issue

The TODO comment indicates an unresolved animation issue that should be addressed before the v1 release.

Would you like me to:

  1. Create a GitHub issue to track this animation bug?
  2. Help investigate and propose a fix for the animation?

Line range hint 1-125: Enhance test coverage before v1 release

Given this is a website v1 release, consider adding:

  1. Visual regression tests using Storybook's built-in test-runner
  2. Responsive design tests for mobile, tablet, and desktop viewports
  3. Interaction tests for the navbar's mobile menu functionality

Example configuration for visual regression tests in your Storybook:

// Add to your story metadata
parameters: {
  chromatic: {
    viewports: [320, 768, 1024],
    diffThreshold: 0.2
  }
}
libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (4)

38-38: Address technical debt: Drawer component refactoring needed

The TODO comment indicates pending technical debt. Consider extracting the drawer logic into a separate component to improve maintainability and separation of concerns.

Would you like me to help create a new NavbarDrawer component to handle this separation?


Line range hint 20-23: Consider moving Media interface to shared types

The Media interface is used in multiple places (logo, socials, hamburger, cross). Consider moving it to a shared types file to promote reusability and maintain DRY principles.

Also applies to: 35-37


54-58: Adjust logo hover animation and enhance accessibility

The current implementation has two concerns:

  1. The hover scale of 1.2 might be too aggressive and could cause layout shifts
  2. The image should have a more descriptive alt text than just "cuHacking logo"
 <img
   src={logo}
-  alt="cuHacking logo"
+  alt="cuHacking - Return to Home Page"
   className="transition-transform duration-300 hover:scale-[1.2] relative z-[60]"
 />

69-106: Consider enhancing mobile drawer with touch gestures

The mobile drawer could benefit from swipe gestures for a more native feel. Consider adding swipe-to-close functionality using a library like react-swipeable.

libs/shared/ui/navigation-menu/navigation-menu.tsx (2)

Line range hint 66-82: Enhance accessibility for navigation trigger

While the implementation looks good, consider these accessibility improvements:

  1. Add aria-expanded attribute to indicate menu state
  2. Ensure keyboard focus indicators are visible in all states
 <NavigationMenuPrimitive.Trigger
   ref={ref}
   className={cn(navigationMenuTriggerStyle(), 'group', className)}
+  aria-expanded={props['data-state'] === 'open'}
   {...props}
 >
   {children}{' '}
   <ChevronDown
     className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
-    aria-hidden="true"
+    aria-hidden="true"
+    aria-label="Toggle menu"
   />
 </NavigationMenuPrimitive.Trigger>

Line range hint 1-144: Add comprehensive test coverage for navigation component

As a critical navigation component, we should add:

  1. Unit tests for state management
  2. Integration tests for keyboard navigation
  3. Visual regression tests for animation states
  4. Cross-browser compatibility tests

Would you like me to help create:

  1. A test suite using React Testing Library
  2. Visual regression tests using Storybook
  3. Keyboard navigation test scenarios
libs/shared/ui/icon/icon.stories.tsx (1)

32-45: Consider enhancing the Remix stub configuration.

The current decorator implementation could be improved in several ways:

  1. The catch-all route pattern '/*' with root redirects might oversimplify the testing environment
  2. No error states or loading states are being tested
  3. The stub configuration could prevent testing real-world scenarios

Consider this enhanced implementation:

  decorators: [
    (story) => {
      const remixStub = createRemixStub([
        {
-         path: '/*',
-         action: () => ({ redirect: '/' }),
-         loader: () => ({ redirect: '/' }),
+         path: '/',
+         action: async () => ({ success: true }),
+         loader: async () => ({ status: 'ok' }),
          Component: () => story(),
+         errorElement: () => <div>Error state</div>,
        },
      ])

-     return remixStub({ initialEntries: ['/'] })
+     return remixStub({
+       initialEntries: ['/'],
+       hydrationData: { status: 'ok' }
+     })
    },
  ],
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 7404ef8 and a338bfd.

⛔ Files ignored due to path filters (2)
  • libs/shared/assets/icons/general/cross-1.svg is excluded by !**/*.svg
  • libs/shared/assets/icons/socials/linkedin-white-1.svg is excluded by !**/*.svg
📒 Files selected for processing (69)
  • .gitignore (1 hunks)
  • .storybook/main.ts (1 hunks)
  • apps/website/app/root.tsx (1 hunks)
  • apps/website/app/routes/_index.tsx (1 hunks)
  • libs/shared/ui/accordion/accordion.tsx (2 hunks)
  • libs/shared/ui/button/button.stories.tsx (1 hunks)
  • libs/shared/ui/button/button.tsx (2 hunks)
  • libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx (2 hunks)
  • libs/shared/ui/icon/icon.stories.tsx (1 hunks)
  • libs/shared/ui/icon/icon.tsx (2 hunks)
  • libs/shared/ui/navigation-menu/navigation-menu.tsx (1 hunks)
  • libs/shared/ui/separator/separator.tsx (1 hunks)
  • libs/shared/ui/terminal-text/terminal-text.tsx (2 hunks)
  • libs/shared/ui/typography/typgoraphy.tsx (1 hunks)
  • libs/shared/ui/typography/typography.stories.tsx (1 hunks)
  • libs/shared/utils/ErrorBoundary.tsx (1 hunks)
  • libs/website/feature/events/ui/event-item/event-item.tsx (3 hunks)
  • libs/website/feature/events/ui/event-presenter/event-presenter.tsx (1 hunks)
  • libs/website/feature/events/ui/event.section.tsx (1 hunks)
  • libs/website/feature/faq/constants/faq.constants.ts (0 hunks)
  • libs/website/feature/faq/index.ts (0 hunks)
  • libs/website/feature/faq/ui/faq-item/faq-item.tsx (0 hunks)
  • libs/website/feature/faq/ui/faq-presenter/faq.presenter.stories.tsx (0 hunks)
  • libs/website/feature/faq/ui/faq-presenter/faq.presenter.tsx (0 hunks)
  • libs/website/feature/introduction/index.ts (0 hunks)
  • libs/website/feature/introduction/ui/mission/mission.stories.tsx (0 hunks)
  • libs/website/feature/introduction/ui/mission/spline-mission.client.tsx (0 hunks)
  • libs/website/feature/introduction/ui/welcome/spline-welcome.client.tsx (0 hunks)
  • libs/website/feature/sponsorship/index.ts (0 hunks)
  • libs/website/feature/sponsorship/ui/sponsorship-presenter/sponsorship.presenter.tsx (0 hunks)
  • libs/website/feature/stats/index.ts (0 hunks)
  • libs/website/layouts/base.tsx (2 hunks)
  • libs/website/pages/home.tsx (1 hunks)
  • libs/website/project.json (1 hunks)
  • libs/website/shared/ui/navigation/footer/constants/footer.constants.ts (3 hunks)
  • libs/website/shared/ui/navigation/footer/ui/footer.presenter.tsx (2 hunks)
  • libs/website/shared/ui/navigation/footer/ui/footer.stories.tsx (1 hunks)
  • libs/website/shared/ui/navigation/index.ts (1 hunks)
  • libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (5 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/nav-item-mobile.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/nav-item.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.stories.tsx (4 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (2 hunks)
  • libs/website/shared/ui/socials/social.stories.tsx (2 hunks)
  • libs/website/shared/ui/socials/socials.tsx (2 hunks)
  • libs/website/shared/ui/spline/spline.client.tsx (1 hunks)
  • libs/website/ui/faq/constants/faq.constants.ts (1 hunks)
  • libs/website/ui/faq/faq-item/faq-item.tsx (1 hunks)
  • libs/website/ui/faq/faq-presenter/faq.presenter.stories.tsx (1 hunks)
  • libs/website/ui/faq/faq-presenter/faq.presenter.tsx (1 hunks)
  • libs/website/ui/faq/faq.section.tsx (1 hunks)
  • libs/website/ui/faq/index.ts (1 hunks)
  • libs/website/ui/introduction/constants/welcome.constants.ts (1 hunks)
  • libs/website/ui/introduction/index.ts (1 hunks)
  • libs/website/ui/introduction/mission/mission.section.tsx (1 hunks)
  • libs/website/ui/introduction/mission/mission.stories.tsx (1 hunks)
  • libs/website/ui/introduction/mission/mission.tsx (1 hunks)
  • libs/website/ui/introduction/welcome/welcome.section.tsx (1 hunks)
  • libs/website/ui/introduction/welcome/welcome.stories.tsx (2 hunks)
  • libs/website/ui/introduction/welcome/welcome.tsx (2 hunks)
  • libs/website/ui/sponsorship/index.ts (1 hunks)
  • libs/website/ui/sponsorship/sponsor-presenter/sponsor-item.tsx (2 hunks)
  • libs/website/ui/sponsorship/sponsor-presenter/sponsor.presenter.tsx (2 hunks)
  • libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (1 hunks)
  • libs/website/ui/sponsorship/sponsorship-section.tsx (1 hunks)
  • libs/website/ui/stats/index.ts (1 hunks)
  • libs/website/ui/stats/stats-presenter/stats.presenter.tsx (1 hunks)
  • libs/website/ui/stats/stats.section.tsx (1 hunks)
💤 Files with no reviewable changes (12)
  • libs/website/feature/faq/constants/faq.constants.ts
  • libs/website/feature/faq/index.ts
  • libs/website/feature/faq/ui/faq-item/faq-item.tsx
  • libs/website/feature/faq/ui/faq-presenter/faq.presenter.stories.tsx
  • libs/website/feature/faq/ui/faq-presenter/faq.presenter.tsx
  • libs/website/feature/introduction/index.ts
  • libs/website/feature/introduction/ui/mission/mission.stories.tsx
  • libs/website/feature/introduction/ui/mission/spline-mission.client.tsx
  • libs/website/feature/introduction/ui/welcome/spline-welcome.client.tsx
  • libs/website/feature/sponsorship/index.ts
  • libs/website/feature/sponsorship/ui/sponsorship-presenter/sponsorship.presenter.tsx
  • libs/website/feature/stats/index.ts
✅ Files skipped from review due to trivial changes (18)
  • .gitignore
  • apps/website/app/root.tsx
  • apps/website/app/routes/_index.tsx
  • libs/shared/ui/button/button.stories.tsx
  • libs/shared/ui/icon/icon.tsx
  • libs/website/feature/events/ui/event-presenter/event-presenter.tsx
  • libs/website/pages/home.tsx
  • libs/website/project.json
  • libs/website/ui/faq/faq-presenter/faq.presenter.stories.tsx
  • libs/website/ui/faq/faq.section.tsx
  • libs/website/ui/faq/index.ts
  • libs/website/ui/introduction/index.ts
  • libs/website/ui/introduction/mission/mission.tsx
  • libs/website/ui/sponsorship/index.ts
  • libs/website/ui/sponsorship/sponsorship-section.tsx
  • libs/website/ui/stats/index.ts
  • libs/website/ui/stats/stats-presenter/stats.presenter.tsx
  • libs/website/ui/stats/stats.section.tsx
🔇 Additional comments (51)
libs/website/shared/ui/navigation/index.ts (1)

4-4: Verify the migration from NavbarPresenter to NavbarContainer

The architectural change from Presenter to Container pattern needs careful verification to ensure all consumers have been updated.

✅ Verification successful

Migration from NavbarPresenter to NavbarContainer appears correct

The verification shows a clean implementation of the Container pattern where:

  • NavbarPresenter is properly encapsulated within NavbarContainer
  • NavbarContainer is correctly imported in the layout component
  • No unexpected or outdated references to NavbarPresenter exist
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining references to NavbarPresenter
# and verify NavbarContainer usage

# Check for any remaining NavbarPresenter references
echo "Checking for remaining NavbarPresenter references:"
rg "NavbarPresenter"

# Check NavbarContainer usage
echo -e "\nVerifying NavbarContainer usage:"
rg "NavbarContainer"

Length of output: 1311

libs/website/shared/ui/navigation/navbar/ui/nav-item-mobile.tsx (1)

1-14: Add component tests and verify cross-platform compatibility.

According to the PR objectives, tests are missing and cross-platform verification hasn't been done. Please ensure:

  1. Add unit tests for the MobileNavItem component
  2. Test the component's behavior across different mobile devices and screen sizes
  3. Verify the onClick behavior works correctly on touch devices

Run the following script to check for existing tests and responsive design utilities:

libs/website/shared/ui/spline/spline.client.tsx (1)

1-4: LGTM! Imports are well-organized and necessary.

All imports are being used and follow a logical organization (utilities, error handling, external dependencies, and React core).

libs/website/layouts/base.tsx (2)

26-29: LGTM! Clean and consistent formatting

The FooterPresenter implementation maintains good practices by:

  • Using constants for configuration
  • Consistent prop formatting

1-6: Verify the architectural change from Presenter to Container pattern

The switch from NavbarPresenter to NavbarContainer suggests a shift in architectural patterns. Container components typically handle state and business logic, while presenters are usually stateless.

libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (1)

22-40: Verify mobile and tablet compatibility

The PR objectives mention that cross-platform testing hasn't been completed.

✅ Verification successful

Mobile and tablet compatibility implementation verified

The navbar implementation shows proper responsive design patterns:

  • Desktop: Navigation menu with horizontal layout (md:block)
  • Mobile/Tablet: Hamburger menu with drawer implementation
  • Proper responsive breakpoints using Tailwind's md: prefix
  • Mobile-specific components with touch-friendly sizing (48px text)
  • Accessible mobile navigation with proper ARIA labels
  • Smooth transitions and animations for menu interactions

The implementation includes all necessary components for cross-platform compatibility:

  • Drawer component for mobile menu
  • Mobile-specific navigation items
  • Hamburger/cross icons with proper touch targets
  • Responsive visibility classes
  • Backdrop blur effects for better mobile UX
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for responsive design implementations
echo "Checking for responsive design patterns..."
rg -l "sm:|md:|lg:" --type tsx

# Search for media query implementations
echo "Checking for media queries..."
rg "@media" --type css --type scss --type tsx

# Search for mobile-specific handlers
echo "Checking for touch/mobile event handlers..."
rg "onTouch|onClick" --type tsx

Length of output: 458


Script:

#!/bin/bash
# Search for responsive design implementations using correct file extensions
echo "Checking for responsive design patterns..."
rg -l "sm:|md:|lg:"

# Search for media query implementations
echo "Checking for media queries..."
rg "@media"

# Search for mobile-specific handlers and responsive classes
echo "Checking for touch/mobile event handlers and responsive classes..."
rg -A 2 "onClick|onTouch|hidden sm:|block sm:|flex sm:|grid sm:"

# Search specifically in the navbar component and related files
echo "Checking navbar-specific responsive implementations..."
fd navbar --exec rg -l "sm:|md:|lg:|@media|onClick|onTouch|hidden|block|flex|grid"

Length of output: 4444


Script:

#!/bin/bash
# Let's examine the navbar presenter implementation for mobile responsiveness
echo "Checking navbar presenter implementation..."
rg -A 10 "className" libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx

# Check mobile navigation implementation
echo "Checking mobile navigation implementation..."
cat libs/website/shared/ui/navigation/navbar/ui/nav-item-mobile.tsx

# Check for any drawer or mobile menu components used
echo "Checking drawer/mobile menu usage in navbar..."
rg -A 5 "Drawer|Menu|mobile" libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx

Length of output: 4805

libs/website/ui/sponsorship/sponsor-presenter/sponsor.presenter.tsx (2)

2-2: LGTM! Import path simplification looks good.

The simplified import path improves code maintainability.


16-20: Please verify responsive layout across platforms

The layout changes look good, but according to the PR objectives, cross-platform testing hasn't been completed. Please verify the sponsor grid layout works correctly across:

  • Mobile devices
  • Tablets
  • Desktop screens

Key areas to check:

  • Sponsor grid alignment and wrapping
  • Spacing between sponsor items
  • Left padding on larger screens

Consider adding Storybook viewport tests to automate cross-platform verification:

// Example Storybook story with viewport tests
export default {
  title: 'Sponsorship/SponsorPresenter',
  component: SponsorPresenter,
  parameters: {
    viewport: {
      viewports: {
        mobile: { width: 320, height: 568 },
        tablet: { width: 768, height: 1024 },
        desktop: { width: 1024, height: 768 },
      },
      defaultViewport: 'desktop'
    }
  }
}
libs/shared/utils/ErrorBoundary.tsx (1)

12-19: LGTM! Clean and type-safe implementation

The class declaration and constructor follow React best practices with proper TypeScript generic types.

libs/website/ui/introduction/welcome/welcome.section.tsx (1)

10-10: Verify responsive design across devices

The PR objectives indicate that mobile testing hasn't been completed. Please verify the following responsive behaviors:

  • Spline component positioning (-bottom-16 on mobile vs lg:top-0 on desktop)
  • Container padding adjustments (px-5 py-5 vs lg:px-20 lg:py-14)
  • Section width changes (w-full vs lg:w-3/5)

Also applies to: 13-13, 18-18

✅ Verification successful

Responsive design patterns are consistent with codebase standards

The responsive implementation in the welcome section follows established patterns found across the codebase:

  • Container padding (px-5 py-5 lg:px-20 lg:py-14) matches other sections like stats, sponsorship, and FAQ
  • Section width changes (w-full lg:w-3/5) align with responsive layout patterns
  • Spline component positioning (-bottom-16 lg:left-0 lg:top-0) follows similar responsive adjustments seen in event and mission sections
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other responsive classes in the codebase to ensure consistency
rg "lg:[a-zA-Z0-9:-]+" --type tsx

Length of output: 63


Script:

#!/bin/bash
# Search for responsive classes using ripgrep without file type restriction
rg "lg:[a-zA-Z0-9:-]+"

# Also search for mobile-specific classes to verify responsive patterns
rg "(sm:|md:)[a-zA-Z0-9:-]+"

# Look for the specific welcome section file to analyze its responsive patterns
fd "welcome.section" --type f --exec cat {}

Length of output: 8788

libs/website/ui/faq/faq-item/faq-item.tsx (2)

1-7: LGTM! Well-organized imports using shared UI components.

The imports are clean and properly structured, making good use of the shared UI component library.


1-33: Verify consistency with existing FAQ implementations.

Let's check if there are similar FAQ implementations in the codebase to ensure consistency.

✅ Verification successful

Let me try a different search strategy to find FAQ-related components and their implementations.


Let me try one final search strategy without specifying file types explicitly.


Let me try one last search with basic grep to find related implementations.


Let me check the content of the related FAQ components to verify consistency.


Implementation is consistent with existing FAQ components

The FAQItem component is correctly implemented and follows the established pattern in the codebase. It's properly integrated with the FAQPresenter component and uses the same shared UI components (Accordion, TerminalText) consistently. The component structure matches the stories and usage patterns shown in the FAQ section.

Points worth noting:

  • Component is used within FAQPresenter for rendering FAQ items
  • Follows the same styling and structure as other accordion items
  • Uses shared UI components consistently
  • Has Storybook integration for component development
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for similar FAQ implementations
echo "Searching for similar FAQ components..."
rg -t tsx -t jsx "FAQ" --type-add 'tsx:*.{tsx,jsx}'

# Search for existing test patterns
echo "Checking existing test patterns..."
fd -e test.tsx -e test.jsx -e spec.tsx -e spec.jsx

Length of output: 373


Script:

#!/bin/bash
# Search for FAQ-related files and components with ripgrep
echo "Searching for FAQ-related files..."
rg -t tsx "FAQ|faq" -l

# Search for AccordionItem usage patterns
echo "Checking AccordionItem usage patterns..."
rg -t tsx "AccordionItem" -A 2 -B 2

# Look for test files in the website/ui directory
echo "Checking for test files in website/ui..."
fd -e test.tsx -e spec.tsx . libs/website/ui/

Length of output: 425


Script:

#!/bin/bash
# Search for FAQ-related files
echo "Searching for FAQ-related files..."
rg "FAQ|faq" --type-not=git --type-not=lock

# Search for AccordionItem implementations
echo "Searching for AccordionItem patterns..."
rg "AccordionItem" --type-not=git --type-not=lock

# Find all TypeScript/React test files
echo "Looking for test files..."
fd ".*\.(test|spec)\.(tsx?|jsx?)$"

Length of output: 622


Script:

#!/bin/bash
# Simple search for FAQ files and implementations
find . -type f -name "*.tsx" -o -name "*.jsx" | xargs grep -l "FAQ\|faq"

# Search for accordion implementations
find . -type f -name "*.tsx" -o -name "*.jsx" | xargs grep -l "Accordion"

# Check content of the website test file we found
cat apps/website/tests/routes/_index.spec.tsx

Length of output: 1232


Script:

#!/bin/bash
# Check content of FAQ presenter and section
echo "=== FAQ Presenter ==="
cat ./libs/website/ui/faq/faq-presenter/faq.presenter.tsx

echo -e "\n=== FAQ Section ==="
cat ./libs/website/ui/faq/faq.section.tsx

echo -e "\n=== FAQ Presenter Stories ==="
cat ./libs/website/ui/faq/faq-presenter/faq.presenter.stories.tsx

Length of output: 4312

libs/website/feature/events/ui/event.section.tsx (4)

9-9: LGTM: Semantic class naming

The addition of relative class is appropriate for absolute positioning context of the SplineComponent.


19-19: Review viewport units usage

The negative bottom positioning (-bottom-[15vh] and -bottom-[5vh]) combined with scale transformations might cause layout issues on certain viewport sizes.

Consider using more stable positioning methods or adding additional breakpoints for better control.


15-22: Review required: Performance and accessibility implications

Several concerns need to be addressed:

  1. The external Spline scene might impact page load performance
  2. The negative z-index could affect interactive elements
  3. The responsive scaling might need testing across different devices

Consider:

  1. Adding loading states
  2. Testing interaction with overlapping elements
  3. Verifying mobile performance

1-1: Verify the security of external dependencies

The addition of new dependencies requires security verification:

  1. @website/shared/ui/spline/spline.client - Internal dependency
  2. remix-utils/client-only - External dependency

Also applies to: 3-3

✅ Verification successful

Let me gather more information about the SplineComponent implementation since the previous command didn't yield results.


Let me check the Spline component implementation and its dependencies one more time to ensure we have all security-related information.


Based on the gathered information, I can now provide the final response:

External dependencies are properly scoped and secure

The SplineComponent implementation is properly secured through:

  • Client-side only rendering via remix-utils/client-only
  • Error boundary and Suspense wrapper for graceful failure handling
  • Scoped to specific trusted Spline URLs from prod.spline.design
  • @splinetool/react-spline is a verified dependency in package.json

The component is used consistently across the codebase with similar security patterns in:

  • events/ui/event.section.tsx
  • introduction/welcome/welcome.section.tsx
  • introduction/mission/mission.section.tsx
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for security advisories in remix-utils
gh api graphql -f query='
{
  securityVulnerabilities(first: 5, ecosystem: NPM, package: "remix-utils") {
    nodes {
      advisory {
        summary
        severity
        publishedAt
      }
      vulnerableVersionRange
    }
  }
}'

# Verify the spline component implementation
ast-grep --pattern 'export function SplineComponent' -A 10

Length of output: 349


Script:

#!/bin/bash
# Search for SplineComponent definition with a broader pattern
ast-grep --pattern 'export $_ SplineComponent'

# Also search for any file containing SplineComponent
rg "SplineComponent" -A 5

# Look for spline-related configuration or URL patterns
rg "spline\.design|spline\.runtime" -A 2

Length of output: 5298


Script:

#!/bin/bash
# Check the actual Spline component implementation
rg -A 10 "function Spline"

# Look for package.json to verify spline-related dependencies
fd package.json --exec cat {} | jq '.dependencies,.devDependencies' 2>/dev/null

# Check if there's any security configuration for external resources
rg -i "content.*security.*policy|csp" -A 3

Length of output: 9119

libs/website/ui/introduction/mission/mission.section.tsx (2)

19-22: Verify responsive layout across devices

The significant difference in min-height between mobile (160vh) and desktop (100vh) needs validation:

  1. The 160vh height on mobile could cause excessive scrolling
  2. According to PR objectives, cross-platform testing is pending

Please test this component across various device sizes and orientations to ensure optimal layout.


1-1: Verify the import path changes across the codebase

The import path for MISSION_CONSTANTS has been updated. Let's ensure this change is consistent with the project structure.

Also applies to: 4-4

✅ Verification successful

Import path changes are correct and consistent

The import path change from '../../constants/mission.constants' to '../constants/mission.constants' is verified to be correct. The file exists at libs/website/ui/introduction/constants/mission.constants.ts and the new import path in mission.section.tsx correctly reflects its relative location. No other files in the codebase are importing this constants file, so there are no consistency issues to address.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence and usage of mission.constants
# Check if the file exists at the new location
fd mission.constants

# Check for any remaining old import paths
rg "from '../../constants/mission.constants'" 

Length of output: 136


Script:

#!/bin/bash
# Check all imports of mission.constants to verify consistency
rg "from.*mission\.constants"

# Check the content and location of the constants file
fd -t f mission.constants -x cat {}

Length of output: 324

libs/website/shared/ui/socials/socials.tsx (2)

2-4: LGTM! Import paths are well-structured

The updated import paths follow a consistent pattern and properly separate concerns between UI components and utilities.


25-29: Verify animation performance on mobile devices

The hover animation looks smooth, but should be tested across different devices to ensure good performance.

Consider adding a media query to disable hover effects on touch devices:

- className="transition-transform duration-300 hover:scale-[1.2]"
+ className="transition-transform duration-300 @media(hover: hover){hover:scale-[1.2]}"
libs/website/ui/introduction/mission/mission.stories.tsx (1)

1-4: LGTM! Imports are well-structured.

The imports are properly organized and use appropriate path aliases.

libs/website/shared/ui/navigation/footer/ui/footer.presenter.tsx (2)

2-2: LGTM! Good use of Remix Link component

The change from HTML anchor to Remix's Link component is a good practice for Single Page Applications, providing better client-side navigation.


Line range hint 15-31: Verify responsive behavior across devices

The PR objectives mention that cross-platform testing is incomplete. The footer uses flex-col on mobile and flex-row on larger screens, but this needs verification.

libs/shared/ui/terminal-text/terminal-text.tsx (1)

25-25: Verify the visual impact of alignment change.

The alignment change from items-center to items-start could affect the component's appearance. Since this is for website v1 completion, please ensure this has been tested across different screen sizes and content lengths.

Would you like me to create a GitHub issue to track the cross-device testing requirement mentioned in the PR checklist?

libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx (3)

29-33: LGTM! Function signature reformatting improves readability

The function signature reformatting follows good practices by placing each prop on a new line, making it more maintainable.


Line range hint 12-24: Consider adding fallback styles for backdrop-blur

The backdrop-blur-md class might not be supported in all browsers. Consider adding fallback styles for better cross-browser compatibility.

Consider adding a fallback background color or opacity:

 const glassmorphicCardVariants = cva(
-  'relative border backdrop-blur-md rounded-xl shadow-dropShadow border-border',
+  'relative border backdrop-blur-md bg-opacity-80 rounded-xl shadow-dropShadow border-border',
   {

3-3: Verify the internal cn utility implementation

The import path has been changed from an external utility to an internal one. Let's verify the implementation exists and matches the expected functionality.

✅ Verification successful

Import change is safe to proceed

The cn utility implementation in @cuhacking/shared/utils/cn is identical to the original implementation in @shadcn/lib/utils, using the same dependencies (clsx and tailwind-merge) with exactly the same functionality. The change is simply moving from an external utility to an internal one with the same implementation.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the cn utility implementation exists and matches the expected functionality

# Check if the cn utility exists
ast-grep --pattern 'export function cn($$$)' 

# Check for any other usages of the cn utility
rg -l "from ['\"]\@cuhacking/shared/utils/cn['\"]"

Length of output: 219


Script:

#!/bin/bash
# Let's try a different approach to verify the cn utility

# Search for the cn utility implementation
fd "cn.ts" --type f

# Search for imports with proper escaping
rg -l "from ['\"]@cuhacking/shared/utils/cn['\"]"

# Search for any file that might contain the cn function
ast-grep --pattern 'function cn($$$)'

Length of output: 849


Script:

#!/bin/bash
# Let's check the implementation of cn utility in both locations to verify the change

# Check the implementation in shared utils
cat libs/shared/utils/cn.ts

# Check the implementation in external shadcn
cat libs/external/shadcn/lib/utils/cn.ts

# Check if there are any differences in functionality

Length of output: 426

libs/website/ui/sponsorship/sponsor-presenter/sponsor-item.tsx (1)

1-3: LGTM: Import paths have been simplified

The updated import paths follow a cleaner and more maintainable structure.

libs/website/ui/introduction/welcome/welcome.tsx (2)

1-2: LGTM! Good improvement to import paths.

The switch to absolute imports with the '@cuhacking' prefix improves maintainability and makes the code more resistant to refactoring.


Line range hint 17-43: Verify responsive design implementation.

While the component uses responsive classes (sm:p-6), the PR objectives indicate that mobile testing is incomplete. Please verify the component's appearance and functionality across:

  • Mobile devices (different screen sizes)
  • Tablets
  • Desktop browsers
✅ Verification successful

Responsive design implementation appears well-structured and consistent

The codebase shows a comprehensive and consistent responsive design implementation:

  • The welcome component follows the established responsive patterns used throughout the codebase
  • Mobile-first approach is evident with base styles and sm:, md:, lg: breakpoint modifiers
  • Key responsive features in the component:
    • Padding adjusts from p-3.5 on mobile to sm:p-6 on larger screens
    • Parent sections properly handle responsive layouts with max-w-screen-xl and responsive padding
    • Text remains readable across screen sizes with appropriate base font sizes
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for all responsive utility classes in the codebase to ensure consistent responsive design
rg '\b(sm|md|lg|xl|2xl):'

Length of output: 8133

libs/website/ui/introduction/constants/welcome.constants.ts (1)

25-26: Verify Discord invite link validity and expiration

Please ensure that:

  1. The Discord invite link is permanent
  2. It points to the correct server
libs/shared/ui/accordion/accordion.tsx (1)

13-13: Ensure cross-platform and accessibility testing

As this is a core UI component for the website v1 release, please verify:

  1. The accordion behavior works correctly across different browsers and devices
  2. The component meets accessibility standards (ARIA attributes from Radix are properly rendered)
  3. Animations and transitions work smoothly on lower-end devices
libs/shared/ui/button/button.tsx (1)

12-13: LGTM! Improved readability of default variant styling.

The multi-line formatting makes the complex class string more readable while maintaining the same functionality.

libs/shared/ui/typography/typography.stories.tsx (2)

4-50: Well-structured Storybook configuration

The meta configuration follows best practices with:

  • Proper component categorization in the design system
  • Enabled autodocs for automatic documentation
  • Comprehensive argTypes with proper controls and documentation

65-73: Well-organized story exports

The story exports follow best practices with:

  • Clear naming conventions
  • Consistent creation pattern using the utility function
  • Complete coverage of all typography variants
libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (1)

1-8: LGTM! Imports are well-organized and necessary.

All imports are being used and follow good practices with type imports separated.

libs/website/feature/events/ui/event-item/event-item.tsx (2)

2-6: LGTM! Clean import organization.

The imports are well-structured using absolute paths from shared components.


41-50: Verify responsive behavior of separators.

The implementation uses different separators for mobile and desktop views. Please ensure this has been tested across different viewport sizes.

Consider using a CSS-only solution to reduce the number of DOM elements:

-      <Separator
-        orientation="vertical"
-        className="self-stretch hidden h-auto lg:block"
-        decorative
-      />
-      <Separator
-        orientation="horizontal"
-        className="block w-full lg:hidden"
-        decorative
-      />
+      <div 
+        className="self-stretch hidden h-auto lg:block border-r border-current" 
+        aria-hidden="true"
+      />
+      <div 
+        className="block w-full lg:hidden border-t border-current" 
+        aria-hidden="true"
+      />
libs/website/ui/introduction/welcome/welcome.stories.tsx (1)

50-50: LGTM! Clear and consistent component categorization

The updated title better reflects the component's location and purpose in the website structure.

libs/website/shared/ui/socials/social.stories.tsx (2)

11-12: LGTM! Appropriate testing utility import.

The addition of createRemixStub is correct for mocking Remix routing in Storybook stories.


Line range hint 47-85: Add comprehensive testing configurations.

The story needs additional testing setups to align with the PR objectives:

  1. Add viewport configurations for responsive design testing
  2. Include accessibility testing parameters
  3. Set up cross-platform testing scenarios

Let's verify the current testing setup:

Add these configurations to the story:

const meta: Meta<typeof Socials> = {
  title: 'cuHacking Design System/Socials',
  component: Socials,
  tags: ['autodocs'],
  parameters: {
    layout: 'centered',
+   viewport: {
+     viewports: {
+       mobile: { width: 320, height: 568 },
+       tablet: { width: 768, height: 1024 },
+       desktop: { width: 1024, height: 768 },
+     },
+     defaultViewport: 'desktop',
+   },
+   a11y: {
+     config: {
+       rules: [
+         { id: 'aria-required-parent', enabled: true },
+         { id: 'aria-required-children', enabled: true },
+       ],
+     },
+   },
  },
libs/website/ui/faq/faq-presenter/faq.presenter.tsx (1)

1-72: Verify responsive design across platforms

The PR objectives mention that cross-platform testing hasn't been completed.

libs/website/shared/ui/navigation/footer/ui/footer.stories.tsx (1)

11-11: LGTM! Clean import addition and proper story organization.

The import of createRemixStub and the updated story title improve the testing capabilities and organization.

Also applies to: 14-16

libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.stories.tsx (3)

2-2: LGTM: New imports enhance testing and UI capabilities

The addition of the cross icon and createRemixStub improves the component's testability and UI functionality.

Also applies to: 13-13


122-125: LGTM: Cross icon configuration

The cross icon configuration follows the established pattern for icon properties in the navbar.


17-34: Document the empty args object and verify routing setup

The RemixStub configuration looks good, but consider:

  1. Document why the args object is empty (line 20)
  2. Verify that the routing setup covers all navigation scenarios
libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (2)

60-68: LGTM! Navigation menu implementation is solid

The desktop navigation implementation follows best practices with proper accessibility attributes and clean mapping of navigation items.


86-89: Optimize mobile performance and verify cross-platform compatibility

The backdrop blur effect (backdrop-blur-[3px]) might impact performance on mobile devices. Additionally, according to PR objectives, cross-platform testing is pending.

Please:

  1. Consider using a solid background color with opacity instead of backdrop blur for better performance
  2. Test the drawer interaction across different mobile devices and browsers
.storybook/main.ts (1)

11-11: Verify potential path overlap with existing story paths

The new path ../libs/website/ui/**/* might overlap with the existing path ../libs/website/shared/ui/**/*. This could lead to duplicate stories or unexpected behavior.

✅ Verification successful

No path overlap detected - directories serve different purposes

The verification shows that website/ui and website/shared/ui contain distinct components with different responsibilities:

  • website/ui: Contains page-specific components (FAQ, Introduction, Sponsorship, Stats)
  • website/shared/ui: Contains shared components (Navigation, Footer, Socials, Spline)

There is no overlap in the component paths or their purposes, making both story paths necessary and correctly structured.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for potential path overlaps in the stories configuration

# Search for UI components in both directories
echo "Components in website/ui:"
fd -t f -e tsx -e ts -e mdx . --base-directory libs/website/ui

echo -e "\nComponents in website/shared/ui:"
fd -t f -e tsx -e ts -e mdx . --base-directory libs/website/shared/ui

Length of output: 1934

libs/shared/ui/navigation-menu/navigation-menu.tsx (2)

1-5: LGTM! Well-structured imports with good accessibility foundations.

The use of Radix UI primitives and class-variance-authority provides a solid foundation for accessible and maintainable components.


Line range hint 7-23: Verify mobile viewport behavior

Given that this is website v1 and mobile testing is pending per PR checklist, please verify:

  1. Viewport positioning on smaller screens
  2. Animation performance on mobile devices
  3. Touch interaction behavior

@@ -1,4 +1,4 @@
export { FOOTER_CONSTANTS } from './footer/constants/footer.constants'
export { FooterPresenter } from './footer/ui/footer.presenter'
export { NAVBAR_CONSTANTS } from './navbar/constants/navbar.constants'
export { NavbarPresenter } from './navbar/ui/navbar.presenter'
export { NavbarContainer } from './navbar/ui/navbar.container'
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add tests for NavbarContainer

The PR checklist indicates missing tests. Since this is a significant architectural change, please ensure:

  1. Unit tests for NavbarContainer
  2. Integration tests with Layout component
  3. Responsive design tests across mobile, tablet, and desktop

Would you like me to help create test templates covering these scenarios?

Comment on lines +9 to +14
export function MobileNavItem({ link, name, onClick }: MobileNavItemProps) {
return (
<div className="p-2.5">
<a href={link} className="block" aria-label={`Navigate to ${name}`}>
<h2 className="text-[48px] font-extrabold">
{name}
</h2>
</a>
<div onClick={onClick} className="p-2.5">
<Link to={link} className="block" aria-label={`Navigate to ${name}`}>
<h2 className="text-[48px] font-extrabold">{name}</h2>
</Link>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix potential event bubbling issues and enhance mobile UX.

The current implementation has several concerns:

  1. Event bubbling between the onClick handler and Link component could cause navigation issues
  2. The fixed text size of 48px might not be responsive enough for all mobile devices

Apply these changes to fix the issues:

-export function MobileNavItem({ link, name, onClick }: MobileNavItemProps) {
+export function MobileNavItem({ link, name, onClick }: MobileNavItemProps) {
+  const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
+    e.stopPropagation();
+    onClick?.(e);
+  };
+
   return (
-    <div onClick={onClick} className="p-2.5">
+    <div onClick={handleClick} className="p-2.5">
       <Link to={link} className="block" aria-label={`Navigate to ${name}`}>
-        <h2 className="text-[48px] font-extrabold">{name}</h2>
+        <h2 className="text-4xl md:text-[48px] font-extrabold">{name}</h2>
       </Link>
     </div>
   )
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function MobileNavItem({ link, name, onClick }: MobileNavItemProps) {
return (
<div className="p-2.5">
<a href={link} className="block" aria-label={`Navigate to ${name}`}>
<h2 className="text-[48px] font-extrabold">
{name}
</h2>
</a>
<div onClick={onClick} className="p-2.5">
<Link to={link} className="block" aria-label={`Navigate to ${name}`}>
<h2 className="text-[48px] font-extrabold">{name}</h2>
</Link>
export function MobileNavItem({ link, name, onClick }: MobileNavItemProps) {
const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
e.stopPropagation();
onClick?.(e);
};
return (
<div onClick={handleClick} className="p-2.5">
<Link to={link} className="block" aria-label={`Navigate to ${name}`}>
<h2 className="text-4xl md:text-[48px] font-extrabold">{name}</h2>
</Link>
</div>
)
}

Comment on lines 10 to 20
export function SplineComponent({ link, className }: SplineComponentProps) {
return (
<div className="overflow-x-hidden">
<ErrorBoundary>
<Suspense>
<Spline className={cn(className)} scene={link} />
</Suspense>
</ErrorBoundary>
</div>
)
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add loading and error states, and consider performance optimizations.

The component needs better handling of loading and error states, and should consider performance implications.

 export function SplineComponent({ link, className }: SplineComponentProps) {
   return (
     <div className="overflow-x-hidden">
-      <ErrorBoundary>
+      <ErrorBoundary fallback={<div>Failed to load 3D scene</div>}>
-        <Suspense>
+        <Suspense fallback={<div>Loading 3D scene...</div>}>
           <Spline className={cn(className)} scene={link} />
         </Suspense>
       </ErrorBoundary>
     </div>
   )
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function SplineComponent({ link, className }: SplineComponentProps) {
return (
<div className="overflow-x-hidden">
<ErrorBoundary>
<Suspense>
<Spline className={cn(className)} scene={link} />
</Suspense>
</ErrorBoundary>
</div>
)
}
export function SplineComponent({ link, className }: SplineComponentProps) {
return (
<div className="overflow-x-hidden">
<ErrorBoundary fallback={<div>Failed to load 3D scene</div>}>
<Suspense fallback={<div>Loading 3D scene...</div>}>
<Spline className={cn(className)} scene={link} />
</Suspense>
</ErrorBoundary>
</div>
)
}

💡 Codebase verification

Based on the search results and the project's README stating WCAG 2 compliance as a goal, I'll generate the final response:

Add accessibility enhancements to the Spline 3D component

The Spline component needs accessibility improvements to align with the project's WCAG 2 compliance goal:

  • Add role="region" and aria-label="3D interactive content" to the wrapper div
  • Add a prefers-reduced-motion media query check to disable animations when users have requested reduced motion
  • Implement keyboard controls for interactive elements within the Spline scene
  • Add a skip link or control to bypass the 3D content for users who may experience motion sickness
  • Consider implementing loading="lazy" on the wrapper div for better performance

Example implementation:

<div 
  role="region"
  aria-label="3D interactive content"
  className={cn("overflow-x-hidden", className)}
  loading="lazy"
>
🔗 Analysis chain

Consider accessibility and performance implications.

  1. Add ARIA attributes for accessibility.
  2. Consider lazy loading the Spline component.
  3. Add controls for users who experience motion sickness.

Let's check if there are any accessibility guidelines in the project:


Let me search for more specific information about Spline components and motion-related accessibility configurations.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for accessibility-related configuration or documentation
rg -i "accessibility|a11y" --type md

Length of output: 278


Script:

#!/bin/bash
# Search for existing Spline component implementations and motion-related configurations
rg -i "spline.*component|motion|reduce-motion|prefers-reduced-motion" --type tsx --type ts -A 3

# Search for any existing aria attributes in Spline components
rg -i "aria-|role=" --type tsx --type ts ./libs/website/shared/ui/spline/

Length of output: 229


Script:

#!/bin/bash
# Search for Spline component implementations and motion-related configurations
rg -i "spline.*component|motion|reduce-motion|prefers-reduced-motion"

# Search for any existing aria attributes in the codebase
rg -i "aria-|role=" ./libs/website/shared/ui/spline/

Length of output: 2845

@@ -1,5 +1,5 @@
import { cn } from '@cuhacking/shared/utils/cn'
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Inconsistent import paths detected - action required

The codebase shows mixed usage of the cn utility import:

  • Most components use the new path @cuhacking/shared/utils/cn
  • calendar.tsx still uses the old path @shadcn/lib/utils
  • The old path is also referenced in components.json
🔗 Analysis chain

Verify consistent usage of the new import path.

The import path change from @shadcn/lib/utils to @cuhacking/shared/utils/cn should be consistent across all components.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining old import paths and verify new import consistency

# Check for any remaining old shadcn imports
echo "Checking for remaining old imports..."
rg "@shadcn/lib/utils"

# Check usage of new import path
echo "Verifying new import path usage..."
rg "@cuhacking/shared/utils/cn"

Length of output: 1662

Comment on lines 15 to 17
<NavbarContainer
links={NAVBAR_CONSTANTS.LINKS}
logo={NAVBAR_CONSTANTS.LOGO}
socials={NAVBAR_CONSTANTS.SOCIALS}
hamburger={NAVBAR_CONSTANTS.HAMBURGER}
cross={NAVBAR_CONSTANTS.CROSS}
/>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add responsive design tests for navbar

The PR objectives indicate that cross-platform testing (mobile, tablet, desktop) hasn't been completed. The navbar is a critical UI component that needs to be thoroughly tested across different viewport sizes.

Would you like me to:

  1. Generate a test suite using React Testing Library with different viewport sizes?
  2. Create a Storybook story with viewport controls for manual testing?
  3. Open a GitHub issue to track the cross-platform testing requirement?

Comment on lines 1 to 71
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@cuhacking/shared/ui/accordion'
import { GlassmorphicCard } from '@cuhacking/shared/ui/glassmorphic-card'
import { TerminalText } from '@cuhacking/shared/ui/terminal-text'
import { Link } from '@remix-run/react'
import React from 'react'
import { FAQItem } from '../faq-item/faq-item'

interface FAQPresenterProps {
questions: { question: string, answers: string[] }[]
}
// TODO: REMOVE HARDCODED EXTRA FAQ ITEMS
export function FAQPresenter({ questions }: FAQPresenterProps) {
return (
<GlassmorphicCard className="flex flex-col w-full gap-6 px-5 py-6">
<h2 className="text-4xl font-bold">FAQ</h2>
<Accordion
type="multiple"
className="flex flex-col flex-grow-0 w-full gap-2"
>
{questions.map(({ question, answers }) => (
<FAQItem key={question} question={question} answers={answers} />
))}
{/* EXTRA FAQ ITEM IS NECESSARY RIGHT NOW SO THAT WE CAN HAVE A QUESTION AND ANSWER WITH LINKS */}
<AccordionItem value="I have more questions, where should I go?">
<AccordionTrigger>
<p>
<span className="text-primary">faq(</span>
I have more questions,
where should I go?
<span className="text-primary">)</span>
</p>
</AccordionTrigger>
<AccordionContent>
<TerminalText>
<p>
Hit us up on
{' '}
<Link
to="https://discord.gg/fh2KseMysN"
target="_blank"
className="underline hover:text-blue-400 hover:underline decoration-blue-400 duration-300"
>
Discord
</Link>
,
{' '}
<Link
to="https://www.instagram.com/cuhacking/"
target="_blank"
className="underline hover:text-lime-400 hover:underline decoration-lime-400 duration-300"
>
Instagram
</Link>
, or
{' '}
<Link
to="mailto:[email protected]"
target="_blank"
className="underline hover:text-yellow-400 hover:underline decoration-yellow-400 duraiton-300"
>
Email
</Link>
{' '}
us
</p>
</TerminalText>
</AccordionContent>
</AccordionItem>
</Accordion>
</GlassmorphicCard>
)
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add missing tests as per PR requirements

The PR checklist indicates that tests are required but missing. Please add tests for this component.

Would you like me to help generate test cases? Here's a suggested structure:

// faq.presenter.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import { FAQPresenter } from './faq.presenter';

describe('FAQPresenter', () => {
  const mockQuestions = [
    { question: 'Test Q1', answers: ['Answer 1'] },
    { question: 'Test Q2', answers: ['Answer 2.1', 'Answer 2.2'] }
  ];

  it('renders all questions', () => {
    render(<FAQPresenter questions={mockQuestions} />);
    expect(screen.getByText('Test Q1')).toBeInTheDocument();
    expect(screen.getByText('Test Q2')).toBeInTheDocument();
  });

  it('expands/collapses accordion items on click', () => {
    render(<FAQPresenter questions={mockQuestions} />);
    const trigger = screen.getByText('Test Q1');
    
    fireEvent.click(trigger);
    expect(screen.getByText('Answer 1')).toBeVisible();
    
    fireEvent.click(trigger);
    expect(screen.queryByText('Answer 1')).not.toBeVisible();
  });

  it('renders social links correctly', () => {
    render(<FAQPresenter questions={[]} />);
    expect(screen.getByText('Discord')).toHaveAttribute('href', 'https://discord.gg/fh2KseMysN');
    expect(screen.getByText('Instagram')).toHaveAttribute('href', 'https://www.instagram.com/cuhacking/');
    expect(screen.getByText('Email')).toHaveAttribute('href', 'mailto:[email protected]');
  });
});

Comment on lines +16 to +18
<Accordion
type="multiple"
className="flex flex-col flex-grow-0 w-full gap-2"
>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Enhance accordion accessibility

The accordion implementation is missing important accessibility attributes.

 <Accordion
   type="multiple"
-  className="flex flex-col flex-grow-0 w-full gap-2"
+  className="flex flex-col flex-grow-0 w-full gap-2"
+  aria-label="Frequently Asked Questions"
+  defaultValue={[]}
 >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Accordion
type="multiple"
className="flex flex-col flex-grow-0 w-full gap-2"
>
<Accordion
type="multiple"
className="flex flex-col flex-grow-0 w-full gap-2"
aria-label="Frequently Asked Questions"
defaultValue={[]}
>

Comment on lines +39 to +47
export function NavbarPresenter({
links,
logo,
socials,
hamburger,
cross,
}: NavbarProps) {
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add unit tests for NavbarPresenter component

According to the PR objectives, tests are missing. Please add unit tests to verify:

  • Component rendering with all props
  • Mobile drawer interaction
  • Navigation functionality

Would you like me to help generate test cases using React Testing Library?

@@ -8,6 +8,7 @@ export default {
'../libs/shared/ui/**/*.@(mdx|stories.@(js|jsx|ts|tsx))',
'../libs/website/feature/**/*.@(mdx|stories.@(js|jsx|ts|tsx))',
'../libs/website/shared/ui/**/*.@(mdx|stories.@(js|jsx|ts|tsx))',
'../libs/website/ui/**/*.@(mdx|stories.@(js|jsx|ts|tsx))',
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Documentation and testing coverage needs improvement

Several UI components are missing stories and documentation:

  • No test files found for any components
  • Missing stories for components:
    • sponsor-presenter/sponsor-item.tsx
    • sponsor-presenter/sponsor-presenter.tsx
    • faq-item/faq-item.tsx
  • No documentation files (.md or .mdx) found in the UI components directory
  • Existing stories (e.g., stat-item.stories.tsx) lack viewport-specific testing scenarios for responsive design
🔗 Analysis chain

Documentation and testing requirements

According to the PR objectives, documentation updates and tests are pending. Please ensure that:

  1. New UI components have proper documentation
  2. Components have associated stories for testing
  3. Components are tested across mobile, tablet, and desktop platforms

Let me gather more information about the UI components to better assess the test coverage.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for documentation and test coverage

# Check for story files
echo "Story files for UI components:"
fd -e stories.tsx -e stories.ts -e mdx . --base-directory libs/website/ui

# Check for test files
echo -e "\nTest files for UI components:"
fd -e test.tsx -e test.ts -e spec.tsx -e spec.ts . --base-directory libs/website/ui

# Check for documentation
echo -e "\nDocumentation files:"
fd -e md -e mdx . --base-directory libs/website/ui

Length of output: 699


Script:

#!/bin/bash
# List all UI component files to compare with existing stories and tests
echo "All UI component files:"
fd -e tsx -e ts . --base-directory libs/website/ui | grep -v "stories\|test\|spec"

# Check content of a sample story file to verify responsive testing
echo -e "\nChecking sample story file for responsive testing:"
cat libs/website/ui/stats/stat-item/stat-item.stories.tsx

Length of output: 2396

Comment on lines +27 to +45
import { createRemixStub } from '@remix-run/testing'
import { Icon } from './icon'

const meta = {
title: 'cuHacking Design System/Icon',
decorators: [
(story) => {
const remixStub = createRemixStub([
{
path: '/*',
action: () => ({ redirect: '/' }),
loader: () => ({ redirect: '/' }),
Component: () => story(),
},
])

return remixStub({ initialEntries: ['/'] })
},
],
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Add unit tests and visual testing infrastructure for the Icon component

The verification confirms that:

  1. No unit tests exist for the Icon component
  2. While there is a Vitest setup in the website app, the shared UI library lacks test coverage
  3. No visual regression testing infrastructure is present
  4. The component currently only has Storybook stories for manual testing

Action items:

  • Create icon.test.tsx in the same directory to test component rendering, props, and accessibility
  • Set up visual regression testing using Storybook's test-runner or tools like Percy/Chromatic
  • Add responsive design tests using viewport variations in Storybook stories
🔗 Analysis chain

Add comprehensive testing coverage.

Based on the PR objectives, tests are missing from the checklist. While this Storybook setup provides visual testing, consider adding:

  1. Unit tests for the Icon component
  2. Visual regression tests
  3. Cross-platform testing (mobile, tablet, desktop)

Let's check for existing tests:

Consider implementing:

  1. Jest/React Testing Library tests for component behavior
  2. Storybook's play functions for interaction testing
  3. Visual regression tests using tools like Percy or Chromatic
  4. Responsive design testing using Storybook's viewport addon
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for test files related to the Icon component
fd -e test.tsx -e spec.tsx -e test.ts -e spec.ts . | grep -i icon

# Check for visual regression testing setup
fd -g "*.config.*" . | xargs grep -l "visual|screenshot|image.*test"

Length of output: 138


Script:

#!/bin/bash
# Let's try a more comprehensive search for test files and configurations

# Search for Icon-related test files with broader extensions
fd "icon.*\.(test|spec)\.(ts|tsx|js|jsx)$" --ignore-case

# Search for test setup files
fd "(jest|vitest|cypress|playwright)\.config\.[jt]s"

# Check if Storybook has visual testing addons configured
fd "\.storybook" --type f --exec grep -l "addon.*test"

# Look for any test files in the same directory as icon component
fd ".*\.(test|spec)\.(ts|tsx|js|jsx)$" --base-directory "$(dirname $(fd "icon.stories.tsx"))"

# Check package.json for testing-related dependencies
fd "package.json" --type f --exec grep -A 5 -B 5 '"test":'

Length of output: 482


Script:

#!/bin/bash
# Let's examine the test configurations and package.json for testing setup

# Check vitest config content
cat apps/website/vitest.config.ts

# Check Storybook main config for testing addons
fd "main\.(js|ts)" --type f --base-directory .storybook

# Examine package.json in the ui library directory
fd "package.json" --type f --base-directory libs/shared/ui --exec cat {}

# Look for any test utilities or helpers
fd "test-utils|testing" --type f

Length of output: 1067

@JeremyFriesenGitHub JeremyFriesenGitHub changed the title feat(web): finsih website v1 feat(web): finish website v1 Dec 1, 2024
@MFarabi619 MFarabi619 force-pushed the hasith/feat/finish-website-v1 branch from a338bfd to 208bc77 Compare December 2, 2024 09:15
@MFarabi619 MFarabi619 self-requested a review as a code owner December 2, 2024 09:15
Copy link

@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

🧹 Outside diff range and nitpick comments (5)
apps/website/app/root.tsx (1)

Line range hint 1-39: Add preload for critical fonts to prevent FOUT

With font loading moved to global.css, there's a risk of Flash of Unstyled Text (FOUT). Consider adding a preload link for the JetBrains Mono font.

 <head>
   <meta charSet="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
+  <link
+    rel="preload"
+    href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,700&display=swap"
+    as="style"
+  />
   <Meta />
   <Links />
 </head>
libs/shared/ui/global.css (1)

72-72: Consider fallback fonts for better cross-browser support

While JetBrains Mono is set as the primary font, it's important to provide appropriate fallbacks.

-    font-family: 'JetBrains Mono', monospace;
+    font-family: 'JetBrains Mono', 'Courier New', Consolas, monospace;
libs/external/shadcn/tailwind.config.ts (3)

21-21: Add fallback fonts in Tailwind configuration

The font configuration should include fallbacks to match the global.css implementation.

-          mono: ['JetBrains Mono'],
+          mono: ['JetBrains Mono', 'Courier New', 'Consolas', 'monospace'],

Line range hint 1-1: ⚠️ Website v1 Readiness Concerns

Based on the PR objectives and changes reviewed, several critical items need attention before finalizing website v1:

  1. Testing:

    • Add unit tests for components
    • Verify responsive design across devices
    • Test font loading and performance
  2. Documentation:

    • Document design system choices
    • Update component documentation
  3. Cross-platform verification:

    • Test on mobile, tablet, and desktop
    • Verify scroll behavior and layouts
    • Check font rendering across browsers

These items should be addressed before merging to ensure a stable v1 release.

Would you like help with:

  1. Generating test cases?
  2. Creating documentation templates?
  3. Setting up cross-platform testing workflows?

Documentation needed for design system configuration

  • The JetBrains Mono font is used for its monospace clarity and readability, ideal for code-focused interfaces

  • Color scheme uses HSL variables for consistent theming:

    • Primary/Secondary: Green-focused palette (116, 87 hue) for brand identity
    • Background/Foreground: Pure black/white for maximum contrast
    • Card system: Layered transparency (40%) for depth
    • Destructive: Red (0 hue) for warning states
  • Custom shadows:

    • dropShadow: Subtle elevation effect
    • innerShadow: Inset depth for pressed states
    • buttonKeyboard: Complex layered shadow for keyboard-like buttons
    • buttonKeyboardHover: Interactive state with brand-colored glow
  • Gradients:

    • greendiant: Brand gradient from secondary to primary
    • g-keyboardBlack: Subtle dark gradient for depth
    • g-nav-drawer-background: Four-stop gradient for navigation depth
  • Add these design decisions as JSDoc comments in the configuration file

  • Consider creating a design tokens documentation in apps/docs/content/docs/concepts/design-tokens.mdx

  • Link the design tokens documentation to the existing design systems page at apps/docs/content/docs/concepts/design-systems.mdx

🔗 Analysis chain

Line range hint 1-108: Documentation needed for website v1 configuration

As this PR finalizes website v1, the configuration file needs documentation for:

  • Font choices and their rationale
  • Color scheme variables
  • Custom shadow configurations
  • Gradient configurations

Consider adding JSDoc comments to document these design decisions for future maintenance.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there's any existing documentation
rg -g '*.md' -l 'font|color|shadow|gradient' 

Length of output: 46


Script:

#!/bin/bash
# Let's check for any existing documentation in the repository, including different file extensions
fd -e md -e mdx -e txt . | xargs rg -l -i "design|theme|style|tailwind"

# Also check if there are any comments in the tailwind config files
fd "tailwind.config" | xargs cat

Length of output: 17387


Script:

#!/bin/bash
# Let's check if there's any existing design system documentation
fd -e mdx "design-system|theme|style" apps/docs/content/docs/

# Also check for any CSS files that might contain design token documentation
fd -e css . | xargs rg -l "CSS|variables|tokens"

Length of output: 165


Script:

#!/bin/bash
# Let's check the content of the design systems documentation
cat "apps/docs/content/docs/concepts/design-systems.mdx"

# Also check for any global CSS files that might contain design tokens
fd "global.css|styles.css|tokens.css" -x cat {}

Length of output: 17804

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between a338bfd and 208bc77.

⛔ Files ignored due to path filters (2)
  • libs/shared/assets/icons/general/cross-1.svg is excluded by !**/*.svg
  • libs/shared/assets/icons/socials/linkedin-white-1.svg is excluded by !**/*.svg
📒 Files selected for processing (12)
  • .gitignore (1 hunks)
  • .storybook/main.ts (1 hunks)
  • apps/website/app/root.tsx (2 hunks)
  • apps/website/app/routes/_index.tsx (1 hunks)
  • libs/external/shadcn/tailwind.config.ts (1 hunks)
  • libs/shared/ui/accordion/accordion.stories.tsx (0 hunks)
  • libs/shared/ui/accordion/accordion.tsx (2 hunks)
  • libs/shared/ui/button/button.stories.tsx (1 hunks)
  • libs/shared/ui/button/button.tsx (2 hunks)
  • libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx (2 hunks)
  • libs/shared/ui/global.css (2 hunks)
  • libs/shared/ui/icon/icon.stories.tsx (1 hunks)
💤 Files with no reviewable changes (1)
  • libs/shared/ui/accordion/accordion.stories.tsx
🚧 Files skipped from review as they are similar to previous changes (8)
  • .gitignore
  • libs/shared/ui/button/button.stories.tsx
  • apps/website/app/routes/_index.tsx
  • libs/shared/ui/accordion/accordion.tsx
  • .storybook/main.ts
  • libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx
  • libs/shared/ui/button/button.tsx
  • libs/shared/ui/icon/icon.stories.tsx
🔇 Additional comments (1)
apps/website/app/root.tsx (1)

22-22: Verify scroll padding and overflow behavior across devices

The addition of scroll-pt-16 and overflow-x-hidden needs verification across different viewport sizes:

  • scroll-pt-16 might be too large on mobile devices
  • overflow-x-hidden could mask layout issues instead of fixing them

Consider:

  1. Using responsive scroll padding values
  2. Investigating root causes of horizontal overflow instead of hiding it
✅ Verification successful

The previous search might have failed due to the specific glob pattern. Let's broaden our search to find all style-related files and potential overflow triggers, including Tailwind configuration that might affect the scroll padding and overflow behavior.


The previous search didn't give us enough context about the scroll padding and overflow implementations. Let's specifically look for scroll-related utilities and responsive patterns to understand how they're being used across the codebase.


The previous commands failed due to file type restrictions. Let's try searching without them and also check the project structure to better understand the context of these styles.


The scroll padding and overflow settings appear to be used appropriately

Based on the search results:

  • scroll-pt-16 is only used in the root layout and isn't overridden with responsive variants
  • overflow-x-hidden is used consistently in three strategic places:
    1. Root layout for global overflow control
    2. Navbar drawer component
    3. Spline component container

The implementation appears intentional and well-contained, without signs of layout issues being masked. The scroll padding provides consistent spacing for anchor navigation across the site.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for potential horizontal scroll triggers
rg -g '*.{css,scss}' 'width:|margin-|padding-|left:|right:' 

Length of output: 61


Script:

#!/bin/bash
# Let's try a broader search for CSS files first
fd -e css -e scss

# Then search for potential overflow issues in all style-related files including CSS-in-JS
rg -t css -t tsx -t jsx "(overflow|width:.+?100|margin-(left|right)|padding-(left|right))"

# Look for any scroll-related utilities or configurations in Tailwind config
fd "tailwind.config" --exec cat {}

Length of output: 13451


Script:

#!/bin/bash
# Let's check for any existing scroll-related styles and breakpoint configurations
rg -t tsx -t jsx "scroll-pt-|scroll-padding-top" --no-filename

# Check for any mobile-specific styles or responsive design patterns
rg -t tsx -t jsx "(sm:|md:|lg:)scroll-pt-" --no-filename

# Look for any existing overflow handling
rg -t tsx -t jsx "overflow-x-" --no-filename

Length of output: 252


Script:

#!/bin/bash
# Search without file type restrictions since rg doesn't recognize tsx
rg "scroll-pt-|scroll-padding-top"

# Look for responsive patterns
rg "(sm:|md:|lg:)scroll-pt-"

# Check overflow handling across files
rg "overflow-x-"

# Also check the directory structure to understand the app layout
fd -t f -e tsx -e jsx

Length of output: 5253

@@ -2,10 +2,11 @@
* Don't forget to update your APPs global.css to include this file!
*/

@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap');
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Optimize font loading by limiting weights

Loading all weights (100-800) of JetBrains Mono increases the initial page load. Consider loading only the weights actually used in the design.

-@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap');
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap');
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap');

@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch from a668227 to d5738c5 Compare December 2, 2024 22:26
Copy link

@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: 11

🧹 Outside diff range and nitpick comments (8)
libs/shared/assets/fonts/JetBrains_Mono/README.txt (1)

1-79: Consider adding web-specific usage instructions.

Since this is for a website project, consider adding a section about:

  • How to use these fonts in CSS
  • Performance considerations
  • Browser compatibility notes
🧰 Tools
🪛 LanguageTool

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)

libs/website/layouts/base.tsx (1)

11-17: Fix indentation issues

The indentation is inconsistent. Please adjust the indentation to match the project's style guide.

-         <NavbarContainer
-            links={NAVBAR_CONSTANTS.LINKS}
-            logo={NAVBAR_CONSTANTS.LOGO}
-            socials={NAVBAR_CONSTANTS.SOCIALS}
-            hamburger={NAVBAR_CONSTANTS.HAMBURGER}
-            cross={NAVBAR_CONSTANTS.CROSS}
-          />
+        <NavbarContainer
+          links={NAVBAR_CONSTANTS.LINKS}
+          logo={NAVBAR_CONSTANTS.LOGO}
+          socials={NAVBAR_CONSTANTS.SOCIALS}
+          hamburger={NAVBAR_CONSTANTS.HAMBURGER}
+          cross={NAVBAR_CONSTANTS.CROSS}
+        />
🧰 Tools
🪛 eslint

[error] 11-11: Expected indentation of 6 spaces but found 9.

(style/indent)


[error] 12-12: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 12-12: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 13-13: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 14-14: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 14-14: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 15-15: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 16-16: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 17-17: Expected indentation of 6 spaces but found 10.

(style/indent)


[error] 17-17: The closing bracket must be aligned with the opening tag (expected column 10)

(style/jsx-closing-bracket-location)

libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (1)

73-85: Enhance button accessibility

The button could benefit from additional accessibility attributes:

 <button
   type="button"
   aria-label={
     isOpen ? 'Close Navigation Drawer' : 'Open Navigation Drawer'
   }
+  aria-expanded={isOpen}
+  aria-controls="navigation-drawer"
   className="md:hidden"
   onClick={toggleOpen}
 >
libs/shared/ui/global.css (1)

5-7: Enhance the comment to explain the rationale

While the comment prevents CDN usage, it would be more helpful to explain why:

-/* DO NOT IMPORT FONT FROM GOOGLE CDN */
+/* DO NOT IMPORT FONT FROM GOOGLE CDN
+ * We serve fonts locally to:
+ * 1. Improve page load performance
+ * 2. Ensure offline availability
+ * 3. Maintain better privacy control
+ */
libs/shared/assets/fonts/JetBrains_Mono/OFL.txt (1)

1-93: Additional testing needed before v1 release

While the font implementation looks solid, per the PR checklist, please ensure:

  1. Cross-browser font loading tests (Chrome, Firefox, Safari)
  2. Mobile/tablet/desktop font rendering tests
  3. Offline font availability tests
  4. Font performance tests (loading times, CLS metrics)

Would you like help setting up a testing plan for these scenarios?

🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)

libs/website/shared/ui/spline/spline-component.tsx (1)

17-18: Enhance loading state presentation

The current loading state is too basic for a production website. Consider implementing a proper loading skeleton or spinner.

-      <Suspense fallback={<div>Loading...</div>}>
+      <Suspense fallback={
+        <div className="flex items-center justify-center w-full h-full min-h-[200px]">
+          <div className="animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-gray-900" />
+        </div>
+      }>
libs/website/ui/introduction/welcome/welcome.section.tsx (1)

32-38: Add performance optimization for 3D scene

The Canvas component with multiple lights and boxes might impact performance on lower-end devices. Consider:

  1. Adding suspense boundary
  2. Implementing level of detail (LOD)
  3. Using React.memo for Box component
+const MemoizedBox = React.memo(Box)
 <Canvas>
+  <Suspense fallback={<span>Loading 3D scene...</span>}>
     <ambientLight intensity={Math.PI / 2} />
     <spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
     <pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
-    <Box position={[-1.2, 0, 0]} />
-    <Box position={[1.2, 0, 0]} />
+    <MemoizedBox position={[-1.2, 0, 0]} />
+    <MemoizedBox position={[1.2, 0, 0]} />
+  </Suspense>
 </Canvas>
libs/website/ui/introduction/constants/welcome.constants.ts (1)

1-8: Consider lazy loading social media icons

The icons are imported directly, which could impact initial load time. Consider lazy loading them since they're below the fold.

-import discord_green from '@cuhacking/shared/assets/icons/socials/discord-green-1.svg';
+const discord_green = () => import('@cuhacking/shared/assets/icons/socials/discord-green-1.svg');
🧰 Tools
🪛 eslint

[error] 1-1: Extra semicolon.

(style/semi)


[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 4-4: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 6-6: Extra semicolon.

(style/semi)


[error] 7-7: Extra semicolon.

(style/semi)


[error] 8-8: Extra semicolon.

(style/semi)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 208bc77 and d8c8a34.

⛔ Files ignored due to path filters (19)
  • libs/shared/assets/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Bold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-BoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraBold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraBoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraLight.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraLightItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Italic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Light.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-LightItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Medium.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-MediumItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Regular.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-SemiBold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-SemiBoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Thin.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ThinItalic.ttf is excluded by !**/*.ttf
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (12)
  • libs/shared/assets/fonts/JetBrains_Mono/OFL.txt (1 hunks)
  • libs/shared/assets/fonts/JetBrains_Mono/README.txt (1 hunks)
  • libs/shared/ui/global.css (2 hunks)
  • libs/website/feature/events/ui/event.section.tsx (1 hunks)
  • libs/website/layouts/base.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (2 hunks)
  • libs/website/shared/ui/spline/spline-component.tsx (1 hunks)
  • libs/website/ui/introduction/constants/welcome.constants.ts (1 hunks)
  • libs/website/ui/introduction/mission/mission.section.tsx (1 hunks)
  • libs/website/ui/introduction/welcome/welcome.section.tsx (1 hunks)
  • package.json (3 hunks)
🧰 Additional context used
🪛 Biome (1.9.4)
libs/website/ui/introduction/welcome/welcome.section.tsx

[error] 13-13: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)

🪛 eslint
libs/website/ui/introduction/mission/mission.section.tsx

[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 14-14: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 14-14: Expected indentation of 18 space characters but found 20.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 15-15: Expected indentation of 18 space characters but found 20.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 17-17: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 18-18: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 19-19: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 20-20: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 21-21: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 21-21: Extra semicolon.

(style/semi)

libs/website/shared/ui/spline/spline-component.tsx

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 22-22: Extra semicolon.

(style/semi)

libs/website/ui/introduction/constants/welcome.constants.ts

[error] 1-1: Extra semicolon.

(style/semi)


[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 4-4: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 6-6: Extra semicolon.

(style/semi)


[error] 7-7: Extra semicolon.

(style/semi)


[error] 8-8: Extra semicolon.

(style/semi)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 15-15: Expected a comma.

(style/member-delimiter-style)


[error] 48-48: Extra semicolon.

(style/semi)


[error] 51-51: Extra semicolon.

(style/semi)

libs/website/feature/events/ui/event.section.tsx

[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 17-17: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 18-18: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 18-18: Extra semicolon.

(style/semi)

libs/website/layouts/base.tsx

[error] 7-7: Expected 1 empty line after import statement not followed by another import.

(import/newline-after-import)


[error] 7-7: All imports in the declaration are only used as types. Use import type.

(ts/consistent-type-imports)


[error] 11-11: Expected indentation of 6 spaces but found 9.

(style/indent)


[error] 12-12: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 12-12: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 13-13: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 14-14: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 14-14: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 15-15: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 16-16: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 17-17: Expected indentation of 6 spaces but found 10.

(style/indent)


[error] 17-17: The closing bracket must be aligned with the opening tag (expected column 10)

(style/jsx-closing-bracket-location)


[error] 19-20: More than 1 blank line not allowed.

(style/no-multiple-empty-lines)

libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx

[error] 1-1: Extra semicolon.

(style/semi)


[error] 4-4: Unexpected separator (;).

(style/member-delimiter-style)


[error] 5-5: Unexpected separator (;).

(style/member-delimiter-style)


[error] 10-10: Unexpected separator (;).

(style/member-delimiter-style)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 13-13: Unexpected separator (;).

(style/member-delimiter-style)


[error] 15-15: Unexpected separator (;).

(style/member-delimiter-style)


[error] 16-16: Unexpected separator (;).

(style/member-delimiter-style)


[error] 17-17: Unexpected separator (;).

(style/member-delimiter-style)


[error] 18-18: Unexpected separator (;).

(style/member-delimiter-style)


[error] 19-19: Unexpected separator (;).

(style/member-delimiter-style)


[error] 38-38: Extra semicolon.

(style/semi)

🪛 LanguageTool
libs/shared/assets/fonts/JetBrains_Mono/OFL.txt

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)

libs/shared/assets/fonts/JetBrains_Mono/README.txt

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)

🔇 Additional comments (17)
libs/shared/assets/fonts/JetBrains_Mono/README.txt (2)

72-79: Verify the presence of the referenced license file.

The README mentions "OFL.txt" but doesn't include its contents. Please ensure this file is present in the repository.

✅ Verification successful

The referenced OFL.txt license file is present in the repository

The file exists at the expected location: libs/shared/assets/fonts/JetBrains_Mono/OFL.txt

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if OFL.txt exists
fd "OFL.txt" libs/shared/assets/fonts/JetBrains_Mono

Length of output: 100


1-32: Verify the presence of all referenced font files.

Please ensure that all listed font files are present in the repository, particularly the ones that will be used in the website. For web optimization, consider including only the font weights that are actually used in the website rather than the complete set.

Consider using variable fonts (JetBrainsMono-VariableFont_wght.ttf) instead of static files for better performance and flexibility on the web.

✅ Verification successful

All font files are present, but consider optimizing for web usage

All font files mentioned in the README are correctly present in the repository:

  • Both variable font files are available in the root font directory
  • All 16 static font files are present in the static subdirectory

For optimal web performance, consider:

  • Using only the variable font files (*-VariableFont_wght.ttf) instead of static files
  • If static files are preferred, include only the specific weights used in your website
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if all referenced font files exist
echo "Checking for variable font files..."
fd "JetBrainsMono-.*VariableFont_wght.ttf" libs/shared/assets/fonts/JetBrains_Mono

echo "Checking for static font files..."
fd "JetBrainsMono-.*\.ttf" libs/shared/assets/fonts/JetBrains_Mono/static

Length of output: 1680

🧰 Tools
🪛 LanguageTool

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)

libs/website/layouts/base.tsx (1)

11-17: Add responsive design tests for navbar

The PR objectives indicate that cross-platform testing (mobile, tablet, desktop) hasn't been completed. The navbar is a critical UI component that needs to be thoroughly tested across different viewport sizes.

🧰 Tools
🪛 eslint

[error] 11-11: Expected indentation of 6 spaces but found 9.

(style/indent)


[error] 12-12: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 12-12: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 13-13: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 14-14: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 14-14: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 15-15: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 16-16: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 17-17: Expected indentation of 6 spaces but found 10.

(style/indent)


[error] 17-17: The closing bracket must be aligned with the opening tag (expected column 10)

(style/jsx-closing-bracket-location)

libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (3)

3-20: Enhance type definitions with documentation and consider type extraction

The interfaces would benefit from proper documentation and type extraction for reusability.

🧰 Tools
🪛 eslint

[error] 4-4: Unexpected separator (;).

(style/member-delimiter-style)


[error] 5-5: Unexpected separator (;).

(style/member-delimiter-style)


[error] 10-10: Unexpected separator (;).

(style/member-delimiter-style)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 13-13: Unexpected separator (;).

(style/member-delimiter-style)


[error] 15-15: Unexpected separator (;).

(style/member-delimiter-style)


[error] 16-16: Unexpected separator (;).

(style/member-delimiter-style)


[error] 17-17: Unexpected separator (;).

(style/member-delimiter-style)


[error] 18-18: Unexpected separator (;).

(style/member-delimiter-style)


[error] 19-19: Unexpected separator (;).

(style/member-delimiter-style)


21-39: Add proper component typing and accessibility attributes

The component should be properly typed using React.FC for better type safety.

🧰 Tools
🪛 eslint

[error] 38-38: Extra semicolon.

(style/semi)


29-37: 🛠️ Refactor suggestion

Add proper accessibility attributes to header

The header element should include proper accessibility attributes for better screen reader support.

-    <header id="#navbar" className="w-full fixed top-0 z-[60] backdrop-blur-sm">
+    <header 
+      role="banner"
+      aria-label="Main navigation"
+      className="w-full fixed top-0 z-[60] backdrop-blur-sm"
+    >

Likely invalid or redundant comment.

libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (1)

40-46: Add unit tests for NavbarPresenter component

According to the PR objectives, tests are missing. Unit tests are needed to verify component functionality.

libs/shared/ui/global.css (1)

78-78: LGTM: Font family declaration is correct

The font-family declaration properly sets JetBrains Mono with an appropriate monospace fallback.

libs/website/shared/ui/spline/spline-component.tsx (1)

2-2: ⚠️ Potential issue

Uncomment and implement error handling

The ErrorBoundary implementation is commented out, which is critical for handling failures when loading external content. This is especially important for production-ready code.

Apply this diff to implement proper error handling:

-/* import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary' */
+import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary'

// ... in the render method:
-      {/* <ErrorBoundary> */}
+      <ErrorBoundary fallback={<div>Failed to load 3D scene</div>}>
       <Suspense fallback={<div>Loading...</div>}>
         <Spline className={cn(className)} scene={link} />
       </Suspense>
-      {/* </ErrorBoundary> */}
+      </ErrorBoundary>

Also applies to: 16-21

libs/website/feature/events/ui/event.section.tsx (1)

7-12: Verify responsive layout across devices

The PR checklist indicates missing cross-platform testing. The current layout uses responsive classes but needs verification across different devices.

✅ Verification successful

Responsive layout implementation appears comprehensive

The events section and its components demonstrate a well-structured responsive layout with appropriate breakpoints:

  • Main section uses flex layout with centered content
  • Event presenter implements a responsive grid (1 column to 2 columns at md breakpoint)
  • Event items adapt from vertical to horizontal layout at lg breakpoint
  • Proper spacing adjustments at different breakpoints (px-5/py-5 to lg:px-20/lg:py-14)
  • Responsive separators that switch orientation based on viewport
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for viewport-specific styles to ensure responsive design
rg -l "sm:|md:|lg:|xl:" --type tsx

Length of output: 64


Script:

#!/bin/bash
# Search for viewport-specific styles in all files (without file type restriction)
rg -l "sm:|md:|lg:|xl:"

Length of output: 1676


Script:

#!/bin/bash
# Search for Tailwind responsive classes in the specific file
rg "(sm:|md:|lg:|xl:)" "libs/website/feature/events/ui/event.section.tsx" -A 2 -B 2

Length of output: 609


Script:

#!/bin/bash
# Look for other responsive classes in the events feature
fd . "libs/website/feature/events" --type f --exec rg -l "(sm:|md:|lg:|xl:)" {} \;

Length of output: 258


Script:

#!/bin/bash
# Check responsive classes in event-presenter and event-item components
rg "(sm:|md:|lg:|xl:)" "libs/website/feature/events/ui/event-presenter/event-presenter.tsx" "libs/website/feature/events/ui/event-item/event-item.tsx" -A 2 -B 2

Length of output: 2624


Script:

#!/bin/bash
# Look for any grid or flex layout classes in the events components
rg "(grid|flex)" "libs/website/feature/events/ui/event.section.tsx" "libs/website/feature/events/ui/event-presenter/event-presenter.tsx" "libs/website/feature/events/ui/event-item/event-item.tsx"

Length of output: 1082

🧰 Tools
🪛 eslint

[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)

libs/website/ui/introduction/mission/mission.section.tsx (2)

8-11: Clean up or implement commented code

The commented SplineComponent should either be removed if no longer needed, or implemented with proper error handling as suggested in the previous review.

🧰 Tools
🪛 eslint

[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


12-20: Consider responsive design testing

The component uses responsive classes (lg:px-20, lg:py-14) but according to PR objectives, cross-platform testing hasn't been done yet.

🧰 Tools
🪛 eslint

[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 14-14: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 14-14: Expected indentation of 18 space characters but found 20.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 15-15: Expected indentation of 18 space characters but found 20.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 17-17: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 18-18: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 19-19: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 20-20: Expected indentation of 4 spaces but found 8.

(style/indent)

libs/website/ui/introduction/welcome/welcome.section.tsx (1)

6-6: ⚠️ Potential issue

Fix typo in constant name

The constant name has a typo: "WELCOME_CONSTATNTS" should be "WELCOME_CONSTANTS".

Also applies to: 42-42

libs/website/ui/introduction/constants/welcome.constants.ts (3)

15-48: Verify social media links accessibility

Several social media links require verification:

  • Some links might require authentication
  • Inconsistent URL formats across the codebase
🧰 Tools
🪛 eslint

[error] 15-15: Expected a comma.

(style/member-delimiter-style)


[error] 48-48: Extra semicolon.

(style/semi)


33-34: ⚠️ Potential issue

Remove sensitive information from Figma link

The Figma link contains design system details that should be protected.


45-46: ⚠️ Potential issue

Clean up the Linktree URL

Remove the tracking parameters from the Linktree URL for privacy.

package.json (1)

37-37: Add tests for new 3D functionality.

The PR objectives indicate that tests are incomplete. With the addition of Three.js-related packages for 3D rendering, ensure comprehensive test coverage is added for the new functionality.

Run the following script to check for existing Three.js-related tests:

Would you like me to help generate test cases for the 3D components?

Also applies to: 51-51

Comment on lines +44 to +58
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts

In desktop apps

https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts

Online

https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts

Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Update or remove broken URLs in the README

Several URLs in the README are no longer accessible:

  • https://theblog.adobe.com/can-variable-fonts-illustrator-cc returns no response
  • https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts returns 404

The remaining URLs are accessible and return 200 status codes (some with redirects):

  • developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
  • variablefonts.typenetwork.com
  • medium.com/variable-fonts
  • helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
  • developers.google.com/fonts/docs/getting_started
  • developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide

Please update or remove the broken links to maintain the documentation's accuracy.

🔗 Analysis chain

Verify the accessibility of referenced URLs.

Some of these URLs might be outdated. Please verify they are still accessible and consider adding last-verified dates.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if URLs are accessible
urls=(
  "https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts"
  "https://variablefonts.typenetwork.com"
  "https://medium.com/variable-fonts"
  "https://theblog.adobe.com/can-variable-fonts-illustrator-cc"
  "https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts"
  "https://developers.google.com/fonts/docs/getting_started"
  "https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide"
  "https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts"
)

for url in "${urls[@]}"; do
  echo "Checking $url"
  curl -s -L --head --request GET "$url" | grep "HTTP/"
done

Length of output: 3002

@@ -33,68 +34,81 @@ interface NavbarProps {
media: Media
}[]
hamburger: Media
cross: Media
}
// TODO: Refactor to have the drawer in separate components
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Address TODO comment about drawer refactoring

The TODO comment indicates technical debt. The drawer logic should be extracted into a separate component for better maintainability.

Would you like me to help create a separate drawer component?

Comment on lines +12 to +15
@font-face {
font-family: 'JetBrains Mono';
src: url('../../shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf');
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enhance font-face declaration with best practices

The @font-face declaration could be improved for better performance and reliability:

 @font-face {
   font-family: 'JetBrains Mono';
-  src: url('../../shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf');
+  src: url('../../shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf') format('truetype-variations');
+  font-weight: 100 800;
+  font-display: swap;
 }

This change:

  1. Adds format() for better browser compatibility
  2. Specifies font-weight range for the variable font
  3. Adds font-display: swap for better loading performance
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@font-face {
font-family: 'JetBrains Mono';
src: url('../../shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf');
}
@font-face {
font-family: 'JetBrains Mono';
src: url('../../shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf') format('truetype-variations');
font-weight: 100 800;
font-display: swap;
}

Comment on lines +7 to +13
export function SplineComponent({
link,
className,
}: {
link: string;
className: string;
}) {
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add TypeScript interface for props

For better type safety and documentation, define a proper interface for the component props.

+interface SplineComponentProps {
+  link: string;
+  className: string;
+}

-export function SplineComponent({
-  link,
-  className,
-}: {
-  link: string;
-  className: string;
-}) {
+export function SplineComponent({ link, className }: SplineComponentProps) {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function SplineComponent({
link,
className,
}: {
link: string;
className: string;
}) {
interface SplineComponentProps {
link: string;
className: string;
}
export function SplineComponent({ link, className }: SplineComponentProps) {
🧰 Tools
🪛 eslint

[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)

import React from 'react'
import { EVENT_CONSTANTS } from '../constants/event.constants.ts'
import { EventPresenter } from './event-presenter/event-presenter'
/* import { SplineComponent } from '@website/shared/ui/spline/spline-component'; */
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Remove commented code if not needed

If the SplineComponent is not going to be used, remove the commented code entirely. If it's planned for future use, create a tracking issue and remove the comments.

-/* import { SplineComponent } from '@website/shared/ui/spline/spline-component'; */

// ... and later:
-            {/* <SplineComponent
-        link="https://prod.spline.design/ApEljaMrr9NQtUwP/scene.splinecode"
-        className="absolute -bottom-[15vh] lg:-bottom-[5vh] left-0 scale-1 md:scale-[1.2] z-[-1]"
-      /> */}

Also applies to: 13-16

Comment on lines +1 to +18
/* import { SplineComponent } from '@website/shared/ui/spline/spline-component'; */
import { EVENT_CONSTANTS } from '../constants/event.constants.ts';
import { EventPresenter } from './event-presenter/event-presenter';

export function EventSection() {
return (
<section id="events" className="flex justify-center w-full">
<div className="w-full max-w-screen-xl px-5 py-5 lg:px-20 lg:py-14">
<div className="w-full">
<EventPresenter events={EVENT_CONSTANTS.EVENTS} />
</div>
</div>
</section>
)
return (
<section id="events" className="relative flex justify-center w-full">
<div className="w-full max-w-screen-xl px-5 py-5 lg:px-20 lg:py-14">
<div className="w-full">
<EventPresenter events={EVENT_CONSTANTS.EVENTS} />
</div>
</div>
{/* <SplineComponent
link="https://prod.spline.design/ApEljaMrr9NQtUwP/scene.splinecode"
className="absolute -bottom-[15vh] lg:-bottom-[5vh] left-0 scale-1 md:scale-[1.2] z-[-1]"
/> */}
</section>
);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add unit tests for EventSection

As per PR objectives, tests are required. The component needs testing for:

  • Successful rendering of events
  • Proper layout structure
  • Responsive behavior

Would you like me to help generate the test suite for this component?

🧰 Tools
🪛 eslint

[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 17-17: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 18-18: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 18-18: Extra semicolon.

(style/semi)


export function MissionSection() {
return (
<section id="#about" className="relative flex justify-center w-full">
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove duplicate ID attribute

The #about ID appears twice in the component - once in the section and once in the inner div. This could cause issues with navigation and accessibility.

-        <section id="#about" className="relative flex justify-center w-full">
+        <section className="relative flex justify-center w-full">

Also applies to: 14-14

🧰 Tools
🪛 eslint

[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)

const meshRef = useRef<THREE.Mesh>(null!)
const [hovered, setHover] = useState(false)
const [active, setActive] = useState(false)
useFrame((state, delta) => (meshRef.current.rotation.x += delta))
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Refactor useFrame callback

The assignment in the useFrame expression could lead to unclear code behavior. Consider extracting the rotation logic.

-  useFrame((state, delta) => (meshRef.current.rotation.x += delta))
+  useFrame((state, delta) => {
+    meshRef.current.rotation.x += delta
+  })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
useFrame((state, delta) => (meshRef.current.rotation.x += delta))
useFrame((state, delta) => {
meshRef.current.rotation.x += delta
})
🧰 Tools
🪛 Biome (1.9.4)

[error] 13-13: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)

@@ -34,6 +34,7 @@
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-visually-hidden": "^1.1.0",
"@react-three/fiber": "^8.17.10",
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Review and align package versions for stability.

The newly added Three.js-related packages have version mismatches and are ahead of their latest stable releases:

  1. @react-three/[email protected] is ahead of the latest stable version (8.15.19)
  2. [email protected] is ahead of the latest stable version (0.162.0)
  3. @types/[email protected] doesn't match the version of three

Apply this diff to align the versions:

-    "@react-three/fiber": "^8.17.10",
+    "@react-three/fiber": "^8.15.19",
-    "three": "^0.171.0",
+    "three": "^0.162.0",
-    "@types/three": "^0.170.0",
+    "@types/three": "^0.162.0",

Also applies to: 51-51, 116-116

@JeremyFriesenGitHub JeremyFriesenGitHub marked this pull request as draft December 12, 2024 00:10
@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch from d8c8a34 to 6fd6c4b Compare December 12, 2024 02:19
@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch 3 times, most recently from 9d71552 to 12003b0 Compare December 19, 2024 21:22
Copy link

@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

🔭 Outside diff range comments (2)
libs/shared/config/tailwind/shadcn.ts (1)

Line range hint 33-75: Fix nested colors object and improve color token naming

There are two issues in the colors configuration:

  1. The colors object is incorrectly nested inside another colors object
  2. Generic color names (color-1 through color-5) lack semantic meaning

Fix the nested colors:

 colors: {
   border: 'hsl(var(--border))',
   // ... other colors ...
-  colors: {
-    'color-1': 'hsl(var(--color-1))',
-    'color-2': 'hsl(var(--color-2))',
-    'color-3': 'hsl(var(--color-3))',
-    'color-4': 'hsl(var(--color-4))',
-    'color-5': 'hsl(var(--color-5))',
-  },
+  'theme-1': 'hsl(var(--color-1))',
+  'theme-2': 'hsl(var(--color-2))',
+  'theme-3': 'hsl(var(--color-3))',
+  'theme-4': 'hsl(var(--color-4))',
+  'theme-5': 'hsl(var(--color-5))',
 },
apps/docs-e2e/src/docs.spec.ts (1)

Line range hint 196-203: Address disabled search modal test

The search modal test is disabled due to hanging. This should be investigated and fixed to ensure complete test coverage.

Consider these potential solutions:

  1. Add timeout configuration
  2. Implement proper dialog handling
  3. Use test isolation
test(`should contain Search Modal`, async ({ docsLayoutPage }) => {
  const dialogPromise = docsLayoutPage.page.waitForEvent('dialog');
  await docsLayoutPage.searchBar.click();
  const dialog = await dialogPromise;
  await dialog.accept();
  await expect(docsLayoutPage.searchModal).toBeVisible({ timeout: 5000 });
})
🧹 Nitpick comments (14)
libs/shared/assets/fonts/JetBrains_Mono/README.txt (1)

70-79: Add license version information

Please specify the version of the SIL Open Font License for clarity.

License
-------
-Please read the full license text (OFL.txt) to understand the permissions,
+Please read the full license text (OFL.txt) to understand the permissions,
+restrictions and requirements for usage, redistribution, and modification.
+This font is licensed under the SIL Open Font License, Version 1.1.
+
+The full license text can be found in OFL.txt. Please read it to understand the permissions,
libs/shared/config/tailwind/shadcn.ts (3)

6-6: Track technical debt: Custom styles in shadcn configuration

The TODO comment indicates technical debt regarding custom styles in the shadcn configuration. This should be tracked and addressed to maintain a clean separation of concerns.

Would you like me to create a GitHub issue to track this technical debt and propose a solution for separating custom styles from the shadcn configuration?


20-32: Improve naming consistency and documentation for gradients

The background image configurations have inconsistent naming patterns:

  • greendiant (creative but non-standard)
  • g-keyboardBlack (prefixed with 'g-')
  • g-nav-drawer-background (different format)

Consider standardizing the naming convention and adding documentation for complex gradients like the nav drawer.

 backgroundImage: {
-  'greendiant': 'linear-gradient(200deg, hsl(var(--secondary)) 10%, hsl(var(--primary)) 90%)',
-  'g-keyboardBlack': 'linear-gradient(300deg , hsl(var(--g-keyboardblack-start)) -10%, hsl(var(--background)) 100%)',
+  'g-primary': 'linear-gradient(200deg, hsl(var(--secondary)) 10%, hsl(var(--primary)) 90%)',
+  'g-keyboard': 'linear-gradient(300deg , hsl(var(--g-keyboardblack-start)) -10%, hsl(var(--background)) 100%)',
   'g-nav-drawer-background': `
   // Add comment explaining the complex gradient
   linear-gradient(

104-109: Improve maintainability of shadow configurations

The box shadow configurations use hardcoded RGBA values which could be difficult to maintain. Consider:

  1. Using CSS custom properties for shadow values
  2. Adding documentation for complex shadows
  3. Breaking down complex shadows into smaller, reusable components
 boxShadow: {
-  dropShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',
-  innerShadow: 'inset 0 4px 4px rgba(0, 0, 0, 0.25)',
+  // Use CSS custom properties for consistent shadow values
+  dropShadow: '0px 4px 4px hsl(var(--shadow-color) / 0.25)',
+  innerShadow: 'inset 0 4px 4px hsl(var(--shadow-color) / 0.25)',
   buttonKeyboard: '0.5px 0.5px 0px 0.6px rgba(0, 0, 0, 0.70), 0.35px 0.35px 0.2px 0.75px rgba(255, 255, 255, 0.15) inset, 4px 2px 4px -1px rgba(0, 0, 0, 0.25)',
   buttonKeyboardHover: '0.25px 0.25px 0px 0.5px #0A0A0A, 0.2px 0.2px 0.2px 0.35px rgba(255, 255, 255, 0.25) inset, 0.2px 0.2px 0px 0.75px rgba(137, 237, 16, 0.25), 0px 0px 10px -4px rgba(137, 237, 16, 0.60), 4px 2px 4px -1px rgba(0, 0, 0, 0.25)',
 },
apps/website-e2e/src/website.spec.ts (3)

41-45: Consolidate repeated test logic for footer logo navigation.
Notice that this test's logic is very similar to the one at lines 59-62. Consider merging or parameterizing these tests to avoid duplication.


55-57: Duplicate checks for sponsorship package visibility.
Both tests at lines 55-57 and lines 91-93 validate the same element. If there's no difference in context (e.g., a distinct user flow), consider combining them for brevity.

Also applies to: 91-93


18-20: Reminder to address TODOs for Instagram and LinkedIn auth.
Multiple TODOs are present for Instagram and LinkedIn. Ensure these test cases are eventually unskipped and fully tested once auth is configured.

Also applies to: 116-117, 190-194, 200-204

apps/website-e2e/src/lighthouse.spec.ts (2)

8-9: Replace empty object pattern or justify usage.
The empty object destructuring on line 9 might be unnecessary. You could remove it or provide a meaningful variable name if you plan to add parameters later.

🧰 Tools
🪛 Biome (1.9.4)

[error] 9-9: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)


28-35: Consider adjusting performance thresholds once experimental features stabilize.
Currently, the performance threshold is set to 50, presumably due to Spline. Once the website is optimized, raising this threshold will ensure high-performance standards going forward.

apps/website-e2e/playwright.config.ts (1)

47-60: Confirm testIgnore usage for Lighthouse tests.
Each project except 'chromium (desktop)' and 'chromium (mobile)' is ignoring “lighthouse.spec.ts”. If Lighthouse coverage is essential across all browsers, consider enabling it for certain projects or conditionally toggling it.

apps/website-e2e/src/pom.ts (1)

3-3: Implement dynamic locators or a CMS-based approach once available.
This file references a TODO comment highlighting a future refactor for link locators. Keeping it in mind, a more data-driven approach could streamline updates once a CMS is adopted.

apps/docs-e2e/src/docs.spec.ts (3)

1-1: Consider prioritizing the refactoring task

Moving the e2e tests to libs/docs-e2e would improve the project's architecture. This refactoring should be tracked.

Would you like me to create a GitHub issue to track this refactoring task?


Line range hint 32-91: Consider adding accessibility tests

While the basic functionality tests are comprehensive, consider adding accessibility tests to ensure the documentation is accessible to all users. This could include:

  • Testing ARIA labels
  • Keyboard navigation
  • Color contrast
  • Screen reader compatibility
// Example accessibility tests to add:
test('should have proper ARIA labels on navigation elements', async ({ docsLayoutPage }) => {
  await expect(docsLayoutPage.cuHackingLogoIcon).toHaveAttribute('aria-label', 'cuHacking Logo')
})

test('should be navigable via keyboard', async ({ docsLayoutPage }) => {
  await docsLayoutPage.page.keyboard.press('Tab')
  await expect(docsLayoutPage.page.locator(':focus')).toBeTruthy()
})

Line range hint 286-291: Implement GitHub edit button navigation test

The FIXME comment indicates that the GitHub edit button test needs proper implementation to verify navigation to the correct file.

Here's a suggested implementation:

test('should navigate to correct GitHub file when Edit on GitHub is clicked', async ({ docsLayoutPage }) => {
  // Navigate to a specific docs page
  await docsLayoutPage.goto('/docs/specific-page');
  
  // Get the current page path
  const currentPath = await docsLayoutPage.page.evaluate(() => window.location.pathname);
  
  // Construct expected GitHub URL
  const expectedGithubUrl = `${CUHACKING_2025_GITHUB_REPOSITORY_URL}/blob/main/apps/docs/content${currentPath}.mdx`;
  
  // Click edit button and verify URL
  await clickAndGoToPage(docsLayoutPage, docsLayoutPage.editOnGithubButton, expectedGithubUrl);
});

Would you like me to create a GitHub issue to track this implementation?

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 6fd6c4b and 12003b0.

⛔ Files ignored due to path filters (20)
  • libs/shared/assets/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Bold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-BoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraBold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraBoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraLight.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraLightItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Italic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Light.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-LightItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Medium.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-MediumItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Regular.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-SemiBold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-SemiBoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Thin.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ThinItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/icons/general/cross-1.svg is excluded by !**/*.svg
  • libs/shared/assets/icons/socials/linkedin-white-1.svg is excluded by !**/*.svg
📒 Files selected for processing (16)
  • .gitignore (1 hunks)
  • .storybook/main.ts (1 hunks)
  • apps/docs-e2e/src/docs.spec.ts (1 hunks)
  • apps/website-e2e/playwright.config.ts (2 hunks)
  • apps/website-e2e/src/lighthouse.spec.ts (1 hunks)
  • apps/website-e2e/src/pom.ts (1 hunks)
  • apps/website-e2e/src/website.spec.ts (1 hunks)
  • apps/website/app/root.tsx (2 hunks)
  • apps/website/app/routes/_index.tsx (1 hunks)
  • apps/website/vite.config.ts (1 hunks)
  • libs/external/shadcn/tailwind.config.ts (1 hunks)
  • libs/shared/assets/fonts/JetBrains_Mono/OFL.txt (1 hunks)
  • libs/shared/assets/fonts/JetBrains_Mono/README.txt (1 hunks)
  • libs/shared/config/tailwind/shadcn.ts (3 hunks)
  • libs/shared/ui/accordion/accordion.stories.tsx (0 hunks)
  • libs/shared/ui/accordion/accordion.tsx (2 hunks)
💤 Files with no reviewable changes (1)
  • libs/shared/ui/accordion/accordion.stories.tsx
🚧 Files skipped from review as they are similar to previous changes (6)
  • apps/website/app/root.tsx
  • .gitignore
  • libs/shared/ui/accordion/accordion.tsx
  • apps/website/app/routes/_index.tsx
  • libs/external/shadcn/tailwind.config.ts
  • .storybook/main.ts
🧰 Additional context used
🪛 Biome (1.9.4)
apps/website-e2e/src/lighthouse.spec.ts

[error] 9-9: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)

🪛 LanguageTool
libs/shared/assets/fonts/JetBrains_Mono/OFL.txt

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)

libs/shared/assets/fonts/JetBrains_Mono/README.txt

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)

🔇 Additional comments (11)
libs/shared/assets/fonts/JetBrains_Mono/OFL.txt (3)

1-93: License file missing in static font directory

While adding the OFL.txt to the main font directory is correct, it should also be included in the static font subdirectory to fully comply with SIL OFL terms.

Let's verify the license file placement and content:

#!/bin/bash
# Description: Verify license placement and content

# Check if static directory exists and contains font files
if fd -p "libs/shared/assets/fonts/JetBrains_Mono/static/.*\.(ttf|woff2?)$"; then
  echo "Static font directory exists with font files but missing OFL.txt"
fi

# Verify license content matches official SIL OFL
curl -s https://scripts.sil.org/cms/scripts/render_download.php?format=file&media_id=OFL_plaintext | diff - libs/shared/assets/fonts/JetBrains_Mono/OFL.txt
🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)


1-1: LGTM: Copyright notice is correctly attributed

The copyright notice properly attributes the JetBrains Mono Project Authors with the correct repository link.


3-5: LGTM: License reference is accurate

The license reference and link to the FAQ are correct and up-to-date.

libs/shared/assets/fonts/JetBrains_Mono/README.txt (2)

1-32: LGTM: Font description is accurate and complete

The section properly documents both variable and static font options, including all available weights and styles.

🧰 Tools
🪛 LanguageTool

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)


41-69: Update or remove broken URLs in the README

Several URLs in the documentation are no longer accessible or outdated.

apps/website/vite.config.ts (2)

Line range hint 6-10: LGTM! Future interface extension aligns with Remix v3 features

The addition of v3_singleFetch along with other v3 features in the configuration shows good adoption of modern Remix practices.


33-33: ⚠️ Potential issue

Fix redundant path and verify filesystem access

There are two issues to address:

  1. The path '../../libs/shared/' appears to be redundant as it's already covered by '../../libs/'
  2. The broad filesystem access needs verification for security implications

Apply this fix to remove the redundancy:

-      allow: ['../../libs/shared/', '../../libs/', '..'],
+      allow: ['../../libs/', '..'],

Let's verify the required paths and their contents:

apps/website-e2e/playwright.config.ts (1)

81-85: Review ignore rules in CI.
You are ignoring both “chromium (desktop)” and “chromium (mobile)” in CI. If coverage is needed on these projects, reconsider adjusting or removing the ignore list.

apps/website-e2e/src/pom.ts (1)

66-117: Validate consistent naming and usage of locators.
All sections and locators here follow a clear naming convention, which is good. Confirm that these IDs (e.g. “#welcome”, “#navbar”) match the website's actual DOM IDs to avoid test flakiness.

apps/docs-e2e/src/docs.spec.ts (2)

Line range hint 18-31: Verify the availability and accessibility of external URLs

Several URLs are commented out with TODOs. It's important to ensure these resources will be available before uncommenting the tests.

✅ Verification successful

URLs are currently unavailable - keep them commented out

The verification confirms that both design.cuhacking.ca and eslint.cuhacking.ca/rules are not accessible at this time. The commented-out state of these URLs in the code is appropriate until the resources become available.

  • design.cuhacking.ca - Connection failed
  • eslint.cuhacking.ca/rules - Connection failed
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check the availability of the commented-out URLs

# Extract and verify the URLs
echo "Checking URLs..."
curl -sI "https://design.cuhacking.ca/" | head -n 1 || echo "design.cuhacking.ca not available"
curl -sI "https://eslint.cuhacking.ca/rules" | head -n 1 || echo "eslint.cuhacking.ca not available"
curl -sI "https://www.linkedin.com/company/cuhacking/" | head -n 1 || echo "LinkedIn page not accessible"

Length of output: 230


Line range hint 1-291: Address test completion before finalizing website v1

According to the PR objectives, this is part of finalizing website v1, but there are several test-related items that should be addressed:

  1. Implement disabled search modal test
  2. Add accessibility tests
  3. Complete GitHub edit button navigation test
  4. Verify and implement tests for commented-out URLs

These items should be completed to ensure proper test coverage for the website's first version.

✅ Verification successful

The shell script results provide clear evidence about the state of tests. Let me generate the final response:

Complete remaining test implementations before finalizing website v1

Several test-related items need attention:

  • Disabled tests in docs.spec.ts that use test.skip() for device-specific scenarios
  • Commented-out tests for links that require authentication (Instagram, LinkedIn)
  • Unimplemented language toggle tests in pom.ts
  • Incomplete GitHub edit button navigation test (marked as FIXME)
  • Helper function in click-and-go-to-page.ts needs refactoring to separate assertions

The skipped tests appear to be intentional for device-specific test suites, but other TODOs represent genuine gaps in test coverage that should be addressed for a complete v1 release.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check test coverage and TODO items

# Find all TODO/FIXME comments in test files
echo "Checking for remaining TODO/FIXME items..."
rg "TODO|FIXME" "apps/docs-e2e/src/"

# Check for disabled tests
echo "Checking for disabled tests..."
rg "test\.skip|test\(.*\{.*skip" "apps/docs-e2e/src/"

Length of output: 1774

Comment on lines +33 to +40
Get started
-----------

1. Install the font files you want to use

2. Use your app's font picker to view the font family and all the
available styles

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add web font usage instructions

Since this is a web project, consider adding instructions for:

  • Using the fonts in CSS via @font-face
  • Font loading optimization strategies
  • Browser compatibility notes for variable fonts

Example addition:

2. Use your app's font picker to view the font family and all the
available styles

+Web Usage
+---------
+
+1. Add the font files to your project's assets
+2. Define the @font-face rules:
+   ```css
+   @font-face {
+     font-family: 'JetBrains Mono';
+     src: url('path/to/JetBrainsMono-VariableFont_wght.ttf') format('truetype-variations');
+     font-weight: 100 800;
+   }
+   ```
+3. Use the font in your CSS:
+   ```css
+   body {
+     font-family: 'JetBrains Mono', monospace;
+   }
+   ```

Comment on lines +119 to +123
async goto() {
await this.page
.goto('http://localhost:3000')
}
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider making the base URL configurable.
The goto() method hardcodes 'http://localhost:3000'. For greater flexibility, consider parameterizing it to adapt to various deployment or test environments.

@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch 2 times, most recently from 06c921e to 8e45c68 Compare December 22, 2024 22:26
Copy link

@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: 20

🔭 Outside diff range comments (1)
libs/shared/ui/global.css (1)

Consider adding WOFF2 format for better cross-platform font support

The font implementation could be improved for better cross-platform compatibility:

  • Only TTF format is currently used, which may not be optimal for web browsers
  • WOFF2 format is missing, which is the recommended format for modern web browsers due to better compression and faster loading
  • The variable font implementation is present but could benefit from a format fallback strategy

Suggested improvements:

  • Add WOFF2 format as the primary source with TTF as fallback
  • Consider adding font-display: swap to prevent FOIT (Flash of Invisible Text)
  • Include explicit font-weight and font-style descriptors in the @font-face rule for better browser compatibility
🔗 Analysis chain

Line range hint 1-90: Verify font rendering across platforms

According to the PR objectives, cross-platform testing hasn't been completed. Please verify that the JetBrains Mono font renders consistently across mobile, tablet, and desktop platforms, especially considering the variable font implementation.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if font files are properly referenced and exist
echo "Verifying font file existence and references..."
fd -t f "JetBrainsMono.*\.(ttf|woff2?)$" -x echo "Found font file: {}"

# Check for any potential font-related CSS issues
echo "Checking for potential font-related issues in CSS files..."
rg -l "JetBrains.*Mono" | xargs rg "font-.*:"

Length of output: 2299

♻️ Duplicate comments (4)
libs/website/shared/ui/spline/spline-component.tsx (2)

7-13: 🛠️ Refactor suggestion

Define a proper TypeScript interface for props

For better type safety and documentation, define a proper interface for the component props.

+interface SplineComponentProps {
+  /** URL to the Spline scene */
+  link: string;
+  /** Additional CSS classes */
+  className?: string;
+}

-export function SplineComponent({
-  link,
-  className,
-}: {
-  link: string;
-  className: string;
-}) {
+export function SplineComponent({ link, className }: SplineComponentProps) {
🧰 Tools
🪛 eslint

[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


1-23: ⚠️ Potential issue

Add unit tests for the component

As per PR objectives, tests are required for:

  • Successful rendering
  • Loading state
  • Error handling
  • Props validation

Would you like me to help generate the test suite for this component? Here's a sample test structure:

import { render, screen } from '@testing-library/react';
import { SplineComponent } from './spline-component';

describe('SplineComponent', () => {
  it('should render successfully', () => {
    render(<SplineComponent link="test-scene" />);
    expect(screen.getByRole('region')).toBeInTheDocument();
  });

  it('should show loading state', () => {
    render(<SplineComponent link="test-scene" />);
    expect(screen.getByRole('progressbar')).toBeInTheDocument();
  });

  // More test cases...
});
🧰 Tools
🪛 eslint

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 22-22: Extra semicolon.

(style/semi)

libs/website/feature/events/ui/event.section.tsx (1)

1-18: ⚠️ Potential issue

Add unit tests for EventSection

As per PR objectives, tests are required for:

  • Successful rendering of events
  • Proper layout structure
  • Responsive behavior

Would you like me to help generate the test suite for this component? Here's a sample test structure:

import { render, screen } from '@testing-library/react';
import { EventSection } from './event.section';

describe('EventSection', () => {
  it('should render successfully', () => {
    render(<EventSection />);
    expect(screen.getByTestId('events-section')).toBeInTheDocument();
  });

  it('should render all events from constants', () => {
    render(<EventSection />);
    EVENT_CONSTANTS.EVENTS.forEach(event => {
      expect(screen.getByText(event.title)).toBeInTheDocument();
    });
  });

  // More test cases...
});
🧰 Tools
🪛 eslint

[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 17-17: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 18-18: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 18-18: Extra semicolon.

(style/semi)

libs/website-e2e/ui/welcome/welcome.ts (1)

14-21: 🛠️ Refactor suggestion

Add viewport-specific tests for responsive design

Similar to the footer, add viewport-specific tests to ensure proper rendering across different screen sizes.

🧹 Nitpick comments (27)
libs/shared/ui/global.css (2)

5-6: Enhance the warning comment for better clarity

The current comment could be more informative about why Google CDN should not be used.

-/* DO NOT IMPORT FONT FROM GOOGLE CDN */
+/* DO NOT IMPORT FONT FROM GOOGLE CDN - Using local font files for better performance and offline support */

40-41: Consider removing duplicate gradient variables from dark theme

The --greendiant-start and --greendiant-end variables have the same values in both light and dark themes. Consider defining them only once in the :root selector to reduce duplication.

 :root {
   /* ... other variables ... */
   --greendiant-start: 78 100% 42%;
   --greendiant-end: 136 98% 45%;
 }
 .dark {
   /* ... other variables ... */
-  --greendiant-start: 78 100% 42%;
-  --greendiant-end: 136 98% 45%;
 }
libs/shared/config/tailwind/shadcn.ts (3)

6-6: Track technical debt: Custom styles in shadcn config

The TODO comment indicates technical debt regarding custom styles in the shadcn configuration. While this works for now, it should be tracked for future refactoring to maintain better separation of concerns.

Would you like me to create a GitHub issue to track this technical debt for future refactoring?


20-32: Consider simplifying the nav drawer gradient syntax

The gradient definitions are well-structured, but the nav drawer background gradient could be more concise.

Consider this more concise syntax:

-          'g-nav-drawer-background': `
-          linear-gradient(
-            90deg,
-            hsl(var(--background)) 0%,
-            hsl(var(--light-black)) 25%,
-            hsl(var(--light-black)) 75%,
-            hsl(var(--background)) 100%
-          )
-        `,
+          'g-nav-drawer-background': 'linear-gradient(90deg, hsl(var(--background)) 0%, hsl(var(--light-black)) 25%, hsl(var(--light-black)) 75%, hsl(var(--background)) 100%)',

Line range hint 33-83: Consider using semantic names for the color scale

The color system is well-structured, but the numeric color scale (color-1 through color-5) could benefit from more semantic names to indicate their purpose or role in the design system.

Consider renaming based on their intended use, for example:

           colors: {
-            'color-1': 'hsl(var(--color-1))',
-            'color-2': 'hsl(var(--color-2))',
-            'color-3': 'hsl(var(--color-3))',
-            'color-4': 'hsl(var(--color-4))',
-            'color-5': 'hsl(var(--color-5))',
+            'brand-primary': 'hsl(var(--color-1))',
+            'brand-secondary': 'hsl(var(--color-2))',
+            'accent-primary': 'hsl(var(--color-3))',
+            'accent-secondary': 'hsl(var(--color-4))',
+            'neutral': 'hsl(var(--color-5))',
           },
libs/website-e2e/features/lighthouse/lighthouse.ts (2)

28-35: Ensure performance thresholds are re-evaluated before production.

Performance threshold is temporarily lowered to 50. Consider documenting and revisiting this setting later so that you do not unintentionally ship with suboptimal performance metrics.


37-65: Improve parallel test directory naming convention.

Reports are written to a relative directory, “../../../lighthouse-report”. For parallel runs, consider using unique paths or including a timestamp to prevent overwriting test artifacts from concurrent runs.

apps/website-e2e/src/pom.ts (1)

3-3: Consider addressing the TODO comment sooner.

Refactoring link locators when a CMS is introduced is a beneficial plan. Make sure to track it and implement once the CMS is ready.

libs/website-e2e/ui/navbar/navbar.ts (3)

7-8: Add or reference tests for mobile navbar navigation.

A TODO indicates adding tests for navigating through the site on mobile. Including these tests, or referencing existing navigation coverage, ensures completeness for all device types.


108-112: Revisit the Instagram test case.

Instagram's authentication can be challenging to automate. Consider mocking or stubbing out the authentication flow, or using a dedicated test user account with appropriate credentials.


137-140: Add explicit navigation wait after click.

When validating that the user is taken to Figma, you directly compare the resulting URL. Ensure that navigation is complete to avoid potential flakiness, e.g., by using “await page.waitForLoadState(‘networkidle’)” if necessary.

libs/website-e2e/ui/sponsorship/pom.ts (1)

15-18: Consider enhancing the goto() method with validation.

The navigation method could be improved by adding a wait for the sponsors section to be visible.

 async goto() {
   await this.page
     .goto(CUHACKING_2025_WEBSITE_URL)
+  await this.sponsorsSection.waitFor({ state: 'visible' })
 }
libs/website-e2e/shared/constants.ts (1)

3-5: TODO: Implementation plan needed for social media authentication.

The TODO comment about LinkedIn and Instagram authentication needs to be tracked and implemented.

Would you like me to help create a GitHub issue to track the social media authentication implementation?

libs/website/shared/ui/socials/socials.tsx (2)

14-14: Remove TODO comment as it's already implemented

The TODO comment about updating social media props for aria-label improvement is now redundant since the implementation already includes the name property for aria-labels.

-// TODO: update social media props to incldue social media name --> aria-label improvement

25-29: Consider adding keyboard interaction styles

While hover effects are implemented, consider adding focus styles for keyboard navigation to enhance accessibility.

 <Icon
   media={media}
   prefix="/socials"
-  className="transition-transform duration-300 hover:scale-[1.2]"
+  className="transition-transform duration-300 hover:scale-[1.2] focus:scale-[1.2] focus:outline-none focus:ring-2 focus:ring-primary"
 />
libs/website-e2e/ui/welcome/pom.ts (1)

16-27: Consider grouping related locators

The social media link locators could be grouped into a more maintainable structure using a map or object.

 constructor(page: Page) {
   this.page = page
   this.welcomeSection = page.locator('#welcome')
-  this.discordLinkWelcome = this.welcomeSection.getByRole('link', { name: 'Discord' })
-  this.instagramLinkWelcome = this.welcomeSection.getByRole('link', { name: 'Instagram' })
-  // ... other links
+  const socialLinks = ['Discord', 'Instagram', 'LinkedIn', 'Linktree', 'Figma', 'GitHub', 'Email', 'Docs']
+  socialLinks.forEach(name => {
+    this[`${name.toLowerCase()}LinkWelcome`] = this.welcomeSection.getByRole('link', { name })
+  })
 }
libs/website-e2e/ui/sponsorship/sponsorship.ts (1)

9-10: Remove ESLint disable comment

The ESLint disable comment for react-hooks/rules-of-hooks is unnecessary in a test file and should be removed.

-    // eslint-disable-next-line react-hooks/rules-of-hooks
     await use(sponsorshipSectionLayout)
libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (1)

25-29: Add key based on index for mapped elements.

When mapping text items, using content as key might not be unique if the same content appears multiple times.

-        {text.map(({ content, isCallToAction }) => (
+        {text.map(({ content, isCallToAction }, index) => (
-          <TerminalText key={content} callToAction={isCallToAction}>
+          <TerminalText key={`${content}-${index}`} callToAction={isCallToAction}>
             <p>{content}</p>
           </TerminalText>
         ))}
libs/website-e2e/ui/navbar/pom.ts (3)

7-7: Fix typo in comment: "MOBLE" → "MOBILE"

Minor typo in the section comment.

-  // --------MOBLE--------
+  // --------MOBILE--------

29-48: Consider consolidating duplicate selectors between mobile and desktop

The comment suggests these are "MOBILE + TABLET + DESKTOP" selectors, but they're mixed with mobile-specific ones. Consider restructuring to clearly separate viewport-specific selectors.


50-53: Add viewport-specific navigation methods

The goto() method could be enhanced to handle different viewport sizes for better test coverage.

 async goto() {
   await this.page
     .goto(CUHACKING_2025_WEBSITE_URL)
+  // Consider adding viewport-specific methods:
+  // async gotoMobile() {
+  //   await this.page.setViewportSize({ width: 375, height: 667 })
+  //   await this.goto()
+  // }
 }
libs/website/shared/ui/navigation/footer/constants/footer.constants.ts (2)

23-24: Fix casing: "Github" → "GitHub"

Maintain consistent casing with the official brand name.

-    name: 'Github',
+    name: 'GitHub',

48-49: Consider moving long Figma URL to environment variables

The Figma design URL is quite long and might change. Consider moving it to environment variables or a separate configuration file.

+// In environment.ts
+export const FIGMA_DESIGN_URL = 'https://www.figma.com/design/wc1JOWR48tBNkjcjwY3AzB/%E2%8C%A8%EF%B8%8F-cuHacking-Design-System?node-id=0-1&t=YTR1ET4Qw1wG1cjz-1'

+// In footer.constants.ts
-    link: 'https://www.figma.com/design/wc1JOWR48tBNkjcjwY3AzB/%E2%8C%A8%EF%B8%8F-cuHacking-Design-System?node-id=0-1&t=YTR1ET4Qw1wG1cjz-1',
+    link: FIGMA_DESIGN_URL,
libs/website/ui/sponsorship/constants/sponsorship.constants.ts (2)

13-15: Consider removing empty presentSponsors array if not used

The presentSponsors array is empty. If there are no current sponsors, consider:

  1. Removing the array entirely, or
  2. Adding a comment explaining why it's empty

Line range hint 30-33: Consider adding JSDoc comments for sponsorshipText array

The text content would benefit from documentation explaining its purpose and usage in the UI.

+/**
+ * Text content for the sponsorship section.
+ * @property {boolean} isCallToAction - Indicates if the text should be styled as a call-to-action
+ */
const sponsorshipText = [
libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (1)

95-95: Fix typo in alt text

The alt text for the hamburger icon contains a typo.

-    alt: 'Hambuger icon',
+    alt: 'Hamburger icon',
libs/website-e2e/ui/footer/footer.ts (1)

91-94: Enhance email link test

The current test only checks the href attribute. Consider adding a test to verify the mailto protocol.

   test('should take user to Email page from footer', async ({ footerLayout }) => {
     const href = footerLayout.emailLinkFooter
     await expect(href).toHaveAttribute('href', CUHACKING_2025_EMAIL_URL)
+    await expect(href).toHaveAttribute('href', /^mailto:/);
   })
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 12003b0 and 8e45c68.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (39)
  • apps/docs-e2e/src/docs.spec.ts (1 hunks)
  • apps/website-e2e/playwright.config.ts (2 hunks)
  • apps/website-e2e/src/lighthouse.spec.ts (1 hunks)
  • apps/website-e2e/src/pages/home.spec.ts (1 hunks)
  • apps/website-e2e/src/pom.ts (1 hunks)
  • apps/website-e2e/src/website.spec.ts (0 hunks)
  • apps/website/vite.config.ts (1 hunks)
  • libs/shared/config/tailwind/shadcn.ts (3 hunks)
  • libs/shared/ui/global.css (3 hunks)
  • libs/website-e2e/features/lighthouse/lighthouse.ts (1 hunks)
  • libs/website-e2e/project.json (1 hunks)
  • libs/website-e2e/shared/constants.ts (1 hunks)
  • libs/website-e2e/shared/utils/click-and-go-to-page.ts (1 hunks)
  • libs/website-e2e/shared/utils/gotoURL.ts (1 hunks)
  • libs/website-e2e/tsconfig.json (1 hunks)
  • libs/website-e2e/ui/footer/footer.ts (1 hunks)
  • libs/website-e2e/ui/footer/pom.ts (1 hunks)
  • libs/website-e2e/ui/navbar/constants.ts (1 hunks)
  • libs/website-e2e/ui/navbar/navbar.ts (1 hunks)
  • libs/website-e2e/ui/navbar/pom.ts (1 hunks)
  • libs/website-e2e/ui/sponsorship/constants.ts (1 hunks)
  • libs/website-e2e/ui/sponsorship/pom.ts (1 hunks)
  • libs/website-e2e/ui/sponsorship/sponsorship.ts (1 hunks)
  • libs/website-e2e/ui/welcome/pom.ts (1 hunks)
  • libs/website-e2e/ui/welcome/welcome.ts (1 hunks)
  • libs/website/feature/events/ui/event-item/event-item.tsx (3 hunks)
  • libs/website/feature/events/ui/event.section.tsx (1 hunks)
  • libs/website/shared/ui/navigation/footer/constants/footer.constants.ts (2 hunks)
  • libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (3 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (2 hunks)
  • libs/website/shared/ui/socials/socials.tsx (1 hunks)
  • libs/website/shared/ui/spline/spline-component.tsx (1 hunks)
  • libs/website/ui/introduction/constants/welcome.constants.ts (2 hunks)
  • libs/website/ui/introduction/welcome/welcome.section.tsx (1 hunks)
  • libs/website/ui/sponsorship/constants/sponsorship.constants.ts (1 hunks)
  • libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (1 hunks)
  • package.json (3 hunks)
  • tsconfig.base.json (1 hunks)
💤 Files with no reviewable changes (1)
  • apps/website-e2e/src/website.spec.ts
✅ Files skipped from review due to trivial changes (3)
  • libs/website-e2e/ui/sponsorship/constants.ts
  • libs/website-e2e/tsconfig.json
  • libs/website-e2e/project.json
🚧 Files skipped from review as they are similar to previous changes (8)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx
  • libs/website/ui/introduction/welcome/welcome.section.tsx
  • apps/website/vite.config.ts
  • libs/website/feature/events/ui/event-item/event-item.tsx
  • apps/docs-e2e/src/docs.spec.ts
  • package.json
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx
  • apps/website-e2e/playwright.config.ts
🧰 Additional context used
🪛 Biome (1.9.4)
libs/website-e2e/features/lighthouse/lighthouse.ts

[error] 9-9: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)

🪛 eslint
libs/website/feature/events/ui/event.section.tsx

[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 17-17: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 18-18: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 18-18: Extra semicolon.

(style/semi)

libs/website/shared/ui/spline/spline-component.tsx

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 22-22: Extra semicolon.

(style/semi)

🔇 Additional comments (20)
tsconfig.base.json (2)

22-23: LGTM! Path mapping follows established pattern.

The new path mapping for @website-e2e/* follows the consistent pattern used throughout the configuration and points to an appropriate location within the libs directory.


23-23: Verify the status of e2e tests implementation.

While the path mapping for e2e tests is being added, the PR checklist indicates that tests haven't been added yet. Please clarify:

  1. Is this path mapping premature?
  2. Are there pending e2e tests that need to be committed?
  3. Should this PR be blocked until the tests are complete?

Let's check if any e2e test files exist:

✅ Verification successful

E2E test implementation is in progress but not blocking

The e2e test framework is already set up and contains multiple implemented test files across different components (navbar, footer, welcome, sponsorship). While there are some pending TODOs, they are primarily related to authentication requirements for social media testing (Instagram, LinkedIn) rather than missing core functionality tests.

  • The path mapping is appropriate as it supports the existing e2e test structure
  • Current TODOs are specific to auth-dependent features and test organization, not missing core tests
  • PR can proceed as the e2e testing foundation is in place
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for the existence of e2e test files and their implementation status

# Check if the e2e directory exists and list its contents
fd -t d "website-e2e" libs/

# Look for typical e2e test files
rg -g "*.{ts,js,tsx,jsx}" -l "describe|test|it\(" libs/website-e2e/

# Check for TODO/FIXME comments in e2e files
rg -g "*.{ts,js,tsx,jsx}" "TODO|FIXME" libs/website-e2e/

Length of output: 1369

libs/shared/ui/global.css (2)

12-15: Optimize the font-face declaration

The font-face declaration still needs optimization for better performance and reliability.


84-84: LGTM!

The font-family declaration is correctly implemented with an appropriate fallback.

libs/shared/config/tailwind/shadcn.ts (1)

Line range hint 1-120: Add visual regression tests for design system

Given this is for website v1 completion and the PR checklist mentions missing tests, consider adding visual regression tests to ensure these styles render consistently across different platforms (mobile, tablet, desktop).

libs/website/feature/events/ui/event.section.tsx (2)

1-1: Remove or restore commented SplineComponent code

The commented SplineComponent code should either be:

  1. Removed if not needed
  2. Restored if it's part of the v1 release
  3. Tracked in a separate issue if planned for future

If you decide to keep it, consider downloading and serving the Spline scene locally to avoid external dependencies.

Also applies to: 13-16


7-12: Verify responsive layout across devices

The PR objectives mention website v1 completion, but there's no indication of cross-device testing.

✅ Verification successful

Based on the search results, I can generate the final response as we have comprehensive information about the responsive design implementation:

Responsive layout implementation verified

The codebase shows extensive responsive design implementation using Tailwind's breakpoint classes:

  • Mobile-first approach with responsive utilities (sm, md, lg, xl)
  • Proper padding/margin adjustments for different screen sizes (e.g., px-5 py-5 lg:px-20 lg:py-14)
  • Responsive layout changes using flex/grid (e.g., flex-col lg:flex-row)
  • Viewport-specific visibility controls (e.g., hidden md:block)

The event section specifically implements responsive design through:

  • Adaptive container width and padding: w-full max-w-screen-xl px-5 py-5 lg:px-20 lg:py-14
  • Responsive grid layout in EventPresenter: grid-col-1 md:grid-cols-2
  • Flexible item sizing: w-full lg:basis-[calc(50%-0.5rem)]
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for responsive design test files
echo "Searching for responsive design tests..."
rg -l "responsive|mobile|tablet|desktop" -g "*.test.*" -g "*.spec.*"

# Search for viewport-related classes
echo "\nSearching for responsive utility classes..."
rg "sm:|md:|lg:|xl:" -g "*.tsx" -g "*.jsx"

Length of output: 9460

🧰 Tools
🪛 eslint

[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)

apps/website-e2e/src/pom.ts (1)

119-123: Use a configurable base URL

This is similar to a previously provided review comment. The hardcoded "http://localhost:3000" URL in the “goto” method limits test flexibility. Recommend making the URL configurable via environment variables or test configuration.

libs/website-e2e/ui/navbar/navbar.ts (1)

118-122: Plan for LinkedIn authentication testing.

Similar to the Instagram test, the LinkedIn test is skipped due to auth requirements. Revisiting this once authentication flows or environment secrets are set up will improve coverage for sharing and external link functionality.

libs/website-e2e/ui/navbar/constants.ts (2)

1-6: Verify base URL consistency

Need to ensure the base URL is properly validated and consistent across the application.

Let's check URL usage across the codebase:

✅ Verification successful

Base URL is consistent and properly used across the codebase

The base URL (CUHACKING_2025_WEBSITE_URL) is consistently defined in shared/constants.ts and properly used across the codebase. The URL fragments for about, events, sponsors, and FAQ sections are correctly defined in the navbar constants and used consistently in both the website and e2e testing code. No inconsistencies or hardcoded URLs were found.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for inconsistent URL formats
rg "CUHACKING.*_URL.*=.*[^#]/" 

# Check for hardcoded URLs that should use these constants
rg -i "cuhacking.*\.(com|org|net)/.*#(about|events|sponsors|faq)"

Length of output: 3111


Script:

#!/bin/bash
# Let's check where CUHACKING_2025_WEBSITE_URL is used
rg "CUHACKING_2025_WEBSITE_URL" -B 2 -A 2

# Let's also check for any other URL patterns that might be related to the website sections
rg -i "/#(about|events|sponsors|faq)" -B 2 -A 2

Length of output: 7676


3-6: Consider SEO impact and add documentation

Using fragment identifiers (#) for main navigation routes might impact SEO. Also, constants lack documentation and type safety.

Consider these improvements:

+/** Base URL for the CUHacking 2025 website sections */
+type SectionURL = `${string}/#${string}`

-export const CUHACKING_WEBSITE_ABOUT_URL = `${CUHACKING_2025_WEBSITE_URL}/#about`
+export const CUHACKING_WEBSITE_ABOUT_URL: SectionURL = `${CUHACKING_2025_WEBSITE_URL}/#about`

Let's verify the SEO impact of using fragment identifiers:

libs/website-e2e/ui/sponsorship/pom.ts (1)

4-13: LGTM! Well-structured Page Object Model implementation.

The class follows good POM practices with proper encapsulation and uses recommended Playwright locator strategies:

  • Semantic locator for the link improves test maintainability
  • ID-based locator for the section is reliable
libs/website-e2e/shared/constants.ts (1)

6-11: Verify the external URLs are accessible.

Let's ensure all external URLs are valid and accessible.

libs/website/shared/ui/socials/socials.tsx (1)

19-24: ⚠️ Potential issue

Add security attributes for external links

When using target="_blank", it's important to include rel="noopener noreferrer" to prevent potential security vulnerabilities.

 <Link
   target="_blank"
+  rel="noopener noreferrer"
   key={link}
   to={link}
   aria-label={name}
 >

Likely invalid or redundant comment.

libs/website-e2e/ui/footer/pom.ts (1)

24-24: Consider a more robust selector for the logo.

Using .last() for selecting the logo could be fragile if more logo images are added to the page. Consider using a more specific selector or adding a unique test ID.

libs/website/ui/introduction/constants/welcome.constants.ts (1)

33-35: Remove sensitive information from the Figma link.

The Figma link contains design system details that might be sensitive.

libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (2)

16-17: Move configuration to environment variables.

The sponsorship package URL should not be hardcoded.


12-57: Add tests for the SponsorshipPresenter component.

As per the PR objectives, tests are missing.

libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (1)

21-85: LGTM! Social media links have been properly updated

All placeholder URLs have been replaced with actual organization-specific URLs, addressing previous review comments.

libs/website-e2e/ui/welcome/welcome.ts (1)

1-1: Address comprehensive testing requirements

While the e2e tests are a good start, there are several testing areas that need attention:

  1. Add viewport-specific tests for responsive design
  2. Add unit tests for components
  3. Consider adding visual regression tests for UI components
  4. Add integration tests for component interactions

This aligns with the PR objectives which indicate that tests are incomplete.

Comment on lines +104 to +109
boxShadow: {
dropShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',
innerShadow: 'inset 0 4px 4px rgba(0, 0, 0, 0.25)',
buttonKeyboard: '0.5px 0.5px 0px 0.6px rgba(0, 0, 0, 0.70), 0.35px 0.35px 0.2px 0.75px rgba(255, 255, 255, 0.15) inset, 4px 2px 4px -1px rgba(0, 0, 0, 0.25)',
buttonKeyboardHover: '0.25px 0.25px 0px 0.5px #0A0A0A, 0.2px 0.2px 0.2px 0.35px rgba(255, 255, 255, 0.25) inset, 0.2px 0.2px 0px 0.75px rgba(137, 237, 16, 0.25), 0px 0px 10px -4px rgba(137, 237, 16, 0.60), 4px 2px 4px -1px rgba(0, 0, 0, 0.25)',
},
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider using CSS variables for shadow values

The box shadow definitions are well-crafted but use hardcoded values. For better maintainability and consistency, consider extracting these values into CSS custom properties.

Here's a suggested approach:

         boxShadow: {
-          dropShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',
-          innerShadow: 'inset 0 4px 4px rgba(0, 0, 0, 0.25)',
-          buttonKeyboard: '0.5px 0.5px 0px 0.6px rgba(0, 0, 0, 0.70), 0.35px 0.35px 0.2px 0.75px rgba(255, 255, 255, 0.15) inset, 4px 2px 4px -1px rgba(0, 0, 0, 0.25)',
-          buttonKeyboardHover: '0.25px 0.25px 0px 0.5px #0A0A0A, 0.2px 0.2px 0.2px 0.35px rgba(255, 255, 255, 0.25) inset, 0.2px 0.2px 0px 0.75px rgba(137, 237, 16, 0.25), 0px 0px 10px -4px rgba(137, 237, 16, 0.60), 4px 2px 4px -1px rgba(0, 0, 0, 0.25)',
+          dropShadow: 'var(--shadow-drop)',
+          innerShadow: 'var(--shadow-inner)',
+          buttonKeyboard: 'var(--shadow-keyboard)',
+          buttonKeyboardHover: 'var(--shadow-keyboard-hover)',
         },

Add these CSS variables to your global styles:

:root {
  --shadow-drop: 0px 4px 4px rgba(0, 0, 0, 0.25);
  --shadow-inner: inset 0 4px 4px rgba(0, 0, 0, 0.25);
  --shadow-keyboard: 0.5px 0.5px 0px 0.6px rgba(0, 0, 0, 0.70), 0.35px 0.35px 0.2px 0.75px rgba(255, 255, 255, 0.15) inset, 4px 2px 4px -1px rgba(0, 0, 0, 0.25);
  --shadow-keyboard-hover: 0.25px 0.25px 0px 0.5px #0A0A0A, 0.2px 0.2px 0.2px 0.35px rgba(255, 255, 255, 0.25) inset, 0.2px 0.2px 0px 0.75px rgba(137, 237, 16, 0.25), 0px 0px 10px -4px rgba(137, 237, 16, 0.60), 4px 2px 4px -1px rgba(0, 0, 0, 0.25);
}

Comment on lines +1 to +5
import { cn } from '@cuhacking/shared/utils/cn';
/* import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary' */
import { lazy, Suspense } from 'react';

const Spline = lazy(() => import('@splinetool/react-spline'));
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Enable error handling for robust production deployment

The ErrorBoundary import is commented out, leaving the component vulnerable to unhandled runtime errors.

-/* import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary' */
+import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary';

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 eslint

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)

Comment on lines +15 to +22
<div className="overflow-x-hidden">
{/* <ErrorBoundary> */}
<Suspense fallback={<div>Loading...</div>}>
<Spline className={cn(className)} scene={link} />
</Suspense>
{/* </ErrorBoundary> */}
</div>
);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Improve error handling and loading states

The current implementation needs better error handling and loading states for production readiness.

 return (
   <div className="overflow-x-hidden">
-    {/* <ErrorBoundary> */}
-    <Suspense fallback={<div>Loading...</div>}>
+    <ErrorBoundary fallback={<div className="text-center p-4">Failed to load 3D scene</div>}>
+      <Suspense 
+        fallback={
+          <div className="flex items-center justify-center p-4">
+            <div className="animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-gray-900" />
+          </div>
+        }
+      >
         <Spline className={cn(className)} scene={link} />
       </Suspense>
-    {/* </ErrorBoundary> */}
   </div>
 );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="overflow-x-hidden">
{/* <ErrorBoundary> */}
<Suspense fallback={<div>Loading...</div>}>
<Spline className={cn(className)} scene={link} />
</Suspense>
{/* </ErrorBoundary> */}
</div>
);
<div className="overflow-x-hidden">
<ErrorBoundary fallback={<div className="text-center p-4">Failed to load 3D scene</div>}>
<Suspense
fallback={
<div className="flex items-center justify-center p-4">
<div className="animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-gray-900" />
</div>
}
>
<Spline className={cn(className)} scene={link} />
</Suspense>
</ErrorBoundary>
</div>
);
🧰 Tools
🪛 eslint

[error] 22-22: Extra semicolon.

(style/semi)

Comment on lines +8 to +9
// eslint-disable-next-line no-empty-pattern
async ({ }, use) => {
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid using an empty object pattern in async callback.

The empty object pattern here triggers a static analysis warning. If no parameters from the fixture are needed, you can omit the destructuring entirely or replace it with an underscore to indicate an unused parameter.

You can fix it like this:

-    async ({ }, use) => {
+    async (_, use) => {
       // Assign a unique port for each playwright worker to support parallel tests
       const port = await getPort()
       await use(port)
     },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// eslint-disable-next-line no-empty-pattern
async ({ }, use) => {
// eslint-disable-next-line no-empty-pattern
async (_, use) => {
🧰 Tools
🪛 Biome (1.9.4)

[error] 9-9: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)

Comment on lines +1 to +4
export async function gotoURL(url: string) {
await this.page
.goto(url)
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Verify that “this.page” is valid.

Using “this.page” in a stand-alone function suggests that it might not have access to the correct “this” context. Ensure that this function is either bound to a class or that “page” is passed as a parameter.

Possible fix:

-export async function gotoURL(url: string) {
-  await this.page
-    .goto(url)
+export async function gotoURL(page: Page, url: string) {
+  await page.goto(url)
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export async function gotoURL(url: string) {
await this.page
.goto(url)
}
export async function gotoURL(page: Page, url: string) {
await page.goto(url)
}

Comment on lines +12 to +57
export function SponsorshipPresenter({
text,
sponsors,
}: SponsorshipContainerProps) {
const packageLink
= 'https://drive.google.com/file/d/1mchFDm7D8lqmVO7Y8H3WOvE2yYwNWUOm/view?usp=sharing'
return (
<GlassmorphicCard
variant="default"
className="flex flex-col p-3.5 sm:p-6 gap-y-6"
>
<h1 className="text-4xl">Sponsorship</h1>
<div className="flex flex-col pb-0.5">
{text.map(({ content, isCallToAction }) => (
<TerminalText key={content} callToAction={isCallToAction}>
<p>{content}</p>
</TerminalText>
))}
</div>
<div className="flex flex-col justify-center gap-2 py-2 lg:flex-row">
{/* TODO add once we have Toasts */}
{/* <Button variant="default" size="lg">
<p>COPY [email protected]</p>
</Button>
*/}
<Link to={packageLink} target="_blank">
<Button aria-label="Sponsorship Package" variant="default" size="lg" className="w-full">
<p>OUR SPONSORSHIP PACKAGE</p>
</Button>
</Link>
</div>
<div className="flex flex-col gap-y-5">
{sponsors.present.length
? (
<SponsorPresenter isPresent sponsors={sponsors.present} />
)
: null}
{sponsors.past.length
? (
<SponsorPresenter isPresent={false} sponsors={sponsors.past} />
)
: null}
</div>
</GlassmorphicCard>
)
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add error boundary and loading states.

The component should handle potential errors and loading states for better user experience.

+import { ErrorBoundary } from '@cuhacking/shared/ui/error-boundary'
+
 export function SponsorshipPresenter({
   text,
   sponsors,
 }: SponsorshipContainerProps) {
   const packageLink = process.env.SPONSORSHIP_PACKAGE_URL ?? 
     'https://drive.google.com/file/d/1mchFDm7D8lqmVO7Y8H3WOvE2yYwNWUOm/view?usp=sharing'
   
   return (
+    <ErrorBoundary fallback={<p>Failed to load sponsorship information</p>}>
       <GlassmorphicCard
         variant="default"
         className="flex flex-col p-3.5 sm:p-6 gap-y-6"
       >
         {/* ... existing content ... */}
       </GlassmorphicCard>
+    </ErrorBoundary>
   )
 }

Committable suggestion skipped: line range outside the PR's diff.

this.githubLinkNavbar = navbar.getByRole('link', { name: 'GitHub' })
this.emailLinkNavbar = navbar.getByRole('link', { name: 'Email' })
this.docsLinkNavbar = navbar.getByRole('link', { name: 'Docs' })
this.cuHackingLogoIconNav = page.getByRole('link', { name: 'Return to homepage' }).first()
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid using .first() selector as it may be fragile

Using .first() for element selection can be fragile if the DOM structure changes. Consider using more specific selectors:

  • For logo: Add a unique data-testid or role
  • For sponsors link: Use a more specific selector or add a unique identifier
-    this.cuHackingLogoIconNav = page.getByRole('link', { name: 'Return to homepage' }).first()
+    this.cuHackingLogoIconNav = page.getByTestId('navbar-logo')
-    this.sponsorsLink = page.getByRole('link', { name: 'Sponsors' }).first()
+    this.sponsorsLink = page.getByTestId('navbar-sponsors-link')

Also applies to: 45-45

Comment on lines 17 to +27
{ name: 'Electronic Arts', logo: ea, link: 'https://www.ea.com' },
{ name: 'Digital Ocean', logo: digitalOcean, link: 'https://www.digitalocean.com' },
{ name: 'Balsamiq', logo: balsamiq, link: 'https://balsamiq.com' },
{ name: 'RBC', logo: rbc, link: 'https://www.rbc.com' },
{ name: '1Password', logo: onePassword, link: 'https://1password.com' },
{ name: 'Bloomberg', logo: bloomberg, link: 'https://www.bloomberg.com' },
{ name: 'GitHub', logo: github, link: 'https://github.com' },
{ name: 'March Networks', logo: marchNetworks, link: 'https://www.marchnetworks.com' },
{ name: 'MLH', logo: mlh, link: 'https://mlh.io' },
{ name: '.TECH Domains', logo: techDomains, link: 'https://get.tech' },
{ name: 'Wolfram', logo: wolfram, link: 'https://www.wolfram.com' },
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add TypeScript interface for sponsor objects

Define a proper interface for sponsor objects to improve type safety and documentation.

+interface Sponsor {
+  name: string;
+  logo: string;
+  link: string;
+}

-const pastSponsors = [
+const pastSponsors: Sponsor[] = [

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +15 to +28
export function footerMobileTabletDesktop() {
test.describe('FOOTER - Common Mobile, Tablet, and Desktop layout elements', () => {
test('should contain footer', async ({ footerLayout }) => {
await expect(footerLayout.footerSection).toBeVisible()
})
test('should contain cuHacking logo in footer', async ({ footerLayout }) => {
await expect(footerLayout.cuHackingLogoFooter).toBeVisible()
})

test('should return to home page when cuHacking logo in footer is clicked', async ({ footerLayout }) => {
footerLayout.cuHackingLogoFooter.click()
await expect(footerLayout.page).toHaveURL(CUHACKING_2025_WEBSITE_URL)
})
})
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add viewport-specific tests for responsive design

The current test suite only covers common elements. Consider adding viewport-specific tests to ensure proper rendering across different screen sizes.

test.describe('FOOTER - Mobile layout (<768px)', () => {
  test.use({ viewport: { width: 375, height: 667 } });
  // Add mobile-specific tests
});

test.describe('FOOTER - Tablet layout (768px-1024px)', () => {
  test.use({ viewport: { width: 768, height: 1024 } });
  // Add tablet-specific tests
});

test.describe('FOOTER - Desktop layout (>1024px)', () => {
  test.use({ viewport: { width: 1440, height: 900 } });
  // Add desktop-specific tests
});

Comment on lines +1 to +99
import { test as base, expect } from '@playwright/test'
import { CUHACKING_2025_DISCORD_URL, CUHACKING_2025_DOCS_URL, CUHACKING_2025_EMAIL_URL, CUHACKING_2025_FIGMA_URL, CUHACKING_2025_GITHUB_REPOSITORY_URL, CUHACKING_2025_LINKTREE_URL } from '@website-e2e/shared/constants'
import { clickAndGoToPage } from '@website-e2e/shared/utils/click-and-go-to-page'
import { WelcomeSectionLayout } from './pom'

const test = base.extend<{ welcomeSectionLayout: WelcomeSectionLayout }>({
welcomeSectionLayout: async ({ page }, use) => {
const welcomeSectionLayout = new WelcomeSectionLayout(page)
await welcomeSectionLayout.goto()
// eslint-disable-next-line react-hooks/rules-of-hooks
await use(welcomeSectionLayout)
},
})
export function welcomeMobileTabletDesktop() {
test.describe('WELCOME SECTION - Common Mobile + Tablet + Desktop Layout Elements', {
tag: '@smoke',
}, () => {
test('should contain welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.welcomeSection).toBeVisible()
})
})
test.describe('WELCOME SECTION - Common Mobile + Tablet + Desktop Platform Links', {
tag: '@smoke',
}, () => {
test('should contain Discord link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.discordLinkWelcome).toBeVisible()
})

test('should take user to Discord page from welcome section', async ({ welcomeSectionLayout }) => {
const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.discordLinkWelcome)
await expect(res).toHaveURL(CUHACKING_2025_DISCORD_URL)
})

test('should contain Instagram link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.instagramLinkWelcome).toBeVisible()
})

// TODO: Instagram requires auth
// test('should take user to Instagram page from welcome section', async ({ welcomeSectionLayout }) => {
// const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.instagramLinkWelcome)
// await expect(res).toHaveURL(CUHACKING_2025_INSTAGRAM_URL)
// })

test('should contain LinkedIn link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.linkedinLinkWelcome).toBeVisible()
})

// TODO: LinkedIn requires auth
// test('should take user to LinkedIn page from welcome section', async ({ welcomeSectionLayout }) => {
// const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.linkedinLinkWelcome)
// await expect(res).toHaveURL(CUHACKING_2025_LINKED_IN_URL)
// })

test('should contain Linktree link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.linktreeLinkWelcome).toBeVisible()
})

test('should take user to Linktree page from welcome section', async ({ welcomeSectionLayout }) => {
const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.linktreeLinkWelcome)
await expect(res).toHaveURL(CUHACKING_2025_LINKTREE_URL)
})

test('should contain Figma link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.figmaLinkWelcome).toBeVisible()
})

test('should take user to Figma page from welcome section', async ({ welcomeSectionLayout }) => {
const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.figmaLinkWelcome)
expect(res.url()).toMatch(new RegExp(`^${CUHACKING_2025_FIGMA_URL}`))
})

test('should contain GitHub link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.githubLinkWelcome).toBeVisible()
})

test('should take user to GitHub page from welcome section', async ({ welcomeSectionLayout }) => {
const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.githubLinkWelcome)
await expect(res).toHaveURL(CUHACKING_2025_GITHUB_REPOSITORY_URL)
})

test('should contain Email link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.emailLinkWelcome).toBeVisible()
})

test('should take user to Email page from welcome section', async ({ welcomeSectionLayout }) => {
const href = welcomeSectionLayout.emailLinkWelcome
await expect(href).toHaveAttribute('href', CUHACKING_2025_EMAIL_URL)
})

test('should contain Docs link in welcome section', async ({ welcomeSectionLayout }) => {
await expect(welcomeSectionLayout.docsLinkWelcome).toBeVisible()
})

test('should take user to Docs page from welcome section', async ({ welcomeSectionLayout }) => {
const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.docsLinkWelcome)
await expect(res).toHaveURL(CUHACKING_2025_DOCS_URL)
})
})
}
Copy link

@coderabbitai coderabbitai bot Dec 22, 2024

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Extract common test patterns to reduce duplication

The test patterns for social media links are duplicated between footer and welcome tests. Consider extracting these into a shared test utility.

// libs/website-e2e/shared/utils/social-links-test.util.ts
export function testSocialLinks(getLayout: () => Promise<any>, linkSelector: string) {
  test(`should contain ${linkSelector} link`, async () => {
    const layout = await getLayout();
    await expect(layout[`${linkSelector}Link`]).toBeVisible();
  });

  test(`should take user to ${linkSelector} page`, async () => {
    const layout = await getLayout();
    const res = await clickAndGoToPage(layout, layout[`${linkSelector}Link`]);
    await expect(res).toHaveURL(getUrlConstant(linkSelector));
  });
}

// Usage in welcome.ts
testSocialLinks(() => welcomeSectionLayout, 'discord');
testSocialLinks(() => welcomeSectionLayout, 'github');
// etc.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

can you create an issue for this?

Copy link

Choose a reason for hiding this comment

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

@HasithDeAlwis, the issue has been created successfully at #226. Let me know if there are any further details you'd like to add.

🔗 Analysis chain
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
gh issue create \
  --title "Refactor suggestion: Extract common test patterns for social media links" \
  --body $'User @HasithDeAlwis asked to create an issue:\n\n"can you create an issue for this?"\n\nContext:\n- Pull Request: https://github.com/cuhacking/2025/pull/185\n- Comment: https://github.com/cuhacking/2025/pull/185#discussion_r1895082674\n\nPlease consider extracting duplicated test patterns into a shared utility for easier maintenance. (See the conversation linked above for details.)\n\nThis issue is created in response to that user request, referencing the conversation for future reference.' \
  --assignee HasithDeAlwis

Length of output: 664

@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch 3 times, most recently from 0d883a5 to 695e0de Compare December 23, 2024 04:44
@HasithDeAlwis HasithDeAlwis marked this pull request as ready for review December 23, 2024 04:46
@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch from 695e0de to 32447ee Compare December 23, 2024 05:17
HasithDeAlwis and others added 28 commits December 23, 2024 22:05
deno.lock file created by starting a local Netlify build
Use local font files instead of fetching fonts from Google CDN
chore: front end squash

chore: squash with front-end
chore: squash with style guide
@HasithDeAlwis HasithDeAlwis force-pushed the hasith/feat/finish-website-v1 branch from 2660881 to dc555b8 Compare December 24, 2024 03:05
Copy link

@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: 13

♻️ Duplicate comments (4)
libs/website/ui/introduction/mission/mission.section.tsx (2)

8-11: 🛠️ Refactor suggestion

Add error handling and move URL to constants

The SplineComponent implementation still needs improvement for better error handling and maintainability.

+import { SPLINE_URLS } from '../constants/spline.constants'

 <SplineComponent
   className="absolute -bottom-[15vh] lg:-bottom-[5vh] left-0 scale-1 md:scale-[1.2]"
-  link="https://prod.spline.design/TGlqj05806lq8PRV/scene.splinecode"
+  link={SPLINE_URLS.MISSION}
+  fallback={<div>Loading 3D content...</div>}
+  onError={(error) => console.error('Failed to load Spline content:', error)}
 />

7-7: ⚠️ Potential issue

Remove duplicate ID attribute

The #about ID appears twice in the component which violates HTML specifications and can cause accessibility issues.

-    <section id="#about" className="relative flex justify-center w-full">
+    <section className="relative flex justify-center w-full">

Also applies to: 14-14

libs/website/shared/ui/spline/spline-component.tsx (1)

1-5: ⚠️ Potential issue

Enable error handling for production readiness

The ErrorBoundary import is commented out, leaving the component vulnerable to runtime errors. This is particularly important for production deployment.

-/* import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary' */
+import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary';
🧰 Tools
🪛 eslint

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)

libs/website/feature/events/ui/event.section.tsx (1)

6-18: ⚠️ Potential issue

Add unit tests for EventSection

As per PR objectives, tests are required. The component needs testing for:

  1. Successful rendering of events
  2. Proper layout structure
  3. Responsive behavior

Would you like me to help generate the test suite for this component?

🧰 Tools
🪛 eslint

[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 17-17: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 18-18: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 18-18: Extra semicolon.

(style/semi)

🧹 Nitpick comments (28)
libs/website/ui/faq/faq-item/faq-item.tsx (1)

13-32: Consider adding accessibility attributes and unit tests.

You can enhance screen reader support with ARIA attributes (e.g., aria-expanded, aria-controls). Also, although the PR mentions that tests have been added, it’s unclear if this component is fully covered.

Would you like help creating an accessibility-enhanced version or adding test coverage for this component?

libs/website/ui/faq/faq-presenter/faq.presenter.tsx (1)

10-10: Address the TODO to remove hardcoded extra FAQ items.

Before merging, the PR objectives suggest finalizing the website. Consider moving this extra FAQ item into a constants file or removing it, to keep the code consistent with the rest of the dynamic FAQ structure.

tailwind.config.ts (1)

11-11: Consider adding fallback fonts for broader compatibility.
While "JetBrains Mono" is an excellent choice, adding a fallback font will help ensure a graceful user experience if the font fails to load.

You might consider something like:

- mono: ['JetBrains Mono'],
+ mono: ['JetBrains Mono', 'Menlo', 'monospace'],
libs/shared/config/tailwind/shadcn.ts (1)

6-6: Track or address the TODO comment.
A TODO comment indicates follow-up work. Ensure there’s an issue or task to track this so it won’t be forgotten.

Would you like me to open a GitHub issue to track this refactoring task?

libs/website/ui/sponsorship/sponsor-presenter/sponsor-item.tsx (1)

11-11: Consider removing duplicate transitions.

You have transition classes defined both here (line 12) and on the parent element (line 26), which could lead to conflicting animations or redundancy.

libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (3)

16-17: Use environment variable for package URL.

Consider moving the packageLink to an environment variable or a configuration file to simplify future maintenance and improve security.


23-30: Condense repetitive terminal text blocks.

If multiple text elements require repeated styling, consider extracting them to a helper subcomponent or using a map function with shared logic as you already do. This is just a minor readability improvement.


31-36: Add an accessibility-friendly method to copy the email address.

The TODO indicates a plan to add a toast when copying the email. When implementing this, ensure that you provide accessible feedback (e.g., screen-reader friendly alerts).

Would you like help setting up a toast or copy-to-clipboard utility with accessibility considerations?

libs/website/ui/introduction/mission/mission.section.tsx (1)

5-22: Consider performance optimization for the mission section

As this is a key section of the website, consider the following optimizations:

  1. Lazy load the SplineComponent only when it's near the viewport
  2. Implement proper loading states and error boundaries
  3. Consider adding preload hints for the 3D content

Example implementation:

import { lazy, Suspense } from 'react'
import { ErrorBoundary } from 'react-error-boundary'

const LazySplineComponent = lazy(() => import('@website/shared/ui/spline/spline-component'))

// Add this to your component
<ErrorBoundary fallback={<div>Something went wrong</div>}>
  <Suspense fallback={<div>Loading...</div>}>
    {isNearViewport && <LazySplineComponent {...props} />}
  </Suspense>
</ErrorBoundary>
libs/website/layouts/base.tsx (3)

7-7: Optimize type imports

Use import type for importing TypeScript types to improve build-time optimization.

-import { ReactNode } from 'react'
+import type { ReactNode } from 'react'
🧰 Tools
🪛 eslint

[error] 7-7: Expected 1 empty line after import statement not followed by another import.

(import/newline-after-import)


[error] 7-7: All imports in the declaration are only used as types. Use import type.

(ts/consistent-type-imports)


11-17: Fix indentation for better readability

The NavbarContainer props are inconsistently indented.

-         <NavbarContainer
-            links={NAVBAR_CONSTANTS.LINKS}
-            logo={NAVBAR_CONSTANTS.LOGO}
-            socials={NAVBAR_CONSTANTS.SOCIALS}
-            hamburger={NAVBAR_CONSTANTS.HAMBURGER}
-            cross={NAVBAR_CONSTANTS.CROSS}
-          />
+        <NavbarContainer
+          links={NAVBAR_CONSTANTS.LINKS}
+          logo={NAVBAR_CONSTANTS.LOGO}
+          socials={NAVBAR_CONSTANTS.SOCIALS}
+          hamburger={NAVBAR_CONSTANTS.HAMBURGER}
+          cross={NAVBAR_CONSTANTS.CROSS}
+        />
🧰 Tools
🪛 eslint

[error] 11-11: Expected indentation of 6 spaces but found 9.

(style/indent)


[error] 12-12: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 12-12: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 13-13: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 14-14: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 14-14: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 15-15: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 16-16: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 17-17: Expected indentation of 6 spaces but found 10.

(style/indent)


[error] 17-17: The closing bracket must be aligned with the opening tag (expected column 10)

(style/jsx-closing-bracket-location)


18-20: Remove extra empty lines

Multiple empty lines between components affect code readability.

-

-
      <div className="mt-10">{children}</div>
+
+      <div className="mt-10">{children}</div>
🧰 Tools
🪛 eslint

[error] 19-20: More than 1 blank line not allowed.

(style/no-multiple-empty-lines)

libs/website/shared/ui/navigation/navbar/ui/nav-item.tsx (1)

5-5: Remove outdated TODO comment

The TODO comment suggests using Remix's Link component, which is already implemented.

-// TODO: Refactor to use <Link> from Remix
libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (2)

95-95: Fix typo in alt text

The alt text for the hamburger icon contains a typo.

-    alt: 'Hambuger icon',
+    alt: 'Hamburger icon',

21-21: Add type safety to constants

The constants lack proper TypeScript interfaces for better type checking and documentation.

+interface NavbarIcon {
+  src: string;
+  alt: string;
+}

+interface NavbarConstants {
+  SOCIALS: Array<{
+    link: string;
+    name: string;
+    media: Media;
+  }>;
+  LINKS: Array<{
+    name: string;
+    link: string;
+  }>;
+  LOGO: string;
+  HAMBURGER: NavbarIcon;
+  CROSS: NavbarIcon;
+}

-export const NAVBAR_CONSTANTS = {
+export const NAVBAR_CONSTANTS: NavbarConstants = {
   SOCIALS: socials,
   LINKS: links,
   LOGO: cuHackingLogo,
   HAMBURGER: {
     src: hamburger,
     alt: 'Hamburger icon',
   },
   CROSS: {
     src: cross,
     alt: 'Cross icon',
   },
 }

Also applies to: 89-101

libs/shared/assets/fonts/JetBrains_Mono/README.txt (1)

62-62: Improve Linux installation instructions

The current Linux installation link points to a generic Google search. Consider replacing it with distribution-specific instructions or a more authoritative resource like:

libs/website-e2e/features/lighthouse/lighthouse.ts (1)

50-64: Consider adding retry logic for Lighthouse audits.

Lighthouse audits can be flaky due to various factors like system load or network conditions. Consider adding retry logic for more reliable results.

Example implementation:

const MAX_RETRIES = 3;
let attempt = 0;
let lastError;

while (attempt < MAX_RETRIES) {
  try {
    await playAudit({
      // ... existing config ...
    });
    break;
  } catch (error) {
    lastError = error;
    attempt++;
    if (attempt === MAX_RETRIES) throw lastError;
    await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
  }
}
libs/website-e2e/ui/footer/footer.ts (1)

44-49: **Remove or implement commented-out test code **
This code is disabled with a TODO comment. If you plan to enable it later, consider adding an actionable note for the timeline or removing it to reduce clutter.

libs/website-e2e/ui/welcome/welcome.ts (2)

10-11: Remove or document the ESLint disable comment

The ESLint disable comment for react-hooks/rules-of-hooks seems out of place in a test file. If this is intentional, please add a comment explaining why this rule needs to be disabled.


15-21: Enhance welcome section layout tests

The current test only verifies the visibility of the welcome section. Consider adding more comprehensive layout tests:

  • Verify section heading/title
  • Check for main content elements
  • Validate section positioning/order
apps/website-e2e/src/pom.ts (2)

3-3: Track the CMS refactoring TODO

The TODO comment indicates a future refactoring task for link locators once a CMS is implemented.

Would you like me to create a GitHub issue to track this refactoring task?


77-78: Improve selector specificity

Using .first() and .last() for element selection can be fragile if the DOM structure changes. Consider:

  1. Using more specific selectors or data-testid attributes
  2. Adding comments explaining why these specific instances are selected

Example:

// Add data attributes in the component
<a data-testid="navbar-logo" href="/">Return to homepage</a>

// Update the selector
this.cuHackingLogoIconNav = page.getByTestId('navbar-logo')

Also applies to: 115-115

apps/docs/content/docs/concepts/bullet-proof-react.mdx (1)

18-18: Fix grammatical error

Change "front-end application" to "front-end applications".

🧰 Tools
🪛 LanguageTool

[uncategorized] ~18-~18: The grammatical number of this noun doesn’t look right. Consider replacing it.
Context: ...ing scalable and maintainable front-end application, however, we extend it for our entire c...

(AI_EN_LECTOR_REPLACEMENT_NOUN_NUMBER)

apps/docs/content/docs/contribution-guidelines/coding-standards/front-end.mdx (1)

14-14: Expand the pattern explanation

While the TLDR is concise, it would be more helpful to:

  1. Add practical code examples showing both presenter and container components
  2. Include common use cases and best practices
  3. Provide guidelines for when to use this pattern
libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.stories.tsx (1)

21-34: Consider extracting the remix stub setup into a shared helper.

The decorator setup with createRemixStub is good for testing navigation, but it might be reused across other navigation component stories. Consider extracting it into a shared helper function.

// suggested shared/testing/helpers/createNavigationStoryDecorator.ts
export const createNavigationStoryDecorator = (story: () => React.ReactElement) => {
  const remixStub = createRemixStub([
    {
      path: '/*',
      action: () => ({ redirect: '/' }),
      loader: () => ({ redirect: '/' }),
      Component: () => story(),
    },
  ])
  return remixStub({ initialEntries: ['/'] })
}

// usage in story
decorators: [createNavigationStoryDecorator]
apps/website-e2e/playwright.config.ts (2)

81-84: Review CI test coverage strategy

While ignoring Chromium tests in CI will speed up the pipeline, please ensure:

  1. Critical user paths are still covered by remaining browser tests
  2. Local development workflow includes running all tests
  3. Consider running Chromium tests in a separate CI job or nightly builds

Consider these alternatives:

  • Run a subset of critical tests on Chromium in CI
  • Create a separate CI job for comprehensive browser testing
  • Implement scheduled full test runs

Line range hint 1-85: Establish comprehensive testing strategy documentation

As this is part of website v1 completion, consider:

  1. Documenting the testing strategy
  2. Creating a test coverage matrix
  3. Setting up monitoring for test execution times
  4. Establishing criteria for test environment requirements

Would you like me to help create:

  • A testing strategy document template
  • A test coverage matrix
  • CI performance monitoring setup
libs/shared/ui/src/cuHacking/components/typography/typgoraphy.tsx (1)

5-18: Improve interface definition

Consider these improvements:

  1. Make className optional as it's not always needed
  2. Add JSDoc documentation for better developer experience
+/**
+ * Props for the Typography component
+ * @property {string} variant - The typography style variant
+ * @property {React.ReactNode} children - The content to be rendered
+ * @property {string} [className] - Additional CSS classes
+ */
 interface TypographyProps {
   variant:
     | 'h1'
     | 'h2'
     | 'h3'
     | 'h4'
     | 'h5'
     | 'h6'
     | 'paragraph-sm'
     | 'paragraph-base'
     | 'paragraph-xs'
   children: React.ReactNode
-  className: string
+  className?: string
 }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 2660881 and dc555b8.

⛔ Files ignored due to path filters (21)
  • libs/shared/assets/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Bold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-BoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraBold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraBoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraLight.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ExtraLightItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Italic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Light.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-LightItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Medium.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-MediumItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Regular.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-SemiBold.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-SemiBoldItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-Thin.ttf is excluded by !**/*.ttf
  • libs/shared/assets/fonts/JetBrains_Mono/static/JetBrainsMono-ThinItalic.ttf is excluded by !**/*.ttf
  • libs/shared/assets/icons/general/cross-1.svg is excluded by !**/*.svg
  • libs/shared/assets/icons/socials/linkedin-white-1.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (82)
  • .gitignore (1 hunks)
  • apps/docs/content/docs/concepts/bullet-proof-react.mdx (1 hunks)
  • apps/docs/content/docs/concepts/feature-sliced-design.mdx (1 hunks)
  • apps/docs/content/docs/concepts/meta.json (1 hunks)
  • apps/docs/content/docs/contribution-guidelines/coding-standards/front-end.mdx (2 hunks)
  • apps/docs/content/docs/contribution-guidelines/coding-standards/meta.json (1 hunks)
  • apps/docs/content/docs/contribution-guidelines/coding-standards/style-guide.mdx (1 hunks)
  • apps/website-e2e/playwright.config.ts (2 hunks)
  • apps/website-e2e/src/lighthouse.spec.ts (1 hunks)
  • apps/website-e2e/src/pages/home.spec.ts (1 hunks)
  • apps/website-e2e/src/pom.ts (1 hunks)
  • apps/website-e2e/src/website.spec.ts (0 hunks)
  • apps/website/app/root.tsx (2 hunks)
  • apps/website/vite.config.ts (1 hunks)
  • libs/external/shadcn/tailwind.config.ts (1 hunks)
  • libs/shared/assets/fonts/JetBrains_Mono/OFL.txt (1 hunks)
  • libs/shared/assets/fonts/JetBrains_Mono/README.txt (1 hunks)
  • libs/shared/config/tailwind/shadcn.ts (3 hunks)
  • libs/shared/ui/accordion/accordion.stories.tsx (0 hunks)
  • libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx (2 hunks)
  • libs/shared/ui/global.css (3 hunks)
  • libs/shared/ui/src/cuHacking/components/typography/typgoraphy.tsx (1 hunks)
  • libs/shared/ui/src/cuHacking/components/typography/typography.stories.tsx (1 hunks)
  • libs/shared/ui/terminal-text/terminal-text.stories.tsx (0 hunks)
  • libs/shared/ui/terminal-text/terminal-text.tsx (1 hunks)
  • libs/shared/ui/typography/typgoraphy.tsx (1 hunks)
  • libs/shared/utils/ErrorBoundary.tsx (1 hunks)
  • libs/website-e2e/features/lighthouse/lighthouse.ts (1 hunks)
  • libs/website-e2e/project.json (1 hunks)
  • libs/website-e2e/shared/constants.ts (1 hunks)
  • libs/website-e2e/shared/utils/click-and-go-to-page.ts (1 hunks)
  • libs/website-e2e/shared/utils/gotoURL.ts (1 hunks)
  • libs/website-e2e/tsconfig.json (1 hunks)
  • libs/website-e2e/ui/footer/footer.ts (1 hunks)
  • libs/website-e2e/ui/footer/pom.ts (1 hunks)
  • libs/website-e2e/ui/navbar/constants.ts (1 hunks)
  • libs/website-e2e/ui/navbar/navbar.ts (1 hunks)
  • libs/website-e2e/ui/navbar/pom.ts (1 hunks)
  • libs/website-e2e/ui/sponsorship/constants.ts (1 hunks)
  • libs/website-e2e/ui/sponsorship/pom.ts (1 hunks)
  • libs/website-e2e/ui/sponsorship/sponsorship.ts (1 hunks)
  • libs/website-e2e/ui/welcome/pom.ts (1 hunks)
  • libs/website-e2e/ui/welcome/welcome.ts (1 hunks)
  • libs/website/feature/events/ui/event-item/event-item.tsx (3 hunks)
  • libs/website/feature/events/ui/event-presenter/event-presenter.tsx (2 hunks)
  • libs/website/feature/events/ui/event.section.tsx (1 hunks)
  • libs/website/layouts/base.tsx (1 hunks)
  • libs/website/pages/home.tsx (1 hunks)
  • libs/website/shared/ui/navigation/footer/constants/footer.constants.ts (2 hunks)
  • libs/website/shared/ui/navigation/footer/ui/footer.presenter.tsx (2 hunks)
  • libs/website/shared/ui/navigation/footer/ui/footer.stories.tsx (1 hunks)
  • libs/website/shared/ui/navigation/index.ts (1 hunks)
  • libs/website/shared/ui/navigation/navbar/constants/navbar.constants.ts (3 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/nav-item-mobile.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/nav-item.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx (1 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.stories.tsx (4 hunks)
  • libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (2 hunks)
  • libs/website/shared/ui/socials/socials.tsx (1 hunks)
  • libs/website/shared/ui/spline/spline-component.tsx (1 hunks)
  • libs/website/ui/faq/constants/faq.constants.ts (1 hunks)
  • libs/website/ui/faq/faq-item/faq-item.tsx (1 hunks)
  • libs/website/ui/faq/faq-presenter/faq.presenter.stories.tsx (1 hunks)
  • libs/website/ui/faq/faq-presenter/faq.presenter.tsx (1 hunks)
  • libs/website/ui/faq/faq.section.tsx (1 hunks)
  • libs/website/ui/introduction/constants/welcome.constants.ts (2 hunks)
  • libs/website/ui/introduction/mission/mission.section.tsx (1 hunks)
  • libs/website/ui/introduction/mission/mission.stories.tsx (1 hunks)
  • libs/website/ui/introduction/mission/mission.tsx (1 hunks)
  • libs/website/ui/introduction/welcome/welcome.section.tsx (1 hunks)
  • libs/website/ui/introduction/welcome/welcome.stories.tsx (2 hunks)
  • libs/website/ui/introduction/welcome/welcome.tsx (2 hunks)
  • libs/website/ui/sponsorship/constants/sponsorship.constants.ts (1 hunks)
  • libs/website/ui/sponsorship/sponsor-presenter/sponsor-item.tsx (1 hunks)
  • libs/website/ui/sponsorship/sponsor-presenter/sponsor.presenter.tsx (2 hunks)
  • libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (1 hunks)
  • libs/website/ui/sponsorship/sponsorship-section.tsx (1 hunks)
  • libs/website/ui/stats/stat-item/stat-item.tsx (1 hunks)
  • libs/website/ui/stats/stats-presenter/stats.presenter.tsx (1 hunks)
  • libs/website/ui/stats/stats.section.tsx (1 hunks)
  • package.json (3 hunks)
  • tailwind.config.ts (1 hunks)
⛔ Files not processed due to max files limit (1)
  • tsconfig.base.json
💤 Files with no reviewable changes (3)
  • libs/shared/ui/terminal-text/terminal-text.stories.tsx
  • libs/shared/ui/accordion/accordion.stories.tsx
  • apps/website-e2e/src/website.spec.ts
✅ Files skipped from review due to trivial changes (1)
  • libs/website/ui/stats/stat-item/stat-item.tsx
🚧 Files skipped from review as they are similar to previous changes (51)
  • .gitignore
  • libs/website-e2e/ui/sponsorship/constants.ts
  • libs/website/shared/ui/navigation/index.ts
  • libs/website/ui/faq/faq.section.tsx
  • libs/website/ui/stats/stats.section.tsx
  • apps/website-e2e/src/lighthouse.spec.ts
  • apps/docs/content/docs/concepts/meta.json
  • apps/docs/content/docs/contribution-guidelines/coding-standards/meta.json
  • libs/website/ui/introduction/welcome/welcome.tsx
  • libs/website/ui/sponsorship/sponsorship-section.tsx
  • libs/website/pages/home.tsx
  • apps/website/vite.config.ts
  • apps/website/app/root.tsx
  • libs/website/ui/stats/stats-presenter/stats.presenter.tsx
  • libs/website/ui/introduction/mission/mission.tsx
  • libs/website-e2e/project.json
  • apps/docs/content/docs/concepts/feature-sliced-design.mdx
  • libs/website/shared/ui/navigation/footer/ui/footer.presenter.tsx
  • libs/website/shared/ui/navigation/navbar/ui/navbar.container.tsx
  • libs/website/feature/events/ui/event-presenter/event-presenter.tsx
  • libs/website/shared/ui/navigation/footer/ui/footer.stories.tsx
  • libs/website/ui/introduction/mission/mission.stories.tsx
  • libs/website/ui/sponsorship/sponsor-presenter/sponsor.presenter.tsx
  • libs/website/ui/introduction/welcome/welcome.stories.tsx
  • libs/shared/utils/ErrorBoundary.tsx
  • libs/website-e2e/shared/utils/click-and-go-to-page.ts
  • apps/docs/content/docs/contribution-guidelines/coding-standards/style-guide.mdx
  • libs/website/ui/faq/constants/faq.constants.ts
  • libs/external/shadcn/tailwind.config.ts
  • libs/shared/ui/glassmorphic-card/glassmorphic-card.tsx
  • libs/website/ui/introduction/welcome/welcome.section.tsx
  • libs/website/shared/ui/navigation/navbar/ui/nav-item-mobile.tsx
  • libs/website-e2e/ui/sponsorship/pom.ts
  • libs/website/ui/faq/faq-presenter/faq.presenter.stories.tsx
  • libs/shared/ui/terminal-text/terminal-text.tsx
  • libs/website-e2e/ui/navbar/constants.ts
  • libs/website/ui/sponsorship/constants/sponsorship.constants.ts
  • libs/website/ui/introduction/constants/welcome.constants.ts
  • libs/website/shared/ui/navigation/footer/constants/footer.constants.ts
  • libs/website-e2e/shared/constants.ts
  • libs/shared/ui/global.css
  • libs/website/feature/events/ui/event-item/event-item.tsx
  • libs/website/shared/ui/socials/socials.tsx
  • package.json
  • libs/website-e2e/ui/welcome/pom.ts
  • libs/shared/ui/typography/typgoraphy.tsx
  • libs/website-e2e/tsconfig.json
  • libs/website-e2e/ui/navbar/navbar.ts
  • libs/website-e2e/ui/sponsorship/sponsorship.ts
  • apps/website-e2e/src/pages/home.spec.ts
  • libs/shared/ui/src/cuHacking/components/typography/typography.stories.tsx
🧰 Additional context used
🪛 LanguageTool
apps/docs/content/docs/concepts/bullet-proof-react.mdx

[uncategorized] ~18-~18: The grammatical number of this noun doesn’t look right. Consider replacing it.
Context: ...ing scalable and maintainable front-end application, however, we extend it for our entire c...

(AI_EN_LECTOR_REPLACEMENT_NOUN_NUMBER)

apps/docs/content/docs/contribution-guidelines/coding-standards/front-end.mdx

[duplication] ~16-~16: Possible typo: you repeated a word
Context: ...nts answer what UI is rendered. ## tsconfig [tsconfig.json with comments and explanations](ht...

(ENGLISH_WORD_REPEAT_RULE)


[typographical] ~19-~19: Consider adding a comma here.
Context: ...a4685c2a17800c86ae) ## Folder structure Please refer to the [Feature-Sliced Design](/c...

(PLEASE_COMMA)

libs/shared/assets/fonts/JetBrains_Mono/OFL.txt

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)

libs/shared/assets/fonts/JetBrains_Mono/README.txt

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)

🪛 Biome (1.9.4)
libs/website-e2e/features/lighthouse/lighthouse.ts

[error] 9-9: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)

🪛 eslint
libs/website/feature/events/ui/event.section.tsx

[error] 2-2: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 6-6: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 17-17: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 18-18: Expected indentation of 2 spaces but found 4.

(style/indent)


[error] 18-18: Extra semicolon.

(style/semi)

libs/website/layouts/base.tsx

[error] 7-7: Expected 1 empty line after import statement not followed by another import.

(import/newline-after-import)


[error] 7-7: All imports in the declaration are only used as types. Use import type.

(ts/consistent-type-imports)


[error] 11-11: Expected indentation of 6 spaces but found 9.

(style/indent)


[error] 12-12: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 12-12: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 13-13: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 13-13: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 14-14: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 14-14: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 15-15: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 15-15: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 16-16: Expected indentation of 8 spaces but found 12.

(style/indent)


[error] 16-16: Expected indentation of 11 space characters but found 12.

(style/jsx-indent-props)


[error] 17-17: Expected indentation of 6 spaces but found 10.

(style/indent)


[error] 17-17: The closing bracket must be aligned with the opening tag (expected column 10)

(style/jsx-closing-bracket-location)


[error] 19-20: More than 1 blank line not allowed.

(style/no-multiple-empty-lines)

libs/website/shared/ui/spline/spline-component.tsx

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 22-22: Extra semicolon.

(style/semi)

🔇 Additional comments (46)
libs/website/ui/faq/faq-item/faq-item.tsx (1)

25-25: Use stable unique identifiers for array keys.

This is a repeat of a past suggestion. Using the answer string as a key can result in collisions if the same answer appears multiple times. Use a stable unique identifier or an index-based key.

libs/website/ui/faq/faq-presenter/faq.presenter.tsx (2)

15-18: Add missing accessibility attributes.

Previously noted: to align with best practices, append relevant ARIA attributes to the accordion. For instance, providing aria-label or aria-labelledby helps screen readers navigate.


1-71: Include broader test coverage for multiple screen sizes.

As per the PR objectives, confirm that the website is tested on mobile, tablet, and desktop. Consider adding responsive design tests to ensure consistent behavior across devices.

libs/shared/config/tailwind/shadcn.ts (2)

20-32: Background gradients look good.
These custom backgrounds enhance UI styling in a flexible manner. If you experience performance concerns, consider using small background images for older browsers.


104-109: Consider switching to CSS variables for shadows.
This is a repeat of a previous suggestion to centralize shadow definitions for maintainability and consistency.

libs/shared/assets/fonts/JetBrains_Mono/OFL.txt (1)

9-9: Preserve the exact license text.
Static analysis recommends using an en dash for ranges, but we must keep the original text unmodified to comply with legal requirements of the SIL Open Font License.

🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)

libs/website/ui/sponsorship/sponsor-presenter/sponsor-item.tsx (2)

11-13: Fix Tailwind class name typo.

As previously noted, "m-x-auto" should be "mx-auto".


22-43: Add basic unit tests for SponsorItem.

In line with the PR objectives, it would be beneficial to include tests covering:

  1. Varying combinations of props.
  2. The link's functionality and whether it matches the intended sponsor website.
  3. Image alt text and load behavior.
  4. Handling of the isPresent variant.

Would you like me to generate a starter test suite for this file?

libs/website/ui/sponsorship/sponsorship-presenter/sponsorship.presenter.tsx (2)

1-5: Implement missing tests.

The PR objectives note that tests haven't been confirmed to pass yet. Please ensure you have thorough coverage for the SponsorshipPresenter component, particularly around sponsor arrays, text rendering, and potential edge cases (e.g., empty arrays).

Would you like me to generate sample tests to help you achieve this?


44-53: Verify dynamic sponsor rendering logic.

Ensure that there is code coverage for the flow where there are zero sponsors in each array, where only present sponsors exist, and where only past sponsors exist. This helps guarantee that the logic for rendering SponsorPresenter is robust.

libs/website/ui/introduction/mission/mission.section.tsx (2)

1-4: LGTM! Clean and well-organized imports

The imports are properly structured and all appear to be used within the component.


15-15: Verify responsive layout behavior

The use of min-h-[160vh] for mobile and min-h-screen for desktop needs verification across different devices and screen sizes.

According to the PR objectives, mobile and tablet testing hasn't been completed yet. Please ensure this layout works correctly across all target devices.

libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.tsx (6)

40-40: TODO comment needs to be addressed

The drawer component should be extracted for better maintainability and reusability.


6-16: LGTM! Clean import organization

The simplified import paths and organized imports improve code maintainability.


41-47: Add comprehensive test coverage

Unit tests are still needed to verify the component behavior.


48-52: LGTM! Clean state management

The state handling is concise and appropriate for the drawer toggle functionality.


90-92: Verify nav drawer accessibility and contrast

The backdrop blur effect might affect readability. Please ensure:

  1. Sufficient color contrast in the nav drawer
  2. Proper visibility across different devices and browsers

This aligns with the PR objective to test across mobile, tablet, and desktop platforms. Consider using tools like Lighthouse or axe for accessibility verification.


71-112: Verify cross-platform compatibility

According to PR objectives, cross-platform testing is pending. Please verify the drawer behavior and visual appearance across:

  • Mobile devices
  • Tablets
  • Desktop browsers

Key areas to test:

  1. Drawer transitions
  2. Touch interactions
  3. Visual consistency
  4. Performance with backdrop blur
libs/shared/assets/fonts/JetBrains_Mono/README.txt (4)

33-40: Add web-specific usage instructions

The installation instructions should be expanded with web-specific details as previously suggested.


41-58: Update resource links

Some resource links need to be updated as previously identified.


72-73: Verify presence of license file

The README references OFL.txt for full license details.

✅ Verification successful

License file verification successful

The referenced OFL.txt license file exists in the expected location at libs/shared/assets/fonts/JetBrains_Mono/OFL.txt.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if OFL.txt exists in the same directory
if [ ! -f "libs/shared/assets/fonts/JetBrains_Mono/OFL.txt" ]; then
  echo "Missing license file: OFL.txt"
else
  echo "License file found"
fi

Length of output: 111


10-31: Verify presence of referenced font files

Since this is for the website project, let's ensure all listed font files are present in the repository.

✅ Verification successful

Missing font file in static directory

The verification revealed that JetBrainsMono-RegularItalic.ttf is missing, while the README mentions JetBrainsMono-Italic.ttf instead. Let me verify if this is a naming discrepancy or a missing file.


Font files match README listing

The README correctly lists JetBrainsMono-Italic.ttf and all font files mentioned in the documentation are present in their correct locations. The initial script's check for RegularItalic was incorrect as the regular italic variant is named Italic.ttf in this font family.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if all mentioned font files exist
cd libs/shared/assets/fonts/JetBrains_Mono
missing_files=0

# Check variable font files
for file in "JetBrainsMono-VariableFont_wght.ttf" "JetBrainsMono-Italic-VariableFont_wght.ttf"; do
  if [ ! -f "$file" ]; then
    echo "Missing variable font: $file"
    missing_files=$((missing_files + 1))
  fi
done

# Check static font files
cd static 2>/dev/null || { echo "Static directory not found"; exit 1; }
for file in JetBrainsMono-{Thin,ExtraLight,Light,Regular,Medium,SemiBold,Bold,ExtraBold}{,Italic}.ttf; do
  if [ ! -f "$file" ]; then
    echo "Missing static font: $file"
    missing_files=$((missing_files + 1))
  fi
done

if [ $missing_files -eq 0 ]; then
  echo "All font files are present"
fi

Length of output: 2926


Script:

#!/bin/bash
cd libs/shared/assets/fonts/JetBrains_Mono/static
# Check if Italic.ttf exists (as mentioned in README)
if [ -f "JetBrainsMono-Italic.ttf" ]; then
    echo "JetBrainsMono-Italic.ttf exists"
else
    echo "JetBrainsMono-Italic.ttf is missing"
fi

# List all actual font files for comparison
echo -e "\nActual font files in static directory:"
ls JetBrainsMono-*.ttf

Length of output: 1162

🧰 Tools
🪛 LanguageTool

[formatting] ~14-~14: Consider inserting a comma after an introductory phrase for better readability.
Context: ...ot all apps support variable fonts, and in those cases you can use the static font files for J...

(IN_THAT_CASE_COMMA)

libs/website-e2e/features/lighthouse/lighthouse.ts (5)

1-5: LGTM! Clean and well-organized imports.

The imports are properly structured with type imports separated, showing good TypeScript practices.


8-9: Fix empty object pattern in async callback.

The empty object pattern should be replaced with an underscore to indicate an unused parameter.

🧰 Tools
🪛 Biome (1.9.4)

[error] 9-9: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)


17-26: LGTM! Well-implemented browser fixture.

Good implementation of the browser fixture with proper cleanup and worker scope for efficient resource management.


28-35: Track technical debt for performance threshold.

The performance threshold has been temporarily lowered to 50 due to Spline components. This should be tracked and addressed when the components are removed.

Would you like me to create a GitHub issue to track this technical debt? The issue would include:

  • Current state: Performance threshold lowered to 50
  • Reason: Spline components impact
  • Goal: Restore to 90 after component removal

61-62: 🛠️ Refactor suggestion

Improve report directory path handling.

The current path construction has several potential issues:

  1. String concatenation of paths is error-prone
  2. Multiple parent directory traversal (../../../) is fragile
  3. Could fail in different environments

Consider using path utilities:

-        directory: `${process.cwd()}../../../lighthouse-report`,
+        directory: path.join(process.cwd(), '..', '..', '..', 'lighthouse-report'),

Add this import at the top:

import * as path from 'path';
⛔ Skipped due to learnings
Learnt from: MFarabi619
PR: cuhacking/2025#194
File: apps/docs-e2e/src/lighthouse.spec.ts:50-50
Timestamp: 2024-12-03T03:24:06.695Z
Learning: In `lighthouse.spec.ts`, when configuring the `directory` path for Lighthouse reports, adding a slash (`/`) between `${process.cwd()}` and the relative path causes issues. The correct path concatenation is `${process.cwd()}../../../lighthouse-report` without the slash.
libs/website-e2e/shared/utils/gotoURL.ts (1)

1-3: **Use a passed-in page parameter instead of “this.page” **
A similar issue was flagged in a previous commit. Using “this.page” in a stand-alone function can cause scoping problems. Consider passing in “page” as a parameter or restructuring this function to ensure correct access to the Playwright “page” object.

libs/website-e2e/ui/footer/pom.ts (1)

35-37: **Add error handling for page navigation **
This was suggested previously. Wrapping “await this.page.goto(...)” in a try-catch block with a timeout will help detect and handle navigation failures more gracefully.

libs/website-e2e/ui/navbar/pom.ts (1)

39-39: **Avoid using .first() for element selection **
As previously mentioned, using “.first()” can be fragile if the DOM changes. Consider using more specific selectors or data-testids for reliably selecting the intended element.

libs/website-e2e/ui/footer/footer.ts (1)

25-25: **Await the click operation **
This was advised before. For consistent test execution, ensure all Playwright actions like “click” are awaited:

- footerLayout.cuHackingLogoFooter.click()
+ await footerLayout.cuHackingLogoFooter.click()
libs/website-e2e/ui/welcome/welcome.ts (1)

38-42: Extract common test patterns to reduce duplication

The test patterns for social media links are duplicated between different sections.

Also applies to: 48-52

apps/website-e2e/src/pom.ts (1)

119-122: Consider making the base URL configurable

The goto() method hardcodes 'http://localhost:3000'. For greater flexibility, consider parameterizing it to adapt to various deployment or test environments.

apps/docs/content/docs/concepts/bullet-proof-react.mdx (1)

11-16: Enhance iframe security and user experience

The iframe implementation could benefit from additional security attributes and improved user experience.

Apply these improvements:

 <iframe
   title="Bullet-Proof React"
   className="mt-4 w-full h-[400px] rounded-lg"
   src="https://reacthandbook.dev/project-standards"
-  allowFullScreen>
+  allowFullScreen
+  loading="lazy"
+  sandbox="allow-scripts allow-same-origin allow-popups"
+  referrerPolicy="no-referrer">
 </iframe>
apps/docs/content/docs/contribution-guidelines/coding-standards/front-end.mdx (2)

8-13: Enhance iframe security and user experience

The iframe implementation needs security attributes.


43-43: LGTM!

The path aliases are well-organized and follow a consistent pattern.

libs/website/shared/ui/navigation/navbar/ui/navbar.presenter.stories.tsx (3)

2-2: LGTM! Appropriate imports added for new functionality.

The addition of the cross icon and createRemixStub imports aligns well with the new features being implemented.

Also applies to: 13-13


107-107: Address the TODO comment before finalizing website v1.

The TODO comment about fixing cross animation should be addressed before considering the website v1 complete, as it might affect user experience.

Would you like me to help investigate the cross animation issue or create a GitHub issue to track this?


122-125: Verify cross icon animation across different screen sizes.

Since the PR objectives mention that testing across mobile, tablet, and desktop platforms hasn't been completed, ensure the cross icon animation works correctly across all screen sizes.

Run the following script to check for responsive design tests:

apps/website-e2e/playwright.config.ts (1)

43-69: Verify cross-platform testing execution

The PR checklist indicates that the website hasn't been tested across mobile, tablet, or desktop platforms yet. While the configuration is set up correctly for cross-platform testing, please ensure:

  1. All platform-specific tests are executed
  2. Results are documented
  3. Any platform-specific issues are addressed

Run the following script to check if tests have been executed:

libs/shared/ui/src/cuHacking/components/typography/typgoraphy.tsx (2)

1-3: LGTM!

The imports are well-organized and include all necessary dependencies.


1-42: Verify component in Storybook and responsive design

Since this is a core typography component:

  1. Ensure all variants are properly documented in Storybook
  2. Test the component's appearance across different viewport sizes
libs/website/shared/ui/spline/spline-component.tsx (2)

7-13: Define a proper TypeScript interface for props

For better type safety and maintainability, extract the props interface.

+interface SplineComponentProps {
+  link: string;
+  className: string;
+}

-export function SplineComponent({
-  link,
-  className,
-}: {
-  link: string;
-  className: string;
-}) {
+export function SplineComponent({ link, className }: SplineComponentProps) {
🧰 Tools
🪛 eslint

[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


14-22: ⚠️ Potential issue

Enhance error handling and loading states

The current implementation needs:

  1. Error boundary for graceful error handling
  2. Better loading state with visual feedback
  3. Proper error messaging for failed loads
 return (
   <div className="overflow-x-hidden">
-    {/* <ErrorBoundary> */}
-    <Suspense fallback={<div>Loading...</div>}>
+    <ErrorBoundary fallback={<div className="text-center p-4">Failed to load 3D scene</div>}>
+      <Suspense 
+        fallback={
+          <div className="flex items-center justify-center p-4">
+            <div className="animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-gray-900" />
+          </div>
+        }
+      >
         <Spline className={cn(className)} scene={link} />
       </Suspense>
-    {/* </ErrorBoundary> */}
   </div>
 );

Likely invalid or redundant comment.

🧰 Tools
🪛 eslint

[error] 22-22: Extra semicolon.

(style/semi)

libs/website/feature/events/ui/event.section.tsx (2)

1-1: Clean up commented code

The SplineComponent code is commented out. Either:

  1. Remove it completely if not needed
  2. Create a tracking issue if planned for future use
-/* import { SplineComponent } from '@website/shared/ui/spline/spline-component'; */

// ... and later:
-            {/* <SplineComponent
-        link="https://prod.spline.design/ApEljaMrr9NQtUwP/scene.splinecode"
-        className="absolute -bottom-[15vh] lg:-bottom-[5vh] left-0 scale-1 md:scale-[1.2] z-[-1]"
-      /> */}

Also applies to: 13-16


7-12: Verify responsive layout across platforms

The PR checklist indicates that cross-platform testing hasn't been completed. Please verify that:

  1. The layout works correctly on mobile devices
  2. The padding and margin values are appropriate for all screen sizes
  3. The content remains readable and accessible across different viewports
🧰 Tools
🪛 eslint

[error] 7-7: Expected indentation of 4 spaces but found 8.

(style/indent)


[error] 8-8: Expected indentation of 6 spaces but found 12.

(style/indent)


[error] 9-9: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 10-10: Expected indentation of 10 spaces but found 20.

(style/indent)


[error] 11-11: Expected indentation of 8 spaces but found 16.

(style/indent)


[error] 12-12: Expected indentation of 6 spaces but found 12.

(style/indent)

Comment on lines +1 to +93
Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

License file missing in the static font directory

  • Add a copy of OFL.txt to libs/shared/assets/fonts/JetBrains_Mono/static/ to comply with SIL Open Font License requirements for font distribution.
🔗 Analysis chain

Confirm the license file is replicated wherever font files are distributed.
Ensure the OFL.txt file is present in all subdirectories (e.g., “static”) containing JetBrains Mono font files, meeting SIL OFL requirements.

Run the following script to confirm:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Ensure OFL.txt exists in every directory containing JetBrains Mono font files.
fd -H -e ttf -x dirname {} \; | sort -u | while read -r dir; do
  if [ ! -f "$dir/OFL.txt" ]; then
    echo "Missing license in $dir"
  fi
done

Length of output: 372

🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...-----
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
----------------------...

(DASH_RULE)

Comment on lines +6 to +15
const navItemStyles = cva('text-xs font-bold', {
variants: {
index: {
0: 'text-blue-400',
1: 'text-lime-500',
2: 'text-yellow-500',
3: 'text-red-500',
},
},
})
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add type safety to the component

The component lacks proper TypeScript types for its props and the navItemStyles variants.

+type NavItemIndex = 0 | 1 | 2 | 3;
+
+interface NavItemProps {
+  index: NavItemIndex;
+  link: string;
+  name: string;
+}

 const navItemStyles = cva('text-xs font-bold', {
   variants: {
     index: {
-      0: 'text-blue-400',
-      1: 'text-lime-500',
-      2: 'text-yellow-500',
-      3: 'text-red-500',
+      0: 'text-blue-400',
+      1: 'text-lime-500',
+      2: 'text-yellow-500',
+      3: 'text-red-500',
     } as Record<NavItemIndex, string>,
   },
 })

-export function NavItem({ index, link, name }) {
+export function NavItem({ index, link, name }: NavItemProps) {

Also applies to: 16-16

Comment on lines +55 to +61
<Link to="/" aria-label="Return to homepage">
<img
src={logo}
alt="cuHacking logo"
className="transition-transform duration-300 hover:scale-[1.2] relative z-[60]"
/>
</Link>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enhance logo accessibility

Add an appropriate aria-label to the logo link that matches the image's alt text.

-      <Link to="/" aria-label="Return to homepage">
+      <Link to="/" aria-label="cuHacking logo - Return to homepage">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Link to="/" aria-label="Return to homepage">
<img
src={logo}
alt="cuHacking logo"
className="transition-transform duration-300 hover:scale-[1.2] relative z-[60]"
/>
</Link>
<Link to="/" aria-label="cuHacking logo - Return to homepage">
<img
src={logo}
alt="cuHacking logo"
className="transition-transform duration-300 hover:scale-[1.2] relative z-[60]"
/>
</Link>

Comment on lines +38 to +42
// TODO: Instagram requires auth
// test('should take user to Instagram page from welcome section', async ({ welcomeSectionLayout }) => {
// const res = await clickAndGoToPage(welcomeSectionLayout, welcomeSectionLayout.instagramLinkWelcome)
// await expect(res).toHaveURL(CUHACKING_2025_INSTAGRAM_URL)
// })
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Improve handling of auth-required tests

Instead of commenting out the Instagram and LinkedIn tests, consider:

  1. Using test.skip() with a clear reason
  2. Implementing mock auth for testing
  3. Testing only the link attributes without navigation

Example:

test.skip('should take user to Instagram page from welcome section', async ({ welcomeSectionLayout }) => {
  // Test skipped: Requires authentication
  const href = await welcomeSectionLayout.instagramLinkWelcome.getAttribute('href');
  expect(href).toBe(CUHACKING_2025_INSTAGRAM_URL);
});

Also applies to: 48-52

Comment on lines +1 to +5
---
title: Bullet-Proof React
description: WIP
icon: ShieldCheck
---
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Update description before v1 release

The description is marked as "WIP" (Work in Progress), but this PR is for the v1 release. Please provide a proper description that explains the purpose and benefits of Bullet-Proof React in your project.

Comment on lines +43 to +69
name: 'chromium (desktop)',
use: { ...devices['Desktop Chrome'] },
},

// {
// name: 'firefox',
// use: { ...devices['Desktop Firefox'] },
// },

// {
// name: 'webkit',
// use: { ...devices['Desktop Safari'] },
// },

// Uncomment for mobile browsers support
/* {
name: 'Mobile Chrome',
{
name: 'firefox (desktop)',
use: { ...devices['Desktop Firefox'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (desktop)',
use: { ...devices['Desktop Safari'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (tablet)',
use: { ...devices['iPad Mini'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'chromium (mobile)',
use: { ...devices['Pixel 5'] },
},
{
name: 'Mobile Safari',
name: 'webkit (mobile)',
use: { ...devices['iPhone 12'] },
}, */

testIgnore: ['./src/lighthouse.spec.ts'],
},
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add missing testIgnore property to Chromium projects

The testIgnore property is inconsistently applied across projects. Firefox, WebKit desktop, tablet, and mobile configurations exclude lighthouse tests, but Chromium configurations don't have this property.

Apply this diff to maintain consistency:

    {
      name: 'chromium (desktop)',
      use: { ...devices['Desktop Chrome'] },
+     testIgnore: ['./src/lighthouse.spec.ts'],
    },
    ...
    {
      name: 'chromium (mobile)',
      use: { ...devices['Pixel 5'] },
+     testIgnore: ['./src/lighthouse.spec.ts'],
    },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
name: 'chromium (desktop)',
use: { ...devices['Desktop Chrome'] },
},
// {
// name: 'firefox',
// use: { ...devices['Desktop Firefox'] },
// },
// {
// name: 'webkit',
// use: { ...devices['Desktop Safari'] },
// },
// Uncomment for mobile browsers support
/* {
name: 'Mobile Chrome',
{
name: 'firefox (desktop)',
use: { ...devices['Desktop Firefox'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (desktop)',
use: { ...devices['Desktop Safari'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (tablet)',
use: { ...devices['iPad Mini'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'chromium (mobile)',
use: { ...devices['Pixel 5'] },
},
{
name: 'Mobile Safari',
name: 'webkit (mobile)',
use: { ...devices['iPhone 12'] },
}, */
testIgnore: ['./src/lighthouse.spec.ts'],
},
name: 'chromium (desktop)',
use: { ...devices['Desktop Chrome'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'firefox (desktop)',
use: { ...devices['Desktop Firefox'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (desktop)',
use: { ...devices['Desktop Safari'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (tablet)',
use: { ...devices['iPad Mini'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'chromium (mobile)',
use: { ...devices['Pixel 5'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},
{
name: 'webkit (mobile)',
use: { ...devices['iPhone 12'] },
testIgnore: ['./src/lighthouse.spec.ts'],
},

@@ -0,0 +1,42 @@
import { cn } from '@cuhacking/shared/utils/cn'
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix typo in file name

The file name contains a typo: "typgoraphy.tsx" should be "typography.tsx".

Rename the file to fix the typo:

git mv libs/shared/ui/src/cuHacking/components/typography/typgoraphy.tsx libs/shared/ui/src/cuHacking/components/typography/typography.tsx

Comment on lines +36 to +42
export function Typography({ variant, className, children }: TypographyProps) {
return (
<div className={cn(typographyVariants({ variant }), className)}>
{children}
</div>
)
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Improve accessibility and semantic HTML

The current implementation uses a div element which lacks semantic meaning. Consider using appropriate HTML elements based on the variant type.

-export function Typography({ variant, className, children }: TypographyProps) {
+export function Typography({ variant, className, children }: TypographyProps) {
+  const Component = variant.startsWith('h') ? variant : 'p'
   return (
-    <div className={cn(typographyVariants({ variant }), className)}>
+    <Component className={cn(typographyVariants({ variant }), className)}>
       {children}
-    </div>
+    </Component>
   )
 }

This change:

  1. Uses semantic HTML elements (h1-h6 for headings, p for paragraphs)
  2. Improves accessibility by using proper heading hierarchy
  3. Maintains the same styling through the className prop

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +20 to +34
const typographyVariants = cva('', {
variants: {
variant: {
'h1': 'text-6xl font-bold font-sans',
'h2': 'text-5xl font-normal font-sans',
'h3': 'font-sans font-medium leading-10 font-sans text-4xl tracking-normal uppercase no-underline',
'h4': 'text-2xl font-normal font-sans',
'h5': 'text-lg font-normal font-sans',
'h6': 'font-sans font-medium leading-5 text-sm tracking-normal uppercase no-underline',
'paragraph-base': 'text-base font-normal font-sans',
'paragraph-sm': 'text-sm font-normal font-sans',
'paragraph-xs': 'text-xs font-normal font-sans',
},
},
})
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Improve typography variants implementation

Several issues need attention:

  1. Remove duplicate font-sans in h3 variant
  2. Consider using semantic HTML elements instead of div
  3. Maintain consistent style ordering across variants
 const typographyVariants = cva('', {
   variants: {
     variant: {
-      'h1': 'text-6xl font-bold font-sans',
-      'h2': 'text-5xl font-normal font-sans',
-      'h3': 'font-sans font-medium leading-10 font-sans text-4xl tracking-normal uppercase no-underline',
-      'h4': 'text-2xl font-normal font-sans',
-      'h5': 'text-lg font-normal font-sans',
-      'h6': 'font-sans font-medium leading-5 text-sm tracking-normal uppercase no-underline',
-      'paragraph-base': 'text-base font-normal font-sans',
-      'paragraph-sm': 'text-sm font-normal font-sans',
-      'paragraph-xs': 'text-xs font-normal font-sans',
+      'h1': 'font-sans font-bold text-6xl',
+      'h2': 'font-sans font-normal text-5xl',
+      'h3': 'font-sans font-medium text-4xl leading-10 tracking-normal uppercase no-underline',
+      'h4': 'font-sans font-normal text-2xl',
+      'h5': 'font-sans font-normal text-lg',
+      'h6': 'font-sans font-medium text-sm leading-5 tracking-normal uppercase no-underline',
+      'paragraph-base': 'font-sans font-normal text-base',
+      'paragraph-sm': 'font-sans font-normal text-sm',
+      'paragraph-xs': 'font-sans font-normal text-xs',
     },
   },
 })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const typographyVariants = cva('', {
variants: {
variant: {
'h1': 'text-6xl font-bold font-sans',
'h2': 'text-5xl font-normal font-sans',
'h3': 'font-sans font-medium leading-10 font-sans text-4xl tracking-normal uppercase no-underline',
'h4': 'text-2xl font-normal font-sans',
'h5': 'text-lg font-normal font-sans',
'h6': 'font-sans font-medium leading-5 text-sm tracking-normal uppercase no-underline',
'paragraph-base': 'text-base font-normal font-sans',
'paragraph-sm': 'text-sm font-normal font-sans',
'paragraph-xs': 'text-xs font-normal font-sans',
},
},
})
const typographyVariants = cva('', {
variants: {
variant: {
'h1': 'font-sans font-bold text-6xl',
'h2': 'font-sans font-normal text-5xl',
'h3': 'font-sans font-medium text-4xl leading-10 tracking-normal uppercase no-underline',
'h4': 'font-sans font-normal text-2xl',
'h5': 'font-sans font-normal text-lg',
'h6': 'font-sans font-medium text-sm leading-5 tracking-normal uppercase no-underline',
'paragraph-base': 'font-sans font-normal text-base',
'paragraph-sm': 'font-sans font-normal text-sm',
'paragraph-xs': 'font-sans font-normal text-xs',
},
},
})

Comment on lines +1 to +23
import { cn } from '@cuhacking/shared/utils/cn';
/* import { ErrorBoundary } from '@cuhacking/shared/utils/ErrorBoundary' */
import { lazy, Suspense } from 'react';

const Spline = lazy(() => import('@splinetool/react-spline'));

export function SplineComponent({
link,
className,
}: {
link: string;
className: string;
}) {
return (
<div className="overflow-x-hidden">
{/* <ErrorBoundary> */}
<Suspense fallback={<div>Loading...</div>}>
<Spline className={cn(className)} scene={link} />
</Suspense>
{/* </ErrorBoundary> */}
</div>
);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add comprehensive test coverage

As per PR objectives, tests are required. The component needs testing for:

  1. Successful rendering
  2. Loading state behavior
  3. Error handling scenarios
  4. Props validation

Would you like me to help generate the test suite for this component?

🧰 Tools
🪛 eslint

[error] 1-1: Extra semicolon.

(style/semi)


[error] 3-3: Extra semicolon.

(style/semi)


[error] 5-5: Extra semicolon.

(style/semi)


[error] 11-11: Unexpected separator (;).

(style/member-delimiter-style)


[error] 12-12: Unexpected separator (;).

(style/member-delimiter-style)


[error] 22-22: Extra semicolon.

(style/semi)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: 🏗 In Progress
Development

Successfully merging this pull request may close these issues.

3 participants