Skip to content

feat: add landing page, error page, and refine header styling#20

Merged
toddeTV merged 11 commits into
mainfrom
feat/landing-page-and-error-page
Mar 7, 2026
Merged

feat: add landing page, error page, and refine header styling#20
toddeTV merged 11 commits into
mainfrom
feat/landing-page-and-error-page

Conversation

@toddeTV
Copy link
Copy Markdown
Owner

@toddeTV toddeTV commented Mar 7, 2026

This PR adds the error page and landing page with hero, about, connect, skills, testimonials, recent talks, and recent projects sections, and polishes the site header with larger nav items and a restyled logo dot.

Summary by CodeRabbit

  • New Features

    • Added a new landing page with hero, skills, testimonials carousel, recent talks, and recent projects.
    • Added a custom error page for improved user experience.
    • Consolidated testimonials into a single aggregated list for display.
  • Style

    • Updated header logo styling.
    • Increased navigation font sizes for better readability on desktop and mobile.
  • Refactor

    • Centralized and improved project sorting logic.
  • Chores

    • Removed an example content page.

@toddeTV toddeTV self-assigned this Mar 7, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 7, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Lite

Run ID: 20404276-b899-4a45-9fbd-b5eef558766e

📥 Commits

Reviewing files that changed from the base of the PR and between de968f9 and 0272d96.

📒 Files selected for processing (4)
  • app/composables/useSortedProjects.ts
  • app/error.vue
  • app/pages/index.vue
  • content/pages/example.md
💤 Files with no reviewable changes (1)
  • content/pages/example.md

📝 Walkthrough

Walkthrough

Adds a landing page (hero, skills, testimonials, recent projects/talks), two composables (useAllTestimonials, useSortedProjects), refactors the projects listing to use the new composable, adds a custom error page, and adjusts the site header logo markup and navigation font sizes.

Changes

Cohort / File(s) Summary
Header Styling
app/components/layout/SiteHeader.vue
Logo markup split into separate spans for text and dot; desktop and mobile nav item font sizes increased from text-sm to text-base.
Testimonial Aggregation
app/composables/useAllTestimonials.ts
New composable that collects testimonials from projects and talks, annotates with source links and _sortDate, sorts by date, and returns cleaned LinkedTestimonial items.
Project Sorting
app/composables/useSortedProjects.ts, app/pages/projects/index.vue
New useSortedProjects(limit?) composable added; projects/index.vue refactored to call this composable instead of inline sorting logic.
Pages
app/pages/index.vue, app/error.vue
New landing page index.vue rendering hero, skills, socials, testimonials, recent talks/projects; new error.vue provides a custom error/404 layout and back-to-home handler.
Removed Content
content/pages/example.md
Deleted example content page and its frontmatter (metadata/OG/sitemap entries).

Sequence Diagram(s)

sequenceDiagram
    participant Page as Landing Page
    participant SA as useSortedProjects
    participant TA as useAllTestimonials
    participant DB as Collections

    rect rgba(100, 150, 200, 0.5)
    Note over Page,DB: Parallel data fetching
    Page->>SA: request sorted projects (limit)
    Page->>TA: request aggregated testimonials
    Page->>DB: request active socials
    Page->>DB: request recent talks

    SA->>DB: query all projects
    SA-->>SA: sort by ongoing, endDate, startDate, stars
    SA-->>Page: return sorted projects

    TA->>DB: query projects
    TA->>DB: query talks
    TA-->>TA: build combined list, attach linkTo/_sortDate, sort by _sortDate
    TA-->>Page: return testimonials

    DB-->>Page: return socials
    DB-->>Page: return recent talks
    end

    rect rgba(200, 150, 100, 0.5)
    Note over Page: Render UI sections
    Page->>Page: render hero, skills, socials
    Page->>Page: render testimonial carousel
    Page->>Page: render recent talks and projects
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes


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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/composables/useSortedProjects.ts`:
- Line 11: The current implementation sorts the array in-place via
projects.sort(...) which mutates the original cached array; fix this in
useSortedProjects by making a shallow copy before sorting (e.g., copy projects
into a new array and then call .sort on that copy) so the original cached
reference isn’t mutated; update the sorted assignment that currently references
projects.sort(...) to instead sort a copied array (use the projects identifier
and the sorted variable so reviewers can locate the change).

In `@app/error.vue`:
- Around line 26-28: The <h1> in the error component is hardcoded to "Page Not
Found"; update it to render a dynamic heading based on the statusCode variable
(used in this component) so 404 shows "Page Not Found" and other codes show a
suitable heading like "An unexpected error occurred" or "Error {statusCode}";
modify the <h1> (or its template binding) to check statusCode and display the
appropriate string, keeping the existing statusCode prop/computed logic intact.

In `@app/pages/index.vue`:
- Around line 40-54: The Promise.all call is executing sequentially because each
promise is awaited inside the array; remove the inner await keywords so the
calls to useAsyncData('index-socials-all', ...), useAllTestimonials(),
useAsyncData('recent-talks', ...), and useSortedProjects(2) are passed as
promises to Promise.all for true parallel execution; update the array in the
Promise.all invocation accordingly and keep the outer await on Promise.all to
await all results together.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Lite

Run ID: a82a86d6-cd00-40a5-9c5a-6bbb40178fed

📥 Commits

Reviewing files that changed from the base of the PR and between 325b1c9 and de968f9.

📒 Files selected for processing (6)
  • app/components/layout/SiteHeader.vue
  • app/composables/useAllTestimonials.ts
  • app/composables/useSortedProjects.ts
  • app/error.vue
  • app/pages/index.vue
  • app/pages/projects/index.vue

Comment thread app/composables/useSortedProjects.ts Outdated
Comment thread app/error.vue
Comment thread app/pages/index.vue
@toddeTV toddeTV merged commit a3c7c45 into main Mar 7, 2026
5 checks passed
@toddeTV toddeTV deleted the feat/landing-page-and-error-page branch March 7, 2026 17:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant