# harris0519/oliva-and-partners-lawfirm architecture

> Architecture diagram of the GitHub repository harris0519/oliva-and-partners-lawfirm, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/harris0519/oliva-and-partners-lawfirm
- Repository: https://github.com/harris0519/oliva-and-partners-lawfirm

## Overview

Oliva & Partners is a public law-firm website for exploring the firm, its legal services, attorneys, and insights, and submitting a consultation inquiry. Visitors enter through the routed React site; the contact page posts inquiries to an API, where the Node service validates and formats them before sending transactional email through Brevo. The graph includes the documented remote production API. Some page and server relationships rely on the README or SOURCE INDEX; unsampled implementation details are not inferred.

Main entry points: [`src/App.jsx`](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/App.jsx) (Route dispatcher), [`src/data/siteData.js`](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/data/siteData.js) (Firm content data), [`src/components/PageHero.jsx`](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/PageHero.jsx) (Page heading), [`src/pages/Contact.jsx`](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Contact.jsx) (Contact form)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Website shell and routing"]
  node_app["Route dispatcher<br/>[App.jsx]"]
  node_layout["Page layout<br/>[Layout.jsx]"]
  node_header["Navigation menu<br/>[Header.jsx]"]
  node_footer["Site footer<br/>[Footer.jsx]"]
  node_scroll["Scroll reset<br/>[ScrollToTop.jsx]"]
end

subgraph group_pages["Firm pages"]
  node_home["Home<br/>[Home.jsx]"]
  node_about["About firm<br/>[About.jsx]"]
  node_practice["Practice areas<br/>[PracticeAreas.jsx]"]
  node_practice_detail["Practice detail"]
  node_attorneys["Attorney directory<br/>[Attorneys.jsx]"]
  node_attorney_detail["Attorney profile<br/>[AttorneyDetail.jsx]"]
  node_insights["Legal insights<br/>[Insights.jsx]"]
  node_contact_page["Contact form<br/>[Contact.jsx]"]
  node_not_found["Not found page<br/>[NotFound.jsx]"]
end

subgraph group_content["Shared content and presentation"]
  node_site_data["Firm content data<br/>[siteData.js]"]
  node_page_hero["Page heading<br/>[PageHero.jsx]"]
  node_portrait["Attorney portrait"]
end

subgraph group_contact["Inquiry and email"]
  node_contact_api["Contact API<br/>[index.js]"]
  node_email_builder["Inquiry validation and email<br/>[contactEmail.js]"]
end

node_visitor(("Visitor"))
node_hrl_service["Production HRL API"]
node_brevo["Brevo email service"]

node_visitor -->|"opens site"| node_app
node_app -->|"wraps routes"| node_layout
node_app -->|"routes to"| node_home
node_app -->|"routes to"| node_about
node_app -->|"routes to"| node_practice
node_app -->|"routes to"| node_practice_detail
node_app -->|"routes to"| node_attorneys
node_app -->|"routes to"| node_attorney_detail
node_app -->|"routes to"| node_insights
node_app -->|"routes to"| node_contact_page
node_app -->|"routes to"| node_not_found
node_layout -->|"renders"| node_header
node_layout -->|"renders"| node_footer
node_layout -->|"renders"| node_scroll
node_header -->|"reads navigation data"| node_site_data
node_home -->|"reads firm content"| node_site_data
node_home -->|"renders portraits"| node_portrait
node_practice -->|"reads practice areas"| node_site_data
node_practice -->|"renders heading"| node_page_hero
node_practice_detail -->|"reads practice details"| node_site_data
node_practice_detail -->|"renders heading"| node_page_hero
node_attorneys -->|"reads attorney data"| node_site_data
node_attorneys -->|"renders portraits"| node_portrait
node_attorneys -->|"renders heading"| node_page_hero
node_attorney_detail -->|"reads profile data"| node_site_data
node_attorney_detail -->|"renders portrait"| node_portrait
node_attorney_detail -->|"renders heading"| node_page_hero
node_insights -->|"reads insights"| node_site_data
node_insights -->|"renders heading"| node_page_hero
node_about -->|"renders heading"| node_page_hero
node_not_found -->|"renders heading"| node_page_hero
node_contact_page -->|"lists practice areas"| node_site_data
node_visitor -->|"submits inquiry"| node_contact_page
node_contact_page -->|"posts inquiry"| node_hrl_service
node_contact_page -->|"posts in development"| node_contact_api
node_contact_api -->|"uses validation and email"| node_email_builder
node_email_builder -->|"sends email"| node_brevo

click node_app "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/App.jsx"
click node_layout "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/Layout.jsx"
click node_header "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/Header.jsx"
click node_footer "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/Footer.jsx"
click node_scroll "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/ScrollToTop.jsx"
click node_home "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Home.jsx"
click node_about "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/About.jsx"
click node_practice "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/PracticeAreas.jsx"
click node_practice_detail "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/PracticeAreaDetail.jsx"
click node_attorneys "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Attorneys.jsx"
click node_attorney_detail "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/AttorneyDetail.jsx"
click node_insights "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Insights.jsx"
click node_contact_page "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Contact.jsx"
click node_not_found "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/NotFound.jsx"
click node_site_data "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/data/siteData.js"
click node_page_hero "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/PageHero.jsx"
click node_portrait "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/AttorneyPortrait.jsx"
click node_contact_api "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/server/index.js"
click node_email_builder "https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/server/contactEmail.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_layout,node_header,node_footer,node_scroll toneBlue
class node_home,node_about,node_practice,node_practice_detail,node_attorneys,node_attorney_detail,node_insights,node_contact_page,node_not_found toneAmber
class node_site_data,node_page_hero,node_portrait,node_hrl_service toneMint
class node_contact_api,node_email_builder toneRose
class node_visitor,node_brevo toneIndigo
```

## Components

### Website shell and routing

- [Route dispatcher](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/App.jsx): `src/App.jsx`
- [Page layout](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/Layout.jsx): `src/components/Layout.jsx`
- [Navigation menu](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/Header.jsx): `src/components/Header.jsx`
- [Site footer](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/Footer.jsx): `src/components/Footer.jsx`
- [Scroll reset](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/ScrollToTop.jsx): `src/components/ScrollToTop.jsx`

### Firm pages

- [Home](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Home.jsx): `src/pages/Home.jsx`
- [About firm](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/About.jsx): `src/pages/About.jsx`
- [Practice areas](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/PracticeAreas.jsx): `src/pages/PracticeAreas.jsx`
- [Practice detail](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/PracticeAreaDetail.jsx): `src/pages/PracticeAreaDetail.jsx`
- [Attorney directory](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Attorneys.jsx): `src/pages/Attorneys.jsx`
- [Attorney profile](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/AttorneyDetail.jsx): `src/pages/AttorneyDetail.jsx`
- [Legal insights](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Insights.jsx): `src/pages/Insights.jsx`
- [Contact form](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/Contact.jsx): `src/pages/Contact.jsx`
- [Not found page](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/pages/NotFound.jsx): `src/pages/NotFound.jsx`

### Shared content and presentation

- [Firm content data](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/data/siteData.js): `src/data/siteData.js`
- [Page heading](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/PageHero.jsx): `src/components/PageHero.jsx`
- [Attorney portrait](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/src/components/AttorneyPortrait.jsx): `src/components/AttorneyPortrait.jsx`

### Inquiry and email

- [Contact API](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/server/index.js): `server/index.js`
- [Inquiry validation and email](https://github.com/harris0519/oliva-and-partners-lawfirm/blob/main/server/contactEmail.js): `server/contactEmail.js`

### Other components

- **Visitor**
- **Production HRL API**
- **Brevo email service**

## Connections

- Visitor → Route dispatcher: opens site (evidence: `README.md`)
- Route dispatcher → Page layout: wraps routes (evidence: `src/App.jsx`)
- Route dispatcher → Home: routes to (evidence: `src/App.jsx`)
- Route dispatcher → About firm: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Practice areas: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Practice detail: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Attorney directory: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Attorney profile: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Legal insights: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Contact form: routes to (evidence: `src/App.jsx`)
- Route dispatcher → Not found page: routes to (evidence: `src/App.jsx`)
- Page layout → Navigation menu: renders (evidence: `src/components/Layout.jsx`)
- Page layout → Site footer: renders (evidence: `src/components/Layout.jsx`)
- Page layout → Scroll reset: renders (evidence: `src/components/Layout.jsx`)
- Navigation menu → Firm content data: reads navigation data (evidence: `src/components/Header.jsx`)
- Home → Firm content data: reads firm content (evidence: `src/pages/Home.jsx`)
- Home → Attorney portrait: renders portraits (evidence: `src/pages/Home.jsx`)
- Practice areas → Firm content data: reads practice areas (evidence: `src/pages/PracticeAreas.jsx`)
- Practice areas → Page heading: renders heading (evidence: `src/pages/PracticeAreas.jsx`)
- Practice detail → Firm content data: reads practice details (evidence: `src/pages/PracticeAreaDetail.jsx`)
- Practice detail → Page heading: renders heading (evidence: `src/pages/PracticeAreaDetail.jsx`)
- Attorney directory → Firm content data: reads attorney data (evidence: `src/pages/Attorneys.jsx`)
- Attorney directory → Attorney portrait: renders portraits (evidence: `src/pages/Attorneys.jsx`)
- Attorney directory → Page heading: renders heading (evidence: `src/pages/Attorneys.jsx`)
- Attorney profile → Firm content data: reads profile data (evidence: `src/pages/AttorneyDetail.jsx`)
- Attorney profile → Attorney portrait: renders portrait (evidence: `src/pages/AttorneyDetail.jsx`)
- Attorney profile → Page heading: renders heading (evidence: `src/pages/AttorneyDetail.jsx`)
- Legal insights → Firm content data: reads insights (evidence: `src/pages/Insights.jsx`)
- Legal insights → Page heading: renders heading (evidence: `src/pages/Insights.jsx`)
- About firm → Page heading: renders heading (evidence: `src/pages/About.jsx`)
- Not found page → Page heading: renders heading (evidence: `src/pages/NotFound.jsx`)
- Contact form → Firm content data: lists practice areas (evidence: `src/pages/Contact.jsx`)
- Visitor → Contact form: submits inquiry (evidence: `src/pages/Contact.jsx`)
- Contact form → Production HRL API: posts inquiry (evidence: `README.md`)
- Contact form → Contact API: posts in development (evidence: `README.md`)
- Contact API → Inquiry validation and email: uses validation and email (evidence: `server/index.js`)
- Inquiry validation and email → Brevo email service: sends email (evidence: `server/contactEmail.js`)
