How nexoralabs-website/nexora-website works
Nexora Labs is a marketing/agency website built as a Next.js 15 App Router application. The architecture is centered on a mostly static public site with a small interactive backend path for the contact form. Most of the code lives in app/, components/, and lib/, with styles/, public/, and types/ supporting presentation and shared contracts.
The application routes are simple and page-oriented: the landing page at app/page.tsx, plus dedicated privacy and terms pages. app/robots.ts and app/sitemap.ts indicate the site also generates SEO and crawl metadata at the framework level rather than through a separate backend.
The landing page is composed from modular sections in components/sections/ such as hero, services, projects, testimonials, FAQ, contact, and CTA. This suggests a single long-form conversion page broken into reusable blocks, which is typical for an agency site and makes the visual structure easy to diagram as a stack of independent content sections.
Shared chrome and persistent UI live in components/ outside the sections folder: navbar, footer, floating contact action, logo, and a loading screen. These components define the site shell around the route content and are likely reused across the legal pages and the main homepage.
The design system is built from shadcn/ui primitives under components/ui/, including button, card, input, label, textarea, accordion, and a couple of animated interaction components. This means the UI layer is split between composable base controls and higher-level marketing sections, rather than a monolithic page template.
Animation is a first-class concern. hooks/use-animations.ts, components/ui/animated-section.tsx, components/ui/magnetic-button.tsx, and the Framer Motion dependency in the README indicate scroll/entrance and interactive motion effects are layered into otherwise static content. For architecture diagrams, this is a client-side enhancement layer rather than a separate subsystem.
The primary dynamic workflow is the contact form. The form is validated with Zod via lib/validations/contact.ts, then submitted through a Next.js Server Action in app/actions/contact.ts. This gives the site a server-side boundary without a full API layer.
There is an optional persistence backend through Supabase, configured in lib/supabase.ts. The README makes clear that contact submission storage is optional: if Supabase credentials are absent, the form still validates and returns success for demo use. So the data flow is “client form -> server action -> optional Supabase insert,” with a graceful no-database fallback.
Shared application data and constants are centralized in lib/data.ts and lib/constants.ts, while lib/metadata.ts handles SEO metadata generation. This keeps content and site-wide configuration out of individual components, which is useful for diagramming a clean separation between content/config and presentation.
Utility and type boundaries are lightweight but explicit. lib/utils.ts likely contains helper functions, and types/index.ts provides project-wide TypeScript types. This indicates a small but intentional shared domain layer used by both components and server-side code.
The project is styled globally through styles/globals.css and Tailwind CSS v4, with postcss.config.mjs and next.config.ts handling build-time integration. Styling is therefore not managed by a separate design system service; it is fully embedded in the frontend build pipeline.
Static assets are stored in public/, including brand assets under public/brand. The README and scripts/extract-logos.mjs suggest brand/logo processing is part of the repo’s asset workflow, supporting a polished marketing presentation rather than dynamic media delivery.
Overall, the architecture has three main boundaries: a route/presentation layer in app/, a reusable UI/content layer in components/ and lib/, and a narrow server/data path for contact submissions via Server Actions and optional Supabase. The rest of the repository is mostly supporting infrastructure for styling, animation, SEO, and static assets.
Main entry points: layout.tsx Root layout · metadata.ts Metadata · page.tsx Home page · button.tsx UI primitives
Components 25
App routes
Next.js App Router pages, metadata, and server actions.
- Root layout · Global app wrapper and shared document structure.
app/layout.tsx - Home page · Main marketing landing page assembled from sections.
app/page.tsx - Privacy page · Dedicated privacy policy route.
app/privacy/page.tsx - Terms page · Dedicated terms of service route.
app/terms/page.tsx - Contact action · Server-side contact submission boundary.
app/actions/contact.ts - Robots · Framework-level robots metadata output.
app/robots.ts - Sitemap · Framework-level sitemap metadata output.
app/sitemap.ts
UI layer
Persistent chrome, long-form sections, and shared UI primitives.
- Navbar · Top-level navigation reused across pages.
components/navbar.tsx - Footer · Shared footer for the site shell.
components/footer.tsx - Contact action · Persistent contact shortcut component.
components/floating-contact.tsx - Page sections · Reusable long-form homepage blocks such as hero, services, projects, FAQ, and CTA.
components/sections/hero.tsx - Engineering block · Supplementary credibility and process-focused marketing section.
components/sections/practical-engineering.tsx - UI primitives · Base shadcn-style controls and interaction primitives.
components/ui/button.tsx - Motion layer · Scroll and interaction enhancements layered onto static content.
components/ui/animated-section.tsx
Shared logic
Content, constants, validation, metadata, utilities, and backend client setup.
- Site data · Centralized marketing copy, service lists, and shared content.
lib/data.ts - Constants · Site-wide constants and configuration values.
lib/constants.ts - Metadata · SEO metadata generation helpers.
lib/metadata.ts - Contact schema · Validation contract for contact submissions.
lib/validations/contact.ts - Supabase client · Optional persistence backend for contact submissions.
lib/supabase.ts
Support
Styling, types, hooks, static assets, and tooling.
- Animation hook · Shared animation behavior used by interactive UI.
hooks/use-animations.ts - Utils · Shared utility functions used across the app.
lib/utils.ts - Types · Project-wide TypeScript type definitions.
types/index.ts - Global styles · App-wide styling layer.
styles/globals.css - Brand assets · Static brand and logo assets.
public/brand - Logo script · Repository script for logo extraction and asset processing.
scripts/extract-logos.mjs
Connections 29
- Root layout → Navbar: wraps · Shared site shell composes navigation.
- Root layout → Footer: wraps · Shared site shell composes footer.
- Root layout → Global styles: loads · Global stylesheet is applied at the app root.
- Root layout → Home page: renders · Root layout hosts route content.
- Root layout → Privacy page: renders · Root layout hosts legal route content.
- Root layout → Terms page: renders · Root layout hosts legal route content.
- Home page → Page sections: assembles · Landing page is built from modular sections.
- Home page → Engineering block: includes · Home page includes supporting credibility content.
- Home page → Contact action: shows · Home page exposes persistent contact entry.
- Home page → Metadata: uses · Page metadata is generated centrally.
- Privacy page → Metadata: uses · Legal page metadata is centrally generated.
- Terms page → Metadata: uses · Legal page metadata is centrally generated.
- Robots → Metadata: derives from · SEO route participates in site metadata generation.
- Sitemap → Metadata: derives from · SEO route participates in site metadata generation.
- Page sections → Site data: reads · Marketing sections consume shared site content.
- Page sections → UI primitives: uses · Sections are composed from base UI controls.
- Engineering block → UI primitives: uses · Supporting section uses shared primitives.
- Contact action → UI primitives: uses · Floating CTA relies on shared button/input styling primitives.
- UI primitives → Motion layer: enhances with · Primitives are augmented by motion interactions.
- Motion layer → Animation hook: depends on · Animation components share hook logic.
- Contact action → Contact schema: validates · Server action validates form payloads before submission.
- Contact action → Supabase client: optionally writes · Persistence is optional when credentials are present.
- Contact action → Types: uses · Server-side workflow shares domain types.
- Contact schema → Types: defines · Schema informs shared contact data shape.
- Supabase client → Utils: uses · Backend client setup can share helpers.
- Metadata → Constants: reads · Metadata generation uses site constants.
- Site data → Constants: reads · Content registry is parameterized by constants.
- Utils → Types: supports · Utility code operates on shared types.
- Logo script → Brand assets: processes · Asset script works on brand/logo files.