diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/GA_SETUP_SUMMARY.md b/GA_SETUP_SUMMARY.md deleted file mode 100644 index 495d10e..0000000 --- a/GA_SETUP_SUMMARY.md +++ /dev/null @@ -1,70 +0,0 @@ -# Google Analytics Integration - Setup Summary - -✅ **Google Analytics 4 (GA4) has been successfully integrated into your website!** - -## What Was Done - -### 1. **Package Installation** -- Installed `react-ga4` package to handle GA tracking - -### 2. **Files Created/Modified** -- **[src/shared/hooks/useGoogleAnalytics.ts](src/shared/hooks/useGoogleAnalytics.ts)** — GA initialization and event tracking functions -- **[src/shared/hooks/useGoogleAnalytics.test.ts](src/shared/hooks/useGoogleAnalytics.test.ts)** — Comprehensive tests for GA functionality -- **[src/router.tsx](src/router.tsx)** — GA initialization on app startup -- **[src/routes/__root.tsx](src/routes/__root.tsx)** — Automatic page view tracking on route changes -- **[.env.example](.env.example)** — Template for environment variables -- **[.env.local](.env.local)** — Local configuration (ready for your tracking ID) -- **[GOOGLE_ANALYTICS.md](GOOGLE_ANALYTICS.md)** — Complete setup and usage guide - -## How to Activate - -### Step 1: Get Your GA4 Tracking ID -1. Go to [Google Analytics Admin](https://analytics.google.com/analytics/web/) -2. Create a new property or use existing -3. Copy your **Measurement ID** (format: `G-XXXXXXXXXX`) - -### Step 2: Add Tracking ID to Environment -Edit `.env.local` and add your tracking ID: -```bash -VITE_GA_TRACKING_ID=G-XXXXXXXXXX -``` - -### Step 3: Restart Dev Server -```bash -npm run dev -``` - -## Features Now Available - -✅ **Automatic Page View Tracking** — Every route navigation is tracked -✅ **Custom Event Tracking** — Track specific user actions like button clicks -✅ **Fully Tested** — All GA functionality has tests -✅ **Type-Safe** — TypeScript support throughout -✅ **Production-Ready** — Handles missing tracking ID gracefully - -## Usage Examples - -### Track Custom Events -```tsx -import { trackGAEvent } from '@/shared/hooks/useGoogleAnalytics' - -const handleButtonClick = (): void => { - trackGAEvent('engagement', 'button_click', 'cta_button', 1) -} -``` - -## Testing -```bash -npm run test:run -- useGoogleAnalytics -``` - -## Documentation -See [GOOGLE_ANALYTICS.md](GOOGLE_ANALYTICS.md) for: -- Complete setup guide -- Privacy & compliance considerations -- Debugging tips -- Advanced usage patterns - ---- - -**Ready to track!** Once you add your GA4 tracking ID to `.env.local` and restart the dev server, page views and events will start flowing to Google Analytics. diff --git a/GA_VERIFICATION_REPORT.md b/GA_VERIFICATION_REPORT.md deleted file mode 100644 index 56c7b1f..0000000 --- a/GA_VERIFICATION_REPORT.md +++ /dev/null @@ -1,346 +0,0 @@ -# Google Analytics & Tag Manager Verification Report ✅ - -**Date**: December 24, 2025 -**Status**: ✅ **FULLY INTEGRATED AND OPERATIONAL** - ---- - -## Executive Summary - -Your Google Analytics 4 (GA4) and Google Tag Manager integration is **production-ready and properly configured**. All components are in place, tested, and working as expected. - ---- - -## 1. GOOGLE ANALYTICS 4 (GA4) INTEGRATION ✅ - -### Tracking ID Configuration -- **Status**: ✅ **ACTIVE** -- **Tracking ID**: `G-Z6QLE3H2FL` -- **Location**: `.env.local` -- **Environment Variable**: `VITE_GA_TRACKING_ID` - -```env -VITE_GA_TRACKING_ID=G-Z6QLE3H2FL -``` - -### Package Installation -- **Package**: `react-ga4` v2.1.0 -- **Status**: ✅ **INSTALLED** -- **Purpose**: React wrapper for Google Analytics 4 tracking - ---- - -## 2. GOOGLE TAG MANAGER (GTM) INTEGRATION ✅ - -### Tag Manager Configuration -- **Status**: ✅ **ACTIVE** -- **Implementation**: Native gtag.js script in `index.html` -- **Location**: Head section of HTML -- **Script ID**: `G-Z6QLE3H2FL` - -### Implementation Details - -**File**: [index.html](index.html#L135) - -```html - - - -``` - -**Verification**: -- ✅ Script loads asynchronously (non-blocking) -- ✅ dataLayer properly initialized -- ✅ Configuration properly set - ---- - -## 3. APPLICATION-LEVEL TRACKING ✅ - -### Initialization on App Startup -- **File**: [src/router.tsx](src/router.tsx) -- **Status**: ✅ **ACTIVE** -- **Function**: `initializeGoogleAnalytics()` - -```typescript -const gaTrackingId = (import.meta.env.VITE_GA_TRACKING_ID as string | undefined) -if (gaTrackingId) { - initializeGoogleAnalytics(gaTrackingId) -} -``` - -**Verification**: -- ✅ Gracefully handles missing tracking ID -- ✅ Only initializes if tracking ID is present -- ✅ Runs before router is created - -### Automatic Page View Tracking -- **File**: [src/routes/__root.tsx](src/routes/__root.tsx) -- **Status**: ✅ **ACTIVE** -- **Hook**: `useGoogleAnalyticsPageView(pathname)` - -```typescript -const { pathname } = useLocation() -useGoogleAnalyticsPageView(pathname) -``` - -**Verification**: -- ✅ Tracks every route navigation -- ✅ Sends pathname and document title -- ✅ Properly integrated in root route - -### Custom Event Tracking -- **File**: [src/shared/hooks/useGoogleAnalytics.ts](src/shared/hooks/useGoogleAnalytics.ts) -- **Status**: ✅ **READY TO USE** -- **Function**: `trackGAEvent(category, action, label, value)` - -```typescript -export const trackGAEvent = ( - category: string, - action: string, - label?: string, - value?: number -): void => { - ReactGA.event({ - category, - action, - label, - value - }) -} -``` - -**Usage Example**: -```tsx -import { trackGAEvent } from '@/shared/hooks/useGoogleAnalytics' - -const handleButtonClick = (): void => { - trackGAEvent('engagement', 'cta_button_click', 'hero_section', 1) -} -``` - ---- - -## 4. TEST COVERAGE ✅ - -### Test File -- **File**: [src/shared/hooks/useGoogleAnalytics.test.ts](src/shared/hooks/useGoogleAnalytics.test.ts) -- **Status**: ✅ **COMPREHENSIVE TESTS** - -### Test Coverage -- ✅ `initializeGoogleAnalytics()` — initialization with valid/invalid IDs -- ✅ `useGoogleAnalyticsPageView()` — page view tracking on route changes -- ✅ `trackGAEvent()` — custom event tracking with all parameters -- ✅ Error handling and edge cases - -**Run Tests**: -```bash -npm run test:run -- useGoogleAnalytics -``` - ---- - -## 5. DOCUMENTATION ✅ - -### Available Documentation -- [GOOGLE_ANALYTICS.md](GOOGLE_ANALYTICS.md) — Complete setup guide -- [GA_SETUP_SUMMARY.md](GA_SETUP_SUMMARY.md) — Quick reference -- Inline TypeScript JSDoc comments in hooks - ---- - -## 6. DATA FLOW DIAGRAM - -``` -User Action (Page Load/Navigation) - ↓ -[Router detects pathname change] - ↓ -[useGoogleAnalyticsPageView() hook fires] - ↓ -[ReactGA.send() sends pageview to Google Analytics] - ↓ -[Google Tag Manager receives data] - ↓ -[GA4 Dashboard receives metrics] -``` - -``` -User Interaction (Button Click, etc.) - ↓ -[Component calls trackGAEvent()] - ↓ -[ReactGA.event() sends event to Google Analytics] - ↓ -[Google Tag Manager receives data] - ↓ -[GA4 Dashboard shows event metrics] -``` - ---- - -## 7. INTEGRATION CHECKLIST ✅ - -### Core Setup -- ✅ GA4 Measurement ID configured: `G-Z6QLE3H2FL` -- ✅ Environment variable defined: `VITE_GA_TRACKING_ID` -- ✅ `.env.local` file present with tracking ID -- ✅ `react-ga4` package installed - -### HTML Integration -- ✅ Google Tag Manager script in `index.html` -- ✅ Script loads asynchronously -- ✅ dataLayer properly initialized -- ✅ Configuration applied on page load - -### Application Integration -- ✅ GA initialization in `router.tsx` -- ✅ Page view tracking in root route -- ✅ Custom event tracking function available -- ✅ Type-safe TypeScript implementation - -### Quality Assurance -- ✅ Comprehensive test coverage -- ✅ Error handling for missing tracking ID -- ✅ Graceful degradation (works without tracking ID) -- ✅ Production-ready code - ---- - -## 8. HOW TO USE CUSTOM EVENT TRACKING - -### Example 1: CTA Button Click -```tsx -import { trackGAEvent } from '@/shared/hooks/useGoogleAnalytics' - -const handleCTAClick = (): void => { - trackGAEvent('engagement', 'cta_click', 'hero_section') - // Navigate or perform action -} - -return -``` - -### Example 2: Form Submission -```tsx -const handleFormSubmit = (formData: any): void => { - trackGAEvent('conversion', 'form_submit', 'contact_form', 1) - // Submit form -} -``` - -### Example 3: Link Click Tracking -```tsx -const handleExternalLinkClick = (url: string): void => { - trackGAEvent('navigation', 'external_link', url, 1) - window.open(url, '_blank') -} -``` - ---- - -## 9. VERIFICATION COMMANDS - -Run these commands to verify everything is working: - -```bash -# Install dependencies -npm install - -# Run development server -npm run dev - -# Run tests to verify GA integration -npm run test:run -- useGoogleAnalytics - -# Check TypeScript types -npm run type-check - -# Lint and format -npm run lint -``` - ---- - -## 10. DEBUGGING IN PRODUCTION - -### Chrome DevTools -1. Open Chrome DevTools → Network tab -2. Filter by `googletagmanager` -3. You should see requests to Google Analytics servers - -### Google Analytics Real-Time View -1. Go to [Google Analytics Console](https://analytics.google.com) -2. Navigate to Real-time view -3. You should see real-time page views and events - -### Chrome Extension (Recommended) -Install [Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/) for detailed event inspection - ---- - -## 11. BEST PRACTICES IN USE ✅ - -- ✅ **Graceful Degradation** — App works even without tracking ID -- ✅ **Type-Safe** — All GA functions are TypeScript typed -- ✅ **Performance Optimized** — GTM script loads asynchronously -- ✅ **Error Handling** — Warnings for missing configuration -- ✅ **Testing** — 100% test coverage for GA hooks -- ✅ **Documentation** — Multiple guides available - ---- - -## 12. POTENTIAL ENHANCEMENTS (Optional) - -If you want to extend tracking in the future: - -1. **User Consent Management** — Add cookie consent banner for GDPR/CCPA -2. **Scroll Depth Tracking** — Track how far users scroll -3. **Video Engagement** — Track video play/pause events -4. **Form Field Interactions** — Track individual field focus/blur -5. **Link Click Tracking** — Auto-track external link clicks -6. **Download Tracking** — Track file downloads -7. **Search Tracking** — Track internal site searches -8. **Error Tracking** — Send JavaScript errors to GA - ---- - -## 13. SECURITY & PRIVACY ✅ - -- ✅ **No Personal Data** — Only behavioral tracking (no PII) -- ✅ **Compliant** — Using standard GA4 implementation -- ✅ **GDPR Ready** — Can add consent banner for EU compliance -- ✅ **Tracking ID Protected** — Stored in environment variables -- ✅ **No Sensitive Data** — Events don't contain sensitive information - ---- - -## FINAL VERDICT ✅ - -**Status**: ✅ **FULLY OPERATIONAL AND PRODUCTION-READY** - -Your Google Analytics 4 and Google Tag Manager integration is: -- ✅ Properly configured with tracking ID `G-Z6QLE3H2FL` -- ✅ Fully integrated at application level -- ✅ Comprehensively tested -- ✅ Well documented -- ✅ Following best practices -- ✅ Ready for production deployment - -**Next Steps**: -1. Monitor GA4 dashboard for real-time data -2. Add custom event tracking to important user actions (optional) -3. Set up GA4 alerts and goals (optional) -4. Review traffic and user behavior in GA4 dashboard - ---- - -**Generated**: December 24, 2025 -**Report Version**: 1.0 diff --git a/GOOGLE_ANALYTICS.md b/GOOGLE_ANALYTICS.md deleted file mode 100644 index a7d324e..0000000 --- a/GOOGLE_ANALYTICS.md +++ /dev/null @@ -1,106 +0,0 @@ -# Google Analytics Integration Guide - -Google Analytics 4 (GA4) has been integrated into the **grwm.dev** website to track visitor behavior and engagement. - -## Setup - -### 1. Get Your Tracking ID - -1. Go to [Google Analytics Admin](https://analytics.google.com/analytics/web/) -2. Create a new property (if you don't have one) -3. Copy your **Measurement ID** (format: `G-XXXXXXXXXX`) - -### 2. Configure Environment Variable - -Add your tracking ID to `.env.local`: - -```bash -VITE_GA_TRACKING_ID=G-XXXXXXXXXX -``` - -**Note**: Replace `G-XXXXXXXXXX` with your actual tracking ID. - -### 3. Restart Development Server - -```bash -npm run dev -``` - -## Features - -### Automatic Page View Tracking - -Page views are automatically tracked whenever users navigate to a different route. This is handled by the `useGoogleAnalyticsPageView` hook in the root route. - -### Custom Event Tracking - -Track custom events anywhere in your components: - -```tsx -import { trackGAEvent } from '@/shared/hooks/useGoogleAnalytics' - -const handleCtaClick = (): void => { - trackGAEvent('engagement', 'cta_button_click', 'homepage_hero', 1) -} - -return -``` - -**Event Parameters**: -- `category` (required): Event category (e.g., 'engagement', 'form') -- `action` (required): Event action (e.g., 'click', 'submit') -- `label` (optional): Event label for more detail -- `value` (optional): Numeric value associated with the event - -## Implementation Details - -### Files Modified/Created - -1. **`src/shared/hooks/useGoogleAnalytics.ts`** — GA initialization and tracking functions -2. **`src/shared/hooks/useGoogleAnalytics.test.ts`** — Tests for GA hooks -3. **`src/router.tsx`** — GA initialization on app startup -4. **`src/routes/__root.tsx`** — Page view tracking on route changes -5. **`.env.example`** — Example environment variables -6. **`.env.local`** — Local environment configuration (not committed to git) - -### How It Works - -1. **Initialization**: When the app starts, the tracking ID is read from environment variables and GA is initialized -2. **Page Views**: Every time the user navigates to a new route, `useGoogleAnalyticsPageView` sends a page view event with the current pathname -3. **Custom Events**: Components can use `trackGAEvent()` to track specific user actions - -## Testing - -GA functions are fully tested with mocked `react-ga4`: - -```bash -npm run test:run -- useGoogleAnalytics -``` - -## Privacy & Compliance - -- Ensure your privacy policy mentions Google Analytics -- Consider GDPR compliance if targeting EU users -- Configure Google Analytics to respect user consent settings - -## Debugging - -To debug GA in development: - -1. Install the [Google Analytics Debugger Chrome Extension](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcicaksihpklodawohh) -2. Open Chrome DevTools and check the Real-time view in Google Analytics -3. Look for page views and events being logged - -## Next Steps (Optional) - -1. **Add consent banner** — Implement a cookie consent banner to comply with privacy regulations -2. **Track form submissions** — Add event tracking to CTA and contact form submissions -3. **Track video engagement** — If you add video content, track play/pause events -4. **Track scroll depth** — Measure how far users scroll on pages -5. **User ID tracking** — Track authenticated users (if applicable) - -## Useful Resources - -- [Google Analytics 4 Documentation](https://developers.google.com/analytics/devguides/collection/ga4) -- [react-ga4 NPM Package](https://www.npmjs.com/package/react-ga4) -- [Analytics Event Naming Best Practices](https://support.google.com/analytics/answer/10085872) diff --git a/PERFORMANCE.md b/PERFORMANCE.md deleted file mode 100644 index 37078dc..0000000 --- a/PERFORMANCE.md +++ /dev/null @@ -1,144 +0,0 @@ -# Performance Optimization Guide - -## Overview - -This application is optimized for excellent Lighthouse scores with focus on Core Web Vitals: -- **LCP (Largest Contentful Paint)**: < 2.5s -- **TTI (Time to Interactive)**: < 3.8s -- **FID (First Input Delay)**: < 100ms -- **CLS (Cumulative Layout Shift)**: < 0.1 - -## Optimization Strategies - -### 1. Lazy Loading - -All below-the-fold components are lazy loaded using: -- `React.lazy()` for code splitting -- `Suspense` boundaries for loading states -- Intersection Observer for viewport-based loading - -**Implementation:** -```typescript -// Components are lazy loaded -const AudienceSection = lazy(() => import('@domains/audience')); - -// With Suspense boundaries -}> - - -``` - -### 2. Shimmer Loaders - -Replaced loading spinners with shimmer loaders for better UX: -- **PageShimmer**: Full page loading state -- **SectionShimmer**: Section-level loading state -- **ShimmerLoader**: Generic shimmer component - -**Benefits:** -- Better perceived performance -- Reduced layout shift -- Smoother loading experience - -### 3. Code Splitting - -Vite is configured for optimal code splitting: -- Vendor chunks separated by library -- React, Router, Query, Animation, State, Utils in separate chunks -- Automatic chunk optimization - -**Chunk Strategy:** -- `react-vendor`: React & React DOM -- `router-vendor`: TanStack Router -- `query-vendor`: TanStack Query -- `animation-vendor`: Framer Motion -- `state-vendor`: Zustand -- `utils-vendor`: Underscore.js - -### 4. Intersection Observer - -Custom hook `useIntersectionObserver` for viewport-based loading: -- Loads components when they're about to enter viewport -- Configurable root margin (default: 200px) -- Trigger once for performance - -### 5. React Query Optimization - -Configured for optimal hydration: -- 5-minute stale time -- Structural sharing enabled -- No refetch on window focus -- Automatic retry (1 attempt) - -### 6. Build Optimizations - -**Vite Configuration:** -- ESBuild minification (faster than Terser) -- CSS minification -- Target: ESNext for modern browsers -- Optimized chunk naming for better caching - -**HTML Optimizations:** -- Preconnect to external domains -- DNS prefetch for external resources -- Preload critical CSS -- Inline critical CSS for faster LCP - -### 7. Component Loading Strategy - -**Above the Fold (Immediate Load):** -- HeroSection (critical for LCP) - -**Below the Fold (Lazy Load):** -- AudienceSection -- ServicesSection -- ProcessSection -- AboutSection -- CTASection -- Footer - -### 8. Performance Monitoring - -Use browser DevTools to monitor: -- Network tab: Check chunk loading -- Performance tab: Analyze rendering -- Lighthouse: Measure Core Web Vitals - -## Best Practices - -1. **Keep Hero Section Light**: Hero section loads immediately, keep it minimal -2. **Lazy Load Everything Below Fold**: Use `LazySection` component -3. **Use Shimmer Loaders**: Better UX than spinners -4. **Monitor Bundle Size**: Keep chunks under 200KB -5. **Optimize Images**: Use WebP format, lazy load images -6. **Minimize JavaScript**: Tree shaking removes unused code - -## Testing Performance - -```bash -# Build for production -npm run build - -# Preview production build -npm run preview - -# Run Lighthouse audit -# Use Chrome DevTools > Lighthouse tab -``` - -## Expected Metrics - -- **LCP**: < 2.5s (Hero section loads immediately) -- **TTI**: < 3.8s (Code splitting reduces initial bundle) -- **FID**: < 100ms (Minimal JavaScript on initial load) -- **CLS**: < 0.1 (Shimmer loaders prevent layout shift) -- **FCP**: < 1.8s (Optimized HTML and CSS) - -## Future Optimizations - -1. Image optimization with next-gen formats -2. Service Worker for offline support -3. HTTP/2 Server Push for critical resources -4. Resource hints (prefetch, preload) -5. Critical CSS extraction - diff --git a/PERFORMANCE_OPTIMIZATION_PLAN.md b/PERFORMANCE_OPTIMIZATION_PLAN.md deleted file mode 100644 index cf5b842..0000000 --- a/PERFORMANCE_OPTIMIZATION_PLAN.md +++ /dev/null @@ -1,276 +0,0 @@ -# Performance Optimization Plan - grwm.dev Portfolio - -## Current Bundle Analysis ✅ - -### Bundle Size Summary -- **React Vendor**: 182.17 kB (React + ReactDOM) -- **Animation Vendor**: 98.52 kB (Framer Motion) -- **Other Vendor**: 87.53 kB (Router, utilities) -- **Main CSS**: 14.80 kB -- **HomePage Chunk**: 4.31 kB -- **Total Gzipped**: ~250 kB (estimated) - -### Current Optimizations Present ✅ -- ✅ Lazy loading below-the-fold sections (HomePage) -- ✅ Code splitting by vendor (React, Animation, Router) -- ✅ Suspense with fallback shimmer loaders -- ✅ Intersection Observer for viewport-based loading -- ✅ CSS minification enabled -- ✅ Target ES2020 (modern browsers) - ---- - -## Performance Improvement Opportunities - -### 🎯 Priority 1: High Impact (Quick Wins) - -#### 1.1 Optimize Vite Build Configuration -**Impact**: -10-15% bundle, faster builds, better caching - -```typescript -// Improvements to implement: -- Add brotli compression configuration -- Implement terser minification with better options -- Enable experimental features (optimizeDeps inline, preloadModule) -- Add reportCompressedSize for better metrics -- Optimize asset inlining thresholds -``` - -#### 1.2 Add Component Memoization -**Impact**: -5-10% render time for repeated components - -```typescript -// Components that benefit from React.memo(): -- AnimatedList items (render multiple times) -- ServiceCard / ProcessStep (render in loops) -- Section components (stable props) -- AnimatedText (expensive animations) -``` - -#### 1.3 Add Web Vitals Monitoring -**Impact**: Real-time performance visibility - -```typescript -// Metrics to track: -- LCP (Largest Contentful Paint) - Target: < 2.5s -- FID (First Input Delay) - Target: < 100ms -- CLS (Cumulative Layout Shift) - Target: < 0.1 -- TTFB (Time to First Byte) -- INP (Interaction to Next Paint) -``` - -#### 1.4 Optimize Font Loading Strategy -**Impact**: -100-200ms LCP improvement - -```typescript -// Improvements: -- Add font-display: swap for Tailwind fonts -- Preload critical fonts in -- Implement font subsetting for specific glyphs -- Use system fonts as fallback -``` - ---- - -### 🎯 Priority 2: Medium Impact (Implementation) - -#### 2.1 Improve Dynamic Import Strategy -**Impact**: -5% initial load, better code splitting - -```typescript -// Optimize dynamic imports in HomePage: -- Use route-based prefetching -- Implement dynamic import retry logic -- Add chunk preloading on route navigation -``` - -#### 2.2 Cache Busting Strategy -**Impact**: Better long-term caching - -```typescript -// Improvements: -- Configure cache headers for vendor chunks (1 year) -- Configure cache headers for main chunks (7 days) -- Use service worker for offline support -``` - -#### 2.3 Image & Asset Optimization -**Impact**: -5-20% asset size - -```typescript -// Improvements: -- Convert images to WebP with fallbacks -- Implement lazy loading for images below fold -- Optimize SVG assets (remove metadata, minify) -- Use srcset for responsive images -``` - ---- - -### 🎯 Priority 3: Advanced Optimization - -#### 3.1 Implement Service Worker -**Impact**: Offline support, faster repeat visits - -```typescript -// Strategy: -- Cache vendor chunks permanently -- Cache pages for 7 days -- Network-first for HTML -- Cache-first for assets -``` - -#### 3.2 HTTP/2 Server Push -**Impact**: -50-100ms for critical resources - -```typescript -// Resources to push: -- React vendor chunk -- CSS files -- Critical fonts -``` - -#### 3.3 Tree Shaking Optimization -**Impact**: -2-5% bundle size - -```typescript -// Improvements: -- Review underscore.js usage (consider lodash-es) -- Remove unused CSS utilities -- Dead code elimination in dev dependencies -``` - ---- - -## Implementation Roadmap - -### Phase 1: Vite & Build Optimization (Estimated: 30 mins) -1. Enhance vite.config.ts with compression & advanced options -2. Update TypeScript for better tree shaking -3. Run build and measure improvements -4. Update .gitignore for build artifacts - -### Phase 2: Component Optimization (Estimated: 45 mins) -1. Add React.memo() to list item components -2. Optimize AnimatedList with memoized items -3. Add profiler debugging in dev mode -4. Test with React DevTools Profiler - -### Phase 3: Web Vitals & Monitoring (Estimated: 20 mins) -1. Install web-vitals library -2. Create performance reporting hook -3. Add CWV tracking to analytics -4. Create performance dashboard component - -### Phase 4: Asset Optimization (Estimated: 30 mins) -1. Create font optimization plan -2. Add image lazy loading strategy -3. Configure srcset for responsive images -4. Implement WebP with fallbacks - -### Phase 5: Caching Strategy (Estimated: 20 mins) -1. Configure cache headers -2. Implement service worker -3. Set up offline fallback page -4. Test caching behavior - ---- - -## Performance Targets (Core Web Vitals) - -| Metric | Current | Target | Impact | -|--------|---------|--------|--------| -| LCP | ~2.8s | < 2.5s | Reduce animation vendor | -| FID | ~80ms | < 100ms| Add memoization | -| CLS | ~0.05 | < 0.1 | Maintain current | -| TTFB | ~500ms | < 600ms| CDN/hosting | -| Bundle | ~250kb | ~200kb | Tree shaking | - ---- - -## Quick Start Commands - -```bash -# Build with new optimizations -npm run build - -# Analyze bundle size -npm run build -- --sourcemap - -# Profile performance in dev -npm run dev - -# Check TypeScript optimization -npm run type-check - -# Run linting -npm run lint -``` - ---- - -## Expected Improvements - -### After Phase 1 (Build Optimization) -- **Bundle Size**: 250kb → 220kb (-12%) -- **Build Time**: 14.7s → 12s (-18%) -- **Compression**: Better Brotli efficiency - -### After Phase 2 (Component Optimization) -- **Render Time**: -30% for list components -- **Memory Usage**: -5-10% from memoization -- **Reflow/Repaint**: -20% from stable components - -### After Phase 3 (Web Vitals) -- **LCP**: 2.8s → 2.4s (-14%) -- **FID**: 80ms → <50ms (-37%) -- **CLS**: Maintain <0.05 - -### After Phase 4 (Assets) -- **Asset Size**: -5-20% from optimization -- **LCP**: Additional -100-200ms -- **Resource Loading**: Parallel optimization - -### After Phase 5 (Caching) -- **Repeat Visitor**: -70% load time -- **Offline Support**: Full offline experience -- **Cache Hit Rate**: >95% for vendors - ---- - -## Monitoring & Reporting - -### Tools to Integrate -- **web-vitals**: Real user metrics -- **React DevTools Profiler**: Component performance -- **Lighthouse CI**: Automated audits -- **Bundle Analyzer**: Visual bundle breakdown - -### KPIs to Track -- Core Web Vitals (LCP, FID, CLS) -- JavaScript evaluation time -- CSS parsing time -- Time to interactive (TTI) -- Cache hit ratio - ---- - -## Notes & Considerations - -✅ **Keep in mind:** -- Portfolio site with low complexity = faster optimizations -- Framer Motion is expensive (98.52 kB) but provides critical UX value -- Already using lazy loading effectively -- Good code splitting strategy in place - -⚠️ **Be careful with:** -- Don't over-optimize at cost of maintainability -- Keep animations smooth (Framer Motion is worth it) -- Don't sacrifice UX for bundle size -- Monitor actual user performance (not just lab metrics) - -💡 **Recommended Next Steps:** -1. Implement Phase 1 (Vite optimizations) - highest ROI -2. Implement Phase 2 (Component memoization) - easy wins -3. Add Phase 3 (Web Vitals monitoring) - measure improvements -4. Consider Phase 4-5 only if needed after measurement diff --git a/PERFORMANCE_OPTIMIZATION_REPORT.md b/PERFORMANCE_OPTIMIZATION_REPORT.md deleted file mode 100644 index 7dadfb5..0000000 --- a/PERFORMANCE_OPTIMIZATION_REPORT.md +++ /dev/null @@ -1,317 +0,0 @@ -# Performance Optimization Implementation Report - -**Date**: December 24, 2025 -**Status**: ✅ Phase 1 Complete - Ready for Phase 2 - ---- - -## Executive Summary - -Successfully implemented **Phase 1 Performance Optimizations** for grwm.dev portfolio. Current bundle is optimized with compression, advanced minification, and real-time performance monitoring. Build time reduced and all metrics are tracked automatically. - ---- - -## Phase 1: Build & Monitoring Optimization ✅ COMPLETED - -### 1.1 Vite Configuration Enhancements ✅ - -**Changes Made:** -- ✅ Added Gzip compression (`vite-plugin-compression` with gzip algorithm) -- ✅ Added Brotli compression (high-quality, modern browsers) -- ✅ Configured Terser minification with aggressive options: - - `drop_console: true` - removes dev console logs in production - - `drop_debugger: true` - removes debugger statements - - `passes: 2` - multi-pass minification for smaller output - - `mangle: true` - compact variable names - -**Impact:** -``` -Before: 250+ kB raw bundle -After: ~200 kB raw + Gzip/Brotli compression -Gzip: ~116 kB total (React + Animation + Vendor + Assets) -``` - -**Bundle Breakdown (Production Build):** -- React Vendor: 178.50 kB (57.17 kB gzipped) -- Animation Vendor (Framer Motion): 98.58 kB (31.97 kB gzipped) -- Other Vendors: 66.46 kB (21.60 kB gzipped) -- Application Code: 11.55 kB (4.06 kB gzipped) -- CSS: 14.99 kB (3.91 kB gzipped) -- HTML: 5.32 kB (1.54 kB gzipped) - -**Total Gzipped Size: ~120 kB** (down from ~250 kB raw) - -### 1.2 Bundle Visualization ✅ - -**New Feature:** -```bash -npm run build:analyze -``` - -This command generates an interactive bundle size visualization at `dist/stats.html` showing: -- Which modules contribute most to bundle size -- Opportunity areas for further optimization -- Dependency relationships - -### 1.3 Web Vitals Monitoring ✅ - -**New Hook: `useWebVitals`** - -Created comprehensive performance monitoring hook at `src/shared/hooks/useWebVitals.ts` that tracks: - -| Metric | Target | What It Measures | -|--------|--------|------------------| -| **LCP** | < 2.5s | Largest Contentful Paint - when main content loads | -| **FCP** | < 1.8s | First Contentful Paint - when first pixels render | -| **CLS** | < 0.1 | Cumulative Layout Shift - visual stability | -| **INP** | < 200ms | Interaction to Next Paint - responsiveness | - -**Features:** -- 📊 Automatic tracking on page load -- 📈 Google Analytics integration (`gtag` events) -- 🔍 Development logging for debugging -- ⚡ Zero production overhead (lightweight) -- 🎯 Per-route performance visibility - -**Integrated Into:** -- Root route (`src/routes/__root.tsx`) -- Automatically monitored on all pages -- Metrics sent to Google Analytics in real-time - -**How to View Metrics:** -1. Open your website -2. Check Google Analytics → Engagement → Web Vitals -3. See real-time performance data from actual users - -### 1.4 New npm Scripts ✅ - -```bash -npm run build # Standard production build -npm run build:analyze # Build + generate bundle analysis (stats.html) -npm run dev # Development server -npm run type-check # TypeScript validation -npm run lint # ESLint + formatting -``` - ---- - -## Performance Gains Summary - -### Build Performance -| Metric | Before | After | Improvement | -|--------|--------|-------|------------| -| Build Time | 14.72s | 18.48s* | Bundle analysis adds ~3.8s | -| Raw Bundle | 250+ kB | ~200 kB | -20% size reduction | -| Gzipped Bundle | ~250 kB | ~120 kB | -52% compression ratio | -| Number of Chunks | 14 | 14 | Same (optimal) | - -*Build time includes new compression & analysis plugins (can be disabled) - -### Runtime Performance -- ✅ **LCP**: Optimized through lazy loading (already implemented) -- ✅ **FID**: Monitored for first input delay -- ✅ **CLS**: Tracked to ensure visual stability -- ✅ **INP**: New metric for interaction responsiveness - ---- - -## Files Modified - -### Configuration Files -1. **vite.config.ts** - Major enhancements: - - Compression plugins configuration - - Terser minification options - - Bundle visualization setup - - Optimized dependency pre-bundling - -2. **package.json** - New dependencies: - - `vite-plugin-compression` (Gzip + Brotli) - - `rollup-plugin-visualizer` (bundle analysis) - - `web-vitals` (performance monitoring) - - `terser` (minification) - -### New Hook Files -1. **src/shared/hooks/useWebVitals.ts** - Web Vitals tracking -2. **src/shared/hooks/useWebVitals.test.ts** - Tests - -### Updated Route Files -1. **src/routes/__root.tsx** - Added Web Vitals monitoring - ---- - -## Real-World Impact - -### What Users Will Experience -1. ✅ **Faster Initial Load**: Smaller compressed bundles -2. ✅ **Better Performance Tracking**: Real-time metrics in analytics -3. ✅ **Same Functionality**: No features removed -4. ✅ **Better Stability**: Monitoring helps identify regressions - -### What Developers Will Experience -1. ✅ **Clear Performance Data**: Use `npm run build:analyze` -2. ✅ **Performance Tracking**: Built-in Web Vitals monitoring -3. ✅ **Production Optimization**: Aggressive minification enabled -4. ✅ **Fast Compression**: Gzip + Brotli for all static assets - ---- - -## Next Steps: Phase 2 Optimization Opportunities - -### Ready for Implementation (High Priority) - -#### 1. React.memo for List Components -```typescript -// Add memoization to prevent re-renders -export const ServiceCard = React.memo(({ service }) => (...)) -export const ProcessStep = React.memo(({ step }) => (...)) -export const AnimatedListItem = React.memo(({ item }) => (...)) - -// Expected Impact: -5-10% render time -``` - -#### 2. Image & Font Optimization -```typescript -// Implement lazy loading for images - - -// Add font preloading in HTML head - - -// Expected Impact: -100-200ms LCP -``` - -#### 3. Dynamic Import Optimization -```typescript -// Add route prefetching on hover - prefetchRoute('/page')} /> - -// Expected Impact: -50-100ms navigation time -``` - -#### 4. Service Worker for Caching -```typescript -// Offline support + long-term caching -// Cache vendor chunks forever (they have hash) -// Cache pages for 7 days -// Network-first for HTML - -// Expected Impact: -70% repeat visitor load time -``` - ---- - -## Performance Baseline for Monitoring - -Use these metrics as baseline for future optimizations: - -``` -Current Web Vitals Targets (After Phase 1): -- LCP: ~2.4s (good) -- FCP: ~1.8s (good) -- CLS: ~0.05 (excellent) -- INP: <100ms (good) -- Bundle Size (gzipped): ~120 kB -- Build Time: ~18s (with analysis) -``` - ---- - -## Configuration Reference - -### Compression Settings -- **Gzip**: Default compression, all browsers -- **Brotli**: Better compression, modern browsers (Chrome, Firefox, Edge) -- **Threshold**: 10KB (only compress files > 10KB) - -### Minification Settings -- **Algorithm**: Terser (best for JavaScript) -- **Passes**: 2 (aggressive optimization) -- **Remove Console**: Yes (production only) -- **Mangle Names**: Yes (compact variables) - -### Build Optimization -- **Target**: ES2020 (modern JavaScript, smaller output) -- **Sourcemaps**: Disabled in production -- **Report Compressed Size**: Enabled (see bundle sizes) - ---- - -## Testing the Optimizations - -### 1. View Bundle Analysis -```bash -npm run build:analyze -# Opens dist/stats.html with interactive bundle visualization -``` - -### 2. Check Performance Metrics -```bash -# In production: -# Go to Google Analytics → Engagement → Web Vitals -# See real-time LCP, FID, CLS metrics -``` - -### 3. Verify Compression -```bash -# Check dist folder for .gz and .br files -ls -la dist/assets/js/*.br -ls -la dist/assets/js/*.gz -``` - -### 4. Test Locally -```bash -npm run build # Creates optimized dist/ -npm run preview # Preview production build locally -``` - ---- - -## Troubleshooting - -### Issue: Build takes longer -**Solution**: Compression adds ~3-4 seconds. Disable in dev if needed by setting `compression({ disable: true })` for dev builds. - -### Issue: Browser doesn't support Brotli -**Solution**: Fallback to Gzip automatic in all browsers. Brotli is optional enhancement. - -### Issue: Large chunk warnings -**Solution**: Expected for React + Framer Motion. Chunks are already optimized through code splitting. - -### Issue: Web Vitals not showing in GA -**Solution**: Ensure GA tracking is enabled and `gtag` is loaded globally. - ---- - -## Success Metrics - -✅ **Phase 1 Completed:** -- Bundle size optimized with compression -- Build minification aggressive -- Web Vitals monitoring integrated -- Analytics tracking enabled -- Bundle analysis tooling added - -📊 **Measurable Improvements:** -- Gzipped bundle: -52% (250→120 kB) -- Raw bundle: -20% (250→200 kB) -- Real-time performance tracking: ✅ Active -- Build pipeline: ✅ Optimized - -🎯 **Next Phase Ready:** -- React.memo implementation -- Image/font optimization -- Dynamic import prefetching -- Service worker caching - ---- - -## Conclusion - -Successfully implemented comprehensive performance optimization for the portfolio. The site now has: -- ✅ Aggressive production minification -- ✅ Intelligent compression (Gzip + Brotli) -- ✅ Real-time performance monitoring -- ✅ Bundle analysis visualization -- ✅ Ready for Phase 2 optimizations - -The foundation is set for continued improvements with clear metrics and monitoring in place. diff --git a/README.md b/README.md deleted file mode 100644 index c1a6099..0000000 --- a/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# grwm.dev — Homepage - -A modern, performant React portfolio built with **TypeScript**, **Vite**, **React 18**, **TanStack Router**, and **Tailwind CSS**, following **Domain-Driven Design** and **clean code practices**. - -## Architecture - -This project follows **Domain-Driven Design (DDD)** principles, organizing code by business domains rather than technical layers. Each domain is self-contained with its own components, data, and logic. - -### Tech Stack - -- **TypeScript** - Type safety and better developer experience -- **Vite** - Fast build tool and dev server -- **React 18** - UI framework with latest features -- **TanStack Router** - Type-safe routing with zero-config -- **Tailwind CSS** - Utility-first CSS framework -- **Framer Motion** - Animation library -- **Standard JS** - JavaScript style guide -- **TS Standard** - TypeScript style guide - -### Project Structure - -\\\ -src/ -├── domains/ # Business domains (DDD) -│ ├── hero/ # Hero section domain -│ ├── audience/ # Target audience domain -│ ├── services/ # Services domain -│ ├── process/ # Process flow domain -│ ├── about/ # About section domain -│ ├── cta/ # Call-to-action domain -│ └── layout/ # Layout components domain -├── routes/ # TanStack Router routes -├── pages/ # Page components -├── shared/ # Shared resources -├── router.tsx # Router configuration -└── main.tsx # Application entry point -\\\ - -## Getting Started - -### Prerequisites -- Node.js (v18 or higher) -- npm or yarn - -### Installation -\\\ash -npm install -npm run dev -\\\ - -### Build for Production -\\\ash -npm run build -\\\ - -## Available Scripts - -- \ -pm run dev\ - Start development server -- \ -pm run build\ - Build for production -- \ -pm run preview\ - Preview production build -- \ -pm run test\ - Run tests in watch mode -- \ -pm run test:run\ - Run tests once -- \ -pm run lint\ - Lint and fix code -- \ -pm run type-check\ - Type check TypeScript - -## Code Quality - -- **Linting**: ESLint with StandardJS + TS Standard (enforced on staged files) -- **Formatting**: Standard + TS Standard (automatic fixing) -- **Type Safety**: TypeScript strict mode enforced - -## Performance Features - -- Lazy loading of below-fold sections -- Code splitting by domain -- Shimmer loaders for better UX -- Intersection Observer-based viewport loading -- Optimized vendor chunks - -## License - -Private project diff --git a/SEO.md b/SEO.md deleted file mode 100644 index a746013..0000000 --- a/SEO.md +++ /dev/null @@ -1,177 +0,0 @@ -# SEO Optimization Guide - -## Overview - -This application is fully optimized for search engines with comprehensive SEO implementation including meta tags, structured data, sitemap, and robots.txt. - -## SEO Features - -### 1. Meta Tags - -**Basic Meta Tags:** -- Title (optimized per page) -- Description (unique per page) -- Keywords (relevant keywords) -- Author -- Robots (index, follow) -- Language -- Theme color - -**Open Graph Tags:** -- og:title -- og:description -- og:type -- og:url -- og:image -- og:site_name -- og:locale - -**Twitter Card Tags:** -- twitter:card -- twitter:title -- twitter:description -- twitter:image - -### 2. Structured Data (JSON-LD) - -Implemented structured data for: -- **Organization**: Company information -- **WebSite**: Website metadata -- **Person**: Mentor profile -- **Service**: Mentoring service details -- **FAQPage**: FAQ structured data (when needed) -- **BreadcrumbList**: Navigation breadcrumbs (when needed) - -### 3. Robots.txt - -Located at `/public/robots.txt`: -- Allows all search engines -- Disallows admin and API routes -- Points to sitemap location -- Configurable crawl delay - -### 4. Sitemap.xml - -Located at `/public/sitemap.xml`: -- Lists all important pages -- Includes lastmod, changefreq, priority -- Automatically discoverable by search engines - -### 5. Canonical URLs - -- Every page has a canonical URL -- Prevents duplicate content issues -- Points to the preferred version of the page - -### 6. Semantic HTML - -- Proper heading hierarchy (h1, h2, h3) -- Semantic HTML5 elements -- ARIA labels where appropriate -- Alt text for images (when added) - -## Implementation - -### Using SEO Component - -```typescript -import { SEO } from '@shared/components/SEO'; - - -``` - -### Generating Structured Data - -```typescript -import { - generateOrganizationStructuredData, - generateWebSiteStructuredData, -} from '@shared/utils/seo'; - -const structuredData = [ - generateOrganizationStructuredData(), - generateWebSiteStructuredData(), -]; -``` - -## SEO Best Practices - -1. **Unique Titles**: Each page has a unique, descriptive title -2. **Meta Descriptions**: Compelling descriptions under 160 characters -3. **Keywords**: Relevant keywords (though less important now) -4. **Structured Data**: Rich snippets for better search results -5. **Mobile-Friendly**: Responsive design (already implemented) -6. **Fast Loading**: Performance optimizations (already implemented) -7. **HTTPS**: Secure connection (required for production) -8. **Accessibility**: Semantic HTML and ARIA labels - -## Testing SEO - -### Tools to Use: -1. **Google Search Console**: Monitor search performance -2. **Google Rich Results Test**: Test structured data -3. **Facebook Sharing Debugger**: Test Open Graph tags -4. **Twitter Card Validator**: Test Twitter cards -5. **Lighthouse SEO Audit**: Check SEO score - -### Checklist: -- [ ] All pages have unique titles -- [ ] All pages have meta descriptions -- [ ] Structured data validates correctly -- [ ] Robots.txt is accessible -- [ ] Sitemap.xml is accessible -- [ ] Canonical URLs are set -- [ ] Open Graph tags work -- [ ] Twitter cards work -- [ ] Mobile-friendly (responsive) -- [ ] Fast loading (performance optimized) - -## Updating Sitemap - -When adding new pages, update `/public/sitemap.xml`: - -```xml - - https://grwm.dev/new-page - 2024-01-01 - weekly - 0.8 - -``` - -## Updating Robots.txt - -If you need to block specific paths: - -``` -Disallow: /private-path/ -``` - -## Social Media Images - -Create Open Graph images (1200x630px) and place them in `/public/`: -- `og-image.jpg` - Default OG image -- Update `ogImage` prop in SEO component for page-specific images - -## Monitoring - -1. Set up Google Search Console -2. Monitor search rankings -3. Track click-through rates -4. Monitor Core Web Vitals -5. Check for crawl errors - -## Future Enhancements - -1. Blog/Content pages with article structured data -2. FAQ page with FAQ structured data -3. Reviews/Testimonials with Review structured data -4. Local SEO (if applicable) -5. Multilingual support (hreflang tags) - diff --git a/SETUP.md b/SETUP.md deleted file mode 100644 index 4494b0b..0000000 --- a/SETUP.md +++ /dev/null @@ -1,55 +0,0 @@ -# Setup Instructions - -## Initial Setup - -After cloning the repository, run the following commands: - -```bash -# Install dependencies -npm install - -# Initialize Husky (Git hooks) -npm run prepare - -# Generate TanStack Router route tree -npm run dev -``` - -## Pre-commit Hooks - -Husky is configured to run the following checks before every commit: - -1. **Linting** - Standard JS and TS Standard -2. **Formatting** - Automatic code formatting -3. **Type Checking** - TypeScript type validation -4. **Unit Tests** - All tests must pass -5. **Code Coverage** - Minimum 80% coverage required - -## First Time Setup - -1. Install dependencies: `npm install` -2. Husky will be installed automatically via `prepare` script -3. Run `npm run dev` to generate route tree for TanStack Router -4. All pre-commit hooks will be active - -## Troubleshooting - -### Route Tree Not Generated -If you see errors about `routeTree.gen.ts`, run: -```bash -npm run dev -``` -This will generate the route tree automatically. - -### Husky Not Working -If pre-commit hooks aren't running: -```bash -npm run prepare -``` - -### Coverage Check Failing -Ensure you have at least 80% code coverage: -```bash -npm run test:coverage -``` - diff --git a/VISUAL_SUMMARY.txt b/VISUAL_SUMMARY.txt deleted file mode 100644 index a501d10..0000000 --- a/VISUAL_SUMMARY.txt +++ /dev/null @@ -1,400 +0,0 @@ -# Visual Enhancements - At a Glance - -## 🎨 The 8 Enhancements - -``` -┌─────────────────────────────────────────────────────────────┐ -│ │ -│ ✨ 1. GLOBAL GRADIENT BACKGROUND │ -│ Off-white → Gray → Slate with noise texture │ -│ Creates sophisticated, calm backdrop │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 2. HERO SPOTLIGHT GLOW │ -│ Soft blue radial gradient behind headline │ -│ Naturally guides attention without being obvious │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 3. SCROLL FADE-IN ANIMATIONS │ -│ Sections fade in + slide up as user scrolls │ -│ Makes page feel alive and rewarding │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 4. ALTERNATING SECTION BACKGROUNDS │ -│ White → Gray → Slate → Gray → White pattern │ -│ Creates visual rhythm and guides eye │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 5. CARD HOVER ELEVATION │ -│ Cards lift 4px + shadow expands + border highlights │ -│ Signals interactivity with tactile feedback │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 6. BUTTON HOVER LIFT │ -│ Buttons lift 2px + shadow enhances smoothly │ -│ Premium feel, clear clickability │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 7. ENHANCED PROCESS STEPS │ -│ Left blue border + gradient numbers + hover states │ -│ Clear visual progression through process │ -│ │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ✨ 8. FULL ACCESSIBILITY SUPPORT │ -│ All animations respect prefers-reduced-motion │ -│ Inclusive design for all users │ -│ │ -└─────────────────────────────────────────────────────────────┘ -``` - ---- - -## 📊 By The Numbers - -``` -Files Modified: 7 files -New CSS: 93 lines -Total Documentation: ~1,950 lines -Performance Impact: 0% (negative) -Accessibility Rating: WCAG 2.1 AA ✅ -Browser Support: All modern browsers ✅ -Dependencies Added: 0 -Breaking Changes: 0 -``` - ---- - -## 🎯 Design Philosophy - -``` -What We Created Why It Matters -═══════════════════════════════════════════════════ - -CALM AESTHETIC → Builds trust, reduces cognitive load -SUBTLE EFFECTS → Enhances without distracting -MENTOR-LIKE FEEL → Professional yet approachable -ACCESSIBLE FIRST → Inclusive for all users -PERFORMANT → Smooth on all devices -THOUGHTFUL DESIGN → Every element serves a purpose -``` - ---- - -## 🚀 Implementation Status - -``` -ENHANCEMENT STATUS FILES -═══════════════════════════════════════════════════════ -1. Global Background ✅ DONE index.css, App.tsx -2. Hero Spotlight Glow ✅ DONE HeroSection.tsx -3. Scroll Animations ✅ DONE Section.tsx -4. Alternating Backgrounds ✅ DONE Section.tsx -5. Card Hover Elevation ✅ DONE ServiceCard.tsx -6. Button Hover Lift ✅ DONE Button.tsx -7. Enhanced Process Steps ✅ DONE ProcessStep.tsx -8. Accessibility Support ✅ DONE index.css - -STATUS: ✅ ALL COMPLETE & PRODUCTION-READY -``` - ---- - -## 📈 Visual Impact Timeline - -``` -BEFORE AFTER -════════════════════════════════════════════════════ - -Plain white → Gradient + noise -Flat sections → Alternating tones -Static content → Fade-in animations -No focus → Hero spotlight -Plain cards → Elevated on hover -Basic buttons → Premium lift -Simple steps → Accent borders -No accessibility → Full WCAG AA - -FEELING: -Blank, static, bland → Thoughtful, engaging, professional -``` - ---- - -## 🎨 Color Palette - -``` -BACKGROUND: - #fafbfc ░░░░░░░░░░░ Off-white (gradient start) - #f3f4f6 ░░░░░░░░░░░ Light gray (gradient middle) - #eef1f5 ░░░░░░░░░░░ Soft slate (gradient end) - -ACCENTS: - #3b82f6 ░░░░░░░░░░░ Blue (hero glow, borders) - rgba(59, 130, 246, 0.08) ░░░ Hero glow (8% opacity) - rgba(59, 130, 246, 0.15) ░░░ Card border (15% opacity) - -SHADOWS: - rgba(0, 0, 0, 0.05) ░░░░░░ Subtle (borders) - rgba(0, 0, 0, 0.08) ░░░░░░ Light (card hover) - rgba(0, 0, 0, 0.15) ░░░░░░ Medium (button hover) -``` - ---- - -## ⏱️ Animation Timings - -``` -FADE-IN (Scroll): 0.6s ease-out -CARD HOVER: 0.3s cubic-bezier(0.4, 0, 0.2, 1) -BUTTON HOVER: 0.2s cubic-bezier(0.4, 0, 0.2, 1) -PROCESS HOVER: 0.3s transition-all -SMOOTH SCROLL: Enabled - -All animations respect prefers-reduced-motion -``` - ---- - -## 🧪 Testing Checklist - -``` -VISUAL TESTS: - ✓ Gradient background visible - ✓ Hero spotlight glow behind headline - ✓ Sections fade in on scroll - ✓ Background colors alternate - ✓ Cards lift on hover - ✓ Buttons have smooth lift - ✓ Process steps show borders - -INTERACTION TESTS: - ✓ Smooth transitions (no janky) - ✓ Hover effects responsive - ✓ All animations eased (not linear) - -ACCESSIBILITY TESTS: - ✓ prefers-reduced-motion supported - ✓ WCAG AA color contrasts - ✓ Keyboard navigation unchanged - ✓ Screen readers unaffected - -PERFORMANCE TESTS: - ✓ No LCP impact - ✓ No CLS shift - ✓ Lighthouse ≥ 90 - ✓ GPU-accelerated -``` - ---- - -## 🎯 Quick Start - -``` -1. VIEW THE CHANGES: - npm run dev - # Visit http://localhost:5174/ - -2. UNDERSTAND WHAT CHANGED: - Read SUMMARY.md (10 minutes) - -3. DIVE DEEPER: - Read VISUAL_ENHANCEMENTS.md (20 minutes) - -4. VERIFY EVERYTHING WORKS: - Follow IMPLEMENTATION_CHECKLIST.md - -5. DEPLOY WITH CONFIDENCE: - npm run build -``` - ---- - -## 📚 Documentation Files - -``` -START HERE: - └─ SUMMARY.md (10 min read) - -DETAILED GUIDES: - ├─ VISUAL_ENHANCEMENTS.md (20 min read) - ├─ CSS_REFERENCE.md (10 min read) - ├─ BEFORE_AFTER_COMPARISON.md (15 min read) - └─ VISUAL_ENHANCEMENTS_QUICK_REF.md (5 min read) - -TESTING & VERIFICATION: - └─ IMPLEMENTATION_CHECKLIST.md (10 min read) - -NAVIGATION: - └─ DOCUMENTATION_INDEX.md (This file) -``` - ---- - -## ✨ Key Features - -``` -PERFORMANCE: - ✓ No new JavaScript - ✓ ~2.8KB CSS added - ✓ GPU-accelerated animations - ✓ Zero impact on LCP/CLS - ✓ Lighthouse 90+ - -ACCESSIBILITY: - ✓ WCAG 2.1 Level AA compliant - ✓ prefers-reduced-motion supported - ✓ No animation-dependent content - ✓ Keyboard navigation preserved - ✓ Screen reader friendly - -BROWSER SUPPORT: - ✓ Chrome/Edge 95+ - ✓ Firefox 91+ - ✓ Safari 15+ - ✓ Mobile browsers (iOS, Android) - ✓ All modern browsers - -MAINTAINABILITY: - ✓ CSS-first approach - ✓ Well-documented - ✓ Zero breaking changes - ✓ Easy to modify - ✓ Production-ready -``` - ---- - -## 🎉 Result - -``` -┌──────────────────────────────────────────────────┐ -│ │ -│ YOUR LANDING PAGE NOW FEELS: │ -│ │ -│ ✓ Thoughtful and intentional │ -│ ✓ Trustworthy and professional │ -│ ✓ Calm and focused (mentor-like) │ -│ ✓ Engaging without being flashy │ -│ ✓ Interactive with tactile feedback │ -│ ✓ Accessible to all users │ -│ ✓ Smooth and premium │ -│ ✓ Performance-optimized │ -│ │ -│ → Perfect for a developer mentoring site ← │ -│ │ -└──────────────────────────────────────────────────┘ -``` - ---- - -## 🚀 Production Ready - -``` -✅ Code Quality: Excellent -✅ Performance: Zero impact (or better) -✅ Accessibility: WCAG AA compliant -✅ Browser Support: All modern browsers -✅ Documentation: Comprehensive -✅ Testing: Complete checklist -✅ Deployment: Ready to ship - -STATUS: PRODUCTION-READY ✨ -``` - ---- - -## 📊 File Changes Summary - -``` -FILE CHANGE TYPE IMPACT -═════════════════════════════════════════════════════════ -src/index.css +93 lines +2.8KB CSS -src/App.tsx 1 line change Visual only -src/domains/hero/... - HeroSection.tsx Enhanced +spotlight -src/shared/components/ - Section/Section.tsx Enhanced +animations - Button/Button.tsx Enhanced +hover -src/domains/services/ - ServiceCard.tsx Enhanced +hover -src/domains/process/ - ProcessSection.tsx 1 line change +slate bg - ProcessStep.tsx Enhanced +borders - -TOTAL CHANGES: 7 files modified | 0 breaking changes -``` - ---- - -## 🎯 Success Metrics - -``` -BEFORE AFTER -═══════════════════════════════════════════════════ -Blank appearance → Visually composed -Flat sections → Clear hierarchy -No engagement → Engaging animations -Plain cards → Interactive cards -Basic buttons → Premium buttons -No accessibility → WCAG AA compliant -Static feeling → Thoughtful design - -RESULT: ✅ Landing page transformed successfully -``` - ---- - -## 🔮 Future Enhancements (Optional) - -``` -EASY ADDITIONS: - - Dark mode support - - Custom cursor pointer - - Micro-interactions on first CTA click - -MODERATE ADDITIONS: - - Skeleton screens for images - - Lazy image loading - - Image blur-up effect - -ADVANCED ADDITIONS: - - Interactive scroll reveal - - Animated background shapes - - Advanced accessibility features -``` - ---- - -## 📞 Need Help? - -``` -QUESTIONS? → Check DOCUMENTATION_INDEX.md -CSS DETAILS? → See CSS_REFERENCE.md -VISUAL COMPARISON? → Read BEFORE_AFTER_COMPARISON.md -TESTING HELP? → Follow IMPLEMENTATION_CHECKLIST.md -QUICK LOOKUP? → Use VISUAL_ENHANCEMENTS_QUICK_REF.md -FULL DETAILS? → Read VISUAL_ENHANCEMENTS.md -``` - ---- - -## ✨ Thank You! - -All enhancements are: -- ✅ Complete -- ✅ Tested -- ✅ Documented -- ✅ Ready for production - -**Your landing page is now ready to impress! 🚀** - ---- - -*Created with ❤️ for grwm.dev* diff --git a/assets/AnimatedList-DZ_-hrH2.js b/assets/AnimatedList-DZ_-hrH2.js new file mode 100644 index 0000000..286ce92 --- /dev/null +++ b/assets/AnimatedList-DZ_-hrH2.js @@ -0,0 +1 @@ +import{R as e,j as i}from"./index-DN8smlv-.js";import{m as a,c as s,a as m}from"./HomePage-DBMzW8f9.js";const t=e.memo(({item:e,index:s,renderItem:m,itemClassName:t,itemVariants:n})=>i.jsx(a.li,{variants:n,className:t,children:m(e,s)},e.id),(e,i)=>e.item.id===i.item.id&&e.itemClassName===i.itemClassName&&e.index===i.index);t.displayName="AnimatedListItem";const n=e.memo(function({items:e,renderItem:n,containerClassName:r="",itemClassName:l="",containerVariants:d,itemVariants:o}){const c=null!=d||s(.1),x=null!=o||m();return i.jsx(a.ul,{variants:c,initial:"hidden",whileInView:"visible",viewport:{once:!0},className:r,children:e.map((e,a)=>i.jsx(t,{item:e,index:a,renderItem:n,itemClassName:l,itemVariants:x},e.id))})});export{n as A}; diff --git a/assets/HomePage-DBMzW8f9.js b/assets/HomePage-DBMzW8f9.js new file mode 100644 index 0000000..3082cca --- /dev/null +++ b/assets/HomePage-DBMzW8f9.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DX5Rk45i.js","assets/index-DN8smlv-.js","assets/index-NoJfpD4e.css","assets/Section-D2lu-9JN.js","assets/AnimatedList-DZ_-hrH2.js","assets/index-BZNpZnn4.js","assets/index-BZ3_gtGe.js","assets/index-_14G4Foq.js","assets/socialLinksData-e0AaDjNs.js","assets/index-CYjllIGK.js","assets/index-DUJfonJs.js"])))=>i.map(i=>d[i]); +import{r as t,R as e,j as n,B as i,S as s,_ as o}from"./index-DN8smlv-.js";const r=t.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"}),a=t.createContext({}),l=t.createContext(null),u="undefined"!=typeof document,c=u?t.useLayoutEffect:t.useEffect,h=t.createContext({strict:!1}),d=t=>t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),p="data-"+d("framerAppearId");function m(t){return t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"current")}function f(t){return"string"==typeof t||Array.isArray(t)}function g(t){return null!==t&&"object"==typeof t&&"function"==typeof t.start}const y=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],v=["initial",...y];function x(t){return g(t.animate)||v.some(e=>f(t[e]))}function P(t){return Boolean(x(t)||t.variants)}function b(e){const{initial:n,animate:i}=function(t,e){if(x(t)){const{initial:e,animate:n}=t;return{initial:!1===e||f(e)?e:void 0,animate:f(n)?n:void 0}}return!1!==t.inherit?e:{}}(e,t.useContext(a));return t.useMemo(()=>({initial:n,animate:i}),[T(n),T(i)])}function T(t){return Array.isArray(t)?t.join(" "):t}const w={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},S={};for(const mr in w)S[mr]={isEnabled:t=>w[mr].some(e=>!!t[e])};const A=t.createContext({}),E=t.createContext({}),V=Symbol.for("motionComponentSymbol");function C({preloadedFeatures:e,createVisualElement:n,useRender:i,useVisualState:s,Component:o}){e&&function(t){for(const e in t)S[e]={...S[e],...t[e]}}(e);const d=t.forwardRef(function(d,f){let g;const y={...t.useContext(r),...d,layoutId:M(d)},{isStatic:v}=y,x=b(d),P=s(d,v);if(!v&&u){x.visualElement=function(e,n,i,s){const{visualElement:o}=t.useContext(a),u=t.useContext(h),d=t.useContext(l),m=t.useContext(r).reducedMotion,f=t.useRef();s=s||u.renderer,!f.current&&s&&(f.current=s(e,{visualState:n,parent:o,props:i,presenceContext:d,blockInitialAnimation:!!d&&!1===d.initial,reducedMotionConfig:m}));const g=f.current;t.useInsertionEffect(()=>{g&&g.update(i,d)});const y=t.useRef(Boolean(i[p]&&!window.HandoffComplete));return c(()=>{g&&(g.render(),y.current&&g.animationState&&g.animationState.animateChanges())}),t.useEffect(()=>{g&&(g.updateFeatures(),!y.current&&g.animationState&&g.animationState.animateChanges(),y.current&&(y.current=!1,window.HandoffComplete=!0))}),g}(o,P,y,n);const i=t.useContext(E),s=t.useContext(h).strict;x.visualElement&&(g=x.visualElement.loadFeatures(y,s,e,i))}return t.createElement(a.Provider,{value:x},g&&x.visualElement?t.createElement(g,{visualElement:x.visualElement,...y}):null,i(o,d,function(e,n,i){return t.useCallback(t=>{t&&e.mount&&e.mount(t),n&&(t?n.mount(t):n.unmount()),i&&("function"==typeof i?i(t):m(i)&&(i.current=t))},[n])}(P,x.visualElement,f),P,v,x.visualElement))});return d[V]=o,d}function M({layoutId:e}){const n=t.useContext(A).id;return n&&void 0!==e?n+"-"+e:e}function D(t){function e(e,n={}){return C(t(e,n))}if("undefined"==typeof Proxy)return e;const n=new Map;return new Proxy(e,{get:(t,i)=>(n.has(i)||n.set(i,e(i)),n.get(i))})}const j=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function R(t){return"string"==typeof t&&!t.includes("-")&&!!(j.indexOf(t)>-1||/[A-Z]/.test(t))}const k={};const L=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],B=new Set(L);function F(t,{layout:e,layoutId:n}){return B.has(t)||t.startsWith("origin")||(e||void 0!==n)&&(!!k[t]||"opacity"===t)}const O=t=>Boolean(t&&t.getVelocity),I={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},U=L.length;const N=t=>e=>"string"==typeof e&&e.startsWith(t),W=N("--"),_=N("var(--"),z=(t,e)=>e&&"number"==typeof t?e.transform(t):t,H=(t,e,n)=>Math.min(Math.max(n,t),e),$={test:t=>"number"==typeof t,parse:parseFloat,transform:t=>t},Y={...$,transform:t=>H(0,1,t)},X={...$,default:1},G=t=>Math.round(1e5*t)/1e5,q=/(-)?([\d]*\.?[\d])+/g,Z=/(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))/gi,K=/^(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))$/i;function J(t){return"string"==typeof t}const Q=t=>({test:e=>J(e)&&e.endsWith(t)&&1===e.split(" ").length,parse:parseFloat,transform:e=>`${e}${t}`}),tt=Q("deg"),et=Q("%"),nt=Q("px"),it=Q("vh"),st=Q("vw"),ot={...et,parse:t=>et.parse(t)/100,transform:t=>et.transform(100*t)},rt={...$,transform:Math.round},at={borderWidth:nt,borderTopWidth:nt,borderRightWidth:nt,borderBottomWidth:nt,borderLeftWidth:nt,borderRadius:nt,radius:nt,borderTopLeftRadius:nt,borderTopRightRadius:nt,borderBottomRightRadius:nt,borderBottomLeftRadius:nt,width:nt,maxWidth:nt,height:nt,maxHeight:nt,size:nt,top:nt,right:nt,bottom:nt,left:nt,padding:nt,paddingTop:nt,paddingRight:nt,paddingBottom:nt,paddingLeft:nt,margin:nt,marginTop:nt,marginRight:nt,marginBottom:nt,marginLeft:nt,rotate:tt,rotateX:tt,rotateY:tt,rotateZ:tt,scale:X,scaleX:X,scaleY:X,scaleZ:X,skew:tt,skewX:tt,skewY:tt,distance:nt,translateX:nt,translateY:nt,translateZ:nt,x:nt,y:nt,z:nt,perspective:nt,transformPerspective:nt,opacity:Y,originX:ot,originY:ot,originZ:nt,zIndex:rt,fillOpacity:Y,strokeOpacity:Y,numOctaves:rt};function lt(t,e,n,i){const{style:s,vars:o,transform:r,transformOrigin:a}=t;let l=!1,u=!1,c=!0;for(const h in e){const t=e[h];if(W(h)){o[h]=t;continue}const n=at[h],i=z(t,n);if(B.has(h)){if(l=!0,r[h]=i,!c)continue;t!==(n.default||0)&&(c=!1)}else h.startsWith("origin")?(u=!0,a[h]=i):s[h]=i}if(e.transform||(l||i?s.transform=function(t,{enableHardwareAcceleration:e=!0,allowTransformNone:n=!0},i,s){let o="";for(let r=0;r({style:{},transform:{},transformOrigin:{},vars:{}});function ct(t,e,n){for(const i in e)O(e[i])||F(i,n)||(t[i]=e[i])}function ht(e,n,i){const s={};return ct(s,e.style||{},e),Object.assign(s,function({transformTemplate:e},n,i){return t.useMemo(()=>{const t={style:{},transform:{},transformOrigin:{},vars:{}};return lt(t,n,{enableHardwareAcceleration:!i},e),Object.assign({},t.vars,t.style)},[n])}(e,n,i)),e.transformValues?e.transformValues(s):s}function dt(t,e,n){const i={},s=ht(t,e,n);return t.drag&&!1!==t.dragListener&&(i.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout="none",s.touchAction=!0===t.drag?"none":"pan-"+("x"===t.drag?"y":"x")),void 0===t.tabIndex&&(t.onTap||t.onTapStart||t.whileTap)&&(i.tabIndex=0),i.style=s,i}const pt=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","transformValues","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function mt(t){return t.startsWith("while")||t.startsWith("drag")&&"draggable"!==t||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||pt.has(t)}let ft=t=>!mt(t);try{(gt=require("@emotion/is-prop-valid").default)&&(ft=t=>t.startsWith("on")?!mt(t):gt(t))}catch(pr){}var gt;function yt(t,e,n){return"string"==typeof t?t:nt.transform(e+n*t)}const vt={offset:"stroke-dashoffset",array:"stroke-dasharray"},xt={offset:"strokeDashoffset",array:"strokeDasharray"};function Pt(t,{attrX:e,attrY:n,attrScale:i,originX:s,originY:o,pathLength:r,pathSpacing:a=1,pathOffset:l=0,...u},c,h,d){if(lt(t,u,c,d),h)return void(t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox));t.attrs=t.style,t.style={};const{attrs:p,style:m,dimensions:f}=t;p.transform&&(f&&(m.transform=p.transform),delete p.transform),f&&(void 0!==s||void 0!==o||m.transform)&&(m.transformOrigin=function(t,e,n){return`${yt(e,t.x,t.width)} ${yt(n,t.y,t.height)}`}(f,void 0!==s?s:.5,void 0!==o?o:.5)),void 0!==e&&(p.x=e),void 0!==n&&(p.y=n),void 0!==i&&(p.scale=i),void 0!==r&&function(t,e,n=1,i=0,s=!0){t.pathLength=1;const o=s?vt:xt;t[o.offset]=nt.transform(-i);const r=nt.transform(e),a=nt.transform(n);t[o.array]=`${r} ${a}`}(p,r,a,l,!1)}const bt=()=>({style:{},transform:{},transformOrigin:{},vars:{},attrs:{}}),Tt=t=>"string"==typeof t&&"svg"===t.toLowerCase();function wt(e,n,i,s){const o=t.useMemo(()=>{const t={style:{},transform:{},transformOrigin:{},vars:{},attrs:{}};return Pt(t,n,{enableHardwareAcceleration:!1},Tt(s),e.transformTemplate),{...t.attrs,style:{...t.style}}},[n]);if(e.style){const t={};ct(t,e.style,e),o.style={...t,...o.style}}return o}function St(e=!1){return(n,i,s,{latestValues:o},r)=>{const a=(R(n)?wt:dt)(i,o,r,n),l=function(t,e,n){const i={};for(const s in t)"values"===s&&"object"==typeof t.values||(ft(s)||!0===n&&mt(s)||!e&&!mt(s)||t.draggable&&s.startsWith("onDrag"))&&(i[s]=t[s]);return i}(i,"string"==typeof n,e),u={...l,...a,ref:s},{children:c}=i,h=t.useMemo(()=>O(c)?c.get():c,[c]);return t.createElement(n,{...u,children:h})}}function At(t,{style:e,vars:n},i,s){Object.assign(t.style,e,s&&s.getProjectionStyles(i));for(const o in n)t.style.setProperty(o,n[o])}const Et=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function Vt(t,e,n,i){At(t,e,void 0,i);for(const s in e.attrs)t.setAttribute(Et.has(s)?s:d(s),e.attrs[s])}function Ct(t,e){const{style:n}=t,i={};for(const s in n)(O(n[s])||e.style&&O(e.style[s])||F(s,t))&&(i[s]=n[s]);return i}function Mt(t,e){const n=Ct(t,e);for(const i in t)if(O(t[i])||O(e[i])){n[-1!==L.indexOf(i)?"attr"+i.charAt(0).toUpperCase()+i.substring(1):i]=t[i]}return n}function Dt(t,e,n,i={},s={}){return"function"==typeof e&&(e=e(void 0!==n?n:t.custom,i,s)),"string"==typeof e&&(e=t.variants&&t.variants[e]),"function"==typeof e&&(e=e(void 0!==n?n:t.custom,i,s)),e}const jt=t=>Array.isArray(t),Rt=t=>jt(t)?t[t.length-1]||0:t;function kt(t){const e=O(t)?t.get():t;return n=e,Boolean(n&&"object"==typeof n&&n.mix&&n.toValue)?e.toValue():e;var n}const Lt=e=>(n,i)=>{const s=t.useContext(a),o=t.useContext(l),r=()=>function({scrapeMotionValuesFromProps:t,createRenderState:e,onMount:n},i,s,o){const r={latestValues:Bt(i,s,o,t),renderState:e()};return n&&(r.mount=t=>n(i,t,r)),r}(e,n,s,o);return i?r():function(e){const n=t.useRef(null);return null===n.current&&(n.current=e()),n.current}(r)};function Bt(t,e,n,i){const s={},o=i(t,{});for(const d in o)s[d]=kt(o[d]);let{initial:r,animate:a}=t;const l=x(t),u=P(t);e&&u&&!l&&!1!==t.inherit&&(void 0===r&&(r=e.initial),void 0===a&&(a=e.animate));let c=!!n&&!1===n.initial;c=c||!1===r;const h=c?a:r;if(h&&"boolean"!=typeof h&&!g(h)){(Array.isArray(h)?h:[h]).forEach(e=>{const n=Dt(t,e);if(!n)return;const{transitionEnd:i,transition:o,...r}=n;for(const t in r){let e=r[t];if(Array.isArray(e)){e=e[c?e.length-1:0]}null!==e&&(s[t]=e)}for(const t in i)s[t]=i[t]})}return s}const Ft=t=>t;class Ot{constructor(){this.order=[],this.scheduled=new Set}add(t){if(!this.scheduled.has(t))return this.scheduled.add(t),this.order.push(t),!0}remove(t){const e=this.order.indexOf(t);-1!==e&&(this.order.splice(e,1),this.scheduled.delete(t))}clear(){this.order.length=0,this.scheduled.clear()}}const It=["prepare","read","update","preRender","render","postRender"];const{schedule:Ut,cancel:Nt,state:Wt,steps:_t}=function(t,e){let n=!1,i=!0;const s={delta:0,timestamp:0,isProcessing:!1},o=It.reduce((t,e)=>(t[e]=function(t){let e=new Ot,n=new Ot,i=0,s=!1,o=!1;const r=new WeakSet,a={schedule:(t,o=!1,a=!1)=>{const l=a&&s,u=l?e:n;return o&&r.add(t),u.add(t)&&l&&s&&(i=e.order.length),t},cancel:t=>{n.remove(t),r.delete(t)},process:l=>{if(s)o=!0;else{if(s=!0,[e,n]=[n,e],n.clear(),i=e.order.length,i)for(let n=0;nn=!0),t),{}),r=t=>o[t].process(s),a=()=>{const o=performance.now();n=!1,s.delta=i?1e3/60:Math.max(Math.min(o-s.timestamp,40),1),s.timestamp=o,s.isProcessing=!0,It.forEach(r),s.isProcessing=!1,n&&e&&(i=!1,t(a))};return{schedule:It.reduce((e,r)=>{const l=o[r];return e[r]=(e,o=!1,r=!1)=>(n||(n=!0,i=!0,s.isProcessing||t(a)),l.schedule(e,o,r)),e},{}),cancel:t=>It.forEach(e=>o[e].cancel(t)),state:s,steps:o}}("undefined"!=typeof requestAnimationFrame?requestAnimationFrame:Ft,!0),zt={useVisualState:Lt({scrapeMotionValuesFromProps:Mt,createRenderState:bt,onMount:(t,e,{renderState:n,latestValues:i})=>{Ut.read(()=>{try{n.dimensions="function"==typeof e.getBBox?e.getBBox():e.getBoundingClientRect()}catch(t){n.dimensions={x:0,y:0,width:0,height:0}}}),Ut.render(()=>{Pt(n,i,{enableHardwareAcceleration:!1},Tt(e.tagName),t.transformTemplate),Vt(e,n)})}})},Ht={useVisualState:Lt({scrapeMotionValuesFromProps:Ct,createRenderState:ut})};function $t(t,e,n,i={passive:!0}){return t.addEventListener(e,n,i),()=>t.removeEventListener(e,n)}const Yt=t=>"mouse"===t.pointerType?"number"!=typeof t.button||t.button<=0:!1!==t.isPrimary;function Xt(t,e="page"){return{point:{x:t[e+"X"],y:t[e+"Y"]}}}function Gt(t,e,n,i){return $t(t,e,(t=>e=>Yt(e)&&t(e,Xt(e)))(n),i)}const qt=(t,e)=>n=>e(t(n)),Zt=(...t)=>t.reduce(qt);function Kt(t){let e=null;return()=>{const n=()=>{e=null};return null===e&&(e=t,n)}}const Jt=Kt("dragHorizontal"),Qt=Kt("dragVertical");function te(t){let e=!1;if("y"===t)e=Qt();else if("x"===t)e=Jt();else{const t=Jt(),n=Qt();t&&n?e=()=>{t(),n()}:(t&&t(),n&&n())}return e}function ee(){const t=te(!0);return!t||(t(),!1)}class ne{constructor(t){this.isMounted=!1,this.node=t}update(){}}function ie(t,e){const n="pointer"+(e?"enter":"leave"),i="onHover"+(e?"Start":"End");return Gt(t.current,n,(n,s)=>{if("touch"===n.pointerType||ee())return;const o=t.getProps();t.animationState&&o.whileHover&&t.animationState.setActive("whileHover",e),o[i]&&Ut.update(()=>o[i](n,s))},{passive:!t.getProps()[i]})}const se=(t,e)=>!!e&&(t===e||se(t,e.parentElement));function oe(t,e){if(!e)return;const n=new PointerEvent("pointer"+t);e(n,Xt(n))}const re=new WeakMap,ae=new WeakMap,le=t=>{const e=re.get(t.target);e&&e(t)},ue=t=>{t.forEach(le)};function ce(t,e,n){const i=function({root:t,...e}){const n=t||document;ae.has(n)||ae.set(n,{});const i=ae.get(n),s=JSON.stringify(e);return i[s]||(i[s]=new IntersectionObserver(ue,{root:t,...e})),i[s]}(e);return re.set(t,n),i.observe(t),()=>{re.delete(t),i.unobserve(t)}}const he={some:0,all:1};const de={inView:{Feature:class extends ne{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:e,margin:n,amount:i="some",once:s}=t,o={root:e?e.current:void 0,rootMargin:n,threshold:"number"==typeof i?i:he[i]};return ce(this.node.current,o,t=>{const{isIntersecting:e}=t;if(this.isInView===e)return;if(this.isInView=e,s&&!e&&this.hasEnteredView)return;e&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",e);const{onViewportEnter:n,onViewportLeave:i}=this.node.getProps(),o=e?n:i;o&&o(t)})}mount(){this.startObserver()}update(){if("undefined"==typeof IntersectionObserver)return;const{props:t,prevProps:e}=this.node;["amount","margin","root"].some(function({viewport:t={}},{viewport:e={}}={}){return n=>t[n]!==e[n]}(t,e))&&this.startObserver()}unmount(){}}},tap:{Feature:class extends ne{constructor(){super(...arguments),this.removeStartListeners=Ft,this.removeEndListeners=Ft,this.removeAccessibleListeners=Ft,this.startPointerPress=(t,e)=>{if(this.isPressing)return;this.removeEndListeners();const n=this.node.getProps(),i=Gt(window,"pointerup",(t,e)=>{if(!this.checkPressEnd())return;const{onTap:n,onTapCancel:i,globalTapTarget:s}=this.node.getProps();Ut.update(()=>{s||se(this.node.current,t.target)?n&&n(t,e):i&&i(t,e)})},{passive:!(n.onTap||n.onPointerUp)}),s=Gt(window,"pointercancel",(t,e)=>this.cancelPress(t,e),{passive:!(n.onTapCancel||n.onPointerCancel)});this.removeEndListeners=Zt(i,s),this.startPress(t,e)},this.startAccessiblePress=()=>{const t=$t(this.node.current,"keydown",t=>{if("Enter"!==t.key||this.isPressing)return;this.removeEndListeners(),this.removeEndListeners=$t(this.node.current,"keyup",t=>{"Enter"===t.key&&this.checkPressEnd()&&oe("up",(t,e)=>{const{onTap:n}=this.node.getProps();n&&Ut.update(()=>n(t,e))})}),oe("down",(t,e)=>{this.startPress(t,e)})}),e=$t(this.node.current,"blur",()=>{this.isPressing&&oe("cancel",(t,e)=>this.cancelPress(t,e))});this.removeAccessibleListeners=Zt(t,e)}}startPress(t,e){this.isPressing=!0;const{onTapStart:n,whileTap:i}=this.node.getProps();i&&this.node.animationState&&this.node.animationState.setActive("whileTap",!0),n&&Ut.update(()=>n(t,e))}checkPressEnd(){this.removeEndListeners(),this.isPressing=!1;return this.node.getProps().whileTap&&this.node.animationState&&this.node.animationState.setActive("whileTap",!1),!ee()}cancelPress(t,e){if(!this.checkPressEnd())return;const{onTapCancel:n}=this.node.getProps();n&&Ut.update(()=>n(t,e))}mount(){const t=this.node.getProps(),e=Gt(t.globalTapTarget?window:this.node.current,"pointerdown",this.startPointerPress,{passive:!(t.onTapStart||t.onPointerStart)}),n=$t(this.node.current,"focus",this.startAccessiblePress);this.removeStartListeners=Zt(e,n)}unmount(){this.removeStartListeners(),this.removeEndListeners(),this.removeAccessibleListeners()}}},focus:{Feature:class extends ne{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch(e){t=!0}t&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=Zt($t(this.node.current,"focus",()=>this.onFocus()),$t(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}},hover:{Feature:class extends ne{mount(){this.unmount=Zt(ie(this.node,!0),ie(this.node,!1))}unmount(){}}}};function pe(t,e){if(!Array.isArray(e))return!1;const n=e.length;if(n!==t.length)return!1;for(let i=0;ie[n]=t.get()),e}(t),function(t){const e={};return t.values.forEach((t,n)=>e[n]=t.getVelocity()),e}(t))}let fe=Ft;const ge=t=>1e3*t,ye=t=>t/1e3,ve=!1,xe=t=>Array.isArray(t)&&"number"==typeof t[0];function Pe(t){return Boolean(!t||"string"==typeof t&&Te[t]||xe(t)||Array.isArray(t)&&t.every(Pe))}const be=([t,e,n,i])=>`cubic-bezier(${t}, ${e}, ${n}, ${i})`,Te={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:be([0,.65,.55,1]),circOut:be([.55,0,1,.45]),backIn:be([.31,.01,.66,-.59]),backOut:be([.33,1.53,.69,.99])};function we(t){if(t)return xe(t)?be(t):Array.isArray(t)?t.map(we):Te[t]}const Se=(t,e,n)=>(((1-3*n+3*e)*t+(3*n-6*e))*t+3*e)*t;function Ae(t,e,n,i){if(t===e&&n===i)return Ft;const s=e=>function(t,e,n,i,s){let o,r,a=0;do{r=e+(n-e)/2,o=Se(r,i,s)-t,o>0?n=r:e=r}while(Math.abs(o)>1e-7&&++a<12);return r}(e,0,1,t,n);return t=>0===t||1===t?t:Se(s(t),e,i)}const Ee=Ae(.42,0,1,1),Ve=Ae(0,0,.58,1),Ce=Ae(.42,0,.58,1),Me=t=>e=>e<=.5?t(2*e)/2:(2-t(2*(1-e)))/2,De=t=>e=>1-t(1-e),je=t=>1-Math.sin(Math.acos(t)),Re=De(je),ke=Me(je),Le=Ae(.33,1.53,.69,.99),Be=De(Le),Fe=Me(Be),Oe={linear:Ft,easeIn:Ee,easeInOut:Ce,easeOut:Ve,circIn:je,circInOut:ke,circOut:Re,backIn:Be,backInOut:Fe,backOut:Le,anticipate:t=>(t*=2)<1?.5*Be(t):.5*(2-Math.pow(2,-10*(t-1)))},Ie=t=>{if(Array.isArray(t)){fe(4===t.length);const[e,n,i,s]=t;return Ae(e,n,i,s)}return"string"==typeof t?Oe[t]:t},Ue=(t,e)=>n=>Boolean(J(n)&&K.test(n)&&n.startsWith(t)||e&&Object.prototype.hasOwnProperty.call(n,e)),Ne=(t,e,n)=>i=>{if(!J(i))return i;const[s,o,r,a]=i.match(q);return{[t]:parseFloat(s),[e]:parseFloat(o),[n]:parseFloat(r),alpha:void 0!==a?parseFloat(a):1}},We={...$,transform:t=>Math.round((t=>H(0,255,t))(t))},_e={test:Ue("rgb","red"),parse:Ne("red","green","blue"),transform:({red:t,green:e,blue:n,alpha:i=1})=>"rgba("+We.transform(t)+", "+We.transform(e)+", "+We.transform(n)+", "+G(Y.transform(i))+")"};const ze={test:Ue("#"),parse:function(t){let e="",n="",i="",s="";return t.length>5?(e=t.substring(1,3),n=t.substring(3,5),i=t.substring(5,7),s=t.substring(7,9)):(e=t.substring(1,2),n=t.substring(2,3),i=t.substring(3,4),s=t.substring(4,5),e+=e,n+=n,i+=i,s+=s),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(i,16),alpha:s?parseInt(s,16)/255:1}},transform:_e.transform},He={test:Ue("hsl","hue"),parse:Ne("hue","saturation","lightness"),transform:({hue:t,saturation:e,lightness:n,alpha:i=1})=>"hsla("+Math.round(t)+", "+et.transform(G(e))+", "+et.transform(G(n))+", "+G(Y.transform(i))+")"},$e={test:t=>_e.test(t)||ze.test(t)||He.test(t),parse:t=>_e.test(t)?_e.parse(t):He.test(t)?He.parse(t):ze.parse(t),transform:t=>J(t)?t:t.hasOwnProperty("red")?_e.transform(t):He.transform(t)},Ye=(t,e,n)=>-n*t+n*e+t;function Xe(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}const Ge=(t,e,n)=>{const i=t*t;return Math.sqrt(Math.max(0,n*(e*e-i)+i))},qe=[ze,_e,He];function Ze(t){const e=(n=t,qe.find(t=>t.test(n)));var n;let i=e.parse(t);return e===He&&(i=function({hue:t,saturation:e,lightness:n,alpha:i}){t/=360,n/=100;let s=0,o=0,r=0;if(e/=100){const i=n<.5?n*(1+e):n+e-n*e,a=2*n-i;s=Xe(a,i,t+1/3),o=Xe(a,i,t),r=Xe(a,i,t-1/3)}else s=o=r=n;return{red:Math.round(255*s),green:Math.round(255*o),blue:Math.round(255*r),alpha:i}}(i)),i}const Ke=(t,e)=>{const n=Ze(t),i=Ze(e),s={...n};return t=>(s.red=Ge(n.red,i.red,t),s.green=Ge(n.green,i.green,t),s.blue=Ge(n.blue,i.blue,t),s.alpha=Ye(n.alpha,i.alpha,t),_e.transform(s))};const Je={regex:/var\s*\(\s*--[\w-]+(\s*,\s*(?:(?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)+)?\s*\)/g,countKey:"Vars",token:"${v}",parse:Ft},Qe={regex:Z,countKey:"Colors",token:"${c}",parse:$e.parse},tn={regex:q,countKey:"Numbers",token:"${n}",parse:$.parse};function en(t,{regex:e,countKey:n,token:i,parse:s}){const o=t.tokenised.match(e);o&&(t["num"+n]=o.length,t.tokenised=t.tokenised.replace(e,i),t.values.push(...o.map(s)))}function nn(t){const e=t.toString(),n={value:e,tokenised:e,values:[],numVars:0,numColors:0,numNumbers:0};return n.value.includes("var(--")&&en(n,Je),en(n,Qe),en(n,tn),n}function sn(t){return nn(t).values}function on(t){const{values:e,numColors:n,numVars:i,tokenised:s}=nn(t),o=e.length;return t=>{let e=s;for(let s=0;s"number"==typeof t?0:t;const an={test:function(t){var e,n;return isNaN(t)&&J(t)&&((null===(e=t.match(q))||void 0===e?void 0:e.length)||0)+((null===(n=t.match(Z))||void 0===n?void 0:n.length)||0)>0},parse:sn,createTransformer:on,getAnimatableNone:function(t){const e=sn(t);return on(t)(e.map(rn))}},ln=(t,e)=>n=>`${n>0?e:t}`;function un(t,e){return"number"==typeof t?n=>Ye(t,e,n):$e.test(t)?Ke(t,e):t.startsWith("var(")?ln(t,e):dn(t,e)}const cn=(t,e)=>{const n=[...t],i=n.length,s=t.map((t,n)=>un(t,e[n]));return t=>{for(let e=0;e{const n={...t,...e},i={};for(const s in n)void 0!==t[s]&&void 0!==e[s]&&(i[s]=un(t[s],e[s]));return t=>{for(const e in i)n[e]=i[e](t);return n}},dn=(t,e)=>{const n=an.createTransformer(e),i=nn(t),s=nn(e);return i.numVars===s.numVars&&i.numColors===s.numColors&&i.numNumbers>=s.numNumbers?Zt(cn(i.values,s.values),n):ln(t,e)},pn=(t,e,n)=>{const i=e-t;return 0===i?1:(n-t)/i},mn=(t,e)=>n=>Ye(t,e,n);function fn(t,e,n){const i=[],s=n||("number"==typeof(o=t[0])?mn:"string"==typeof o?$e.test(o)?Ke:dn:Array.isArray(o)?cn:"object"==typeof o?hn:mn);var o;const r=t.length-1;for(let a=0;ae[0];t[0]>t[o-1]&&(t=[...t].reverse(),e=[...e].reverse());const r=fn(e,i,s),a=r.length,l=e=>{let n=0;if(a>1)for(;nl(H(t[0],t[o-1],e)):l}function yn(t){const e=[0];return function(t,e){const n=t[t.length-1];for(let i=1;i<=e;i++){const s=pn(0,e,i);t.push(Ye(n,1,s))}}(e,t.length-1),e}function vn({duration:t=300,keyframes:e,times:n,ease:i="easeInOut"}){const s=(t=>Array.isArray(t)&&"number"!=typeof t[0])(i)?i.map(Ie):Ie(i),o={done:!1,value:e[0]},r=function(t,e){return t.map(t=>t*e)}(n&&n.length===e.length?n:yn(e),t),a=gn(r,e,{ease:Array.isArray(s)?s:(l=e,u=s,l.map(()=>u||Ce).splice(0,l.length-1))});var l,u;return{calculatedDuration:t,next:e=>(o.value=a(e),o.done=e>=t,o)}}function xn(t,e){return e?t*(1e3/e):0}function Pn(t,e,n){const i=Math.max(e-5,0);return xn(n-t(i),e-i)}const bn=.001;function Tn({duration:t=800,bounce:e=.25,velocity:n=0,mass:i=1}){let s,o,r=1-e;r=H(.05,1,r),t=H(.01,10,ye(t)),r<1?(s=e=>{const i=e*r,s=i*t,o=i-n,a=Sn(e,r),l=Math.exp(-s);return bn-o/a*l},o=e=>{const i=e*r*t,o=i*n+n,a=Math.pow(r,2)*Math.pow(e,2)*t,l=Math.exp(-i),u=Sn(Math.pow(e,2),r);return(-s(e)+bn>0?-1:1)*((o-a)*l)/u}):(s=e=>Math.exp(-e*t)*((e-n)*t+1)-.001,o=e=>Math.exp(-e*t)*(t*t*(n-e)));const a=function(t,e,n){let i=n;for(let s=1;svoid 0!==t[e])}function Cn({keyframes:t,restDelta:e,restSpeed:n,...i}){const s=t[0],o=t[t.length-1],r={done:!1,value:s},{stiffness:a,damping:l,mass:u,duration:c,velocity:h,isResolvedFromDuration:d}=function(t){let e={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...t};if(!Vn(t,En)&&Vn(t,An)){const n=Tn(t);e={...e,...n,mass:1},e.isResolvedFromDuration=!0}return e}({...i,velocity:-ye(i.velocity||0)}),p=h||0,m=l/(2*Math.sqrt(a*u)),f=o-s,g=ye(Math.sqrt(a/u)),y=Math.abs(f)<5;let v;if(n||(n=y?.01:2),e||(e=y?.005:.5),m<1){const t=Sn(g,m);v=e=>{const n=Math.exp(-m*g*e);return o-n*((p+m*g*f)/t*Math.sin(t*e)+f*Math.cos(t*e))}}else if(1===m)v=t=>o-Math.exp(-g*t)*(f+(p+g*f)*t);else{const t=g*Math.sqrt(m*m-1);v=e=>{const n=Math.exp(-m*g*e),i=Math.min(t*e,300);return o-n*((p+m*g*f)*Math.sinh(i)+t*f*Math.cosh(i))/t}}return{calculatedDuration:d&&c||null,next:t=>{const i=v(t);if(d)r.done=t>=c;else{let s=p;0!==t&&(s=m<1?Pn(v,t,i):0);const a=Math.abs(s)<=n,l=Math.abs(o-i)<=e;r.done=a&&l}return r.value=r.done?o:i,r}}}function Mn({keyframes:t,velocity:e=0,power:n=.8,timeConstant:i=325,bounceDamping:s=10,bounceStiffness:o=500,modifyTarget:r,min:a,max:l,restDelta:u=.5,restSpeed:c}){const h=t[0],d={done:!1,value:h},p=t=>void 0===a?l:void 0===l||Math.abs(a-t)-m*Math.exp(-t/i),v=t=>g+y(t),x=t=>{const e=y(t),n=v(t);d.done=Math.abs(e)<=u,d.value=d.done?g:n};let P,b;const T=t=>{var e;(e=d.value,void 0!==a&&el)&&(P=t,b=Cn({keyframes:[d.value,p(d.value)],velocity:Pn(v,t,d.value),damping:s,stiffness:o,restDelta:u,restSpeed:c}))};return T(0),{calculatedDuration:null,next:t=>{let e=!1;return b||void 0!==P||(e=!0,x(t),T(t)),void 0!==P&&t>P?b.next(t-P):(!e&&x(t),d)}}}const Dn=t=>{const e=({timestamp:e})=>t(e);return{start:()=>Ut.update(e,!0),stop:()=>Nt(e),now:()=>Wt.isProcessing?Wt.timestamp:performance.now()}};function jn(t){let e=0;let n=t.next(e);for(;!n.done&&e<2e4;)e+=50,n=t.next(e);return e>=2e4?1/0:e}const Rn={decay:Mn,inertia:Mn,tween:vn,keyframes:vn,spring:Cn};function kn({autoplay:t=!0,delay:e=0,driver:n=Dn,keyframes:i,type:s="keyframes",repeat:o=0,repeatDelay:r=0,repeatType:a="loop",onPlay:l,onStop:u,onComplete:c,onUpdate:h,...d}){let p,m,f=1,g=!1;const y=()=>{m=new Promise(t=>{p=t})};let v;y();const x=Rn[s]||vn;let P;x!==vn&&"number"!=typeof i[0]&&(P=gn([0,100],i,{clamp:!1}),i=[0,100]);const b=x({...d,keyframes:i});let T;"mirror"===a&&(T=x({...d,keyframes:[...i].reverse(),velocity:-(d.velocity||0)}));let w="idle",S=null,A=null,E=null;null===b.calculatedDuration&&o&&(b.calculatedDuration=jn(b));const{calculatedDuration:V}=b;let C=1/0,M=1/0;null!==V&&(C=V+r,M=C*(o+1)-r);let D=0;const j=t=>{if(null===A)return;f>0&&(A=Math.min(A,t)),f<0&&(A=Math.min(t-M/f,A)),D=null!==S?S:Math.round(t-A)*f;const n=D-e*(f>=0?1:-1),s=f>=0?n<0:n>M;D=Math.max(n,0),"finished"===w&&null===S&&(D=M);let l=D,u=b;if(o){const t=Math.min(D,M)/C;let e=Math.floor(t),n=t%1;!n&&t>=1&&(n=1),1===n&&e--,e=Math.min(e,o+1);Boolean(e%2)&&("reverse"===a?(n=1-n,r&&(n-=r/C)):"mirror"===a&&(u=T)),l=H(0,1,n)*C}const c=s?{done:!1,value:i[0]}:u.next(l);P&&(c.value=P(c.value));let{done:d}=c;s||null===V||(d=f>=0?D>=M:D<=0);const p=null===S&&("finished"===w||"running"===w&&d);return h&&h(c.value),p&&L(),c},R=()=>{v&&v.stop(),v=void 0},k=()=>{w="idle",R(),p(),y(),A=E=null},L=()=>{w="finished",c&&c(),R(),p()},B=()=>{if(g)return;v||(v=n(j));const t=v.now();l&&l(),null!==S?A=t-S:A&&"finished"!==w||(A=t),"finished"===w&&y(),E=A,S=null,w="running",v.start()};t&&B();const F={then:(t,e)=>m.then(t,e),get time(){return ye(D)},set time(t){t=ge(t),D=t,null===S&&v&&0!==f?A=v.now()-t/f:S=t},get duration(){const t=null===b.calculatedDuration?jn(b):b.calculatedDuration;return ye(t)},get speed(){return f},set speed(t){t!==f&&v&&(f=t,F.time=ye(D))},get state(){return w},play:B,pause:()=>{w="paused",S=D},stop:()=>{g=!0,"idle"!==w&&(w="idle",u&&u(),k())},cancel:()=>{null!==E&&j(E),k()},complete:()=>{w="finished"},sample:t=>(A=0,j(t))};return F}const Ln=function(t){let e;return()=>(void 0===e&&(e=t()),e)}(()=>Object.hasOwnProperty.call(Element.prototype,"animate")),Bn=new Set(["opacity","clipPath","filter","transform","backgroundColor"]);function Fn(t,e,{onUpdate:n,onComplete:i,...s}){if(!(Ln()&&Bn.has(e)&&!s.repeatDelay&&"mirror"!==s.repeatType&&0!==s.damping&&"inertia"!==s.type))return!1;let o,r,a=!1,l=!1;const u=()=>{r=new Promise(t=>{o=t})};u();let{keyframes:c,duration:h=300,ease:d,times:p}=s;if(((t,e)=>"spring"===e.type||"backgroundColor"===t||!Pe(e.ease))(e,s)){const t=kn({...s,repeat:0,delay:0});let e={done:!1,value:c[0]};const n=[];let i=0;for(;!e.done&&i<2e4;)e=t.sample(i),n.push(e.value),i+=10;p=void 0,c=n,h=i-10,d="linear"}const m=function(t,e,n,{delay:i=0,duration:s,repeat:o=0,repeatType:r="loop",ease:a,times:l}={}){const u={[e]:n};l&&(u.offset=l);const c=we(a);return Array.isArray(c)&&(u.easing=c),t.animate(u,{delay:i,duration:s,easing:Array.isArray(c)?"linear":c,fill:"both",iterations:o+1,direction:"reverse"===r?"alternate":"normal"})}(t.owner.current,e,c,{...s,duration:h,ease:d,times:p}),f=()=>{l=!1,m.cancel()},g=()=>{l=!0,Ut.update(f),o(),u()};m.onfinish=()=>{l||(t.set(function(t,{repeat:e,repeatType:n="loop"}){return t[e&&"loop"!==n&&e%2==1?0:t.length-1]}(c,s)),i&&i(),g())};return{then:(t,e)=>r.then(t,e),attachTimeline:t=>(m.timeline=t,m.onfinish=null,Ft),get time(){return ye(m.currentTime||0)},set time(t){m.currentTime=ge(t)},get speed(){return m.playbackRate},set speed(t){m.playbackRate=t},get duration(){return ye(h)},play:()=>{a||(m.play(),Nt(f))},pause:()=>m.pause(),stop:()=>{if(a=!0,"idle"===m.playState)return;const{currentTime:e}=m;if(e){const n=kn({...s,autoplay:!1});t.setWithVelocity(n.sample(e-10).value,n.sample(e).value,10)}g()},complete:()=>{l||m.finish()},cancel:g}}const On={type:"spring",stiffness:500,damping:25,restSpeed:10},In={type:"keyframes",duration:.8},Un={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},Nn=(t,{keyframes:e})=>e.length>2?In:B.has(t)?t.startsWith("scale")?{type:"spring",stiffness:550,damping:0===e[1]?2*Math.sqrt(550):30,restSpeed:10}:On:Un,Wn=(t,e)=>"zIndex"!==t&&(!("number"!=typeof e&&!Array.isArray(e))||!("string"!=typeof e||!an.test(e)&&"0"!==e||e.startsWith("url("))),_n=new Set(["brightness","contrast","saturate","opacity"]);function zn(t){const[e,n]=t.slice(0,-1).split("(");if("drop-shadow"===e)return t;const[i]=n.match(q)||[];if(!i)return t;const s=n.replace(i,"");let o=_n.has(e)?1:0;return i!==n&&(o*=100),e+"("+o+s+")"}const Hn=/([a-z-]*)\(.*?\)/g,$n={...an,getAnimatableNone:t=>{const e=t.match(Hn);return e?e.map(zn).join(" "):t}},Yn={...at,color:$e,backgroundColor:$e,outlineColor:$e,fill:$e,stroke:$e,borderColor:$e,borderTopColor:$e,borderRightColor:$e,borderBottomColor:$e,borderLeftColor:$e,filter:$n,WebkitFilter:$n},Xn=t=>Yn[t];function Gn(t,e){let n=Xn(t);return n!==$n&&(n=an),n.getAnimatableNone?n.getAnimatableNone(e):void 0}const qn=t=>/^0[^.\s]+$/.test(t);function Zn(t){return"number"==typeof t?0===t:null!==t?"none"===t||"0"===t||qn(t):void 0}function Kn(t,e){return t[e]||t.default||t}const Jn=!1,Qn=(t,e,n,i={})=>s=>{const o=Kn(i,t)||{},r=o.delay||i.delay||0;let{elapsed:a=0}=i;a-=ge(r);const l=function(t,e,n,i){const s=Wn(e,n);let o;o=Array.isArray(n)?[...n]:[null,n];const r=void 0!==i.from?i.from:t.get();let a;const l=[];for(let u=0;u{e.set(t),o.onUpdate&&o.onUpdate(t)},onComplete:()=>{s(),o.onComplete&&o.onComplete()}};if(function({when:t,delay:e,delayChildren:n,staggerChildren:i,staggerDirection:s,repeat:o,repeatType:r,repeatDelay:a,from:l,elapsed:u,...c}){return!!Object.keys(c).length}(o)||(p={...p,...Nn(t,p)}),p.duration&&(p.duration=ge(p.duration)),p.repeatDelay&&(p.repeatDelay=ge(p.repeatDelay)),!h||!d||ve||!1===o.type||Jn)return function({keyframes:t,delay:e,onUpdate:n,onComplete:i}){const s=()=>(n&&n(t[t.length-1]),i&&i(),{time:0,speed:1,duration:0,play:Ft,pause:Ft,stop:Ft,then:t=>(t(),Promise.resolve()),cancel:Ft,complete:Ft});return e?kn({keyframes:[0,1],duration:0,delay:e,onComplete:s}):s()}(p);if(!i.isHandoff&&e.owner&&e.owner.current instanceof HTMLElement&&!e.owner.getProps().onUpdate){const n=Fn(e,t,p);if(n)return n}return kn(p)};function ti(t){return Boolean(O(t)&&t.add)}const ei=t=>/^\-?\d*\.?\d+$/.test(t);function ni(t,e){-1===t.indexOf(e)&&t.push(e)}function ii(t,e){const n=t.indexOf(e);n>-1&&t.splice(n,1)}class si{constructor(){this.subscriptions=[]}add(t){return ni(this.subscriptions,t),()=>ii(this.subscriptions,t)}notify(t,e,n){const i=this.subscriptions.length;if(i)if(1===i)this.subscriptions[0](t,e,n);else for(let s=0;s{this.prev=this.current,this.current=t;const{delta:n,timestamp:i}=Wt;this.lastUpdated!==i&&(this.timeDelta=n,this.lastUpdated=i,Ut.postRender(this.scheduleVelocityCheck)),this.prev!==this.current&&this.events.change&&this.events.change.notify(this.current),this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()),e&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.scheduleVelocityCheck=()=>Ut.postRender(this.velocityCheck),this.velocityCheck=({timestamp:t})=>{t!==this.lastUpdated&&(this.prev=this.current,this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()))},this.hasAnimated=!1,this.prev=this.current=t,this.canTrackVelocity=(n=this.current,!isNaN(parseFloat(n))),this.owner=e.owner}onChange(t){return this.on("change",t)}on(t,e){this.events[t]||(this.events[t]=new si);const n=this.events[t].add(e);return"change"===t?()=>{n(),Ut.read(()=>{this.events.change.getSize()||this.stop()})}:n}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,e){this.passiveEffect=t,this.stopPassiveEffect=e}set(t,e=!0){e&&this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t,e)}setWithVelocity(t,e,n){this.set(e),this.prev=t,this.timeDelta=n}jump(t){this.updateAndNotify(t),this.prev=t,this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return this.current}getPrevious(){return this.prev}getVelocity(){return this.canTrackVelocity?xn(parseFloat(this.current)-parseFloat(this.prev),this.timeDelta):0}start(t){return this.stop(),new Promise(e=>{this.hasAnimated=!0,this.animation=t(e),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function ri(t,e){return new oi(t,e)}const ai=t=>e=>e.test(t),li=[$,nt,et,tt,st,it,{test:t=>"auto"===t,parse:t=>t}],ui=t=>li.find(ai(t)),ci=[...li,$e,an],hi=t=>ci.find(ai(t));function di(t,e,n){t.hasValue(e)?t.getValue(e).set(n):t.addValue(e,ri(n))}function pi(t,e){if(!e)return;return(e[t]||e.default||e).from}function mi({protectedKeys:t,needsAnimating:e},n){const i=t.hasOwnProperty(n)&&!0!==e[n];return e[n]=!1,i}function fi(t,e){const n=t.get();if(!Array.isArray(e))return n!==e;for(let i=0;il.remove(h))),u.push(d)}return r&&Promise.all(u).then(()=>{r&&function(t,e){const n=me(t,e);let{transitionEnd:i={},transition:s={},...o}=n?t.makeTargetAnimatable(n,!1):{};o={...o,...i};for(const r in o)di(t,r,Rt(o[r]))}(t,r)}),u}function yi(t,e,n={}){const i=me(t,e,n.custom);let{transition:s=t.getDefaultTransition()||{}}=i||{};n.transitionOverride&&(s=n.transitionOverride);const o=i?()=>Promise.all(gi(t,i,n)):()=>Promise.resolve(),r=t.variantChildren&&t.variantChildren.size?(i=0)=>{const{delayChildren:o=0,staggerChildren:r,staggerDirection:a}=s;return function(t,e,n=0,i=0,s=1,o){const r=[],a=(t.variantChildren.size-1)*i,l=1===s?(t=0)=>t*i:(t=0)=>a-t*i;return Array.from(t.variantChildren).sort(vi).forEach((t,i)=>{t.notify("AnimationStart",e),r.push(yi(t,e,{...o,delay:n+l(i)}).then(()=>t.notify("AnimationComplete",e)))}),Promise.all(r)}(t,e,o+i,r,a,n)}:()=>Promise.resolve(),{when:a}=s;if(a){const[t,e]="beforeChildren"===a?[o,r]:[r,o];return t().then(()=>e())}return Promise.all([o(),r(n.delay)])}function vi(t,e){return t.sortNodePosition(e)}const xi=[...y].reverse(),Pi=y.length;function bi(t){return e=>Promise.all(e.map(({animation:e,options:n})=>function(t,e,n={}){let i;if(t.notify("AnimationStart",e),Array.isArray(e)){const s=e.map(e=>yi(t,e,n));i=Promise.all(s)}else if("string"==typeof e)i=yi(t,e,n);else{const s="function"==typeof e?me(t,e,n.custom):e;i=Promise.all(gi(t,s,n))}return i.then(()=>t.notify("AnimationComplete",e))}(t,e,n)))}function Ti(t){let e=bi(t);const n={animate:Si(!0),whileInView:Si(),whileHover:Si(),whileTap:Si(),whileDrag:Si(),whileFocus:Si(),exit:Si()};let i=!0;const s=(e,n)=>{const i=me(t,n);if(i){const{transition:t,transitionEnd:n,...s}=i;e={...e,...s,...n}}return e};function o(o,r){const a=t.getProps(),l=t.getVariantContext(!0)||{},u=[],c=new Set;let h={},d=1/0;for(let e=0;ed&&v,T=!1;const w=Array.isArray(y)?y:[y];let S=w.reduce(s,{});!1===x&&(S={});const{prevResolvedValues:A={}}=m,E={...A,...S},V=t=>{b=!0,c.has(t)&&(T=!0,c.delete(t)),m.needsAnimating[t]=!0};for(const t in E){const e=S[t],n=A[t];if(h.hasOwnProperty(t))continue;let i=!1;i=jt(e)&&jt(n)?!pe(e,n):e!==n,i?void 0!==e?V(t):c.add(t):void 0!==e&&c.has(t)?V(t):m.protectedKeys[t]=!0}m.prevProp=y,m.prevResolvedValues=S,m.isActive&&(h={...h,...S}),i&&t.blockInitialAnimation&&(b=!1),!b||P&&!T||u.push(...w.map(t=>({animation:t,options:{type:p,...o}})))}if(c.size){const e={};c.forEach(n=>{const i=t.getBaseTarget(n);void 0!==i&&(e[n]=i)}),u.push({animation:e})}let p=Boolean(u.length);return!i||!1!==a.initial&&a.initial!==a.animate||t.manuallyAnimateOnMount||(p=!1),i=!1,p?e(u):Promise.resolve()}return{animateChanges:o,setActive:function(e,i,s){var r;if(n[e].isActive===i)return Promise.resolve();null===(r=t.variantChildren)||void 0===r||r.forEach(t=>{var n;return null===(n=t.animationState)||void 0===n?void 0:n.setActive(e,i)}),n[e].isActive=i;const a=o(s,e);for(const t in n)n[t].protectedKeys={};return a},setAnimateFunction:function(n){e=n(t)},getState:()=>n}}function wi(t,e){return"string"==typeof e?e!==t:!!Array.isArray(e)&&!pe(e,t)}function Si(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}let Ai=0;const Ei={animation:{Feature:class extends ne{constructor(t){super(t),t.animationState||(t.animationState=Ti(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();this.unmount(),g(t)&&(this.unmount=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:e}=this.node.prevProps||{};t!==e&&this.updateAnimationControlsSubscription()}unmount(){}}},exit:{Feature:class extends ne{constructor(){super(...arguments),this.id=Ai++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:e,custom:n}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===i)return;const s=this.node.animationState.setActive("exit",!t,{custom:null!=n?n:this.node.getProps().custom});e&&!t&&s.then(()=>e(this.id))}mount(){const{register:t}=this.node.presenceContext||{};t&&(this.unmount=t(this.id))}unmount(){}}}},Vi=(t,e)=>Math.abs(t-e);class Ci{constructor(t,e,{transformPagePoint:n,contextWindow:i,dragSnapToOrigin:s=!1}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!this.lastMoveEvent||!this.lastMoveEventInfo)return;const t=ji(this.lastMoveEventInfo,this.history),e=null!==this.startEvent,n=function(t,e){const n=Vi(t.x,e.x),i=Vi(t.y,e.y);return Math.sqrt(n**2+i**2)}(t.offset,{x:0,y:0})>=3;if(!e&&!n)return;const{point:i}=t,{timestamp:s}=Wt;this.history.push({...i,timestamp:s});const{onStart:o,onMove:r}=this.handlers;e||(o&&o(this.lastMoveEvent,t),this.startEvent=this.lastMoveEvent),r&&r(this.lastMoveEvent,t)},this.handlePointerMove=(t,e)=>{this.lastMoveEvent=t,this.lastMoveEventInfo=Mi(e,this.transformPagePoint),Ut.update(this.updatePoint,!0)},this.handlePointerUp=(t,e)=>{this.end();const{onEnd:n,onSessionEnd:i,resumeAnimation:s}=this.handlers;if(this.dragSnapToOrigin&&s&&s(),!this.lastMoveEvent||!this.lastMoveEventInfo)return;const o=ji("pointercancel"===t.type?this.lastMoveEventInfo:Mi(e,this.transformPagePoint),this.history);this.startEvent&&n&&n(t,o),i&&i(t,o)},!Yt(t))return;this.dragSnapToOrigin=s,this.handlers=e,this.transformPagePoint=n,this.contextWindow=i||window;const o=Mi(Xt(t),this.transformPagePoint),{point:r}=o,{timestamp:a}=Wt;this.history=[{...r,timestamp:a}];const{onSessionStart:l}=e;l&&l(t,ji(o,this.history)),this.removeListeners=Zt(Gt(this.contextWindow,"pointermove",this.handlePointerMove),Gt(this.contextWindow,"pointerup",this.handlePointerUp),Gt(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),Nt(this.updatePoint)}}function Mi(t,e){return e?{point:e(t.point)}:t}function Di(t,e){return{x:t.x-e.x,y:t.y-e.y}}function ji({point:t},e){return{point:t,delta:Di(t,ki(e)),offset:Di(t,Ri(e)),velocity:Li(e,.1)}}function Ri(t){return t[0]}function ki(t){return t[t.length-1]}function Li(t,e){if(t.length<2)return{x:0,y:0};let n=t.length-1,i=null;const s=ki(t);for(;n>=0&&(i=t[n],!(s.timestamp-i.timestamp>ge(e)));)n--;if(!i)return{x:0,y:0};const o=ye(s.timestamp-i.timestamp);if(0===o)return{x:0,y:0};const r={x:(s.x-i.x)/o,y:(s.y-i.y)/o};return r.x===1/0&&(r.x=0),r.y===1/0&&(r.y=0),r}function Bi(t){return t.max-t.min}function Fi(t,e=0,n=.01){return Math.abs(t-e)<=n}function Oi(t,e,n,i=.5){t.origin=i,t.originPoint=Ye(e.min,e.max,t.origin),t.scale=Bi(n)/Bi(e),(Fi(t.scale,1,1e-4)||isNaN(t.scale))&&(t.scale=1),t.translate=Ye(n.min,n.max,t.origin)-t.originPoint,(Fi(t.translate)||isNaN(t.translate))&&(t.translate=0)}function Ii(t,e,n,i){Oi(t.x,e.x,n.x,i?i.originX:void 0),Oi(t.y,e.y,n.y,i?i.originY:void 0)}function Ui(t,e,n){t.min=n.min+e.min,t.max=t.min+Bi(e)}function Ni(t,e,n){t.min=e.min-n.min,t.max=t.min+Bi(e)}function Wi(t,e,n){Ni(t.x,e.x,n.x),Ni(t.y,e.y,n.y)}function _i(t,e,n){return{min:void 0!==e?t.min+e:void 0,max:void 0!==n?t.max+n-(t.max-t.min):void 0}}function zi(t,e){let n=e.min-t.min,i=e.max-t.max;return e.max-e.min({x:{min:0,max:0},y:{min:0,max:0}});function Gi(t){return[t("x"),t("y")]}function qi({top:t,left:e,right:n,bottom:i}){return{x:{min:e,max:n},y:{min:t,max:i}}}function Zi(t){return void 0===t||1===t}function Ki({scale:t,scaleX:e,scaleY:n}){return!Zi(t)||!Zi(e)||!Zi(n)}function Ji(t){return Ki(t)||Qi(t)||t.z||t.rotate||t.rotateX||t.rotateY}function Qi(t){return ts(t.x)||ts(t.y)}function ts(t){return t&&"0%"!==t}function es(t,e,n){return n+e*(t-n)}function ns(t,e,n,i,s){return void 0!==s&&(t=es(t,s,i)),es(t,n,i)+e}function is(t,e=0,n=1,i,s){t.min=ns(t.min,e,n,i,s),t.max=ns(t.max,e,n,i,s)}function ss(t,{x:e,y:n}){is(t.x,e.translate,e.scale,e.originPoint),is(t.y,n.translate,n.scale,n.originPoint)}function os(t){return Number.isInteger(t)||t>1.0000000000001||t<.999999999999?t:1}function rs(t,e){t.min=t.min+e,t.max=t.max+e}function as(t,e,[n,i,s]){const o=void 0!==e[s]?e[s]:.5,r=Ye(t.min,t.max,o);is(t,e[n],e[i],r,e.scale)}const ls=["x","scaleX","originX"],us=["y","scaleY","originY"];function cs(t,e){as(t.x,e,ls),as(t.y,e,us)}function hs(t,e){return qi(function(t,e){if(!e)return t;const n=e({x:t.left,y:t.top}),i=e({x:t.right,y:t.bottom});return{top:n.y,left:n.x,bottom:i.y,right:i.x}}(t.getBoundingClientRect(),e))}const ds=({current:t})=>t?t.ownerDocument.defaultView:null,ps=new WeakMap;class ms{constructor(t){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic={x:{min:0,max:0},y:{min:0,max:0}},this.visualElement=t}start(t,{snapToCursor:e=!1}={}){const{presenceContext:n}=this.visualElement;if(n&&!1===n.isPresent)return;const{dragSnapToOrigin:i}=this.getProps();this.panSession=new Ci(t,{onSessionStart:t=>{const{dragSnapToOrigin:n}=this.getProps();n?this.pauseAnimation():this.stopAnimation(),e&&this.snapToCursor(Xt(t,"page").point)},onStart:(t,e)=>{const{drag:n,dragPropagation:i,onDragStart:s}=this.getProps();if(n&&!i&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=te(n),!this.openGlobalLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Gi(t=>{let e=this.getAxisMotionValue(t).get()||0;if(et.test(e)){const{projection:n}=this.visualElement;if(n&&n.layout){const i=n.layout.layoutBox[t];if(i){e=Bi(i)*(parseFloat(e)/100)}}}this.originPoint[t]=e}),s&&Ut.update(()=>s(t,e),!1,!0);const{animationState:o}=this.visualElement;o&&o.setActive("whileDrag",!0)},onMove:(t,e)=>{const{dragPropagation:n,dragDirectionLock:i,onDirectionLock:s,onDrag:o}=this.getProps();if(!n&&!this.openGlobalLock)return;const{offset:r}=e;if(i&&null===this.currentDirection)return this.currentDirection=function(t,e=10){let n=null;Math.abs(t.y)>e?n="y":Math.abs(t.x)>e&&(n="x");return n}(r),void(null!==this.currentDirection&&s&&s(this.currentDirection));this.updateAxis("x",e.point,r),this.updateAxis("y",e.point,r),this.visualElement.render(),o&&o(t,e)},onSessionEnd:(t,e)=>this.stop(t,e),resumeAnimation:()=>Gi(t=>{var e;return"paused"===this.getAnimationState(t)&&(null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.play())})},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:i,contextWindow:ds(this.visualElement)})}stop(t,e){const n=this.isDragging;if(this.cancel(),!n)return;const{velocity:i}=e;this.startAnimation(i);const{onDragEnd:s}=this.getProps();s&&Ut.update(()=>s(t,e))}cancel(){this.isDragging=!1;const{projection:t,animationState:e}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:n}=this.getProps();!n&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),e&&e.setActive("whileDrag",!1)}updateAxis(t,e,n){const{drag:i}=this.getProps();if(!n||!fs(t,i,this.currentDirection))return;const s=this.getAxisMotionValue(t);let o=this.originPoint[t]+n[t];this.constraints&&this.constraints[t]&&(o=function(t,{min:e,max:n},i){return void 0!==e&&tn&&(t=i?Ye(n,t,i.max):Math.min(t,n)),t}(o,this.constraints[t],this.elastic[t])),s.set(o)}resolveConstraints(){var t;const{dragConstraints:e,dragElastic:n}=this.getProps(),i=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):null===(t=this.visualElement.projection)||void 0===t?void 0:t.layout,s=this.constraints;e&&m(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):this.constraints=!(!e||!i)&&function(t,{top:e,left:n,bottom:i,right:s}){return{x:_i(t.x,n,s),y:_i(t.y,e,i)}}(i.layoutBox,e),this.elastic=function(t=Hi){return!1===t?t=0:!0===t&&(t=Hi),{x:$i(t,"left","right"),y:$i(t,"top","bottom")}}(n),s!==this.constraints&&i&&this.constraints&&!this.hasMutatedConstraints&&Gi(t=>{this.getAxisMotionValue(t)&&(this.constraints[t]=function(t,e){const n={};return void 0!==e.min&&(n.min=e.min-t.min),void 0!==e.max&&(n.max=e.max-t.min),n}(i.layoutBox[t],this.constraints[t]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:e}=this.getProps();if(!t||!m(t))return!1;const n=t.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const s=function(t,e,n){const i=hs(t,n),{scroll:s}=e;return s&&(rs(i.x,s.offset.x),rs(i.y,s.offset.y)),i}(n,i.root,this.visualElement.getTransformPagePoint());let o=function(t,e){return{x:zi(t.x,e.x),y:zi(t.y,e.y)}}(i.layout.layoutBox,s);if(e){const t=e(function({x:t,y:e}){return{top:e.min,right:t.max,bottom:e.max,left:t.min}}(o));this.hasMutatedConstraints=!!t,t&&(o=qi(t))}return o}startAnimation(t){const{drag:e,dragMomentum:n,dragElastic:i,dragTransition:s,dragSnapToOrigin:o,onDragTransitionEnd:r}=this.getProps(),a=this.constraints||{},l=Gi(r=>{if(!fs(r,e,this.currentDirection))return;let l=a&&a[r]||{};o&&(l={min:0,max:0});const u=i?200:1e6,c=i?40:1e7,h={type:"inertia",velocity:n?t[r]:0,bounceStiffness:u,bounceDamping:c,timeConstant:750,restDelta:1,restSpeed:10,...s,...l};return this.startAxisValueAnimation(r,h)});return Promise.all(l).then(r)}startAxisValueAnimation(t,e){const n=this.getAxisMotionValue(t);return n.start(Qn(t,n,0,e))}stopAnimation(){Gi(t=>this.getAxisMotionValue(t).stop())}pauseAnimation(){Gi(t=>{var e;return null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.pause()})}getAnimationState(t){var e;return null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.state}getAxisMotionValue(t){const e="_drag"+t.toUpperCase(),n=this.visualElement.getProps(),i=n[e];return i||this.visualElement.getValue(t,(n.initial?n.initial[t]:void 0)||0)}snapToCursor(t){Gi(e=>{const{drag:n}=this.getProps();if(!fs(e,n,this.currentDirection))return;const{projection:i}=this.visualElement,s=this.getAxisMotionValue(e);if(i&&i.layout){const{min:n,max:o}=i.layout.layoutBox[e];s.set(t[e]-Ye(n,o,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:e}=this.getProps(),{projection:n}=this.visualElement;if(!m(e)||!n||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Gi(t=>{const e=this.getAxisMotionValue(t);if(e){const n=e.get();i[t]=function(t,e){let n=.5;const i=Bi(t),s=Bi(e);return s>i?n=pn(e.min,e.max-i,t.min):i>s&&(n=pn(t.min,t.max-s,e.min)),H(0,1,n)}({min:n,max:n},this.constraints[t])}});const{transformTemplate:s}=this.visualElement.getProps();this.visualElement.current.style.transform=s?s({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.resolveConstraints(),Gi(e=>{if(!fs(e,t,null))return;const n=this.getAxisMotionValue(e),{min:s,max:o}=this.constraints[e];n.set(Ye(s,o,i[e]))})}addListeners(){if(!this.visualElement.current)return;ps.set(this.visualElement,this);const t=Gt(this.visualElement.current,"pointerdown",t=>{const{drag:e,dragListener:n=!0}=this.getProps();e&&n&&this.start(t)}),e=()=>{const{dragConstraints:t}=this.getProps();m(t)&&(this.constraints=this.resolveRefConstraints())},{projection:n}=this.visualElement,i=n.addEventListener("measure",e);n&&!n.layout&&(n.root&&n.root.updateScroll(),n.updateLayout()),e();const s=$t(window,"resize",()=>this.scalePositionWithinConstraints()),o=n.addEventListener("didUpdate",({delta:t,hasLayoutChanged:e})=>{this.isDragging&&e&&(Gi(e=>{const n=this.getAxisMotionValue(e);n&&(this.originPoint[e]+=t[e].translate,n.set(n.get()+t[e].translate))}),this.visualElement.render())});return()=>{s(),t(),i(),o&&o()}}getProps(){const t=this.visualElement.getProps(),{drag:e=!1,dragDirectionLock:n=!1,dragPropagation:i=!1,dragConstraints:s=!1,dragElastic:o=Hi,dragMomentum:r=!0}=t;return{...t,drag:e,dragDirectionLock:n,dragPropagation:i,dragConstraints:s,dragElastic:o,dragMomentum:r}}}function fs(t,e,n){return!(!0!==e&&e!==t||null!==n&&n!==t)}const gs=t=>(e,n)=>{t&&Ut.update(()=>t(e,n))};const ys={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function vs(t,e){return e.max===e.min?0:t/(e.max-e.min)*100}const xs={correct:(t,e)=>{if(!e.target)return t;if("string"==typeof t){if(!nt.test(t))return t;t=parseFloat(t)}return`${vs(t,e.target.x)}% ${vs(t,e.target.y)}%`}},Ps={correct:(t,{treeScale:e,projectionDelta:n})=>{const i=t,s=an.parse(t);if(s.length>5)return i;const o=an.createTransformer(t),r="number"!=typeof s[0]?1:0,a=n.x.scale*e.x,l=n.y.scale*e.y;s[0+r]/=a,s[1+r]/=l;const u=Ye(a,l,.5);return"number"==typeof s[2+r]&&(s[2+r]/=u),"number"==typeof s[3+r]&&(s[3+r]/=u),o(s)}};class bs extends e.Component{componentDidMount(){const{visualElement:t,layoutGroup:e,switchLayoutGroup:n,layoutId:i}=this.props,{projection:s}=t;var o;o=ws,Object.assign(k,o),s&&(e.group&&e.group.add(s),n&&n.register&&i&&n.register(s),s.root.didUpdate(),s.addEventListener("animationComplete",()=>{this.safeToRemove()}),s.setOptions({...s.options,onExitComplete:()=>this.safeToRemove()})),ys.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:e,visualElement:n,drag:i,isPresent:s}=this.props,o=n.projection;return o?(o.isPresent=s,i||t.layoutDependency!==e||void 0===e?o.willUpdate():this.safeToRemove(),t.isPresent!==s&&(s?o.promote():o.relegate()||Ut.postRender(()=>{const t=o.getStack();t&&t.members.length||this.safeToRemove()})),null):null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),queueMicrotask(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:e,switchLayoutGroup:n}=this.props,{projection:i}=t;i&&(i.scheduleCheckAfterUnmount(),e&&e.group&&e.group.remove(i),n&&n.deregister&&n.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function Ts(n){const[i,s]=function(){const e=t.useContext(l);if(null===e)return[!0,null];const{isPresent:n,onExitComplete:i,register:s}=e,o=t.useId();return t.useEffect(()=>s(o),[]),!n&&i?[!1,()=>i&&i(o)]:[!0]}(),o=t.useContext(A);return e.createElement(bs,{...n,layoutGroup:o,switchLayoutGroup:t.useContext(E),isPresent:i,safeToRemove:s})}const ws={borderRadius:{...xs,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:xs,borderTopRightRadius:xs,borderBottomLeftRadius:xs,borderBottomRightRadius:xs,boxShadow:Ps},Ss=["TopLeft","TopRight","BottomLeft","BottomRight"],As=Ss.length,Es=t=>"string"==typeof t?parseFloat(t):t,Vs=t=>"number"==typeof t||nt.test(t);function Cs(t,e){return void 0!==t[e]?t[e]:t.borderRadius}const Ms=js(0,.5,Re),Ds=js(.5,.95,Ft);function js(t,e,n){return i=>ie?1:n(pn(t,e,i))}function Rs(t,e){t.min=e.min,t.max=e.max}function ks(t,e){Rs(t.x,e.x),Rs(t.y,e.y)}function Ls(t,e,n,i,s){return t=es(t-=e,1/n,i),void 0!==s&&(t=es(t,1/s,i)),t}function Bs(t,e,[n,i,s],o,r){!function(t,e=0,n=1,i=.5,s,o=t,r=t){et.test(e)&&(e=parseFloat(e),e=Ye(r.min,r.max,e/100)-r.min);if("number"!=typeof e)return;let a=Ye(o.min,o.max,i);t===o&&(a-=e),t.min=Ls(t.min,e,n,a,s),t.max=Ls(t.max,e,n,a,s)}(t,e[n],e[i],e[s],e.scale,o,r)}const Fs=["x","scaleX","originX"],Os=["y","scaleY","originY"];function Is(t,e,n,i){Bs(t.x,e,Fs,n?n.x:void 0,i?i.x:void 0),Bs(t.y,e,Os,n?n.y:void 0,i?i.y:void 0)}function Us(t){return 0===t.translate&&1===t.scale}function Ns(t){return Us(t.x)&&Us(t.y)}function Ws(t,e){return Math.round(t.x.min)===Math.round(e.x.min)&&Math.round(t.x.max)===Math.round(e.x.max)&&Math.round(t.y.min)===Math.round(e.y.min)&&Math.round(t.y.max)===Math.round(e.y.max)}function _s(t){return Bi(t.x)/Bi(t.y)}class zs{constructor(){this.members=[]}add(t){ni(this.members,t),t.scheduleRender()}remove(t){if(ii(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const t=this.members[this.members.length-1];t&&this.promote(t)}}relegate(t){const e=this.members.findIndex(e=>t===e);if(0===e)return!1;let n;for(let i=e;i>=0;i--){const t=this.members[i];if(!1!==t.isPresent){n=t;break}}return!!n&&(this.promote(n),!0)}promote(t,e){const n=this.lead;if(t!==n&&(this.prevLead=n,this.lead=t,t.show(),n)){n.instance&&n.scheduleRender(),t.scheduleRender(),t.resumeFrom=n,e&&(t.resumeFrom.preserveOpacity=!0),n.snapshot&&(t.snapshot=n.snapshot,t.snapshot.latestValues=n.animationValues||n.latestValues),t.root&&t.root.isUpdating&&(t.isLayoutDirty=!0);const{crossfade:i}=t.options;!1===i&&n.hide()}}exitAnimationComplete(){this.members.forEach(t=>{const{options:e,resumingFrom:n}=t;e.onExitComplete&&e.onExitComplete(),n&&n.options.onExitComplete&&n.options.onExitComplete()})}scheduleRender(){this.members.forEach(t=>{t.instance&&t.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function Hs(t,e,n){let i="";const s=t.x.translate/e.x,o=t.y.translate/e.y;if((s||o)&&(i=`translate3d(${s}px, ${o}px, 0) `),1===e.x&&1===e.y||(i+=`scale(${1/e.x}, ${1/e.y}) `),n){const{rotate:t,rotateX:e,rotateY:s}=n;t&&(i+=`rotate(${t}deg) `),e&&(i+=`rotateX(${e}deg) `),s&&(i+=`rotateY(${s}deg) `)}const r=t.x.scale*e.x,a=t.y.scale*e.y;return 1===r&&1===a||(i+=`scale(${r}, ${a})`),i||"none"}const $s=(t,e)=>t.depth-e.depth;class Ys{constructor(){this.children=[],this.isDirty=!1}add(t){ni(this.children,t),this.isDirty=!0}remove(t){ii(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort($s),this.isDirty=!1,this.children.forEach(t)}}const Xs=["","X","Y","Z"],Gs={visibility:"hidden"};let qs=0;const Zs={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0};function Ks({attachResizeListener:t,defaultParent:e,measureScroll:n,checkIsScrollRoot:i,resetTransform:s}){return class{constructor(t={},n=(null==e?void 0:e())){this.id=qs++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{var t;this.projectionUpdateScheduled=!1,Zs.totalNodes=Zs.resolvedTargetDeltas=Zs.recalculatedProjection=0,this.nodes.forEach(to),this.nodes.forEach(ao),this.nodes.forEach(lo),this.nodes.forEach(eo),t=Zs,window.MotionDebug&&window.MotionDebug.record(t)},this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=t,this.root=n?n.root||n:this,this.path=n?[...n.path,n]:[],this.parent=n,this.depth=n?n.depth+1:0;for(let e=0;ethis.root.updateBlockedByResize=!1;t(e,()=>{this.root.updateBlockedByResize=!0,n&&n(),n=function(t,e){const n=performance.now(),i=({timestamp:s})=>{const o=s-n;o>=e&&(Nt(i),t(o-e))};return Ut.read(i,!0),()=>Nt(i)}(i,250),ys.hasAnimatedSinceResize&&(ys.hasAnimatedSinceResize=!1,this.nodes.forEach(ro))})}s&&this.root.registerSharedNode(s,this),!1!==this.options.animate&&r&&(s||o)&&this.addEventListener("didUpdate",({delta:t,hasLayoutChanged:e,hasRelativeTargetChanged:n,layout:i})=>{if(this.isTreeAnimationBlocked())return this.target=void 0,void(this.relativeTarget=void 0);const s=this.options.transition||r.getDefaultTransition()||fo,{onLayoutAnimationStart:o,onLayoutAnimationComplete:a}=r.getProps(),l=!this.targetLayout||!Ws(this.targetLayout,i)||n,u=!e&&n;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||u||e&&(l||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(t,u);const e={...Kn(s,"layout"),onPlay:o,onComplete:a};(r.shouldReduceMotion||this.options.layoutRoot)&&(e.delay=0,e.type=!1),this.startAnimation(e)}else e||ro(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=i})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const t=this.getStack();t&&t.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,Nt(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(uo),this.animationId++)}getTransformTemplate(){const{visualElement:t}=this.options;return t&&t.getProps().transformTemplate}willUpdate(t=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked())return void(this.options.onExitComplete&&this.options.onExitComplete());if(!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let s=0;sthis.update()))}clearAllSnapshots(){this.nodes.forEach(no),this.sharedNodes.forEach(co)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,Ut.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){Ut.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure())}updateLayout(){if(!this.instance)return;if(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead()||this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let n=0;n{const n=e/1e3;var l,d,p,m,f,g;ho(o.x,t.x,n),ho(o.y,t.y,n),this.setTargetDelta(o),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Wi(r,this.layout.layoutBox,this.relativeParent.layout.layoutBox),p=this.relativeTarget,m=this.relativeTargetOrigin,f=r,g=n,po(p.x,m.x,f.x,g),po(p.y,m.y,f.y,g),h&&(l=this.relativeTarget,d=h,l.x.min===d.x.min&&l.x.max===d.x.max&&l.y.min===d.y.min&&l.y.max===d.y.max)&&(this.isProjectionDirty=!1),h||(h={x:{min:0,max:0},y:{min:0,max:0}}),ks(h,this.relativeTarget)),a&&(this.animationValues=s,function(t,e,n,i,s,o){s?(t.opacity=Ye(0,void 0!==n.opacity?n.opacity:1,Ms(i)),t.opacityExit=Ye(void 0!==e.opacity?e.opacity:1,0,Ds(i))):o&&(t.opacity=Ye(void 0!==e.opacity?e.opacity:1,void 0!==n.opacity?n.opacity:1,i));for(let r=0;r{ys.hasAnimatedSinceResize=!0,this.currentAnimation=function(t,e,n){const i=O(t)?t:ri(t);return i.start(Qn("",i,e,n)),i.animation}(0,1e3,{...t,onUpdate:e=>{this.mixTargetDelta(e),t.onUpdate&&t.onUpdate(e)},onComplete:()=>{t.onComplete&&t.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const t=this.getStack();t&&t.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(1e3),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const t=this.getLead();let{targetWithTransforms:e,target:n,layout:i,latestValues:s}=t;if(e&&n&&i){if(this!==t&&this.layout&&i&&xo(this.options.animationType,this.layout.layoutBox,i.layoutBox)){n=this.target||{x:{min:0,max:0},y:{min:0,max:0}};const e=Bi(this.layout.layoutBox.x);n.x.min=t.target.x.min,n.x.max=n.x.min+e;const i=Bi(this.layout.layoutBox.y);n.y.min=t.target.y.min,n.y.max=n.y.min+i}ks(e,n),cs(e,s),Ii(this.projectionDeltaWithTransform,this.layoutCorrected,e,s)}}registerSharedNode(t,e){this.sharedNodes.has(t)||this.sharedNodes.set(t,new zs);this.sharedNodes.get(t).add(e);const n=e.options.initialPromotionConfig;e.promote({transition:n?n.transition:void 0,preserveFollowOpacity:n&&n.shouldPreserveFollowOpacity?n.shouldPreserveFollowOpacity(e):void 0})}isLead(){const t=this.getStack();return!t||t.lead===this}getLead(){var t;const{layoutId:e}=this.options;return e&&(null===(t=this.getStack())||void 0===t?void 0:t.lead)||this}getPrevLead(){var t;const{layoutId:e}=this.options;return e?null===(t=this.getStack())||void 0===t?void 0:t.prevLead:void 0}getStack(){const{layoutId:t}=this.options;if(t)return this.root.sharedNodes.get(t)}promote({needsReset:t,transition:e,preserveFollowOpacity:n}={}){const i=this.getStack();i&&i.promote(this,n),t&&(this.projectionDelta=void 0,this.needsReset=!0),e&&this.setOptions({transition:e})}relegate(){const t=this.getStack();return!!t&&t.relegate(this)}resetRotation(){const{visualElement:t}=this.options;if(!t)return;let e=!1;const{latestValues:n}=t;if((n.rotate||n.rotateX||n.rotateY||n.rotateZ)&&(e=!0),!e)return;const i={};for(let s=0;s{var e;return null===(e=t.currentAnimation)||void 0===e?void 0:e.stop()}),this.root.nodes.forEach(io),this.root.sharedNodes.clear()}}}function Js(t){t.updateLayout()}function Qs(t){var e;const n=(null===(e=t.resumeFrom)||void 0===e?void 0:e.snapshot)||t.snapshot;if(t.isLead()&&t.layout&&n&&t.hasListeners("didUpdate")){const{layoutBox:e,measuredBox:i}=t.layout,{animationType:s}=t.options,o=n.source!==t.layout.source;"size"===s?Gi(t=>{const i=o?n.measuredBox[t]:n.layoutBox[t],s=Bi(i);i.min=e[t].min,i.max=i.min+s}):xo(s,n.layoutBox,e)&&Gi(i=>{const s=o?n.measuredBox[i]:n.layoutBox[i],r=Bi(e[i]);s.max=s.min+r,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[i].max=t.relativeTarget[i].min+r)});const r={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};Ii(r,e,n.layoutBox);const a={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};o?Ii(a,t.applyTransform(i,!0),n.measuredBox):Ii(a,e,n.layoutBox);const l=!Ns(r);let u=!1;if(!t.resumeFrom){const i=t.getClosestProjectingParent();if(i&&!i.resumeFrom){const{snapshot:s,layout:o}=i;if(s&&o){const r={x:{min:0,max:0},y:{min:0,max:0}};Wi(r,n.layoutBox,s.layoutBox);const a={x:{min:0,max:0},y:{min:0,max:0}};Wi(a,e,o.layoutBox),Ws(r,a)||(u=!0),i.options.layoutRoot&&(t.relativeTarget=a,t.relativeTargetOrigin=r,t.relativeParent=i)}}}t.notifyListeners("didUpdate",{layout:e,snapshot:n,delta:a,layoutDelta:r,hasLayoutChanged:l,hasRelativeTargetChanged:u})}else if(t.isLead()){const{onExitComplete:e}=t.options;e&&e()}t.options.transition=void 0}function to(t){Zs.totalNodes++,t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=Boolean(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function eo(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function no(t){t.clearSnapshot()}function io(t){t.clearMeasurements()}function so(t){t.isLayoutDirty=!1}function oo(t){const{visualElement:e}=t.options;e&&e.getProps().onBeforeLayoutMeasure&&e.notify("BeforeLayoutMeasure"),t.resetTransform()}function ro(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function ao(t){t.resolveTargetDelta()}function lo(t){t.calcProjection()}function uo(t){t.resetRotation()}function co(t){t.removeLeadSnapshot()}function ho(t,e,n){t.translate=Ye(e.translate,0,n),t.scale=Ye(e.scale,1,n),t.origin=e.origin,t.originPoint=e.originPoint}function po(t,e,n,i){t.min=Ye(e.min,n.min,i),t.max=Ye(e.max,n.max,i)}function mo(t){return t.animationValues&&void 0!==t.animationValues.opacityExit}const fo={duration:.45,ease:[.4,0,.1,1]},go=t=>"undefined"!=typeof navigator&&navigator.userAgent.toLowerCase().includes(t),yo=go("applewebkit/")&&!go("chrome/")?Math.round:Ft;function vo(t){t.min=yo(t.min),t.max=yo(t.max)}function xo(t,e,n){return"position"===t||"preserve-aspect"===t&&!Fi(_s(e),_s(n),.2)}const Po=Ks({attachResizeListener:(t,e)=>$t(t,"resize",e),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),bo={current:void 0},To=Ks({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!bo.current){const t=new Po({});t.mount(window),t.setOptions({layoutScroll:!0}),bo.current=t}return bo.current},resetTransform:(t,e)=>{t.style.transform=void 0!==e?e:"none"},checkIsScrollRoot:t=>Boolean("fixed"===window.getComputedStyle(t).position)}),wo={pan:{Feature:class extends ne{constructor(){super(...arguments),this.removePointerDownListener=Ft}onPointerDown(t){this.session=new Ci(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:ds(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:e,onPan:n,onPanEnd:i}=this.node.getProps();return{onSessionStart:gs(t),onStart:gs(e),onMove:n,onEnd:(t,e)=>{delete this.session,i&&Ut.update(()=>i(t,e))}}}mount(){this.removePointerDownListener=Gt(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}},drag:{Feature:class extends ne{constructor(t){super(t),this.removeGroupControls=Ft,this.removeListeners=Ft,this.controls=new ms(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Ft}unmount(){this.removeGroupControls(),this.removeListeners()}},ProjectionNode:To,MeasureLayout:Ts}},So=/var\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\)/;function Ao(t,e,n=1){const[i,s]=function(t){const e=So.exec(t);if(!e)return[,];const[,n,i]=e;return[n,i]}(t);if(!i)return;const o=window.getComputedStyle(e).getPropertyValue(i);if(o){const t=o.trim();return ei(t)?parseFloat(t):t}return _(s)?Ao(s,e,n+1):s}const Eo=new Set(["width","height","top","left","right","bottom","x","y","translateX","translateY"]),Vo=t=>Eo.has(t),Co=t=>t===$||t===nt,Mo=(t,e)=>parseFloat(t.split(", ")[e]),Do=(t,e)=>(n,{transform:i})=>{if("none"===i||!i)return 0;const s=i.match(/^matrix3d\((.+)\)$/);if(s)return Mo(s[1],e);{const e=i.match(/^matrix\((.+)\)$/);return e?Mo(e[1],t):0}},jo=new Set(["x","y","z"]),Ro=L.filter(t=>!jo.has(t));const ko={width:({x:t},{paddingLeft:e="0",paddingRight:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),height:({y:t},{paddingTop:e="0",paddingBottom:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),top:(t,{top:e})=>parseFloat(e),left:(t,{left:e})=>parseFloat(e),bottom:({y:t},{top:e})=>parseFloat(e)+(t.max-t.min),right:({x:t},{left:e})=>parseFloat(e)+(t.max-t.min),x:Do(4,13),y:Do(5,14)};ko.translateX=ko.x,ko.translateY=ko.y;const Lo=(t,e,n={},i={})=>{e={...e},i={...i};const s=Object.keys(e).filter(Vo);let o=[],r=!1;const a=[];if(s.forEach(s=>{const l=t.getValue(s);if(!t.hasValue(s))return;let u=n[s],c=ui(u);const h=e[s];let d;if(jt(h)){const t=h.length,e=null===h[0]?1:0;u=h[e],c=ui(u);for(let n=e;n{const i=t.getValue(n);void 0!==i&&(e.push([n,i.get()]),i.set(n.startsWith("scale")?1:0))}),e.length&&t.render(),e}(t),r=!0),a.push(s),i[s]=void 0!==i[s]?i[s]:e[s],l.jump(h))}),a.length){const n=a.indexOf("height")>=0?window.pageYOffset:null,s=((t,e,n)=>{const i=e.measureViewportBox(),s=e.current,o=getComputedStyle(s),{display:r}=o,a={};"none"===r&&e.setStaticValue("display",t.display||"block"),n.forEach(t=>{a[t]=ko[t](i,o)}),e.render();const l=e.measureViewportBox();return n.forEach(n=>{const i=e.getValue(n);i&&i.jump(a[n]),t[n]=ko[n](l,o)}),t})(e,t,a);return o.length&&o.forEach(([e,n])=>{t.getValue(e).set(n)}),t.render(),u&&null!==n&&window.scrollTo({top:n}),{target:s,transitionEnd:i}}return{target:e,transitionEnd:i}};function Bo(t,e,n,i){return(t=>Object.keys(t).some(Vo))(e)?Lo(t,e,n,i):{target:e,transitionEnd:i}}const Fo=(t,e,n,i)=>{const s=function(t,{...e},n){const i=t.current;if(!(i instanceof Element))return{target:e,transitionEnd:n};n&&(n={...n}),t.values.forEach(t=>{const e=t.get();if(!_(e))return;const n=Ao(e,i);n&&t.set(n)});for(const s in e){const t=e[s];if(!_(t))continue;const o=Ao(t,i);o&&(e[s]=o,n||(n={}),void 0===n[s]&&(n[s]=t))}return{target:e,transitionEnd:n}}(t,e,i);return Bo(t,e=s.target,n,i=s.transitionEnd)},Oo={current:null},Io={current:!1};const Uo=new WeakMap,No=Object.keys(S),Wo=No.length,_o=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"],zo=v.length;class Ho{constructor({parent:t,props:e,presenceContext:n,reducedMotionConfig:i,visualState:s},o={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.scheduleRender=()=>Ut.render(this.render,!1,!0);const{latestValues:r,renderState:a}=s;this.latestValues=r,this.baseTarget={...r},this.initialValues=e.initial?{...r}:{},this.renderState=a,this.parent=t,this.props=e,this.presenceContext=n,this.depth=t?t.depth+1:0,this.reducedMotionConfig=i,this.options=o,this.isControllingVariants=x(e),this.isVariantNode=P(e),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=Boolean(t&&t.current);const{willChange:l,...u}=this.scrapeMotionValuesFromProps(e,{});for(const c in u){const t=u[c];void 0!==r[c]&&O(t)&&(t.set(r[c],!1),ti(l)&&l.add(c))}}scrapeMotionValuesFromProps(t,e){return{}}mount(t){this.current=t,Uo.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((t,e)=>this.bindToMotionValue(e,t)),Io.current||function(){if(Io.current=!0,u)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),e=()=>Oo.current=t.matches;t.addListener(e),e()}else Oo.current=!1}(),this.shouldReduceMotion="never"!==this.reducedMotionConfig&&("always"===this.reducedMotionConfig||Oo.current),this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){Uo.delete(this.current),this.projection&&this.projection.unmount(),Nt(this.notifyUpdate),Nt(this.render),this.valueSubscriptions.forEach(t=>t()),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const t in this.events)this.events[t].clear();for(const t in this.features)this.features[t].unmount();this.current=null}bindToMotionValue(t,e){const n=B.has(t),i=e.on("change",e=>{this.latestValues[t]=e,this.props.onUpdate&&Ut.update(this.notifyUpdate,!1,!0),n&&this.projection&&(this.projection.isTransformDirty=!0)}),s=e.on("renderRequest",this.scheduleRender);this.valueSubscriptions.set(t,()=>{i(),s()})}sortNodePosition(t){return this.current&&this.sortInstanceNodePosition&&this.type===t.type?this.sortInstanceNodePosition(this.current,t.current):0}loadFeatures({children:t,...e},n,i,s){let o,r;for(let a=0;athis.scheduleRender(),animationType:"string"==typeof n?n:"both",initialPromotionConfig:s,layoutScroll:a,layoutRoot:l})}return r}updateFeatures(){for(const t in this.features){const e=this.features[t];e.isMounted?e.update():(e.mount(),e.isMounted=!0)}}triggerBuild(){this.build(this.renderState,this.latestValues,this.options,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):{x:{min:0,max:0},y:{min:0,max:0}}}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,e){this.latestValues[t]=e}makeTargetAnimatable(t,e=!0){return this.makeTargetAnimatableFromInstance(t,this.props,e)}update(t,e){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=e;for(let n=0;n<_o.length;n++){const e=_o[n];this.propEventSubscriptions[e]&&(this.propEventSubscriptions[e](),delete this.propEventSubscriptions[e]);const i=t["on"+e];i&&(this.propEventSubscriptions[e]=this.on(e,i))}this.prevMotionValues=function(t,e,n){const{willChange:i}=e;for(const s in e){const o=e[s],r=n[s];if(O(o))t.addValue(s,o),ti(i)&&i.add(s);else if(O(r))t.addValue(s,ri(o,{owner:t})),ti(i)&&i.remove(s);else if(r!==o)if(t.hasValue(s)){const e=t.getValue(s);!e.hasAnimated&&e.set(o)}else{const e=t.getStaticValue(s);t.addValue(s,ri(void 0!==e?e:o,{owner:t}))}}for(const s in n)void 0===e[s]&&t.removeValue(s);return e}(this,this.scrapeMotionValuesFromProps(t,this.prevProps),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(t){return this.props.variants?this.props.variants[t]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}getVariantContext(t=!1){if(t)return this.parent?this.parent.getVariantContext():void 0;if(!this.isControllingVariants){const t=this.parent&&this.parent.getVariantContext()||{};return void 0!==this.props.initial&&(t.initial=this.props.initial),t}const e={};for(let n=0;ne.variantChildren.delete(t)}addValue(t,e){e!==this.values.get(t)&&(this.removeValue(t),this.bindToMotionValue(t,e)),this.values.set(t,e),this.latestValues[t]=e.get()}removeValue(t){this.values.delete(t);const e=this.valueSubscriptions.get(t);e&&(e(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,e){if(this.props.values&&this.props.values[t])return this.props.values[t];let n=this.values.get(t);return void 0===n&&void 0!==e&&(n=ri(e,{owner:this}),this.addValue(t,n)),n}readValue(t){var e;return void 0===this.latestValues[t]&&this.current?null!==(e=this.getBaseTargetFromProps(this.props,t))&&void 0!==e?e:this.readValueFromInstance(this.current,t,this.options):this.latestValues[t]}setBaseTarget(t,e){this.baseTarget[t]=e}getBaseTarget(t){var e;const{initial:n}=this.props,i="string"==typeof n||"object"==typeof n?null===(e=Dt(this.props,n))||void 0===e?void 0:e[t]:void 0;if(n&&void 0!==i)return i;const s=this.getBaseTargetFromProps(this.props,t);return void 0===s||O(s)?void 0!==this.initialValues[t]&&void 0===i?void 0:this.baseTarget[t]:s}on(t,e){return this.events[t]||(this.events[t]=new si),this.events[t].add(e)}notify(t,...e){this.events[t]&&this.events[t].notify(...e)}}class $o extends Ho{sortInstanceNodePosition(t,e){return 2&t.compareDocumentPosition(e)?1:-1}getBaseTargetFromProps(t,e){return t.style?t.style[e]:void 0}removeValueFromRenderState(t,{vars:e,style:n}){delete e[t],delete n[t]}makeTargetAnimatableFromInstance({transition:t,transitionEnd:e,...n},{transformValues:i},s){let o=function(t,e,n){const i={};for(const s in t){const t=pi(s,e);if(void 0!==t)i[s]=t;else{const t=n.getValue(s);t&&(i[s]=t.get())}}return i}(n,t||{},this);if(i&&(e&&(e=i(e)),n&&(n=i(n)),o&&(o=i(o))),s){!function(t,e,n){var i,s;const o=Object.keys(e).filter(e=>!t.hasValue(e)),r=o.length;if(r)for(let a=0;a{this.current&&(this.current.textContent=`${t}`)}))}renderInstance(t,e,n,i){At(t,e,n,i)}}class Xo extends $o{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1}getBaseTargetFromProps(t,e){return t[e]}readValueFromInstance(t,e){if(B.has(e)){const t=Xn(e);return t&&t.default||0}return e=Et.has(e)?e:d(e),t.getAttribute(e)}measureInstanceViewportBox(){return{x:{min:0,max:0},y:{min:0,max:0}}}scrapeMotionValuesFromProps(t,e){return Mt(t,e)}build(t,e,n,i){Pt(t,e,n,this.isSVGTag,i.transformTemplate)}renderInstance(t,e,n,i){Vt(t,e,0,i)}mount(t){this.isSVGTag=Tt(t.tagName),super.mount(t)}}const Go=(t,e)=>R(t)?new Xo(e,{enableHardwareAcceleration:!1}):new Yo(e,{enableHardwareAcceleration:!0}),qo={...Ei,...de,...wo,...{layout:{ProjectionNode:To,MeasureLayout:Ts}}},Zo=D((t,e)=>function(t,{forwardMotionProps:e=!1},n,i){return{...R(t)?zt:Ht,preloadedFeatures:n,useRender:St(e),createVisualElement:i,Component:t}}(t,e,qo,Go)),Ko="Grow With Me — Become a Strong Product Engineer",Jo="1:1 mentoring for frontend and full-stack developers who want real skills, career clarity, and better roles in product companies.",Qo={label:"👉 Book a 1:1 Call",subtext:"No sales pitch. Just honest guidance."},tr=(t=.1)=>({hidden:{opacity:0},visible:{opacity:1,transition:{staggerChildren:t}}}),er=(t=0)=>({hidden:{opacity:0,y:20},visible:{opacity:1,y:0,transition:{duration:.6,delay:t}}}),nr=(t=0)=>({hidden:{opacity:0,x:-20},visible:{opacity:1,x:0,transition:{duration:.5,delay:t}}}),ir=(t=0)=>({hidden:{opacity:0,x:-30},visible:{opacity:1,x:0,transition:{duration:.6,delay:t}}}),sr=()=>{const t=er(0),e=er(.2),s=er(.4);return n.jsxs("section",{className:"relative min-h-screen flex items-center justify-center px-4 sm:px-6 lg:px-8 overflow-hidden",children:[n.jsx("div",{className:"hero-glow absolute inset-0 flex items-center justify-center"}),n.jsxs("div",{className:"relative z-10 max-w-4xl mx-auto text-center",children:[n.jsx(Zo.h1,{variants:t,initial:"hidden",animate:"visible",className:"text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold text-gray-900 mb-6 leading-tight",itemProp:"headline",children:Ko}),n.jsx(Zo.p,{variants:e,initial:"hidden",animate:"visible",className:"text-lg sm:text-xl md:text-2xl text-gray-600 mb-8 max-w-3xl mx-auto",children:Jo}),n.jsxs(Zo.div,{variants:s,initial:"hidden",animate:"visible",className:"flex flex-col items-center gap-4",children:[n.jsx(i,{href:"https://topmate.io/togowtham/34939?utm_source=grwm&utm_campaign=website_launch&utm_medium=link",label:Qo.label,variant:"topmate"}),n.jsx("p",{className:"text-sm text-gray-500",children:Qo.subtext})]})]})]})},or=({children:e,fallback:i=n.jsx(s,{}),rootMargin:o="200px"})=>{const[r,a]=((e={})=>{const{threshold:n=.1,rootMargin:i="100px",triggerOnce:s=!0}=e,[o,r]=t.useState(!1),a=t.useRef(null);return t.useEffect(()=>{const t=a.current;if(null==t)return;const e=new IntersectionObserver(([n])=>{n.isIntersecting?(r(!0),s&&e.unobserve(t)):s||r(!1)},{threshold:n,rootMargin:i});return e.observe(t),()=>{e.unobserve(t)}},[n,i,s]),[a,o]})({rootMargin:o,triggerOnce:!0});return n.jsx("div",{ref:r,children:a?n.jsx(t.Suspense,{fallback:i,children:e}):i})},rr=t.lazy(async()=>await o(()=>import("./index-DX5Rk45i.js"),__vite__mapDeps([0,1,2,3,4])).then(t=>({default:t.AudienceSection}))),ar=t.lazy(async()=>await o(()=>import("./index-BZNpZnn4.js"),__vite__mapDeps([5,1,2,3])).then(t=>({default:t.ServicesSection}))),lr=t.lazy(async()=>await o(()=>import("./index-BZ3_gtGe.js"),__vite__mapDeps([6,1,2,3])).then(t=>({default:t.ProcessSection}))),ur=t.lazy(async()=>await o(()=>import("./index-_14G4Foq.js"),__vite__mapDeps([7,1,2,3,4,8])).then(t=>({default:t.AboutSection}))),cr=t.lazy(async()=>await o(()=>import("./index-CYjllIGK.js"),__vite__mapDeps([9,1,2,3])).then(t=>({default:t.CTASection}))),hr=t.lazy(async()=>await o(()=>import("./index-DUJfonJs.js"),__vite__mapDeps([10,1,2,8])).then(t=>({default:t.Footer}))),dr=Object.freeze(Object.defineProperty({__proto__:null,HomePage:()=>n.jsxs("div",{className:"min-h-screen bg-white",children:[n.jsx(sr,{}),n.jsx(or,{rootMargin:"300px",children:n.jsx(rr,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(ar,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(lr,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(ur,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(cr,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(hr,{})})]})},Symbol.toStringTag,{value:"Module"}));export{dr as H,nr as a,er as b,tr as c,ir as d,Zo as m}; diff --git a/assets/HomePage-DBMzW8f9.js.br b/assets/HomePage-DBMzW8f9.js.br new file mode 100644 index 0000000..3082cca --- /dev/null +++ b/assets/HomePage-DBMzW8f9.js.br @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DX5Rk45i.js","assets/index-DN8smlv-.js","assets/index-NoJfpD4e.css","assets/Section-D2lu-9JN.js","assets/AnimatedList-DZ_-hrH2.js","assets/index-BZNpZnn4.js","assets/index-BZ3_gtGe.js","assets/index-_14G4Foq.js","assets/socialLinksData-e0AaDjNs.js","assets/index-CYjllIGK.js","assets/index-DUJfonJs.js"])))=>i.map(i=>d[i]); +import{r as t,R as e,j as n,B as i,S as s,_ as o}from"./index-DN8smlv-.js";const r=t.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"}),a=t.createContext({}),l=t.createContext(null),u="undefined"!=typeof document,c=u?t.useLayoutEffect:t.useEffect,h=t.createContext({strict:!1}),d=t=>t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),p="data-"+d("framerAppearId");function m(t){return t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"current")}function f(t){return"string"==typeof t||Array.isArray(t)}function g(t){return null!==t&&"object"==typeof t&&"function"==typeof t.start}const y=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],v=["initial",...y];function x(t){return g(t.animate)||v.some(e=>f(t[e]))}function P(t){return Boolean(x(t)||t.variants)}function b(e){const{initial:n,animate:i}=function(t,e){if(x(t)){const{initial:e,animate:n}=t;return{initial:!1===e||f(e)?e:void 0,animate:f(n)?n:void 0}}return!1!==t.inherit?e:{}}(e,t.useContext(a));return t.useMemo(()=>({initial:n,animate:i}),[T(n),T(i)])}function T(t){return Array.isArray(t)?t.join(" "):t}const w={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},S={};for(const mr in w)S[mr]={isEnabled:t=>w[mr].some(e=>!!t[e])};const A=t.createContext({}),E=t.createContext({}),V=Symbol.for("motionComponentSymbol");function C({preloadedFeatures:e,createVisualElement:n,useRender:i,useVisualState:s,Component:o}){e&&function(t){for(const e in t)S[e]={...S[e],...t[e]}}(e);const d=t.forwardRef(function(d,f){let g;const y={...t.useContext(r),...d,layoutId:M(d)},{isStatic:v}=y,x=b(d),P=s(d,v);if(!v&&u){x.visualElement=function(e,n,i,s){const{visualElement:o}=t.useContext(a),u=t.useContext(h),d=t.useContext(l),m=t.useContext(r).reducedMotion,f=t.useRef();s=s||u.renderer,!f.current&&s&&(f.current=s(e,{visualState:n,parent:o,props:i,presenceContext:d,blockInitialAnimation:!!d&&!1===d.initial,reducedMotionConfig:m}));const g=f.current;t.useInsertionEffect(()=>{g&&g.update(i,d)});const y=t.useRef(Boolean(i[p]&&!window.HandoffComplete));return c(()=>{g&&(g.render(),y.current&&g.animationState&&g.animationState.animateChanges())}),t.useEffect(()=>{g&&(g.updateFeatures(),!y.current&&g.animationState&&g.animationState.animateChanges(),y.current&&(y.current=!1,window.HandoffComplete=!0))}),g}(o,P,y,n);const i=t.useContext(E),s=t.useContext(h).strict;x.visualElement&&(g=x.visualElement.loadFeatures(y,s,e,i))}return t.createElement(a.Provider,{value:x},g&&x.visualElement?t.createElement(g,{visualElement:x.visualElement,...y}):null,i(o,d,function(e,n,i){return t.useCallback(t=>{t&&e.mount&&e.mount(t),n&&(t?n.mount(t):n.unmount()),i&&("function"==typeof i?i(t):m(i)&&(i.current=t))},[n])}(P,x.visualElement,f),P,v,x.visualElement))});return d[V]=o,d}function M({layoutId:e}){const n=t.useContext(A).id;return n&&void 0!==e?n+"-"+e:e}function D(t){function e(e,n={}){return C(t(e,n))}if("undefined"==typeof Proxy)return e;const n=new Map;return new Proxy(e,{get:(t,i)=>(n.has(i)||n.set(i,e(i)),n.get(i))})}const j=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function R(t){return"string"==typeof t&&!t.includes("-")&&!!(j.indexOf(t)>-1||/[A-Z]/.test(t))}const k={};const L=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],B=new Set(L);function F(t,{layout:e,layoutId:n}){return B.has(t)||t.startsWith("origin")||(e||void 0!==n)&&(!!k[t]||"opacity"===t)}const O=t=>Boolean(t&&t.getVelocity),I={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},U=L.length;const N=t=>e=>"string"==typeof e&&e.startsWith(t),W=N("--"),_=N("var(--"),z=(t,e)=>e&&"number"==typeof t?e.transform(t):t,H=(t,e,n)=>Math.min(Math.max(n,t),e),$={test:t=>"number"==typeof t,parse:parseFloat,transform:t=>t},Y={...$,transform:t=>H(0,1,t)},X={...$,default:1},G=t=>Math.round(1e5*t)/1e5,q=/(-)?([\d]*\.?[\d])+/g,Z=/(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))/gi,K=/^(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))$/i;function J(t){return"string"==typeof t}const Q=t=>({test:e=>J(e)&&e.endsWith(t)&&1===e.split(" ").length,parse:parseFloat,transform:e=>`${e}${t}`}),tt=Q("deg"),et=Q("%"),nt=Q("px"),it=Q("vh"),st=Q("vw"),ot={...et,parse:t=>et.parse(t)/100,transform:t=>et.transform(100*t)},rt={...$,transform:Math.round},at={borderWidth:nt,borderTopWidth:nt,borderRightWidth:nt,borderBottomWidth:nt,borderLeftWidth:nt,borderRadius:nt,radius:nt,borderTopLeftRadius:nt,borderTopRightRadius:nt,borderBottomRightRadius:nt,borderBottomLeftRadius:nt,width:nt,maxWidth:nt,height:nt,maxHeight:nt,size:nt,top:nt,right:nt,bottom:nt,left:nt,padding:nt,paddingTop:nt,paddingRight:nt,paddingBottom:nt,paddingLeft:nt,margin:nt,marginTop:nt,marginRight:nt,marginBottom:nt,marginLeft:nt,rotate:tt,rotateX:tt,rotateY:tt,rotateZ:tt,scale:X,scaleX:X,scaleY:X,scaleZ:X,skew:tt,skewX:tt,skewY:tt,distance:nt,translateX:nt,translateY:nt,translateZ:nt,x:nt,y:nt,z:nt,perspective:nt,transformPerspective:nt,opacity:Y,originX:ot,originY:ot,originZ:nt,zIndex:rt,fillOpacity:Y,strokeOpacity:Y,numOctaves:rt};function lt(t,e,n,i){const{style:s,vars:o,transform:r,transformOrigin:a}=t;let l=!1,u=!1,c=!0;for(const h in e){const t=e[h];if(W(h)){o[h]=t;continue}const n=at[h],i=z(t,n);if(B.has(h)){if(l=!0,r[h]=i,!c)continue;t!==(n.default||0)&&(c=!1)}else h.startsWith("origin")?(u=!0,a[h]=i):s[h]=i}if(e.transform||(l||i?s.transform=function(t,{enableHardwareAcceleration:e=!0,allowTransformNone:n=!0},i,s){let o="";for(let r=0;r({style:{},transform:{},transformOrigin:{},vars:{}});function ct(t,e,n){for(const i in e)O(e[i])||F(i,n)||(t[i]=e[i])}function ht(e,n,i){const s={};return ct(s,e.style||{},e),Object.assign(s,function({transformTemplate:e},n,i){return t.useMemo(()=>{const t={style:{},transform:{},transformOrigin:{},vars:{}};return lt(t,n,{enableHardwareAcceleration:!i},e),Object.assign({},t.vars,t.style)},[n])}(e,n,i)),e.transformValues?e.transformValues(s):s}function dt(t,e,n){const i={},s=ht(t,e,n);return t.drag&&!1!==t.dragListener&&(i.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout="none",s.touchAction=!0===t.drag?"none":"pan-"+("x"===t.drag?"y":"x")),void 0===t.tabIndex&&(t.onTap||t.onTapStart||t.whileTap)&&(i.tabIndex=0),i.style=s,i}const pt=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","transformValues","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function mt(t){return t.startsWith("while")||t.startsWith("drag")&&"draggable"!==t||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||pt.has(t)}let ft=t=>!mt(t);try{(gt=require("@emotion/is-prop-valid").default)&&(ft=t=>t.startsWith("on")?!mt(t):gt(t))}catch(pr){}var gt;function yt(t,e,n){return"string"==typeof t?t:nt.transform(e+n*t)}const vt={offset:"stroke-dashoffset",array:"stroke-dasharray"},xt={offset:"strokeDashoffset",array:"strokeDasharray"};function Pt(t,{attrX:e,attrY:n,attrScale:i,originX:s,originY:o,pathLength:r,pathSpacing:a=1,pathOffset:l=0,...u},c,h,d){if(lt(t,u,c,d),h)return void(t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox));t.attrs=t.style,t.style={};const{attrs:p,style:m,dimensions:f}=t;p.transform&&(f&&(m.transform=p.transform),delete p.transform),f&&(void 0!==s||void 0!==o||m.transform)&&(m.transformOrigin=function(t,e,n){return`${yt(e,t.x,t.width)} ${yt(n,t.y,t.height)}`}(f,void 0!==s?s:.5,void 0!==o?o:.5)),void 0!==e&&(p.x=e),void 0!==n&&(p.y=n),void 0!==i&&(p.scale=i),void 0!==r&&function(t,e,n=1,i=0,s=!0){t.pathLength=1;const o=s?vt:xt;t[o.offset]=nt.transform(-i);const r=nt.transform(e),a=nt.transform(n);t[o.array]=`${r} ${a}`}(p,r,a,l,!1)}const bt=()=>({style:{},transform:{},transformOrigin:{},vars:{},attrs:{}}),Tt=t=>"string"==typeof t&&"svg"===t.toLowerCase();function wt(e,n,i,s){const o=t.useMemo(()=>{const t={style:{},transform:{},transformOrigin:{},vars:{},attrs:{}};return Pt(t,n,{enableHardwareAcceleration:!1},Tt(s),e.transformTemplate),{...t.attrs,style:{...t.style}}},[n]);if(e.style){const t={};ct(t,e.style,e),o.style={...t,...o.style}}return o}function St(e=!1){return(n,i,s,{latestValues:o},r)=>{const a=(R(n)?wt:dt)(i,o,r,n),l=function(t,e,n){const i={};for(const s in t)"values"===s&&"object"==typeof t.values||(ft(s)||!0===n&&mt(s)||!e&&!mt(s)||t.draggable&&s.startsWith("onDrag"))&&(i[s]=t[s]);return i}(i,"string"==typeof n,e),u={...l,...a,ref:s},{children:c}=i,h=t.useMemo(()=>O(c)?c.get():c,[c]);return t.createElement(n,{...u,children:h})}}function At(t,{style:e,vars:n},i,s){Object.assign(t.style,e,s&&s.getProjectionStyles(i));for(const o in n)t.style.setProperty(o,n[o])}const Et=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function Vt(t,e,n,i){At(t,e,void 0,i);for(const s in e.attrs)t.setAttribute(Et.has(s)?s:d(s),e.attrs[s])}function Ct(t,e){const{style:n}=t,i={};for(const s in n)(O(n[s])||e.style&&O(e.style[s])||F(s,t))&&(i[s]=n[s]);return i}function Mt(t,e){const n=Ct(t,e);for(const i in t)if(O(t[i])||O(e[i])){n[-1!==L.indexOf(i)?"attr"+i.charAt(0).toUpperCase()+i.substring(1):i]=t[i]}return n}function Dt(t,e,n,i={},s={}){return"function"==typeof e&&(e=e(void 0!==n?n:t.custom,i,s)),"string"==typeof e&&(e=t.variants&&t.variants[e]),"function"==typeof e&&(e=e(void 0!==n?n:t.custom,i,s)),e}const jt=t=>Array.isArray(t),Rt=t=>jt(t)?t[t.length-1]||0:t;function kt(t){const e=O(t)?t.get():t;return n=e,Boolean(n&&"object"==typeof n&&n.mix&&n.toValue)?e.toValue():e;var n}const Lt=e=>(n,i)=>{const s=t.useContext(a),o=t.useContext(l),r=()=>function({scrapeMotionValuesFromProps:t,createRenderState:e,onMount:n},i,s,o){const r={latestValues:Bt(i,s,o,t),renderState:e()};return n&&(r.mount=t=>n(i,t,r)),r}(e,n,s,o);return i?r():function(e){const n=t.useRef(null);return null===n.current&&(n.current=e()),n.current}(r)};function Bt(t,e,n,i){const s={},o=i(t,{});for(const d in o)s[d]=kt(o[d]);let{initial:r,animate:a}=t;const l=x(t),u=P(t);e&&u&&!l&&!1!==t.inherit&&(void 0===r&&(r=e.initial),void 0===a&&(a=e.animate));let c=!!n&&!1===n.initial;c=c||!1===r;const h=c?a:r;if(h&&"boolean"!=typeof h&&!g(h)){(Array.isArray(h)?h:[h]).forEach(e=>{const n=Dt(t,e);if(!n)return;const{transitionEnd:i,transition:o,...r}=n;for(const t in r){let e=r[t];if(Array.isArray(e)){e=e[c?e.length-1:0]}null!==e&&(s[t]=e)}for(const t in i)s[t]=i[t]})}return s}const Ft=t=>t;class Ot{constructor(){this.order=[],this.scheduled=new Set}add(t){if(!this.scheduled.has(t))return this.scheduled.add(t),this.order.push(t),!0}remove(t){const e=this.order.indexOf(t);-1!==e&&(this.order.splice(e,1),this.scheduled.delete(t))}clear(){this.order.length=0,this.scheduled.clear()}}const It=["prepare","read","update","preRender","render","postRender"];const{schedule:Ut,cancel:Nt,state:Wt,steps:_t}=function(t,e){let n=!1,i=!0;const s={delta:0,timestamp:0,isProcessing:!1},o=It.reduce((t,e)=>(t[e]=function(t){let e=new Ot,n=new Ot,i=0,s=!1,o=!1;const r=new WeakSet,a={schedule:(t,o=!1,a=!1)=>{const l=a&&s,u=l?e:n;return o&&r.add(t),u.add(t)&&l&&s&&(i=e.order.length),t},cancel:t=>{n.remove(t),r.delete(t)},process:l=>{if(s)o=!0;else{if(s=!0,[e,n]=[n,e],n.clear(),i=e.order.length,i)for(let n=0;nn=!0),t),{}),r=t=>o[t].process(s),a=()=>{const o=performance.now();n=!1,s.delta=i?1e3/60:Math.max(Math.min(o-s.timestamp,40),1),s.timestamp=o,s.isProcessing=!0,It.forEach(r),s.isProcessing=!1,n&&e&&(i=!1,t(a))};return{schedule:It.reduce((e,r)=>{const l=o[r];return e[r]=(e,o=!1,r=!1)=>(n||(n=!0,i=!0,s.isProcessing||t(a)),l.schedule(e,o,r)),e},{}),cancel:t=>It.forEach(e=>o[e].cancel(t)),state:s,steps:o}}("undefined"!=typeof requestAnimationFrame?requestAnimationFrame:Ft,!0),zt={useVisualState:Lt({scrapeMotionValuesFromProps:Mt,createRenderState:bt,onMount:(t,e,{renderState:n,latestValues:i})=>{Ut.read(()=>{try{n.dimensions="function"==typeof e.getBBox?e.getBBox():e.getBoundingClientRect()}catch(t){n.dimensions={x:0,y:0,width:0,height:0}}}),Ut.render(()=>{Pt(n,i,{enableHardwareAcceleration:!1},Tt(e.tagName),t.transformTemplate),Vt(e,n)})}})},Ht={useVisualState:Lt({scrapeMotionValuesFromProps:Ct,createRenderState:ut})};function $t(t,e,n,i={passive:!0}){return t.addEventListener(e,n,i),()=>t.removeEventListener(e,n)}const Yt=t=>"mouse"===t.pointerType?"number"!=typeof t.button||t.button<=0:!1!==t.isPrimary;function Xt(t,e="page"){return{point:{x:t[e+"X"],y:t[e+"Y"]}}}function Gt(t,e,n,i){return $t(t,e,(t=>e=>Yt(e)&&t(e,Xt(e)))(n),i)}const qt=(t,e)=>n=>e(t(n)),Zt=(...t)=>t.reduce(qt);function Kt(t){let e=null;return()=>{const n=()=>{e=null};return null===e&&(e=t,n)}}const Jt=Kt("dragHorizontal"),Qt=Kt("dragVertical");function te(t){let e=!1;if("y"===t)e=Qt();else if("x"===t)e=Jt();else{const t=Jt(),n=Qt();t&&n?e=()=>{t(),n()}:(t&&t(),n&&n())}return e}function ee(){const t=te(!0);return!t||(t(),!1)}class ne{constructor(t){this.isMounted=!1,this.node=t}update(){}}function ie(t,e){const n="pointer"+(e?"enter":"leave"),i="onHover"+(e?"Start":"End");return Gt(t.current,n,(n,s)=>{if("touch"===n.pointerType||ee())return;const o=t.getProps();t.animationState&&o.whileHover&&t.animationState.setActive("whileHover",e),o[i]&&Ut.update(()=>o[i](n,s))},{passive:!t.getProps()[i]})}const se=(t,e)=>!!e&&(t===e||se(t,e.parentElement));function oe(t,e){if(!e)return;const n=new PointerEvent("pointer"+t);e(n,Xt(n))}const re=new WeakMap,ae=new WeakMap,le=t=>{const e=re.get(t.target);e&&e(t)},ue=t=>{t.forEach(le)};function ce(t,e,n){const i=function({root:t,...e}){const n=t||document;ae.has(n)||ae.set(n,{});const i=ae.get(n),s=JSON.stringify(e);return i[s]||(i[s]=new IntersectionObserver(ue,{root:t,...e})),i[s]}(e);return re.set(t,n),i.observe(t),()=>{re.delete(t),i.unobserve(t)}}const he={some:0,all:1};const de={inView:{Feature:class extends ne{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:e,margin:n,amount:i="some",once:s}=t,o={root:e?e.current:void 0,rootMargin:n,threshold:"number"==typeof i?i:he[i]};return ce(this.node.current,o,t=>{const{isIntersecting:e}=t;if(this.isInView===e)return;if(this.isInView=e,s&&!e&&this.hasEnteredView)return;e&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",e);const{onViewportEnter:n,onViewportLeave:i}=this.node.getProps(),o=e?n:i;o&&o(t)})}mount(){this.startObserver()}update(){if("undefined"==typeof IntersectionObserver)return;const{props:t,prevProps:e}=this.node;["amount","margin","root"].some(function({viewport:t={}},{viewport:e={}}={}){return n=>t[n]!==e[n]}(t,e))&&this.startObserver()}unmount(){}}},tap:{Feature:class extends ne{constructor(){super(...arguments),this.removeStartListeners=Ft,this.removeEndListeners=Ft,this.removeAccessibleListeners=Ft,this.startPointerPress=(t,e)=>{if(this.isPressing)return;this.removeEndListeners();const n=this.node.getProps(),i=Gt(window,"pointerup",(t,e)=>{if(!this.checkPressEnd())return;const{onTap:n,onTapCancel:i,globalTapTarget:s}=this.node.getProps();Ut.update(()=>{s||se(this.node.current,t.target)?n&&n(t,e):i&&i(t,e)})},{passive:!(n.onTap||n.onPointerUp)}),s=Gt(window,"pointercancel",(t,e)=>this.cancelPress(t,e),{passive:!(n.onTapCancel||n.onPointerCancel)});this.removeEndListeners=Zt(i,s),this.startPress(t,e)},this.startAccessiblePress=()=>{const t=$t(this.node.current,"keydown",t=>{if("Enter"!==t.key||this.isPressing)return;this.removeEndListeners(),this.removeEndListeners=$t(this.node.current,"keyup",t=>{"Enter"===t.key&&this.checkPressEnd()&&oe("up",(t,e)=>{const{onTap:n}=this.node.getProps();n&&Ut.update(()=>n(t,e))})}),oe("down",(t,e)=>{this.startPress(t,e)})}),e=$t(this.node.current,"blur",()=>{this.isPressing&&oe("cancel",(t,e)=>this.cancelPress(t,e))});this.removeAccessibleListeners=Zt(t,e)}}startPress(t,e){this.isPressing=!0;const{onTapStart:n,whileTap:i}=this.node.getProps();i&&this.node.animationState&&this.node.animationState.setActive("whileTap",!0),n&&Ut.update(()=>n(t,e))}checkPressEnd(){this.removeEndListeners(),this.isPressing=!1;return this.node.getProps().whileTap&&this.node.animationState&&this.node.animationState.setActive("whileTap",!1),!ee()}cancelPress(t,e){if(!this.checkPressEnd())return;const{onTapCancel:n}=this.node.getProps();n&&Ut.update(()=>n(t,e))}mount(){const t=this.node.getProps(),e=Gt(t.globalTapTarget?window:this.node.current,"pointerdown",this.startPointerPress,{passive:!(t.onTapStart||t.onPointerStart)}),n=$t(this.node.current,"focus",this.startAccessiblePress);this.removeStartListeners=Zt(e,n)}unmount(){this.removeStartListeners(),this.removeEndListeners(),this.removeAccessibleListeners()}}},focus:{Feature:class extends ne{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch(e){t=!0}t&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=Zt($t(this.node.current,"focus",()=>this.onFocus()),$t(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}},hover:{Feature:class extends ne{mount(){this.unmount=Zt(ie(this.node,!0),ie(this.node,!1))}unmount(){}}}};function pe(t,e){if(!Array.isArray(e))return!1;const n=e.length;if(n!==t.length)return!1;for(let i=0;ie[n]=t.get()),e}(t),function(t){const e={};return t.values.forEach((t,n)=>e[n]=t.getVelocity()),e}(t))}let fe=Ft;const ge=t=>1e3*t,ye=t=>t/1e3,ve=!1,xe=t=>Array.isArray(t)&&"number"==typeof t[0];function Pe(t){return Boolean(!t||"string"==typeof t&&Te[t]||xe(t)||Array.isArray(t)&&t.every(Pe))}const be=([t,e,n,i])=>`cubic-bezier(${t}, ${e}, ${n}, ${i})`,Te={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:be([0,.65,.55,1]),circOut:be([.55,0,1,.45]),backIn:be([.31,.01,.66,-.59]),backOut:be([.33,1.53,.69,.99])};function we(t){if(t)return xe(t)?be(t):Array.isArray(t)?t.map(we):Te[t]}const Se=(t,e,n)=>(((1-3*n+3*e)*t+(3*n-6*e))*t+3*e)*t;function Ae(t,e,n,i){if(t===e&&n===i)return Ft;const s=e=>function(t,e,n,i,s){let o,r,a=0;do{r=e+(n-e)/2,o=Se(r,i,s)-t,o>0?n=r:e=r}while(Math.abs(o)>1e-7&&++a<12);return r}(e,0,1,t,n);return t=>0===t||1===t?t:Se(s(t),e,i)}const Ee=Ae(.42,0,1,1),Ve=Ae(0,0,.58,1),Ce=Ae(.42,0,.58,1),Me=t=>e=>e<=.5?t(2*e)/2:(2-t(2*(1-e)))/2,De=t=>e=>1-t(1-e),je=t=>1-Math.sin(Math.acos(t)),Re=De(je),ke=Me(je),Le=Ae(.33,1.53,.69,.99),Be=De(Le),Fe=Me(Be),Oe={linear:Ft,easeIn:Ee,easeInOut:Ce,easeOut:Ve,circIn:je,circInOut:ke,circOut:Re,backIn:Be,backInOut:Fe,backOut:Le,anticipate:t=>(t*=2)<1?.5*Be(t):.5*(2-Math.pow(2,-10*(t-1)))},Ie=t=>{if(Array.isArray(t)){fe(4===t.length);const[e,n,i,s]=t;return Ae(e,n,i,s)}return"string"==typeof t?Oe[t]:t},Ue=(t,e)=>n=>Boolean(J(n)&&K.test(n)&&n.startsWith(t)||e&&Object.prototype.hasOwnProperty.call(n,e)),Ne=(t,e,n)=>i=>{if(!J(i))return i;const[s,o,r,a]=i.match(q);return{[t]:parseFloat(s),[e]:parseFloat(o),[n]:parseFloat(r),alpha:void 0!==a?parseFloat(a):1}},We={...$,transform:t=>Math.round((t=>H(0,255,t))(t))},_e={test:Ue("rgb","red"),parse:Ne("red","green","blue"),transform:({red:t,green:e,blue:n,alpha:i=1})=>"rgba("+We.transform(t)+", "+We.transform(e)+", "+We.transform(n)+", "+G(Y.transform(i))+")"};const ze={test:Ue("#"),parse:function(t){let e="",n="",i="",s="";return t.length>5?(e=t.substring(1,3),n=t.substring(3,5),i=t.substring(5,7),s=t.substring(7,9)):(e=t.substring(1,2),n=t.substring(2,3),i=t.substring(3,4),s=t.substring(4,5),e+=e,n+=n,i+=i,s+=s),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(i,16),alpha:s?parseInt(s,16)/255:1}},transform:_e.transform},He={test:Ue("hsl","hue"),parse:Ne("hue","saturation","lightness"),transform:({hue:t,saturation:e,lightness:n,alpha:i=1})=>"hsla("+Math.round(t)+", "+et.transform(G(e))+", "+et.transform(G(n))+", "+G(Y.transform(i))+")"},$e={test:t=>_e.test(t)||ze.test(t)||He.test(t),parse:t=>_e.test(t)?_e.parse(t):He.test(t)?He.parse(t):ze.parse(t),transform:t=>J(t)?t:t.hasOwnProperty("red")?_e.transform(t):He.transform(t)},Ye=(t,e,n)=>-n*t+n*e+t;function Xe(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}const Ge=(t,e,n)=>{const i=t*t;return Math.sqrt(Math.max(0,n*(e*e-i)+i))},qe=[ze,_e,He];function Ze(t){const e=(n=t,qe.find(t=>t.test(n)));var n;let i=e.parse(t);return e===He&&(i=function({hue:t,saturation:e,lightness:n,alpha:i}){t/=360,n/=100;let s=0,o=0,r=0;if(e/=100){const i=n<.5?n*(1+e):n+e-n*e,a=2*n-i;s=Xe(a,i,t+1/3),o=Xe(a,i,t),r=Xe(a,i,t-1/3)}else s=o=r=n;return{red:Math.round(255*s),green:Math.round(255*o),blue:Math.round(255*r),alpha:i}}(i)),i}const Ke=(t,e)=>{const n=Ze(t),i=Ze(e),s={...n};return t=>(s.red=Ge(n.red,i.red,t),s.green=Ge(n.green,i.green,t),s.blue=Ge(n.blue,i.blue,t),s.alpha=Ye(n.alpha,i.alpha,t),_e.transform(s))};const Je={regex:/var\s*\(\s*--[\w-]+(\s*,\s*(?:(?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)+)?\s*\)/g,countKey:"Vars",token:"${v}",parse:Ft},Qe={regex:Z,countKey:"Colors",token:"${c}",parse:$e.parse},tn={regex:q,countKey:"Numbers",token:"${n}",parse:$.parse};function en(t,{regex:e,countKey:n,token:i,parse:s}){const o=t.tokenised.match(e);o&&(t["num"+n]=o.length,t.tokenised=t.tokenised.replace(e,i),t.values.push(...o.map(s)))}function nn(t){const e=t.toString(),n={value:e,tokenised:e,values:[],numVars:0,numColors:0,numNumbers:0};return n.value.includes("var(--")&&en(n,Je),en(n,Qe),en(n,tn),n}function sn(t){return nn(t).values}function on(t){const{values:e,numColors:n,numVars:i,tokenised:s}=nn(t),o=e.length;return t=>{let e=s;for(let s=0;s"number"==typeof t?0:t;const an={test:function(t){var e,n;return isNaN(t)&&J(t)&&((null===(e=t.match(q))||void 0===e?void 0:e.length)||0)+((null===(n=t.match(Z))||void 0===n?void 0:n.length)||0)>0},parse:sn,createTransformer:on,getAnimatableNone:function(t){const e=sn(t);return on(t)(e.map(rn))}},ln=(t,e)=>n=>`${n>0?e:t}`;function un(t,e){return"number"==typeof t?n=>Ye(t,e,n):$e.test(t)?Ke(t,e):t.startsWith("var(")?ln(t,e):dn(t,e)}const cn=(t,e)=>{const n=[...t],i=n.length,s=t.map((t,n)=>un(t,e[n]));return t=>{for(let e=0;e{const n={...t,...e},i={};for(const s in n)void 0!==t[s]&&void 0!==e[s]&&(i[s]=un(t[s],e[s]));return t=>{for(const e in i)n[e]=i[e](t);return n}},dn=(t,e)=>{const n=an.createTransformer(e),i=nn(t),s=nn(e);return i.numVars===s.numVars&&i.numColors===s.numColors&&i.numNumbers>=s.numNumbers?Zt(cn(i.values,s.values),n):ln(t,e)},pn=(t,e,n)=>{const i=e-t;return 0===i?1:(n-t)/i},mn=(t,e)=>n=>Ye(t,e,n);function fn(t,e,n){const i=[],s=n||("number"==typeof(o=t[0])?mn:"string"==typeof o?$e.test(o)?Ke:dn:Array.isArray(o)?cn:"object"==typeof o?hn:mn);var o;const r=t.length-1;for(let a=0;ae[0];t[0]>t[o-1]&&(t=[...t].reverse(),e=[...e].reverse());const r=fn(e,i,s),a=r.length,l=e=>{let n=0;if(a>1)for(;nl(H(t[0],t[o-1],e)):l}function yn(t){const e=[0];return function(t,e){const n=t[t.length-1];for(let i=1;i<=e;i++){const s=pn(0,e,i);t.push(Ye(n,1,s))}}(e,t.length-1),e}function vn({duration:t=300,keyframes:e,times:n,ease:i="easeInOut"}){const s=(t=>Array.isArray(t)&&"number"!=typeof t[0])(i)?i.map(Ie):Ie(i),o={done:!1,value:e[0]},r=function(t,e){return t.map(t=>t*e)}(n&&n.length===e.length?n:yn(e),t),a=gn(r,e,{ease:Array.isArray(s)?s:(l=e,u=s,l.map(()=>u||Ce).splice(0,l.length-1))});var l,u;return{calculatedDuration:t,next:e=>(o.value=a(e),o.done=e>=t,o)}}function xn(t,e){return e?t*(1e3/e):0}function Pn(t,e,n){const i=Math.max(e-5,0);return xn(n-t(i),e-i)}const bn=.001;function Tn({duration:t=800,bounce:e=.25,velocity:n=0,mass:i=1}){let s,o,r=1-e;r=H(.05,1,r),t=H(.01,10,ye(t)),r<1?(s=e=>{const i=e*r,s=i*t,o=i-n,a=Sn(e,r),l=Math.exp(-s);return bn-o/a*l},o=e=>{const i=e*r*t,o=i*n+n,a=Math.pow(r,2)*Math.pow(e,2)*t,l=Math.exp(-i),u=Sn(Math.pow(e,2),r);return(-s(e)+bn>0?-1:1)*((o-a)*l)/u}):(s=e=>Math.exp(-e*t)*((e-n)*t+1)-.001,o=e=>Math.exp(-e*t)*(t*t*(n-e)));const a=function(t,e,n){let i=n;for(let s=1;svoid 0!==t[e])}function Cn({keyframes:t,restDelta:e,restSpeed:n,...i}){const s=t[0],o=t[t.length-1],r={done:!1,value:s},{stiffness:a,damping:l,mass:u,duration:c,velocity:h,isResolvedFromDuration:d}=function(t){let e={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...t};if(!Vn(t,En)&&Vn(t,An)){const n=Tn(t);e={...e,...n,mass:1},e.isResolvedFromDuration=!0}return e}({...i,velocity:-ye(i.velocity||0)}),p=h||0,m=l/(2*Math.sqrt(a*u)),f=o-s,g=ye(Math.sqrt(a/u)),y=Math.abs(f)<5;let v;if(n||(n=y?.01:2),e||(e=y?.005:.5),m<1){const t=Sn(g,m);v=e=>{const n=Math.exp(-m*g*e);return o-n*((p+m*g*f)/t*Math.sin(t*e)+f*Math.cos(t*e))}}else if(1===m)v=t=>o-Math.exp(-g*t)*(f+(p+g*f)*t);else{const t=g*Math.sqrt(m*m-1);v=e=>{const n=Math.exp(-m*g*e),i=Math.min(t*e,300);return o-n*((p+m*g*f)*Math.sinh(i)+t*f*Math.cosh(i))/t}}return{calculatedDuration:d&&c||null,next:t=>{const i=v(t);if(d)r.done=t>=c;else{let s=p;0!==t&&(s=m<1?Pn(v,t,i):0);const a=Math.abs(s)<=n,l=Math.abs(o-i)<=e;r.done=a&&l}return r.value=r.done?o:i,r}}}function Mn({keyframes:t,velocity:e=0,power:n=.8,timeConstant:i=325,bounceDamping:s=10,bounceStiffness:o=500,modifyTarget:r,min:a,max:l,restDelta:u=.5,restSpeed:c}){const h=t[0],d={done:!1,value:h},p=t=>void 0===a?l:void 0===l||Math.abs(a-t)-m*Math.exp(-t/i),v=t=>g+y(t),x=t=>{const e=y(t),n=v(t);d.done=Math.abs(e)<=u,d.value=d.done?g:n};let P,b;const T=t=>{var e;(e=d.value,void 0!==a&&el)&&(P=t,b=Cn({keyframes:[d.value,p(d.value)],velocity:Pn(v,t,d.value),damping:s,stiffness:o,restDelta:u,restSpeed:c}))};return T(0),{calculatedDuration:null,next:t=>{let e=!1;return b||void 0!==P||(e=!0,x(t),T(t)),void 0!==P&&t>P?b.next(t-P):(!e&&x(t),d)}}}const Dn=t=>{const e=({timestamp:e})=>t(e);return{start:()=>Ut.update(e,!0),stop:()=>Nt(e),now:()=>Wt.isProcessing?Wt.timestamp:performance.now()}};function jn(t){let e=0;let n=t.next(e);for(;!n.done&&e<2e4;)e+=50,n=t.next(e);return e>=2e4?1/0:e}const Rn={decay:Mn,inertia:Mn,tween:vn,keyframes:vn,spring:Cn};function kn({autoplay:t=!0,delay:e=0,driver:n=Dn,keyframes:i,type:s="keyframes",repeat:o=0,repeatDelay:r=0,repeatType:a="loop",onPlay:l,onStop:u,onComplete:c,onUpdate:h,...d}){let p,m,f=1,g=!1;const y=()=>{m=new Promise(t=>{p=t})};let v;y();const x=Rn[s]||vn;let P;x!==vn&&"number"!=typeof i[0]&&(P=gn([0,100],i,{clamp:!1}),i=[0,100]);const b=x({...d,keyframes:i});let T;"mirror"===a&&(T=x({...d,keyframes:[...i].reverse(),velocity:-(d.velocity||0)}));let w="idle",S=null,A=null,E=null;null===b.calculatedDuration&&o&&(b.calculatedDuration=jn(b));const{calculatedDuration:V}=b;let C=1/0,M=1/0;null!==V&&(C=V+r,M=C*(o+1)-r);let D=0;const j=t=>{if(null===A)return;f>0&&(A=Math.min(A,t)),f<0&&(A=Math.min(t-M/f,A)),D=null!==S?S:Math.round(t-A)*f;const n=D-e*(f>=0?1:-1),s=f>=0?n<0:n>M;D=Math.max(n,0),"finished"===w&&null===S&&(D=M);let l=D,u=b;if(o){const t=Math.min(D,M)/C;let e=Math.floor(t),n=t%1;!n&&t>=1&&(n=1),1===n&&e--,e=Math.min(e,o+1);Boolean(e%2)&&("reverse"===a?(n=1-n,r&&(n-=r/C)):"mirror"===a&&(u=T)),l=H(0,1,n)*C}const c=s?{done:!1,value:i[0]}:u.next(l);P&&(c.value=P(c.value));let{done:d}=c;s||null===V||(d=f>=0?D>=M:D<=0);const p=null===S&&("finished"===w||"running"===w&&d);return h&&h(c.value),p&&L(),c},R=()=>{v&&v.stop(),v=void 0},k=()=>{w="idle",R(),p(),y(),A=E=null},L=()=>{w="finished",c&&c(),R(),p()},B=()=>{if(g)return;v||(v=n(j));const t=v.now();l&&l(),null!==S?A=t-S:A&&"finished"!==w||(A=t),"finished"===w&&y(),E=A,S=null,w="running",v.start()};t&&B();const F={then:(t,e)=>m.then(t,e),get time(){return ye(D)},set time(t){t=ge(t),D=t,null===S&&v&&0!==f?A=v.now()-t/f:S=t},get duration(){const t=null===b.calculatedDuration?jn(b):b.calculatedDuration;return ye(t)},get speed(){return f},set speed(t){t!==f&&v&&(f=t,F.time=ye(D))},get state(){return w},play:B,pause:()=>{w="paused",S=D},stop:()=>{g=!0,"idle"!==w&&(w="idle",u&&u(),k())},cancel:()=>{null!==E&&j(E),k()},complete:()=>{w="finished"},sample:t=>(A=0,j(t))};return F}const Ln=function(t){let e;return()=>(void 0===e&&(e=t()),e)}(()=>Object.hasOwnProperty.call(Element.prototype,"animate")),Bn=new Set(["opacity","clipPath","filter","transform","backgroundColor"]);function Fn(t,e,{onUpdate:n,onComplete:i,...s}){if(!(Ln()&&Bn.has(e)&&!s.repeatDelay&&"mirror"!==s.repeatType&&0!==s.damping&&"inertia"!==s.type))return!1;let o,r,a=!1,l=!1;const u=()=>{r=new Promise(t=>{o=t})};u();let{keyframes:c,duration:h=300,ease:d,times:p}=s;if(((t,e)=>"spring"===e.type||"backgroundColor"===t||!Pe(e.ease))(e,s)){const t=kn({...s,repeat:0,delay:0});let e={done:!1,value:c[0]};const n=[];let i=0;for(;!e.done&&i<2e4;)e=t.sample(i),n.push(e.value),i+=10;p=void 0,c=n,h=i-10,d="linear"}const m=function(t,e,n,{delay:i=0,duration:s,repeat:o=0,repeatType:r="loop",ease:a,times:l}={}){const u={[e]:n};l&&(u.offset=l);const c=we(a);return Array.isArray(c)&&(u.easing=c),t.animate(u,{delay:i,duration:s,easing:Array.isArray(c)?"linear":c,fill:"both",iterations:o+1,direction:"reverse"===r?"alternate":"normal"})}(t.owner.current,e,c,{...s,duration:h,ease:d,times:p}),f=()=>{l=!1,m.cancel()},g=()=>{l=!0,Ut.update(f),o(),u()};m.onfinish=()=>{l||(t.set(function(t,{repeat:e,repeatType:n="loop"}){return t[e&&"loop"!==n&&e%2==1?0:t.length-1]}(c,s)),i&&i(),g())};return{then:(t,e)=>r.then(t,e),attachTimeline:t=>(m.timeline=t,m.onfinish=null,Ft),get time(){return ye(m.currentTime||0)},set time(t){m.currentTime=ge(t)},get speed(){return m.playbackRate},set speed(t){m.playbackRate=t},get duration(){return ye(h)},play:()=>{a||(m.play(),Nt(f))},pause:()=>m.pause(),stop:()=>{if(a=!0,"idle"===m.playState)return;const{currentTime:e}=m;if(e){const n=kn({...s,autoplay:!1});t.setWithVelocity(n.sample(e-10).value,n.sample(e).value,10)}g()},complete:()=>{l||m.finish()},cancel:g}}const On={type:"spring",stiffness:500,damping:25,restSpeed:10},In={type:"keyframes",duration:.8},Un={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},Nn=(t,{keyframes:e})=>e.length>2?In:B.has(t)?t.startsWith("scale")?{type:"spring",stiffness:550,damping:0===e[1]?2*Math.sqrt(550):30,restSpeed:10}:On:Un,Wn=(t,e)=>"zIndex"!==t&&(!("number"!=typeof e&&!Array.isArray(e))||!("string"!=typeof e||!an.test(e)&&"0"!==e||e.startsWith("url("))),_n=new Set(["brightness","contrast","saturate","opacity"]);function zn(t){const[e,n]=t.slice(0,-1).split("(");if("drop-shadow"===e)return t;const[i]=n.match(q)||[];if(!i)return t;const s=n.replace(i,"");let o=_n.has(e)?1:0;return i!==n&&(o*=100),e+"("+o+s+")"}const Hn=/([a-z-]*)\(.*?\)/g,$n={...an,getAnimatableNone:t=>{const e=t.match(Hn);return e?e.map(zn).join(" "):t}},Yn={...at,color:$e,backgroundColor:$e,outlineColor:$e,fill:$e,stroke:$e,borderColor:$e,borderTopColor:$e,borderRightColor:$e,borderBottomColor:$e,borderLeftColor:$e,filter:$n,WebkitFilter:$n},Xn=t=>Yn[t];function Gn(t,e){let n=Xn(t);return n!==$n&&(n=an),n.getAnimatableNone?n.getAnimatableNone(e):void 0}const qn=t=>/^0[^.\s]+$/.test(t);function Zn(t){return"number"==typeof t?0===t:null!==t?"none"===t||"0"===t||qn(t):void 0}function Kn(t,e){return t[e]||t.default||t}const Jn=!1,Qn=(t,e,n,i={})=>s=>{const o=Kn(i,t)||{},r=o.delay||i.delay||0;let{elapsed:a=0}=i;a-=ge(r);const l=function(t,e,n,i){const s=Wn(e,n);let o;o=Array.isArray(n)?[...n]:[null,n];const r=void 0!==i.from?i.from:t.get();let a;const l=[];for(let u=0;u{e.set(t),o.onUpdate&&o.onUpdate(t)},onComplete:()=>{s(),o.onComplete&&o.onComplete()}};if(function({when:t,delay:e,delayChildren:n,staggerChildren:i,staggerDirection:s,repeat:o,repeatType:r,repeatDelay:a,from:l,elapsed:u,...c}){return!!Object.keys(c).length}(o)||(p={...p,...Nn(t,p)}),p.duration&&(p.duration=ge(p.duration)),p.repeatDelay&&(p.repeatDelay=ge(p.repeatDelay)),!h||!d||ve||!1===o.type||Jn)return function({keyframes:t,delay:e,onUpdate:n,onComplete:i}){const s=()=>(n&&n(t[t.length-1]),i&&i(),{time:0,speed:1,duration:0,play:Ft,pause:Ft,stop:Ft,then:t=>(t(),Promise.resolve()),cancel:Ft,complete:Ft});return e?kn({keyframes:[0,1],duration:0,delay:e,onComplete:s}):s()}(p);if(!i.isHandoff&&e.owner&&e.owner.current instanceof HTMLElement&&!e.owner.getProps().onUpdate){const n=Fn(e,t,p);if(n)return n}return kn(p)};function ti(t){return Boolean(O(t)&&t.add)}const ei=t=>/^\-?\d*\.?\d+$/.test(t);function ni(t,e){-1===t.indexOf(e)&&t.push(e)}function ii(t,e){const n=t.indexOf(e);n>-1&&t.splice(n,1)}class si{constructor(){this.subscriptions=[]}add(t){return ni(this.subscriptions,t),()=>ii(this.subscriptions,t)}notify(t,e,n){const i=this.subscriptions.length;if(i)if(1===i)this.subscriptions[0](t,e,n);else for(let s=0;s{this.prev=this.current,this.current=t;const{delta:n,timestamp:i}=Wt;this.lastUpdated!==i&&(this.timeDelta=n,this.lastUpdated=i,Ut.postRender(this.scheduleVelocityCheck)),this.prev!==this.current&&this.events.change&&this.events.change.notify(this.current),this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()),e&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.scheduleVelocityCheck=()=>Ut.postRender(this.velocityCheck),this.velocityCheck=({timestamp:t})=>{t!==this.lastUpdated&&(this.prev=this.current,this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()))},this.hasAnimated=!1,this.prev=this.current=t,this.canTrackVelocity=(n=this.current,!isNaN(parseFloat(n))),this.owner=e.owner}onChange(t){return this.on("change",t)}on(t,e){this.events[t]||(this.events[t]=new si);const n=this.events[t].add(e);return"change"===t?()=>{n(),Ut.read(()=>{this.events.change.getSize()||this.stop()})}:n}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,e){this.passiveEffect=t,this.stopPassiveEffect=e}set(t,e=!0){e&&this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t,e)}setWithVelocity(t,e,n){this.set(e),this.prev=t,this.timeDelta=n}jump(t){this.updateAndNotify(t),this.prev=t,this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return this.current}getPrevious(){return this.prev}getVelocity(){return this.canTrackVelocity?xn(parseFloat(this.current)-parseFloat(this.prev),this.timeDelta):0}start(t){return this.stop(),new Promise(e=>{this.hasAnimated=!0,this.animation=t(e),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function ri(t,e){return new oi(t,e)}const ai=t=>e=>e.test(t),li=[$,nt,et,tt,st,it,{test:t=>"auto"===t,parse:t=>t}],ui=t=>li.find(ai(t)),ci=[...li,$e,an],hi=t=>ci.find(ai(t));function di(t,e,n){t.hasValue(e)?t.getValue(e).set(n):t.addValue(e,ri(n))}function pi(t,e){if(!e)return;return(e[t]||e.default||e).from}function mi({protectedKeys:t,needsAnimating:e},n){const i=t.hasOwnProperty(n)&&!0!==e[n];return e[n]=!1,i}function fi(t,e){const n=t.get();if(!Array.isArray(e))return n!==e;for(let i=0;il.remove(h))),u.push(d)}return r&&Promise.all(u).then(()=>{r&&function(t,e){const n=me(t,e);let{transitionEnd:i={},transition:s={},...o}=n?t.makeTargetAnimatable(n,!1):{};o={...o,...i};for(const r in o)di(t,r,Rt(o[r]))}(t,r)}),u}function yi(t,e,n={}){const i=me(t,e,n.custom);let{transition:s=t.getDefaultTransition()||{}}=i||{};n.transitionOverride&&(s=n.transitionOverride);const o=i?()=>Promise.all(gi(t,i,n)):()=>Promise.resolve(),r=t.variantChildren&&t.variantChildren.size?(i=0)=>{const{delayChildren:o=0,staggerChildren:r,staggerDirection:a}=s;return function(t,e,n=0,i=0,s=1,o){const r=[],a=(t.variantChildren.size-1)*i,l=1===s?(t=0)=>t*i:(t=0)=>a-t*i;return Array.from(t.variantChildren).sort(vi).forEach((t,i)=>{t.notify("AnimationStart",e),r.push(yi(t,e,{...o,delay:n+l(i)}).then(()=>t.notify("AnimationComplete",e)))}),Promise.all(r)}(t,e,o+i,r,a,n)}:()=>Promise.resolve(),{when:a}=s;if(a){const[t,e]="beforeChildren"===a?[o,r]:[r,o];return t().then(()=>e())}return Promise.all([o(),r(n.delay)])}function vi(t,e){return t.sortNodePosition(e)}const xi=[...y].reverse(),Pi=y.length;function bi(t){return e=>Promise.all(e.map(({animation:e,options:n})=>function(t,e,n={}){let i;if(t.notify("AnimationStart",e),Array.isArray(e)){const s=e.map(e=>yi(t,e,n));i=Promise.all(s)}else if("string"==typeof e)i=yi(t,e,n);else{const s="function"==typeof e?me(t,e,n.custom):e;i=Promise.all(gi(t,s,n))}return i.then(()=>t.notify("AnimationComplete",e))}(t,e,n)))}function Ti(t){let e=bi(t);const n={animate:Si(!0),whileInView:Si(),whileHover:Si(),whileTap:Si(),whileDrag:Si(),whileFocus:Si(),exit:Si()};let i=!0;const s=(e,n)=>{const i=me(t,n);if(i){const{transition:t,transitionEnd:n,...s}=i;e={...e,...s,...n}}return e};function o(o,r){const a=t.getProps(),l=t.getVariantContext(!0)||{},u=[],c=new Set;let h={},d=1/0;for(let e=0;ed&&v,T=!1;const w=Array.isArray(y)?y:[y];let S=w.reduce(s,{});!1===x&&(S={});const{prevResolvedValues:A={}}=m,E={...A,...S},V=t=>{b=!0,c.has(t)&&(T=!0,c.delete(t)),m.needsAnimating[t]=!0};for(const t in E){const e=S[t],n=A[t];if(h.hasOwnProperty(t))continue;let i=!1;i=jt(e)&&jt(n)?!pe(e,n):e!==n,i?void 0!==e?V(t):c.add(t):void 0!==e&&c.has(t)?V(t):m.protectedKeys[t]=!0}m.prevProp=y,m.prevResolvedValues=S,m.isActive&&(h={...h,...S}),i&&t.blockInitialAnimation&&(b=!1),!b||P&&!T||u.push(...w.map(t=>({animation:t,options:{type:p,...o}})))}if(c.size){const e={};c.forEach(n=>{const i=t.getBaseTarget(n);void 0!==i&&(e[n]=i)}),u.push({animation:e})}let p=Boolean(u.length);return!i||!1!==a.initial&&a.initial!==a.animate||t.manuallyAnimateOnMount||(p=!1),i=!1,p?e(u):Promise.resolve()}return{animateChanges:o,setActive:function(e,i,s){var r;if(n[e].isActive===i)return Promise.resolve();null===(r=t.variantChildren)||void 0===r||r.forEach(t=>{var n;return null===(n=t.animationState)||void 0===n?void 0:n.setActive(e,i)}),n[e].isActive=i;const a=o(s,e);for(const t in n)n[t].protectedKeys={};return a},setAnimateFunction:function(n){e=n(t)},getState:()=>n}}function wi(t,e){return"string"==typeof e?e!==t:!!Array.isArray(e)&&!pe(e,t)}function Si(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}let Ai=0;const Ei={animation:{Feature:class extends ne{constructor(t){super(t),t.animationState||(t.animationState=Ti(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();this.unmount(),g(t)&&(this.unmount=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:e}=this.node.prevProps||{};t!==e&&this.updateAnimationControlsSubscription()}unmount(){}}},exit:{Feature:class extends ne{constructor(){super(...arguments),this.id=Ai++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:e,custom:n}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===i)return;const s=this.node.animationState.setActive("exit",!t,{custom:null!=n?n:this.node.getProps().custom});e&&!t&&s.then(()=>e(this.id))}mount(){const{register:t}=this.node.presenceContext||{};t&&(this.unmount=t(this.id))}unmount(){}}}},Vi=(t,e)=>Math.abs(t-e);class Ci{constructor(t,e,{transformPagePoint:n,contextWindow:i,dragSnapToOrigin:s=!1}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!this.lastMoveEvent||!this.lastMoveEventInfo)return;const t=ji(this.lastMoveEventInfo,this.history),e=null!==this.startEvent,n=function(t,e){const n=Vi(t.x,e.x),i=Vi(t.y,e.y);return Math.sqrt(n**2+i**2)}(t.offset,{x:0,y:0})>=3;if(!e&&!n)return;const{point:i}=t,{timestamp:s}=Wt;this.history.push({...i,timestamp:s});const{onStart:o,onMove:r}=this.handlers;e||(o&&o(this.lastMoveEvent,t),this.startEvent=this.lastMoveEvent),r&&r(this.lastMoveEvent,t)},this.handlePointerMove=(t,e)=>{this.lastMoveEvent=t,this.lastMoveEventInfo=Mi(e,this.transformPagePoint),Ut.update(this.updatePoint,!0)},this.handlePointerUp=(t,e)=>{this.end();const{onEnd:n,onSessionEnd:i,resumeAnimation:s}=this.handlers;if(this.dragSnapToOrigin&&s&&s(),!this.lastMoveEvent||!this.lastMoveEventInfo)return;const o=ji("pointercancel"===t.type?this.lastMoveEventInfo:Mi(e,this.transformPagePoint),this.history);this.startEvent&&n&&n(t,o),i&&i(t,o)},!Yt(t))return;this.dragSnapToOrigin=s,this.handlers=e,this.transformPagePoint=n,this.contextWindow=i||window;const o=Mi(Xt(t),this.transformPagePoint),{point:r}=o,{timestamp:a}=Wt;this.history=[{...r,timestamp:a}];const{onSessionStart:l}=e;l&&l(t,ji(o,this.history)),this.removeListeners=Zt(Gt(this.contextWindow,"pointermove",this.handlePointerMove),Gt(this.contextWindow,"pointerup",this.handlePointerUp),Gt(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),Nt(this.updatePoint)}}function Mi(t,e){return e?{point:e(t.point)}:t}function Di(t,e){return{x:t.x-e.x,y:t.y-e.y}}function ji({point:t},e){return{point:t,delta:Di(t,ki(e)),offset:Di(t,Ri(e)),velocity:Li(e,.1)}}function Ri(t){return t[0]}function ki(t){return t[t.length-1]}function Li(t,e){if(t.length<2)return{x:0,y:0};let n=t.length-1,i=null;const s=ki(t);for(;n>=0&&(i=t[n],!(s.timestamp-i.timestamp>ge(e)));)n--;if(!i)return{x:0,y:0};const o=ye(s.timestamp-i.timestamp);if(0===o)return{x:0,y:0};const r={x:(s.x-i.x)/o,y:(s.y-i.y)/o};return r.x===1/0&&(r.x=0),r.y===1/0&&(r.y=0),r}function Bi(t){return t.max-t.min}function Fi(t,e=0,n=.01){return Math.abs(t-e)<=n}function Oi(t,e,n,i=.5){t.origin=i,t.originPoint=Ye(e.min,e.max,t.origin),t.scale=Bi(n)/Bi(e),(Fi(t.scale,1,1e-4)||isNaN(t.scale))&&(t.scale=1),t.translate=Ye(n.min,n.max,t.origin)-t.originPoint,(Fi(t.translate)||isNaN(t.translate))&&(t.translate=0)}function Ii(t,e,n,i){Oi(t.x,e.x,n.x,i?i.originX:void 0),Oi(t.y,e.y,n.y,i?i.originY:void 0)}function Ui(t,e,n){t.min=n.min+e.min,t.max=t.min+Bi(e)}function Ni(t,e,n){t.min=e.min-n.min,t.max=t.min+Bi(e)}function Wi(t,e,n){Ni(t.x,e.x,n.x),Ni(t.y,e.y,n.y)}function _i(t,e,n){return{min:void 0!==e?t.min+e:void 0,max:void 0!==n?t.max+n-(t.max-t.min):void 0}}function zi(t,e){let n=e.min-t.min,i=e.max-t.max;return e.max-e.min({x:{min:0,max:0},y:{min:0,max:0}});function Gi(t){return[t("x"),t("y")]}function qi({top:t,left:e,right:n,bottom:i}){return{x:{min:e,max:n},y:{min:t,max:i}}}function Zi(t){return void 0===t||1===t}function Ki({scale:t,scaleX:e,scaleY:n}){return!Zi(t)||!Zi(e)||!Zi(n)}function Ji(t){return Ki(t)||Qi(t)||t.z||t.rotate||t.rotateX||t.rotateY}function Qi(t){return ts(t.x)||ts(t.y)}function ts(t){return t&&"0%"!==t}function es(t,e,n){return n+e*(t-n)}function ns(t,e,n,i,s){return void 0!==s&&(t=es(t,s,i)),es(t,n,i)+e}function is(t,e=0,n=1,i,s){t.min=ns(t.min,e,n,i,s),t.max=ns(t.max,e,n,i,s)}function ss(t,{x:e,y:n}){is(t.x,e.translate,e.scale,e.originPoint),is(t.y,n.translate,n.scale,n.originPoint)}function os(t){return Number.isInteger(t)||t>1.0000000000001||t<.999999999999?t:1}function rs(t,e){t.min=t.min+e,t.max=t.max+e}function as(t,e,[n,i,s]){const o=void 0!==e[s]?e[s]:.5,r=Ye(t.min,t.max,o);is(t,e[n],e[i],r,e.scale)}const ls=["x","scaleX","originX"],us=["y","scaleY","originY"];function cs(t,e){as(t.x,e,ls),as(t.y,e,us)}function hs(t,e){return qi(function(t,e){if(!e)return t;const n=e({x:t.left,y:t.top}),i=e({x:t.right,y:t.bottom});return{top:n.y,left:n.x,bottom:i.y,right:i.x}}(t.getBoundingClientRect(),e))}const ds=({current:t})=>t?t.ownerDocument.defaultView:null,ps=new WeakMap;class ms{constructor(t){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic={x:{min:0,max:0},y:{min:0,max:0}},this.visualElement=t}start(t,{snapToCursor:e=!1}={}){const{presenceContext:n}=this.visualElement;if(n&&!1===n.isPresent)return;const{dragSnapToOrigin:i}=this.getProps();this.panSession=new Ci(t,{onSessionStart:t=>{const{dragSnapToOrigin:n}=this.getProps();n?this.pauseAnimation():this.stopAnimation(),e&&this.snapToCursor(Xt(t,"page").point)},onStart:(t,e)=>{const{drag:n,dragPropagation:i,onDragStart:s}=this.getProps();if(n&&!i&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=te(n),!this.openGlobalLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Gi(t=>{let e=this.getAxisMotionValue(t).get()||0;if(et.test(e)){const{projection:n}=this.visualElement;if(n&&n.layout){const i=n.layout.layoutBox[t];if(i){e=Bi(i)*(parseFloat(e)/100)}}}this.originPoint[t]=e}),s&&Ut.update(()=>s(t,e),!1,!0);const{animationState:o}=this.visualElement;o&&o.setActive("whileDrag",!0)},onMove:(t,e)=>{const{dragPropagation:n,dragDirectionLock:i,onDirectionLock:s,onDrag:o}=this.getProps();if(!n&&!this.openGlobalLock)return;const{offset:r}=e;if(i&&null===this.currentDirection)return this.currentDirection=function(t,e=10){let n=null;Math.abs(t.y)>e?n="y":Math.abs(t.x)>e&&(n="x");return n}(r),void(null!==this.currentDirection&&s&&s(this.currentDirection));this.updateAxis("x",e.point,r),this.updateAxis("y",e.point,r),this.visualElement.render(),o&&o(t,e)},onSessionEnd:(t,e)=>this.stop(t,e),resumeAnimation:()=>Gi(t=>{var e;return"paused"===this.getAnimationState(t)&&(null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.play())})},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:i,contextWindow:ds(this.visualElement)})}stop(t,e){const n=this.isDragging;if(this.cancel(),!n)return;const{velocity:i}=e;this.startAnimation(i);const{onDragEnd:s}=this.getProps();s&&Ut.update(()=>s(t,e))}cancel(){this.isDragging=!1;const{projection:t,animationState:e}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:n}=this.getProps();!n&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),e&&e.setActive("whileDrag",!1)}updateAxis(t,e,n){const{drag:i}=this.getProps();if(!n||!fs(t,i,this.currentDirection))return;const s=this.getAxisMotionValue(t);let o=this.originPoint[t]+n[t];this.constraints&&this.constraints[t]&&(o=function(t,{min:e,max:n},i){return void 0!==e&&tn&&(t=i?Ye(n,t,i.max):Math.min(t,n)),t}(o,this.constraints[t],this.elastic[t])),s.set(o)}resolveConstraints(){var t;const{dragConstraints:e,dragElastic:n}=this.getProps(),i=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):null===(t=this.visualElement.projection)||void 0===t?void 0:t.layout,s=this.constraints;e&&m(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):this.constraints=!(!e||!i)&&function(t,{top:e,left:n,bottom:i,right:s}){return{x:_i(t.x,n,s),y:_i(t.y,e,i)}}(i.layoutBox,e),this.elastic=function(t=Hi){return!1===t?t=0:!0===t&&(t=Hi),{x:$i(t,"left","right"),y:$i(t,"top","bottom")}}(n),s!==this.constraints&&i&&this.constraints&&!this.hasMutatedConstraints&&Gi(t=>{this.getAxisMotionValue(t)&&(this.constraints[t]=function(t,e){const n={};return void 0!==e.min&&(n.min=e.min-t.min),void 0!==e.max&&(n.max=e.max-t.min),n}(i.layoutBox[t],this.constraints[t]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:e}=this.getProps();if(!t||!m(t))return!1;const n=t.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const s=function(t,e,n){const i=hs(t,n),{scroll:s}=e;return s&&(rs(i.x,s.offset.x),rs(i.y,s.offset.y)),i}(n,i.root,this.visualElement.getTransformPagePoint());let o=function(t,e){return{x:zi(t.x,e.x),y:zi(t.y,e.y)}}(i.layout.layoutBox,s);if(e){const t=e(function({x:t,y:e}){return{top:e.min,right:t.max,bottom:e.max,left:t.min}}(o));this.hasMutatedConstraints=!!t,t&&(o=qi(t))}return o}startAnimation(t){const{drag:e,dragMomentum:n,dragElastic:i,dragTransition:s,dragSnapToOrigin:o,onDragTransitionEnd:r}=this.getProps(),a=this.constraints||{},l=Gi(r=>{if(!fs(r,e,this.currentDirection))return;let l=a&&a[r]||{};o&&(l={min:0,max:0});const u=i?200:1e6,c=i?40:1e7,h={type:"inertia",velocity:n?t[r]:0,bounceStiffness:u,bounceDamping:c,timeConstant:750,restDelta:1,restSpeed:10,...s,...l};return this.startAxisValueAnimation(r,h)});return Promise.all(l).then(r)}startAxisValueAnimation(t,e){const n=this.getAxisMotionValue(t);return n.start(Qn(t,n,0,e))}stopAnimation(){Gi(t=>this.getAxisMotionValue(t).stop())}pauseAnimation(){Gi(t=>{var e;return null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.pause()})}getAnimationState(t){var e;return null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.state}getAxisMotionValue(t){const e="_drag"+t.toUpperCase(),n=this.visualElement.getProps(),i=n[e];return i||this.visualElement.getValue(t,(n.initial?n.initial[t]:void 0)||0)}snapToCursor(t){Gi(e=>{const{drag:n}=this.getProps();if(!fs(e,n,this.currentDirection))return;const{projection:i}=this.visualElement,s=this.getAxisMotionValue(e);if(i&&i.layout){const{min:n,max:o}=i.layout.layoutBox[e];s.set(t[e]-Ye(n,o,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:e}=this.getProps(),{projection:n}=this.visualElement;if(!m(e)||!n||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Gi(t=>{const e=this.getAxisMotionValue(t);if(e){const n=e.get();i[t]=function(t,e){let n=.5;const i=Bi(t),s=Bi(e);return s>i?n=pn(e.min,e.max-i,t.min):i>s&&(n=pn(t.min,t.max-s,e.min)),H(0,1,n)}({min:n,max:n},this.constraints[t])}});const{transformTemplate:s}=this.visualElement.getProps();this.visualElement.current.style.transform=s?s({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.resolveConstraints(),Gi(e=>{if(!fs(e,t,null))return;const n=this.getAxisMotionValue(e),{min:s,max:o}=this.constraints[e];n.set(Ye(s,o,i[e]))})}addListeners(){if(!this.visualElement.current)return;ps.set(this.visualElement,this);const t=Gt(this.visualElement.current,"pointerdown",t=>{const{drag:e,dragListener:n=!0}=this.getProps();e&&n&&this.start(t)}),e=()=>{const{dragConstraints:t}=this.getProps();m(t)&&(this.constraints=this.resolveRefConstraints())},{projection:n}=this.visualElement,i=n.addEventListener("measure",e);n&&!n.layout&&(n.root&&n.root.updateScroll(),n.updateLayout()),e();const s=$t(window,"resize",()=>this.scalePositionWithinConstraints()),o=n.addEventListener("didUpdate",({delta:t,hasLayoutChanged:e})=>{this.isDragging&&e&&(Gi(e=>{const n=this.getAxisMotionValue(e);n&&(this.originPoint[e]+=t[e].translate,n.set(n.get()+t[e].translate))}),this.visualElement.render())});return()=>{s(),t(),i(),o&&o()}}getProps(){const t=this.visualElement.getProps(),{drag:e=!1,dragDirectionLock:n=!1,dragPropagation:i=!1,dragConstraints:s=!1,dragElastic:o=Hi,dragMomentum:r=!0}=t;return{...t,drag:e,dragDirectionLock:n,dragPropagation:i,dragConstraints:s,dragElastic:o,dragMomentum:r}}}function fs(t,e,n){return!(!0!==e&&e!==t||null!==n&&n!==t)}const gs=t=>(e,n)=>{t&&Ut.update(()=>t(e,n))};const ys={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function vs(t,e){return e.max===e.min?0:t/(e.max-e.min)*100}const xs={correct:(t,e)=>{if(!e.target)return t;if("string"==typeof t){if(!nt.test(t))return t;t=parseFloat(t)}return`${vs(t,e.target.x)}% ${vs(t,e.target.y)}%`}},Ps={correct:(t,{treeScale:e,projectionDelta:n})=>{const i=t,s=an.parse(t);if(s.length>5)return i;const o=an.createTransformer(t),r="number"!=typeof s[0]?1:0,a=n.x.scale*e.x,l=n.y.scale*e.y;s[0+r]/=a,s[1+r]/=l;const u=Ye(a,l,.5);return"number"==typeof s[2+r]&&(s[2+r]/=u),"number"==typeof s[3+r]&&(s[3+r]/=u),o(s)}};class bs extends e.Component{componentDidMount(){const{visualElement:t,layoutGroup:e,switchLayoutGroup:n,layoutId:i}=this.props,{projection:s}=t;var o;o=ws,Object.assign(k,o),s&&(e.group&&e.group.add(s),n&&n.register&&i&&n.register(s),s.root.didUpdate(),s.addEventListener("animationComplete",()=>{this.safeToRemove()}),s.setOptions({...s.options,onExitComplete:()=>this.safeToRemove()})),ys.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:e,visualElement:n,drag:i,isPresent:s}=this.props,o=n.projection;return o?(o.isPresent=s,i||t.layoutDependency!==e||void 0===e?o.willUpdate():this.safeToRemove(),t.isPresent!==s&&(s?o.promote():o.relegate()||Ut.postRender(()=>{const t=o.getStack();t&&t.members.length||this.safeToRemove()})),null):null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),queueMicrotask(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:e,switchLayoutGroup:n}=this.props,{projection:i}=t;i&&(i.scheduleCheckAfterUnmount(),e&&e.group&&e.group.remove(i),n&&n.deregister&&n.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function Ts(n){const[i,s]=function(){const e=t.useContext(l);if(null===e)return[!0,null];const{isPresent:n,onExitComplete:i,register:s}=e,o=t.useId();return t.useEffect(()=>s(o),[]),!n&&i?[!1,()=>i&&i(o)]:[!0]}(),o=t.useContext(A);return e.createElement(bs,{...n,layoutGroup:o,switchLayoutGroup:t.useContext(E),isPresent:i,safeToRemove:s})}const ws={borderRadius:{...xs,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:xs,borderTopRightRadius:xs,borderBottomLeftRadius:xs,borderBottomRightRadius:xs,boxShadow:Ps},Ss=["TopLeft","TopRight","BottomLeft","BottomRight"],As=Ss.length,Es=t=>"string"==typeof t?parseFloat(t):t,Vs=t=>"number"==typeof t||nt.test(t);function Cs(t,e){return void 0!==t[e]?t[e]:t.borderRadius}const Ms=js(0,.5,Re),Ds=js(.5,.95,Ft);function js(t,e,n){return i=>ie?1:n(pn(t,e,i))}function Rs(t,e){t.min=e.min,t.max=e.max}function ks(t,e){Rs(t.x,e.x),Rs(t.y,e.y)}function Ls(t,e,n,i,s){return t=es(t-=e,1/n,i),void 0!==s&&(t=es(t,1/s,i)),t}function Bs(t,e,[n,i,s],o,r){!function(t,e=0,n=1,i=.5,s,o=t,r=t){et.test(e)&&(e=parseFloat(e),e=Ye(r.min,r.max,e/100)-r.min);if("number"!=typeof e)return;let a=Ye(o.min,o.max,i);t===o&&(a-=e),t.min=Ls(t.min,e,n,a,s),t.max=Ls(t.max,e,n,a,s)}(t,e[n],e[i],e[s],e.scale,o,r)}const Fs=["x","scaleX","originX"],Os=["y","scaleY","originY"];function Is(t,e,n,i){Bs(t.x,e,Fs,n?n.x:void 0,i?i.x:void 0),Bs(t.y,e,Os,n?n.y:void 0,i?i.y:void 0)}function Us(t){return 0===t.translate&&1===t.scale}function Ns(t){return Us(t.x)&&Us(t.y)}function Ws(t,e){return Math.round(t.x.min)===Math.round(e.x.min)&&Math.round(t.x.max)===Math.round(e.x.max)&&Math.round(t.y.min)===Math.round(e.y.min)&&Math.round(t.y.max)===Math.round(e.y.max)}function _s(t){return Bi(t.x)/Bi(t.y)}class zs{constructor(){this.members=[]}add(t){ni(this.members,t),t.scheduleRender()}remove(t){if(ii(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const t=this.members[this.members.length-1];t&&this.promote(t)}}relegate(t){const e=this.members.findIndex(e=>t===e);if(0===e)return!1;let n;for(let i=e;i>=0;i--){const t=this.members[i];if(!1!==t.isPresent){n=t;break}}return!!n&&(this.promote(n),!0)}promote(t,e){const n=this.lead;if(t!==n&&(this.prevLead=n,this.lead=t,t.show(),n)){n.instance&&n.scheduleRender(),t.scheduleRender(),t.resumeFrom=n,e&&(t.resumeFrom.preserveOpacity=!0),n.snapshot&&(t.snapshot=n.snapshot,t.snapshot.latestValues=n.animationValues||n.latestValues),t.root&&t.root.isUpdating&&(t.isLayoutDirty=!0);const{crossfade:i}=t.options;!1===i&&n.hide()}}exitAnimationComplete(){this.members.forEach(t=>{const{options:e,resumingFrom:n}=t;e.onExitComplete&&e.onExitComplete(),n&&n.options.onExitComplete&&n.options.onExitComplete()})}scheduleRender(){this.members.forEach(t=>{t.instance&&t.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function Hs(t,e,n){let i="";const s=t.x.translate/e.x,o=t.y.translate/e.y;if((s||o)&&(i=`translate3d(${s}px, ${o}px, 0) `),1===e.x&&1===e.y||(i+=`scale(${1/e.x}, ${1/e.y}) `),n){const{rotate:t,rotateX:e,rotateY:s}=n;t&&(i+=`rotate(${t}deg) `),e&&(i+=`rotateX(${e}deg) `),s&&(i+=`rotateY(${s}deg) `)}const r=t.x.scale*e.x,a=t.y.scale*e.y;return 1===r&&1===a||(i+=`scale(${r}, ${a})`),i||"none"}const $s=(t,e)=>t.depth-e.depth;class Ys{constructor(){this.children=[],this.isDirty=!1}add(t){ni(this.children,t),this.isDirty=!0}remove(t){ii(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort($s),this.isDirty=!1,this.children.forEach(t)}}const Xs=["","X","Y","Z"],Gs={visibility:"hidden"};let qs=0;const Zs={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0};function Ks({attachResizeListener:t,defaultParent:e,measureScroll:n,checkIsScrollRoot:i,resetTransform:s}){return class{constructor(t={},n=(null==e?void 0:e())){this.id=qs++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{var t;this.projectionUpdateScheduled=!1,Zs.totalNodes=Zs.resolvedTargetDeltas=Zs.recalculatedProjection=0,this.nodes.forEach(to),this.nodes.forEach(ao),this.nodes.forEach(lo),this.nodes.forEach(eo),t=Zs,window.MotionDebug&&window.MotionDebug.record(t)},this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=t,this.root=n?n.root||n:this,this.path=n?[...n.path,n]:[],this.parent=n,this.depth=n?n.depth+1:0;for(let e=0;ethis.root.updateBlockedByResize=!1;t(e,()=>{this.root.updateBlockedByResize=!0,n&&n(),n=function(t,e){const n=performance.now(),i=({timestamp:s})=>{const o=s-n;o>=e&&(Nt(i),t(o-e))};return Ut.read(i,!0),()=>Nt(i)}(i,250),ys.hasAnimatedSinceResize&&(ys.hasAnimatedSinceResize=!1,this.nodes.forEach(ro))})}s&&this.root.registerSharedNode(s,this),!1!==this.options.animate&&r&&(s||o)&&this.addEventListener("didUpdate",({delta:t,hasLayoutChanged:e,hasRelativeTargetChanged:n,layout:i})=>{if(this.isTreeAnimationBlocked())return this.target=void 0,void(this.relativeTarget=void 0);const s=this.options.transition||r.getDefaultTransition()||fo,{onLayoutAnimationStart:o,onLayoutAnimationComplete:a}=r.getProps(),l=!this.targetLayout||!Ws(this.targetLayout,i)||n,u=!e&&n;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||u||e&&(l||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(t,u);const e={...Kn(s,"layout"),onPlay:o,onComplete:a};(r.shouldReduceMotion||this.options.layoutRoot)&&(e.delay=0,e.type=!1),this.startAnimation(e)}else e||ro(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=i})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const t=this.getStack();t&&t.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,Nt(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(uo),this.animationId++)}getTransformTemplate(){const{visualElement:t}=this.options;return t&&t.getProps().transformTemplate}willUpdate(t=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked())return void(this.options.onExitComplete&&this.options.onExitComplete());if(!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let s=0;sthis.update()))}clearAllSnapshots(){this.nodes.forEach(no),this.sharedNodes.forEach(co)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,Ut.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){Ut.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure())}updateLayout(){if(!this.instance)return;if(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead()||this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let n=0;n{const n=e/1e3;var l,d,p,m,f,g;ho(o.x,t.x,n),ho(o.y,t.y,n),this.setTargetDelta(o),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Wi(r,this.layout.layoutBox,this.relativeParent.layout.layoutBox),p=this.relativeTarget,m=this.relativeTargetOrigin,f=r,g=n,po(p.x,m.x,f.x,g),po(p.y,m.y,f.y,g),h&&(l=this.relativeTarget,d=h,l.x.min===d.x.min&&l.x.max===d.x.max&&l.y.min===d.y.min&&l.y.max===d.y.max)&&(this.isProjectionDirty=!1),h||(h={x:{min:0,max:0},y:{min:0,max:0}}),ks(h,this.relativeTarget)),a&&(this.animationValues=s,function(t,e,n,i,s,o){s?(t.opacity=Ye(0,void 0!==n.opacity?n.opacity:1,Ms(i)),t.opacityExit=Ye(void 0!==e.opacity?e.opacity:1,0,Ds(i))):o&&(t.opacity=Ye(void 0!==e.opacity?e.opacity:1,void 0!==n.opacity?n.opacity:1,i));for(let r=0;r{ys.hasAnimatedSinceResize=!0,this.currentAnimation=function(t,e,n){const i=O(t)?t:ri(t);return i.start(Qn("",i,e,n)),i.animation}(0,1e3,{...t,onUpdate:e=>{this.mixTargetDelta(e),t.onUpdate&&t.onUpdate(e)},onComplete:()=>{t.onComplete&&t.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const t=this.getStack();t&&t.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(1e3),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const t=this.getLead();let{targetWithTransforms:e,target:n,layout:i,latestValues:s}=t;if(e&&n&&i){if(this!==t&&this.layout&&i&&xo(this.options.animationType,this.layout.layoutBox,i.layoutBox)){n=this.target||{x:{min:0,max:0},y:{min:0,max:0}};const e=Bi(this.layout.layoutBox.x);n.x.min=t.target.x.min,n.x.max=n.x.min+e;const i=Bi(this.layout.layoutBox.y);n.y.min=t.target.y.min,n.y.max=n.y.min+i}ks(e,n),cs(e,s),Ii(this.projectionDeltaWithTransform,this.layoutCorrected,e,s)}}registerSharedNode(t,e){this.sharedNodes.has(t)||this.sharedNodes.set(t,new zs);this.sharedNodes.get(t).add(e);const n=e.options.initialPromotionConfig;e.promote({transition:n?n.transition:void 0,preserveFollowOpacity:n&&n.shouldPreserveFollowOpacity?n.shouldPreserveFollowOpacity(e):void 0})}isLead(){const t=this.getStack();return!t||t.lead===this}getLead(){var t;const{layoutId:e}=this.options;return e&&(null===(t=this.getStack())||void 0===t?void 0:t.lead)||this}getPrevLead(){var t;const{layoutId:e}=this.options;return e?null===(t=this.getStack())||void 0===t?void 0:t.prevLead:void 0}getStack(){const{layoutId:t}=this.options;if(t)return this.root.sharedNodes.get(t)}promote({needsReset:t,transition:e,preserveFollowOpacity:n}={}){const i=this.getStack();i&&i.promote(this,n),t&&(this.projectionDelta=void 0,this.needsReset=!0),e&&this.setOptions({transition:e})}relegate(){const t=this.getStack();return!!t&&t.relegate(this)}resetRotation(){const{visualElement:t}=this.options;if(!t)return;let e=!1;const{latestValues:n}=t;if((n.rotate||n.rotateX||n.rotateY||n.rotateZ)&&(e=!0),!e)return;const i={};for(let s=0;s{var e;return null===(e=t.currentAnimation)||void 0===e?void 0:e.stop()}),this.root.nodes.forEach(io),this.root.sharedNodes.clear()}}}function Js(t){t.updateLayout()}function Qs(t){var e;const n=(null===(e=t.resumeFrom)||void 0===e?void 0:e.snapshot)||t.snapshot;if(t.isLead()&&t.layout&&n&&t.hasListeners("didUpdate")){const{layoutBox:e,measuredBox:i}=t.layout,{animationType:s}=t.options,o=n.source!==t.layout.source;"size"===s?Gi(t=>{const i=o?n.measuredBox[t]:n.layoutBox[t],s=Bi(i);i.min=e[t].min,i.max=i.min+s}):xo(s,n.layoutBox,e)&&Gi(i=>{const s=o?n.measuredBox[i]:n.layoutBox[i],r=Bi(e[i]);s.max=s.min+r,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[i].max=t.relativeTarget[i].min+r)});const r={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};Ii(r,e,n.layoutBox);const a={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};o?Ii(a,t.applyTransform(i,!0),n.measuredBox):Ii(a,e,n.layoutBox);const l=!Ns(r);let u=!1;if(!t.resumeFrom){const i=t.getClosestProjectingParent();if(i&&!i.resumeFrom){const{snapshot:s,layout:o}=i;if(s&&o){const r={x:{min:0,max:0},y:{min:0,max:0}};Wi(r,n.layoutBox,s.layoutBox);const a={x:{min:0,max:0},y:{min:0,max:0}};Wi(a,e,o.layoutBox),Ws(r,a)||(u=!0),i.options.layoutRoot&&(t.relativeTarget=a,t.relativeTargetOrigin=r,t.relativeParent=i)}}}t.notifyListeners("didUpdate",{layout:e,snapshot:n,delta:a,layoutDelta:r,hasLayoutChanged:l,hasRelativeTargetChanged:u})}else if(t.isLead()){const{onExitComplete:e}=t.options;e&&e()}t.options.transition=void 0}function to(t){Zs.totalNodes++,t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=Boolean(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function eo(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function no(t){t.clearSnapshot()}function io(t){t.clearMeasurements()}function so(t){t.isLayoutDirty=!1}function oo(t){const{visualElement:e}=t.options;e&&e.getProps().onBeforeLayoutMeasure&&e.notify("BeforeLayoutMeasure"),t.resetTransform()}function ro(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function ao(t){t.resolveTargetDelta()}function lo(t){t.calcProjection()}function uo(t){t.resetRotation()}function co(t){t.removeLeadSnapshot()}function ho(t,e,n){t.translate=Ye(e.translate,0,n),t.scale=Ye(e.scale,1,n),t.origin=e.origin,t.originPoint=e.originPoint}function po(t,e,n,i){t.min=Ye(e.min,n.min,i),t.max=Ye(e.max,n.max,i)}function mo(t){return t.animationValues&&void 0!==t.animationValues.opacityExit}const fo={duration:.45,ease:[.4,0,.1,1]},go=t=>"undefined"!=typeof navigator&&navigator.userAgent.toLowerCase().includes(t),yo=go("applewebkit/")&&!go("chrome/")?Math.round:Ft;function vo(t){t.min=yo(t.min),t.max=yo(t.max)}function xo(t,e,n){return"position"===t||"preserve-aspect"===t&&!Fi(_s(e),_s(n),.2)}const Po=Ks({attachResizeListener:(t,e)=>$t(t,"resize",e),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),bo={current:void 0},To=Ks({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!bo.current){const t=new Po({});t.mount(window),t.setOptions({layoutScroll:!0}),bo.current=t}return bo.current},resetTransform:(t,e)=>{t.style.transform=void 0!==e?e:"none"},checkIsScrollRoot:t=>Boolean("fixed"===window.getComputedStyle(t).position)}),wo={pan:{Feature:class extends ne{constructor(){super(...arguments),this.removePointerDownListener=Ft}onPointerDown(t){this.session=new Ci(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:ds(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:e,onPan:n,onPanEnd:i}=this.node.getProps();return{onSessionStart:gs(t),onStart:gs(e),onMove:n,onEnd:(t,e)=>{delete this.session,i&&Ut.update(()=>i(t,e))}}}mount(){this.removePointerDownListener=Gt(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}},drag:{Feature:class extends ne{constructor(t){super(t),this.removeGroupControls=Ft,this.removeListeners=Ft,this.controls=new ms(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Ft}unmount(){this.removeGroupControls(),this.removeListeners()}},ProjectionNode:To,MeasureLayout:Ts}},So=/var\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\)/;function Ao(t,e,n=1){const[i,s]=function(t){const e=So.exec(t);if(!e)return[,];const[,n,i]=e;return[n,i]}(t);if(!i)return;const o=window.getComputedStyle(e).getPropertyValue(i);if(o){const t=o.trim();return ei(t)?parseFloat(t):t}return _(s)?Ao(s,e,n+1):s}const Eo=new Set(["width","height","top","left","right","bottom","x","y","translateX","translateY"]),Vo=t=>Eo.has(t),Co=t=>t===$||t===nt,Mo=(t,e)=>parseFloat(t.split(", ")[e]),Do=(t,e)=>(n,{transform:i})=>{if("none"===i||!i)return 0;const s=i.match(/^matrix3d\((.+)\)$/);if(s)return Mo(s[1],e);{const e=i.match(/^matrix\((.+)\)$/);return e?Mo(e[1],t):0}},jo=new Set(["x","y","z"]),Ro=L.filter(t=>!jo.has(t));const ko={width:({x:t},{paddingLeft:e="0",paddingRight:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),height:({y:t},{paddingTop:e="0",paddingBottom:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),top:(t,{top:e})=>parseFloat(e),left:(t,{left:e})=>parseFloat(e),bottom:({y:t},{top:e})=>parseFloat(e)+(t.max-t.min),right:({x:t},{left:e})=>parseFloat(e)+(t.max-t.min),x:Do(4,13),y:Do(5,14)};ko.translateX=ko.x,ko.translateY=ko.y;const Lo=(t,e,n={},i={})=>{e={...e},i={...i};const s=Object.keys(e).filter(Vo);let o=[],r=!1;const a=[];if(s.forEach(s=>{const l=t.getValue(s);if(!t.hasValue(s))return;let u=n[s],c=ui(u);const h=e[s];let d;if(jt(h)){const t=h.length,e=null===h[0]?1:0;u=h[e],c=ui(u);for(let n=e;n{const i=t.getValue(n);void 0!==i&&(e.push([n,i.get()]),i.set(n.startsWith("scale")?1:0))}),e.length&&t.render(),e}(t),r=!0),a.push(s),i[s]=void 0!==i[s]?i[s]:e[s],l.jump(h))}),a.length){const n=a.indexOf("height")>=0?window.pageYOffset:null,s=((t,e,n)=>{const i=e.measureViewportBox(),s=e.current,o=getComputedStyle(s),{display:r}=o,a={};"none"===r&&e.setStaticValue("display",t.display||"block"),n.forEach(t=>{a[t]=ko[t](i,o)}),e.render();const l=e.measureViewportBox();return n.forEach(n=>{const i=e.getValue(n);i&&i.jump(a[n]),t[n]=ko[n](l,o)}),t})(e,t,a);return o.length&&o.forEach(([e,n])=>{t.getValue(e).set(n)}),t.render(),u&&null!==n&&window.scrollTo({top:n}),{target:s,transitionEnd:i}}return{target:e,transitionEnd:i}};function Bo(t,e,n,i){return(t=>Object.keys(t).some(Vo))(e)?Lo(t,e,n,i):{target:e,transitionEnd:i}}const Fo=(t,e,n,i)=>{const s=function(t,{...e},n){const i=t.current;if(!(i instanceof Element))return{target:e,transitionEnd:n};n&&(n={...n}),t.values.forEach(t=>{const e=t.get();if(!_(e))return;const n=Ao(e,i);n&&t.set(n)});for(const s in e){const t=e[s];if(!_(t))continue;const o=Ao(t,i);o&&(e[s]=o,n||(n={}),void 0===n[s]&&(n[s]=t))}return{target:e,transitionEnd:n}}(t,e,i);return Bo(t,e=s.target,n,i=s.transitionEnd)},Oo={current:null},Io={current:!1};const Uo=new WeakMap,No=Object.keys(S),Wo=No.length,_o=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"],zo=v.length;class Ho{constructor({parent:t,props:e,presenceContext:n,reducedMotionConfig:i,visualState:s},o={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.scheduleRender=()=>Ut.render(this.render,!1,!0);const{latestValues:r,renderState:a}=s;this.latestValues=r,this.baseTarget={...r},this.initialValues=e.initial?{...r}:{},this.renderState=a,this.parent=t,this.props=e,this.presenceContext=n,this.depth=t?t.depth+1:0,this.reducedMotionConfig=i,this.options=o,this.isControllingVariants=x(e),this.isVariantNode=P(e),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=Boolean(t&&t.current);const{willChange:l,...u}=this.scrapeMotionValuesFromProps(e,{});for(const c in u){const t=u[c];void 0!==r[c]&&O(t)&&(t.set(r[c],!1),ti(l)&&l.add(c))}}scrapeMotionValuesFromProps(t,e){return{}}mount(t){this.current=t,Uo.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((t,e)=>this.bindToMotionValue(e,t)),Io.current||function(){if(Io.current=!0,u)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),e=()=>Oo.current=t.matches;t.addListener(e),e()}else Oo.current=!1}(),this.shouldReduceMotion="never"!==this.reducedMotionConfig&&("always"===this.reducedMotionConfig||Oo.current),this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){Uo.delete(this.current),this.projection&&this.projection.unmount(),Nt(this.notifyUpdate),Nt(this.render),this.valueSubscriptions.forEach(t=>t()),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const t in this.events)this.events[t].clear();for(const t in this.features)this.features[t].unmount();this.current=null}bindToMotionValue(t,e){const n=B.has(t),i=e.on("change",e=>{this.latestValues[t]=e,this.props.onUpdate&&Ut.update(this.notifyUpdate,!1,!0),n&&this.projection&&(this.projection.isTransformDirty=!0)}),s=e.on("renderRequest",this.scheduleRender);this.valueSubscriptions.set(t,()=>{i(),s()})}sortNodePosition(t){return this.current&&this.sortInstanceNodePosition&&this.type===t.type?this.sortInstanceNodePosition(this.current,t.current):0}loadFeatures({children:t,...e},n,i,s){let o,r;for(let a=0;athis.scheduleRender(),animationType:"string"==typeof n?n:"both",initialPromotionConfig:s,layoutScroll:a,layoutRoot:l})}return r}updateFeatures(){for(const t in this.features){const e=this.features[t];e.isMounted?e.update():(e.mount(),e.isMounted=!0)}}triggerBuild(){this.build(this.renderState,this.latestValues,this.options,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):{x:{min:0,max:0},y:{min:0,max:0}}}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,e){this.latestValues[t]=e}makeTargetAnimatable(t,e=!0){return this.makeTargetAnimatableFromInstance(t,this.props,e)}update(t,e){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=e;for(let n=0;n<_o.length;n++){const e=_o[n];this.propEventSubscriptions[e]&&(this.propEventSubscriptions[e](),delete this.propEventSubscriptions[e]);const i=t["on"+e];i&&(this.propEventSubscriptions[e]=this.on(e,i))}this.prevMotionValues=function(t,e,n){const{willChange:i}=e;for(const s in e){const o=e[s],r=n[s];if(O(o))t.addValue(s,o),ti(i)&&i.add(s);else if(O(r))t.addValue(s,ri(o,{owner:t})),ti(i)&&i.remove(s);else if(r!==o)if(t.hasValue(s)){const e=t.getValue(s);!e.hasAnimated&&e.set(o)}else{const e=t.getStaticValue(s);t.addValue(s,ri(void 0!==e?e:o,{owner:t}))}}for(const s in n)void 0===e[s]&&t.removeValue(s);return e}(this,this.scrapeMotionValuesFromProps(t,this.prevProps),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(t){return this.props.variants?this.props.variants[t]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}getVariantContext(t=!1){if(t)return this.parent?this.parent.getVariantContext():void 0;if(!this.isControllingVariants){const t=this.parent&&this.parent.getVariantContext()||{};return void 0!==this.props.initial&&(t.initial=this.props.initial),t}const e={};for(let n=0;ne.variantChildren.delete(t)}addValue(t,e){e!==this.values.get(t)&&(this.removeValue(t),this.bindToMotionValue(t,e)),this.values.set(t,e),this.latestValues[t]=e.get()}removeValue(t){this.values.delete(t);const e=this.valueSubscriptions.get(t);e&&(e(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,e){if(this.props.values&&this.props.values[t])return this.props.values[t];let n=this.values.get(t);return void 0===n&&void 0!==e&&(n=ri(e,{owner:this}),this.addValue(t,n)),n}readValue(t){var e;return void 0===this.latestValues[t]&&this.current?null!==(e=this.getBaseTargetFromProps(this.props,t))&&void 0!==e?e:this.readValueFromInstance(this.current,t,this.options):this.latestValues[t]}setBaseTarget(t,e){this.baseTarget[t]=e}getBaseTarget(t){var e;const{initial:n}=this.props,i="string"==typeof n||"object"==typeof n?null===(e=Dt(this.props,n))||void 0===e?void 0:e[t]:void 0;if(n&&void 0!==i)return i;const s=this.getBaseTargetFromProps(this.props,t);return void 0===s||O(s)?void 0!==this.initialValues[t]&&void 0===i?void 0:this.baseTarget[t]:s}on(t,e){return this.events[t]||(this.events[t]=new si),this.events[t].add(e)}notify(t,...e){this.events[t]&&this.events[t].notify(...e)}}class $o extends Ho{sortInstanceNodePosition(t,e){return 2&t.compareDocumentPosition(e)?1:-1}getBaseTargetFromProps(t,e){return t.style?t.style[e]:void 0}removeValueFromRenderState(t,{vars:e,style:n}){delete e[t],delete n[t]}makeTargetAnimatableFromInstance({transition:t,transitionEnd:e,...n},{transformValues:i},s){let o=function(t,e,n){const i={};for(const s in t){const t=pi(s,e);if(void 0!==t)i[s]=t;else{const t=n.getValue(s);t&&(i[s]=t.get())}}return i}(n,t||{},this);if(i&&(e&&(e=i(e)),n&&(n=i(n)),o&&(o=i(o))),s){!function(t,e,n){var i,s;const o=Object.keys(e).filter(e=>!t.hasValue(e)),r=o.length;if(r)for(let a=0;a{this.current&&(this.current.textContent=`${t}`)}))}renderInstance(t,e,n,i){At(t,e,n,i)}}class Xo extends $o{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1}getBaseTargetFromProps(t,e){return t[e]}readValueFromInstance(t,e){if(B.has(e)){const t=Xn(e);return t&&t.default||0}return e=Et.has(e)?e:d(e),t.getAttribute(e)}measureInstanceViewportBox(){return{x:{min:0,max:0},y:{min:0,max:0}}}scrapeMotionValuesFromProps(t,e){return Mt(t,e)}build(t,e,n,i){Pt(t,e,n,this.isSVGTag,i.transformTemplate)}renderInstance(t,e,n,i){Vt(t,e,0,i)}mount(t){this.isSVGTag=Tt(t.tagName),super.mount(t)}}const Go=(t,e)=>R(t)?new Xo(e,{enableHardwareAcceleration:!1}):new Yo(e,{enableHardwareAcceleration:!0}),qo={...Ei,...de,...wo,...{layout:{ProjectionNode:To,MeasureLayout:Ts}}},Zo=D((t,e)=>function(t,{forwardMotionProps:e=!1},n,i){return{...R(t)?zt:Ht,preloadedFeatures:n,useRender:St(e),createVisualElement:i,Component:t}}(t,e,qo,Go)),Ko="Grow With Me — Become a Strong Product Engineer",Jo="1:1 mentoring for frontend and full-stack developers who want real skills, career clarity, and better roles in product companies.",Qo={label:"👉 Book a 1:1 Call",subtext:"No sales pitch. Just honest guidance."},tr=(t=.1)=>({hidden:{opacity:0},visible:{opacity:1,transition:{staggerChildren:t}}}),er=(t=0)=>({hidden:{opacity:0,y:20},visible:{opacity:1,y:0,transition:{duration:.6,delay:t}}}),nr=(t=0)=>({hidden:{opacity:0,x:-20},visible:{opacity:1,x:0,transition:{duration:.5,delay:t}}}),ir=(t=0)=>({hidden:{opacity:0,x:-30},visible:{opacity:1,x:0,transition:{duration:.6,delay:t}}}),sr=()=>{const t=er(0),e=er(.2),s=er(.4);return n.jsxs("section",{className:"relative min-h-screen flex items-center justify-center px-4 sm:px-6 lg:px-8 overflow-hidden",children:[n.jsx("div",{className:"hero-glow absolute inset-0 flex items-center justify-center"}),n.jsxs("div",{className:"relative z-10 max-w-4xl mx-auto text-center",children:[n.jsx(Zo.h1,{variants:t,initial:"hidden",animate:"visible",className:"text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold text-gray-900 mb-6 leading-tight",itemProp:"headline",children:Ko}),n.jsx(Zo.p,{variants:e,initial:"hidden",animate:"visible",className:"text-lg sm:text-xl md:text-2xl text-gray-600 mb-8 max-w-3xl mx-auto",children:Jo}),n.jsxs(Zo.div,{variants:s,initial:"hidden",animate:"visible",className:"flex flex-col items-center gap-4",children:[n.jsx(i,{href:"https://topmate.io/togowtham/34939?utm_source=grwm&utm_campaign=website_launch&utm_medium=link",label:Qo.label,variant:"topmate"}),n.jsx("p",{className:"text-sm text-gray-500",children:Qo.subtext})]})]})]})},or=({children:e,fallback:i=n.jsx(s,{}),rootMargin:o="200px"})=>{const[r,a]=((e={})=>{const{threshold:n=.1,rootMargin:i="100px",triggerOnce:s=!0}=e,[o,r]=t.useState(!1),a=t.useRef(null);return t.useEffect(()=>{const t=a.current;if(null==t)return;const e=new IntersectionObserver(([n])=>{n.isIntersecting?(r(!0),s&&e.unobserve(t)):s||r(!1)},{threshold:n,rootMargin:i});return e.observe(t),()=>{e.unobserve(t)}},[n,i,s]),[a,o]})({rootMargin:o,triggerOnce:!0});return n.jsx("div",{ref:r,children:a?n.jsx(t.Suspense,{fallback:i,children:e}):i})},rr=t.lazy(async()=>await o(()=>import("./index-DX5Rk45i.js"),__vite__mapDeps([0,1,2,3,4])).then(t=>({default:t.AudienceSection}))),ar=t.lazy(async()=>await o(()=>import("./index-BZNpZnn4.js"),__vite__mapDeps([5,1,2,3])).then(t=>({default:t.ServicesSection}))),lr=t.lazy(async()=>await o(()=>import("./index-BZ3_gtGe.js"),__vite__mapDeps([6,1,2,3])).then(t=>({default:t.ProcessSection}))),ur=t.lazy(async()=>await o(()=>import("./index-_14G4Foq.js"),__vite__mapDeps([7,1,2,3,4,8])).then(t=>({default:t.AboutSection}))),cr=t.lazy(async()=>await o(()=>import("./index-CYjllIGK.js"),__vite__mapDeps([9,1,2,3])).then(t=>({default:t.CTASection}))),hr=t.lazy(async()=>await o(()=>import("./index-DUJfonJs.js"),__vite__mapDeps([10,1,2,8])).then(t=>({default:t.Footer}))),dr=Object.freeze(Object.defineProperty({__proto__:null,HomePage:()=>n.jsxs("div",{className:"min-h-screen bg-white",children:[n.jsx(sr,{}),n.jsx(or,{rootMargin:"300px",children:n.jsx(rr,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(ar,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(lr,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(ur,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(cr,{})}),n.jsx(or,{rootMargin:"300px",children:n.jsx(hr,{})})]})},Symbol.toStringTag,{value:"Module"}));export{dr as H,nr as a,er as b,tr as c,ir as d,Zo as m}; diff --git a/assets/HomePage-DBMzW8f9.js.gz b/assets/HomePage-DBMzW8f9.js.gz new file mode 100644 index 0000000..dd78d14 Binary files /dev/null and b/assets/HomePage-DBMzW8f9.js.gz differ diff --git a/assets/Section-D2lu-9JN.js b/assets/Section-D2lu-9JN.js new file mode 100644 index 0000000..3f955b3 --- /dev/null +++ b/assets/Section-D2lu-9JN.js @@ -0,0 +1 @@ +import{j as a}from"./index-DN8smlv-.js";import{m as e,b as s}from"./HomePage-DBMzW8f9.js";const i=({children:i,as:r="p",className:l="",variants:n,delay:t=0,viewport:c={once:!0}})=>{const o=null!=n||s(t);return a.jsx(e.div,{initial:"hidden",whileInView:"visible",viewport:c,variants:o,children:a.jsx(r,{className:l,children:i})})},r=({children:e,className:s="",background:i="white",padding:r="normal"})=>{const l={white:"bg-white",gray:"bg-gray-50",slate:"bg-slate-50"}[i],n="large"===r?"py-24":"py-20";return a.jsx("section",{className:`${n} px-4 sm:px-6 lg:px-8 ${l} ${s}`,children:a.jsx("div",{className:"max-w-4xl mx-auto",children:e})})};export{i as A,r as S}; diff --git a/assets/index-BZ3_gtGe.js b/assets/index-BZ3_gtGe.js new file mode 100644 index 0000000..7054264 --- /dev/null +++ b/assets/index-BZ3_gtGe.js @@ -0,0 +1 @@ +import{R as e,j as t}from"./index-DN8smlv-.js";import{S as s,A as a}from"./Section-D2lu-9JN.js";import{m as i,c as n,d as r}from"./HomePage-DBMzW8f9.js";const l=[{id:"step-1",number:"1",text:"You book a free 20-minute clarity call"},{id:"step-2",number:"2",text:"We discuss your current situation, blockers, and goals"},{id:"step-3",number:"3",text:"If it makes sense, I'll suggest a clear next-step plan"},{id:"step-4",number:"4",text:"You decide whether to continue with mentoring"}],m="HOW IT WORKS",o="That's it. Simple and transparent.",d=e.memo(({step:e,variants:s})=>t.jsxs(i.div,{variants:s,className:"flex items-start gap-6",children:[t.jsx("div",{className:"flex-shrink-0 w-12 h-12 bg-gray-900 text-white rounded-full flex items-center justify-center text-xl font-bold shadow-sm",children:e.number}),t.jsx("p",{className:"text-lg text-gray-700 pt-2",children:e.text})]}),(e,t)=>e.step.number===t.step.number&&e.step.text===t.step.text);d.displayName="ProcessStep";const x=()=>{const e=n(.15),x=r(0);return t.jsxs(s,{background:"white",children:[t.jsx(a,{as:"h2",className:"text-3xl sm:text-4xl font-bold text-gray-900 mb-12",children:m}),t.jsx(i.div,{variants:e,initial:"hidden",whileInView:"visible",viewport:{once:!0},className:"space-y-8",children:l.map(e=>t.jsx(d,{step:e,variants:x},e.id))}),t.jsx(a,{as:"p",className:"mt-12 text-lg text-gray-700 font-medium",delay:.7,children:o})]})};export{x as ProcessSection}; diff --git a/assets/index-BZ3_gtGe.js.br b/assets/index-BZ3_gtGe.js.br new file mode 100644 index 0000000..7054264 --- /dev/null +++ b/assets/index-BZ3_gtGe.js.br @@ -0,0 +1 @@ +import{R as e,j as t}from"./index-DN8smlv-.js";import{S as s,A as a}from"./Section-D2lu-9JN.js";import{m as i,c as n,d as r}from"./HomePage-DBMzW8f9.js";const l=[{id:"step-1",number:"1",text:"You book a free 20-minute clarity call"},{id:"step-2",number:"2",text:"We discuss your current situation, blockers, and goals"},{id:"step-3",number:"3",text:"If it makes sense, I'll suggest a clear next-step plan"},{id:"step-4",number:"4",text:"You decide whether to continue with mentoring"}],m="HOW IT WORKS",o="That's it. Simple and transparent.",d=e.memo(({step:e,variants:s})=>t.jsxs(i.div,{variants:s,className:"flex items-start gap-6",children:[t.jsx("div",{className:"flex-shrink-0 w-12 h-12 bg-gray-900 text-white rounded-full flex items-center justify-center text-xl font-bold shadow-sm",children:e.number}),t.jsx("p",{className:"text-lg text-gray-700 pt-2",children:e.text})]}),(e,t)=>e.step.number===t.step.number&&e.step.text===t.step.text);d.displayName="ProcessStep";const x=()=>{const e=n(.15),x=r(0);return t.jsxs(s,{background:"white",children:[t.jsx(a,{as:"h2",className:"text-3xl sm:text-4xl font-bold text-gray-900 mb-12",children:m}),t.jsx(i.div,{variants:e,initial:"hidden",whileInView:"visible",viewport:{once:!0},className:"space-y-8",children:l.map(e=>t.jsx(d,{step:e,variants:x},e.id))}),t.jsx(a,{as:"p",className:"mt-12 text-lg text-gray-700 font-medium",delay:.7,children:o})]})};export{x as ProcessSection}; diff --git a/assets/index-BZ3_gtGe.js.gz b/assets/index-BZ3_gtGe.js.gz new file mode 100644 index 0000000..f008063 Binary files /dev/null and b/assets/index-BZ3_gtGe.js.gz differ diff --git a/assets/index-BZNpZnn4.js b/assets/index-BZNpZnn4.js new file mode 100644 index 0000000..015f9bf --- /dev/null +++ b/assets/index-BZNpZnn4.js @@ -0,0 +1 @@ +import{R as e,j as t}from"./index-DN8smlv-.js";import{S as a,A as i}from"./Section-D2lu-9JN.js";import{m as r,c as s,b as n}from"./HomePage-DBMzW8f9.js";const o=[{id:"service-1",text:"React & Frontend architecture (not tutorial code)"},{id:"service-2",text:"Writing clean, maintainable production-level code"},{id:"service-3",text:"Code reviews & project guidance"},{id:"service-4",text:"Interview preparation based on real expectations"},{id:"service-5",text:"Career roadmap (what to learn, what to skip, where to focus)"}],l="WHAT I HELP YOU WITH",c="We work on real, practical things:",d="No generic advice. Everything is tailored to your current level and goal.",x=e.memo(({item:e,variants:a})=>t.jsxs(r.div,{variants:a,className:"card-hover flex items-start gap-3 p-4 bg-white rounded-lg shadow-sm",children:[t.jsx("span",{className:"text-blue-600 text-xl font-bold mt-0.5 flex-shrink-0",children:"✓"}),t.jsx("span",{className:"text-gray-700 text-lg",children:e.text})]}),(e,t)=>e.item.id===t.item.id&&e.item.text===t.item.text);x.displayName="ServiceCard";const m=()=>{const e=s(.1),m=n(0);return t.jsxs(a,{background:"gray",children:[t.jsx(i,{as:"h2",className:"text-3xl sm:text-4xl font-bold text-gray-900 mb-4",children:l}),t.jsx(i,{as:"p",className:"text-lg text-gray-700 mb-12",delay:.1,children:c}),t.jsx(r.div,{variants:e,initial:"hidden",whileInView:"visible",viewport:{once:!0},className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:o.map(e=>t.jsx(x,{item:e,variants:m},e.id))}),t.jsx(i,{as:"p",className:"mt-12 text-lg text-gray-700",delay:.7,children:d})]})};export{m as ServicesSection}; diff --git a/assets/index-BZNpZnn4.js.br b/assets/index-BZNpZnn4.js.br new file mode 100644 index 0000000..015f9bf --- /dev/null +++ b/assets/index-BZNpZnn4.js.br @@ -0,0 +1 @@ +import{R as e,j as t}from"./index-DN8smlv-.js";import{S as a,A as i}from"./Section-D2lu-9JN.js";import{m as r,c as s,b as n}from"./HomePage-DBMzW8f9.js";const o=[{id:"service-1",text:"React & Frontend architecture (not tutorial code)"},{id:"service-2",text:"Writing clean, maintainable production-level code"},{id:"service-3",text:"Code reviews & project guidance"},{id:"service-4",text:"Interview preparation based on real expectations"},{id:"service-5",text:"Career roadmap (what to learn, what to skip, where to focus)"}],l="WHAT I HELP YOU WITH",c="We work on real, practical things:",d="No generic advice. Everything is tailored to your current level and goal.",x=e.memo(({item:e,variants:a})=>t.jsxs(r.div,{variants:a,className:"card-hover flex items-start gap-3 p-4 bg-white rounded-lg shadow-sm",children:[t.jsx("span",{className:"text-blue-600 text-xl font-bold mt-0.5 flex-shrink-0",children:"✓"}),t.jsx("span",{className:"text-gray-700 text-lg",children:e.text})]}),(e,t)=>e.item.id===t.item.id&&e.item.text===t.item.text);x.displayName="ServiceCard";const m=()=>{const e=s(.1),m=n(0);return t.jsxs(a,{background:"gray",children:[t.jsx(i,{as:"h2",className:"text-3xl sm:text-4xl font-bold text-gray-900 mb-4",children:l}),t.jsx(i,{as:"p",className:"text-lg text-gray-700 mb-12",delay:.1,children:c}),t.jsx(r.div,{variants:e,initial:"hidden",whileInView:"visible",viewport:{once:!0},className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:o.map(e=>t.jsx(x,{item:e,variants:m},e.id))}),t.jsx(i,{as:"p",className:"mt-12 text-lg text-gray-700",delay:.7,children:d})]})};export{m as ServicesSection}; diff --git a/assets/index-BZNpZnn4.js.gz b/assets/index-BZNpZnn4.js.gz new file mode 100644 index 0000000..8c3ff58 Binary files /dev/null and b/assets/index-BZNpZnn4.js.gz differ diff --git a/assets/index-CYjllIGK.js b/assets/index-CYjllIGK.js new file mode 100644 index 0000000..1a77083 --- /dev/null +++ b/assets/index-CYjllIGK.js @@ -0,0 +1 @@ +import{j as e,B as t}from"./index-DN8smlv-.js";import{S as a,A as s}from"./Section-D2lu-9JN.js";import{m as i}from"./HomePage-DBMzW8f9.js";const o="Ready to get clarity?",l="Book a free 20-minute call and let's figure out your next move.",m="👉 Book a 1:1 Call",r="Limited slots each week to keep mentoring focused.",n=()=>e.jsx(a,{background:"white",children:e.jsxs("div",{className:"text-center",children:[e.jsx(s,{as:"h2",className:"text-3xl sm:text-4xl font-bold text-gray-900 mb-6",children:o}),e.jsx(s,{as:"p",className:"text-lg sm:text-xl text-gray-700 mb-8",delay:.2,children:l}),e.jsxs(i.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{duration:.6,delay:.4},className:"flex flex-col items-center gap-4",children:[e.jsx(t,{href:"https://topmate.io/togowtham/34939?utm_source=grwm&utm_campaign=website_launch&utm_medium=link",label:m,variant:"topmate"}),e.jsx("p",{className:"text-sm text-gray-500",children:r})]})]})});export{n as CTASection}; diff --git a/assets/index-DN8smlv-.js b/assets/index-DN8smlv-.js new file mode 100644 index 0000000..fcbb631 --- /dev/null +++ b/assets/index-DN8smlv-.js @@ -0,0 +1,38 @@ +function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))t(e);new MutationObserver(e=>{for(const n of e)if("childList"===n.type)for(const e of n.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&t(e)}).observe(document,{childList:!0,subtree:!0})}function t(e){if(e.ep)return;e.ep=!0;const t=function(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?t.credentials="include":"anonymous"===e.crossOrigin?t.credentials="omit":t.credentials="same-origin",t}(e);fetch(e.href,t)}}();var t={exports:{}},n={},r={exports:{}},o={},a=Symbol.for("react.element"),i=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),d=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.iterator;var y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,b={};function w(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||y}function S(){}function k(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||y}w.prototype.isReactComponent={},w.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},w.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},S.prototype=w.prototype;var x=k.prototype=new S;x.constructor=k,v(x,w.prototype),x.isPureReactComponent=!0;var _=Array.isArray,C=Object.prototype.hasOwnProperty,P={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function T(e,t,n){var r,o={},i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)C.call(t,r)&&!E.hasOwnProperty(r)&&(o[r]=t[r]);var l=arguments.length-2;if(1===l)o.children=n;else if(1>>1,a=e[r];if(!(0>>1;ro(l,n))uo(c,l)?(e[r]=c,e[u]=n,r=u):(e[r]=l,e[s]=n,r=s);else{if(!(uo(c,n)))break e;e[r]=c,e[u]=n,r=u}}}return t}function o(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var a=performance;e.unstable_now=function(){return a.now()}}else{var i=Date,s=i.now();e.unstable_now=function(){return i.now()-s}}var l=[],u=[],c=1,d=null,f=3,p=!1,h=!1,m=!1,g="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function b(e){for(var o=n(u);null!==o;){if(null===o.callback)r(u);else{if(!(o.startTime<=e))break;r(u),o.sortIndex=o.expirationTime,t(l,o)}o=n(u)}}function w(e){if(m=!1,b(e),!h)if(null!==n(l))h=!0,M(S);else{var t=n(u);null!==t&&j(w,t.startTime-e)}}function S(t,o){h=!1,m&&(m=!1,y(C),C=-1),p=!0;var a=f;try{for(b(o),d=n(l);null!==d&&(!(d.expirationTime>o)||t&&!T());){var i=d.callback;if("function"==typeof i){d.callback=null,f=d.priorityLevel;var s=i(d.expirationTime<=o);o=e.unstable_now(),"function"==typeof s?d.callback=s:d===n(l)&&r(l),b(o)}else r(l);d=n(l)}if(null!==d)var c=!0;else{var g=n(u);null!==g&&j(w,g.startTime-o),c=!1}return c}finally{d=null,f=a,p=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var k,x=!1,_=null,C=-1,P=5,E=-1;function T(){return!(e.unstable_now()-Ee||125i?(r.sortIndex=a,t(u,r),null===n(l)&&r===n(u)&&(m?(y(C),C=-1):m=!0,j(w,a-i))):(r.sortIndex=s,t(l,r),h||p||(h=!0,M(S))),r},e.unstable_shouldYield=T,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}}(J),X.exports=J;var Z=X.exports,ee=D,te=Z; +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */function ne(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n