diff --git a/.cursor/rules/snyk_rules.mdc b/.cursor/rules/snyk_rules.mdc
new file mode 100644
index 0000000..eef0634
--- /dev/null
+++ b/.cursor/rules/snyk_rules.mdc
@@ -0,0 +1,14 @@
+---
+alwaysApply: true
+always_on: true
+trigger: always_on
+applyTo: "**"
+description: Snyk Security At Inception
+---
+
+# Project security best practices
+
+- Always run snyk_code_scan tool for new first party code that is generated in a Snyk-supported language.
+- If any security issues are found based on newly introduced or modified code or dependencies, attempt to fix the issues using the results context from Snyk.
+- Rescan the code after fixing the issues to ensure that the issues were fixed and that there are no newly introduced issues.
+- Repeat this process until no new issues are found.
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..241f9bc
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,39 @@
+# Force LF line endings for all text files
+* text=auto eol=lf
+
+# Ensure common text files are always LF
+*.js text eol=lf
+*.jsx text eol=lf
+*.ts text eol=lf
+*.tsx text eol=lf
+*.json text eol=lf
+*.css text eol=lf
+*.scss text eol=lf
+*.html text eol=lf
+*.md text eol=lf
+*.yml text eol=lf
+*.yaml text eol=lf
+*.xml text eol=lf
+*.svg text eol=lf
+*.sh text eol=lf
+*.env text eol=lf
+*.config text eol=lf
+*.mjs text eol=lf
+*.cjs text eol=lf
+*.mdc text eol=lf
+
+# Ensure these are treated as binary and not modified
+*.png binary
+*.jpg binary
+*.jpeg binary
+*.gif binary
+*.ico binary
+*.webp binary
+*.woff binary
+*.woff2 binary
+*.ttf binary
+*.eot binary
+*.mp3 binary
+*.mp4 binary
+*.ogg binary
+*.wav binary
diff --git a/.mcp.json b/.mcp.json
new file mode 100644
index 0000000..ee5d245
--- /dev/null
+++ b/.mcp.json
@@ -0,0 +1,8 @@
+{
+ "mcpServers": {
+ "next-devtools": {
+ "command": "npx",
+ "args": ["-y", "next-devtools-mcp@latest"]
+ }
+ }
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..dfdbebb
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,8 @@
+{
+ "snyk.advanced.organization": "512ef4a1-6034-4537-a391-9692d282122a",
+ "snyk.advanced.autoSelectOrganization": true,
+ "i18n-ally.localesPaths": [
+ "i18n",
+ "messages"
+ ]
+}
\ No newline at end of file
diff --git a/app/[locale]/checkout/cancel/page.tsx b/app/[locale]/checkout/cancel/page.tsx
new file mode 100644
index 0000000..fb853c1
--- /dev/null
+++ b/app/[locale]/checkout/cancel/page.tsx
@@ -0,0 +1,93 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import { useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+import { useFeature } from '../../../providers/FeatureProvider';
+
+export default function CheckoutCancelPage() {
+ const router = useRouter();
+ const t = useTranslations('ui');
+ const paymentsEnabled = useFeature('paymentsEnabled');
+ const [countdown, setCountdown] = useState(5);
+
+ // Redirect home immediately if payments are disabled
+ useEffect(() => {
+ if (!paymentsEnabled) {
+ router.replace('/');
+ }
+ }, [paymentsEnabled, router]);
+
+ useEffect(() => {
+ if (!paymentsEnabled) return;
+
+ // Countdown timer to redirect to home
+ const timer = setInterval(() => {
+ setCountdown((prev) => {
+ if (prev <= 1) {
+ clearInterval(timer);
+ router.push('/');
+ return 0;
+ }
+ return prev - 1;
+ });
+ }, 1000);
+
+ return () => clearInterval(timer);
+ }, [router, paymentsEnabled]);
+
+ if (!paymentsEnabled) {
+ return null;
+ }
+
+ const handleGoBack = () => {
+ router.push('/');
+ };
+
+ return (
+
+
+ {/* Cancel Icon */}
+
+
+ {/* Cancel Message */}
+
+ {t('checkout.cancel.title')}
+
+
+
+ {t('checkout.cancel.message')}
+
+
+
+ {t('checkout.cancel.tryAgain')}
+
+
+ {/* Action Buttons */}
+
+
+
+
+ {t('checkout.cancel.redirecting', { countdown })}
+
+
+
+ {/* Help Info */}
+
+
+ {t('checkout.cancel.needHelp')}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/[locale]/checkout/success/page.tsx b/app/[locale]/checkout/success/page.tsx
new file mode 100644
index 0000000..d2d11f7
--- /dev/null
+++ b/app/[locale]/checkout/success/page.tsx
@@ -0,0 +1,124 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import { useSearchParams, useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+import { appConfig } from '../../../config/app';
+import { SkinId } from '../../../types';
+import { useLocalizedSkinName } from '../../../hooks/useLocalizedSkinName';
+import { useFeature } from '../../../providers/FeatureProvider';
+
+export default function CheckoutSuccessPage() {
+ const searchParams = useSearchParams();
+ const router = useRouter();
+ const t = useTranslations('ui');
+ const getLocalizedSkinName = useLocalizedSkinName();
+ const paymentsEnabled = useFeature('paymentsEnabled');
+ const [countdown, setCountdown] = useState(5);
+
+ const skinId = searchParams.get('skin') as SkinId;
+ const skin = skinId ? appConfig.skins[skinId] : null;
+ const skinName = skinId ? getLocalizedSkinName(skinId) : '';
+
+ // Redirect home immediately if payments are disabled
+ useEffect(() => {
+ if (!paymentsEnabled) {
+ router.replace('/');
+ }
+ }, [paymentsEnabled, router]);
+
+ useEffect(() => {
+ if (!paymentsEnabled) return;
+
+ // Countdown timer to redirect to home
+ const timer = setInterval(() => {
+ setCountdown((prev) => {
+ if (prev <= 1) {
+ clearInterval(timer);
+ // Redirect to home with the purchased skin
+ const params = new URLSearchParams();
+ if (skinId && skinId !== appConfig.defaultSkin) {
+ params.set('skin', skinId);
+ }
+ const newUrl = `/${params.toString() ? '?' + params.toString() : ''}`;
+ router.push(newUrl);
+ return 0;
+ }
+ return prev - 1;
+ });
+ }, 1000);
+
+ return () => clearInterval(timer);
+ }, [skinId, router, paymentsEnabled]);
+
+ if (!paymentsEnabled) {
+ return null;
+ }
+
+ const handleGoToApp = () => {
+ const params = new URLSearchParams();
+ if (skinId && skinId !== appConfig.defaultSkin) {
+ params.set('skin', skinId);
+ }
+ const newUrl = `/${params.toString() ? '?' + params.toString() : ''}`;
+ router.push(newUrl);
+ };
+
+ return (
+
+
+ {/* Success Icon */}
+
+
+ {/* Success Message */}
+
+ {t('checkout.success.title')}
+
+
+ {skin && (
+
+
+

+
+
+ {t('checkout.success.unlockedSkin', { skinName })}
+
+
+ )}
+
+
+ {t('checkout.success.thankYou')}
+
+
+ {/* Action Buttons */}
+
+
+
+
+ {t('checkout.success.redirecting', { countdown })}
+
+
+
+ {/* Receipt Info */}
+
+
+ {t('checkout.success.receiptSent')}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx
index 7d465f5..3e6f8f0 100644
--- a/app/[locale]/page.tsx
+++ b/app/[locale]/page.tsx
@@ -31,17 +31,14 @@ export default function Home() {
const getLocalizedSkinName = useLocalizedSkinName();
const t = useTranslations('ui');
- // Check if device motion is available and handle permissions
const requestMotionPermission = async () => {
if (typeof window === 'undefined') return;
- // Check if device motion is available
if (!('DeviceMotionEvent' in window)) {
setMotionPermission('denied');
return;
}
- // Request permission on iOS devices
if ('requestPermission' in DeviceMotionEvent) {
try {
// @ts-expect-error - TypeScript doesn't know about requestPermission
@@ -52,39 +49,32 @@ export default function Home() {
setMotionPermission('denied');
}
} else {
- // Android or desktop - no permission needed
setMotionPermission('granted');
}
};
const triggerShake = useCallback((intensity: number) => {
- // Use ref instead of state to prevent race conditions
if (!isAnimatingRef.current) {
- // Clear any existing timeout
if (animationTimeoutRef.current) {
clearTimeout(animationTimeoutRef.current);
}
- // Start shake animation
isAnimatingRef.current = true;
- animationStartTimeRef.current = Date.now(); // Track when animation starts
+ animationStartTimeRef.current = Date.now();
setIsAnimating(true);
setIsShaken(true);
setShakeIntensity(intensity);
setShakeCount(count => count + 1);
- // Reset shake after configured duration
animationTimeoutRef.current = setTimeout(() => {
setIsShaken(false);
setShakeIntensity(0);
setIsAnimating(false);
isAnimatingRef.current = false;
- // Process next shake in queue if any
setShakeQueue(prev => {
if (prev.length > 0) {
const [nextIntensity, ...rest] = prev;
- // Small delay before triggering next shake to ensure clean transition
setTimeout(() => {
triggerShake(nextIntensity);
}, 16);
@@ -94,17 +84,15 @@ export default function Home() {
});
}, shakeConfig.animations.shakeReset);
} else {
- // Only queue if we're not at the start of the animation
const timeSinceStart = Date.now() - animationStartTimeRef.current;
- if (timeSinceStart > 100) { // Only queue if animation has been running for a bit
+ if (timeSinceStart > 100) {
setShakeQueue(prev => {
- // Hard limit at 1 item
if (prev.length >= 1) return prev;
return [...prev, intensity];
});
}
}
- }, []); // Remove isAnimating from dependencies since we're using ref
+ }, []);
useEffect(() => {
const handleKeyPress = (event: KeyboardEvent) => {
@@ -133,7 +121,6 @@ export default function Home() {
}
};
- // Only add motion listener if permission is granted
if (typeof window !== 'undefined') {
if (motionPermission === 'granted' && 'DeviceMotionEvent' in window) {
window.addEventListener('devicemotion', handleMotion);
@@ -151,20 +138,17 @@ export default function Home() {
};
}, [lastUpdate, motionPermission, triggerShake]);
- // Initial permission check
useEffect(() => {
requestMotionPermission();
}, []);
const handleClick = () => {
- // Trigger haptic feedback for tap interaction
if ('vibrate' in navigator) {
navigator.vibrate(50); // Short 50ms vibration
}
triggerShake(shakeConfig.defaultTriggerIntensity);
};
- // Add cleanup in the component
useEffect(() => {
return () => {
if (animationTimeoutRef.current) {
@@ -249,3 +233,4 @@ export default function Home() {
);
}
+
diff --git a/app/api/checkout/route.ts b/app/api/checkout/route.ts
new file mode 100644
index 0000000..671312c
--- /dev/null
+++ b/app/api/checkout/route.ts
@@ -0,0 +1,107 @@
+import { NextRequest, NextResponse } from 'next/server';
+import { createCheckout } from '@lemonsqueezy/lemonsqueezy.js';
+import { initializeLemonSqueezy, getLemonSqueezyConfig } from '../../config/lemonsqueezy';
+import { getFeatureFlags } from '../../config/features';
+import { appConfig } from '../../config/app';
+
+export async function POST(request: NextRequest) {
+ try {
+ const { paymentsEnabled } = getFeatureFlags();
+ if (!paymentsEnabled) {
+ return NextResponse.json(
+ { error: 'Payments are currently disabled' },
+ { status: 503 }
+ );
+ }
+
+ // Initialize Lemon Squeezy SDK
+ initializeLemonSqueezy();
+
+ const { skinId, locale } = await request.json();
+
+ if (!skinId) {
+ return NextResponse.json(
+ { error: 'Skin ID is required' },
+ { status: 400 }
+ );
+ }
+
+ if (!locale) {
+ return NextResponse.json(
+ { error: 'Locale is required' },
+ { status: 400 }
+ );
+ }
+
+ // Get skin configuration
+ const skin = appConfig.skins[skinId as keyof typeof appConfig.skins];
+
+ if (!skin) {
+ return NextResponse.json(
+ { error: 'Invalid skin ID' },
+ { status: 400 }
+ );
+ }
+
+ if (!skin.isPremium) {
+ return NextResponse.json(
+ { error: 'This skin is not premium' },
+ { status: 400 }
+ );
+ }
+
+ if (!skin.variantId) {
+ return NextResponse.json(
+ { error: 'Variant ID not configured for this skin' },
+ { status: 500 }
+ );
+ }
+
+ // Create checkout session
+ const config = getLemonSqueezyConfig();
+ const checkout = await createCheckout(config.storeId, skin.variantId!, {
+ productOptions: {
+ name: `Premium ${skin.name} Skin`,
+ description: `Unlock the premium ${skin.name} skin for Shake the Frog!`,
+ redirectUrl: `${config.baseUrl}/${locale}/checkout/success?skin=${skinId}`,
+ receiptButtonText: 'Go to App',
+ receiptThankYouNote: 'Thank you for your purchase! Your premium skin is now available.',
+ },
+ checkoutOptions: {
+ embed: false,
+ media: false,
+ logo: true,
+ desc: true,
+ discount: true,
+ subscriptionPreview: true,
+ buttonColor: '#16a34a'
+ },
+ checkoutData: {
+ custom: {
+ skin_id: skinId,
+ },
+ },
+ testMode: process.env.NODE_ENV !== 'production',
+ });
+
+ if (checkout.error) {
+ console.error('Checkout creation error:', checkout.error);
+ return NextResponse.json(
+ { error: 'Failed to create checkout session' },
+ { status: 500 }
+ );
+ }
+
+ return NextResponse.json({
+ checkoutUrl: checkout.data?.data.attributes.url,
+ checkoutId: checkout.data?.data.id,
+ });
+
+ } catch (error) {
+ console.error('Checkout API error:', error);
+ return NextResponse.json(
+ { error: 'Internal server error' },
+ { status: 500 }
+ );
+ }
+}
\ No newline at end of file
diff --git a/app/api/prices/route.ts b/app/api/prices/route.ts
new file mode 100644
index 0000000..76c63cb
--- /dev/null
+++ b/app/api/prices/route.ts
@@ -0,0 +1,33 @@
+import { NextResponse } from 'next/server';
+import { getVariant } from '@lemonsqueezy/lemonsqueezy.js';
+import { initializeLemonSqueezy } from '../../config/lemonsqueezy';
+import { getFeatureFlags } from '../../config/features';
+import { appConfig } from '../../config/app';
+
+export async function GET() {
+ const { paymentsEnabled } = getFeatureFlags();
+ if (!paymentsEnabled) {
+ return NextResponse.json({ prices: {}, enabled: false });
+ }
+
+ // Initialize Lemon Squeezy SDK
+ initializeLemonSqueezy();
+
+ const prices: Record = {};
+
+ // Fetch prices for all premium skins
+ for (const [skinId, skin] of Object.entries(appConfig.skins)) {
+ if (skin.isPremium && skin.variantId) {
+ const variant = await getVariant(skin.variantId);
+
+ if (!variant.data) {
+ throw new Error(`No variant data found for ${skinId}`);
+ }
+
+ const priceInCents = variant.data.data.attributes.price;
+ prices[skinId] = `$${(priceInCents / 100).toFixed(2)}`;
+ }
+ }
+
+ return NextResponse.json({ prices });
+}
\ No newline at end of file
diff --git a/app/api/webhooks/lemonsqueezy/route.ts b/app/api/webhooks/lemonsqueezy/route.ts
new file mode 100644
index 0000000..4983e80
--- /dev/null
+++ b/app/api/webhooks/lemonsqueezy/route.ts
@@ -0,0 +1,148 @@
+import { NextRequest, NextResponse } from 'next/server';
+import { createHmac } from 'crypto';
+import { getLemonSqueezyConfig } from '../../../config/lemonsqueezy';
+
+// Webhook payload interface using proper typing
+interface WebhookPayload {
+ meta: {
+ event_name: string;
+ custom_data?: Record;
+ };
+ data: {
+ type: string;
+ id: string;
+ attributes: Record;
+ relationships?: Record;
+ };
+}
+
+export async function POST(request: NextRequest) {
+ try {
+ const body = await request.text();
+ const signature = request.headers.get('x-signature');
+
+ if (!signature) {
+ return NextResponse.json(
+ { error: 'Missing signature' },
+ { status: 400 }
+ );
+ }
+
+ // Verify webhook signature
+ const config = getLemonSqueezyConfig();
+ const secret = config.webhookSecret;
+
+ const hmac = createHmac('sha256', secret);
+ hmac.update(body);
+ const digest = hmac.digest('hex');
+
+ if (signature !== digest) {
+ console.error('Invalid webhook signature');
+ return NextResponse.json(
+ { error: 'Invalid signature' },
+ { status: 401 }
+ );
+ }
+
+ // Parse webhook payload
+ const payload = JSON.parse(body);
+ const eventName = payload.meta?.event_name;
+
+ console.log('Received webhook:', eventName);
+
+ // Handle different webhook events
+ switch (eventName) {
+ case 'order_created':
+ await handleOrderCreated(payload);
+ break;
+ case 'subscription_created':
+ await handleSubscriptionCreated(payload);
+ break;
+ case 'subscription_updated':
+ await handleSubscriptionUpdated(payload);
+ break;
+ case 'subscription_cancelled':
+ await handleSubscriptionCancelled(payload);
+ break;
+ default:
+ console.log('Unhandled webhook event:', eventName);
+ }
+
+ return NextResponse.json({ received: true });
+
+ } catch (error) {
+ console.error('Webhook processing error:', error);
+ return NextResponse.json(
+ { error: 'Webhook processing failed' },
+ { status: 500 }
+ );
+ }
+}
+
+async function handleOrderCreated(payload: WebhookPayload) {
+ const order = payload.data;
+ const attributes = order.attributes as Record;
+ const firstOrderItem = attributes.first_order_item as Record | undefined;
+ const customData = firstOrderItem?.product_name;
+
+ console.log('Order created:', {
+ orderId: order.id,
+ customerEmail: attributes.user_email,
+ total: attributes.total_formatted,
+ status: attributes.status,
+ customData: customData,
+ });
+
+ // Here you could:
+ // - Send confirmation email
+ // - Update user permissions in your database
+ // - Log the purchase for analytics
+ // - Grant access to premium features
+}
+
+async function handleSubscriptionCreated(payload: WebhookPayload) {
+ const subscription = payload.data;
+ const attributes = subscription.attributes as Record;
+
+ console.log('Subscription created:', {
+ subscriptionId: subscription.id,
+ customerEmail: attributes.user_email,
+ status: attributes.status,
+ productName: attributes.product_name,
+ });
+
+ // Handle subscription creation
+ // - Update user subscription status
+ // - Send welcome email
+ // - Grant premium access
+}
+
+async function handleSubscriptionUpdated(payload: WebhookPayload) {
+ const subscription = payload.data;
+ const attributes = subscription.attributes as Record;
+
+ console.log('Subscription updated:', {
+ subscriptionId: subscription.id,
+ status: attributes.status,
+ endsAt: attributes.ends_at,
+ });
+
+ // Handle subscription updates
+ // - Update user access based on status
+ // - Handle plan changes
+}
+
+async function handleSubscriptionCancelled(payload: WebhookPayload) {
+ const subscription = payload.data;
+ const attributes = subscription.attributes as Record;
+
+ console.log('Subscription cancelled:', {
+ subscriptionId: subscription.id,
+ customerEmail: attributes.user_email,
+ endsAt: attributes.ends_at,
+ });
+
+ // Handle subscription cancellation
+ // - Schedule access removal for end date
+ // - Send cancellation confirmation
+}
\ No newline at end of file
diff --git a/app/components/LanguageToggle.tsx b/app/components/LanguageToggle.tsx
index 6904458..f22b168 100644
--- a/app/components/LanguageToggle.tsx
+++ b/app/components/LanguageToggle.tsx
@@ -18,7 +18,6 @@ export function LanguageToggle() {
const [isOpen, setIsOpen] = useState(false);
const dropdownRef = useRef(null);
- // Define the available locales
const locales: Locale[] = ['en', 'de', 'ru', 'ka', 'ar'];
const languageOptions: LanguageOption[] = locales.map((code) => ({
@@ -28,7 +27,6 @@ export function LanguageToggle() {
const currentLanguage = languageOptions.find(lang => lang.code === locale) || languageOptions[0];
- // Handle clicking outside to close dropdown
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
@@ -45,7 +43,6 @@ export function LanguageToggle() {
};
}, [isOpen]);
- // Handle escape key to close dropdown
useEffect(() => {
const handleEscape = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
@@ -68,7 +65,6 @@ export function LanguageToggle() {
return (
- {/* Main toggle button */}
- {/* Dropdown menu */}
{isOpen && (
@@ -118,4 +113,4 @@ export function LanguageToggle() {
)}
);
-}
\ No newline at end of file
+}
diff --git a/app/components/PremiumCheckout.tsx b/app/components/PremiumCheckout.tsx
new file mode 100644
index 0000000..11756cf
--- /dev/null
+++ b/app/components/PremiumCheckout.tsx
@@ -0,0 +1,143 @@
+'use client';
+
+import { useState } from 'react';
+import { useParams } from 'next/navigation';
+import { appConfig } from '../config/app';
+import { SkinId } from '../types';
+import { useLocalizedSkinName } from '../hooks/useLocalizedSkinName';
+import { usePrices } from '../hooks/usePrices';
+import { useFeature } from '../providers/FeatureProvider';
+
+interface PremiumCheckoutProps {
+ skinId: SkinId;
+ onClose: () => void;
+}
+
+export function PremiumCheckout({ skinId, onClose }: PremiumCheckoutProps) {
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState
(null);
+ const params = useParams();
+ const getLocalizedSkinName = useLocalizedSkinName();
+ const paymentsEnabled = useFeature('paymentsEnabled');
+ const { getPrice, loading: pricesLoading } = usePrices();
+
+ const skin = appConfig.skins[skinId];
+ const skinName = getLocalizedSkinName(skinId);
+ const price = getPrice(skinId);
+ const locale = params.locale as string;
+
+ // Guard: never render if payments are disabled or skin is not premium
+ if (!paymentsEnabled || !skin?.isPremium) {
+ return null;
+ }
+
+ const handlePurchase = async () => {
+ setIsLoading(true);
+ setError(null);
+
+ try {
+ const response = await fetch('/api/checkout', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ skinId, locale }),
+ });
+
+ const data = await response.json();
+
+ if (!response.ok) {
+ throw new Error(data.error || 'Failed to create checkout');
+ }
+
+ // Redirect to Lemon Squeezy checkout
+ if (data.checkoutUrl) {
+ window.location.href = data.checkoutUrl;
+ } else {
+ throw new Error('No checkout URL received');
+ }
+ } catch (err) {
+ console.error('Checkout error:', err);
+ setError(err instanceof Error ? err.message : 'An error occurred');
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+
+
+
+ Premium Skin
+
+
+
+
+
+
+

+
+
+ {skinName}
+
+
+ Unlock this premium skin to customize your experience!
+
+
+ {pricesLoading ? '...' : (price ?? '')}
+
+
+
+ {error && (
+
+ )}
+
+
+
+
+
+
+
+ Secure payment powered by Lemon Squeezy
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/components/SkinSelector.tsx b/app/components/SkinSelector.tsx
index b7f04b6..e86446f 100644
--- a/app/components/SkinSelector.tsx
+++ b/app/components/SkinSelector.tsx
@@ -6,7 +6,10 @@ import Image from 'next/image';
import { appConfig } from '../config/app';
import { SkinId } from '../types';
import { useLocalizedSkinName } from '../hooks/useLocalizedSkinName';
-import { ChevronDownIcon } from '@heroicons/react/24/outline';
+import { usePrices } from '../hooks/usePrices';
+import { useFeature } from '../providers/FeatureProvider';
+import { ChevronDownIcon, LockClosedIcon } from '@heroicons/react/24/outline';
+import { PremiumCheckout } from './PremiumCheckout';
interface SkinOption {
id: SkinId;
@@ -18,14 +21,20 @@ export function SkinSelector() {
const router = useRouter();
const searchParams = useSearchParams();
const getLocalizedSkinName = useLocalizedSkinName();
+ const paymentsEnabled = useFeature('paymentsEnabled');
+ const { getPrice, loading: pricesLoading } = usePrices();
const [isOpen, setIsOpen] = useState(false);
+ const [showCheckout, setShowCheckout] = useState(null);
const dropdownRef = useRef(null);
- const skinOptions: SkinOption[] = Object.entries(appConfig.skins).map(([id, skin]) => ({
- id: id as SkinId,
- name: getLocalizedSkinName(id),
- image: skin.normal
- }));
+ // When payments are disabled, filter out premium skins entirely
+ const skinOptions: SkinOption[] = Object.entries(appConfig.skins)
+ .filter(([, skin]) => paymentsEnabled || !skin.isPremium)
+ .map(([id, skin]) => ({
+ id: id as SkinId,
+ name: getLocalizedSkinName(id),
+ image: skin.normal
+ }));
const skinParam = searchParams.get('skin');
@@ -37,6 +46,16 @@ export function SkinSelector() {
const currentSkinOption = skinOptions.find(skin => skin.id === currentSkin) || skinOptions[0];
const handleSkinChange = useCallback((newSkin: SkinId) => {
+ const skin = appConfig.skins[newSkin];
+
+ // If it's a premium skin, show checkout modal
+ if (skin.isPremium) {
+ setShowCheckout(newSkin);
+ setIsOpen(false);
+ return;
+ }
+
+ // For free skins, change immediately
const params = new URLSearchParams(searchParams.toString());
if (newSkin === appConfig.defaultSkin) {
@@ -50,6 +69,10 @@ export function SkinSelector() {
setIsOpen(false);
}, [router, searchParams]);
+ const handleCheckoutClose = useCallback(() => {
+ setShowCheckout(null);
+ }, []);
+
// Handle clicking outside to close dropdown
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
@@ -119,33 +142,56 @@ export function SkinSelector() {
{isOpen && (
- {skinOptions.map((option) => (
-
- ))}
+ {skinOptions.map((option) => {
+ const skin = appConfig.skins[option.id];
+ const isPremium = skin.isPremium;
+
+ return (
+
+ );
+ })}
)}
+
+ {/* Premium Checkout Modal */}
+ {showCheckout && (
+
+ )}
);
}
\ No newline at end of file
diff --git a/app/components/SpeechBubble.tsx b/app/components/SpeechBubble.tsx
index 28f0656..38a59b8 100644
--- a/app/components/SpeechBubble.tsx
+++ b/app/components/SpeechBubble.tsx
@@ -2,9 +2,8 @@ import { useEffect, useState, useCallback, useRef } from 'react';
import { useMessages } from 'next-intl';
import { getRandomEmoji } from '../config/emojis';
-// Increase visibility duration for speech bubbles
-const VISIBILITY_MS = 3000; // 3 seconds for message visibility
-const COOLDOWN_MS = 2000; // 2 seconds between new messages
+const VISIBILITY_MS = 3000;
+const COOLDOWN_MS = 2000;
interface SpeechBubbleProps {
isShaken: boolean;
@@ -21,17 +20,13 @@ export function SpeechBubble({ triggerCount }: SpeechBubbleProps) {
const showTimeRef = useRef
(0);
const lastFadeTime = useRef(0);
- // Load messages when component mounts or language changes
useEffect(() => {
- // Only run if we haven't loaded messages yet
if (messagesRef.current.length > 0) return;
- // Get the character messages from the messages object
try {
const characterMessages = allMessages.character;
if (characterMessages && typeof characterMessages === 'object') {
- // Convert object values to array
const messageArray = Object.values(characterMessages) as string[];
if (messageArray.length === 0) {
@@ -47,24 +42,22 @@ export function SpeechBubble({ triggerCount }: SpeechBubbleProps) {
} catch (error) {
console.error(`Error loading character messages:`, error);
}
- }, [allMessages]); // Depend on allMessages to reload when they change
+ }, [allMessages]);
const getRandomMessage = useCallback(() => {
const currentMessages = messagesRef.current;
if (currentMessages.length === 0) return '';
const randomIndex = Math.floor(Math.random() * currentMessages.length);
- const message = currentMessages[randomIndex];
- return `${message} ${getRandomEmoji()}`;
- }, []); // No dependencies needed since we use ref
+ const messageValue = currentMessages[randomIndex];
+ return `${messageValue} ${getRandomEmoji()}`;
+ }, []);
- // Handle new trigger events
useEffect(() => {
if (triggerCount === 0 || messagesRef.current.length === 0) return;
const now = Date.now();
const timeSinceLastFade = now - lastFadeTime.current;
- // If we're in cooldown, or a message is visible, queue the new message
if (timeSinceLastFade < COOLDOWN_MS || isVisible) {
const newMessage = getRandomMessage();
if (newMessage) {
@@ -73,7 +66,6 @@ export function SpeechBubble({ triggerCount }: SpeechBubbleProps) {
return;
}
- // Otherwise, show the message immediately
lastTriggerTime.current = now;
showTimeRef.current = now;
const newMessage = getRandomMessage();
@@ -83,17 +75,15 @@ export function SpeechBubble({ triggerCount }: SpeechBubbleProps) {
}
}, [triggerCount, isVisible, getRandomMessage]);
- // Handle message queue
useEffect(() => {
if (messageQueue.length === 0 || isVisible) return;
const now = Date.now();
const timeSinceLastFade = now - lastFadeTime.current;
- // Only show next message if cooldown has expired
if (timeSinceLastFade >= COOLDOWN_MS) {
const nextMessage = messageQueue[0];
- setMessageQueue(prev => prev.slice(1)); // Remove the message from queue
+ setMessageQueue(prev => prev.slice(1));
lastTriggerTime.current = now;
showTimeRef.current = now;
setMessage(nextMessage);
@@ -101,7 +91,6 @@ export function SpeechBubble({ triggerCount }: SpeechBubbleProps) {
}
}, [messageQueue, isVisible]);
- // Handle visibility duration
useEffect(() => {
if (!isVisible) return;
diff --git a/app/config/app.ts b/app/config/app.ts
index 53f63d0..f0a8eec 100644
--- a/app/config/app.ts
+++ b/app/config/app.ts
@@ -16,20 +16,25 @@ export const appConfig = {
id: 'frog',
name: 'Frog',
normal: '/images/frog.svg',
- shaken: '/images/frog-shaken.svg'
+ shaken: '/images/frog-shaken.svg',
+ isPremium: false
},
mandarin: {
id: 'mandarin',
name: 'Mandarin',
normal: '/images/mandarin.svg',
// TODO: Create a proper shaken version of the mandarin skin
- shaken: '/images/mandarin.svg' // Using the same image for both states until a shaken version is created
+ shaken: '/images/mandarin.svg', // Using the same image for both states until a shaken version is created
+ isPremium: false,
+ variantId: 'your_mandarin_variant_id_here' // Replace with actual variant ID when created
},
beaver: {
id: 'beaver',
name: 'Beaver',
normal: '/images/beaver.svg',
- shaken: '/images/beaver-shaken.svg'
+ shaken: '/images/beaver-shaken.svg',
+ isPremium: true,
+ variantId: '1047017'
}
},
defaultSkin: 'frog'
diff --git a/app/config/features.ts b/app/config/features.ts
new file mode 100644
index 0000000..afa58d5
--- /dev/null
+++ b/app/config/features.ts
@@ -0,0 +1,20 @@
+/**
+ * Server-side feature flag definitions.
+ *
+ * Flags are read from environment variables. The abstraction is kept thin
+ * so a runtime provider (Flipt, Unleash, Flags SDK adapter, etc.) can be
+ * swapped in later without changing any consumer code.
+ *
+ * Convention: FEATURE_=1 → enabled
+ * anything else → disabled
+ */
+
+export interface FeatureFlags {
+ paymentsEnabled: boolean;
+}
+
+export function getFeatureFlags(): FeatureFlags {
+ return {
+ paymentsEnabled: process.env.FEATURE_PAYMENTS === '1',
+ };
+}
diff --git a/app/config/lemonsqueezy.ts b/app/config/lemonsqueezy.ts
new file mode 100644
index 0000000..adc3a64
--- /dev/null
+++ b/app/config/lemonsqueezy.ts
@@ -0,0 +1,45 @@
+import { lemonSqueezySetup } from '@lemonsqueezy/lemonsqueezy.js';
+
+// Initialize Lemon Squeezy SDK
+export function initializeLemonSqueezy() {
+ const apiKey = process.env.LEMONSQUEEZY_API_KEY;
+
+ if (!apiKey) {
+ throw new Error('LEMONSQUEEZY_API_KEY is required');
+ }
+
+ lemonSqueezySetup({
+ apiKey,
+ onError: (error) => {
+ throw error; // Fail fast instead of just logging
+ },
+ });
+}
+
+// Lemon Squeezy configuration with lazy validation.
+// Config is only resolved on first access so the module can be safely
+// imported even when payment env vars are absent (e.g. payments disabled).
+let _config: { storeId: string; webhookSecret: string; baseUrl: string } | null = null;
+
+export function getLemonSqueezyConfig() {
+ if (_config) return _config;
+
+ const storeId = process.env.LEMONSQUEEZY_STORE_ID;
+ const webhookSecret = process.env.LEMONSQUEEZY_WEBHOOK_SECRET;
+ const baseUrl = process.env.NEXT_PUBLIC_APP_URL;
+
+ if (!storeId) {
+ throw new Error('LEMONSQUEEZY_STORE_ID is required');
+ }
+
+ if (!webhookSecret) {
+ throw new Error('LEMONSQUEEZY_WEBHOOK_SECRET is required');
+ }
+
+ if (!baseUrl) {
+ throw new Error('NEXT_PUBLIC_APP_URL is required');
+ }
+
+ _config = { storeId, webhookSecret, baseUrl };
+ return _config;
+}
\ No newline at end of file
diff --git a/app/hooks/usePrices.ts b/app/hooks/usePrices.ts
new file mode 100644
index 0000000..0e263e9
--- /dev/null
+++ b/app/hooks/usePrices.ts
@@ -0,0 +1,60 @@
+'use client';
+
+import { useState, useEffect } from 'react';
+import { useFeature } from '../providers/FeatureProvider';
+
+interface PricesData {
+ prices: Record;
+}
+
+export function usePrices() {
+ const paymentsEnabled = useFeature('paymentsEnabled');
+ const [prices, setPrices] = useState>({});
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ if (!paymentsEnabled) {
+ setLoading(false);
+ return;
+ }
+
+ const fetchPrices = async () => {
+ try {
+ setLoading(true);
+ setError(null);
+
+ const response = await fetch('/api/prices');
+
+ if (!response.ok) {
+ throw new Error('Failed to fetch prices');
+ }
+
+ const data: PricesData = await response.json();
+ setPrices(data.prices);
+ } catch (err) {
+ console.error('Error fetching prices:', err);
+ setError(err instanceof Error ? err.message : 'Failed to fetch prices');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchPrices();
+ }, [paymentsEnabled]);
+
+ const getPrice = (skinId: string): string | null => {
+ if (!paymentsEnabled || loading) {
+ return null;
+ }
+ return prices[skinId] ?? null;
+ };
+
+ return {
+ prices,
+ loading,
+ error,
+ enabled: paymentsEnabled,
+ getPrice
+ };
+}
\ No newline at end of file
diff --git a/app/layout.tsx b/app/layout.tsx
index 5168ad2..d816ed9 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,6 +1,8 @@
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import { ThemeProvider } from './providers/ThemeProvider'
+import { FeatureProvider } from './providers/FeatureProvider'
+import { getFeatureFlags } from './config/features'
import { appConfig } from './config/app'
import { Suspense } from 'react'
import './globals.css'
@@ -41,18 +43,22 @@ export default function RootLayout({
}: {
children: React.ReactNode
}) {
+ const features = getFeatureFlags();
+
return (
-
-
- Loading...
-
- }>
- {children}
-
-
+
+
+
+ Loading...
+
+ }>
+ {children}
+
+
+
)
diff --git a/app/providers/FeatureProvider.tsx b/app/providers/FeatureProvider.tsx
new file mode 100644
index 0000000..e3a5cb8
--- /dev/null
+++ b/app/providers/FeatureProvider.tsx
@@ -0,0 +1,27 @@
+'use client';
+
+import { createContext, useContext } from 'react';
+import type { FeatureFlags } from '../config/features';
+
+const FeatureContext = createContext(undefined);
+
+interface FeatureProviderProps {
+ features: FeatureFlags;
+ children: React.ReactNode;
+}
+
+export function FeatureProvider({ features, children }: FeatureProviderProps) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function useFeature(key: K): FeatureFlags[K] {
+ const context = useContext(FeatureContext);
+ if (context === undefined) {
+ throw new Error('useFeature must be used within a FeatureProvider');
+ }
+ return context[key];
+}
diff --git a/docker-compose.yml b/docker-compose.yml
index b5ee518..fcdd2a1 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -19,6 +19,11 @@ services:
start_period: 20s
environment:
- NODE_ENV=production
+ - FEATURE_PAYMENTS=${FEATURE_PAYMENTS:-1}
+ - LEMONSQUEEZY_API_KEY=${LEMONSQUEEZY_API_KEY}
+ - LEMONSQUEEZY_STORE_ID=${LEMONSQUEEZY_STORE_ID}
+ - LEMONSQUEEZY_WEBHOOK_SECRET=${LEMONSQUEEZY_WEBHOOK_SECRET}
+ - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL:-http://localhost:3000}
deploy:
resources:
limits:
diff --git a/i18n/request.ts b/i18n/request.ts
index 197c091..dd8d1c3 100644
--- a/i18n/request.ts
+++ b/i18n/request.ts
@@ -16,8 +16,6 @@ export default getRequestConfig(async ({ requestLocale }) => {
}
// Load messages from both ui and character directories
- // Read how to split localization files here:
- // https://next-intl.dev/docs/usage/configuration#messages-split-files
const messages = {
ui: (await import(`../messages/ui/${locale}.json`)).default,
character: (await import(`../messages/character/${locale}.json`)).default
@@ -27,4 +25,5 @@ export default getRequestConfig(async ({ requestLocale }) => {
locale,
messages
};
-});
\ No newline at end of file
+});
+
diff --git a/messages/ui/ar.json b/messages/ui/ar.json
index 439a65d..e98b899 100644
--- a/messages/ui/ar.json
+++ b/messages/ui/ar.json
@@ -1,4 +1,22 @@
{
+ "checkout": {
+ "cancel": {
+ "title": "تم إلغاء الشراء",
+ "message": "تم إلغاء عملية الشراء. لم يتم خصم أي رسوم من حسابك.",
+ "tryAgain": "يمكنك المحاولة مرة أخرى في أي وقت لإلغاء قفل الأشكال المميزة.",
+ "backToApp": "العودة إلى التطبيق",
+ "redirecting": "إعادة التوجيه تلقائياً خلال {countdown} ثانية...",
+ "needHelp": "تحتاج مساعدة؟ اتصل بفريق الدعم لدينا."
+ },
+ "success": {
+ "title": "تم الشراء بنجاح!",
+ "unlockedSkin": "لقد قمت بإلغاء قفل شكل {skinName} بنجاح!",
+ "thankYou": "شكراً لك على الشراء. الشكل المميز متاح الآن.",
+ "goToApp": "الذهاب إلى التطبيق",
+ "redirecting": "إعادة التوجيه تلقائياً خلال {countdown} ثانية...",
+ "receiptSent": "تم إرسال إيصال إلى عنوان بريدك الإلكتروني."
+ }
+ },
"enableDeviceShake": "تفعيل هز الجهاز",
"languages": {
"ar": "العربية",
diff --git a/messages/ui/de.json b/messages/ui/de.json
index e8bb077..fa2dffc 100644
--- a/messages/ui/de.json
+++ b/messages/ui/de.json
@@ -1,4 +1,22 @@
{
+ "checkout": {
+ "cancel": {
+ "title": "Kauf abgebrochen",
+ "message": "Ihr Kauf wurde abgebrochen. Es wurden keine Gebühren von Ihrem Konto abgebucht.",
+ "tryAgain": "Sie können jederzeit erneut versuchen, Premium-Skins freizuschalten.",
+ "backToApp": "Zurück zur App",
+ "redirecting": "Automatische Weiterleitung in {countdown} Sekunden...",
+ "needHelp": "Brauchen Sie Hilfe? Kontaktieren Sie unser Support-Team."
+ },
+ "success": {
+ "title": "Kauf erfolgreich!",
+ "unlockedSkin": "Sie haben erfolgreich den {skinName} Skin freigeschaltet!",
+ "thankYou": "Vielen Dank für Ihren Kauf. Ihr Premium-Skin ist jetzt verfügbar.",
+ "goToApp": "Zur App",
+ "redirecting": "Automatische Weiterleitung in {countdown} Sekunden...",
+ "receiptSent": "Eine Quittung wurde an Ihre E-Mail-Adresse gesendet."
+ }
+ },
"enableDeviceShake": "Geräte-Schütteln aktivieren",
"languages": {
"ar": "Arabisch",
diff --git a/messages/ui/en.json b/messages/ui/en.json
index 923511a..d393bed 100644
--- a/messages/ui/en.json
+++ b/messages/ui/en.json
@@ -1,4 +1,22 @@
{
+ "checkout": {
+ "cancel": {
+ "title": "Purchase Cancelled",
+ "message": "Your purchase was cancelled. No charges were made to your account.",
+ "tryAgain": "You can try again anytime to unlock premium skins.",
+ "backToApp": "Back to App",
+ "redirecting": "Redirecting automatically in {countdown} seconds...",
+ "needHelp": "Need help? Contact our support team."
+ },
+ "success": {
+ "title": "Purchase Successful!",
+ "unlockedSkin": "You've successfully unlocked the {skinName} skin!",
+ "thankYou": "Thank you for your purchase. Your premium skin is now available.",
+ "goToApp": "Go to App",
+ "redirecting": "Redirecting automatically in {countdown} seconds...",
+ "receiptSent": "A receipt has been sent to your email address."
+ }
+ },
"enableDeviceShake": "Enable device shake",
"languages": {
"ar": "Arabic",
diff --git a/messages/ui/ka.json b/messages/ui/ka.json
index de83597..dd06184 100644
--- a/messages/ui/ka.json
+++ b/messages/ui/ka.json
@@ -1,4 +1,22 @@
{
+ "checkout": {
+ "cancel": {
+ "title": "შეძენა გაუქმდა",
+ "message": "თქვენი შეძენა გაუქმდა. თქვენი ანგარიშიდან არანაირი თანხა არ ჩამოწერილა.",
+ "tryAgain": "შეგიძლიათ ნებისმიერ დროს სცადოთ ხელახლა პრემიუმ სკინების განბლოკვა.",
+ "backToApp": "აპში დაბრუნება",
+ "redirecting": "ავტომატური გადამისამართება {countdown} წამში...",
+ "needHelp": "გჭირდებათ დახმარება? დაუკავშირდით ჩვენს მხარდაჭერის გუნდს."
+ },
+ "success": {
+ "title": "შეძენა წარმატებულია!",
+ "unlockedSkin": "თქვენ წარმატებით განბლოკეთ {skinName} სკინი!",
+ "thankYou": "გმადლობთ შეძენისთვის. თქვენი პრემიუმ სკინი ახლა ხელმისაწვდომია.",
+ "goToApp": "აპში გადასვლა",
+ "redirecting": "ავტომატური გადამისამართება {countdown} წამში...",
+ "receiptSent": "ქვითარი გაიგზავნა თქვენს ელ-ფოსტის მისამართზე."
+ }
+ },
"enableDeviceShake": "მოწყობილობის შერყევის ჩართვა",
"languages": {
"ar": "არაბული",
diff --git a/messages/ui/ru.json b/messages/ui/ru.json
index 0ca339b..71039d8 100644
--- a/messages/ui/ru.json
+++ b/messages/ui/ru.json
@@ -1,4 +1,22 @@
{
+ "checkout": {
+ "cancel": {
+ "title": "Покупка отменена",
+ "message": "Ваша покупка была отменена. С вашего счета не было списано никаких средств.",
+ "tryAgain": "Вы можете попробовать снова в любое время, чтобы разблокировать премиум-скины.",
+ "backToApp": "Вернуться в приложение",
+ "redirecting": "Автоматическое перенаправление через {countdown} секунд...",
+ "needHelp": "Нужна помощь? Свяжитесь с нашей службой поддержки."
+ },
+ "success": {
+ "title": "Покупка успешна!",
+ "unlockedSkin": "Вы успешно разблокировали скин {skinName}!",
+ "thankYou": "Спасибо за покупку. Ваш премиум-скин теперь доступен.",
+ "goToApp": "Перейти в приложение",
+ "redirecting": "Автоматическое перенаправление через {countdown} секунд...",
+ "receiptSent": "Чек был отправлен на ваш адрес электронной почты."
+ }
+ },
"enableDeviceShake": "Включить встряску устройства",
"languages": {
"ar": "Арабский",
diff --git a/package.json b/package.json
index 940416b..543f208 100644
--- a/package.json
+++ b/package.json
@@ -12,23 +12,24 @@
},
"dependencies": {
"@heroicons/react": "^2.2.0",
- "next": "^16.0.10",
- "next-intl": "^4.5.8",
- "react": "^19.2.3",
- "react-dom": "^19.2.3"
+ "@lemonsqueezy/lemonsqueezy.js": "^4.0.0",
+ "next": "^16.1.6",
+ "next-intl": "^4.8.2",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4"
},
"devDependencies": {
"@eslint/eslintrc": "^3.3.3",
- "@eslint/js": "^9.39.1",
+ "@eslint/js": "^9.39.2",
"@tailwindcss/postcss": "^4.1.18",
- "@types/node": "^25.0.1",
- "@types/react": "^19.2.7",
+ "@types/node": "^25.2.0",
+ "@types/react": "^19.2.10",
"@types/react-dom": "^19.2.3",
- "@typescript-eslint/eslint-plugin": "^8.49.0",
- "@typescript-eslint/parser": "^8.49.0",
- "eslint": "^9.39.1",
- "eslint-config-next": "16.0.10",
- "globals": "^16.5.0",
+ "@typescript-eslint/eslint-plugin": "^8.54.0",
+ "@typescript-eslint/parser": "^8.54.0",
+ "eslint": "^9.39.2",
+ "eslint-config-next": "16.1.6",
+ "globals": "^17.3.0",
"postcss": "^8.5.6",
"postcss-load-config": "^6.0.1",
"tailwindcss": "^4.1.18",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a507714..25af6e5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -10,53 +10,56 @@ importers:
dependencies:
'@heroicons/react':
specifier: ^2.2.0
- version: 2.2.0(react@19.2.3)
+ version: 2.2.0(react@19.2.4)
+ '@lemonsqueezy/lemonsqueezy.js':
+ specifier: ^4.0.0
+ version: 4.0.0
next:
- specifier: ^16.0.10
- version: 16.0.10(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ specifier: ^16.1.6
+ version: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
next-intl:
- specifier: ^4.5.8
- version: 4.5.8(next@16.0.10(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
+ specifier: ^4.8.2
+ version: 4.8.2(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
react:
- specifier: ^19.2.3
- version: 19.2.3
+ specifier: ^19.2.4
+ version: 19.2.4
react-dom:
- specifier: ^19.2.3
- version: 19.2.3(react@19.2.3)
+ specifier: ^19.2.4
+ version: 19.2.4(react@19.2.4)
devDependencies:
'@eslint/eslintrc':
specifier: ^3.3.3
version: 3.3.3
'@eslint/js':
- specifier: ^9.39.1
- version: 9.39.1
+ specifier: ^9.39.2
+ version: 9.39.2
'@tailwindcss/postcss':
specifier: ^4.1.18
version: 4.1.18
'@types/node':
- specifier: ^25.0.1
- version: 25.0.1
+ specifier: ^25.2.0
+ version: 25.2.0
'@types/react':
- specifier: ^19.2.7
- version: 19.2.7
+ specifier: ^19.2.10
+ version: 19.2.10
'@types/react-dom':
specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.7)
+ version: 19.2.3(@types/react@19.2.10)
'@typescript-eslint/eslint-plugin':
- specifier: ^8.49.0
- version: 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ specifier: ^8.54.0
+ version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: ^8.49.0
- version: 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ specifier: ^8.54.0
+ version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
eslint:
- specifier: ^9.39.1
- version: 9.39.1(jiti@2.6.1)
+ specifier: ^9.39.2
+ version: 9.39.2(jiti@2.6.1)
eslint-config-next:
- specifier: 16.0.10
- version: 16.0.10(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ specifier: 16.1.6
+ version: 16.1.6(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
globals:
- specifier: ^16.5.0
- version: 16.5.0
+ specifier: ^17.3.0
+ version: 17.3.0
postcss:
specifier: ^8.5.6
version: 8.5.6
@@ -79,36 +82,36 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.28.5':
- resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ '@babel/compat-data@7.29.0':
+ resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.28.5':
- resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ '@babel/core@7.29.0':
+ resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.28.5':
- resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ '@babel/generator@7.29.0':
+ resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-compilation-targets@7.27.2':
- resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ '@babel/helper-compilation-targets@7.28.6':
+ resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
engines: {node: '>=6.9.0'}
'@babel/helper-globals@7.28.0':
resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-imports@7.27.1':
- resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ '@babel/helper-module-imports@7.28.6':
+ resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-transforms@7.28.3':
- resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ '@babel/helper-module-transforms@7.28.6':
+ resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
@@ -125,194 +128,194 @@ packages:
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.28.4':
- resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ '@babel/helpers@7.28.6':
+ resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.28.5':
- resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ '@babel/parser@7.29.0':
+ resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ '@babel/template@7.28.6':
+ resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
engines: {node: '>=6.9.0'}
- '@babel/traverse@7.28.5':
- resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ '@babel/traverse@7.29.0':
+ resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.28.5':
- resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'}
- '@emnapi/core@1.7.1':
- resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==}
+ '@emnapi/core@1.8.1':
+ resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
- '@emnapi/runtime@1.7.1':
- resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
+ '@emnapi/runtime@1.8.1':
+ resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
'@emnapi/wasi-threads@1.1.0':
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
- '@esbuild/aix-ppc64@0.27.1':
- resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==}
+ '@esbuild/aix-ppc64@0.27.2':
+ resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.27.1':
- resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==}
+ '@esbuild/android-arm64@0.27.2':
+ resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.27.1':
- resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==}
+ '@esbuild/android-arm@0.27.2':
+ resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.27.1':
- resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==}
+ '@esbuild/android-x64@0.27.2':
+ resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.27.1':
- resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==}
+ '@esbuild/darwin-arm64@0.27.2':
+ resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.27.1':
- resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==}
+ '@esbuild/darwin-x64@0.27.2':
+ resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.27.1':
- resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==}
+ '@esbuild/freebsd-arm64@0.27.2':
+ resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.27.1':
- resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==}
+ '@esbuild/freebsd-x64@0.27.2':
+ resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.27.1':
- resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==}
+ '@esbuild/linux-arm64@0.27.2':
+ resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.27.1':
- resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==}
+ '@esbuild/linux-arm@0.27.2':
+ resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.27.1':
- resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==}
+ '@esbuild/linux-ia32@0.27.2':
+ resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.27.1':
- resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==}
+ '@esbuild/linux-loong64@0.27.2':
+ resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.27.1':
- resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==}
+ '@esbuild/linux-mips64el@0.27.2':
+ resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.27.1':
- resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==}
+ '@esbuild/linux-ppc64@0.27.2':
+ resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.27.1':
- resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==}
+ '@esbuild/linux-riscv64@0.27.2':
+ resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.27.1':
- resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==}
+ '@esbuild/linux-s390x@0.27.2':
+ resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.27.1':
- resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==}
+ '@esbuild/linux-x64@0.27.2':
+ resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.27.1':
- resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==}
+ '@esbuild/netbsd-arm64@0.27.2':
+ resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.27.1':
- resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==}
+ '@esbuild/netbsd-x64@0.27.2':
+ resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.27.1':
- resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==}
+ '@esbuild/openbsd-arm64@0.27.2':
+ resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.27.1':
- resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==}
+ '@esbuild/openbsd-x64@0.27.2':
+ resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.27.1':
- resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==}
+ '@esbuild/openharmony-arm64@0.27.2':
+ resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.27.1':
- resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==}
+ '@esbuild/sunos-x64@0.27.2':
+ resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.27.1':
- resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==}
+ '@esbuild/win32-arm64@0.27.2':
+ resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.27.1':
- resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==}
+ '@esbuild/win32-ia32@0.27.2':
+ resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.27.1':
- resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==}
+ '@esbuild/win32-x64@0.27.2':
+ resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
- '@eslint-community/eslint-utils@4.9.0':
- resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@@ -337,8 +340,8 @@ packages:
resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.39.1':
- resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
+ '@eslint/js@9.39.2':
+ resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7':
@@ -349,23 +352,23 @@ packages:
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@formatjs/ecma402-abstract@2.3.6':
- resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==}
+ '@formatjs/ecma402-abstract@3.1.1':
+ resolution: {integrity: sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==}
- '@formatjs/fast-memoize@2.2.7':
- resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==}
+ '@formatjs/fast-memoize@3.1.0':
+ resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==}
- '@formatjs/icu-messageformat-parser@2.11.4':
- resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==}
+ '@formatjs/icu-messageformat-parser@3.5.1':
+ resolution: {integrity: sha512-sSDmSvmmoVQ92XqWb499KrIhv/vLisJU8ITFrx7T7NZHUmMY7EL9xgRowAosaljhqnj/5iufG24QrdzB6X3ItA==}
- '@formatjs/icu-skeleton-parser@1.8.16':
- resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==}
+ '@formatjs/icu-skeleton-parser@2.1.1':
+ resolution: {integrity: sha512-PSFABlcNefjI6yyk8f7nyX1DC7NHmq6WaCHZLySEXBrXuLOB2f935YsnzuPjlz+ibhb9yWTdPeVX1OVcj24w2Q==}
'@formatjs/intl-localematcher@0.5.10':
resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
- '@formatjs/intl-localematcher@0.6.2':
- resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==}
+ '@formatjs/intl-localematcher@0.8.1':
+ resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==}
'@heroicons/react@2.2.0':
resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==}
@@ -418,89 +421,105 @@ packages:
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-arm@1.2.4':
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-ppc64@1.2.4':
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-riscv64@1.2.4':
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.2.4':
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-x64@1.2.4':
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@img/sharp-linux-arm64@0.34.5':
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-arm@0.34.5':
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-ppc64@0.34.5':
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-riscv64@0.34.5':
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-s390x@0.34.5':
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-x64@0.34.5':
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.34.5':
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@img/sharp-linuxmusl-x64@0.34.5':
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@img/sharp-wasm32@0.34.5':
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
@@ -541,59 +560,67 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@lemonsqueezy/lemonsqueezy.js@4.0.0':
+ resolution: {integrity: sha512-xcY1/lDrY7CpIF98WKiL1ElsfoVhddP7FT0fw7ssOzrFqQsr44HgolKrQZxd9SywsCPn12OTOUieqDIokI3mFg==}
+ engines: {node: '>=20'}
+
'@napi-rs/wasm-runtime@0.2.12':
resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
- '@next/env@16.0.10':
- resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==}
+ '@next/env@16.1.6':
+ resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==}
- '@next/eslint-plugin-next@16.0.10':
- resolution: {integrity: sha512-b2NlWN70bbPLmfyoLvvidPKWENBYYIe017ZGUpElvQjDytCWgxPJx7L9juxHt0xHvNVA08ZHJdOyhGzon/KJuw==}
+ '@next/eslint-plugin-next@16.1.6':
+ resolution: {integrity: sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==}
- '@next/swc-darwin-arm64@16.0.10':
- resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==}
+ '@next/swc-darwin-arm64@16.1.6':
+ resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@16.0.10':
- resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==}
+ '@next/swc-darwin-x64@16.1.6':
+ resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@16.0.10':
- resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==}
+ '@next/swc-linux-arm64-gnu@16.1.6':
+ resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@next/swc-linux-arm64-musl@16.0.10':
- resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==}
+ '@next/swc-linux-arm64-musl@16.1.6':
+ resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@next/swc-linux-x64-gnu@16.0.10':
- resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==}
+ '@next/swc-linux-x64-gnu@16.1.6':
+ resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@next/swc-linux-x64-musl@16.0.10':
- resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==}
+ '@next/swc-linux-x64-musl@16.1.6':
+ resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@next/swc-win32-arm64-msvc@16.0.10':
- resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==}
+ '@next/swc-win32-arm64-msvc@16.1.6':
+ resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@16.0.10':
- resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==}
+ '@next/swc-win32-x64-msvc@16.1.6':
+ resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -614,74 +641,166 @@ packages:
resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
engines: {node: '>=12.4.0'}
+ '@parcel/watcher-android-arm64@2.5.6':
+ resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.5.6':
+ resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
+ engines: {node: '>= 10.0.0'}
+
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
'@schummar/icu-type-parser@1.21.5':
resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==}
- '@swc/core-darwin-arm64@1.15.3':
- resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==}
+ '@swc/core-darwin-arm64@1.15.11':
+ resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
- '@swc/core-darwin-x64@1.15.3':
- resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==}
+ '@swc/core-darwin-x64@1.15.11':
+ resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
- '@swc/core-linux-arm-gnueabihf@1.15.3':
- resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==}
+ '@swc/core-linux-arm-gnueabihf@1.15.11':
+ resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
- '@swc/core-linux-arm64-gnu@1.15.3':
- resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==}
+ '@swc/core-linux-arm64-gnu@1.15.11':
+ resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@swc/core-linux-arm64-musl@1.15.3':
- resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==}
+ '@swc/core-linux-arm64-musl@1.15.11':
+ resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@swc/core-linux-x64-gnu@1.15.3':
- resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==}
+ '@swc/core-linux-x64-gnu@1.15.11':
+ resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@swc/core-linux-x64-musl@1.15.3':
- resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==}
+ '@swc/core-linux-x64-musl@1.15.11':
+ resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@swc/core-win32-arm64-msvc@1.15.3':
- resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==}
+ '@swc/core-win32-arm64-msvc@1.15.11':
+ resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
- '@swc/core-win32-ia32-msvc@1.15.3':
- resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==}
+ '@swc/core-win32-ia32-msvc@1.15.11':
+ resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
- '@swc/core-win32-x64-msvc@1.15.3':
- resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==}
+ '@swc/core-win32-x64-msvc@1.15.11':
+ resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
- '@swc/core@1.15.3':
- resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==}
+ '@swc/core@1.15.11':
+ resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==}
engines: {node: '>=10'}
peerDependencies:
'@swc/helpers': '>=0.5.17'
@@ -736,24 +855,28 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
@@ -798,74 +921,74 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- '@types/node@25.0.1':
- resolution: {integrity: sha512-czWPzKIAXucn9PtsttxmumiQ9N0ok9FrBwgRWrwmVLlp86BrMExzvXRLFYRJ+Ex3g6yqj+KuaxfX1JTgV2lpfg==}
+ '@types/node@25.2.0':
+ resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
'@types/react': ^19.2.0
- '@types/react@19.2.7':
- resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
+ '@types/react@19.2.10':
+ resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==}
- '@typescript-eslint/eslint-plugin@8.49.0':
- resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==}
+ '@typescript-eslint/eslint-plugin@8.54.0':
+ resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.49.0
+ '@typescript-eslint/parser': ^8.54.0
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.49.0':
- resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==}
+ '@typescript-eslint/parser@8.54.0':
+ resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.49.0':
- resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==}
+ '@typescript-eslint/project-service@8.54.0':
+ resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@8.49.0':
- resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==}
+ '@typescript-eslint/scope-manager@8.54.0':
+ resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.49.0':
- resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==}
+ '@typescript-eslint/tsconfig-utils@8.54.0':
+ resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/type-utils@8.49.0':
- resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==}
+ '@typescript-eslint/type-utils@8.54.0':
+ resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@8.49.0':
- resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==}
+ '@typescript-eslint/types@8.54.0':
+ resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.49.0':
- resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==}
+ '@typescript-eslint/typescript-estree@8.54.0':
+ resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.49.0':
- resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==}
+ '@typescript-eslint/utils@8.54.0':
+ resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@8.49.0':
- resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==}
+ '@typescript-eslint/visitor-keys@8.54.0':
+ resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
@@ -907,41 +1030,49 @@ packages:
resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-arm64-musl@1.11.1':
resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
cpu: [riscv64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-x64-gnu@1.11.1':
resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-x64-musl@1.11.1':
resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-wasm32-wasi@1.11.1':
resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@@ -1030,8 +1161,8 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- axe-core@4.11.0:
- resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==}
+ axe-core@4.11.1:
+ resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==}
engines: {node: '>=4'}
axobject-query@4.1.0:
@@ -1041,8 +1172,8 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- baseline-browser-mapping@2.9.6:
- resolution: {integrity: sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==}
+ baseline-browser-mapping@2.9.19:
+ resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
hasBin: true
brace-expansion@1.1.12:
@@ -1076,8 +1207,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001760:
- resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
+ caniuse-lite@1.0.30001767:
+ resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -1164,8 +1295,8 @@ packages:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
- electron-to-chromium@1.5.267:
- resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
+ electron-to-chromium@1.5.283:
+ resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==}
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
@@ -1174,8 +1305,8 @@ packages:
resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
engines: {node: '>=10.13.0'}
- es-abstract@1.24.0:
- resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+ es-abstract@1.24.1:
+ resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==}
engines: {node: '>= 0.4'}
es-define-property@1.0.1:
@@ -1186,8 +1317,8 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-iterator-helpers@1.2.1:
- resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+ es-iterator-helpers@1.2.2:
+ resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==}
engines: {node: '>= 0.4'}
es-object-atoms@1.1.1:
@@ -1206,8 +1337,8 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- esbuild@0.27.1:
- resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==}
+ esbuild@0.27.2:
+ resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
engines: {node: '>=18'}
hasBin: true
@@ -1219,8 +1350,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- eslint-config-next@16.0.10:
- resolution: {integrity: sha512-BxouZUm0I45K4yjOOIzj24nTi0H2cGo0y7xUmk+Po/PYtJXFBYVDS1BguE7t28efXjKdcN0tmiLivxQy//SsZg==}
+ eslint-config-next@16.1.6:
+ resolution: {integrity: sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==}
peerDependencies:
eslint: '>=9.0.0'
typescript: '>=3.3.1'
@@ -1305,8 +1436,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.39.1:
- resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
+ eslint@9.39.2:
+ resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -1319,8 +1450,8 @@ packages:
resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- esquery@1.6.0:
- resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
engines: {node: '>=0.10'}
esrecurse@4.3.0:
@@ -1348,8 +1479,8 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- fastq@1.19.1:
- resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
@@ -1418,8 +1549,8 @@ packages:
resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
engines: {node: '>= 0.4'}
- get-tsconfig@4.13.0:
- resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
+ get-tsconfig@4.13.1:
+ resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -1437,8 +1568,8 @@ packages:
resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==}
engines: {node: '>=18'}
- globals@16.5.0:
- resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
+ globals@17.3.0:
+ resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==}
engines: {node: '>=18'}
globalthis@1.0.4:
@@ -1485,6 +1616,9 @@ packages:
hermes-parser@0.25.1:
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
+ icu-minify@4.8.2:
+ resolution: {integrity: sha512-LHBQV+skKkjZSPd590pZ7ZAHftUgda3eFjeuNwA8/15L8T8loCNBktKQyTlkodAU86KovFXeg/9WntlAo5wA5A==}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -1505,8 +1639,8 @@ packages:
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
- intl-messageformat@10.7.18:
- resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==}
+ intl-messageformat@11.1.2:
+ resolution: {integrity: sha512-ucSrQmZGAxfiBHfBRXW/k7UC8MaGFlEj4Ry1tKiDcmgwQm1y3EDl40u+4VNHYomxJQMJi9NEI3riDRlth96jKg==}
is-array-buffer@3.0.5:
resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
@@ -1708,24 +1842,28 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-arm64-musl@1.30.2:
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
lightningcss-linux-x64-gnu@1.30.2:
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-x64-musl@1.30.2:
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
lightningcss-win32-arm64-msvc@1.30.2:
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
@@ -1806,11 +1944,11 @@ packages:
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
engines: {node: '>= 0.6'}
- next-intl-swc-plugin-extractor@4.5.8:
- resolution: {integrity: sha512-hscCKUv+5GQ0CCNbvqZ8gaxnAGToCgDTbL++jgCq8SCk/ljtZDEeQZcMk46Nm6Ynn49Q/JKF4Npo/Sq1mpbusA==}
+ next-intl-swc-plugin-extractor@4.8.2:
+ resolution: {integrity: sha512-sHDs36L1VZmFHj3tPHsD+KZJtnsRudHlNvT0ieIe3iFVn5OpGLTxW3d/Zc/2LXSj5GpGuR6wQeikbhFjU9tMQQ==}
- next-intl@4.5.8:
- resolution: {integrity: sha512-BdN6494nvt09WtmW5gbWdwRhDDHC/Sg7tBMhN7xfYds3vcRCngSDXat81gmJkblw9jYOv8zXzzFJyu5VYXnJzg==}
+ next-intl@4.8.2:
+ resolution: {integrity: sha512-GuuwyvyEI49/oehQbBXEoY8KSIYCzmfMLhmIwhMXTb+yeBmly1PnJcpgph3KczQ+HTJMXwXCmkizgtT8jBMf3A==}
peerDependencies:
next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
@@ -1819,8 +1957,8 @@ packages:
typescript:
optional: true
- next@16.0.10:
- resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==}
+ next@16.1.6:
+ resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
@@ -1840,6 +1978,9 @@ packages:
sass:
optional: true
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
@@ -1917,8 +2058,8 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
- po-parser@1.0.2:
- resolution: {integrity: sha512-yTIQL8PZy7V8c0psPoJUx7fayez+Mo/53MZgX9MPuPHx+Dt+sRPNuRbI+6Oqxnddhkd68x4Nlgon/zizL1Xg+w==}
+ po-parser@2.1.1:
+ resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==}
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
@@ -1964,16 +2105,16 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- react-dom@19.2.3:
- resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
+ react-dom@19.2.4:
+ resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
peerDependencies:
- react: ^19.2.3
+ react: ^19.2.4
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- react@19.2.3:
- resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
+ react@19.2.4:
+ resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
engines: {node: '>=0.10.0'}
reflect.getprototypeof@1.0.10:
@@ -2149,8 +2290,8 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
- ts-api-utils@2.1.0:
- resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+ ts-api-utils@2.4.0:
+ resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
@@ -2186,8 +2327,8 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
- typescript-eslint@8.49.0:
- resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==}
+ typescript-eslint@8.54.0:
+ resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -2208,8 +2349,8 @@ packages:
unrs-resolver@1.11.1:
resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
- update-browserslist-db@1.2.2:
- resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==}
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -2217,8 +2358,8 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
- use-intl@4.5.8:
- resolution: {integrity: sha512-rWPV2Sirw55BQbA/7ndUBtsikh8WXwBrUkZJ1mD35+emj/ogPPqgCZdv1DdrEFK42AjF1g5w8d3x8govhqPH6Q==}
+ use-intl@4.8.2:
+ resolution: {integrity: sha512-3VNXZgDnPFqhIYosQ9W1Hc6K5q+ZelMfawNbexdwL/dY7BTHbceLUBX5Eeex9lgogxTp0pf1SjHuhYNAjr9H3g==}
peerDependencies:
react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
@@ -2234,8 +2375,8 @@ packages:
resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
engines: {node: '>= 0.4'}
- which-typed-array@1.1.19:
- resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+ which-typed-array@1.1.20:
+ resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==}
engines: {node: '>= 0.4'}
which@2.0.2:
@@ -2260,32 +2401,32 @@ packages:
peerDependencies:
zod: ^3.25.0 || ^4.0.0
- zod@4.1.13:
- resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==}
+ zod@4.3.6:
+ resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
snapshots:
'@alloc/quick-lru@5.2.0': {}
- '@babel/code-frame@7.27.1':
+ '@babel/code-frame@7.29.0':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/compat-data@7.28.5': {}
+ '@babel/compat-data@7.29.0': {}
- '@babel/core@7.28.5':
+ '@babel/core@7.29.0':
dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.5
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
- '@babel/helpers': 7.28.4
- '@babel/parser': 7.28.5
- '@babel/template': 7.27.2
- '@babel/traverse': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.0
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+ '@babel/helpers': 7.28.6
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
'@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
debug: 4.4.3
@@ -2295,17 +2436,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/generator@7.28.5':
+ '@babel/generator@7.29.0':
dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
- '@babel/helper-compilation-targets@7.27.2':
+ '@babel/helper-compilation-targets@7.28.6':
dependencies:
- '@babel/compat-data': 7.28.5
+ '@babel/compat-data': 7.29.0
'@babel/helper-validator-option': 7.27.1
browserslist: 4.28.1
lru-cache: 5.1.1
@@ -2313,19 +2454,19 @@ snapshots:
'@babel/helper-globals@7.28.0': {}
- '@babel/helper-module-imports@7.27.1':
+ '@babel/helper-module-imports@7.28.6':
dependencies:
- '@babel/traverse': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
+ '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-module-imports': 7.27.1
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.28.6
'@babel/helper-validator-identifier': 7.28.5
- '@babel/traverse': 7.28.5
+ '@babel/traverse': 7.29.0
transitivePeerDependencies:
- supports-color
@@ -2335,45 +2476,45 @@ snapshots:
'@babel/helper-validator-option@7.27.1': {}
- '@babel/helpers@7.28.4':
+ '@babel/helpers@7.28.6':
dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
- '@babel/parser@7.28.5':
+ '@babel/parser@7.29.0':
dependencies:
- '@babel/types': 7.28.5
+ '@babel/types': 7.29.0
- '@babel/template@7.27.2':
+ '@babel/template@7.28.6':
dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
+ '@babel/code-frame': 7.29.0
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
- '@babel/traverse@7.28.5':
+ '@babel/traverse@7.29.0':
dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.5
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.0
'@babel/helper-globals': 7.28.0
- '@babel/parser': 7.28.5
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- '@babel/types@7.28.5':
+ '@babel/types@7.29.0':
dependencies:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@emnapi/core@1.7.1':
+ '@emnapi/core@1.8.1':
dependencies:
'@emnapi/wasi-threads': 1.1.0
tslib: 2.8.1
optional: true
- '@emnapi/runtime@1.7.1':
+ '@emnapi/runtime@1.8.1':
dependencies:
tslib: 2.8.1
optional: true
@@ -2383,87 +2524,87 @@ snapshots:
tslib: 2.8.1
optional: true
- '@esbuild/aix-ppc64@0.27.1':
+ '@esbuild/aix-ppc64@0.27.2':
optional: true
- '@esbuild/android-arm64@0.27.1':
+ '@esbuild/android-arm64@0.27.2':
optional: true
- '@esbuild/android-arm@0.27.1':
+ '@esbuild/android-arm@0.27.2':
optional: true
- '@esbuild/android-x64@0.27.1':
+ '@esbuild/android-x64@0.27.2':
optional: true
- '@esbuild/darwin-arm64@0.27.1':
+ '@esbuild/darwin-arm64@0.27.2':
optional: true
- '@esbuild/darwin-x64@0.27.1':
+ '@esbuild/darwin-x64@0.27.2':
optional: true
- '@esbuild/freebsd-arm64@0.27.1':
+ '@esbuild/freebsd-arm64@0.27.2':
optional: true
- '@esbuild/freebsd-x64@0.27.1':
+ '@esbuild/freebsd-x64@0.27.2':
optional: true
- '@esbuild/linux-arm64@0.27.1':
+ '@esbuild/linux-arm64@0.27.2':
optional: true
- '@esbuild/linux-arm@0.27.1':
+ '@esbuild/linux-arm@0.27.2':
optional: true
- '@esbuild/linux-ia32@0.27.1':
+ '@esbuild/linux-ia32@0.27.2':
optional: true
- '@esbuild/linux-loong64@0.27.1':
+ '@esbuild/linux-loong64@0.27.2':
optional: true
- '@esbuild/linux-mips64el@0.27.1':
+ '@esbuild/linux-mips64el@0.27.2':
optional: true
- '@esbuild/linux-ppc64@0.27.1':
+ '@esbuild/linux-ppc64@0.27.2':
optional: true
- '@esbuild/linux-riscv64@0.27.1':
+ '@esbuild/linux-riscv64@0.27.2':
optional: true
- '@esbuild/linux-s390x@0.27.1':
+ '@esbuild/linux-s390x@0.27.2':
optional: true
- '@esbuild/linux-x64@0.27.1':
+ '@esbuild/linux-x64@0.27.2':
optional: true
- '@esbuild/netbsd-arm64@0.27.1':
+ '@esbuild/netbsd-arm64@0.27.2':
optional: true
- '@esbuild/netbsd-x64@0.27.1':
+ '@esbuild/netbsd-x64@0.27.2':
optional: true
- '@esbuild/openbsd-arm64@0.27.1':
+ '@esbuild/openbsd-arm64@0.27.2':
optional: true
- '@esbuild/openbsd-x64@0.27.1':
+ '@esbuild/openbsd-x64@0.27.2':
optional: true
- '@esbuild/openharmony-arm64@0.27.1':
+ '@esbuild/openharmony-arm64@0.27.2':
optional: true
- '@esbuild/sunos-x64@0.27.1':
+ '@esbuild/sunos-x64@0.27.2':
optional: true
- '@esbuild/win32-arm64@0.27.1':
+ '@esbuild/win32-arm64@0.27.2':
optional: true
- '@esbuild/win32-ia32@0.27.1':
+ '@esbuild/win32-ia32@0.27.2':
optional: true
- '@esbuild/win32-x64@0.27.1':
+ '@esbuild/win32-x64@0.27.2':
optional: true
- '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))':
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))':
dependencies:
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
@@ -2498,7 +2639,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.39.1': {}
+ '@eslint/js@9.39.2': {}
'@eslint/object-schema@2.1.7': {}
@@ -2507,39 +2648,40 @@ snapshots:
'@eslint/core': 0.17.0
levn: 0.4.1
- '@formatjs/ecma402-abstract@2.3.6':
+ '@formatjs/ecma402-abstract@3.1.1':
dependencies:
- '@formatjs/fast-memoize': 2.2.7
- '@formatjs/intl-localematcher': 0.6.2
+ '@formatjs/fast-memoize': 3.1.0
+ '@formatjs/intl-localematcher': 0.8.1
decimal.js: 10.6.0
tslib: 2.8.1
- '@formatjs/fast-memoize@2.2.7':
+ '@formatjs/fast-memoize@3.1.0':
dependencies:
tslib: 2.8.1
- '@formatjs/icu-messageformat-parser@2.11.4':
+ '@formatjs/icu-messageformat-parser@3.5.1':
dependencies:
- '@formatjs/ecma402-abstract': 2.3.6
- '@formatjs/icu-skeleton-parser': 1.8.16
+ '@formatjs/ecma402-abstract': 3.1.1
+ '@formatjs/icu-skeleton-parser': 2.1.1
tslib: 2.8.1
- '@formatjs/icu-skeleton-parser@1.8.16':
+ '@formatjs/icu-skeleton-parser@2.1.1':
dependencies:
- '@formatjs/ecma402-abstract': 2.3.6
+ '@formatjs/ecma402-abstract': 3.1.1
tslib: 2.8.1
'@formatjs/intl-localematcher@0.5.10':
dependencies:
tslib: 2.8.1
- '@formatjs/intl-localematcher@0.6.2':
+ '@formatjs/intl-localematcher@0.8.1':
dependencies:
+ '@formatjs/fast-memoize': 3.1.0
tslib: 2.8.1
- '@heroicons/react@2.2.0(react@19.2.3)':
+ '@heroicons/react@2.2.0(react@19.2.4)':
dependencies:
- react: 19.2.3
+ react: 19.2.4
'@humanfs/core@0.19.1': {}
@@ -2637,7 +2779,7 @@ snapshots:
'@img/sharp-wasm32@0.34.5':
dependencies:
- '@emnapi/runtime': 1.7.1
+ '@emnapi/runtime': 1.8.1
optional: true
'@img/sharp-win32-arm64@0.34.5':
@@ -2668,41 +2810,43 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@lemonsqueezy/lemonsqueezy.js@4.0.0': {}
+
'@napi-rs/wasm-runtime@0.2.12':
dependencies:
- '@emnapi/core': 1.7.1
- '@emnapi/runtime': 1.7.1
+ '@emnapi/core': 1.8.1
+ '@emnapi/runtime': 1.8.1
'@tybys/wasm-util': 0.10.1
optional: true
- '@next/env@16.0.10': {}
+ '@next/env@16.1.6': {}
- '@next/eslint-plugin-next@16.0.10':
+ '@next/eslint-plugin-next@16.1.6':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@16.0.10':
+ '@next/swc-darwin-arm64@16.1.6':
optional: true
- '@next/swc-darwin-x64@16.0.10':
+ '@next/swc-darwin-x64@16.1.6':
optional: true
- '@next/swc-linux-arm64-gnu@16.0.10':
+ '@next/swc-linux-arm64-gnu@16.1.6':
optional: true
- '@next/swc-linux-arm64-musl@16.0.10':
+ '@next/swc-linux-arm64-musl@16.1.6':
optional: true
- '@next/swc-linux-x64-gnu@16.0.10':
+ '@next/swc-linux-x64-gnu@16.1.6':
optional: true
- '@next/swc-linux-x64-musl@16.0.10':
+ '@next/swc-linux-x64-musl@16.1.6':
optional: true
- '@next/swc-win32-arm64-msvc@16.0.10':
+ '@next/swc-win32-arm64-msvc@16.1.6':
optional: true
- '@next/swc-win32-x64-msvc@16.0.10':
+ '@next/swc-win32-x64-msvc@16.1.6':
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -2715,59 +2859,119 @@ snapshots:
'@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.19.1
+ fastq: 1.20.1
'@nolyfill/is-core-module@1.0.39': {}
+ '@parcel/watcher-android-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher@2.5.6':
+ dependencies:
+ detect-libc: 2.1.2
+ is-glob: 4.0.3
+ node-addon-api: 7.1.1
+ picomatch: 4.0.3
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.5.6
+ '@parcel/watcher-darwin-arm64': 2.5.6
+ '@parcel/watcher-darwin-x64': 2.5.6
+ '@parcel/watcher-freebsd-x64': 2.5.6
+ '@parcel/watcher-linux-arm-glibc': 2.5.6
+ '@parcel/watcher-linux-arm-musl': 2.5.6
+ '@parcel/watcher-linux-arm64-glibc': 2.5.6
+ '@parcel/watcher-linux-arm64-musl': 2.5.6
+ '@parcel/watcher-linux-x64-glibc': 2.5.6
+ '@parcel/watcher-linux-x64-musl': 2.5.6
+ '@parcel/watcher-win32-arm64': 2.5.6
+ '@parcel/watcher-win32-ia32': 2.5.6
+ '@parcel/watcher-win32-x64': 2.5.6
+
'@rtsao/scc@1.1.0': {}
'@schummar/icu-type-parser@1.21.5': {}
- '@swc/core-darwin-arm64@1.15.3':
+ '@swc/core-darwin-arm64@1.15.11':
optional: true
- '@swc/core-darwin-x64@1.15.3':
+ '@swc/core-darwin-x64@1.15.11':
optional: true
- '@swc/core-linux-arm-gnueabihf@1.15.3':
+ '@swc/core-linux-arm-gnueabihf@1.15.11':
optional: true
- '@swc/core-linux-arm64-gnu@1.15.3':
+ '@swc/core-linux-arm64-gnu@1.15.11':
optional: true
- '@swc/core-linux-arm64-musl@1.15.3':
+ '@swc/core-linux-arm64-musl@1.15.11':
optional: true
- '@swc/core-linux-x64-gnu@1.15.3':
+ '@swc/core-linux-x64-gnu@1.15.11':
optional: true
- '@swc/core-linux-x64-musl@1.15.3':
+ '@swc/core-linux-x64-musl@1.15.11':
optional: true
- '@swc/core-win32-arm64-msvc@1.15.3':
+ '@swc/core-win32-arm64-msvc@1.15.11':
optional: true
- '@swc/core-win32-ia32-msvc@1.15.3':
+ '@swc/core-win32-ia32-msvc@1.15.11':
optional: true
- '@swc/core-win32-x64-msvc@1.15.3':
+ '@swc/core-win32-x64-msvc@1.15.11':
optional: true
- '@swc/core@1.15.3':
+ '@swc/core@1.15.11':
dependencies:
'@swc/counter': 0.1.3
'@swc/types': 0.1.25
optionalDependencies:
- '@swc/core-darwin-arm64': 1.15.3
- '@swc/core-darwin-x64': 1.15.3
- '@swc/core-linux-arm-gnueabihf': 1.15.3
- '@swc/core-linux-arm64-gnu': 1.15.3
- '@swc/core-linux-arm64-musl': 1.15.3
- '@swc/core-linux-x64-gnu': 1.15.3
- '@swc/core-linux-x64-musl': 1.15.3
- '@swc/core-win32-arm64-msvc': 1.15.3
- '@swc/core-win32-ia32-msvc': 1.15.3
- '@swc/core-win32-x64-msvc': 1.15.3
+ '@swc/core-darwin-arm64': 1.15.11
+ '@swc/core-darwin-x64': 1.15.11
+ '@swc/core-linux-arm-gnueabihf': 1.15.11
+ '@swc/core-linux-arm64-gnu': 1.15.11
+ '@swc/core-linux-arm64-musl': 1.15.11
+ '@swc/core-linux-x64-gnu': 1.15.11
+ '@swc/core-linux-x64-musl': 1.15.11
+ '@swc/core-win32-arm64-msvc': 1.15.11
+ '@swc/core-win32-ia32-msvc': 1.15.11
+ '@swc/core-win32-x64-msvc': 1.15.11
'@swc/counter@0.1.3': {}
@@ -2859,107 +3063,107 @@ snapshots:
'@types/json5@0.0.29': {}
- '@types/node@25.0.1':
+ '@types/node@25.2.0':
dependencies:
undici-types: 7.16.0
- '@types/react-dom@19.2.3(@types/react@19.2.7)':
+ '@types/react-dom@19.2.3(@types/react@19.2.10)':
dependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.10
- '@types/react@19.2.7':
+ '@types/react@19.2.10':
dependencies:
csstype: 3.2.3
- '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/scope-manager': 8.49.0
- '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.49.0
- eslint: 9.39.1(jiti@2.6.1)
+ '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.54.0
+ '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.54.0
+ eslint: 9.39.2(jiti@2.6.1)
ignore: 7.0.5
natural-compare: 1.4.0
- ts-api-utils: 2.1.0(typescript@5.9.3)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.49.0
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.49.0
+ '@typescript-eslint/scope-manager': 8.54.0
+ '@typescript-eslint/types': 8.54.0
+ '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.54.0
debug: 4.4.3
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)':
+ '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.54.0
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.49.0':
+ '@typescript-eslint/scope-manager@8.54.0':
dependencies:
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/visitor-keys': 8.49.0
+ '@typescript-eslint/types': 8.54.0
+ '@typescript-eslint/visitor-keys': 8.54.0
- '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)':
+ '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
- '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/types': 8.54.0
+ '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
debug: 4.4.3
- eslint: 9.39.1(jiti@2.6.1)
- ts-api-utils: 2.1.0(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.49.0': {}
+ '@typescript-eslint/types@8.54.0': {}
- '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)':
+ '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/visitor-keys': 8.49.0
+ '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.54.0
+ '@typescript-eslint/visitor-keys': 8.54.0
debug: 4.4.3
minimatch: 9.0.5
semver: 7.7.3
tinyglobby: 0.2.15
- ts-api-utils: 2.1.0(typescript@5.9.3)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
- '@typescript-eslint/scope-manager': 8.49.0
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- eslint: 9.39.1(jiti@2.6.1)
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.54.0
+ '@typescript-eslint/types': 8.54.0
+ '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.49.0':
+ '@typescript-eslint/visitor-keys@8.54.0':
dependencies:
- '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/types': 8.54.0
eslint-visitor-keys: 4.2.1
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
@@ -3052,7 +3256,7 @@ snapshots:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
is-string: 1.1.1
@@ -3062,7 +3266,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
es-shim-unscopables: 1.1.0
@@ -3072,7 +3276,7 @@ snapshots:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
es-shim-unscopables: 1.1.0
@@ -3081,21 +3285,21 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-shim-unscopables: 1.1.0
array.prototype.flatmap@1.3.3:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-shim-unscopables: 1.1.0
array.prototype.tosorted@1.1.4:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-shim-unscopables: 1.1.0
@@ -3104,7 +3308,7 @@ snapshots:
array-buffer-byte-length: 1.0.2
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
@@ -3117,13 +3321,13 @@ snapshots:
dependencies:
possible-typed-array-names: 1.1.0
- axe-core@4.11.0: {}
+ axe-core@4.11.1: {}
axobject-query@4.1.0: {}
balanced-match@1.0.2: {}
- baseline-browser-mapping@2.9.6: {}
+ baseline-browser-mapping@2.9.19: {}
brace-expansion@1.1.12:
dependencies:
@@ -3140,11 +3344,11 @@ snapshots:
browserslist@4.28.1:
dependencies:
- baseline-browser-mapping: 2.9.6
- caniuse-lite: 1.0.30001760
- electron-to-chromium: 1.5.267
+ baseline-browser-mapping: 2.9.19
+ caniuse-lite: 1.0.30001767
+ electron-to-chromium: 1.5.283
node-releases: 2.0.27
- update-browserslist-db: 1.2.2(browserslist@4.28.1)
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
call-bind-apply-helpers@1.0.2:
dependencies:
@@ -3165,7 +3369,7 @@ snapshots:
callsites@3.1.0: {}
- caniuse-lite@1.0.30001760: {}
+ caniuse-lite@1.0.30001767: {}
chalk@4.1.2:
dependencies:
@@ -3248,7 +3452,7 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
- electron-to-chromium@1.5.267: {}
+ electron-to-chromium@1.5.283: {}
emoji-regex@9.2.2: {}
@@ -3257,7 +3461,7 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.3.0
- es-abstract@1.24.0:
+ es-abstract@1.24.1:
dependencies:
array-buffer-byte-length: 1.0.2
arraybuffer.prototype.slice: 1.0.4
@@ -3312,18 +3516,18 @@ snapshots:
typed-array-byte-offset: 1.0.4
typed-array-length: 1.0.7
unbox-primitive: 1.1.0
- which-typed-array: 1.1.19
+ which-typed-array: 1.1.20
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
- es-iterator-helpers@1.2.1:
+ es-iterator-helpers@1.2.2:
dependencies:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-set-tostringtag: 2.1.0
function-bind: 1.1.2
@@ -3358,51 +3562,51 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
- esbuild@0.27.1:
+ esbuild@0.27.2:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.27.1
- '@esbuild/android-arm': 0.27.1
- '@esbuild/android-arm64': 0.27.1
- '@esbuild/android-x64': 0.27.1
- '@esbuild/darwin-arm64': 0.27.1
- '@esbuild/darwin-x64': 0.27.1
- '@esbuild/freebsd-arm64': 0.27.1
- '@esbuild/freebsd-x64': 0.27.1
- '@esbuild/linux-arm': 0.27.1
- '@esbuild/linux-arm64': 0.27.1
- '@esbuild/linux-ia32': 0.27.1
- '@esbuild/linux-loong64': 0.27.1
- '@esbuild/linux-mips64el': 0.27.1
- '@esbuild/linux-ppc64': 0.27.1
- '@esbuild/linux-riscv64': 0.27.1
- '@esbuild/linux-s390x': 0.27.1
- '@esbuild/linux-x64': 0.27.1
- '@esbuild/netbsd-arm64': 0.27.1
- '@esbuild/netbsd-x64': 0.27.1
- '@esbuild/openbsd-arm64': 0.27.1
- '@esbuild/openbsd-x64': 0.27.1
- '@esbuild/openharmony-arm64': 0.27.1
- '@esbuild/sunos-x64': 0.27.1
- '@esbuild/win32-arm64': 0.27.1
- '@esbuild/win32-ia32': 0.27.1
- '@esbuild/win32-x64': 0.27.1
+ '@esbuild/aix-ppc64': 0.27.2
+ '@esbuild/android-arm': 0.27.2
+ '@esbuild/android-arm64': 0.27.2
+ '@esbuild/android-x64': 0.27.2
+ '@esbuild/darwin-arm64': 0.27.2
+ '@esbuild/darwin-x64': 0.27.2
+ '@esbuild/freebsd-arm64': 0.27.2
+ '@esbuild/freebsd-x64': 0.27.2
+ '@esbuild/linux-arm': 0.27.2
+ '@esbuild/linux-arm64': 0.27.2
+ '@esbuild/linux-ia32': 0.27.2
+ '@esbuild/linux-loong64': 0.27.2
+ '@esbuild/linux-mips64el': 0.27.2
+ '@esbuild/linux-ppc64': 0.27.2
+ '@esbuild/linux-riscv64': 0.27.2
+ '@esbuild/linux-s390x': 0.27.2
+ '@esbuild/linux-x64': 0.27.2
+ '@esbuild/netbsd-arm64': 0.27.2
+ '@esbuild/netbsd-x64': 0.27.2
+ '@esbuild/openbsd-arm64': 0.27.2
+ '@esbuild/openbsd-x64': 0.27.2
+ '@esbuild/openharmony-arm64': 0.27.2
+ '@esbuild/sunos-x64': 0.27.2
+ '@esbuild/win32-arm64': 0.27.2
+ '@esbuild/win32-ia32': 0.27.2
+ '@esbuild/win32-x64': 0.27.2
escalade@3.2.0: {}
escape-string-regexp@4.0.0: {}
- eslint-config-next@16.0.10(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
+ eslint-config-next@16.1.6(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
dependencies:
- '@next/eslint-plugin-next': 16.0.10
- eslint: 9.39.1(jiti@2.6.1)
+ '@next/eslint-plugin-next': 16.1.6
+ eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1))
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1))
- eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.6.1))
- eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1))
- eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.6.1))
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@2.6.1))
globals: 16.4.0
- typescript-eslint: 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ typescript-eslint: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
optionalDependencies:
typescript: 5.9.3
transitivePeerDependencies:
@@ -3419,33 +3623,33 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)):
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.3
- eslint: 9.39.1(jiti@2.6.1)
- get-tsconfig: 4.13.0
+ eslint: 9.39.2(jiti@2.6.1)
+ get-tsconfig: 4.13.1
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.1(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)):
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- eslint: 9.39.1(jiti@2.6.1)
+ '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1))
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -3454,9 +3658,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1))
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -3468,23 +3672,23 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.6.1)):
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.9
array.prototype.flatmap: 1.3.3
ast-types-flow: 0.0.8
- axe-core: 4.11.0
+ axe-core: 4.11.1
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
@@ -3493,26 +3697,26 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
- eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)):
+ eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)):
dependencies:
- '@babel/core': 7.28.5
- '@babel/parser': 7.28.5
- eslint: 9.39.1(jiti@2.6.1)
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.0
+ eslint: 9.39.2(jiti@2.6.1)
hermes-parser: 0.25.1
- zod: 4.1.13
- zod-validation-error: 4.0.2(zod@4.1.13)
+ zod: 4.3.6
+ zod-validation-error: 4.0.2(zod@4.3.6)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)):
+ eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)):
dependencies:
array-includes: 3.1.9
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.3
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
- es-iterator-helpers: 1.2.1
- eslint: 9.39.1(jiti@2.6.1)
+ es-iterator-helpers: 1.2.2
+ eslint: 9.39.2(jiti@2.6.1)
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
@@ -3535,15 +3739,15 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
- eslint@9.39.1(jiti@2.6.1):
+ eslint@9.39.2(jiti@2.6.1):
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.2
'@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.3
- '@eslint/js': 9.39.1
+ '@eslint/js': 9.39.2
'@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
@@ -3557,7 +3761,7 @@ snapshots:
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
espree: 10.4.0
- esquery: 1.6.0
+ esquery: 1.7.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
@@ -3582,7 +3786,7 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.15.0)
eslint-visitor-keys: 4.2.1
- esquery@1.6.0:
+ esquery@1.7.0:
dependencies:
estraverse: 5.3.0
@@ -3608,7 +3812,7 @@ snapshots:
fast-levenshtein@2.0.6: {}
- fastq@1.19.1:
+ fastq@1.20.1:
dependencies:
reusify: 1.1.0
@@ -3684,7 +3888,7 @@ snapshots:
es-errors: 1.3.0
get-intrinsic: 1.3.0
- get-tsconfig@4.13.0:
+ get-tsconfig@4.13.1:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -3700,7 +3904,7 @@ snapshots:
globals@16.4.0: {}
- globals@16.5.0: {}
+ globals@17.3.0: {}
globalthis@1.0.4:
dependencies:
@@ -3739,6 +3943,10 @@ snapshots:
dependencies:
hermes-estree: 0.25.1
+ icu-minify@4.8.2:
+ dependencies:
+ '@formatjs/icu-messageformat-parser': 3.5.1
+
ignore@5.3.2: {}
ignore@7.0.5: {}
@@ -3756,11 +3964,11 @@ snapshots:
hasown: 2.0.2
side-channel: 1.1.0
- intl-messageformat@10.7.18:
+ intl-messageformat@11.1.2:
dependencies:
- '@formatjs/ecma402-abstract': 2.3.6
- '@formatjs/fast-memoize': 2.2.7
- '@formatjs/icu-messageformat-parser': 2.11.4
+ '@formatjs/ecma402-abstract': 3.1.1
+ '@formatjs/fast-memoize': 3.1.0
+ '@formatjs/icu-messageformat-parser': 3.5.1
tslib: 2.8.1
is-array-buffer@3.0.5:
@@ -3862,7 +4070,7 @@ snapshots:
is-typed-array@1.1.15:
dependencies:
- which-typed-array: 1.1.19
+ which-typed-array: 1.1.20
is-weakmap@2.0.2: {}
@@ -4030,46 +4238,51 @@ snapshots:
negotiator@1.0.0: {}
- next-intl-swc-plugin-extractor@4.5.8: {}
+ next-intl-swc-plugin-extractor@4.8.2: {}
- next-intl@4.5.8(next@16.0.10(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(typescript@5.9.3):
+ next-intl@4.8.2(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
dependencies:
'@formatjs/intl-localematcher': 0.5.10
- '@swc/core': 1.15.3
+ '@parcel/watcher': 2.5.6
+ '@swc/core': 1.15.11
+ icu-minify: 4.8.2
negotiator: 1.0.0
- next: 16.0.10(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- next-intl-swc-plugin-extractor: 4.5.8
- po-parser: 1.0.2
- react: 19.2.3
- use-intl: 4.5.8(react@19.2.3)
+ next: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ next-intl-swc-plugin-extractor: 4.8.2
+ po-parser: 2.1.1
+ react: 19.2.4
+ use-intl: 4.8.2(react@19.2.4)
optionalDependencies:
typescript: 5.9.3
transitivePeerDependencies:
- '@swc/helpers'
- next@16.0.10(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- '@next/env': 16.0.10
+ '@next/env': 16.1.6
'@swc/helpers': 0.5.15
- caniuse-lite: 1.0.30001760
+ baseline-browser-mapping: 2.9.19
+ caniuse-lite: 1.0.30001767
postcss: 8.4.31
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4)
optionalDependencies:
- '@next/swc-darwin-arm64': 16.0.10
- '@next/swc-darwin-x64': 16.0.10
- '@next/swc-linux-arm64-gnu': 16.0.10
- '@next/swc-linux-arm64-musl': 16.0.10
- '@next/swc-linux-x64-gnu': 16.0.10
- '@next/swc-linux-x64-musl': 16.0.10
- '@next/swc-win32-arm64-msvc': 16.0.10
- '@next/swc-win32-x64-msvc': 16.0.10
+ '@next/swc-darwin-arm64': 16.1.6
+ '@next/swc-darwin-x64': 16.1.6
+ '@next/swc-linux-arm64-gnu': 16.1.6
+ '@next/swc-linux-arm64-musl': 16.1.6
+ '@next/swc-linux-x64-gnu': 16.1.6
+ '@next/swc-linux-x64-musl': 16.1.6
+ '@next/swc-win32-arm64-msvc': 16.1.6
+ '@next/swc-win32-x64-msvc': 16.1.6
sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
+ node-addon-api@7.1.1: {}
+
node-releases@2.0.27: {}
object-assign@4.1.1: {}
@@ -4098,14 +4311,14 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-object-atoms: 1.1.1
object.groupby@1.0.3:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
object.values@1.2.1:
dependencies:
@@ -4153,7 +4366,7 @@ snapshots:
picomatch@4.0.3: {}
- po-parser@1.0.2: {}
+ po-parser@2.1.1: {}
possible-typed-array-names@1.1.0: {}
@@ -4189,20 +4402,20 @@ snapshots:
queue-microtask@1.2.3: {}
- react-dom@19.2.3(react@19.2.3):
+ react-dom@19.2.4(react@19.2.4):
dependencies:
- react: 19.2.3
+ react: 19.2.4
scheduler: 0.27.0
react-is@16.13.1: {}
- react@19.2.3: {}
+ react@19.2.4: {}
reflect.getprototypeof@1.0.10:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@@ -4366,14 +4579,14 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
string.prototype.matchall@4.0.12:
dependencies:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@@ -4387,7 +4600,7 @@ snapshots:
string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
string.prototype.trim@1.2.10:
dependencies:
@@ -4395,7 +4608,7 @@ snapshots:
call-bound: 1.0.4
define-data-property: 1.1.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-object-atoms: 1.1.1
has-property-descriptors: 1.0.2
@@ -4416,12 +4629,12 @@ snapshots:
strip-json-comments@3.1.1: {}
- styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3):
+ styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4):
dependencies:
client-only: 0.0.1
- react: 19.2.3
+ react: 19.2.4
optionalDependencies:
- '@babel/core': 7.28.5
+ '@babel/core': 7.29.0
supports-color@7.2.0:
dependencies:
@@ -4442,7 +4655,7 @@ snapshots:
dependencies:
is-number: 7.0.0
- ts-api-utils@2.1.0(typescript@5.9.3):
+ ts-api-utils@2.4.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3
@@ -4457,8 +4670,8 @@ snapshots:
tsx@4.21.0:
dependencies:
- esbuild: 0.27.1
- get-tsconfig: 4.13.0
+ esbuild: 0.27.2
+ get-tsconfig: 4.13.1
optionalDependencies:
fsevents: 2.3.3
@@ -4499,13 +4712,13 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
- typescript-eslint@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
+ typescript-eslint@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- eslint: 9.39.1(jiti@2.6.1)
+ '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -4545,7 +4758,7 @@ snapshots:
'@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
'@unrs/resolver-binding-win32-x64-msvc': 1.11.1
- update-browserslist-db@1.2.2(browserslist@4.28.1):
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies:
browserslist: 4.28.1
escalade: 3.2.0
@@ -4555,12 +4768,13 @@ snapshots:
dependencies:
punycode: 2.3.1
- use-intl@4.5.8(react@19.2.3):
+ use-intl@4.8.2(react@19.2.4):
dependencies:
- '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/fast-memoize': 3.1.0
'@schummar/icu-type-parser': 1.21.5
- intl-messageformat: 10.7.18
- react: 19.2.3
+ icu-minify: 4.8.2
+ intl-messageformat: 11.1.2
+ react: 19.2.4
which-boxed-primitive@1.1.1:
dependencies:
@@ -4584,7 +4798,7 @@ snapshots:
isarray: 2.0.5
which-boxed-primitive: 1.1.1
which-collection: 1.0.2
- which-typed-array: 1.1.19
+ which-typed-array: 1.1.20
which-collection@1.0.2:
dependencies:
@@ -4593,7 +4807,7 @@ snapshots:
is-weakmap: 2.0.2
is-weakset: 2.0.4
- which-typed-array@1.1.19:
+ which-typed-array@1.1.20:
dependencies:
available-typed-arrays: 1.0.7
call-bind: 1.0.8
@@ -4613,8 +4827,8 @@ snapshots:
yocto-queue@0.1.0: {}
- zod-validation-error@4.0.2(zod@4.1.13):
+ zod-validation-error@4.0.2(zod@4.3.6):
dependencies:
- zod: 4.1.13
+ zod: 4.3.6
- zod@4.1.13: {}
+ zod@4.3.6: {}
diff --git a/scripts/sortMessages.mts b/scripts/sortMessages.mts
index 3f14738..4a4e894 100644
--- a/scripts/sortMessages.mts
+++ b/scripts/sortMessages.mts
@@ -6,7 +6,6 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const messagesBaseDir = join(__dirname, '..', 'messages');
-// Define supported languages
type SupportedLanguage = 'en' | 'de' | 'ru' | 'ka' | 'ar';
function stripEmojis(str: string): string {
@@ -14,30 +13,22 @@ function stripEmojis(str: string): string {
}
function sortCharacterMessages(messagesObj: Record, lang: SupportedLanguage): Record {
- // Convert object to array of [key, value] pairs, sort by value, then convert back
const entries = Object.entries(messagesObj);
const sortedEntries = entries.sort(([, a], [, b]) => a.localeCompare(b, lang));
-
- // Rebuild object with sorted values but preserve original numeric keys
const result: Record = {};
sortedEntries.forEach(([, value], index) => {
result[index.toString()] = value;
});
-
return result;
}
function sortUIMessages(messagesObj: Record): Record {
- // For UI messages, sort by key (semantic names) to maintain consistent order
const entries = Object.entries(messagesObj);
const sortedEntries = entries.sort(([a], [b]) => a.localeCompare(b));
-
- // Rebuild object maintaining original semantic keys
const result: Record = {};
sortedEntries.forEach(([key, value]) => {
result[key] = value;
});
-
return result;
}
@@ -61,7 +52,6 @@ function sortMessages() {
const warnings: string[] = [];
const CHARACTER_LIMIT = 41;
- // Process both character and ui message directories
const messageTypes = ['character', 'ui'];
messageTypes.forEach(messageType => {
@@ -72,32 +62,25 @@ function sortMessages() {
return;
}
- // Get all JSON files in the messages directory
const files = readdirSync(messagesDir).filter(file => file.endsWith('.json'));
files.forEach(file => {
const lang = file.replace('.json', '') as SupportedLanguage;
const filePath = join(messagesDir, file);
- // Read and parse JSON
const messagesData = JSON.parse(readFileSync(filePath, 'utf8'));
- // Handle both object format (character messages) and direct object format (ui messages)
let messages: string[];
let isObjectFormat = false;
let needsConversion = false;
if (Array.isArray(messagesData)) {
- // Array format - needs conversion to object format for character messages
messages = messagesData;
needsConversion = messageType === 'character';
} else if (typeof messagesData === 'object') {
- // Object format with numeric keys or direct key-value pairs
if (messageType === 'ui') {
- // For UI messages, extract all string values from nested objects
messages = extractStringsFromObject(messagesData);
} else {
- // For character messages, simple object values
messages = Object.values(messagesData);
}
isObjectFormat = true;
@@ -106,11 +89,9 @@ function sortMessages() {
return;
}
- // Check message lengths and duplicates
const strippedToOriginal = new Map();
messages.forEach((msg: string) => {
- // Length check - only apply to character messages, not UI messages
if (messageType === 'character' && msg.length > CHARACTER_LIMIT) {
warnings.push(
`Warning: ${messageType}/${lang} message exceeds ${CHARACTER_LIMIT} characters ` +
@@ -118,14 +99,12 @@ function sortMessages() {
);
}
- // Duplicate check
const stripped = stripEmojis(msg);
const existing = strippedToOriginal.get(stripped) || [];
existing.push(msg);
strippedToOriginal.set(stripped, existing);
});
- // Add duplicate warnings
strippedToOriginal.forEach((originals) => {
if (originals.length > 1) {
warnings.push(
@@ -135,9 +114,7 @@ function sortMessages() {
}
});
- // Sort messages and write back
if (needsConversion) {
- // Convert array to object format for character messages
const sortedMessages = [...messages].sort((a, b) => a.localeCompare(b, lang));
const objectMessages: Record = {};
sortedMessages.forEach((message, index) => {
@@ -153,21 +130,17 @@ function sortMessages() {
let sortedMessages;
if (messageType === 'character') {
- // Character messages: sort by value and use numeric keys
sortedMessages = sortCharacterMessages(messagesData, lang);
} else {
- // UI messages: sort by key and preserve semantic keys
sortedMessages = sortUIMessages(messagesData);
}
- // Write back to JSON file with pretty printing
writeFileSync(
filePath,
JSON.stringify(sortedMessages, null, 2),
'utf8'
);
} else {
- // Handle array format (legacy) - shouldn't happen anymore
const sortedMessages = [...messages].sort((a, b) => a.localeCompare(b, lang));
writeFileSync(
@@ -181,7 +154,6 @@ function sortMessages() {
});
});
- // Display warnings if any were collected
if (warnings.length > 0) {
console.warn('\nWarnings:');
warnings.forEach(warning => console.warn(warning));
@@ -191,4 +163,5 @@ function sortMessages() {
}
}
-sortMessages();
\ No newline at end of file
+sortMessages();
+
diff --git a/tsconfig.json b/tsconfig.json
index e8e7514..7839ff5 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -27,7 +27,7 @@
"./src/*"
]
}
- },
+},
"include": [
"next-env.d.ts",
"**/*.ts",