A dark-themed financial analysis dashboard built with React + Vite + TypeScript + Tailwind CSS v4. Features real-time market ticker, clean search and filter capabilities, and company deep-dive analysis pages.
- React 19 + TypeScript
- Vite (esbuild, fast HMR)
- Tailwind CSS v4 (integrated via
@tailwindcss/viteplugin) - React Router v7
- react-markdown + rehype plugins for institutional analysis rendering
- Python backend (port 8081) for notifications + API
src/
βββ components/
β βββ Common/ β SubscribeCard, LoadingSpinner
β βββ Dashboard/ β AnalysisGrid
β βββ Home/ β SearchBar, StatsBar, AnalysisCard
β βββ Layout/ β Header, Footer, Layout
βββ hooks/ β useAnalyses, useSearch, useNotification
βββ pages/ β HomePage, AnalysisPage, CompanyPage, AboutPage, ContactPage, etc.
βββ services/ β analysisService
βββ types/ β TypeScript interfaces
Recently refactored to resolve overlapping text, layout constraints, and alignment issues:
- Removed Tags Section: Cleaned up clutter by removing the legacy
TagPillscomponent to focus purely on search and category sorting. - Revamped Search Bar: Redesigned to guarantee search icon and placeholder text never overlap. The icon resides in its own isolated layout pill.
- Card Spacing & Layout: Fixed grid-gap spacing (
style={{ gap: '2rem' }}) and resolved stacking context issue (relative hover:z-10) so hovered cards float above neighboring cards smoothly without bleeding underneath. - Card Shadow Clipping: Removed
overflow: clipfrom.premium-cardinindex.cssto allow premium card shadows to render properly while maintaining sheen animation constraints. - Static Pages Overhaul: Revamped About, Contact, Risk Disclaimer, Privacy Policy, and Footer pages with premium card grids, custom SVG-based layout components, email CTA interactions, and structured content.
- Tailwind CSS v4 Stance: Critical layouts use direct inline styles to guarantee rendering where dynamic runtime classes may not have been scanned during compilation.
npm install
npm run dev # Dev server on port 5173
npm run build # Production build to dist/- Nginx serves from
/var/www/stock-analyses-react/dist/ - SPA fallback:
try_files $uri $uri/ /index.html - HTTPS via Let's Encrypt
- Deploy via
./deploy.sh
| Route | Page |
|---|---|
/ |
Home β Dashboard with ticker, featured hero, search/sort tools, and analysis grid |
/analysis/:slug |
Full analysis markdown render |
/company/:ticker |
All deep-dives for a stock |
/about |
About page (overview, creator info) |
/contact |
Contact page (mail direct link, FAQ accordion) |
/disclaimer |
Disclaimer (risk warning, positions disclosure) |
/privacy |
Privacy policy (notifications, telemetry control) |
- Analyses: Markdown files in
public/analyses/. Each file's frontmatter is the single source of truth for its metadata. At build timescripts/generate-analyses-data.jsscans them and generatessrc/data/analyses.generated.ts(imported by the app) andpublic/analyses.jsonβ plus the sitemap and per-analysis OG tags. Nothing is hand-maintained in sync. - Market data:
src/services/marketService.ts(currently simulated placeholder values). - FII/DII tracking: Inline data from analysis markdown
See PUBLISHING.md for the full contract. TL;DR:
node scripts/new-analysis.js --title "..." --ticker "TICKER" --tags "a,b" \
--summary "..." --body-file draft.md
npm run build && ./deploy.shNever hand-edit src/data/analyses.generated.ts or public/analyses.json β they are regenerated on every build.