From cdf8d929e10c872046a96ca7e96730ca323a2870 Mon Sep 17 00:00:00 2001 From: duckietm Date: Mon, 11 May 2026 18:07:54 +0200 Subject: [PATCH 1/7] =?UTF-8?q?=F0=9F=86=95=20Added=20Reset=20password=20/?= =?UTF-8?q?=20Email=20and=20chenge=20username=20in=20user=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 4 +- src/components/MainView.tsx | 2 + src/components/login/LoginView.tsx | 3 +- .../user-settings/UserAccountSettingsView.tsx | 758 ++++++++++++++++++ .../user-settings/UserSettingsView.tsx | 19 +- 5 files changed, 782 insertions(+), 4 deletions(-) create mode 100644 src/components/user-settings/UserAccountSettingsView.tsx diff --git a/src/App.tsx b/src/App.tsx index 20b1f54..0dcb613 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,6 @@ import { GetAssetManager, GetAvatarRenderManager, GetCommunication, GetConfiguration, GetLocalizationManager, GetRoomEngine, GetRoomSessionManager, GetSessionDataManager, GetSoundManager, GetStage, GetTexturePool, GetTicker, HabboWebTools, LegacyExternalInterface, LoadGameUrlEvent, NitroEventType, NitroLogger, NitroVersion, PrepareRenderer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useRef, useState } from 'react'; -import { ClearRememberLogin, GetRememberLogin, GetUIVersion, StoreRememberLoginFromPayload } from './api'; +import { ClearRememberLogin, GetRememberLogin, GetUIVersion, StoreRememberLoginFromPayload, persistAccessTokenFromPayload } from './api'; import { Base } from './common'; import { LoadingView } from './components/loading/LoadingView'; import { LoginView } from './components/login/LoginView'; @@ -133,6 +133,7 @@ export const App: FC<{}> = props => if(response.ok && ssoTicket) { + persistAccessTokenFromPayload(payload); StoreRememberLoginFromPayload(payload, typeof payload.username === 'string' ? payload.username : remembered.username, ssoTicket); return ssoTicket; } @@ -180,6 +181,7 @@ export const App: FC<{}> = props => if(response.ok) { + persistAccessTokenFromPayload(payload); StoreRememberLoginFromPayload(payload, remembered.username, remembered.ssoTicket); return; } diff --git a/src/components/MainView.tsx b/src/components/MainView.tsx index 7861454..ae9c4ca 100644 --- a/src/components/MainView.tsx +++ b/src/components/MainView.tsx @@ -34,6 +34,7 @@ import { ToolbarView } from './toolbar/ToolbarView'; import { TranslationBootstrap } from './translation/TranslationBootstrap'; import { TranslationSettingsView } from './translation/TranslationSettingsView'; import { UserProfileView } from './user-profile/UserProfileView'; +import { UserAccountSettingsView } from './user-settings/UserAccountSettingsView'; import { UserSettingsView } from './user-settings/UserSettingsView'; import { WiredView } from './wired/WiredView'; import { WiredCreatorToolsView } from './wired-tools/WiredCreatorToolsView'; @@ -133,6 +134,7 @@ export const MainView: FC<{}> = props => + diff --git a/src/components/login/LoginView.tsx b/src/components/login/LoginView.tsx index adb8dbb..e1ce116 100644 --- a/src/components/login/LoginView.tsx +++ b/src/components/login/LoginView.tsx @@ -1,6 +1,6 @@ import { AvatarScaleType, AvatarSetType, GetAvatarRenderManager, GetConfiguration, IAvatarImage } from '@nitrots/nitro-renderer'; import { FC, FormEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { ClearRememberLogin, GetConfigurationValue, GetRememberLogin, StoreRememberLoginFromPayload } from '../../api'; +import { ClearRememberLogin, GetConfigurationValue, GetRememberLogin, StoreRememberLoginFromPayload, persistAccessTokenFromPayload } from '../../api'; import { configFileUrl } from '../../secure-assets'; import flagBr from '../../assets/images/flag_icon/flag_icon_br.png'; import flagDe from '../../assets/images/flag_icon/flag_icon_de.png'; @@ -492,6 +492,7 @@ export const LoginView: FC = ({ onAuthenticated, isEntering = fa if(ok && ssoTicket) { clearLock(); + persistAccessTokenFromPayload(payload); if(rememberMe) StoreRememberLoginFromPayload(payload, typeof payload.username === 'string' ? payload.username : username.trim(), ssoTicket); else ClearRememberLogin(); onAuthenticated(ssoTicket); diff --git a/src/components/user-settings/UserAccountSettingsView.tsx b/src/components/user-settings/UserAccountSettingsView.tsx new file mode 100644 index 0000000..c834ba2 --- /dev/null +++ b/src/components/user-settings/UserAccountSettingsView.tsx @@ -0,0 +1,758 @@ +import { AddLinkEventTracker, GetSessionDataManager, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, KeyboardEvent, useEffect, useMemo, useState } from 'react'; +import { FaArrowLeft, FaCheckCircle, FaChevronRight, FaEnvelope, FaExclamationTriangle, FaEye, FaEyeSlash, FaIdBadge, FaInfoCircle, FaKey, FaShieldAlt, FaUserCog } from 'react-icons/fa'; +import { GetConfigurationValue, getAccessToken } from '../../api'; +import { Button, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; + +const MIN_PASSWORD_LENGTH = 8; +const MAX_PASSWORD_LENGTH = 128; + +const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const MAX_EMAIL_LENGTH = 254; + +const USERNAME_RE = /^[A-Za-z0-9._-]{3,25}$/; +const MIN_USERNAME_LENGTH = 3; +const MAX_USERNAME_LENGTH = 25; + +type FeedbackKind = 'error' | 'success'; +type Section = 'menu' | 'password' | 'email' | 'username'; + +const passwordStrength = (value: string): { score: number; label: string; color: string } => +{ + if(!value) return { score: 0, label: '', color: 'bg-black/10' }; + + let score = 0; + if(value.length >= MIN_PASSWORD_LENGTH) score++; + if(value.length >= 12) score++; + if(/[A-Z]/.test(value) && /[a-z]/.test(value)) score++; + if(/\d/.test(value)) score++; + if(/[^A-Za-z0-9]/.test(value)) score++; + + if(score <= 1) return { score: 1, label: 'Weak', color: 'bg-[#a81a12]' }; + if(score === 2) return { score: 2, label: 'Fair', color: 'bg-[#ffc107]' }; + if(score === 3) return { score: 3, label: 'Good', color: 'bg-[#1e7295]' }; + return { score: 4, label: 'Strong', color: 'bg-[#00800b]' }; +}; + +export const UserAccountSettingsView: FC<{}> = () => +{ + const [ isVisible, setIsVisible ] = useState(false); + const [ section, setSection ] = useState
('menu'); + const [ currentPassword, setCurrentPassword ] = useState(''); + const [ newPassword, setNewPassword ] = useState(''); + const [ confirmPassword, setConfirmPassword ] = useState(''); + const [ showCurrent, setShowCurrent ] = useState(false); + const [ showNew, setShowNew ] = useState(false); + const [ emailCurrentPassword, setEmailCurrentPassword ] = useState(''); + const [ newEmail, setNewEmail ] = useState(''); + const [ showEmailPassword, setShowEmailPassword ] = useState(false); + const [ usernameCurrentPassword, setUsernameCurrentPassword ] = useState(''); + const [ newUsername, setNewUsername ] = useState(''); + const [ showUsernamePassword, setShowUsernamePassword ] = useState(false); + const [ submitting, setSubmitting ] = useState(false); + const [ feedback, setFeedback ] = useState<{ kind: FeedbackKind; message: string } | null>(null); + + const session = useMemo(() => + { + try + { + const manager = GetSessionDataManager(); + return { + username: manager?.userName ?? '', + figure: manager?.figure ?? '' + }; + } + catch + { + return { username: '', figure: '' }; + } + }, [ isVisible ]); + + const strength = useMemo(() => passwordStrength(newPassword), [ newPassword ]); + + const resetForm = () => + { + setCurrentPassword(''); + setNewPassword(''); + setConfirmPassword(''); + setShowCurrent(false); + setShowNew(false); + setEmailCurrentPassword(''); + setNewEmail(''); + setShowEmailPassword(false); + setUsernameCurrentPassword(''); + setNewUsername(''); + setShowUsernamePassword(false); + setFeedback(null); + }; + + const close = () => + { + setIsVisible(false); + setSection('menu'); + resetForm(); + setSubmitting(false); + }; + + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const parts = url.split('/'); + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + close(); + return; + case 'toggle': + setIsVisible(prev => !prev); + return; + } + }, + eventUrlPrefix: 'user-account-settings/' + }; + + AddLinkEventTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, []); + + const submitPasswordChange = async () => + { + if(submitting) return; + + setFeedback(null); + + if(!currentPassword || !newPassword || !confirmPassword) + { + setFeedback({ kind: 'error', message: 'All fields are required.' }); + return; + } + + if(newPassword.length < MIN_PASSWORD_LENGTH) + { + setFeedback({ kind: 'error', message: `Password must be at least ${ MIN_PASSWORD_LENGTH } characters.` }); + return; + } + + if(newPassword.length > MAX_PASSWORD_LENGTH) + { + setFeedback({ kind: 'error', message: 'Password is too long.' }); + return; + } + + if(newPassword !== confirmPassword) + { + setFeedback({ kind: 'error', message: 'New passwords do not match.' }); + return; + } + + if(newPassword === currentPassword) + { + setFeedback({ kind: 'error', message: 'New password must be different from the current password.' }); + return; + } + + const token = getAccessToken(); + if(!token) + { + setFeedback({ kind: 'error', message: 'You are not authenticated. Please log in again.' }); + return; + } + + const endpoint = GetConfigurationValue('account.change-password.endpoint', '/api/auth/change-password'); + + setSubmitting(true); + try + { + const response = await fetch(endpoint, { + method: 'POST', + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${ token }`, + 'X-Requested-With': 'NitroUserAccountSettings' + }, + body: JSON.stringify({ currentPassword, newPassword, confirmPassword }) + }); + + let payload: Record = {}; + try { payload = await response.json(); } + catch {} + + if(!response.ok) + { + const message = typeof payload.error === 'string' && payload.error + ? payload.error + : `Request failed (${ response.status }).`; + setFeedback({ kind: 'error', message }); + return; + } + + const message = typeof payload.message === 'string' && payload.message + ? payload.message + : 'Password updated successfully.'; + setFeedback({ kind: 'success', message }); + setCurrentPassword(''); + setNewPassword(''); + setConfirmPassword(''); + setShowCurrent(false); + setShowNew(false); + } + catch + { + setFeedback({ kind: 'error', message: 'Could not reach the server. Please try again.' }); + } + finally + { + setSubmitting(false); + } + }; + + const submitEmailChange = async () => + { + if(submitting) return; + + setFeedback(null); + + if(!emailCurrentPassword || !newEmail) + { + setFeedback({ kind: 'error', message: 'All fields are required.' }); + return; + } + + if(newEmail.length > MAX_EMAIL_LENGTH) + { + setFeedback({ kind: 'error', message: 'Email address is too long.' }); + return; + } + + if(!EMAIL_RE.test(newEmail)) + { + setFeedback({ kind: 'error', message: 'Please enter a valid email address.' }); + return; + } + + const token = getAccessToken(); + if(!token) + { + setFeedback({ kind: 'error', message: 'You are not authenticated. Please log in again.' }); + return; + } + + const endpoint = GetConfigurationValue('account.change-email.endpoint', '/api/auth/change-email'); + + setSubmitting(true); + try + { + const response = await fetch(endpoint, { + method: 'POST', + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${ token }`, + 'X-Requested-With': 'NitroUserAccountSettings' + }, + body: JSON.stringify({ currentPassword: emailCurrentPassword, newEmail }) + }); + + let payload: Record = {}; + try { payload = await response.json(); } + catch {} + + if(!response.ok) + { + const message = typeof payload.error === 'string' && payload.error + ? payload.error + : `Request failed (${ response.status }).`; + setFeedback({ kind: 'error', message }); + return; + } + + const message = typeof payload.message === 'string' && payload.message + ? payload.message + : 'Email updated successfully.'; + setFeedback({ kind: 'success', message }); + setEmailCurrentPassword(''); + setNewEmail(''); + setShowEmailPassword(false); + } + catch + { + setFeedback({ kind: 'error', message: 'Could not reach the server. Please try again.' }); + } + finally + { + setSubmitting(false); + } + }; + + const submitUsernameChange = async () => + { + if(submitting) return; + + setFeedback(null); + + if(!usernameCurrentPassword || !newUsername) + { + setFeedback({ kind: 'error', message: 'All fields are required.' }); + return; + } + + if(newUsername.length < MIN_USERNAME_LENGTH || newUsername.length > MAX_USERNAME_LENGTH) + { + setFeedback({ kind: 'error', message: `Username must be between ${ MIN_USERNAME_LENGTH } and ${ MAX_USERNAME_LENGTH } characters.` }); + return; + } + + if(!USERNAME_RE.test(newUsername)) + { + setFeedback({ kind: 'error', message: 'Username may only contain letters, numbers, dot, underscore and dash.' }); + return; + } + + if(newUsername === session.username) + { + setFeedback({ kind: 'error', message: 'New username must be different from the current one.' }); + return; + } + + const token = getAccessToken(); + if(!token) + { + setFeedback({ kind: 'error', message: 'You are not authenticated. Please log in again.' }); + return; + } + + const endpoint = GetConfigurationValue('account.change-username.endpoint', '/api/auth/change-username'); + + setSubmitting(true); + try + { + const response = await fetch(endpoint, { + method: 'POST', + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${ token }`, + 'X-Requested-With': 'NitroUserAccountSettings' + }, + body: JSON.stringify({ currentPassword: usernameCurrentPassword, newUsername }) + }); + + let payload: Record = {}; + try { payload = await response.json(); } + catch {} + + if(!response.ok) + { + const message = typeof payload.error === 'string' && payload.error + ? payload.error + : `Request failed (${ response.status }).`; + setFeedback({ kind: 'error', message }); + return; + } + + const message = typeof payload.message === 'string' && payload.message + ? payload.message + : 'Username updated. Please log in again with your new name.'; + setFeedback({ kind: 'success', message }); + setUsernameCurrentPassword(''); + setNewUsername(''); + setShowUsernamePassword(false); + + // The server has dropped our session — clear local credentials and bounce + // the user back to the login screen so the whole client reloads cleanly. + try { window.localStorage.removeItem('nitro.access.token'); } catch {} + try { window.localStorage.removeItem('nitro.access.token.exp'); } catch {} + window.setTimeout(() => + { + try { window.location.reload(); } + catch {} + }, 2500); + } + catch + { + setFeedback({ kind: 'error', message: 'Could not reach the server. Please try again.' }); + } + finally + { + setSubmitting(false); + } + }; + + if(!isVisible) return null; + + return ( + + + +
+
+ { session.figure && ( +
+ +
+ ) } +
+ My account + { session.username || 'Guest' } + Manage your account and security +
+
+ + + { section === 'menu' && ( +
+ Account + + + + + + +
+
+ +
+
+ More coming soon + Two-factor authentication and more. +
+
+
+ ) } + + { section === 'password' && ( +
) => { if(event.key === 'Enter') { event.preventDefault(); submitPasswordChange(); } } }> +
+ + + Reset password +
+ +
+ + Use at least { MIN_PASSWORD_LENGTH } characters. Mix upper & lowercase, numbers and symbols for a stronger password. +
+ + + +
+
+ +
); From 53f41cdbe9321863d636b9d8befc0bc86290dfb5 Mon Sep 17 00:00:00 2001 From: duckietm Date: Tue, 12 May 2026 10:54:01 +0200 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=86=99=20Fix=20wear=20badge=20in=20po?= =?UTF-8?q?pup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layout/LayoutNotificationBubbleView.tsx | 2 +- .../NotificationBadgeReceivedBubbleView.tsx | 30 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx index b502b3b..b72fe65 100644 --- a/src/common/layout/LayoutNotificationBubbleView.tsx +++ b/src/common/layout/LayoutNotificationBubbleView.tsx @@ -16,7 +16,7 @@ export const LayoutNotificationBubbleView: FC const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'text-sm bg-[#1c1c20f2] px-[5px] py-[6px] [box-shadow:inset_0_5px_#22222799,inset_0_-4px_#12121599] ', 'rounded' ]; + const newClassNames: string[] = [ 'pointer-events-auto text-sm bg-[#1c1c20f2] px-[5px] py-[6px] [box-shadow:inset_0_5px_#22222799,inset_0_-4px_#12121599] ', 'rounded' ]; if(classNames.length) newClassNames.push(...classNames); diff --git a/src/components/notification-center/views/bubble-layouts/NotificationBadgeReceivedBubbleView.tsx b/src/components/notification-center/views/bubble-layouts/NotificationBadgeReceivedBubbleView.tsx index 8c1154e..efe6098 100644 --- a/src/components/notification-center/views/bubble-layouts/NotificationBadgeReceivedBubbleView.tsx +++ b/src/components/notification-center/views/bubble-layouts/NotificationBadgeReceivedBubbleView.tsx @@ -12,21 +12,24 @@ export interface NotificationBadgeReceivedBubbleViewProps extends LayoutNotifica export const NotificationBadgeReceivedBubbleView: FC = props => { const { item = null, onClose = null, ...rest } = props; - const { badgeCodes = [], toggleBadge = null } = useInventoryBadges(); + const { activeBadgeCodes = [], toggleBadge = null, isWearingBadge = null, canWearBadges = null } = useInventoryBadges(); useEffect(() => { - if(badgeCodes.length === 0) SendMessageComposer(new RequestBadgesComposer()); - }, []); + if(activeBadgeCodes.length === 0) SendMessageComposer(new RequestBadgesComposer()); + }, [ activeBadgeCodes.length ]); + + const badgeCode = item?.linkUrl ?? null; + const isLoaded = activeBadgeCodes.length > 0; + const alreadyWearing = !!badgeCode && !!isWearingBadge && isWearingBadge(badgeCode); + const slotsAvailable = !!canWearBadges && canWearBadges(); + const canShowWearButton = !!badgeCode && isLoaded && !alreadyWearing && slotsAvailable; const handleWear = (event: React.MouseEvent) => { event.stopPropagation(); - if(item.linkUrl) - { - toggleBadge(item.linkUrl); - } + if(canShowWearButton && toggleBadge) toggleBadge(badgeCode); if(onClose) onClose(); }; @@ -54,12 +57,13 @@ export const NotificationBadgeReceivedBubbleView: FC - + { canShowWearButton && + } { LocalizeText('notifications.button.later') } From 8b54a3ab9242394d873b7c15c88f1787dc7209d8 Mon Sep 17 00:00:00 2001 From: duckietm Date: Fri, 15 May 2026 10:34:15 +0200 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=86=99=20Small=20fix=20when=20client?= =?UTF-8?q?=20is=20other=20paths=20like=20/client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.mjs b/vite.config.mjs index a73910a..b8c3177 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -8,6 +8,7 @@ const currentRendererRoot = resolve(__dirname, '..', 'Nitro_Render_V3'); const rendererRoot = existsSync(currentRendererRoot) ? currentRendererRoot : legacyRendererRoot; export default defineConfig({ + base: process.env.VITE_BASE || './', plugins: [ react() ], server: { fs: { From 0199437a82397b3649cba1dd0e07fae6585684bc Mon Sep 17 00:00:00 2001 From: duckietm Date: Fri, 15 May 2026 13:15:30 +0200 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=86=99=20Small=20fix=20login=20screen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 0dcb613..aab3dbc 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -67,7 +67,7 @@ export const App: FC<{}> = props => const [ isReady, setIsReady ] = useState(false); const [ errorMessage, setErrorMessage ] = useState(''); const [ homeUrl, setHomeUrl ] = useState(''); - const [ showLogin, setShowLogin ] = useState(() => !window.NitroConfig?.['sso.ticket'] && !hasRememberLogin()); + const [ showLogin, setShowLogin ] = useState(false); const [ isEnteringHotel, setIsEnteringHotel ] = useState(() => !!window.NitroConfig?.['sso.ticket'] || hasRememberLogin()); const [ prepareTrigger, setPrepareTrigger ] = useState(0); const warmupPromiseRef = useRef>(null); From 35385ffdd02337099d46bba736daa9b41d4ae99f Mon Sep 17 00:00:00 2001 From: Remco Epicnabbo Date: Fri, 15 May 2026 13:55:56 +0200 Subject: [PATCH 5/7] Simplify offer selection and activation logic Always call applySelectedOffer(offer) and consolidate activation into a single conditional. Removed the separate non-lazy branch and now only call offer.activate() when offer.isLazy && offer.offerId > -1, reducing duplicated logic and simplifying the flow. --- src/hooks/catalog/useCatalog.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts index 09820ad..188aa89 100644 --- a/src/hooks/catalog/useCatalog.ts +++ b/src/hooks/catalog/useCatalog.ts @@ -540,16 +540,9 @@ const useCatalogState = () => { if(!offer) return; - if(!offer.isLazy) - { - applySelectedOffer(offer); - return; - } + applySelectedOffer(offer); - if(offer.offerId > -1) - { - offer.activate(); - } + if(offer.isLazy && (offer.offerId > -1)) offer.activate(); }, [ applySelectedOffer ]); const refreshBuilderStatus = useCallback(() => From e209146f47937fccaaa400994676ea7d352ec2d0 Mon Sep 17 00:00:00 2001 From: DuckieTM Date: Sun, 17 May 2026 09:58:38 +0200 Subject: [PATCH 6/7] =?UTF-8?q?=F0=9F=86=99=20Update=20About=20screen=20(n?= =?UTF-8?q?eeds=20a=20emu=20change=20as=20well)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/configuration/renderer-config.example | 3 + src/api/notification/NotificationAlertType.ts | 1 + .../views/alert-layouts/GetAlertLayout.tsx | 3 + .../alert-layouts/NitroInfoAlertView.tsx | 154 +++++++++ .../notification/NotificationCenterView.css | 314 ++++++++++++++++++ src/hooks/notification/useNotification.ts | 12 +- 6 files changed, 486 insertions(+), 1 deletion(-) create mode 100644 src/components/notification-center/views/alert-layouts/NitroInfoAlertView.tsx diff --git a/public/configuration/renderer-config.example b/public/configuration/renderer-config.example index f8d94bf..6c928da 100644 --- a/public/configuration/renderer-config.example +++ b/public/configuration/renderer-config.example @@ -1,6 +1,9 @@ { "socket.url": "wss://nitro.example.com:2096", "api.url": "https://nitro.example.com:2096", + "crypto.ws.enabled": false, + "crypto.ws.signing.enabled": false, + "crypto.ws.signing.public_key": "", "asset.url": "https://hotel.example.com/client/nitro/bundled", "image.library.url": "https://hotel.example.com/client/c_images/", "hof.furni.url": "https://hotel.example.com/client/c_images/dcr/hof_furni", diff --git a/src/api/notification/NotificationAlertType.ts b/src/api/notification/NotificationAlertType.ts index ad804e8..7c4c633 100644 --- a/src/api/notification/NotificationAlertType.ts +++ b/src/api/notification/NotificationAlertType.ts @@ -5,6 +5,7 @@ export class NotificationAlertType public static MODERATION: string = 'moderation'; public static EVENT: string = 'event'; public static NITRO: string = 'nitro'; + public static NITRO_INFO: string = 'nitro-info'; public static SEARCH: string = 'search'; public static ALERT: string = 'alert'; } diff --git a/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx b/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx index e19da0f..b41d757 100644 --- a/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx +++ b/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx @@ -1,4 +1,5 @@ import { NotificationAlertItem, NotificationAlertType } from '../../../../api'; +import { NitroInfoAlertView } from './NitroInfoAlertView'; import { NitroSystemAlertView } from './NitroSystemAlertView'; import { NotificationDefaultAlertView } from './NotificationDefaultAlertView'; import { NotificationSeachAlertView } from './NotificationSearchAlertView'; @@ -14,6 +15,8 @@ export const GetAlertLayout = (item: NotificationAlertItem, onClose: () => void) { case NotificationAlertType.NITRO: return ; + case NotificationAlertType.NITRO_INFO: + return ; case NotificationAlertType.SEARCH: return ; default: diff --git a/src/components/notification-center/views/alert-layouts/NitroInfoAlertView.tsx b/src/components/notification-center/views/alert-layouts/NitroInfoAlertView.tsx new file mode 100644 index 0000000..0bbabde --- /dev/null +++ b/src/components/notification-center/views/alert-layouts/NitroInfoAlertView.tsx @@ -0,0 +1,154 @@ +import { FC, useMemo } from 'react'; +import { LocalizeText, NotificationAlertItem, NotificationAlertType, OpenUrl } from '../../../../api'; +import { Button, Column, Flex, LayoutAvatarImageView, LayoutNotificationAlertView, LayoutNotificationAlertViewProps, Text } from '../../../../common'; + +const INFO_AVATAR_FIGURE = 'hr-831-61.hd-180-2.lg-270-100.sh-290-110.ha-3129-100.fa-1205-63.cc-3039-100'; + +interface NitroInfoAlertViewProps extends LayoutNotificationAlertViewProps +{ + item: NotificationAlertItem; +} + +const REPORT_ISSUES_URL = 'https://github.com/duckietm/Nitro-V3/issues'; + +type InfoSection = { title: string; lines: string[]; kind: 'hotel' | 'server' | 'credits' | 'generic' }; + +const detectKind = (title: string): InfoSection['kind'] => +{ + const t = title.toLowerCase(); + if(t.includes('hotel')) return 'hotel'; + if(t.includes('server')) return 'server'; + if(t.includes('credit')) return 'credits'; + return 'generic'; +}; + +const parseInfoSections = (text: string): { version: string; sections: InfoSection[] } => +{ + const version = (text.match(/([^<]+)<\/b>/) || [ '', '' ])[1]; + + const stripped = text + .replace(/^[^<]+<\/b>\r?\n?/, '') + .replace(/Report issues at:[^]*$/, ''); + + const sections: InfoSection[] = []; + const blocks = stripped.split(/\r?\n+/); + + for(const block of blocks) + { + if(!block.trim()) continue; + + const headerMatch = block.match(/([^<]+)<\/b>/); + if(!headerMatch) continue; + + const title = headerMatch[1]; + const rest = block.substring(block.indexOf('') + 4); + const lines = rest.split(/\r/).map(l => l.trim().replace(/^-\s*/, '')).filter(Boolean); + + sections.push({ title, lines, kind: detectKind(title) }); + } + + return { version, sections }; +}; + +const sectionIcon: Record = { + hotel: '🏨', + server: '🖥️', + credits: '⭐', + generic: 'ℹ️' +}; + +const splitLabel = (line: string): { label: string; value: string } => +{ + const idx = line.indexOf(':'); + if(idx === -1) return { label: '', value: line }; + return { label: line.substring(0, idx).trim(), value: line.substring(idx + 1).trim() }; +}; + +export const NitroInfoAlertView: FC = props => +{ + const { item = null, title: titleProp = null, onClose = null, ...rest } = props; + + const { version, sections } = useMemo(() => + { + const text = (item && item.messages && item.messages[0]) || ''; + return parseInfoSections(text); + }, [ item ]); + + const rawTitle = titleProp || (item && item.title) || ''; + const displayTitle = (rawTitle && rawTitle !== 'nitro.info.title') ? rawTitle : 'Hotel Info'; + + return ( + +
+
+ { version && +
+ + { version } + +
} +
+ +
+ +
+
+ + { sections.map((section, index) => ( +
+
+ { sectionIcon[section.kind] } + { section.title } +
+
+ { section.kind === 'credits' + ? ( +
    + { section.lines.map((line, i) => ( +
  • + + { line } +
  • + )) } +
+ ) + : ( +
    + { section.lines.map((line, i) => + { + const { label, value } = splitLabel(line); + return ( +
  • + { label && { label } } + { value } +
  • + ); + }) } +
+ ) } +
+
+ )) } +
+ Found a bug? Help us improve! + + + + +
+
+ + + ); +}; diff --git a/src/css/notification/NotificationCenterView.css b/src/css/notification/NotificationCenterView.css index ec2c5e5..c24cb67 100644 --- a/src/css/notification/NotificationCenterView.css +++ b/src/css/notification/NotificationCenterView.css @@ -47,6 +47,320 @@ min-width: auto; } } + + &.nitro-alert-nitro-info { + width: 460px; + min-height: 320px; + max-height: 640px; + animation: nitroInfoPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1); + + .nitro-info-hero { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + margin: -8px -8px 6px -8px; + padding: 14px 10px 18px 10px; + background: + radial-gradient(ellipse at top, rgba(255, 220, 120, 0.45) 0%, transparent 60%), + linear-gradient(135deg, #4a72b8 0%, #2d4a82 45%, #5a3d9a 100%); + border-bottom: 2px solid #1c2a4a; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.25), + inset 0 -3px 0 rgba(0, 0, 0, 0.25); + overflow: hidden; + } + + .nitro-info-hero-stars { + position: absolute; + inset: 0; + background-image: + radial-gradient(2px 2px at 18% 28%, rgba(255, 255, 255, 0.85), transparent 60%), + radial-gradient(1.5px 1.5px at 72% 18%, rgba(255, 255, 255, 0.7), transparent 60%), + radial-gradient(1px 1px at 42% 65%, rgba(255, 255, 255, 0.9), transparent 60%), + radial-gradient(1.5px 1.5px at 88% 78%, rgba(255, 255, 255, 0.75), transparent 60%), + radial-gradient(1px 1px at 12% 80%, rgba(255, 255, 255, 0.8), transparent 60%); + opacity: 0.85; + animation: nitroInfoTwinkle 2.6s ease-in-out infinite alternate; + pointer-events: none; + } + + .nitro-info-version-badge { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: 0 auto; + padding: 6px 18px; + background: linear-gradient(180deg, #ffeb8a 0%, #ffd54d 50%, #f0a318 100%); + border: 2px solid #8a5b00; + border-radius: 18px; + color: #4a2b00; + font-weight: 700; + font-size: 14px; + letter-spacing: 0.4px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.7), + inset 0 -2px 0 rgba(140, 75, 0, 0.4), + 0 3px 0 rgba(0, 0, 0, 0.25), + 0 0 18px rgba(255, 200, 80, 0.55); + width: max-content; + max-width: 90%; + } + + .nitro-info-version-spark { + color: #fff; + text-shadow: 0 0 6px rgba(255, 255, 200, 0.9); + animation: nitroInfoSpin 3s linear infinite; + display: inline-block; + } + + .nitro-info-version-spark:last-child { + animation-direction: reverse; + } + + .nitro-info-content { + padding: 0 2px; + } + + .nitro-info-avatar-wrap { + position: relative; + width: 90px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + padding-top: 2px; + } + + .nitro-info-avatar { + filter: drop-shadow(0 3px 5px rgba(0, 0, 0, 0.35)); + animation: nitroInfoBob 2.6s ease-in-out infinite; + } + + .nitro-info-avatar-shadow { + width: 60px; + height: 8px; + margin-top: -4px; + background: radial-gradient(ellipse, rgba(0, 0, 0, 0.4) 0%, transparent 70%); + animation: nitroInfoShadowPulse 2.6s ease-in-out infinite; + } + + .nitro-info-body { + font-family: Volter, Volter_Goldfish, "Ubuntu", sans-serif; + color: #2f2f2f; + padding-right: 4px; + } + + .nitro-info-section { + background: linear-gradient(to bottom, #ffffff 0%, #eaf1fb 100%); + border: 1px solid #6f8db5; + border-radius: 6px; + overflow: hidden; + flex-shrink: 0; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.8), + 0 2px 0 rgba(0, 0, 0, 0.12); + transition: transform 0.18s ease, box-shadow 0.18s ease; + } + + .nitro-info-section:hover { + transform: translateY(-1px); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.8), + 0 3px 0 rgba(0, 0, 0, 0.18), + 0 0 0 1px rgba(110, 160, 230, 0.4); + } + + .nitro-info-section-header { + display: flex; + align-items: center; + gap: 6px; + color: #ffffff; + font-weight: bold; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.45); + padding: 4px 10px; + letter-spacing: 0.3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + } + + .nitro-info-section-icon { + font-size: 14px; + filter: drop-shadow(0 1px 0 rgba(0, 0, 0, 0.4)); + } + + .nitro-info-section-hotel .nitro-info-section-header { + background: linear-gradient(180deg, #4fb3ff 0%, #1f6dc7 100%); + } + + .nitro-info-section-server .nitro-info-section-header { + background: linear-gradient(180deg, #6bd66b 0%, #2a8a2a 100%); + } + + .nitro-info-section-credits .nitro-info-section-header { + background: linear-gradient(180deg, #ff9a44 0%, #d9591a 100%); + } + + .nitro-info-section-generic .nitro-info-section-header { + background: linear-gradient(180deg, #8da0bc 0%, #4b5d7a 100%); + } + + .nitro-info-section-body { + padding: 6px 10px; + color: #1f2f4a; + } + + .nitro-info-stats-list, + .nitro-info-credits-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 2px; + } + + .nitro-info-stats-list li { + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; + padding: 2px 4px; + border-radius: 3px; + } + + .nitro-info-stats-list li:nth-child(odd) { + background: rgba(110, 160, 230, 0.08); + } + + .nitro-info-stat-label { + font-size: 12px; + color: #4a5a76; + font-weight: 500; + flex-shrink: 0; + } + + .nitro-info-stat-value { + font-size: 12px; + color: #1a3a6b; + font-weight: 700; + background: linear-gradient(180deg, #ffffff 0%, #e6efff 100%); + border: 1px solid #b8cce6; + border-radius: 4px; + padding: 1px 8px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8); + text-align: right; + word-break: break-word; + } + + .nitro-info-credits-list li { + display: flex; + align-items: flex-start; + gap: 6px; + padding: 3px 4px; + font-size: 12px; + color: #4a2b00; + border-radius: 3px; + transition: background 0.15s ease; + word-break: break-word; + } + + .nitro-info-credits-list li:hover { + background: rgba(255, 180, 80, 0.15); + } + + .nitro-info-credit-star { + color: #f0a318; + text-shadow: 0 0 4px rgba(240, 163, 24, 0.6); + font-size: 13px; + flex-shrink: 0; + } + + .nitro-info-footer { + margin-top: 6px; + padding-top: 8px; + border-top: 1px dashed #b0b0b0; + display: flex; + flex-direction: column; + gap: 6px; + } + + .nitro-info-actions { + margin-top: 2px; + } + + .nitro-info-report-btn { + position: relative; + overflow: hidden; + background: linear-gradient(180deg, #ff6b6b 0%, #c92a2a 100%) !important; + border-color: #8a1a1a !important; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.35); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.3), + inset 0 -2px 0 rgba(0, 0, 0, 0.25), + 0 0 12px rgba(255, 100, 100, 0.4); + transition: transform 0.12s ease, box-shadow 0.12s ease; + } + + .nitro-info-report-btn:hover { + transform: translateY(-1px); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.4), + inset 0 -2px 0 rgba(0, 0, 0, 0.25), + 0 2px 0 rgba(0, 0, 0, 0.2), + 0 0 18px rgba(255, 100, 100, 0.7); + } + + .nitro-info-report-btn:active { + transform: translateY(1px); + } + + .nitro-info-report-btn::after { + content: ''; + position: absolute; + top: 0; + left: -120%; + width: 60%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); + transform: skewX(-20deg); + animation: nitroInfoShine 2.8s ease-in-out infinite; + } + } +} + +@keyframes nitroInfoPop { + 0% { transform: scale(0.85); opacity: 0; } + 60% { transform: scale(1.04); opacity: 1; } + 100% { transform: scale(1); opacity: 1; } +} + +@keyframes nitroInfoTwinkle { + 0% { opacity: 0.4; } + 100% { opacity: 1; } +} + +@keyframes nitroInfoSpin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@keyframes nitroInfoBob { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-3px); } +} + +@keyframes nitroInfoShadowPulse { + 0%, 100% { transform: scaleX(1); opacity: 0.55; } + 50% { transform: scaleX(0.8); opacity: 0.35; } +} + +@keyframes nitroInfoShine { + 0% { left: -120%; } + 60%, 100% { left: 140%; } } .nitro-notification-bubble { diff --git a/src/hooks/notification/useNotification.ts b/src/hooks/notification/useNotification.ts index 66ac864..9ef60cf 100644 --- a/src/hooks/notification/useNotification.ts +++ b/src/hooks/notification/useNotification.ts @@ -212,8 +212,18 @@ const useNotificationState = () => useMessageEvent(HabboBroadcastMessageEvent, event => { const parser = event.getParser(); + const raw = parser.message.replace(/\\r/g, '\r'); - simpleAlert(parser.message.replace(/\\r/g, '\r'), null, null, LocalizeText('notifications.broadcast.title')); + const sentinel = '[NITRO_INFO_V1]'; + + if(raw.startsWith(sentinel)) + { + const body = raw.substring(sentinel.length).replace(/^[\r\n]+/, ''); + simpleAlert(body, NotificationAlertType.NITRO_INFO, null, null, LocalizeText('nitro.info.title')); + return; + } + + simpleAlert(raw, null, null, LocalizeText('notifications.broadcast.title')); }); useMessageEvent(AchievementNotificationMessageEvent, event => From b2318b9e7c4f369cebaa45f59231eae4a962410b Mon Sep 17 00:00:00 2001 From: duckietm Date: Mon, 18 May 2026 16:13:09 +0200 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=86=95=20Added=20support=20for=20JSON?= =?UTF-8?q?5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/bootstrap.ts | 12 +- yarn.lock | 631 +++++++++++++++++++++++------------------------ 3 files changed, 325 insertions(+), 319 deletions(-) diff --git a/package.json b/package.json index 13915c1..f31d0c6 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "emoji-mart": "^5.6.0", "emoji-toolkit": "10.0.0", "framer-motion": "^12.38.0", + "json5": "^2.2.3", "react": "^19.2.5", "react-dom": "^19.2.5", "react-icons": "^5.5.0", diff --git a/src/bootstrap.ts b/src/bootstrap.ts index ecff7b4..71406fe 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -1,3 +1,4 @@ +import JSON5 from 'json5'; import { configFileUrl, getClientMode, installSecureFetch } from './secure-assets'; const ensureMobileViewport = () => @@ -74,7 +75,16 @@ const loadClientMode = async () => if(!response.ok) throw new Error(`HTTP ${ response.status }`); - (window as any).__nitroClientMode = await response.json(); + const text = await response.text(); + + try + { + (window as any).__nitroClientMode = JSON.parse(text); + } + catch + { + (window as any).__nitroClientMode = JSON5.parse(text); + } setBootDebug('boot: client-mode loaded'); } catch(error) diff --git a/yarn.lock b/yarn.lock index 81e8375..05928f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -151,7 +151,7 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" -"@emnapi/core@1.10.0", "@emnapi/core@^1.8.1": +"@emnapi/core@1.10.0", "@emnapi/core@^1.10.0": version "1.10.0" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== @@ -159,14 +159,14 @@ "@emnapi/wasi-threads" "1.2.1" tslib "^2.4.0" -"@emnapi/runtime@1.10.0", "@emnapi/runtime@^1.8.1": +"@emnapi/runtime@1.10.0", "@emnapi/runtime@^1.10.0": version "1.10.0" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== dependencies: tslib "^2.4.0" -"@emnapi/wasi-threads@1.2.1", "@emnapi/wasi-threads@^1.1.0": +"@emnapi/wasi-threads@1.2.1", "@emnapi/wasi-threads@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== @@ -204,10 +204,10 @@ debug "^4.3.1" minimatch "^10.2.4" -"@eslint/config-helpers@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.5.tgz#ae16134e4792ac5fbdc533548a24ac1ea9f7f3ae" - integrity sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w== +"@eslint/config-helpers@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.6.0.tgz#ef9a36881d39dfd5dbeac22b0da997fabfb08b03" + integrity sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA== dependencies: "@eslint/core" "^1.2.1" @@ -323,17 +323,17 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@napi-rs/wasm-runtime@^1.1.1", "@napi-rs/wasm-runtime@^1.1.4": +"@napi-rs/wasm-runtime@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1" integrity sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow== dependencies: "@tybys/wasm-util" "^0.10.1" -"@oxc-project/types@=0.127.0": - version "0.127.0" - resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.127.0.tgz#8374fcdfb4a641861218daa5700c447c00b66663" - integrity sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ== +"@oxc-project/types@=0.130.0": + version "0.130.0" + resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.130.0.tgz#a7825148711dc28805c46cfc21d94b63a4d41e88" + integrity sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q== "@parcel/watcher-android-arm64@2.5.6": version "2.5.6" @@ -638,94 +638,89 @@ resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.1.tgz#78244efe12930c56fd255d7923865857c41ac8cb" integrity sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw== -"@rolldown/binding-android-arm64@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz#0a502a88c39d0ffa81aa30b561dade6f6217dcc5" - integrity sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ== +"@rolldown/binding-android-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz#7b250c89f16d74affd581dbe38f702e8c2c644d3" + integrity sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg== -"@rolldown/binding-darwin-arm64@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz#8b7f05ac9000ab19161a79a0346b1b64a1bc7ba3" - integrity sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw== +"@rolldown/binding-darwin-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz#cd4de96687e6522062984b0503fbffbbc9220023" + integrity sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg== -"@rolldown/binding-darwin-x64@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz#f8b465b3a4e992053890b162f1ae19e4f1719a6a" - integrity sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw== +"@rolldown/binding-darwin-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz#5b0a631e3784d5a7741dd93097dcf6dfca029960" + integrity sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg== -"@rolldown/binding-freebsd-x64@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz#a8281e14fa9c243fe22dc2d0e54900e66b31935e" - integrity sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw== +"@rolldown/binding-freebsd-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz#d82e561079db89f796438f56ec11bb3565ee1875" + integrity sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw== -"@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz#cd29cf869ddd4fac8d6929abf94b91ddb0494650" - integrity sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ== +"@rolldown/binding-linux-arm-gnueabihf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz#f2645afff4253c7b46b80ba14af5fd3fc18d45dc" + integrity sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ== -"@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz#91c331236ec3728366218d61a62f0bd226546c6c" - integrity sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q== +"@rolldown/binding-linux-arm64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz#a16b97f175e7b115c5ece77c7b648d0c868f4486" + integrity sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A== -"@rolldown/binding-linux-arm64-musl@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz#80108957db752e7826836e22240e56b8140e9684" - integrity sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg== +"@rolldown/binding-linux-arm64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz#e695aec4ef2c8713c9d959b42a208059891276da" + integrity sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg== -"@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz#1dce51148cbc6bab3c3f9157b5323d2a31aac924" - integrity sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA== +"@rolldown/binding-linux-ppc64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz#4a9edf16112cbe99cdd396c60efac39cbd1758ac" + integrity sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg== -"@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz#d4a0d2e01d8d441e4ac3af3fa68eec17a7d0e9cd" - integrity sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA== +"@rolldown/binding-linux-s390x-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz#314aa3ec1ce8251501d865f98fb91e42a1e671e4" + integrity sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ== -"@rolldown/binding-linux-x64-gnu@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz#0ac8b3139cefeea798ad147f30ea70572b133af1" - integrity sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA== +"@rolldown/binding-linux-x64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz#7c51f13cf1141c503ee162830b4fc692d91640be" + integrity sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw== -"@rolldown/binding-linux-x64-musl@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz#2af61bee087571728f58f1c47734bbbd41dd7050" - integrity sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw== +"@rolldown/binding-linux-x64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz#b7213936bbc9310b02a34f71cefd25f9e71f329b" + integrity sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ== -"@rolldown/binding-openharmony-arm64@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz#56c1afbf6c592819abf47b4a983987dc288b30c1" - integrity sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA== +"@rolldown/binding-openharmony-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz#006e88acde4f12b41a4c72292685c9dc9e6a3627" + integrity sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ== -"@rolldown/binding-wasm32-wasi@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz#5d112ff4dd0d268a60fb4e0eb3077e3ea2531f0d" - integrity sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA== +"@rolldown/binding-wasm32-wasi@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz#033525c84da217418232f35be19f1ddc0af4f31e" + integrity sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ== dependencies: "@emnapi/core" "1.10.0" "@emnapi/runtime" "1.10.0" "@napi-rs/wasm-runtime" "^1.1.4" -"@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz#5125a85222d64a543201d28e16a395cc45bf4d17" - integrity sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA== +"@rolldown/binding-win32-arm64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz#febbf109cf1b5837e21369f0e0d2fefca1519c39" + integrity sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw== -"@rolldown/binding-win32-x64-msvc@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz#fc6b78e759a0bb2054b5c0a3489da12b2cae54b4" - integrity sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg== +"@rolldown/binding-win32-x64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz#dfb32a67ccb0deaa3c9a57f6cb4890b5697dfa2c" + integrity sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ== -"@rolldown/pluginutils@1.0.0-rc.17": - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz#a89b30833fb628bc834fe2e89fea93a2da9fa69a" - integrity sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg== - -"@rolldown/pluginutils@1.0.0-rc.7": - version "1.0.0-rc.7" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz#0414869467f0e471a6515d4f506c85fde867e022" - integrity sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA== +"@rolldown/pluginutils@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz#e3fcee093fbb5ce765e1ad088ff4de2889f6f9be" + integrity sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw== "@tailwindcss/forms@^0.5.11": version "0.5.11" @@ -734,114 +729,114 @@ dependencies: mini-svg-data-uri "^1.2.3" -"@tailwindcss/node@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.2.4.tgz#1f7fc0c1741037ded1fa92fbe62a786a197771ce" - integrity sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA== +"@tailwindcss/node@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.3.0.tgz#9dc5312bf41c48658529f36021e0b466c4eb7860" + integrity sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g== dependencies: "@jridgewell/remapping" "^2.3.5" - enhanced-resolve "^5.19.0" + enhanced-resolve "^5.21.0" jiti "^2.6.1" lightningcss "1.32.0" magic-string "^0.30.21" source-map-js "^1.2.1" - tailwindcss "4.2.4" + tailwindcss "4.3.0" -"@tailwindcss/oxide-android-arm64@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz#d533e52ee98d58f55d1d4753774251513ba8a911" - integrity sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g== +"@tailwindcss/oxide-android-arm64@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz#e4533b6125236fe81a899cf5a82028c85244def8" + integrity sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng== -"@tailwindcss/oxide-darwin-arm64@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz#2a6250aa7d8791fc1b5797e64e09e51da57514a6" - integrity sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg== +"@tailwindcss/oxide-darwin-arm64@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz#96b074ef64ec6c41d580063740c8d36cf5c459ce" + integrity sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ== -"@tailwindcss/oxide-darwin-x64@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz#d647299812946b6ab5140c61a334c8ebc8d877de" - integrity sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg== +"@tailwindcss/oxide-darwin-x64@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz#0d9638d06d38684339b2dc06631966a7296bb64e" + integrity sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA== -"@tailwindcss/oxide-freebsd-x64@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz#019b7fce37aaf5ddfed0f231c536108292e87ffb" - integrity sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw== +"@tailwindcss/oxide-freebsd-x64@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz#efc7acd17cd38d7585c07cb938a4f1b703f79d7a" + integrity sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ== -"@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz#c88a95d69095e84f811b302daa66f5287ad8ce0f" - integrity sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA== +"@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz#e41c945e529670cd93fd6ed0c6a2880de5c40333" + integrity sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA== -"@tailwindcss/oxide-linux-arm64-gnu@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz#1292f1c222994bfe4a5e990ac0a701de6487dd02" - integrity sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw== +"@tailwindcss/oxide-linux-arm64-gnu@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz#6bb608b16ba7146d61097c2f4c7ee927d1f3580a" + integrity sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg== -"@tailwindcss/oxide-linux-arm64-musl@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz#afb6492b22616f0d9d3346d39c1a6e285f994a08" - integrity sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g== +"@tailwindcss/oxide-linux-arm64-musl@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz#1bb443aa371bb99b50cb39d4d688151fadcd8a63" + integrity sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ== -"@tailwindcss/oxide-linux-x64-gnu@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz#400b0ccfc53937c7804ed8e0e9652b42bd86f2eb" - integrity sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA== +"@tailwindcss/oxide-linux-x64-gnu@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz#5267c0bb2597426c0d2e759acb5389cde2aa71fd" + integrity sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ== -"@tailwindcss/oxide-linux-x64-musl@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz#5c23c476e5de4ed9cd6ab39c2718b9a4be2bbb2b" - integrity sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA== +"@tailwindcss/oxide-linux-x64-musl@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz#fb2da97c67b218e5c7c723cb32782d55d7e4a5d5" + integrity sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg== -"@tailwindcss/oxide-wasm32-wasi@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz#21b7f53ba7c6c03f26ccb8cef5d09f5c2973ae5e" - integrity sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw== +"@tailwindcss/oxide-wasm32-wasi@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz#3f6538e511066d67d8683863dcaeeb16c22de849" + integrity sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA== dependencies: - "@emnapi/core" "^1.8.1" - "@emnapi/runtime" "^1.8.1" - "@emnapi/wasi-threads" "^1.1.0" - "@napi-rs/wasm-runtime" "^1.1.1" + "@emnapi/core" "^1.10.0" + "@emnapi/runtime" "^1.10.0" + "@emnapi/wasi-threads" "^1.2.1" + "@napi-rs/wasm-runtime" "^1.1.4" "@tybys/wasm-util" "^0.10.1" tslib "^2.8.1" -"@tailwindcss/oxide-win32-arm64-msvc@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz#13bc1cf3818e3345a965d36b40c237817124d070" - integrity sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ== +"@tailwindcss/oxide-win32-arm64-msvc@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz#ec45fba773c76759338c05d4fe5cf42c4eea2e4e" + integrity sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ== -"@tailwindcss/oxide-win32-x64-msvc@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz#5476dbbbf6b8934d58452340cec737fdaa5ec8c6" - integrity sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw== +"@tailwindcss/oxide-win32-x64-msvc@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz#58cdd6e06adbe2e3160274edfcd0b0b43e17fee4" + integrity sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA== -"@tailwindcss/oxide@4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.2.4.tgz#e2ca51d04e8ad94d569222fa727de479b097db39" - integrity sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q== +"@tailwindcss/oxide@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.3.0.tgz#cc1c61e88f62c0e9f56062de3e7873acaa2159d4" + integrity sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg== optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.2.4" - "@tailwindcss/oxide-darwin-arm64" "4.2.4" - "@tailwindcss/oxide-darwin-x64" "4.2.4" - "@tailwindcss/oxide-freebsd-x64" "4.2.4" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.2.4" - "@tailwindcss/oxide-linux-arm64-gnu" "4.2.4" - "@tailwindcss/oxide-linux-arm64-musl" "4.2.4" - "@tailwindcss/oxide-linux-x64-gnu" "4.2.4" - "@tailwindcss/oxide-linux-x64-musl" "4.2.4" - "@tailwindcss/oxide-wasm32-wasi" "4.2.4" - "@tailwindcss/oxide-win32-arm64-msvc" "4.2.4" - "@tailwindcss/oxide-win32-x64-msvc" "4.2.4" + "@tailwindcss/oxide-android-arm64" "4.3.0" + "@tailwindcss/oxide-darwin-arm64" "4.3.0" + "@tailwindcss/oxide-darwin-x64" "4.3.0" + "@tailwindcss/oxide-freebsd-x64" "4.3.0" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.3.0" + "@tailwindcss/oxide-linux-arm64-gnu" "4.3.0" + "@tailwindcss/oxide-linux-arm64-musl" "4.3.0" + "@tailwindcss/oxide-linux-x64-gnu" "4.3.0" + "@tailwindcss/oxide-linux-x64-musl" "4.3.0" + "@tailwindcss/oxide-wasm32-wasi" "4.3.0" + "@tailwindcss/oxide-win32-arm64-msvc" "4.3.0" + "@tailwindcss/oxide-win32-x64-msvc" "4.3.0" "@tailwindcss/postcss@^4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/postcss/-/postcss-4.2.4.tgz#548ed07584a41411574e8b1ec5f1543d09c439a4" - integrity sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/postcss/-/postcss-4.3.0.tgz#58a087d8c6f06c6aa81e8a3f6c1e7282b8ee94d9" + integrity sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w== dependencies: "@alloc/quick-lru" "^5.2.0" - "@tailwindcss/node" "4.2.4" - "@tailwindcss/oxide" "4.2.4" - postcss "^8.5.6" - tailwindcss "4.2.4" + "@tailwindcss/node" "4.3.0" + "@tailwindcss/oxide" "4.3.0" + postcss "^8.5.10" + tailwindcss "4.3.0" "@tanstack/react-virtual@3.13.24": version "3.13.24" @@ -868,9 +863,9 @@ integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== "@types/estree@^1.0.6", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== "@types/json-schema@^7.0.15": version "7.0.15" @@ -878,11 +873,11 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/node@^25.6.0": - version "25.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.6.0.tgz#4e09bad9b469871f2d0f68140198cbd714f4edca" - integrity sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ== + version "25.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.0.tgz#4823e66e0f486bfd8d9019fb445fbbb9e6f77348" + integrity sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ== dependencies: - undici-types "~7.19.0" + undici-types ">=7.24.0 <7.24.7" "@types/react-dom@^19.2.3": version "19.2.3" @@ -901,108 +896,108 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@typescript-eslint/eslint-plugin@8.59.2", "@typescript-eslint/eslint-plugin@^8.59.1": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz#f37b2c189a0177141fe3de3b08f2a83991bfdbfa" - integrity sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ== +"@typescript-eslint/eslint-plugin@8.59.3", "@typescript-eslint/eslint-plugin@^8.59.1": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz#5d6da7e7b236b46452fa00d3904bb6f59615bfde" + integrity sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw== dependencies: "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.59.2" - "@typescript-eslint/type-utils" "8.59.2" - "@typescript-eslint/utils" "8.59.2" - "@typescript-eslint/visitor-keys" "8.59.2" + "@typescript-eslint/scope-manager" "8.59.3" + "@typescript-eslint/type-utils" "8.59.3" + "@typescript-eslint/utils" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" ignore "^7.0.5" natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@8.59.2", "@typescript-eslint/parser@^8.59.1": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.59.2.tgz#e2fd0084baa5dd0c24cd789af1c72cbc3a7a1c62" - integrity sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ== +"@typescript-eslint/parser@8.59.3", "@typescript-eslint/parser@^8.59.1": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.59.3.tgz#f46cbc70ae0a25119ef94eac9ecd46714788e1a1" + integrity sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg== dependencies: - "@typescript-eslint/scope-manager" "8.59.2" - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/typescript-estree" "8.59.2" - "@typescript-eslint/visitor-keys" "8.59.2" + "@typescript-eslint/scope-manager" "8.59.3" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" debug "^4.4.3" -"@typescript-eslint/project-service@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.2.tgz#f8b8cbf8692e3a51c2c394acf8cf6900f7e755af" - integrity sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw== +"@typescript-eslint/project-service@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.3.tgz#1be5ae152aad987a156c9a1a9b4256e75cfbbe0c" + integrity sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.59.2" - "@typescript-eslint/types" "^8.59.2" + "@typescript-eslint/tsconfig-utils" "^8.59.3" + "@typescript-eslint/types" "^8.59.3" debug "^4.4.3" -"@typescript-eslint/scope-manager@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz#63cbd0af2e3180949d6be81122cc555bc71e736d" - integrity sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg== +"@typescript-eslint/scope-manager@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz#91a60f66803fe9dae0696fbab2451f5723f119d2" + integrity sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA== dependencies: - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/visitor-keys" "8.59.2" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" -"@typescript-eslint/tsconfig-utils@8.59.2", "@typescript-eslint/tsconfig-utils@^8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz#6e92bc412083753185a79c9f1431e78169d9232f" - integrity sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw== +"@typescript-eslint/tsconfig-utils@8.59.3", "@typescript-eslint/tsconfig-utils@^8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz#88ca9036b42ccdd1e630cfdafd2e042c2ca6a835" + integrity sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw== -"@typescript-eslint/type-utils@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz#a60a1192a804fa472a92c41656853ac6a9ba7176" - integrity sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ== +"@typescript-eslint/type-utils@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz#421fb2448bdfeb301d134a01cd02503f67fd8192" + integrity sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ== dependencies: - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/typescript-estree" "8.59.2" - "@typescript-eslint/utils" "8.59.2" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" + "@typescript-eslint/utils" "8.59.3" debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@8.59.2", "@typescript-eslint/types@^8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.2.tgz#01caabcd7e4715c33ad5e11cab260829714d6b9c" - integrity sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q== +"@typescript-eslint/types@8.59.3", "@typescript-eslint/types@^8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.3.tgz#b7ca539c5e302fdde9a7cadb73caed107ef8f2cd" + integrity sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg== -"@typescript-eslint/typescript-estree@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz#6a217ef65b18dbd12c718fc86a675d1d7a1414cc" - integrity sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg== +"@typescript-eslint/typescript-estree@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz#e6bb1408e00b47e431427a40268db4e86cb121ab" + integrity sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg== dependencies: - "@typescript-eslint/project-service" "8.59.2" - "@typescript-eslint/tsconfig-utils" "8.59.2" - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/visitor-keys" "8.59.2" + "@typescript-eslint/project-service" "8.59.3" + "@typescript-eslint/tsconfig-utils" "8.59.3" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" debug "^4.4.3" minimatch "^10.2.2" semver "^7.7.3" tinyglobby "^0.2.15" ts-api-utils "^2.5.0" -"@typescript-eslint/utils@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.2.tgz#ff619a6a3075f4017fa91b8610b752a8ca3366aa" - integrity sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q== +"@typescript-eslint/utils@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.3.tgz#f693f979deb4dc3994de03ff8b23976d625c36c5" + integrity sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.59.2" - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/typescript-estree" "8.59.2" + "@typescript-eslint/scope-manager" "8.59.3" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" -"@typescript-eslint/visitor-keys@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz#5ccc486913cd347883d69158836b1189a660bfe6" - integrity sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA== +"@typescript-eslint/visitor-keys@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz#820843b1b5ca4290009cf189382abcf6fe00dfa6" + integrity sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg== dependencies: - "@typescript-eslint/types" "8.59.2" + "@typescript-eslint/types" "8.59.3" eslint-visitor-keys "^5.0.0" "@vitejs/plugin-react@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz#d9113b71a0a592714913eafd9e5e63bcafd0ff15" - integrity sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ== + version "6.0.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz#f70cb8ed0ce225dbc3055d78070f820d8aa35eda" + integrity sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg== dependencies: - "@rolldown/pluginutils" "1.0.0-rc.7" + "@rolldown/pluginutils" "^1.0.0" acorn-jsx@^5.3.2: version "5.3.2" @@ -1132,9 +1127,9 @@ balanced-match@^4.0.2: integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== baseline-browser-mapping@^2.10.12: - version "2.10.27" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz#fee941c2a0b42cdf83c6427e4c830b1d0bdab2c3" - integrity sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA== + version "2.10.30" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz#58915c74388b05f3b3504026194ea9fa98f6e6b6" + integrity sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg== brace-expansion@^1.1.7: version "1.1.14" @@ -1145,9 +1140,9 @@ brace-expansion@^1.1.7: concat-map "0.0.1" brace-expansion@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" - integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== + version "5.0.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285" + integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== dependencies: balanced-match "^4.0.2" @@ -1189,9 +1184,9 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: get-intrinsic "^1.3.0" caniuse-lite@^1.0.30001782: - version "1.0.30001791" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz#dfb93d85c40ad380c57123e72e10f3c575786b51" - integrity sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ== + version "1.0.30001793" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz#238887ddf5fcfc8c36d872394d0a78a517312a72" + integrity sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA== chokidar@^4.0.0: version "4.0.3" @@ -1309,9 +1304,9 @@ doctrine@^2.1.0: esutils "^2.0.2" dompurify@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.2.tgz#f0ff81be682c485505097ba8195a058d8f575218" - integrity sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA== + version "3.4.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.5.tgz#bedc7d30a6007ae9a8937b952be6adb76a28e871" + integrity sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA== optionalDependencies: "@types/trusted-types" "^2.0.7" @@ -1325,9 +1320,9 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: gopd "^1.2.0" electron-to-chromium@^1.5.328: - version "1.5.351" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.351.tgz#7314fbb5b4835a1869feaec09665541b6a84cd37" - integrity sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA== + version "1.5.357" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz#fb4ecbf08fe0082b7278d12d1f5da386436575b9" + integrity sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g== emoji-mart@^5.6.0: version "5.6.0" @@ -1339,10 +1334,10 @@ emoji-toolkit@10.0.0: resolved "https://registry.yarnpkg.com/emoji-toolkit/-/emoji-toolkit-10.0.0.tgz#4a4dc29c86c30cea9bb1e5ef1d45bb36f6858397" integrity sha512-GkIAvgutEVbkqcT2HjBzV002SWvpdNaT3aP9q/YjQ6hlgDq8HhE9GcqxWkyYkRRQnLADGpwDoj1heTw9KzO9wQ== -enhanced-resolve@^5.19.0: - version "5.21.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz#bb8e6fabaf74930de70e61397798750429e5b1ae" - integrity sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA== +enhanced-resolve@^5.21.0: + version "5.21.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz#fa7fed23679e9169dfb705b8e201924421c4414a" + integrity sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q== dependencies: graceful-fs "^4.2.4" tapable "^2.3.3" @@ -1538,14 +1533,14 @@ eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1: integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== eslint@^10.2.1: - version "10.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.3.0.tgz#ed5b810eb8e0191bf24bddcf9cdb45b974e0a16d" - integrity sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw== + version "10.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.4.0.tgz#d86b6c405de0f19f3318c47139b8cb6771b3f592" + integrity sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.2" "@eslint/config-array" "^0.23.5" - "@eslint/config-helpers" "^0.5.5" + "@eslint/config-helpers" "^0.6.0" "@eslint/core" "^1.2.1" "@eslint/plugin-kit" "^0.7.1" "@humanfs/node" "^0.16.6" @@ -1889,7 +1884,7 @@ is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.16.1: +is-core-module@^2.16.2: version "2.16.2" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== @@ -2288,9 +2283,9 @@ node-exports-info@^1.6.0: semver "^6.3.1" node-releases@^2.0.36: - version "2.0.38" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.38.tgz#791569b9e4424a044e12c3abfad418ed83ce9947" - integrity sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw== + version "2.0.44" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.44.tgz#212c9b983f5bb70d311dd68c27d55dd0e65d1ca7" + integrity sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ== object-assign@^4.1.1: version "4.1.1" @@ -2429,7 +2424,7 @@ postcss-selector-parser@^7.0.0: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss@^8.5.10, postcss@^8.5.12, postcss@^8.5.6: +postcss@^8.5.10, postcss@^8.5.12, postcss@^8.5.14: version "8.5.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.14.tgz#a66c2d7808fadf69ebb5b84a03f8bafd76c4919c" integrity sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg== @@ -2458,9 +2453,9 @@ punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== react-dom@^19.2.5: - version "19.2.5" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.5.tgz#b8768b10837d0b8e9ca5b9e2d58dff3d880ea25e" - integrity sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag== + version "19.2.6" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.6.tgz#44a81b0bcca22da814c00847d09d01c8615529b7" + integrity sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g== dependencies: scheduler "^0.27.0" @@ -2518,9 +2513,9 @@ react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: tslib "^2.0.0" react@^19.2.5: - version "19.2.5" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.5.tgz#c888ab8b8ef33e2597fae8bdb2d77edbdb42858b" - integrity sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA== + version "19.2.6" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.6.tgz#3dadb8e12b2a7934c1d5317973e5dce1301f9a4d" + integrity sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q== readdirp@^4.0.1: version "4.1.2" @@ -2554,40 +2549,40 @@ regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: set-function-name "^2.0.2" resolve@^2.0.0-next.5: - version "2.0.0-next.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.6.tgz#b3961812be69ace7b3bc35d5bf259434681294af" - integrity sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA== + version "2.0.0-next.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.7.tgz#ba3b035d4b1ee7c522426eee73cabcb0fd5515dd" + integrity sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ== dependencies: es-errors "^1.3.0" - is-core-module "^2.16.1" + is-core-module "^2.16.2" node-exports-info "^1.6.0" object-keys "^1.1.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -rolldown@1.0.0-rc.17: - version "1.0.0-rc.17" - resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0-rc.17.tgz#c524fc22f6bb37b5588aec862ab1ee11382610f3" - integrity sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA== +rolldown@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.1.tgz#2e2e839106dc47951e42dbba414f0f0ecf97ac68" + integrity sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ== dependencies: - "@oxc-project/types" "=0.127.0" - "@rolldown/pluginutils" "1.0.0-rc.17" + "@oxc-project/types" "=0.130.0" + "@rolldown/pluginutils" "^1.0.0" optionalDependencies: - "@rolldown/binding-android-arm64" "1.0.0-rc.17" - "@rolldown/binding-darwin-arm64" "1.0.0-rc.17" - "@rolldown/binding-darwin-x64" "1.0.0-rc.17" - "@rolldown/binding-freebsd-x64" "1.0.0-rc.17" - "@rolldown/binding-linux-arm-gnueabihf" "1.0.0-rc.17" - "@rolldown/binding-linux-arm64-gnu" "1.0.0-rc.17" - "@rolldown/binding-linux-arm64-musl" "1.0.0-rc.17" - "@rolldown/binding-linux-ppc64-gnu" "1.0.0-rc.17" - "@rolldown/binding-linux-s390x-gnu" "1.0.0-rc.17" - "@rolldown/binding-linux-x64-gnu" "1.0.0-rc.17" - "@rolldown/binding-linux-x64-musl" "1.0.0-rc.17" - "@rolldown/binding-openharmony-arm64" "1.0.0-rc.17" - "@rolldown/binding-wasm32-wasi" "1.0.0-rc.17" - "@rolldown/binding-win32-arm64-msvc" "1.0.0-rc.17" - "@rolldown/binding-win32-x64-msvc" "1.0.0-rc.17" + "@rolldown/binding-android-arm64" "1.0.1" + "@rolldown/binding-darwin-arm64" "1.0.1" + "@rolldown/binding-darwin-x64" "1.0.1" + "@rolldown/binding-freebsd-x64" "1.0.1" + "@rolldown/binding-linux-arm-gnueabihf" "1.0.1" + "@rolldown/binding-linux-arm64-gnu" "1.0.1" + "@rolldown/binding-linux-arm64-musl" "1.0.1" + "@rolldown/binding-linux-ppc64-gnu" "1.0.1" + "@rolldown/binding-linux-s390x-gnu" "1.0.1" + "@rolldown/binding-linux-x64-gnu" "1.0.1" + "@rolldown/binding-linux-x64-musl" "1.0.1" + "@rolldown/binding-openharmony-arm64" "1.0.1" + "@rolldown/binding-wasm32-wasi" "1.0.1" + "@rolldown/binding-win32-arm64-msvc" "1.0.1" + "@rolldown/binding-win32-x64-msvc" "1.0.1" safe-array-concat@^1.1.3: version "1.1.4" @@ -2639,9 +2634,9 @@ semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.7.3: - version "7.7.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" - integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + version "7.8.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.0.tgz#ed0661039fcbcda2ce71f01fa6adbefaa77040df" + integrity sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA== set-function-length@^1.2.2: version "1.2.2" @@ -2803,10 +2798,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tailwindcss@4.2.4, tailwindcss@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.2.4.tgz#f7e3090edb22d56394db4d68e6464d2628dc2aa9" - integrity sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA== +tailwindcss@4.3.0, tailwindcss@^4.2.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.3.0.tgz#0a874e044a859cf6de413f3a59e76a9bedf05264" + integrity sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q== tapable@^2.3.3: version "2.3.3" @@ -2884,14 +2879,14 @@ typed-array-length@^1.0.7: reflect.getprototypeof "^1.0.6" typescript-eslint@^8.59.1: - version "8.59.2" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.59.2.tgz#e24b4f7232e20112e40572dba162a829a738ce98" - integrity sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ== + version "8.59.3" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.59.3.tgz#4a41d9007faa539a66292189e2795eeb0b9fca29" + integrity sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg== dependencies: - "@typescript-eslint/eslint-plugin" "8.59.2" - "@typescript-eslint/parser" "8.59.2" - "@typescript-eslint/typescript-estree" "8.59.2" - "@typescript-eslint/utils" "8.59.2" + "@typescript-eslint/eslint-plugin" "8.59.3" + "@typescript-eslint/parser" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" + "@typescript-eslint/utils" "8.59.3" typescript@^6.0.3: version "6.0.3" @@ -2908,10 +2903,10 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -undici-types@~7.19.0: - version "7.19.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.19.2.tgz#1b67fc26d0f157a0cba3a58a5b5c1e2276b8ba2a" - integrity sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg== +"undici-types@>=7.24.0 <7.24.7": + version "7.24.6" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" + integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== update-browserslist-db@^1.2.3: version "1.2.3" @@ -2954,14 +2949,14 @@ util-deprecate@^1.0.2: integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== vite@^8.0.10: - version "8.0.10" - resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.10.tgz#fb31868526ec874101fac084172a2cdc6776319b" - integrity sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw== + version "8.0.13" + resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.13.tgz#d75fb40aeee761051b0eb4620993da625c7719ab" + integrity sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw== dependencies: lightningcss "^1.32.0" picomatch "^4.0.4" - postcss "^8.5.10" - rolldown "1.0.0-rc.17" + postcss "^8.5.14" + rolldown "1.0.1" tinyglobby "^0.2.16" optionalDependencies: fsevents "~2.3.3"