Files
Gov_Travel_App/PORTAL_README.md
mblanke 4d915aa3ea Build premium data portal with React + Tailwind CSS
Frontend Features:
- Landing page with glassmorphism, animated counters, hero section
- Interactive data tables with search, sort, filter, CSV export
- Premium dark theme (navy + gold accents)
- Framer Motion animations and micro-interactions
- Responsive design with Inter + Playfair Display typography
- DataTable component with pagination and live search

Backend Updates:
- New API endpoints: /api/rates/per-diem, /api/rates/accommodations, /api/stats
- Database service methods for bulk data retrieval
- Production mode serves built React app from /dist/client
- Fallback to legacy HTML for development

Tech Stack:
- React 18 + TypeScript
- Vite 7 build tool
- Tailwind CSS 4 with @tailwindcss/postcss
- Framer Motion for animations
- Lucide React icons
- SQLite3 backend

Build Output:
- 351KB optimized JavaScript bundle
- 29KB CSS bundle
- Fully tree-shaken and minified
2026-01-13 11:05:54 -05:00

185 lines
5.0 KiB
Markdown

# Premium Data Portal - Government Travel Rates
A modern, luxury data portal showcasing government travel rates with premium UX design.
## ✨ Features
### 🎨 Premium Design
- **Glassmorphism Effects**: Translucent panels with backdrop blur
- **Gradient Accents**: Deep navy + gold gradient theme
- **Smooth Animations**: Framer Motion micro-interactions
- **Typography**: Inter + Playfair Display pairing
- **Dark Mode**: Premium dark theme with accent lighting
### 📊 Data Portal
- **Interactive Tables**: Search, sort, filter, and export per-diem and accommodation rates
- **Animated Counters**: Real-time statistics with smooth counting animations
- **CSV Export**: One-click data export for analysis
- **Pagination**: Smooth navigation through large datasets
- **Responsive Design**: Works beautifully on all devices
### 🛫 Travel Integration
- **OpenFlights Data**: Free, open-source flight data (6,072+ airports)
- **Rate Coverage**: 233 countries, 9,114 per-diem entries, 1,356 accommodation rates
- **Real-time Search**: Fast database queries with caching
## 🚀 Quick Start
### Development
```bash
# Install dependencies
npm install
# Start backend server
npm start
# Start frontend dev server (in another terminal)
npm run dev:client
```
Backend runs on `http://localhost:5001`
Frontend runs on `http://localhost:3000`
### Production Build
```bash
# Build React frontend
npm run build:client
# Start production server (serves built React app)
NODE_ENV=production npm start
```
## 🏗️ Architecture
### Frontend (`/client`)
- **Framework**: React 18 with TypeScript
- **Build Tool**: Vite 7
- **Styling**: Tailwind CSS 4 with custom theme
- **Animations**: Framer Motion
- **Icons**: Lucide React
- **UI Components**: Custom-built with Radix UI primitives
### Backend
- **Server**: Node.js + Express
- **Database**: SQLite3 with Better-SQLite3
- **APIs**:
- `/api/rates/per-diem` - All per-diem rates
- `/api/rates/accommodations` - Canadian accommodation rates
- `/api/stats` - Portal statistics
- `/api/flights/search` - OpenFlights integration
### Key Files
```
├── client/
│ ├── src/
│ │ ├── App.tsx # Main application
│ │ ├── pages/
│ │ │ ├── LandingPage.tsx # Hero + animated counters
│ │ │ └── DashboardPage.tsx # Data tables portal
│ │ ├── components/
│ │ │ └── DataTable.tsx # Interactive table component
│ │ └── lib/
│ │ └── utils.ts # Utilities (format, export)
│ └── index.html # Entry point
├── server.js # Express backend
├── openFlightsService.js # Free flight data integration
└── services/
└── databaseService.js # Database layer
```
## 🎨 Design System
### Colors
- **Background**: Deep navy (#0B1120)
- **Accent**: Gold gradient (#FACC15#EAB308)
- **Glass**: rgba(255, 255, 255, 0.1) with 10px blur
- **Text**: White (#FAFAFA) with gray-300 secondary
### Typography
- **Headings**: Playfair Display (Display font)
- **Body**: Inter (Sans-serif)
- **Weights**: 300-900 range
### Spacing
- **Container**: max-width 1200px, px-4 mobile
- **Sections**: py-20 desktop, py-12 mobile
- **Cards**: p-8 with rounded-2xl
## 📦 npm Scripts
| Script | Description |
|--------|-------------|
| `npm start` | Start production server |
| `npm run dev` | Start backend with nodemon |
| `npm run dev:client` | Start Vite dev server |
| `npm run build:client` | Build React app for production |
| `npm run preview` | Preview production build |
| `npm test` | Run Jest tests |
## 🔧 Configuration
### Environment Variables (`.env`)
```env
PORT=5001
NODE_ENV=production
AMADEUS_API_KEY=your_key_here # Optional
AMADEUS_API_SECRET=your_secret # Optional
```
### Vite Configuration
- Root: `./client`
- Output: `../dist/client`
- Proxy: `/api``http://localhost:5001`
## 📊 Data Sources
1. **NJC Travel Directive** - Canadian government per-diem rates
2. **OpenFlights** - Free, open-source airport/airline/route data
3. **Scraped Data** - Government accommodation rates (scraped via Python)
## 🚀 Deployment
### Docker
```bash
# Build image with React app
docker build -t govt-travel-app:latest .
# Run container
docker run -d -p 5001:5001 govt-travel-app:latest
```
### Manual
```bash
# Build frontend
npm run build:client
# Set production environment
export NODE_ENV=production
# Start server
npm start
```
The server automatically serves the built React app when `NODE_ENV=production` and `/dist/client` exists.
## 🎯 Future Enhancements
- [ ] Interactive map view with country selection
- [ ] Data visualizations with Recharts (rate comparisons)
- [ ] Advanced filters (date ranges, rate thresholds)
- [ ] User authentication and saved searches
- [ ] Real-time Amadeus flight pricing integration
- [ ] Mobile app (React Native)
## 📝 License
ISC
## 🤝 Contributing
Built with premium attention to detail. Contributions welcome!
---
**Made with ✨ by the Government Travel Team**