mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
13956804c2
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91 - Trip-to-Journey sync engine with skeleton entries and photo sync - Full CRUD API for journeys, entries, photos with Immich/Synology integration - Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons) - Journey frontpage with hero card, stats and trip suggestions - Public share links with token-based access and photo proxy - PDF photo book export (Polarsteps-inspired) - Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design - BottomNav profile sheet with settings/admin/logout - DayPlan mobile inline place picker - TripFormModal members management - Vacay calendar trip date indicator dots - Fix contributor photo access (403) for journey Immich/Synology photos - Trip deletion cleanup for journey skeleton entries - i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
66 lines
2.8 KiB
TypeScript
66 lines
2.8 KiB
TypeScript
import { Sparkles, Sun, Minus, Moon, CloudRain, CloudSun, Cloud, CloudLightning, Snowflake, Thermometer, ThermometerSnowflake } from 'lucide-react'
|
|
import type { LucideIcon } from 'lucide-react'
|
|
|
|
export interface MoodDef {
|
|
id: string
|
|
label: string
|
|
icon: LucideIcon
|
|
color: string
|
|
cssVar: string
|
|
}
|
|
|
|
export const MOODS: MoodDef[] = [
|
|
{ id: 'amazing', label: 'Amazing', icon: Sparkles, color: '#E8654A', cssVar: 'var(--mood-amazing)' },
|
|
{ id: 'good', label: 'Good', icon: Sun, color: '#EF9F27', cssVar: 'var(--mood-good)' },
|
|
{ id: 'neutral', label: 'Neutral', icon: Minus, color: '#94928C', cssVar: 'var(--mood-neutral)' },
|
|
{ id: 'tired', label: 'Tired', icon: Moon, color: '#6B9BD2', cssVar: 'var(--mood-tired)' },
|
|
{ id: 'rough', label: 'Rough', icon: CloudRain,color: '#9B8EC4', cssVar: 'var(--mood-rough)' },
|
|
]
|
|
|
|
export const MOOD_DEFAULT_COLOR = '#D4D4D4'
|
|
|
|
export function getMood(id: string | null | undefined): MoodDef | undefined {
|
|
if (!id) return undefined
|
|
return MOODS.find(m => m.id === id)
|
|
}
|
|
|
|
export function moodColor(id: string | null | undefined): string {
|
|
return getMood(id)?.cssVar || 'var(--journal-faint)'
|
|
}
|
|
|
|
export interface WeatherDef {
|
|
id: string
|
|
label: string
|
|
icon: LucideIcon
|
|
}
|
|
|
|
export const WEATHERS: WeatherDef[] = [
|
|
{ id: 'sunny', label: 'Sunny', icon: Sun },
|
|
{ id: 'partly', label: 'Partly cloudy', icon: CloudSun },
|
|
{ id: 'cloudy', label: 'Cloudy', icon: Cloud },
|
|
{ id: 'rainy', label: 'Rainy', icon: CloudRain },
|
|
{ id: 'stormy', label: 'Stormy', icon: CloudLightning },
|
|
{ id: 'snowy', label: 'Snowy', icon: Snowflake },
|
|
{ id: 'hot', label: 'Hot', icon: Thermometer },
|
|
{ id: 'cold', label: 'Cold', icon: ThermometerSnowflake },
|
|
]
|
|
|
|
export function getWeather(id: string | null | undefined): WeatherDef | undefined {
|
|
if (!id) return undefined
|
|
return WEATHERS.find(w => w.id === id)
|
|
}
|
|
|
|
export const TAG_STYLES: Record<string, { bg: string; fg: string; darkBg: string; darkFg: string }> = {
|
|
'hidden gem': { bg: '#dcfce7', fg: '#166534', darkBg: 'rgba(22,101,52,0.2)', darkFg: '#86efac' },
|
|
'must revisit': { bg: '#dbeafe', fg: '#1e40af', darkBg: 'rgba(30,64,175,0.2)', darkFg: '#93c5fd' },
|
|
'best meal': { bg: '#fef3c7', fg: '#92400e', darkBg: 'rgba(146,64,14,0.2)', darkFg: '#fcd34d' },
|
|
'tourist trap': { bg: '#fee2e2', fg: '#991b1b', darkBg: 'rgba(153,27,27,0.2)', darkFg: '#fca5a5' },
|
|
'disaster': { bg: '#fce4ec', fg: '#880e4f', darkBg: 'rgba(136,14,79,0.2)', darkFg: '#f48fb1' },
|
|
}
|
|
|
|
export function tagColors(tag: string, dark: boolean) {
|
|
const known = TAG_STYLES[tag.toLowerCase()]
|
|
if (known) return { bg: dark ? known.darkBg : known.bg, fg: dark ? known.darkFg : known.fg }
|
|
return { bg: dark ? 'rgba(255,255,255,0.07)' : 'rgba(0,0,0,0.05)', fg: dark ? '#a1a1aa' : '#374151' }
|
|
}
|