tfrere HF Staff Cursor commited on
Commit
2fdc543
·
1 Parent(s): 81fe438

feat: fuzzy search with Web Worker and memoized cards

Browse files

- Add Fuse.js-powered fuzzy search in a Web Worker (off main thread)
- Search across name, id, author, description, and tags
- Extract SearchInput into isolated memoized component to prevent
full page re-renders on every keystroke
- Memoize AppCard with React.memo to skip unnecessary re-renders
- Debounce search input (200ms) for smooth typing

Co-authored-by: Cursor <cursoragent@cursor.com>

Files changed (4) hide show
  1. package.json +1 -0
  2. src/pages/Apps.jsx +100 -46
  3. src/workers/searchWorker.js +57 -0
  4. yarn.lock +264 -29
package.json CHANGED
@@ -20,6 +20,7 @@
20
  "@react-spring/web": "^10.0.3",
21
  "express": "^4.21.2",
22
  "framer-motion": "^12.23.26",
 
23
  "highlight.js": "^11.11.1",
24
  "react": "^19.2.0",
25
  "react-dom": "^19.2.0",
 
20
  "@react-spring/web": "^10.0.3",
21
  "express": "^4.21.2",
22
  "framer-motion": "^12.23.26",
23
+ "fuse.js": "^7.1.0",
24
  "highlight.js": "^11.11.1",
25
  "react": "^19.2.0",
26
  "react-dom": "^19.2.0",
src/pages/Apps.jsx CHANGED
@@ -1,4 +1,4 @@
1
- import { useState, useMemo, useCallback } from 'react';
2
  import {
3
  Box,
4
  Container,
@@ -29,8 +29,8 @@ import { useApps } from '../context/AppsContext';
29
  import { useAuth } from '../context/AuthContext';
30
  import InstallModal from '../components/InstallModal';
31
 
32
- // App Card Component
33
- function AppCard({ app, onInstallClick, isLiked, onToggleLike, isLoggedIn }) {
34
  const isOfficial = app.isOfficial;
35
  const isPythonApp = app.extra?.isPythonApp !== false; // Default to true for backwards compatibility
36
  const cardData = app.extra?.cardData || {};
@@ -328,7 +328,53 @@ function AppCard({ app, onInstallClick, isLiked, onToggleLike, isLoggedIn }) {
328
  </Box>
329
  </Box>
330
  );
331
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
 
333
  // Tags to exclude from category filters
334
  const EXCLUDED_TAGS = new Set([
@@ -352,9 +398,45 @@ export default function Apps() {
352
  // Get apps from context (cached globally)
353
  const { apps, loading, error } = useApps();
354
  const { user, isLoggedIn, isOAuthAvailable, login, logout, isSpaceLiked, toggleLike } = useAuth();
355
- const [searchQuery, setSearchQuery] = useState('');
356
  const [officialOnly, setOfficialOnly] = useState(false);
357
  const [selectedCategory, setSelectedCategory] = useState(null);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
 
359
  // Install modal state
360
  const [installModalOpen, setInstallModalOpen] = useState(false);
@@ -419,7 +501,7 @@ export default function Apps() {
419
  .slice(0, 8);
420
  }, [apps, officialOnly]);
421
 
422
- // Filter apps based on search, official toggle, and category
423
  const filteredApps = useMemo(() => {
424
  let result = apps;
425
 
@@ -448,25 +530,23 @@ export default function Apps() {
448
  });
449
  }
450
 
451
- // Filter by search
452
- if (searchQuery.trim()) {
453
- const query = searchQuery.toLowerCase();
454
- result = result.filter(
455
- (app) =>
456
- app.name?.toLowerCase().includes(query) ||
457
- app.id?.toLowerCase().includes(query) ||
458
- app.description?.toLowerCase().includes(query) ||
459
- app.extra?.cardData?.short_description?.toLowerCase().includes(query)
460
- );
461
  }
462
 
463
- // Sort by likes (descending)
464
  result.sort((a, b) => (b.extra?.likes || 0) - (a.extra?.likes || 0));
465
 
466
  return result;
467
- }, [apps, searchQuery, officialOnly, selectedCategory]);
468
 
469
- const isFiltered = searchQuery.trim() || officialOnly || selectedCategory;
470
 
471
  return (
472
  <Layout transparentHeader>
@@ -604,33 +684,7 @@ export default function Apps() {
604
  border: '1px solid rgba(0, 0, 0, 0.06)',
605
  }}
606
  >
607
- <SearchIcon sx={{ fontSize: 22, color: '#999' }} />
608
- <InputBase
609
- placeholder="Search apps by name or description..."
610
- value={searchQuery}
611
- onChange={(e) => setSearchQuery(e.target.value)}
612
- sx={{
613
- flex: 1,
614
- fontSize: 15,
615
- fontWeight: 500,
616
- color: '#333',
617
- '& input::placeholder': {
618
- color: '#999',
619
- opacity: 1,
620
- },
621
- }}
622
- />
623
-
624
- {/* Clear search */}
625
- {searchQuery && (
626
- <IconButton
627
- onClick={() => setSearchQuery('')}
628
- size="small"
629
- sx={{ color: '#999' }}
630
- >
631
- <CloseIcon sx={{ fontSize: 20 }} />
632
- </IconButton>
633
- )}
634
 
635
  {/* Separator */}
636
  <Box sx={{ width: '1px', height: '24px', bgcolor: 'rgba(0, 0, 0, 0.1)' }} />
 
1
+ import { useState, useMemo, useCallback, useEffect, useRef, memo } from 'react';
2
  import {
3
  Box,
4
  Container,
 
29
  import { useAuth } from '../context/AuthContext';
30
  import InstallModal from '../components/InstallModal';
31
 
32
+ // App Card Component (memoized to avoid re-renders when only search changes)
33
+ const AppCard = memo(function AppCard({ app, onInstallClick, isLiked, onToggleLike, isLoggedIn }) {
34
  const isOfficial = app.isOfficial;
35
  const isPythonApp = app.extra?.isPythonApp !== false; // Default to true for backwards compatibility
36
  const cardData = app.extra?.cardData || {};
 
328
  </Box>
329
  </Box>
330
  );
331
+ });
332
+
333
+ // Isolated search input — typing only re-renders this component, not the whole page
334
+ const SearchInput = memo(function SearchInput({ onSearch }) {
335
+ const [value, setValue] = useState('');
336
+ const debounceRef = useRef(null);
337
+
338
+ useEffect(() => {
339
+ clearTimeout(debounceRef.current);
340
+ if (!value.trim()) {
341
+ onSearch('');
342
+ return;
343
+ }
344
+ debounceRef.current = setTimeout(() => onSearch(value.trim()), 200);
345
+ return () => clearTimeout(debounceRef.current);
346
+ }, [value, onSearch]);
347
+
348
+ return (
349
+ <>
350
+ <SearchIcon sx={{ fontSize: 22, color: '#999' }} />
351
+ <InputBase
352
+ placeholder="Search apps by name, description, tags..."
353
+ value={value}
354
+ onChange={(e) => setValue(e.target.value)}
355
+ sx={{
356
+ flex: 1,
357
+ fontSize: 15,
358
+ fontWeight: 500,
359
+ color: '#333',
360
+ '& input::placeholder': {
361
+ color: '#999',
362
+ opacity: 1,
363
+ },
364
+ }}
365
+ />
366
+ {value && (
367
+ <IconButton
368
+ onClick={() => { setValue(''); onSearch(''); }}
369
+ size="small"
370
+ sx={{ color: '#999' }}
371
+ >
372
+ <CloseIcon sx={{ fontSize: 20 }} />
373
+ </IconButton>
374
+ )}
375
+ </>
376
+ );
377
+ });
378
 
379
  // Tags to exclude from category filters
380
  const EXCLUDED_TAGS = new Set([
 
398
  // Get apps from context (cached globally)
399
  const { apps, loading, error } = useApps();
400
  const { user, isLoggedIn, isOAuthAvailable, login, logout, isSpaceLiked, toggleLike } = useAuth();
 
401
  const [officialOnly, setOfficialOnly] = useState(false);
402
  const [selectedCategory, setSelectedCategory] = useState(null);
403
+ const [searchResults, setSearchResults] = useState(null); // null = no search, [] = no matches
404
+ const [isSearching, setIsSearching] = useState(false);
405
+ const workerRef = useRef(null);
406
+
407
+ // Initialize search Web Worker
408
+ useEffect(() => {
409
+ workerRef.current = new Worker(
410
+ new URL('../workers/searchWorker.js', import.meta.url),
411
+ { type: 'module' }
412
+ );
413
+
414
+ workerRef.current.onmessage = (e) => {
415
+ if (e.data.type === 'RESULTS') {
416
+ setSearchResults(e.data.results);
417
+ }
418
+ };
419
+
420
+ return () => workerRef.current?.terminate();
421
+ }, []);
422
+
423
+ // Send apps to worker to build index whenever apps change
424
+ useEffect(() => {
425
+ if (workerRef.current && apps.length > 0) {
426
+ workerRef.current.postMessage({ type: 'INDEX', apps });
427
+ }
428
+ }, [apps]);
429
+
430
+ // Callback from SearchInput component (already debounced)
431
+ const handleSearch = useCallback((query) => {
432
+ if (!query) {
433
+ setSearchResults(null);
434
+ setIsSearching(false);
435
+ return;
436
+ }
437
+ setIsSearching(true);
438
+ workerRef.current?.postMessage({ type: 'SEARCH', query });
439
+ }, []);
440
 
441
  // Install modal state
442
  const [installModalOpen, setInstallModalOpen] = useState(false);
 
501
  .slice(0, 8);
502
  }, [apps, officialOnly]);
503
 
504
+ // Filter apps based on worker search results, official toggle, and category
505
  const filteredApps = useMemo(() => {
506
  let result = apps;
507
 
 
530
  });
531
  }
532
 
533
+ // Apply fuzzy search results from worker
534
+ if (searchResults !== null) {
535
+ const scoreMap = new Map(searchResults.map((r) => [r.id, r.score]));
536
+ const matchedIds = new Set(searchResults.map((r) => r.id));
537
+ result = result.filter((app) => matchedIds.has(app.id));
538
+ // Sort by relevance (best score first)
539
+ result.sort((a, b) => (scoreMap.get(a.id) || 1) - (scoreMap.get(b.id) || 1));
540
+ return result;
 
 
541
  }
542
 
543
+ // Default sort: by likes (descending)
544
  result.sort((a, b) => (b.extra?.likes || 0) - (a.extra?.likes || 0));
545
 
546
  return result;
547
+ }, [apps, officialOnly, selectedCategory, searchResults]);
548
 
549
+ const isFiltered = searchResults !== null || officialOnly || selectedCategory;
550
 
551
  return (
552
  <Layout transparentHeader>
 
684
  border: '1px solid rgba(0, 0, 0, 0.06)',
685
  }}
686
  >
687
+ <SearchInput onSearch={handleSearch} />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
688
 
689
  {/* Separator */}
690
  <Box sx={{ width: '1px', height: '24px', bgcolor: 'rgba(0, 0, 0, 0.1)' }} />
src/workers/searchWorker.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Fuse from 'fuse.js';
2
+
3
+ let fuse = null;
4
+
5
+ const FUSE_OPTIONS = {
6
+ keys: [
7
+ { name: 'name', weight: 3 },
8
+ { name: 'id', weight: 2 },
9
+ { name: '_searchAuthor', weight: 2 },
10
+ { name: '_searchDescription', weight: 1.5 },
11
+ { name: '_searchTags', weight: 1 },
12
+ ],
13
+ threshold: 0.35,
14
+ ignoreLocation: true,
15
+ includeScore: true,
16
+ };
17
+
18
+ /**
19
+ * Build a Fuse.js index from app data.
20
+ * Flattens searchable fields for better matching.
21
+ */
22
+ function buildIndex(apps) {
23
+ const enriched = apps.map((app) => ({
24
+ id: app.id,
25
+ name: app.name,
26
+ _searchAuthor: app.extra?.author || app.id?.split('/')?.[0] || '',
27
+ _searchDescription:
28
+ app.extra?.cardData?.short_description || app.description || '',
29
+ _searchTags: [...(app.extra?.tags || []), ...(app.extra?.cardData?.tags || [])]
30
+ .filter(Boolean)
31
+ .join(' '),
32
+ }));
33
+
34
+ fuse = new Fuse(enriched, FUSE_OPTIONS);
35
+ }
36
+
37
+ /**
38
+ * Search and return ordered list of matching app IDs with scores.
39
+ */
40
+ function search(query) {
41
+ if (!fuse || !query.trim()) return [];
42
+ const results = fuse.search(query.trim());
43
+ return results.map((r) => ({ id: r.item.id, score: r.score }));
44
+ }
45
+
46
+ // Handle messages from the main thread
47
+ self.onmessage = (e) => {
48
+ const { type, apps, query } = e.data;
49
+
50
+ if (type === 'INDEX') {
51
+ buildIndex(apps);
52
+ self.postMessage({ type: 'INDEXED' });
53
+ } else if (type === 'SEARCH') {
54
+ const results = search(query);
55
+ self.postMessage({ type: 'RESULTS', results, query });
56
+ }
57
+ };
yarn.lock CHANGED
@@ -16,7 +16,7 @@
16
  resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
17
  integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
18
 
19
- "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.4", "@babel/core@^7.28.5":
20
  version "7.28.5"
21
  resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
22
  integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
@@ -198,7 +198,7 @@
198
  resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz"
199
  integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
200
 
201
- "@emotion/is-prop-valid@*", "@emotion/is-prop-valid@^1.3.0":
202
  version "1.4.0"
203
  resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz"
204
  integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==
@@ -210,7 +210,7 @@
210
  resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
211
  integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
212
 
213
- "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.14.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0":
214
  version "11.14.0"
215
  resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
216
  integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
@@ -240,7 +240,7 @@
240
  resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
241
  integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
242
 
243
- "@emotion/styled@^11.14.1", "@emotion/styled@^11.3.0":
244
  version "11.14.1"
245
  resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz"
246
  integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==
@@ -272,11 +272,136 @@
272
  resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
273
  integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
274
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
  "@esbuild/darwin-arm64@0.25.12":
276
  version "0.25.12"
277
  resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz"
278
  integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==
279
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
  "@eslint-community/eslint-utils@^4.8.0":
281
  version "4.9.0"
282
  resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
@@ -327,7 +452,7 @@
327
  minimatch "^3.1.2"
328
  strip-json-comments "^3.1.1"
329
 
330
- "@eslint/js@^9.39.1", "@eslint/js@9.39.1":
331
  version "9.39.1"
332
  resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz"
333
  integrity sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==
@@ -555,11 +680,116 @@
555
  resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz"
556
  integrity sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==
557
 
 
 
 
 
 
 
 
 
 
 
558
  "@rollup/rollup-darwin-arm64@4.53.3":
559
  version "4.53.3"
560
  resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz"
561
  integrity sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==
562
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
563
  "@types/babel__core@^7.20.5":
564
  version "7.20.5"
565
  resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
@@ -607,7 +837,7 @@
607
  dependencies:
608
  "@types/estree" "*"
609
 
610
- "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@1.0.8":
611
  version "1.0.8"
612
  resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
613
  integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
@@ -656,7 +886,7 @@
656
  resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
657
  integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
658
 
659
- "@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^19.2.0", "@types/react@^19.2.5", "@types/react@>=18":
660
  version "19.2.7"
661
  resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz"
662
  integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==
@@ -703,7 +933,7 @@ acorn-jsx@^5.3.2:
703
  resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
704
  integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
705
 
706
- "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0:
707
  version "8.15.0"
708
  resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
709
  integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
@@ -790,7 +1020,7 @@ brace-expansion@^1.1.7:
790
  balanced-match "^1.0.0"
791
  concat-map "0.0.1"
792
 
793
- browserslist@^4.24.0, "browserslist@>= 4.21.0":
794
  version "4.28.1"
795
  resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"
796
  integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
@@ -961,13 +1191,6 @@ csstype@^3.0.2, csstype@^3.1.3, csstype@^3.2.2:
961
  resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
962
  integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
963
 
964
- debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2:
965
- version "4.4.3"
966
- resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
967
- integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
968
- dependencies:
969
- ms "^2.1.3"
970
-
971
  debug@2.6.9:
972
  version "2.6.9"
973
  resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
@@ -975,6 +1198,13 @@ debug@2.6.9:
975
  dependencies:
976
  ms "2.0.0"
977
 
 
 
 
 
 
 
 
978
  decode-named-character-reference@^1.0.0:
979
  version "1.2.0"
980
  resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz"
@@ -987,7 +1217,7 @@ deep-is@^0.1.3:
987
  resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
988
  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
989
 
990
- depd@~2.0.0, depd@2.0.0:
991
  version "2.0.0"
992
  resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
993
  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
@@ -997,7 +1227,7 @@ dequal@^2.0.0:
997
  resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
998
  integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
999
 
1000
- destroy@~1.2.0, destroy@1.2.0:
1001
  version "1.2.0"
1002
  resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
1003
  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
@@ -1156,7 +1386,7 @@ eslint-visitor-keys@^4.2.1:
1156
  resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
1157
  integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
1158
 
1159
- "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.39.1, eslint@>=8.40:
1160
  version "9.39.1"
1161
  resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz"
1162
  integrity sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==
@@ -1376,6 +1606,11 @@ function-bind@^1.1.2:
1376
  resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
1377
  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
1378
 
 
 
 
 
 
1379
  gensync@^1.0.0-beta.2:
1380
  version "1.0.0-beta.2"
1381
  resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
@@ -2247,16 +2482,16 @@ motion-utils@^12.23.6:
2247
  resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz"
2248
  integrity sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==
2249
 
2250
- ms@^2.1.3, ms@2.1.3:
2251
- version "2.1.3"
2252
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
2253
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
2254
-
2255
  ms@2.0.0:
2256
  version "2.0.0"
2257
  resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
2258
  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
2259
 
 
 
 
 
 
2260
  nanoid@^3.3.11:
2261
  version "3.3.11"
2262
  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
@@ -2385,7 +2620,7 @@ picocolors@^1.1.1:
2385
  resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
2386
  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
2387
 
2388
- "picomatch@^3 || ^4", picomatch@^4.0.3:
2389
  version "4.0.3"
2390
  resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
2391
  integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
@@ -2453,7 +2688,7 @@ raw-body@~2.5.3:
2453
  iconv-lite "~0.4.24"
2454
  unpipe "~1.0.0"
2455
 
2456
- "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.0, react-dom@>=16.6.0, react-dom@>=18:
2457
  version "19.2.3"
2458
  resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz"
2459
  integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==
@@ -2517,7 +2752,7 @@ react-transition-group@^4.4.5:
2517
  loose-envify "^1.4.0"
2518
  prop-types "^15.6.2"
2519
 
2520
- "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.2.0, react@^19.2.3, react@>=16.6.0, react@>=16.8.0, react@>=18:
2521
  version "19.2.3"
2522
  resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz"
2523
  integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==
@@ -2674,7 +2909,7 @@ set-cookie-parser@^2.6.0:
2674
  resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz"
2675
  integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==
2676
 
2677
- setprototypeof@~1.2.0, setprototypeof@1.2.0:
2678
  version "1.2.0"
2679
  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
2680
  integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
@@ -2959,7 +3194,7 @@ vfile@^6.0.0:
2959
  "@types/unist" "^3.0.0"
2960
  vfile-message "^4.0.0"
2961
 
2962
- "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^7.2.4:
2963
  version "7.2.7"
2964
  resolved "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz"
2965
  integrity sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==
 
16
  resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
17
  integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
18
 
19
+ "@babel/core@^7.24.4", "@babel/core@^7.28.5":
20
  version "7.28.5"
21
  resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
22
  integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
 
198
  resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz"
199
  integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
200
 
201
+ "@emotion/is-prop-valid@^1.3.0":
202
  version "1.4.0"
203
  resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz"
204
  integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==
 
210
  resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
211
  integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
212
 
213
+ "@emotion/react@^11.14.0":
214
  version "11.14.0"
215
  resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
216
  integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
 
240
  resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
241
  integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
242
 
243
+ "@emotion/styled@^11.14.1":
244
  version "11.14.1"
245
  resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz"
246
  integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==
 
272
  resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
273
  integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
274
 
275
+ "@esbuild/aix-ppc64@0.25.12":
276
+ version "0.25.12"
277
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c"
278
+ integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==
279
+
280
+ "@esbuild/android-arm64@0.25.12":
281
+ version "0.25.12"
282
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752"
283
+ integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==
284
+
285
+ "@esbuild/android-arm@0.25.12":
286
+ version "0.25.12"
287
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a"
288
+ integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==
289
+
290
+ "@esbuild/android-x64@0.25.12":
291
+ version "0.25.12"
292
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16"
293
+ integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==
294
+
295
  "@esbuild/darwin-arm64@0.25.12":
296
  version "0.25.12"
297
  resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz"
298
  integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==
299
 
300
+ "@esbuild/darwin-x64@0.25.12":
301
+ version "0.25.12"
302
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e"
303
+ integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==
304
+
305
+ "@esbuild/freebsd-arm64@0.25.12":
306
+ version "0.25.12"
307
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe"
308
+ integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==
309
+
310
+ "@esbuild/freebsd-x64@0.25.12":
311
+ version "0.25.12"
312
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3"
313
+ integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==
314
+
315
+ "@esbuild/linux-arm64@0.25.12":
316
+ version "0.25.12"
317
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977"
318
+ integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==
319
+
320
+ "@esbuild/linux-arm@0.25.12":
321
+ version "0.25.12"
322
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9"
323
+ integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==
324
+
325
+ "@esbuild/linux-ia32@0.25.12":
326
+ version "0.25.12"
327
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0"
328
+ integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==
329
+
330
+ "@esbuild/linux-loong64@0.25.12":
331
+ version "0.25.12"
332
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0"
333
+ integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==
334
+
335
+ "@esbuild/linux-mips64el@0.25.12":
336
+ version "0.25.12"
337
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd"
338
+ integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==
339
+
340
+ "@esbuild/linux-ppc64@0.25.12":
341
+ version "0.25.12"
342
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869"
343
+ integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==
344
+
345
+ "@esbuild/linux-riscv64@0.25.12":
346
+ version "0.25.12"
347
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6"
348
+ integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==
349
+
350
+ "@esbuild/linux-s390x@0.25.12":
351
+ version "0.25.12"
352
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663"
353
+ integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==
354
+
355
+ "@esbuild/linux-x64@0.25.12":
356
+ version "0.25.12"
357
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306"
358
+ integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==
359
+
360
+ "@esbuild/netbsd-arm64@0.25.12":
361
+ version "0.25.12"
362
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4"
363
+ integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==
364
+
365
+ "@esbuild/netbsd-x64@0.25.12":
366
+ version "0.25.12"
367
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076"
368
+ integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==
369
+
370
+ "@esbuild/openbsd-arm64@0.25.12":
371
+ version "0.25.12"
372
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd"
373
+ integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==
374
+
375
+ "@esbuild/openbsd-x64@0.25.12":
376
+ version "0.25.12"
377
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679"
378
+ integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==
379
+
380
+ "@esbuild/openharmony-arm64@0.25.12":
381
+ version "0.25.12"
382
+ resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d"
383
+ integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==
384
+
385
+ "@esbuild/sunos-x64@0.25.12":
386
+ version "0.25.12"
387
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6"
388
+ integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==
389
+
390
+ "@esbuild/win32-arm64@0.25.12":
391
+ version "0.25.12"
392
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323"
393
+ integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==
394
+
395
+ "@esbuild/win32-ia32@0.25.12":
396
+ version "0.25.12"
397
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267"
398
+ integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==
399
+
400
+ "@esbuild/win32-x64@0.25.12":
401
+ version "0.25.12"
402
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5"
403
+ integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==
404
+
405
  "@eslint-community/eslint-utils@^4.8.0":
406
  version "4.9.0"
407
  resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
 
452
  minimatch "^3.1.2"
453
  strip-json-comments "^3.1.1"
454
 
455
+ "@eslint/js@9.39.1", "@eslint/js@^9.39.1":
456
  version "9.39.1"
457
  resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz"
458
  integrity sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==
 
680
  resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz"
681
  integrity sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==
682
 
683
+ "@rollup/rollup-android-arm-eabi@4.53.3":
684
+ version "4.53.3"
685
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz#7e478b66180c5330429dd161bf84dad66b59c8eb"
686
+ integrity sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==
687
+
688
+ "@rollup/rollup-android-arm64@4.53.3":
689
+ version "4.53.3"
690
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz#2b025510c53a5e3962d3edade91fba9368c9d71c"
691
+ integrity sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==
692
+
693
  "@rollup/rollup-darwin-arm64@4.53.3":
694
  version "4.53.3"
695
  resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz"
696
  integrity sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==
697
 
698
+ "@rollup/rollup-darwin-x64@4.53.3":
699
+ version "4.53.3"
700
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz#2bf5f2520a1f3b551723d274b9669ba5b75ed69c"
701
+ integrity sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==
702
+
703
+ "@rollup/rollup-freebsd-arm64@4.53.3":
704
+ version "4.53.3"
705
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz#4bb9cc80252564c158efc0710153c71633f1927c"
706
+ integrity sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==
707
+
708
+ "@rollup/rollup-freebsd-x64@4.53.3":
709
+ version "4.53.3"
710
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz#2301289094d49415a380cf942219ae9d8b127440"
711
+ integrity sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==
712
+
713
+ "@rollup/rollup-linux-arm-gnueabihf@4.53.3":
714
+ version "4.53.3"
715
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz#1d03d776f2065e09fc141df7d143476e94acca88"
716
+ integrity sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==
717
+
718
+ "@rollup/rollup-linux-arm-musleabihf@4.53.3":
719
+ version "4.53.3"
720
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz#8623de0e040b2fd52a541c602688228f51f96701"
721
+ integrity sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==
722
+
723
+ "@rollup/rollup-linux-arm64-gnu@4.53.3":
724
+ version "4.53.3"
725
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz#ce2d1999bc166277935dde0301cde3dd0417fb6e"
726
+ integrity sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==
727
+
728
+ "@rollup/rollup-linux-arm64-musl@4.53.3":
729
+ version "4.53.3"
730
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz#88c2523778444da952651a2219026416564a4899"
731
+ integrity sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==
732
+
733
+ "@rollup/rollup-linux-loong64-gnu@4.53.3":
734
+ version "4.53.3"
735
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz#578ca2220a200ac4226c536c10c8cc6e4f276714"
736
+ integrity sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==
737
+
738
+ "@rollup/rollup-linux-ppc64-gnu@4.53.3":
739
+ version "4.53.3"
740
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz#aa338d3effd4168a20a5023834a74ba2c3081293"
741
+ integrity sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==
742
+
743
+ "@rollup/rollup-linux-riscv64-gnu@4.53.3":
744
+ version "4.53.3"
745
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz#16ba582f9f6cff58119aa242782209b1557a1508"
746
+ integrity sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==
747
+
748
+ "@rollup/rollup-linux-riscv64-musl@4.53.3":
749
+ version "4.53.3"
750
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz#e404a77ebd6378483888b8064c703adb011340ab"
751
+ integrity sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==
752
+
753
+ "@rollup/rollup-linux-s390x-gnu@4.53.3":
754
+ version "4.53.3"
755
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz#92ad52d306227c56bec43d96ad2164495437ffe6"
756
+ integrity sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==
757
+
758
+ "@rollup/rollup-linux-x64-gnu@4.53.3":
759
+ version "4.53.3"
760
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz#fd0dea3bb9aa07e7083579f25e1c2285a46cb9fa"
761
+ integrity sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==
762
+
763
+ "@rollup/rollup-linux-x64-musl@4.53.3":
764
+ version "4.53.3"
765
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz#37a3efb09f18d555f8afc490e1f0444885de8951"
766
+ integrity sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==
767
+
768
+ "@rollup/rollup-openharmony-arm64@4.53.3":
769
+ version "4.53.3"
770
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz#c489bec9f4f8320d42c9b324cca220c90091c1f7"
771
+ integrity sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==
772
+
773
+ "@rollup/rollup-win32-arm64-msvc@4.53.3":
774
+ version "4.53.3"
775
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz#152832b5f79dc22d1606fac3db946283601b7080"
776
+ integrity sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==
777
+
778
+ "@rollup/rollup-win32-ia32-msvc@4.53.3":
779
+ version "4.53.3"
780
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz#54d91b2bb3bf3e9f30d32b72065a4e52b3a172a5"
781
+ integrity sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==
782
+
783
+ "@rollup/rollup-win32-x64-gnu@4.53.3":
784
+ version "4.53.3"
785
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz#df9df03e61a003873efec8decd2034e7f135c71e"
786
+ integrity sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==
787
+
788
+ "@rollup/rollup-win32-x64-msvc@4.53.3":
789
+ version "4.53.3"
790
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz#38ae84f4c04226c1d56a3b17296ef1e0460ecdfe"
791
+ integrity sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==
792
+
793
  "@types/babel__core@^7.20.5":
794
  version "7.20.5"
795
  resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
 
837
  dependencies:
838
  "@types/estree" "*"
839
 
840
+ "@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6":
841
  version "1.0.8"
842
  resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
843
  integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
 
886
  resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
887
  integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
888
 
889
+ "@types/react@^19.2.5":
890
  version "19.2.7"
891
  resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz"
892
  integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==
 
933
  resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
934
  integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
935
 
936
+ acorn@^8.15.0:
937
  version "8.15.0"
938
  resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
939
  integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
 
1020
  balanced-match "^1.0.0"
1021
  concat-map "0.0.1"
1022
 
1023
+ browserslist@^4.24.0:
1024
  version "4.28.1"
1025
  resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"
1026
  integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
 
1191
  resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
1192
  integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
1193
 
 
 
 
 
 
 
 
1194
  debug@2.6.9:
1195
  version "2.6.9"
1196
  resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
 
1198
  dependencies:
1199
  ms "2.0.0"
1200
 
1201
+ debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2:
1202
+ version "4.4.3"
1203
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
1204
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
1205
+ dependencies:
1206
+ ms "^2.1.3"
1207
+
1208
  decode-named-character-reference@^1.0.0:
1209
  version "1.2.0"
1210
  resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz"
 
1217
  resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
1218
  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
1219
 
1220
+ depd@2.0.0, depd@~2.0.0:
1221
  version "2.0.0"
1222
  resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
1223
  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
 
1227
  resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
1228
  integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
1229
 
1230
+ destroy@1.2.0, destroy@~1.2.0:
1231
  version "1.2.0"
1232
  resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
1233
  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
 
1386
  resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
1387
  integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
1388
 
1389
+ eslint@^9.39.1:
1390
  version "9.39.1"
1391
  resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz"
1392
  integrity sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==
 
1606
  resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
1607
  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
1608
 
1609
+ fuse.js@^7.1.0:
1610
+ version "7.1.0"
1611
+ resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.1.0.tgz#306228b4befeee11e05b027087c2744158527d09"
1612
+ integrity sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==
1613
+
1614
  gensync@^1.0.0-beta.2:
1615
  version "1.0.0-beta.2"
1616
  resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
 
2482
  resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz"
2483
  integrity sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==
2484
 
 
 
 
 
 
2485
  ms@2.0.0:
2486
  version "2.0.0"
2487
  resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
2488
  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
2489
 
2490
+ ms@2.1.3, ms@^2.1.3:
2491
+ version "2.1.3"
2492
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
2493
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
2494
+
2495
  nanoid@^3.3.11:
2496
  version "3.3.11"
2497
  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
 
2620
  resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
2621
  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
2622
 
2623
+ picomatch@^4.0.3:
2624
  version "4.0.3"
2625
  resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
2626
  integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
 
2688
  iconv-lite "~0.4.24"
2689
  unpipe "~1.0.0"
2690
 
2691
+ react-dom@^19.2.0:
2692
  version "19.2.3"
2693
  resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz"
2694
  integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==
 
2752
  loose-envify "^1.4.0"
2753
  prop-types "^15.6.2"
2754
 
2755
+ react@^19.2.0:
2756
  version "19.2.3"
2757
  resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz"
2758
  integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==
 
2909
  resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz"
2910
  integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==
2911
 
2912
+ setprototypeof@1.2.0, setprototypeof@~1.2.0:
2913
  version "1.2.0"
2914
  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
2915
  integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
 
3194
  "@types/unist" "^3.0.0"
3195
  vfile-message "^4.0.0"
3196
 
3197
+ vite@^7.2.4:
3198
  version "7.2.7"
3199
  resolved "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz"
3200
  integrity sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==