From 62056a6c433e6f2c543ded1164d3153880f7ebca Mon Sep 17 00:00:00 2001 From: ARUN N G Date: Mon, 16 Feb 2026 11:56:25 +0530 Subject: [PATCH 1/2] streak added --- app/globals.css | 18 ++ app/page.tsx | 45 ++-- components/StreakCard.tsx | 419 ++++++++++++++++++++++++++++++++++++ components/landing/Hero.tsx | 19 +- lib/nudgeService.ts | 143 ++++++++++++ lib/streakService.ts | 195 +++++++++++++++++ public/sw.js | 2 +- 7 files changed, 811 insertions(+), 30 deletions(-) create mode 100644 components/StreakCard.tsx create mode 100644 lib/nudgeService.ts create mode 100644 lib/streakService.ts diff --git a/app/globals.css b/app/globals.css index 87f1b8c..43eabaf 100644 --- a/app/globals.css +++ b/app/globals.css @@ -164,4 +164,22 @@ [data-framer-motion], [style*="transform"] { transition-property: background-color, border-color, color, box-shadow; +} + +/* Custom scrollbar for streak detail timeline */ +.custom-scrollbar::-webkit-scrollbar { + width: 4px; +} + +.custom-scrollbar::-webkit-scrollbar-track { + background: transparent; +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + border-radius: 4px; +} + +.custom-scrollbar::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.2); } \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index a047efa..6231fc0 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,14 +3,16 @@ import { useState, useEffect } from 'react'; import Link from 'next/link'; import { motion } from 'framer-motion'; -import { Heart, BarChart3, Music, Brain, Sparkles, ArrowRight } from 'lucide-react'; +import { Heart, BarChart3, Music, Brain, Sparkles, ArrowRight, Plus } from 'lucide-react'; import { MoodCard } from '@/components/MoodCard'; import { SkeletonMoodCard } from '@/components/SkeletonMoodCard'; import { FloatingBackground } from '@/components/FloatingBackground'; import { QuoteCard } from '@/components/QuoteCard'; -import { Heart, BarChart3, Music } from 'lucide-react'; import SimpleLangFlowChatbot from '@/components/SimpleLangFlowChatbot'; import { ThemeToggle } from '@/components/ThemeToggle'; +import { Hero } from '@/components/landing'; +import { ErrorState } from '@/components/ErrorState'; +import { StreakNavIcon } from '@/components/StreakCard'; const moods = [ { id: 'happy', name: 'Happy', emoji: '😊', color: '#FFD93D', glow: '#FFF176' }, @@ -54,7 +56,6 @@ const moods = [ ]; export default function Home() { - const { startTransition } = usePageTransition(); const [selectedMoods, setSelectedMoods] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(false); @@ -86,7 +87,7 @@ export default function Home() { }, []); return ( - -
+

@@ -139,7 +140,7 @@ export default function Home() {

-
@@ -175,8 +182,8 @@ export default function Home() { {/* Main Content */}
-
- + - +

- Discover the depth of your emotional landscape with personalized insights, + Discover the depth of your emotional landscape with personalized insights, therapeutic music, and guided reflection journeys tailored to your feelings.

@@ -217,7 +224,7 @@ export default function Home() { - +

How are you feeling today? -

+

Choose your emotional state and discover personalized insights, prompts, and music to guide your reflection journey.

@@ -300,7 +307,7 @@ export default function Home() {
{/* Features Section */} -
- +

{feature.title}

- +

{feature.description}

@@ -377,12 +384,12 @@ export default function Home() {

Ready to explore your inner world?

- +

- Join thousands who have discovered deeper self-awareness through InnerHue's + Join thousands who have discovered deeper self-awareness through InnerHue's guided emotional reflection experience.

- + - + {/* Footer */} (null); + const [isDetailOpen, setIsDetailOpen] = useState(false); + const moodHistory = useMoodStore((s) => s.moodHistory); + + // On mount: recalculate streak from mood history & auto-record today's visit + useEffect(() => { + if (moodHistory.length > 0) { + recalculateStreakFromHistory(moodHistory); + } + + // Auto-record daily streak on page load (once per calendar day) + const updated = recordDailyStreak(); + setStreakData(updated); + }, [moodHistory]); + + if (!streakData) return null; + + return ( + <> + {/* Nav Icon Button */} + setIsDetailOpen(true)} + className="relative p-2 rounded-full bg-white/5 backdrop-blur-xl hover:bg-white/10 transition-all duration-300 border border-white/10 flex items-center gap-1.5" + title="Reflection Streak" + aria-label={`Reflection Streak: ${streakData.currentStreak} days`} + > + 0 + ? { scale: [1, 1.15, 1] } + : {} + } + transition={{ duration: 2, repeat: Infinity, ease: 'easeInOut' }} + > + 0 ? 'text-orange-400' : 'text-white' + }`} + /> + + + {/* Streak count badge */} + {streakData.currentStreak > 0 && ( + + {streakData.currentStreak} + + )} + + + {/* Detail Modal */} + + {isDetailOpen && ( + setIsDetailOpen(false)} + /> + )} + + + ); +} + +/* ─── Expanded Streak Detail Modal ─── */ +function StreakDetailModal({ + streakData, + moodHistory, + onClose, +}: { + streakData: StreakData; + moodHistory: MoodEntry[]; + onClose: () => void; +}) { + const [nudges, setNudges] = useState([]); + const [showNudge, setShowNudge] = useState(true); + + useEffect(() => { + const logged = checkLoggedToday(); + const nudgeList = generateNudges(streakData, logged); + setNudges(nudgeList); + }, [streakData]); + + const handleDismissNudge = () => { + dismissNudge(); + setShowNudge(false); + }; + + const topNudge = nudges.length > 0 && showNudge ? nudges[0] : null; + + // Mood data enrichment: map mood ID to emoji/label + const moodMap: Record = useMemo(() => { + const map: Record = {}; + const defaultMoods: Record = { + happy: { emoji: '😊', name: 'Happy', color: '#FFD93D' }, + sad: { emoji: '😒', name: 'Sad', color: '#42A5F5' }, + anxious: { emoji: '😰', name: 'Anxious', color: '#FF7043' }, + excited: { emoji: '🀩', name: 'Excited', color: '#AB47BC' }, + calm: { emoji: '😌', name: 'Calm', color: '#66BB6A' }, + angry: { emoji: '😑', name: 'Angry', color: '#EF5350' }, + confused: { emoji: 'πŸ˜•', name: 'Confused', color: '#FFA726' }, + grateful: { emoji: 'πŸ™', name: 'Grateful', color: '#26A69A' }, + lonely: { emoji: 'πŸ˜”', name: 'Lonely', color: '#7E57C2' }, + hopeful: { emoji: '🌟', name: 'Hopeful', color: '#FFCA28' }, + stressed: { emoji: '😀', name: 'Stressed', color: '#FF5722' }, + peaceful: { emoji: 'πŸ•ŠοΈ', name: 'Peaceful', color: '#4FC3F7' }, + energized: { emoji: '⚑', name: 'Energized', color: '#FFEB3B' }, + overwhelmed: { emoji: '🀯', name: 'Overwhelmed', color: '#F06292' }, + content: { emoji: '😊', name: 'Content', color: '#AED581' }, + frustrated: { emoji: '😠', name: 'Frustrated', color: '#FF8A65' }, + inspired: { emoji: 'πŸ’‘', name: 'Inspired', color: '#FFD740' }, + melancholy: { emoji: '🌧️', name: 'Melancholy', color: '#90A4AE' }, + motivated: { emoji: 'πŸ”₯', name: 'Motivated', color: '#FF6D00' }, + vulnerable: { emoji: 'πŸ₯Ί', name: 'Vulnerable', color: '#F8BBD9' }, + empowered: { emoji: 'πŸ’ͺ', name: 'Empowered', color: '#6A1B9A' }, + nostalgic: { emoji: 'πŸ“Έ', name: 'Nostalgic', color: '#D4A574' }, + proud: { emoji: '😀', name: 'Proud', color: '#FF9800' }, + curious: { emoji: 'πŸ€”', name: 'Curious', color: '#9C27B0' }, + bored: { emoji: 'πŸ˜‘', name: 'Bored', color: '#607D8B' }, + surprised: { emoji: '😲', name: 'Surprised', color: '#FF5722' }, + creative: { emoji: '🎨', name: 'Creative', color: '#FF7043' }, + determined: { emoji: '😀', name: 'Determined', color: '#3F51B5' }, + playful: { emoji: '😜', name: 'Playful', color: '#FF4081' }, + dreamy: { emoji: '😴', name: 'Dreamy', color: '#9FA8DA' }, + silly: { emoji: 'πŸ€ͺ', name: 'Silly', color: '#FFC107' }, + }; + Object.entries(defaultMoods).forEach(([id, data]) => { + map[id] = { emoji: data.emoji, label: data.name, color: data.color }; + }); + return map; + }, []); + + // Recent mood entries (last 14 days) for timeline, sorted newest first + const recentEntries = useMemo(() => { + const twoWeeksAgo = new Date(); + twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14); + return [...moodHistory] + .filter(e => new Date(e.timestamp) >= twoWeeksAgo) + .sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); + }, [moodHistory]); + + // Group entries by date + const groupedEntries = useMemo(() => { + const groups: Record = {}; + recentEntries.forEach(entry => { + const d = new Date(entry.timestamp); + const key = d.toLocaleDateString('en-US', { + weekday: 'short', + month: 'short', + day: 'numeric', + }); + if (!groups[key]) groups[key] = []; + groups[key].push(entry); + }); + return groups; + }, [recentEntries]); + + const formatTime = (ts: string) => { + return new Date(ts).toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + }); + }; + + return ( + + {/* Backdrop */} +
+ + {/* Content */} + e.stopPropagation()} + > + {/* Header gradient */} +
+ + +
+ + + +

Reflection Streak

+
+ + {/* Streak Stats Grid */} +
+
+
+ +
+

{streakData.currentStreak}

+

Current

+
+
+
+ +
+

{streakData.longestStreak}

+

Longest

+
+
+
+ +
+

+ {streakData.lastLoggedDate + ? new Date(streakData.lastLoggedDate + 'T00:00:00').toLocaleDateString('en-US', { month: 'short', day: 'numeric' }) + : 'β€”'} +

+

Last Log

+
+
+ + {/* Streak continuity dots (last 7 days) */} +
+ {Array.from({ length: 7 }).map((_, i) => { + const date = new Date(); + date.setDate(date.getDate() - (6 - i)); + const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; + const isLogged = streakData.streakDates.includes(dateStr); + const isToday = i === 6; + const dayLabel = date.toLocaleDateString('en-US', { weekday: 'short' }).charAt(0); + + return ( +
+ + {dayLabel} +
+ ); + })} +
+ + {/* Streak info text */} +
+ +

+ A streak is maintained by logging at least one mood per calendar day. +

+
+ + {/* Smart Nudge */} + + {topNudge && ( + +
+ +
+ {topNudge.emoji} +

{topNudge.message}

+
+
+
+ )} +
+
+ + {/* Mood Timeline */} +
+
+ +

Mood Timeline

+
+ + {Object.keys(groupedEntries).length === 0 ? ( + /* Empty state */ + +
🌿
+

No reflections yet

+

Select a mood above to start your first entry

+
+ ) : ( + /* Vertical Timeline */ +
+ {/* Vertical line */} +
+ + {Object.entries(groupedEntries).map(([dateLabel, entries], groupIdx) => ( +
+ {/* Date label */} + +
+ +
+ {dateLabel} +
+ + {/* Entries within the day */} + {entries.map((entry, entryIdx) => { + const moodKey = entry.emotion || entry.mood; + const moodInfo = moodMap[moodKey] || { emoji: 'πŸ«₯', label: moodKey, color: '#888' }; + + return ( + +
+ {/* Timeline connector dot */} +
+ +
+ {moodInfo.emoji} +
+
+ + {moodInfo.label} + + + {formatTime(entry.timestamp)} + +
+ {entry.date && ( +

+ {entry.date} +

+ )} +
+
+
+ + ); + })} +
+ ))} +
+ )} +
+ + + ); +} diff --git a/components/landing/Hero.tsx b/components/landing/Hero.tsx index 4cc4540..6dc35c0 100644 --- a/components/landing/Hero.tsx +++ b/components/landing/Hero.tsx @@ -3,10 +3,10 @@ import { motion } from 'framer-motion'; import { ArrowRight, Sparkles } from 'lucide-react'; import { LandingOrb } from './LandingOrb'; -import { usePageTransition } from '@/components/TransitionProvider'; +import { useRouter } from 'next/navigation'; export function Hero() { - const { startTransition, isTransitioning } = usePageTransition(); + const router = useRouter(); // Animation variants for staggered fade-in const containerVariants = { @@ -93,9 +93,8 @@ export function Hero() { {/* Primary CTA Button - Glassmorphic Style with Custom Transition */} startTransition('/explore')} - disabled={isTransitioning} - whileHover={{ + onClick={() => router.push('/explore')} + whileHover={{ scale: 1.08, boxShadow: '0 0 60px rgba(139, 92, 246, 0.6)', }} @@ -112,20 +111,20 @@ export function Hero() { disabled:opacity-50 disabled:cursor-not-allowed" > {/* Animated gradient background on hover */} - - + {/* Shimmer effect */} - + Start Reflecting 0 && hour >= 14) { + nudges.push({ + id: 'streak-warning', + type: 'encouragement', + message: `Your ${streakData.currentStreak}-day streak is still going! Take a moment to reflect before the day ends.`, + emoji: '⏰', + priority: 80, + }); + } + + // 3. Gentle reminder if no mood logged today (only show from 10am onwards) + if (!hasLoggedToday && hour >= 10) { + const reminderMessages = [ + "How are you feeling right now? A quick check-in can make all the difference.", + "Your emotions matter. Take a moment to acknowledge how you're feeling today.", + "A small reflection today keeps emotional awareness growing.", + "Pause, breathe, and check in with yourself. How's your inner world?", + ]; + const msgIndex = new Date().getDate() % reminderMessages.length; + + nudges.push({ + id: 'daily-reminder', + type: 'reminder', + message: reminderMessages[msgIndex], + emoji: 'πŸ’­', + priority: 40, + }); + } + + // 4. Positive reinforcement after logging (show celebration briefly) + if (hasLoggedToday && streakData.currentStreak > 1 && !MILESTONES.includes(streakData.currentStreak)) { + nudges.push({ + id: 'positive-reinforcement', + type: 'celebration', + message: getStreakEncouragement(streakData.currentStreak), + emoji: 'πŸ”₯', + priority: 60, + }); + } + + // Sort by priority descending, return only the top nudge to avoid spam + return nudges.sort((a, b) => b.priority - a.priority); +} + +function getMilestoneMessage(streak: number): string { + const messages: Record = { + 3: "3 days of reflection! You're building a beautiful habit. 🌱", + 7: "One full week! Your emotional awareness is growing stronger each day. 🌟", + 14: "Two weeks of consistent reflection β€” that's real commitment to yourself! πŸ’Ž", + 21: "21 days β€” they say that's what it takes to build a habit. Incredible! πŸ†", + 30: "A full month of emotional check-ins! You're truly dedicated to self-growth. πŸŽ‰", + 50: "50 days! Half a century of daily reflections. That's extraordinary! 🌈", + 75: "75 days! You're a reflection champion. Your emotional intelligence is soaring! ⭐", + 100: "100 DAYS! An incredible milestone. You've transformed your emotional awareness! 🎊", + }; + return messages[streak] || `Amazing! ${streak} days of reflection!`; +} + +function getMilestoneEmoji(streak: number): string { + if (streak >= 100) return '🎊'; + if (streak >= 50) return '🌈'; + if (streak >= 21) return 'πŸ†'; + if (streak >= 7) return '🌟'; + return '🌱'; +} + +function getStreakEncouragement(streak: number): string { + if (streak >= 30) return "You're on fire! Consistency is your superpower."; + if (streak >= 14) return "Two weeks strong! Your dedication is inspiring."; + if (streak >= 7) return "A full week of reflection! Keep the momentum going."; + if (streak >= 3) return "You're building momentum! Every day counts."; + return "Great job checking in today! Keep it going."; +} diff --git a/lib/streakService.ts b/lib/streakService.ts new file mode 100644 index 0000000..186968f --- /dev/null +++ b/lib/streakService.ts @@ -0,0 +1,195 @@ +/** + * Streak Service β€” Mood Reflection Streak Calculator + * + * A streak = at least one mood logged per calendar day. + * Streak resets if a full calendar day is missed. + * Only one streak increment per calendar day (prevents duplicates on repeated visits). + */ + +export interface StreakData { + currentStreak: number; + longestStreak: number; + lastLoggedDate: string | null; // ISO date string (YYYY-MM-DD) + streakDates: string[]; // Array of ISO date strings where moods were logged +} + +const STREAK_STORAGE_KEY = 'innerhue-streak-data'; + +// Timezone-safe: get local calendar date as YYYY-MM-DD +function getLocalDateString(date: Date = new Date()): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +// Calculate difference in calendar days between two YYYY-MM-DD strings +function daysBetween(dateA: string, dateB: string): number { + const a = new Date(dateA + 'T00:00:00'); + const b = new Date(dateB + 'T00:00:00'); + const diffMs = Math.abs(a.getTime() - b.getTime()); + return Math.round(diffMs / (1000 * 60 * 60 * 24)); +} + +function getDefaultStreakData(): StreakData { + return { + currentStreak: 0, + longestStreak: 0, + lastLoggedDate: null, + streakDates: [], + }; +} + +/** Load persisted streak data from localStorage */ +export function loadStreakData(): StreakData { + if (typeof window === 'undefined') return getDefaultStreakData(); + + try { + const raw = localStorage.getItem(STREAK_STORAGE_KEY); + if (!raw) return getDefaultStreakData(); + const parsed = JSON.parse(raw) as StreakData; + return { + currentStreak: parsed.currentStreak ?? 0, + longestStreak: parsed.longestStreak ?? 0, + lastLoggedDate: parsed.lastLoggedDate ?? null, + streakDates: parsed.streakDates ?? [], + }; + } catch { + return getDefaultStreakData(); + } +} + +/** Save streak data to localStorage */ +export function saveStreakData(data: StreakData): void { + if (typeof window === 'undefined') return; + localStorage.setItem(STREAK_STORAGE_KEY, JSON.stringify(data)); +} + +/** + * Record today's mood reflection in the streak. + * Only increments once per calendar day. + * Returns the updated StreakData. + */ +export function recordDailyStreak(): StreakData { + const data = loadStreakData(); + const today = getLocalDateString(); + + // Already logged today β€” no duplicate increment + if (data.lastLoggedDate === today) { + return data; + } + + // Determine if streak continues or resets + if (data.lastLoggedDate) { + const gap = daysBetween(data.lastLoggedDate, today); + if (gap === 1) { + // Consecutive day β€” continue streak + data.currentStreak += 1; + } else if (gap === 0) { + // Same day (shouldn't reach here due to early return, but safety) + return data; + } else { + // Missed day(s) β€” reset streak + data.currentStreak = 1; + } + } else { + // First ever log + data.currentStreak = 1; + } + + // Update longest streak + if (data.currentStreak > data.longestStreak) { + data.longestStreak = data.currentStreak; + } + + // Record the date + data.lastLoggedDate = today; + if (!data.streakDates.includes(today)) { + data.streakDates.push(today); + } + + // Keep only last 90 days of streak dates to limit storage + if (data.streakDates.length > 90) { + data.streakDates = data.streakDates.slice(-90); + } + + saveStreakData(data); + return data; +} + +/** + * Recalculate streak from mood history entries. + * Useful after hydration or initial load. + */ +export function recalculateStreakFromHistory( + moodHistory: Array<{ timestamp: string }> +): StreakData { + if (!moodHistory || moodHistory.length === 0) { + return getDefaultStreakData(); + } + + // Extract unique calendar dates from mood history + const uniqueDates = Array.from( + new Set( + moodHistory.map(entry => getLocalDateString(new Date(entry.timestamp))) + ) + ).sort(); + + if (uniqueDates.length === 0) return getDefaultStreakData(); + + // Walk backwards from most recent date to count current streak + const today = getLocalDateString(); + const lastDate = uniqueDates[uniqueDates.length - 1]; + + // If last logged date is more than 1 day before today, streak is broken + const gapFromToday = daysBetween(lastDate, today); + + let currentStreak = 0; + if (gapFromToday <= 1) { + // Streak is still active (logged today or yesterday) + currentStreak = 1; + for (let i = uniqueDates.length - 2; i >= 0; i--) { + const gap = daysBetween(uniqueDates[i], uniqueDates[i + 1]); + if (gap === 1) { + currentStreak++; + } else { + break; + } + } + } + + // Find longest streak across all history + let longestStreak = 1; + let tempStreak = 1; + for (let i = 1; i < uniqueDates.length; i++) { + const gap = daysBetween(uniqueDates[i - 1], uniqueDates[i]); + if (gap === 1) { + tempStreak++; + longestStreak = Math.max(longestStreak, tempStreak); + } else { + tempStreak = 1; + } + } + longestStreak = Math.max(longestStreak, currentStreak); + + const data: StreakData = { + currentStreak, + longestStreak, + lastLoggedDate: lastDate, + streakDates: uniqueDates.slice(-90), + }; + + saveStreakData(data); + return data; +} + +/** Check if mood was already logged today */ +export function hasLoggedToday(): boolean { + const data = loadStreakData(); + return data.lastLoggedDate === getLocalDateString(); +} + +/** Get the current local date string for external use */ +export function getTodayString(): string { + return getLocalDateString(); +} diff --git a/public/sw.js b/public/sw.js index df60ec4..56e657d 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,a)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let o={};const t=e=>i(e,c),r={module:{uri:c},exports:o,require:t};s[c]=Promise.all(n.map(e=>r[e]||t(e))).then(e=>(a(...e),o))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"f551244d4786b5a53febf50c1140cfe9"},{url:"/_next/static/chunks/396-193de55f8218c756.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/472-0672d76076ce53d8.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/655-7af06c4197dbc7d6.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/662-7f6c748c8186c8dd.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/67-d4065ac02da0c0d3.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/775-dd8f299d52b0217c.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/_not-found-976bd7eb9499ed60.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/about/page-20a281db775b4cc2.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/analytics/page-a9bb41beace44bd0.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/emotions/page-b6832c195c1846e5.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/explore/page-1a4c1a179e38b244.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/landing/page-475c172475cfbe15.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/layout-833801c9933b3872.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/login/page-0bea590b0338e9dc.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/mood/%5Bid%5D/page-51d515a7027d120c.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/music/page-86167f1b5647a3f7.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/page-8b8fd31022b8b71b.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/privacy/page-a39a4e03bc6a7e72.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/signup/page-ee97067e70a01301.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/template-8f80818c69138f3e.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/terms/page-af524e86aa69fe72.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/app/test/page-fed419b22facc195.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/fd9d1056-88e36da51761b5c1.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/framework-c5181c9431ddc45b.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/main-3a4913a416168e86.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/main-app-00cfeae7bd59f6fd.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/pages/_app-1534f180665c857f.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/pages/_error-b646007f40c4f0a8.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js",revision:"837c0df77fd5009c9e46d446188ecfd0"},{url:"/_next/static/chunks/webpack-ffa8e97fbe81fa46.js",revision:"u0J7Keq-X5FjHfbKGSWAO"},{url:"/_next/static/css/bba36394c00a2bcb.css",revision:"bba36394c00a2bcb"},{url:"/_next/static/css/d34302a0c835ed5d.css",revision:"d34302a0c835ed5d"},{url:"/_next/static/media/19cfc7226ec3afaa-s.woff2",revision:"9dda5cfc9a46f256d0e131bb535e46f8"},{url:"/_next/static/media/21350d82a1f187e9-s.woff2",revision:"4e2553027f1d60eff32898367dd4d541"},{url:"/_next/static/media/8e9860b6e62d6359-s.woff2",revision:"01ba6c2a184b8cba08b0d57167664d75"},{url:"/_next/static/media/ba9851c3c22cd980-s.woff2",revision:"9e494903d6b0ffec1a1e14d34427d44d"},{url:"/_next/static/media/c5fe6dc8356a8c31-s.woff2",revision:"027a89e9ab733a145db70f09b8a18b42"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_next/static/media/e4af272ccee01ff0-s.p.woff2",revision:"65850a373e258f1c897a2b3d75eb74de"},{url:"/_next/static/u0J7Keq-X5FjHfbKGSWAO/_buildManifest.js",revision:"50654c4134ba6f71b423498e9447ee91"},{url:"/_next/static/u0J7Keq-X5FjHfbKGSWAO/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/apple-touch-icon.png",revision:"72cb84f13d636f6bee39c2ade5691432"},{url:"/background-lottie.json",revision:"80d47f02583aad3cac473c14d2129f45"},{url:"/icons/android/android-launchericon-144-144.png",revision:"cde4c42e37934a9e7c1bc43166d96c1d"},{url:"/icons/android/android-launchericon-192-192.png",revision:"f08bad141fe718b6a89b7e4959a63d74"},{url:"/icons/android/android-launchericon-48-48.png",revision:"c086c9bb4c634ac06ef38e217d5cd947"},{url:"/icons/android/android-launchericon-512-512.png",revision:"f089be72debf6629f9931c88579459ce"},{url:"/icons/android/android-launchericon-72-72.png",revision:"1a06c5830462020fe4659a9d66956466"},{url:"/icons/android/android-launchericon-96-96.png",revision:"eafd41a84e7296118f7bebb3bc181b52"},{url:"/icons/icons.json",revision:"1913d8fc06fa09f68dd36f6d53c94b41"},{url:"/icons/image.png",revision:"b5e48c8d91f367704a8174a22f6c7154"},{url:"/icons/ios/100.png",revision:"d6aaf51c5ecb436a278553f096620b53"},{url:"/icons/ios/1024.png",revision:"d8326a930a048184ed4744f0a235a3d1"},{url:"/icons/ios/114.png",revision:"e2ed90a0010f48b323f678444ce28587"},{url:"/icons/ios/120.png",revision:"fea1c92dc7c20c759fbaafe0591d0adf"},{url:"/icons/ios/128.png",revision:"72cb84f13d636f6bee39c2ade5691432"},{url:"/icons/ios/144.png",revision:"cde4c42e37934a9e7c1bc43166d96c1d"},{url:"/icons/ios/152.png",revision:"0ea8a7107c0256cf03e5dd1c42b60f9d"},{url:"/icons/ios/16.png",revision:"f8d671b9c558c61690e30b17f92e8d42"},{url:"/icons/ios/167.png",revision:"bd18585f0878a7dd1a0ed5c68c73aa78"},{url:"/icons/ios/180.png",revision:"3d0e6039938652cb6c7ce8f025869aea"},{url:"/icons/ios/192.png",revision:"f08bad141fe718b6a89b7e4959a63d74"},{url:"/icons/ios/20.png",revision:"00fec80a64032ebefc6d567314ae13d7"},{url:"/icons/ios/256.png",revision:"07b91ca9b283e44e5bd6b230ecd11f50"},{url:"/icons/ios/29.png",revision:"1c93db5a0760201363dd60e11eb8c186"},{url:"/icons/ios/32.png",revision:"24bb311ffe3716362fa2e6d4e7f1b2d0"},{url:"/icons/ios/40.png",revision:"5c40201fd5f3b783a1a6a75e121f8471"},{url:"/icons/ios/50.png",revision:"0372012d5769114681e26034777ad923"},{url:"/icons/ios/512.png",revision:"f089be72debf6629f9931c88579459ce"},{url:"/icons/ios/57.png",revision:"22316a01552404b50abba311007ad60a"},{url:"/icons/ios/58.png",revision:"e81d3d972496c355ab8643a8a59a5be9"},{url:"/icons/ios/60.png",revision:"f16bdc58173f87cb4b579533ca8d156a"},{url:"/icons/ios/64.png",revision:"39d23577553a5b65b098c12193bbd609"},{url:"/icons/ios/72.png",revision:"1a06c5830462020fe4659a9d66956466"},{url:"/icons/ios/76.png",revision:"05ed4b24ab7635c9039a0750982ba946"},{url:"/icons/ios/80.png",revision:"52f38b7640a9bdd6200e5ff0aadb5de5"},{url:"/icons/ios/87.png",revision:"aa9d58c32511337bf534e64803d8eca8"},{url:"/manifest.json",revision:"fbc82ae79bb440539ebe3f75b6eff7d1"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:i,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); +if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,a)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let t={};const o=e=>i(e,c),r={module:{uri:c},exports:t,require:o};s[c]=Promise.all(n.map(e=>r[e]||o(e))).then(e=>(a(...e),t))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"ac84a193dc35ed9de876450907d21194"},{url:"/_next/static/chunks/100-500f532767c45c46.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/103-10f3291ff106a0c9.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/302-41a5c3a658b0a558.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/396-4440275f646139ca.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/472-ce39454a9942be54.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/565-2fc9f9c96d150f8e.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/629-35f14a1e71fb5ae1.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/67-c36b51d0f8dac6ae.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/696-d94ea24095ee0e88.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/852-322c41bc63f10b94.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/958-e5202eeac5a15cd9.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/_not-found-40edd7a794b0189c.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/about/page-4932ad454897b60e.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/analytics/page-55d7fbaa6eb931a3.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/emotions/page-b6cf5e8c48b2ba83.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/explore/page-17ab7baaff78bb27.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/insights/page-e56fe381641a5081.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/landing/page-9eb6dba494aa29fc.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/layout-bd6be44d363f9441.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/login/page-af31362b09bd2df0.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/mood/%5Bid%5D/page-652809e951419602.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/music/page-9e1404c13d6b2c91.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/page-71db39845c7a9b7a.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/personalization/page-2ddf94e567ea3323.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/privacy/page-599e26777cd41753.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/signup/page-2d139088a5f21e16.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/template-eac5e497c4dd6344.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/terms/page-6576016ad1522125.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/app/test/page-befb92c3ce657ee6.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/fd9d1056-5c7e2193f0d52165.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/framework-43665103d101a22d.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/main-app-cda7bb88192a7b89.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/main-e6a6d2e2af3114d5.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/pages/_app-451d704a741dc8a8.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/pages/_error-d6885ef27f2c5e3d.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js",revision:"837c0df77fd5009c9e46d446188ecfd0"},{url:"/_next/static/chunks/webpack-a44e81d3f9b7b5e2.js",revision:"tye4XT-roVR0lZlw0_35Y"},{url:"/_next/static/css/d34302a0c835ed5d.css",revision:"d34302a0c835ed5d"},{url:"/_next/static/css/f70f9ca5e4aea67f.css",revision:"f70f9ca5e4aea67f"},{url:"/_next/static/media/19cfc7226ec3afaa-s.woff2",revision:"9dda5cfc9a46f256d0e131bb535e46f8"},{url:"/_next/static/media/21350d82a1f187e9-s.woff2",revision:"4e2553027f1d60eff32898367dd4d541"},{url:"/_next/static/media/8e9860b6e62d6359-s.woff2",revision:"01ba6c2a184b8cba08b0d57167664d75"},{url:"/_next/static/media/ba9851c3c22cd980-s.woff2",revision:"9e494903d6b0ffec1a1e14d34427d44d"},{url:"/_next/static/media/c5fe6dc8356a8c31-s.woff2",revision:"027a89e9ab733a145db70f09b8a18b42"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_next/static/media/e4af272ccee01ff0-s.p.woff2",revision:"65850a373e258f1c897a2b3d75eb74de"},{url:"/_next/static/tye4XT-roVR0lZlw0_35Y/_buildManifest.js",revision:"15e671aaf852983909bd2fe1385b56f4"},{url:"/_next/static/tye4XT-roVR0lZlw0_35Y/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/apple-touch-icon.png",revision:"72cb84f13d636f6bee39c2ade5691432"},{url:"/background-lottie.json",revision:"80d47f02583aad3cac473c14d2129f45"},{url:"/icons/android/android-launchericon-144-144.png",revision:"cde4c42e37934a9e7c1bc43166d96c1d"},{url:"/icons/android/android-launchericon-192-192.png",revision:"f08bad141fe718b6a89b7e4959a63d74"},{url:"/icons/android/android-launchericon-48-48.png",revision:"c086c9bb4c634ac06ef38e217d5cd947"},{url:"/icons/android/android-launchericon-512-512.png",revision:"f089be72debf6629f9931c88579459ce"},{url:"/icons/android/android-launchericon-72-72.png",revision:"1a06c5830462020fe4659a9d66956466"},{url:"/icons/android/android-launchericon-96-96.png",revision:"eafd41a84e7296118f7bebb3bc181b52"},{url:"/icons/icons.json",revision:"1913d8fc06fa09f68dd36f6d53c94b41"},{url:"/icons/image.png",revision:"b5e48c8d91f367704a8174a22f6c7154"},{url:"/icons/ios/100.png",revision:"d6aaf51c5ecb436a278553f096620b53"},{url:"/icons/ios/1024.png",revision:"d8326a930a048184ed4744f0a235a3d1"},{url:"/icons/ios/114.png",revision:"e2ed90a0010f48b323f678444ce28587"},{url:"/icons/ios/120.png",revision:"fea1c92dc7c20c759fbaafe0591d0adf"},{url:"/icons/ios/128.png",revision:"72cb84f13d636f6bee39c2ade5691432"},{url:"/icons/ios/144.png",revision:"cde4c42e37934a9e7c1bc43166d96c1d"},{url:"/icons/ios/152.png",revision:"0ea8a7107c0256cf03e5dd1c42b60f9d"},{url:"/icons/ios/16.png",revision:"f8d671b9c558c61690e30b17f92e8d42"},{url:"/icons/ios/167.png",revision:"bd18585f0878a7dd1a0ed5c68c73aa78"},{url:"/icons/ios/180.png",revision:"3d0e6039938652cb6c7ce8f025869aea"},{url:"/icons/ios/192.png",revision:"f08bad141fe718b6a89b7e4959a63d74"},{url:"/icons/ios/20.png",revision:"00fec80a64032ebefc6d567314ae13d7"},{url:"/icons/ios/256.png",revision:"07b91ca9b283e44e5bd6b230ecd11f50"},{url:"/icons/ios/29.png",revision:"1c93db5a0760201363dd60e11eb8c186"},{url:"/icons/ios/32.png",revision:"24bb311ffe3716362fa2e6d4e7f1b2d0"},{url:"/icons/ios/40.png",revision:"5c40201fd5f3b783a1a6a75e121f8471"},{url:"/icons/ios/50.png",revision:"0372012d5769114681e26034777ad923"},{url:"/icons/ios/512.png",revision:"f089be72debf6629f9931c88579459ce"},{url:"/icons/ios/57.png",revision:"22316a01552404b50abba311007ad60a"},{url:"/icons/ios/58.png",revision:"e81d3d972496c355ab8643a8a59a5be9"},{url:"/icons/ios/60.png",revision:"f16bdc58173f87cb4b579533ca8d156a"},{url:"/icons/ios/64.png",revision:"39d23577553a5b65b098c12193bbd609"},{url:"/icons/ios/72.png",revision:"1a06c5830462020fe4659a9d66956466"},{url:"/icons/ios/76.png",revision:"05ed4b24ab7635c9039a0750982ba946"},{url:"/icons/ios/80.png",revision:"52f38b7640a9bdd6200e5ff0aadb5de5"},{url:"/icons/ios/87.png",revision:"aa9d58c32511337bf534e64803d8eca8"},{url:"/manifest.json",revision:"fbc82ae79bb440539ebe3f75b6eff7d1"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:i,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); From 8b14362128feffbd1283e5a5d591620d4697d997 Mon Sep 17 00:00:00 2001 From: ARUN N G Date: Mon, 16 Feb 2026 12:14:32 +0530 Subject: [PATCH 2/2] fix: resolve all ESLint errors - downgrade ESLint to v8, escape JSX entities, fix conditional hooks --- app/_offline/page.tsx | 2 +- app/about/page.tsx | 10 +- app/page.tsx | 2 +- app/terms/page.tsx | 4 +- components/LoginForm.tsx | 20 +- components/SimpleLangFlowChatbot.tsx | 4 +- components/SuggestionPanel.tsx | 18 +- lib/customMoods.ts | 35 +- package-lock.json | 803 ++++++++++----------------- package.json | 5 +- 10 files changed, 339 insertions(+), 564 deletions(-) diff --git a/app/_offline/page.tsx b/app/_offline/page.tsx index cec811b..7ac04e5 100644 --- a/app/_offline/page.tsx +++ b/app/_offline/page.tsx @@ -3,7 +3,7 @@ export default function OfflinePage() { return (
-

You're offline

+

You're offline

InnerHue needs an internet connection for full experience. Cached content may still be visible. diff --git a/app/about/page.tsx b/app/about/page.tsx index a0a9be0..f7b8b29 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -74,7 +74,7 @@ export default function AboutUs() { Our Mission

- In a world that never stops moving, it's easy to lose touch with how we really feel. + In a world that never stops moving, it's easy to lose touch with how we really feel. InnerHue was born from a simple belief: acknowledging your emotions is the first step towards well-being. We aim to provide a safe, beautiful, and intuitive space where you can pause, reflect, and find clarity amidst the chaos.

@@ -92,7 +92,7 @@ export default function AboutUs() {

InnerHue uses color psychology and mood tracking to help you visualize your emotional state. By selecting your current mood, you unlock personalized journal prompts, inspirational quotes, and - curated resources designed to support exactly how you're feeling right now. + curated resources designed to support exactly how you're feeling right now.

@@ -106,8 +106,8 @@ export default function AboutUs() {

For Everyone

- Whether you're feeling overwhelmed, ecstatic, or somewhere in between, InnerHue is here for you. - We believe that every emotion is valid and deserves to be heard. There is no "right" or "wrong" way to feelβ€”only + Whether you're feeling overwhelmed, ecstatic, or somewhere in between, InnerHue is here for you. + We believe that every emotion is valid and deserves to be heard. There is no "right" or "wrong" way to feelβ€”only your unique human experience.

@@ -118,7 +118,7 @@ export default function AboutUs() { className="md:col-span-2 text-center py-12" >

- "To feel is to be human." + "To feel is to be human."

Thank you for being part of our journey. diff --git a/app/page.tsx b/app/page.tsx index 6231fc0..b4936df 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -386,7 +386,7 @@ export default function Home() {

- Join thousands who have discovered deeper self-awareness through InnerHue's + Join thousands who have discovered deeper self-awareness through InnerHue's guided emotional reflection experience.

diff --git a/app/terms/page.tsx b/app/terms/page.tsx index bdb156e..3750675 100644 --- a/app/terms/page.tsx +++ b/app/terms/page.tsx @@ -41,7 +41,7 @@ export default function TermsOfService() {

1. Acceptance of Terms

- By accessing and using InnerHue ("the Service"), you accept and agree to be bound by the terms and provision of this agreement. + By accessing and using InnerHue ("the Service"), you accept and agree to be bound by the terms and provision of this agreement. In addition, when using the Service, you shall be subject to any posted guidelines or rules applicable to such services.

@@ -70,7 +70,7 @@ export default function TermsOfService() {

4. Disclaimer of Warranties

The Site and its original content, features, and functionality are owned by InnerHue and are protected by international copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws. - The Service is provided on an "as is" and "as available" basis. + The Service is provided on an "as is" and "as available" basis.

diff --git a/components/LoginForm.tsx b/components/LoginForm.tsx index 77fa727..b3d4e14 100644 --- a/components/LoginForm.tsx +++ b/components/LoginForm.tsx @@ -2,11 +2,11 @@ import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; -import { LoginSchema } from "@/lib/validation"; +import { LoginSchema } from "@/lib/validation"; import { z } from "zod"; import { useState } from "react"; import Link from "next/link"; -import { toast } from "sonner"; +import { toast } from "sonner"; type LoginFormData = z.infer; @@ -26,15 +26,15 @@ export default function LoginForm() { try { const toastId = toast.loading("Logging in..."); console.log("Logging in with:", data); - + // Simulate API call await new Promise((resolve) => setTimeout(resolve, 2000)); - + toast.dismiss(toastId); toast.success("Welcome back!", { description: "You have successfully logged in.", }); - + } catch (error) { toast.error("Login failed", { description: "Please check your email and password.", @@ -43,8 +43,8 @@ export default function LoginForm() { }; return ( -
@@ -96,9 +96,9 @@ export default function LoginForm() { {/* Footer Link */}

- Don't have an account?{" "} - Create one now diff --git a/components/SimpleLangFlowChatbot.tsx b/components/SimpleLangFlowChatbot.tsx index c56e075..2a9f144 100644 --- a/components/SimpleLangFlowChatbot.tsx +++ b/components/SimpleLangFlowChatbot.tsx @@ -143,10 +143,10 @@ export default function SimpleLangFlowChatbot({ onEmotionDetected, onAutoNavigat {!botResponse ? (

- Hey there! πŸ‘‹ I'm your emotion companion. + Hey there! πŸ‘‹ I'm your emotion companion.

- Tell me how you're feeling and I'll help you explore your emotions! + Tell me how you're feeling and I'll help you explore your emotions!

) : ( diff --git a/components/SuggestionPanel.tsx b/components/SuggestionPanel.tsx index 4d8e9f1..1ade091 100644 --- a/components/SuggestionPanel.tsx +++ b/components/SuggestionPanel.tsx @@ -39,9 +39,9 @@ export function SuggestionPanel({ suggestions, mood, onRefresh, isRefreshing = f const cardVariants = { hidden: { opacity: 0, y: 30, scale: 0.95 }, - visible: { - opacity: 1, - y: 0, + visible: { + opacity: 1, + y: 0, scale: 1, transition: { type: "spring", stiffness: 100, damping: 15 } }, @@ -54,14 +54,14 @@ export function SuggestionPanel({ suggestions, mood, onRefresh, isRefreshing = f return ( - {/* Header with animated gradient */} - - +
{[...Array(6)].map((_, i) => ( - - " + "
@@ -192,7 +192,7 @@ export function SuggestionPanel({ suggestions, mood, onRefresh, isRefreshing = f
-
"{suggestions.quote}"
+
"{suggestions.quote}"
{suggestions.author} diff --git a/lib/customMoods.ts b/lib/customMoods.ts index 0b5dfb6..c64308e 100644 --- a/lib/customMoods.ts +++ b/lib/customMoods.ts @@ -32,7 +32,7 @@ export const CustomMoodStorage = { */ getCustomMoods(): CustomMood[] { if (typeof window === 'undefined') return []; - + try { const stored = localStorage.getItem(CUSTOM_MOODS_STORAGE_KEY); return stored ? JSON.parse(stored) : []; @@ -47,7 +47,7 @@ export const CustomMoodStorage = { */ saveCustomMood(mood: Omit): CustomMood { const customMoods = this.getCustomMoods(); - + const newMood: CustomMood = { ...mood, id: `custom_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`, @@ -56,7 +56,7 @@ export const CustomMoodStorage = { }; customMoods.push(newMood); - + try { localStorage.setItem(CUSTOM_MOODS_STORAGE_KEY, JSON.stringify(customMoods)); // Dispatch a custom event to notify components of the change @@ -75,7 +75,7 @@ export const CustomMoodStorage = { deleteCustomMood(moodId: string): boolean { const customMoods = this.getCustomMoods(); const filteredMoods = customMoods.filter(mood => mood.id !== moodId); - + if (filteredMoods.length === customMoods.length) { return false; // Mood not found } @@ -95,7 +95,7 @@ export const CustomMoodStorage = { */ moodNameExists(name: string): boolean { const customMoods = this.getCustomMoods(); - return customMoods.some(mood => + return customMoods.some(mood => mood.name.toLowerCase() === name.toLowerCase() ); }, @@ -143,19 +143,12 @@ export function getCombinedMoods(defaultMoods: Mood[]): Mood[] { * Hook for listening to custom mood changes */ export function useCustomMoods(defaultMoods: Mood[] = []) { - if (typeof window === 'undefined') { - return { - allMoods: defaultMoods, - customMoods: [], - addCustomMood: () => Promise.reject(new Error('Not available on server')), - deleteCustomMood: () => false, - refreshMoods: () => {} - }; - } - const [customMoods, setCustomMoods] = useState([]); + const isClient = typeof window !== 'undefined'; useEffect(() => { + if (!isClient) return; + // Load initial custom moods const loadCustomMoods = () => { const moods = CustomMoodStorage.getCustomMoods(); @@ -174,7 +167,17 @@ export function useCustomMoods(defaultMoods: Mood[] = []) { return () => { window.removeEventListener('customMoodsUpdated', handleCustomMoodsUpdate as EventListener); }; - }, []); + }, [isClient]); + + if (!isClient) { + return { + allMoods: defaultMoods, + customMoods: [], + addCustomMood: () => Promise.reject(new Error('Not available on server')), + deleteCustomMood: () => false, + refreshMoods: () => { } + }; + } const addCustomMood = async (moodData: Omit): Promise => { return CustomMoodStorage.saveCustomMood(moodData); diff --git a/package-lock.json b/package-lock.json index f54cc47..8e66177 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,9 +46,9 @@ "css": "^3.0.0", "date-fns": "^3.6.0", "embla-carousel-react": "^8.3.0", - "eslint": "^9.39.2", - "eslint-config-next": "^16.1.6", - "framer-motion": "^12.23.12", + "eslint": "8.49.0", + "eslint-config-next": "13.5.1", + "framer-motion": "^10.16.16", "input-otp": "^1.2.4", "lottie-react": "^2.4.1", "lucide-react": "^0.446.0", @@ -1621,6 +1621,23 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT", + "optional": true + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -1648,99 +1665,36 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { @@ -1790,26 +1744,19 @@ "react-hook-form": "^7.0.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=18.18.0" + "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1825,18 +1772,12 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -1956,40 +1897,33 @@ "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.6.tgz", - "integrity": "sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==", - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "13.5.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.1.tgz", + "integrity": "sha512-LBlI3iQvlzRE7Y6AfIyHKuM4T6REGmFgweN2tBqEUVEfgxERBLOutV2xckXEp3Y3VbfJBBXKZNfDzs20gHimSg==", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "glob": "7.1.7" } }, - "node_modules/@next/eslint-plugin-next/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { @@ -3646,6 +3580,12 @@ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "license": "MIT" }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.15.0.tgz", + "integrity": "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==", + "license": "MIT" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -3778,7 +3718,8 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/glob": { "version": "7.2.0", @@ -3865,152 +3806,58 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", - "license": "MIT", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", - "debug": "^4.4.3" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^7.0.0 || ^8.0.0" }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4018,30 +3865,31 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", - "license": "MIT", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", - "debug": "^4.4.3", - "minimatch": "^9.0.5", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -4054,9 +3902,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -4068,58 +3916,23 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -5909,6 +5722,18 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -6215,82 +6040,78 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-next": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.6.tgz", - "integrity": "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==", + "version": "13.5.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.1.tgz", + "integrity": "sha512-+8xIIWtD+iFwHfXgmXRGn05BuNIu/RAGcz6kI4wsJTPrE/1WtWKv2o0l+GbQ6wRaC+cbBV8+QnFAOf18aJiWrg==", "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.1.6", + "@next/eslint-plugin-next": "13.5.1", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^7.0.0", - "globals": "16.4.0", - "typescript-eslint": "^8.46.0" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { - "eslint": ">=9.0.0", + "eslint": "^7.23.0 || ^8.0.0", "typescript": ">=3.3.1" }, "peerDependenciesMeta": { @@ -6299,18 +6120,6 @@ } } }, - "node_modules/eslint-config-next/node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -6516,43 +6325,15 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-hooks/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/eslint-plugin-react-hooks/node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" + "node": ">=10" }, "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -6594,16 +6375,16 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6621,42 +6402,27 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "eslint-visitor-keys": "^3.4.1" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6824,15 +6590,15 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/filelist": { @@ -6911,16 +6677,54 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { @@ -6975,24 +6779,21 @@ } }, "node_modules/framer-motion": { - "version": "12.23.12", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz", - "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.18.0.tgz", + "integrity": "sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==", "license": "MIT", "dependencies": { - "motion-dom": "^12.23.12", - "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, "react": { "optional": true }, @@ -7227,12 +7028,27 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7301,6 +7117,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -7388,21 +7210,6 @@ "node": ">= 0.4" } }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -8484,21 +8291,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/motion-dom": { - "version": "12.23.12", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", - "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.23.6" - } - }, - "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10746,6 +10538,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -10811,15 +10609,15 @@ } }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "license": "MIT", "engines": { - "node": ">=18.12" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=4.8.4" + "typescript": ">=4.2.0" } }, "node_modules/ts-interface-checker": { @@ -10957,29 +10755,6 @@ "node": ">=14.17" } }, - "node_modules/typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", diff --git a/package.json b/package.json index 71394b9..4745967 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,6 @@ "eslint": "8.49.0", "eslint-config-next": "13.5.1", "framer-motion": "^10.16.16", - "eslint": "^9.39.2", - "eslint-config-next": "^16.1.6", - "framer-motion": "^12.23.12", "input-otp": "^1.2.4", "lottie-react": "^2.4.1", "lucide-react": "^0.446.0", @@ -86,4 +83,4 @@ "postcss": "^8.5.6", "tailwindcss": "^3.4.0" } -} +} \ No newline at end of file