- 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
160 lines
5.3 KiB
TypeScript
160 lines
5.3 KiB
TypeScript
import type { Config } from 'tailwindcss';
|
|
|
|
const config: Config = {
|
|
content: [
|
|
'./src/**/*.{js,ts,jsx,tsx,mdx}',
|
|
],
|
|
theme: {
|
|
extend: {
|
|
colors: {
|
|
base: 'hsl(var(--bg-base))',
|
|
elevated: 'hsl(var(--bg-elevated))',
|
|
surface: 'hsl(var(--bg-surface))',
|
|
overlay: 'hsl(var(--bg-overlay))',
|
|
|
|
primary: 'hsl(var(--text-primary))',
|
|
secondary: 'hsl(var(--text-secondary))',
|
|
muted: 'hsl(var(--text-muted))',
|
|
faint: 'hsl(var(--text-faint))',
|
|
|
|
accent: {
|
|
DEFAULT: 'hsl(var(--accent))',
|
|
hover: 'hsl(var(--accent-hover))',
|
|
muted: 'hsl(var(--accent-muted))',
|
|
subtle: 'hsl(var(--accent-subtle))',
|
|
foreground: 'hsl(0 0% 100%)',
|
|
},
|
|
|
|
'accent-secondary': {
|
|
DEFAULT: 'hsl(var(--accent-secondary))',
|
|
muted: 'hsl(var(--accent-secondary-muted))',
|
|
},
|
|
|
|
success: {
|
|
DEFAULT: 'hsl(var(--success))',
|
|
muted: 'hsl(var(--success-muted))',
|
|
},
|
|
warning: {
|
|
DEFAULT: 'hsl(var(--warning))',
|
|
muted: 'hsl(var(--warning-muted))',
|
|
},
|
|
error: {
|
|
DEFAULT: 'hsl(var(--error))',
|
|
muted: 'hsl(var(--error-muted))',
|
|
},
|
|
|
|
border: {
|
|
DEFAULT: 'hsl(var(--border))',
|
|
hover: 'hsl(var(--border-hover))',
|
|
focus: 'hsl(var(--border-focus))',
|
|
},
|
|
|
|
background: 'hsl(var(--background))',
|
|
foreground: 'hsl(var(--foreground))',
|
|
card: {
|
|
DEFAULT: 'hsl(var(--card))',
|
|
foreground: 'hsl(var(--card-foreground))',
|
|
},
|
|
popover: {
|
|
DEFAULT: 'hsl(var(--popover))',
|
|
foreground: 'hsl(var(--popover-foreground))',
|
|
},
|
|
destructive: {
|
|
DEFAULT: 'hsl(var(--destructive))',
|
|
foreground: 'hsl(var(--destructive-foreground))',
|
|
},
|
|
input: 'hsl(var(--input))',
|
|
ring: 'hsl(var(--ring))',
|
|
},
|
|
borderRadius: {
|
|
'2xl': '1rem',
|
|
'3xl': '1.5rem',
|
|
lg: 'var(--radius)',
|
|
md: 'calc(var(--radius) - 2px)',
|
|
sm: 'calc(var(--radius) - 4px)',
|
|
},
|
|
fontFamily: {
|
|
sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],
|
|
mono: ['JetBrains Mono', 'Fira Code', 'SF Mono', 'Consolas', 'monospace'],
|
|
},
|
|
fontSize: {
|
|
'2xs': ['0.625rem', { lineHeight: '0.875rem' }],
|
|
'xs': ['0.75rem', { lineHeight: '1rem' }],
|
|
'sm': ['0.875rem', { lineHeight: '1.25rem' }],
|
|
'base': ['0.9375rem', { lineHeight: '1.5rem' }],
|
|
'lg': ['1.0625rem', { lineHeight: '1.625rem' }],
|
|
},
|
|
spacing: {
|
|
'18': '4.5rem',
|
|
'22': '5.5rem',
|
|
'26': '6.5rem',
|
|
'30': '7.5rem',
|
|
},
|
|
backdropBlur: {
|
|
xs: '2px',
|
|
},
|
|
boxShadow: {
|
|
'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': {
|
|
'0%': { opacity: '0', transform: 'translateY(4px)' },
|
|
'100%': { opacity: '1', transform: 'translateY(0)' },
|
|
},
|
|
'fade-in-up': {
|
|
'0%': { opacity: '0', transform: 'translateY(12px)' },
|
|
'100%': { opacity: '1', transform: 'translateY(0)' },
|
|
},
|
|
'slide-in-right': {
|
|
'0%': { opacity: '0', transform: 'translateX(-12px)' },
|
|
'100%': { opacity: '1', transform: 'translateX(0)' },
|
|
},
|
|
'slide-in-left': {
|
|
'0%': { opacity: '0', transform: 'translateX(12px)' },
|
|
'100%': { opacity: '1', transform: 'translateX(0)' },
|
|
},
|
|
'scale-in': {
|
|
'0%': { opacity: '0', transform: 'scale(0.95)' },
|
|
'100%': { opacity: '1', transform: 'scale(1)' },
|
|
},
|
|
'pulse-soft': {
|
|
'0%, 100%': { opacity: '1' },
|
|
'50%': { opacity: '0.7' },
|
|
},
|
|
shimmer: {
|
|
'0%': { backgroundPosition: '-200% 0' },
|
|
'100%': { backgroundPosition: '200% 0' },
|
|
},
|
|
'glow-pulse': {
|
|
'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(224 64% 48% / 0.2)' },
|
|
'50%': { borderColor: 'hsl(224 64% 48% / 0.35)' },
|
|
},
|
|
},
|
|
animation: {
|
|
'fade-in': 'fade-in 0.2s ease-out forwards',
|
|
'fade-in-up': 'fade-in-up 0.3s ease-out forwards',
|
|
'slide-in-right': 'slide-in-right 0.25s ease-out forwards',
|
|
'slide-in-left': 'slide-in-left 0.25s ease-out forwards',
|
|
'scale-in': 'scale-in 0.2s ease-out forwards',
|
|
'pulse-soft': 'pulse-soft 2s ease-in-out infinite',
|
|
shimmer: 'shimmer 1.5s linear infinite',
|
|
'glow-pulse': 'glow-pulse 2s ease-in-out infinite',
|
|
'border-pulse': 'border-pulse 2s ease-in-out infinite',
|
|
},
|
|
},
|
|
},
|
|
plugins: [],
|
|
};
|
|
|
|
export default config;
|