How asrathoredev/asrathore-portfolio works
1. Repo shape
- This is a Next.js App Router portfolio application written in TypeScript.
- The architecture is mostly single-page, section-based UI composition with one server API endpoint for contact form submission.
2. Application entry points
- src/app/page.tsx is the main landing page and likely composes the entire portfolio from section components.
- src/app/layout.tsx defines the global shell, and src/app/globals.css provides app-wide styling tokens and base styles.
- src/app/api/get-in-touch/route.ts is the only explicit backend boundary in the repo.
3. Page composition model
- The UI is split into page-level sections under src/sections/: Hero, About, Skills, Works, AdiVerse, and GetInTouch.
- This suggests a scrolling portfolio experience where each section is a self-contained content block, assembled at the page level rather than routed to separate pages.
4. Content/data layer
- src/data/adiverse.ts holds structured content for the AdiVerse section, likely including project or experience metadata.
- This keeps presentation components separated from static content, making the portfolio easier to update without changing UI logic.
5. Reusable component layer
- src/components/ contains shared building blocks like Navbar and Container.
- src/components/ui/ contains more specialized interactive UI pieces such as ProjectCard, ContactForm, Lightbox, FloatingInput, MagneticButton, PixelReveal, and StatsTicker.
- These components act as the presentation layer beneath the section-level composition.
6. Interactive portfolio features
- The UI includes motion-heavy and interactive elements, consistent with the README’s mention of Framer Motion.
- Likely interaction boundaries include animated buttons, reveal effects, project cards, a lightbox for media viewing, and ticker/stat presentation, all encapsulated inside the ui layer.
7. Contact flow boundary
- src/sections/GetInTouch.tsx likely renders ContactForm.
- src/components/ui/ContactForm.tsx is the client-facing form component.
- Form submission is routed to src/app/api/get-in-touch/route.ts, which serves as the server-side processing endpoint. This is the main request/response data flow in the repo.
8. AdiVerse subsystem
- src/sections/AdiVerse.tsx plus src/components/ui/AdiVerseGrid.tsx and src/data/adiverse.ts form a distinct content subsystem.
- This appears to be a portfolio showcase area with structured project/story content, likely using a grid presentation and one or more card/lightbox interactions.
9. Styling and design system
- The project uses Tailwind CSS for utility-driven styling, supported by tailwind.config.ts and postcss.config.mjs.
- components.json and src/components/ui/card.tsx indicate a design-system-style component set similar to shadcn/ui conventions.
- src/lib/utils.ts likely contains shared helpers for class composition or UI utilities.
10. Infrastructure and runtime boundaries
- The app runs in the Next.js runtime, with the portfolio rendered from React components and the contact endpoint handled server-side in the App Router.
- public/ provides static assets such as images, icons, or media used throughout the portfolio.
- There is no sign of a database, authentication system, or external CMS; content appears to be mostly local and code-driven.
11. How to draw the architecture
- At the center: page.tsx assembling section components.
- Under that: reusable UI components and shared utilities.
- Side branch: local content/data files feeding specific sections.
- Separate server boundary: the get-in-touch API route receiving form submissions from the contact UI.
- Around everything: global layout/styles, Tailwind, and static assets.
Main entry points: page.tsx Home page · ContactForm.tsx Contact form · utils.ts Utils · Hero.tsx Hero
Components 23
App shell
Next.js App Router entrypoints and API boundary
- Layout · Defines the global document shell and wrappers
src/app/layout.tsx - Home page · Assembles the landing page from section components
src/app/page.tsx - Contact API · Server endpoint for contact form submission
src/app/api/get-in-touch/route.ts
Page sections
Scroll-based portfolio sections assembled on the landing page
- Hero · Top-of-page intro and primary call to action
src/sections/Hero.tsx - About · Background and personal introduction block
src/sections/About.tsx - Skills · Capabilities and toolset overview
src/sections/Skills.tsx - Works · Portfolio projects and showcases
src/sections/Works.tsx - AdiVerse · Dedicated showcase section for AdiVerse content
src/sections/AdiVerse.tsx - Get in touch · Contact section wrapping the submission flow
src/sections/GetInTouch.tsx
Shared UI
Reusable layout and interactive components
- Navbar · Primary site navigation
src/components/Navbar.tsx - Container · Shared width and spacing wrapper
src/components/Container.tsx - Contact form · Client-facing form that submits contact data
src/components/ui/ContactForm.tsx - AdiVerse grid · Grid presentation for AdiVerse items
src/components/ui/AdiVerseGrid.tsx - Project card · Card used to present projects or featured work
src/components/ui/ProjectCard.tsx - Lightbox · Overlay viewer for enlarged visual content
src/components/ui/Lightbox.tsx - Magnetic button · Animated call-to-action button component
src/components/ui/MagneticButton.tsx - Pixel reveal · Reveal effect used for motion-heavy presentation
src/components/ui/PixelReveal.tsx - Stats ticker · Animated stats or counters for highlighted figures
src/components/ui/StatsTicker.tsx - Floating input · Animated input control used by the contact form
src/components/ui/FloatingInput.tsx - Card · Base design-system card primitive
src/components/ui/card.tsx - Utils · Shared utility helpers such as class composition
src/lib/utils.ts
Content data
Local structured content feeding the UI
- AdiVerse data · Structured local content for the AdiVerse section
src/data/adiverse.ts
Styling
Global and utility styling layers
- Globals · App-wide base styles and design tokens
src/app/globals.css
Connections 25
- Layout → Globals: loads styles · The app shell applies global styling
- Home page → Hero: renders · Main page composes the Hero section
- Home page → About: renders · Main page composes the About section
- Home page → Skills: renders · Main page composes the Skills section
- Home page → Works: renders · Main page composes the Works section
- Home page → AdiVerse: renders · Main page composes the AdiVerse section
- Home page → Get in touch: renders · Main page composes the contact section
- Home page → Navbar: uses · Page includes the site navigation
- Hero → Magnetic button: uses · Hero likely uses the animated CTA button
- Hero → Pixel reveal: uses · Hero presentation uses reveal animations
- About → Container: wraps · Section content is likely constrained by the shared container
- Skills → Stats ticker: uses · Skills section can present animated stats
- Works → Project card: uses · Works section renders featured project cards
- Works → Lightbox: uses · Works section may open visual previews in a lightbox
- AdiVerse → AdiVerse grid: uses · AdiVerse section uses a dedicated grid layout
- AdiVerse → AdiVerse data: reads · AdiVerse section is driven by local structured content
- AdiVerse grid → Card: builds on · Grid presentation is composed from the card primitive
- Get in touch → Contact form: uses · Contact section embeds the client form
- Contact form → Floating input: uses · Form is built from floating input controls
- Contact form → Contact API: submits to · Form posts data to the server endpoint
- Contact form → Utils: uses · Form and UI helpers share utility functions
- Project card → Card: builds on · Project cards use the shared card primitive
- Magnetic button → Utils: uses · Interactive components rely on shared helpers
- Pixel reveal → Utils: uses · Animation component shares utility helpers
- Stats ticker → Utils: uses · Ticker component shares utility helpers