Skip to content

Landing page redesign and add 52-week capacity view#61

Merged
Ross1116 merged 11 commits into
mainfrom
staging
May 26, 2026
Merged

Landing page redesign and add 52-week capacity view#61
Ross1116 merged 11 commits into
mainfrom
staging

Conversation

@Ross1116

@Ross1116 Ross1116 commented May 26, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Interactive ROI calculator
    • Booking-management hero/dashboard preview and updated lookahead preview
    • 52-week capacity planning view
  • Style & Improvements

    • Reworked landing visuals, animations, and section layout
    • Consistent brand update to “Sitespace” across site copy and outbound emails
    • Improved dialog layouts, navigation/menu behavior, and sharing metadata
  • Tests

    • Added a unit test for project data normalization

Review Change Stack

@vercel

vercel Bot commented May 26, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
sitespace-app Ready Ready Preview, Comment May 26, 2026 10:34am

@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b7f88c5b-6a83-4342-975a-3939006e5838

📥 Commits

Reviewing files that changed from the base of the PR and between 173705f and 8d48061.

📒 Files selected for processing (5)
  • src/app/layout.tsx
  • src/components/landing/LandingPage.css
  • src/components/landing/LandingPage.tsx
  • src/components/landing/ROICalculator.tsx
  • src/components/landing/TopBar.tsx

📝 Walkthrough

Walkthrough

This PR standardizes branding to "Sitespace", rewrites the landing page (new hero, ROI calculator, sections, and CSS), adds 52-week capacity view support (types, normalization, date utilities, and dashboard UI), and refactors lookahead dialogs and upload-review UI with consistent card/pill components.

Changes

Brand and metadata unification

Layer / File(s) Summary
Brand capitalization standardization
src/app/(auth)/forgot-password/page.tsx, src/app/(auth)/login/page.tsx, src/app/(auth)/register/page.tsx, src/app/(auth)/reset-password/page.tsx, src/app/(auth)/set-password/page.tsx, src/components/SideNav.tsx, src/components/auth/RegisterForm.tsx, src/app/api/contact/route.ts, src/app/layout.tsx, src/lib/landingData.ts, src/components/landing/TopBar.tsx
All instances of "SiteSpace"/sitespace updated to "Sitespace"; contact email template and environment fallback sender values and app metadata/title/OG/Twitter copy updated; nav brand image alt updated.

52-week view infrastructure and capacity dashboard

Layer / File(s) Summary
Capacity window type and project data model
src/stores/uiIntentStore.ts, src/types/index.ts, src/hooks/projects/api.ts, src/lib/apiNormalization.ts, src/hooks/projects/api.test.ts
Extended CapacityWindowSize to include "52W"; added optional start_date to ApiProject; fetchProject now normalizes API responses via normalizeProjectList; added test asserting project_start_datestart_date mapping.
Capacity dashboard year view
src/components/lookahead/CapacityDashboard.tsx
Major refactor: added 52W/year view with Monday-ISO normalization and week shifting, project-start anchoring via SWR, utilization-tone system, minimal year summary/cells, and redesigned matrix/grid and header controls.

Landing page redesign

Layer / File(s) Summary
New hero section and ROI calculator
src/components/landing/DashboardHero.tsx, src/components/landing/ROICalculator.tsx
Introduced DashboardHero (interactive booking card, signal panels) and ROICalculator (inputs, memoized ROI computation, circular gauge, metric lines).
Landing page structure and sections
src/components/landing/LandingPage.tsx
Replaced previous landing with a composition-driven layout: DemoModalProvider, NavBar, DashboardHero, SitePulseSection, ProductProofSection, CommitmentThreadSection, ROICalculator, FinalCTA, and Footer.
Lookahead preview and showcase
src/components/landing/LookaheadPreview.tsx, src/components/landing/ShowcaseSection.tsx
Rebuilt LookaheadPreview with StatCard-driven metrics and DemandMatrixPreview; ShowcaseSection simplified into a static dashboard preview with quick access cards and booking rows.
Navigation and landing CSS
src/components/landing/TopBar.tsx, src/components/landing/LandingPage.css
Centralized nav items, updated brand image/alt, added hero animations, ROI slider visuals, landing patterns, pulse/thread visuals, responsive tweaks, and reduced-motion rules.

Lookahead dialog improvements

Layer / File(s) Summary
Activity dialogs UI standardization
src/components/lookahead/ActivityContextDialog.tsx, src/components/lookahead/ActivityDrilldownDialog.tsx
Refactored dialogs to use SummaryCard/SectionCard/InlineInfo/SoftPill, redesigned dialog layouts with constrained scrollable content, and restyled loading/empty states and metadata pills.
Upload review dialog redesign
src/components/lookahead/UploadReviewDialog.tsx
Overhauled layout and header/stats UI, removed prior AI telemetry stat block, added formatSourceLabel, improved error-handling with try/catch/finally and object-spread merges, and restructured per-row cards, toolbar, and pagination.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

"A rabbit hops with tidy type and cheer,
I stitch the brand so all can hear,
Fifty-two weeks now watch the plan,
The hero gleams, the gauges span,
Sitespace sings — hop into the year!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 4.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title Check ✅ Passed Title check skipped as CodeRabbit has written the PR title.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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

❤️ Share

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

@coderabbitai coderabbitai Bot changed the title @coderabbitai Landing page redesign and add 52-week capacity view May 26, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

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

Inline comments:
In `@src/components/landing/LandingPage.css`:
- Around line 137-158: Each .hero-float-* rule (.hero-float-a, .hero-float-b,
.hero-float-c, .hero-float-d) places the animation-delay declaration immediately
after custom properties (--float-x, --float-y), which violates the Stylelint
declaration-empty-line-before rule; insert a single blank line before the
animation-delay declaration in each of these blocks so there's an empty line
separating the custom property declarations from the animation-delay property.

In `@src/components/landing/ROICalculator.tsx`:
- Around line 287-299: The lookahead window buttons don't expose their selected
state to assistive tech; update the button in the map so it includes an
accessible pressed state by adding aria-pressed={windowSize === option.label}
(and optionally aria-current="true" when selected) to the button element and
keep the existing onClick/setWindowSize logic; reference the setWindowSize
setter, windowSize state, and option.label to determine and render the
pressed/selected attribute so screen readers announce which week option is
selected.
- Around line 349-364: The range input lacks an accessible association with its
visible label; update the ROI slider block to give the input a stable id (e.g.
derive from the label or add a prop) and connect the displayed label to that id
using a <label htmlFor={id}> (or wrap the input in a <label>) so screen readers
announce the control; ensure the input keeps its props (min, max, step, value,
onChange, style with progress) and that the label text still uses the existing
label variable.

In `@src/components/landing/TopBar.tsx`:
- Around line 10-16: The NAV_ITEMS entry for the "Access" link uses href
"`#benefits`" which does not match any section ID and therefore doesn't scroll;
open the TopBar component and update the NAV_ITEMS array (the object with label
"Access") so its href matches the actual section id used on the page (e.g.,
change "`#benefits`" to the real id such as "`#access`" or change the target
section's id to "benefits" so they match), ensuring the label "Access" and href
are consistent.

In `@src/components/lookahead/CapacityDashboard.tsx`:
- Around line 76-83: The month-label logic in formatMonthLabel currently does
new Date(value) which treats "YYYY-MM-DD" as UTC and can shift month boundaries;
change parsing to explicitly construct a local Date from the Y-M-D components
(split the input by '-' and call new Date(year, monthIndex, day)) to avoid UTC
midnight semantics, keep the existing NaN fallback and return
parsed.toLocaleDateString("en-AU", { month: "short" }) unchanged so month badges
use the correct local calendar month.

In `@src/components/lookahead/UploadReviewDialog.tsx`:
- Around line 129-136: In formatSourceLabel, guard against whitespace-only
inputs: after trimming source into the normalized variable, if normalized is an
empty string (e.g. source was only whitespace) return "Unknown" instead of
falling through; update the function (formatSourceLabel) to check normalized ===
"" (or length === 0) and return "Unknown" before the lowercase comparison to
ensure the Source field never renders blank.

In `@src/lib/landingData.ts`:
- Around line 72-75: The marketing copy in the landingData module uses
inconsistent brand spellings ("Sitespace" vs "Sitespace"); update every affected
text field (e.g., the object properties badge, heading, subheading and the other
landingData entries) to use a single canonical spelling (pick the correct brand
form and replace all occurrences across the landingData export) so all entries
are normalized and consistent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9f5c2bab-f2a0-4762-9652-68b939a84b19

📥 Commits

Reviewing files that changed from the base of the PR and between 61852a7 and d32e5e8.

⛔ Files ignored due to path filters (4)
  • public/static/images/bookingspage.png is excluded by !**/*.png
  • public/static/images/dashhome.png is excluded by !**/*.png
  • public/static/images/livecalendar.png is excluded by !**/*.png
  • public/static/images/lookaheadplan.png is excluded by !**/*.png
📒 Files selected for processing (26)
  • src/app/(auth)/forgot-password/page.tsx
  • src/app/(auth)/login/page.tsx
  • src/app/(auth)/register/page.tsx
  • src/app/(auth)/reset-password/page.tsx
  • src/app/(auth)/set-password/page.tsx
  • src/app/api/contact/route.ts
  • src/app/layout.tsx
  • src/components/SideNav.tsx
  • src/components/auth/RegisterForm.tsx
  • src/components/landing/DashboardHero.tsx
  • src/components/landing/LandingPage.css
  • src/components/landing/LandingPage.tsx
  • src/components/landing/LookaheadPreview.tsx
  • src/components/landing/ROICalculator.tsx
  • src/components/landing/ShowcaseSection.tsx
  • src/components/landing/TopBar.tsx
  • src/components/lookahead/ActivityContextDialog.tsx
  • src/components/lookahead/ActivityDrilldownDialog.tsx
  • src/components/lookahead/CapacityDashboard.tsx
  • src/components/lookahead/UploadReviewDialog.tsx
  • src/hooks/projects/api.test.ts
  • src/hooks/projects/api.ts
  • src/lib/apiNormalization.ts
  • src/lib/landingData.ts
  • src/stores/uiIntentStore.ts
  • src/types/index.ts

Comment thread src/components/landing/LandingPage.css
Comment thread src/components/landing/ROICalculator.tsx
Comment thread src/components/landing/ROICalculator.tsx
Comment thread src/components/landing/TopBar.tsx
Comment thread src/components/lookahead/CapacityDashboard.tsx
Comment thread src/components/lookahead/UploadReviewDialog.tsx
Comment thread src/lib/landingData.ts
Comment on lines +72 to +75
badge: "Why Choose Sitespace",
heading: "The only platform built specifically for asset delivery",
subheading:
"Unlike generic scheduling tools, sitespace is designed from the ground up for the unique challenges of asset delivery management.",
"Unlike generic scheduling tools, Sitespace is designed from the ground up for the unique challenges of asset delivery management.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Standardize brand text across landing copy entries.

These updated strings use “Sitespace” while other entries (e.g., Line 3) use “Sitespace”. Please normalize all changed occurrences to one canonical brand spelling to keep marketing copy consistent.

Also applies to: 148-148, 207-207, 213-213, 218-218, 223-223, 228-228, 233-233, 238-238, 243-243, 280-280

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

In `@src/lib/landingData.ts` around lines 72 - 75, The marketing copy in the
landingData module uses inconsistent brand spellings ("Sitespace" vs
"Sitespace"); update every affected text field (e.g., the object properties
badge, heading, subheading and the other landingData entries) to use a single
canonical spelling (pick the correct brand form and replace all occurrences
across the landingData export) so all entries are normalized and consistent.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
src/components/landing/TopBar.tsx (1)

10-16: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Duplicate href values cause duplicate React keys and redundant navigation.

Lines 14 and 15 both use href: "#contact", which means:

  1. Both "Access" and "Contact" nav items scroll to the same section
  2. Using item.href as the React key (lines 95 and 158) produces duplicate keys, triggering React warnings

If "Access" should link to a distinct section, update its href. Otherwise, consider removing one of the duplicate entries.

Suggested fix (if Access should link to a commitments section)
 const NAV_ITEMS = [
   { href: "`#features`", label: "Product" },
   { href: "`#lookahead`", label: "Lookahead" },
   { href: "`#calculator`", label: "ROI" },
-  { href: "`#contact`", label: "Access" },
+  { href: "`#commitments`", label: "Access" },
   { href: "`#contact`", label: "Contact" },
 ];

If #commitments doesn't exist, either add the section or use a unique identifier for the key:

-<a key={item.href} ...>
+<a key={item.label} ...>

Also applies to: 93-102

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

In `@src/components/landing/TopBar.tsx` around lines 10 - 16, NAV_ITEMS contains
two entries with the same href ("`#contact`"), which causes both redundant
navigation and duplicate React keys when the component (TopBar) uses item.href
as the key; update the NAV_ITEMS array so "Access" points to a distinct anchor
(e.g., "`#commitments`" or another unique id) or remove the duplicate entry, and
ensure the render that uses key={item.href} (in TopBar) will have unique
keys—alternatively switch the key to a unique value (like item.label or a
generated id) if you intentionally keep similar hrefs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/components/landing/TopBar.tsx`:
- Around line 10-16: NAV_ITEMS contains two entries with the same href
("`#contact`"), which causes both redundant navigation and duplicate React keys
when the component (TopBar) uses item.href as the key; update the NAV_ITEMS
array so "Access" points to a distinct anchor (e.g., "`#commitments`" or another
unique id) or remove the duplicate entry, and ensure the render that uses
key={item.href} (in TopBar) will have unique keys—alternatively switch the key
to a unique value (like item.label or a generated id) if you intentionally keep
similar hrefs.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: abe14a36-9d83-415d-8187-83c4070160da

📥 Commits

Reviewing files that changed from the base of the PR and between d32e5e8 and 173705f.

📒 Files selected for processing (5)
  • src/components/landing/LandingPage.css
  • src/components/landing/ROICalculator.tsx
  • src/components/landing/TopBar.tsx
  • src/components/lookahead/CapacityDashboard.tsx
  • src/components/lookahead/UploadReviewDialog.tsx

@Ross1116 Ross1116 merged commit b6a23f1 into main May 26, 2026
3 checks passed
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