feat: travel service with 2GIS routing, POI, hotels + finance providers + UI overhaul

- Add travel-svc microservice (Amadeus, TravelPayouts, 2GIS, OpenRouteService)
- Add travel orchestrator with parallel collectors (events, POI, hotels, flights)
- Add 2GIS road routing with transport cost calculation (car/bus/taxi)
- Add TravelMap (2GIS MapGL) and TravelWidgets components
- Add useTravelChat hook for streaming travel agent responses
- Add finance heatmap providers refactor
- Add SearXNG settings, API proxy routes, Docker compose updates
- Update Dockerfiles, config, types, and all UI pages for consistency

Made-with: Cursor
This commit is contained in:
home
2026-03-01 21:58:32 +03:00
parent e6b9cfc60a
commit 08bd41e75c
71 changed files with 12364 additions and 945 deletions

View File

@@ -7,19 +7,16 @@ const config: Config = {
theme: {
extend: {
colors: {
/* Cursor IDE 2026 Color Palette */
base: 'hsl(var(--bg-base))',
elevated: 'hsl(var(--bg-elevated))',
surface: 'hsl(var(--bg-surface))',
overlay: 'hsl(var(--bg-overlay))',
/* Text colors */
primary: 'hsl(var(--text-primary))',
secondary: 'hsl(var(--text-secondary))',
muted: 'hsl(var(--text-muted))',
faint: 'hsl(var(--text-faint))',
/* Accent colors */
accent: {
DEFAULT: 'hsl(var(--accent))',
hover: 'hsl(var(--accent-hover))',
@@ -33,7 +30,6 @@ const config: Config = {
muted: 'hsl(var(--accent-secondary-muted))',
},
/* Semantic colors */
success: {
DEFAULT: 'hsl(var(--success))',
muted: 'hsl(var(--success-muted))',
@@ -47,14 +43,12 @@ const config: Config = {
muted: 'hsl(var(--error-muted))',
},
/* Border colors */
border: {
DEFAULT: 'hsl(var(--border))',
hover: 'hsl(var(--border-hover))',
focus: 'hsl(var(--border-focus))',
},
/* Legacy mappings */
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
card: {
@@ -100,13 +94,13 @@ const config: Config = {
xs: '2px',
},
boxShadow: {
'glow-sm': '0 0 10px hsl(239 84% 67% / 0.1)',
'glow-md': '0 0 20px hsl(239 84% 67% / 0.15)',
'glow-lg': '0 0 40px hsl(239 84% 67% / 0.2)',
'inner-glow': 'inset 0 0 20px hsl(240 6% 12% / 0.5)',
'elevated': '0 4px 20px hsl(240 6% 4% / 0.4), 0 0 1px hsl(240 5% 20% / 0.5)',
'card': '0 2px 8px hsl(240 6% 4% / 0.3)',
'dropdown': '0 8px 32px hsl(240 6% 4% / 0.5), 0 0 1px hsl(240 5% 20% / 0.5)',
'glow-sm': '0 1px 6px hsl(224 64% 48% / 0.06)',
'glow-md': '0 2px 12px hsl(224 64% 48% / 0.1)',
'glow-lg': '0 4px 24px hsl(224 64% 48% / 0.14)',
'inner-glow': 'inset 0 1px 4px hsl(220 14% 50% / 0.06)',
'elevated': '0 1px 3px hsl(220 14% 50% / 0.06), 0 4px 16px hsl(220 14% 50% / 0.04)',
'card': '0 1px 3px hsl(220 14% 50% / 0.05), 0 1px 2px hsl(220 14% 50% / 0.03)',
'dropdown': '0 4px 24px hsl(220 14% 50% / 0.12), 0 1px 4px hsl(220 14% 50% / 0.06)',
},
keyframes: {
'fade-in': {
@@ -138,12 +132,12 @@ const config: Config = {
'100%': { backgroundPosition: '200% 0' },
},
'glow-pulse': {
'0%, 100%': { boxShadow: '0 0 20px hsl(239 84% 67% / 0.15)' },
'50%': { boxShadow: '0 0 30px hsl(239 84% 67% / 0.25)' },
'0%, 100%': { boxShadow: '0 2px 12px hsl(224 64% 48% / 0.08)' },
'50%': { boxShadow: '0 4px 20px hsl(224 64% 48% / 0.14)' },
},
'border-pulse': {
'0%, 100%': { borderColor: 'hsl(239 84% 67% / 0.3)' },
'50%': { borderColor: 'hsl(239 84% 67% / 0.5)' },
'0%, 100%': { borderColor: 'hsl(224 64% 48% / 0.2)' },
'50%': { borderColor: 'hsl(224 64% 48% / 0.35)' },
},
},
animation: {