├── src
├── App.css
├── index.jsx
├── AuthenticatedApp.jsx
├── components
│ ├── ListHeader.jsx
│ ├── ListDetailFooter.jsx
│ ├── Footer.jsx
│ ├── ShareModal.jsx
│ ├── TodoList.jsx
│ └── ListDetail.jsx
├── UnauthenticatedApp.jsx
├── App.jsx
├── utils
│ └── shared-resource.js
├── views
│ ├── ProfileView.jsx
│ ├── MainView.jsx
│ └── DetailView.jsx
├── logo.svg
└── index.css
├── vite.config.js
├── .gitignore
├── index.html
├── LICENSE.md
├── server.js
├── package.json
├── README.md
└── pnpm-lock.yaml
/src/App.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import reactPlugin from '@vitejs/plugin-react';
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | // This changes the out put dir from dist to build
7 | // comment this out if that isn't relevant for your project
8 | build: {
9 | outDir: 'build',
10 | },
11 | plugins: [reactPlugin()],
12 | server: {
13 | port: 3000,
14 | },
15 | });
16 |
--------------------------------------------------------------------------------
/src/index.jsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react';
2 | import { createRoot } from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import { BrowserRouter as Router } from 'react-router-dom';
6 |
7 | const container = document.getElementById('root');
8 | const root = createRoot(container);
9 |
10 | root.render(
11 |
12 |
13 |
14 |
15 |
16 | );
17 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
25 | ossl
26 | radata
27 | .vercel
28 |
--------------------------------------------------------------------------------
/src/AuthenticatedApp.jsx:
--------------------------------------------------------------------------------
1 | import { MainView } from './views/MainView';
2 | import { DetailView } from './views/DetailView';
3 | import { ProfileView } from './views/ProfileView';
4 | import { Routes, Route } from 'react-router-dom';
5 |
6 | function AuthenticatedApp({ route }) {
7 | const child = route?.routes?.map((r) => ({
8 | ...r,
9 |
10 | // Commment out following two lines it'll fail to render child routes
11 | path: `${route.path === '/' ? '' : route.path}${r.path}`,
12 | exact: r.path === '/',
13 | }));
14 | return (
15 |
16 | } />
17 | } />
18 | } />
19 |
20 | );
21 | }
22 |
23 | export default AuthenticatedApp;
24 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
16 |
17 |
18 |
19 |
20 | TODOs App
21 |
22 |
23 | You need to enable JavaScript to run this app.
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright 2020 Carlos Vega
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
--------------------------------------------------------------------------------
/src/components/ListHeader.jsx:
--------------------------------------------------------------------------------
1 | import { Fragment } from 'react';
2 |
3 | export const ListHeader = ({
4 | addTodo,
5 | setNewTodo,
6 | updateName,
7 | readOnly,
8 | newTodo,
9 | name,
10 | }) => {
11 | return !readOnly ? (
12 |
13 | {
18 | const name = e.target.innerText;
19 | updateName(name);
20 | e.target.innerText = '';
21 | }}
22 | >
23 | {name || '[Add new name]'}
24 |
25 | {
29 | setNewTodo(e.target.value);
30 | }}
31 | onBlur={(e) => {
32 | addTodo(newTodo);
33 | e.target.value = '';
34 | }}
35 | type="text"
36 | placeholder="What needs to be done?"
37 | />
38 |
39 | ) : (
40 | {name}
41 | );
42 | };
43 |
--------------------------------------------------------------------------------
/src/UnauthenticatedApp.jsx:
--------------------------------------------------------------------------------
1 | import { useAuth } from '@altrx/gundb-react-hooks';
2 |
3 | export default function LoginView() {
4 | const { login } = useAuth();
5 | async function getApp(type, value) {
6 | try {
7 | let keys;
8 |
9 | if (type !== 'new') {
10 | if (typeof value === 'string') {
11 | keys = JSON.parse(value);
12 | } else {
13 | keys = value;
14 | }
15 | }
16 | login(keys);
17 | } catch (e) {}
18 | }
19 |
20 | return (
21 |
22 |
TODOs App
23 | {
26 | getApp('new');
27 | }}
28 | >
29 | New user
30 |
31 | Already have one?
32 | {
35 | const { target } = e;
36 | getApp('existing', target.value);
37 | }}
38 | placeholder="Paste keys here"
39 | />
40 |
41 | );
42 | }
43 |
--------------------------------------------------------------------------------
/src/components/ListDetailFooter.jsx:
--------------------------------------------------------------------------------
1 | export const ListDetailFooter = ({
2 | activeTodoCount = 0,
3 | nowShowing = 'all',
4 | setNowShowing,
5 | }) => {
6 | return (
7 |
8 |
9 | {activeTodoCount} item(s) left
10 |
11 |
34 |
35 | );
36 | };
37 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const app = express();
3 |
4 | (function () {
5 | var cluster = require('cluster');
6 | if (cluster.isMaster) {
7 | return (
8 | cluster.fork() &&
9 | cluster.on('exit', function () {
10 | cluster.fork();
11 | })
12 | );
13 | }
14 |
15 | var fs = require('fs');
16 | var config = { port: 8765 };
17 | var Gun = require('gun');
18 |
19 | if (process.env.HTTPS_KEY) {
20 | config.key = fs.readFileSync(process.env.HTTPS_KEY);
21 | config.cert = fs.readFileSync(process.env.HTTPS_CERT);
22 | config.server = require('https').createServer(config, Gun.serve(__dirname));
23 | } else {
24 | config.server = require('http').createServer(Gun.serve(__dirname));
25 | }
26 |
27 | var gun = Gun({
28 | web: config.server.listen(8765),
29 | config,
30 | });
31 | console.log('Relay peer started on port ' + 8765 + ' with /gun');
32 |
33 | module.exports = gun;
34 | const listener = app.listen(process.env.PORT || 5151, function () {
35 | console.log('Your app is listening on port ' + listener.address().port);
36 | });
37 | })();
38 |
--------------------------------------------------------------------------------
/src/components/Footer.jsx:
--------------------------------------------------------------------------------
1 | export const Footer = ({
2 | activeListCount = 0,
3 | nowShowing = 'active',
4 | setNowShowing,
5 | }) => {
6 | return (
7 |
8 |
9 | {activeListCount} active list(s)
10 |
11 |
37 |
38 | );
39 | };
40 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-gun-react-app",
3 | "version": "0.2.0",
4 | "homepage": "https://gun-react-todoapp.vercel.app/",
5 | "repository": "https://github.com/alterx/gun-react-todoapp",
6 | "private": true,
7 | "dependencies": {
8 | "@altrx/gundb-react-hooks": "1.0.0-rc3",
9 | "@gun-vue/gun-es": "^0.4.1240",
10 | "@reach/alert-dialog": "^0.18.0",
11 | "@reach/dialog": "^0.18.0",
12 | "clipboard": "^2.0.11",
13 | "gun": "^0.2020.1241",
14 | "react": "^19.1.1",
15 | "react-dom": "^19.1.1",
16 | "react-refresh": "^0.17.0",
17 | "react-router-dom": "^7.8.1"
18 | },
19 | "scripts": {
20 | "start": "vite",
21 | "build": "vite build",
22 | "serve": "vite preview",
23 | "server": "node server.js"
24 | },
25 | "eslintConfig": {
26 | "extends": "react-app"
27 | },
28 | "browserslist": {
29 | "production": [
30 | ">0.2%",
31 | "not dead",
32 | "not op_mini all"
33 | ],
34 | "development": [
35 | "last 1 chrome version",
36 | "last 1 firefox version",
37 | "last 1 safari version"
38 | ]
39 | },
40 | "devDependencies": {
41 | "@vitejs/plugin-react": "^5.0.1",
42 | "express": "^5.1.0",
43 | "vite": "^7.1.3"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Gun TODO list
2 |
3 | This is a TODO list example inspired by https://github.com/thrownness/decentralized-todo-app and built with React + hooks.
4 | This project uses the official TODO MVC CSS [https://github.com/tastejs/todomvc-app-css]
5 |
6 | LIVE DEMO: https://gun-react-todoapp.vercel.app/
7 |
8 | ## License
9 |
10 | Licensed under [MIT](https://github.com/alterx/gun-react-todoapp/blob/master/LICENSE.md).
11 |
12 | ## Available Scripts
13 |
14 | In the project directory, you can run:
15 |
16 | ### `yarn server`
17 |
18 | Runs a local Gun peer ([localhost:5151](http://localhost:5151)).
19 |
20 | ### `yarn start`
21 |
22 | Runs the app in the development mode.
23 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
24 |
25 | The page will reload if you make edits.
26 | You will also see any lint errors in the console.
27 |
28 | ### `yarn build`
29 |
30 | Builds the app for production to the `build` folder.
31 | It correctly bundles React in production mode and optimizes the build for the best performance.
32 |
33 | The build is minified and the filenames include the hashes.
34 | Your app is ready to be deployed!
35 |
36 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
37 |
--------------------------------------------------------------------------------
/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { lazy, Suspense } from 'react';
2 | import { useAuth, AuthProvider } from '@altrx/gundb-react-hooks';
3 | import { Gun, SEA } from '@gun-vue/gun-es';
4 |
5 | const AuthenticatedApp = lazy(() =>
6 | import(/* webpackPrefetch: true */ './AuthenticatedApp')
7 | );
8 |
9 | const AuthedApp = () => {
10 | const { user, isLoggedIn, login } = useAuth();
11 |
12 | return (
13 |
14 | {!isLoggedIn && (
15 |
16 |
TODOs App
17 | {
20 | //getApp('new');
21 | login();
22 | }}
23 | >
24 | New user
25 |
26 |
27 | )}
28 | {isLoggedIn && user &&
}
29 |
30 | );
31 | };
32 |
33 | const App = () => {
34 | return (
35 |
36 | loading...}>
37 |
46 |
47 |
48 |
49 |
50 | );
51 | };
52 |
53 | export default App;
54 |
--------------------------------------------------------------------------------
/src/utils/shared-resource.js:
--------------------------------------------------------------------------------
1 | export const getHash = async (
2 | data,
3 | sea,
4 | max = 12,
5 | name = 'SHA-1',
6 | salt = null
7 | ) => {
8 | const message = await sea.work(data, salt, null, {
9 | name,
10 | encode: 'hex',
11 | });
12 | return message.slice(0, max);
13 | };
14 |
15 | export const createSharedResource = async (newGunInstance, sea) => {
16 | const keys = await sea.pair();
17 | const sharedKeyString = JSON.stringify(keys);
18 | let keyId = await getHash(sharedKeyString, sea);
19 | const nodeID = `${keyId}`;
20 | return new Promise(async (resolve) => {
21 | const newGun = newGunInstance({
22 | peers: ['http://localhost:8765/gun'],
23 | localStorage: false,
24 | radisk: true,
25 | file: nodeID,
26 | });
27 |
28 | newGun.on('auth', () => {
29 | // TODO: workaround while https://github.com/amark/gun/issues/937 is fixed
30 | // should not need a function
31 | const node = () => namespace.get(nodeID);
32 |
33 | resolve({
34 | node,
35 | shareKeys: {
36 | keyId,
37 | sharedKeyString,
38 | nodeID,
39 | },
40 | keys,
41 | });
42 | });
43 |
44 | const namespace = newGun.user();
45 | namespace.auth(keys);
46 | });
47 | };
48 |
49 | export const openSharedResource = async (nodeID, newGunInstance, keys, pub) => {
50 | return new Promise((resolve) => {
51 | const newGun = newGunInstance({
52 | peers: ['http://localhost:8765/gun'],
53 | localStorage: false,
54 | radisk: true,
55 | file: nodeID,
56 | });
57 | let namespace;
58 |
59 | if (keys) {
60 | newGun.on('auth', () => {
61 | // TODO: workaround while https://github.com/amark/gun/issues/937 is fixed
62 | // should not need a function
63 | const node = () => namespace.get(nodeID);
64 | resolve(node);
65 | });
66 | namespace = newGun.user();
67 | namespace.auth(keys);
68 | } else {
69 | namespace = newGun.get(pub);
70 | const node = () => namespace.get(nodeID);
71 | resolve(node);
72 | }
73 | });
74 | };
75 |
--------------------------------------------------------------------------------
/src/components/ShareModal.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef } from 'react';
2 | import {
3 | AlertDialog,
4 | AlertDialogLabel,
5 | AlertDialogDescription,
6 | } from '@reach/alert-dialog';
7 | import '@reach/dialog/styles.css';
8 |
9 | export const ShareModal = ({ showDialog, setShowDialog, onDismiss }) => {
10 | const [passphrase, setPassphrase] = useState('');
11 | const [readOnly, setReadOnly] = useState('readonly');
12 | const cancelRef = useRef();
13 |
14 | const onClose = (result) => {
15 | if (result === 'success') {
16 | onDismiss(passphrase, readOnly === 'readonly');
17 | }
18 | setShowDialog(false);
19 | };
20 |
21 | return (
22 |
23 | {showDialog && (
24 |
onClose('success')}
26 | leastDestructiveRef={cancelRef}
27 | >
28 |
29 | Sharing
30 |
31 |
32 | Choose wheter you want to share this list as read-only or with fully
33 | fledged read/write privileges:{' '}
34 | {
36 | setReadOnly(event.target.value);
37 | }}
38 | value={readOnly}
39 | >
40 | Read-only
41 | Full access
42 |
43 |
44 |
45 | Then enter a passphrase (and memorize it!):{' '}
46 | {
48 | setPassphrase(event.target.value);
49 | }}
50 | value={passphrase}
51 | type="text"
52 | />
53 |
54 |
55 | Anyone with this link will also need to know this passphrase to open
56 | it.
57 |
58 |
59 |
60 | onClose('success')}>Generate URL {' '}
61 | onClose('canceled')}>
62 | Cancel
63 |
64 |
65 |
66 | )}
67 |
68 | );
69 | };
70 |
--------------------------------------------------------------------------------
/src/views/ProfileView.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import { Link, useNavigate } from 'react-router-dom';
3 | import ClipboardJS from 'clipboard';
4 | import { useAuth } from '@altrx/gundb-react-hooks';
5 | import { useGunState } from '@altrx/gundb-react-hooks';
6 |
7 | export const ProfileView = () => {
8 | const { appKeys, sea, user, logout } = useAuth();
9 | const [clipboard, setClipboard] = useState(null);
10 | let navigate = useNavigate();
11 | const appName = 'todomvc';
12 | const { fields: profile, put } = useGunState(
13 | user.get(appName).get('profile'),
14 | { appKeys, sea }
15 | );
16 | const { name = '' } = profile;
17 | const [nameValue, setNameValue] = useState(name);
18 |
19 | useEffect(() => {
20 | if (nameValue && nameValue !== name) {
21 | put({ name: nameValue });
22 | }
23 | }, [nameValue]);
24 |
25 | useEffect(() => {
26 | if (name && nameValue !== name) {
27 | setNameValue(name);
28 | }
29 | }, [name]);
30 |
31 | useEffect(() => {
32 | if (!clipboard) {
33 | setClipboard(new ClipboardJS('.btn'));
34 | }
35 | return () => {
36 | if (clipboard) {
37 | clipboard.destroy();
38 | }
39 | };
40 | }, [clipboard]);
41 |
42 | return (
43 |
44 |
45 |
46 |
47 |
My Profile
48 |
{
51 | setNameValue(e.target.value);
52 | }}
53 | />
54 |
55 | These are your private keys, you can use them to log into other devices,{' '}
56 | DO NOT SHARE THEM .
57 |
58 |
67 |
68 | Copy to clipboard
69 |
70 |
{
72 | logout(() => {
73 | navigate('/');
74 | window.location.reload();
75 | });
76 | }}
77 | >
78 | Logout
79 |
80 |
81 | );
82 | };
83 |
--------------------------------------------------------------------------------
/src/components/TodoList.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 |
3 | const ReadOnlyTodoItem = ({ todo }) => {
4 | const { text, lastUpdated, nodeID, status } = todo;
5 | let classes = status === 'completed' ? status : '';
6 |
7 | return (
8 |
9 |
10 |
17 |
18 | {text} [Updated At: {lastUpdated}]
19 |
20 |
21 |
22 | );
23 | };
24 |
25 | const TodoItem = ({ todo, removeTodo, changeStatus, updateTodo }) => {
26 | const { text, lastUpdated, nodeID, status } = todo;
27 | const [isEditing, setIsEditing] = useState(false);
28 | const [newText, setNewText] = useState(text);
29 | let classes = status === 'completed' ? status : '';
30 | classes += isEditing ? 'editing' : '';
31 |
32 | return (
33 |
34 |
35 | changeStatus(todo)}
40 | />
41 | setIsEditing(true)}>
42 | {text} [Updated At: {lastUpdated}]
43 |
44 | removeTodo(todo)} />
45 |
46 | {
50 | setNewText(e.target.value);
51 | }}
52 | onBlur={() => {
53 | updateTodo({ ...todo, text: newText });
54 | setIsEditing(false);
55 | }}
56 | />
57 |
58 | );
59 | };
60 |
61 | export const TodoList = ({
62 | todos = [],
63 | removeTodo,
64 | changeStatus,
65 | updateTodo,
66 | readOnly,
67 | }) => {
68 | const Item = readOnly ? ReadOnlyTodoItem : TodoItem;
69 | return (
70 |
71 | {todos.map((todo) => (
72 |
80 | ))}
81 |
82 | );
83 | };
84 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/views/MainView.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import { useNavigate } from 'react-router-dom';
3 | import { useGunCollectionState } from '@altrx/gundb-react-hooks';
4 | import { useAuth } from '@altrx/gundb-react-hooks';
5 | import { Footer } from '../components/Footer';
6 |
7 | export const MainView = () => {
8 | const { appKeys, user, sea } = useAuth();
9 | const appName = 'todomvc';
10 | let navigate = useNavigate();
11 | let { items, updateInSet } = useGunCollectionState(
12 | user.get(appName).get('todolists'),
13 | {
14 | appKeys,
15 | sea,
16 | }
17 | );
18 |
19 | const [nowShowing, setNowShowing] = useState('active');
20 |
21 | const changeStatus = async (list, status) => {
22 | const { nodeID } = list;
23 | await updateInSet(nodeID, { ...list, status });
24 | };
25 |
26 | let activeListCount = items.filter(
27 | ({ status }) => status === 'active'
28 | ).length;
29 |
30 | items = items.filter(({ status }) => status === nowShowing);
31 |
32 | return (
33 |
34 |
{
37 | navigate('/detail');
38 | }}
39 | >
40 | Create List
41 |
42 |
43 |
{
46 | navigate('/profile');
47 | }}
48 | >
49 | View profile
50 |
51 |
My Lists
52 |
53 | {items.map((list) => (
54 | {
58 | const path = `/detail?listID=${encodeURIComponent(list.id)}`;
59 | navigate(path);
60 | }}
61 | >
62 | {list.name}
63 | {
66 | e.stopPropagation();
67 | changeStatus(
68 | list,
69 | list.status !== 'archived' ? 'archived' : 'active'
70 | );
71 | }}
72 | >
73 | {list.status === 'active' && }
74 | {list.status === 'archived' && }
75 |
76 |
77 | ))}
78 |
79 |
84 |
85 | );
86 | };
87 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | .todoapp {
2 | z-index: 0;
3 | }
4 |
5 | .todoapp h2 {
6 | position: relative;
7 | width: 100%;
8 | font-size: 32px;
9 | font-weight: 200;
10 | text-align: center;
11 | color: #b83f45;
12 | margin: 0;
13 | padding: 20px 0;
14 | -webkit-text-rendering: optimizeLegibility;
15 | -moz-text-rendering: optimizeLegibility;
16 | text-rendering: optimizeLegibility;
17 | }
18 |
19 | button.back {
20 | padding: 20px;
21 | }
22 | .todoapp h2 {
23 | position: relative;
24 | width: 100%;
25 | font-size: 24px;
26 | font-weight: 200;
27 | text-align: center;
28 | color: #b83f45;
29 | margin: 0;
30 | padding: 20px 0;
31 | -webkit-text-rendering: optimizeLegibility;
32 | -moz-text-rendering: optimizeLegibility;
33 | text-rendering: optimizeLegibility;
34 | }
35 |
36 | button.back {
37 | padding: 20px;
38 | cursor: pointer;
39 | }
40 |
41 | button.new-list {
42 | cursor: pointer;
43 | position: relative;
44 | width: calc(100% - 60px);
45 | font-size: 32px;
46 | font-weight: 200;
47 | text-align: center;
48 | color: #b83f45;
49 | margin: 0;
50 | padding: 20px 0;
51 | -webkit-text-rendering: optimizeLegibility;
52 | -moz-text-rendering: optimizeLegibility;
53 | text-rendering: optimizeLegibility;
54 | border-bottom: 1px solid;
55 | margin: 0 30px;
56 | }
57 |
58 | small {
59 | color: #a6a6a6;
60 | font-size: 12px;
61 | }
62 |
63 | button {
64 | cursor: pointer;
65 | }
66 |
67 | .profile {
68 | padding: 5px 10px;
69 | padding-bottom: 20px;
70 | }
71 |
72 | .profile pre {
73 | width: '100%';
74 | }
75 |
76 | .todo-list-detail {
77 | border-top: 1px solid transparent;
78 | margin: 0;
79 | }
80 |
81 | .todo-list-detail h1 {
82 | top: 0;
83 | position: relative;
84 | }
85 |
86 | .todo-list li a {
87 | text-decoration: none;
88 | color: inherit;
89 | }
90 |
91 | .todo-list li i {
92 | cursor: pointer;
93 | }
94 |
95 | .todo-list li .archive {
96 | display: none;
97 | position: absolute;
98 | top: 0;
99 | right: 10px;
100 | bottom: 0;
101 | width: 40px;
102 | height: 40px;
103 | margin: auto 0;
104 | font-size: 30px;
105 | color: #cc9a9a;
106 | margin-bottom: 11px;
107 | transition: color 0.2s ease-out;
108 | }
109 |
110 | .todo-list li:hover .archive {
111 | display: block;
112 | }
113 |
114 | .lists li label {
115 | text-align: center;
116 | padding: 15px;
117 | cursor: pointer;
118 | }
119 |
120 | .share-box {
121 | border-top: 1px solid #b83f456b;
122 | margin-top: 0;
123 | padding: 20px 20px 20px 15px;
124 | }
125 |
126 | .new-todo.link {
127 | padding: 20px;
128 | font-size: 18px;
129 | color: #000;
130 | }
131 |
132 | .copy-btn {
133 | margin: 20px auto 0px auto;
134 | display: block;
135 | }
136 |
137 | a i {
138 | margin-left: 15px;
139 | margin-top: 15px;
140 | color: #b83f45;
141 | }
142 |
--------------------------------------------------------------------------------
/src/views/DetailView.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState, useCallback, useMemo } from 'react';
2 | import { useSearchParams, useNavigate } from 'react-router-dom';
3 | import { useGunCollectionState } from '@altrx/gundb-react-hooks';
4 | import { useAuth } from '@altrx/gundb-react-hooks';
5 | import {
6 | openSharedResource,
7 | createSharedResource,
8 | } from '../utils/shared-resource.js';
9 | import { ListDetail } from '../components/ListDetail';
10 |
11 | export const DetailView = () => {
12 | const { appKeys, user, sea, newGunInstance } = useAuth();
13 | let [searchParams] = useSearchParams();
14 | const lId = searchParams.get('listID');
15 | const listID = lId ? decodeURIComponent(lId) : null;
16 | let navigate = useNavigate();
17 | // Profile information
18 | const appName = 'todomvc';
19 | const {
20 | collection: todolists,
21 | addToSet,
22 | updateInSet,
23 | } = useGunCollectionState(user.get(appName).get('todolists'), {
24 | appKeys,
25 | sea,
26 | });
27 |
28 | // Shared Resource
29 | const [{ node }, setSharedResource] = useState({});
30 | const [listReady, setListReady] = useState(false);
31 | const [currentList, setCurrentList] = useState(null);
32 |
33 | // Memoize sharedTodos to prevent infinite re-renders
34 | const sharedTodos = useMemo(() => {
35 | return Array.from(todolists.values()).reduce((arr, item) => {
36 | const { id } = item;
37 | arr[id] = item;
38 | return arr;
39 | }, {});
40 | }, [todolists]);
41 |
42 | const loadList = useCallback(
43 | async (list) => {
44 | const { id, keys, pub } = list;
45 | const node = await openSharedResource(id, newGunInstance, keys, pub);
46 | setSharedResource({ node: node() });
47 | setCurrentList(list);
48 | },
49 | [newGunInstance]
50 | );
51 |
52 | const createNewList = useCallback(async () => {
53 | const newResource = await createSharedResource(newGunInstance, sea);
54 | const { shareKeys, keys } = newResource;
55 | const { nodeID } = shareKeys;
56 | const list = {
57 | name: '',
58 | id: nodeID,
59 | keys,
60 | status: 'active',
61 | encryptionKey: sea.random(16).toString(),
62 | pub: `~${keys.pub}`,
63 | };
64 | loadList(list);
65 | }, [sea, loadList, newGunInstance]);
66 |
67 | const addNewSharedList = useCallback(
68 | async (listID, encodedKeys, passphrase) => {
69 | try {
70 | const decoded = decodeURI(encodedKeys);
71 | const { sharedList } = JSON.parse(decoded);
72 | const listData = await sea.decrypt(sharedList, passphrase);
73 | const { keys, name, encryptionKey, pub } = listData;
74 | window.location.hash = '';
75 | const list = {
76 | name,
77 | id: listID,
78 | keys,
79 | encryptionKey,
80 | pub,
81 | status: keys ? 'active' : 'readonly',
82 | readOnly: !keys,
83 | };
84 | addToSet(list);
85 | loadList(list);
86 | } catch (e) {
87 | alert(
88 | "failed to add new list, it seems like you don't have access or the passphrase is incorrect."
89 | );
90 | }
91 | },
92 | [sea, addToSet, loadList]
93 | );
94 |
95 | useEffect(() => {
96 | if (!listReady) {
97 | if (listID) {
98 | let sharedList;
99 | const fullId = listID;
100 | let passphrase;
101 | const hash = window.location.hash;
102 | if (hash.indexOf('share=') !== -1) {
103 | sharedList = hash.split('#share=')[1];
104 | passphrase = prompt(
105 | 'Please enter the passphrase in order to add this list to your profile.'
106 | );
107 | }
108 | if (sharedList && !sharedTodos[fullId]) {
109 | addNewSharedList(fullId, sharedList, passphrase);
110 | setListReady(true);
111 | } else {
112 | let list = sharedTodos[fullId];
113 | if (list) {
114 | loadList(list);
115 | setListReady(true);
116 | }
117 | }
118 | } else {
119 | createNewList();
120 | setListReady(true);
121 | }
122 | }
123 | }, [
124 | listID,
125 | listReady,
126 | sharedTodos,
127 | addNewSharedList,
128 | createNewList,
129 | loadList,
130 | ]);
131 |
132 | const updateListName = (name) => {
133 | const todolist = sharedTodos[currentList.id];
134 | if (todolist) {
135 | updateInSet(todolist.nodeID, { ...currentList, name });
136 | setCurrentList(todolist);
137 | } else {
138 | addToSet({ ...currentList, name });
139 | const path = `/detail?listID=${encodeURIComponent(currentList.id)}`;
140 | navigate(path);
141 | }
142 | };
143 |
144 | return (
145 |
146 | {currentList && (
147 |
154 | )}
155 |
156 | );
157 | };
158 |
--------------------------------------------------------------------------------
/src/components/ListDetail.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import { Link } from 'react-router-dom';
3 | import ClipboardJS from 'clipboard';
4 | import { useGunState, useGunCollectionState } from '@altrx/gundb-react-hooks';
5 | import { TodoList } from './TodoList';
6 | import { ListDetailFooter } from './ListDetailFooter';
7 | import { ListHeader } from './ListHeader';
8 | import { ShareModal } from './ShareModal';
9 |
10 | export const ListDetail = ({
11 | node,
12 | sea,
13 | updateListName,
14 | sharedResourceRootNodeName,
15 | currentList,
16 | }) => {
17 | const baseURL =
18 | process.env.NODE_ENV === 'production'
19 | ? 'https://gun-react-todoapp.vercel.app'
20 | : 'http://localhost:3000';
21 | const [nowShowing, setNowShowing] = useState('all');
22 | const [currentShareLink, setCurrentShareLink] = useState('');
23 | const [newTodo, setNewTodo] = useState('');
24 | const [showLink, setShowLink] = useState(false);
25 | const [clipboard, setClipboard] = useState(null);
26 | const { encryptionKey } = currentList;
27 | const [showShareDialog, setShowShareDialog] = useState(false);
28 | const { fields: profile, put } = useGunState(
29 | node.get(sharedResourceRootNodeName).get('profile'),
30 | { appKeys: encryptionKey, sea }
31 | );
32 | const {
33 | collection: todos,
34 | addToSet,
35 | updateInSet,
36 | removeFromSet,
37 | } = useGunCollectionState(node.get(sharedResourceRootNodeName).get('todos'), {
38 | appKeys: encryptionKey,
39 | sea,
40 | });
41 | const { name } = profile;
42 |
43 | useEffect(() => {
44 | if (!clipboard) {
45 | setClipboard(new ClipboardJS('.btn'));
46 | }
47 | return () => {
48 | if (clipboard) {
49 | clipboard.destroy();
50 | }
51 | };
52 | }, [clipboard]);
53 |
54 | const changeStatus = async (todo) => {
55 | const { status, text, nodeID } = todo;
56 | let newStatus = status === 'completed' ? 'active' : 'completed';
57 | var data = {
58 | text,
59 | status: newStatus,
60 | lastUpdated: new Date().toISOString(),
61 | };
62 | updateInSet(nodeID, data);
63 | };
64 |
65 | const updateTodo = async (todo) => {
66 | const { status, text, nodeID } = todo;
67 | var data = {
68 | status,
69 | text,
70 | lastUpdated: new Date().toISOString(),
71 | };
72 | updateInSet(nodeID, data);
73 | };
74 |
75 | const addTodo = async (text) => {
76 | let data = {
77 | text,
78 | lastUpdated: new Date().toISOString(),
79 | status: 'active',
80 | };
81 | addToSet(data);
82 | setNewTodo('');
83 | };
84 |
85 | const removeTodo = ({ nodeID }) => {
86 | removeFromSet(nodeID);
87 | };
88 |
89 | const updateName = async (name) => {
90 | await put({ name });
91 | updateListName(name);
92 | };
93 |
94 | const shareUrl = async (passphrase, readOnly = true) => {
95 | if (!passphrase) {
96 | return;
97 | }
98 | if (!showLink) {
99 | let { id, keys, name, encryptionKey, pub } = currentList;
100 | let unencryptedSharedKeys;
101 |
102 | if (readOnly) {
103 | unencryptedSharedKeys = { name, encryptionKey, pub };
104 | } else {
105 | unencryptedSharedKeys = { keys, name, encryptionKey };
106 | }
107 |
108 | const sharedKeys = await sea.encrypt(unencryptedSharedKeys, passphrase);
109 | const shareString = JSON.stringify({ sharedList: sharedKeys });
110 | const shareUrl = `${baseURL}/detail?listID=${id}#share=${encodeURI(
111 | shareString
112 | )}`;
113 |
114 | console.log(`Share URL: ${shareUrl} | Passhphrase: ${passphrase}`);
115 | setCurrentShareLink(shareUrl);
116 | } else {
117 | setCurrentShareLink('');
118 | }
119 | setShowLink(!showLink);
120 | };
121 |
122 | let todoList = Array.from(todos.values());
123 | let activeTodoListCount = todoList.filter(
124 | ({ status }) => status === 'active'
125 | ).length;
126 |
127 | if (nowShowing !== 'all') {
128 | todoList = todoList.filter(({ status }) => status === nowShowing);
129 | }
130 |
131 | return (
132 |
133 |
134 |
135 |
136 |
137 |
145 |
155 | {!currentList?.readOnly && (
156 |
189 | )}
190 |
196 |
197 | );
198 | };
199 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | '@altrx/gundb-react-hooks':
12 | specifier: 1.0.0-rc3
13 | version: 1.0.0-rc3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
14 | '@gun-vue/gun-es':
15 | specifier: ^0.4.1240
16 | version: 0.4.1240
17 | '@reach/alert-dialog':
18 | specifier: ^0.18.0
19 | version: 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
20 | '@reach/dialog':
21 | specifier: ^0.18.0
22 | version: 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
23 | clipboard:
24 | specifier: ^2.0.11
25 | version: 2.0.11
26 | gun:
27 | specifier: ^0.2020.1241
28 | version: 0.2020.1241
29 | react:
30 | specifier: ^19.1.1
31 | version: 19.1.1
32 | react-dom:
33 | specifier: ^19.1.1
34 | version: 19.1.1(react@19.1.1)
35 | react-refresh:
36 | specifier: ^0.17.0
37 | version: 0.17.0
38 | react-router-dom:
39 | specifier: ^7.8.1
40 | version: 7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
41 | devDependencies:
42 | '@vitejs/plugin-react':
43 | specifier: ^5.0.1
44 | version: 5.0.1(vite@7.1.3)
45 | express:
46 | specifier: ^5.1.0
47 | version: 5.1.0
48 | vite:
49 | specifier: ^7.1.3
50 | version: 7.1.3
51 |
52 | packages:
53 |
54 | '@altrx/gundb-react-hooks@1.0.0-rc3':
55 | resolution: {integrity: sha512-Hbtd9XVpz+Gufymi3zq0FDU0NXrYkfHZoAfKyyp4DDQfjIJRQsfomYI1Y+DamCEjQ9rMoi985bxTt533QBMpjQ==}
56 | peerDependencies:
57 | react: '>=16.12.0'
58 | react-dom: '>=16.12.0'
59 |
60 | '@ampproject/remapping@2.3.0':
61 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
62 | engines: {node: '>=6.0.0'}
63 |
64 | '@babel/code-frame@7.27.1':
65 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
66 | engines: {node: '>=6.9.0'}
67 |
68 | '@babel/compat-data@7.28.0':
69 | resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==}
70 | engines: {node: '>=6.9.0'}
71 |
72 | '@babel/core@7.28.3':
73 | resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==}
74 | engines: {node: '>=6.9.0'}
75 |
76 | '@babel/generator@7.28.3':
77 | resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
78 | engines: {node: '>=6.9.0'}
79 |
80 | '@babel/helper-compilation-targets@7.27.2':
81 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
82 | engines: {node: '>=6.9.0'}
83 |
84 | '@babel/helper-globals@7.28.0':
85 | resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
86 | engines: {node: '>=6.9.0'}
87 |
88 | '@babel/helper-module-imports@7.27.1':
89 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
90 | engines: {node: '>=6.9.0'}
91 |
92 | '@babel/helper-module-transforms@7.28.3':
93 | resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
94 | engines: {node: '>=6.9.0'}
95 | peerDependencies:
96 | '@babel/core': ^7.0.0
97 |
98 | '@babel/helper-plugin-utils@7.27.1':
99 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
100 | engines: {node: '>=6.9.0'}
101 |
102 | '@babel/helper-string-parser@7.27.1':
103 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
104 | engines: {node: '>=6.9.0'}
105 |
106 | '@babel/helper-validator-identifier@7.27.1':
107 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
108 | engines: {node: '>=6.9.0'}
109 |
110 | '@babel/helper-validator-option@7.27.1':
111 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
112 | engines: {node: '>=6.9.0'}
113 |
114 | '@babel/helpers@7.28.3':
115 | resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==}
116 | engines: {node: '>=6.9.0'}
117 |
118 | '@babel/parser@7.28.3':
119 | resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==}
120 | engines: {node: '>=6.0.0'}
121 | hasBin: true
122 |
123 | '@babel/plugin-transform-react-jsx-self@7.27.1':
124 | resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
125 | engines: {node: '>=6.9.0'}
126 | peerDependencies:
127 | '@babel/core': ^7.0.0-0
128 |
129 | '@babel/plugin-transform-react-jsx-source@7.27.1':
130 | resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
131 | engines: {node: '>=6.9.0'}
132 | peerDependencies:
133 | '@babel/core': ^7.0.0-0
134 |
135 | '@babel/runtime@7.28.3':
136 | resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==}
137 | engines: {node: '>=6.9.0'}
138 |
139 | '@babel/template@7.27.2':
140 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
141 | engines: {node: '>=6.9.0'}
142 |
143 | '@babel/traverse@7.28.3':
144 | resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==}
145 | engines: {node: '>=6.9.0'}
146 |
147 | '@babel/types@7.28.2':
148 | resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
149 | engines: {node: '>=6.9.0'}
150 |
151 | '@esbuild/aix-ppc64@0.25.9':
152 | resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
153 | engines: {node: '>=18'}
154 | cpu: [ppc64]
155 | os: [aix]
156 |
157 | '@esbuild/android-arm64@0.25.9':
158 | resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
159 | engines: {node: '>=18'}
160 | cpu: [arm64]
161 | os: [android]
162 |
163 | '@esbuild/android-arm@0.25.9':
164 | resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
165 | engines: {node: '>=18'}
166 | cpu: [arm]
167 | os: [android]
168 |
169 | '@esbuild/android-x64@0.25.9':
170 | resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
171 | engines: {node: '>=18'}
172 | cpu: [x64]
173 | os: [android]
174 |
175 | '@esbuild/darwin-arm64@0.25.9':
176 | resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
177 | engines: {node: '>=18'}
178 | cpu: [arm64]
179 | os: [darwin]
180 |
181 | '@esbuild/darwin-x64@0.25.9':
182 | resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
183 | engines: {node: '>=18'}
184 | cpu: [x64]
185 | os: [darwin]
186 |
187 | '@esbuild/freebsd-arm64@0.25.9':
188 | resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
189 | engines: {node: '>=18'}
190 | cpu: [arm64]
191 | os: [freebsd]
192 |
193 | '@esbuild/freebsd-x64@0.25.9':
194 | resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
195 | engines: {node: '>=18'}
196 | cpu: [x64]
197 | os: [freebsd]
198 |
199 | '@esbuild/linux-arm64@0.25.9':
200 | resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
201 | engines: {node: '>=18'}
202 | cpu: [arm64]
203 | os: [linux]
204 |
205 | '@esbuild/linux-arm@0.25.9':
206 | resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
207 | engines: {node: '>=18'}
208 | cpu: [arm]
209 | os: [linux]
210 |
211 | '@esbuild/linux-ia32@0.25.9':
212 | resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
213 | engines: {node: '>=18'}
214 | cpu: [ia32]
215 | os: [linux]
216 |
217 | '@esbuild/linux-loong64@0.25.9':
218 | resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
219 | engines: {node: '>=18'}
220 | cpu: [loong64]
221 | os: [linux]
222 |
223 | '@esbuild/linux-mips64el@0.25.9':
224 | resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
225 | engines: {node: '>=18'}
226 | cpu: [mips64el]
227 | os: [linux]
228 |
229 | '@esbuild/linux-ppc64@0.25.9':
230 | resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
231 | engines: {node: '>=18'}
232 | cpu: [ppc64]
233 | os: [linux]
234 |
235 | '@esbuild/linux-riscv64@0.25.9':
236 | resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
237 | engines: {node: '>=18'}
238 | cpu: [riscv64]
239 | os: [linux]
240 |
241 | '@esbuild/linux-s390x@0.25.9':
242 | resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
243 | engines: {node: '>=18'}
244 | cpu: [s390x]
245 | os: [linux]
246 |
247 | '@esbuild/linux-x64@0.25.9':
248 | resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
249 | engines: {node: '>=18'}
250 | cpu: [x64]
251 | os: [linux]
252 |
253 | '@esbuild/netbsd-arm64@0.25.9':
254 | resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
255 | engines: {node: '>=18'}
256 | cpu: [arm64]
257 | os: [netbsd]
258 |
259 | '@esbuild/netbsd-x64@0.25.9':
260 | resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
261 | engines: {node: '>=18'}
262 | cpu: [x64]
263 | os: [netbsd]
264 |
265 | '@esbuild/openbsd-arm64@0.25.9':
266 | resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
267 | engines: {node: '>=18'}
268 | cpu: [arm64]
269 | os: [openbsd]
270 |
271 | '@esbuild/openbsd-x64@0.25.9':
272 | resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
273 | engines: {node: '>=18'}
274 | cpu: [x64]
275 | os: [openbsd]
276 |
277 | '@esbuild/openharmony-arm64@0.25.9':
278 | resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
279 | engines: {node: '>=18'}
280 | cpu: [arm64]
281 | os: [openharmony]
282 |
283 | '@esbuild/sunos-x64@0.25.9':
284 | resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
285 | engines: {node: '>=18'}
286 | cpu: [x64]
287 | os: [sunos]
288 |
289 | '@esbuild/win32-arm64@0.25.9':
290 | resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
291 | engines: {node: '>=18'}
292 | cpu: [arm64]
293 | os: [win32]
294 |
295 | '@esbuild/win32-ia32@0.25.9':
296 | resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
297 | engines: {node: '>=18'}
298 | cpu: [ia32]
299 | os: [win32]
300 |
301 | '@esbuild/win32-x64@0.25.9':
302 | resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
303 | engines: {node: '>=18'}
304 | cpu: [x64]
305 | os: [win32]
306 |
307 | '@gun-vue/gun-es@0.4.1240':
308 | resolution: {integrity: sha512-FxjVDWE1V2MjBuHv6OAwW8Izd0ERKm75CBIotwKZwnxQsho2hVEaVV6OTE2chtMtvhFF6FaqG4cGsFuHIRS24w==}
309 |
310 | '@jridgewell/gen-mapping@0.3.13':
311 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
312 |
313 | '@jridgewell/resolve-uri@3.1.2':
314 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
315 | engines: {node: '>=6.0.0'}
316 |
317 | '@jridgewell/sourcemap-codec@1.5.5':
318 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
319 |
320 | '@jridgewell/trace-mapping@0.3.30':
321 | resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
322 |
323 | '@noble/curves@1.9.0':
324 | resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==}
325 | engines: {node: ^14.21.3 || >=16}
326 |
327 | '@noble/hashes@1.8.0':
328 | resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
329 | engines: {node: ^14.21.3 || >=16}
330 |
331 | '@peculiar/asn1-schema@2.4.0':
332 | resolution: {integrity: sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==}
333 |
334 | '@peculiar/json-schema@1.1.12':
335 | resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==}
336 | engines: {node: '>=8.0.0'}
337 |
338 | '@peculiar/webcrypto@1.5.0':
339 | resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==}
340 | engines: {node: '>=10.12.0'}
341 |
342 | '@reach/alert-dialog@0.18.0':
343 | resolution: {integrity: sha512-F37h9LzqiCO8jUUfMFr+lG5VCbaVlGYQWuwiUoOqoI9oNMjrz0dQdmpqzXoK44TPyyvF8ad8S1OvRG5oK7bvzw==}
344 | peerDependencies:
345 | react: ^16.8.0 || 17.x
346 | react-dom: ^16.8.0 || 17.x
347 |
348 | '@reach/auto-id@0.18.0':
349 | resolution: {integrity: sha512-XwY1IwhM7mkHZFghhjiqjQ6dstbOdpbFLdggeke75u8/8icT8uEHLbovFUgzKjy9qPvYwZIB87rLiR8WdtOXCg==}
350 | peerDependencies:
351 | react: ^16.8.0 || 17.x
352 | react-dom: ^16.8.0 || 17.x
353 |
354 | '@reach/dialog@0.18.0':
355 | resolution: {integrity: sha512-hWhzmBK8VJj+yf6OivFqHFZIV4q9TISZrkPaglKE5oFYtrr75lxWjrBTA+BshL0r/FfKodvNtdT8yq4vj/6Gcw==}
356 | peerDependencies:
357 | react: ^16.8.0 || 17.x
358 | react-dom: ^16.8.0 || 17.x
359 |
360 | '@reach/polymorphic@0.18.0':
361 | resolution: {integrity: sha512-N9iAjdMbE//6rryZZxAPLRorzDcGBnluf7YQij6XDLiMtfCj1noa7KyLpEc/5XCIB/EwhX3zCluFAwloBKdblA==}
362 | peerDependencies:
363 | react: ^16.8.0 || 17.x
364 |
365 | '@reach/portal@0.18.0':
366 | resolution: {integrity: sha512-TImozRapd576ofRk30Le2L3lRTFXF1p47B182wnp5eMTdZa74JX138BtNGEPJFOyrMaVmguVF8SSwZ6a0fon1Q==}
367 | peerDependencies:
368 | react: ^16.8.0 || 17.x
369 | react-dom: ^16.8.0 || 17.x
370 |
371 | '@reach/utils@0.18.0':
372 | resolution: {integrity: sha512-KdVMdpTgDyK8FzdKO9SCpiibuy/kbv3pwgfXshTI6tEcQT1OOwj7BAksnzGC0rPz0UholwC+AgkqEl3EJX3M1A==}
373 | peerDependencies:
374 | react: ^16.8.0 || 17.x
375 | react-dom: ^16.8.0 || 17.x
376 |
377 | '@rolldown/pluginutils@1.0.0-beta.32':
378 | resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==}
379 |
380 | '@rollup/rollup-android-arm-eabi@4.47.1':
381 | resolution: {integrity: sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==}
382 | cpu: [arm]
383 | os: [android]
384 |
385 | '@rollup/rollup-android-arm64@4.47.1':
386 | resolution: {integrity: sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==}
387 | cpu: [arm64]
388 | os: [android]
389 |
390 | '@rollup/rollup-darwin-arm64@4.47.1':
391 | resolution: {integrity: sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==}
392 | cpu: [arm64]
393 | os: [darwin]
394 |
395 | '@rollup/rollup-darwin-x64@4.47.1':
396 | resolution: {integrity: sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==}
397 | cpu: [x64]
398 | os: [darwin]
399 |
400 | '@rollup/rollup-freebsd-arm64@4.47.1':
401 | resolution: {integrity: sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==}
402 | cpu: [arm64]
403 | os: [freebsd]
404 |
405 | '@rollup/rollup-freebsd-x64@4.47.1':
406 | resolution: {integrity: sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==}
407 | cpu: [x64]
408 | os: [freebsd]
409 |
410 | '@rollup/rollup-linux-arm-gnueabihf@4.47.1':
411 | resolution: {integrity: sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==}
412 | cpu: [arm]
413 | os: [linux]
414 |
415 | '@rollup/rollup-linux-arm-musleabihf@4.47.1':
416 | resolution: {integrity: sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==}
417 | cpu: [arm]
418 | os: [linux]
419 |
420 | '@rollup/rollup-linux-arm64-gnu@4.47.1':
421 | resolution: {integrity: sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==}
422 | cpu: [arm64]
423 | os: [linux]
424 |
425 | '@rollup/rollup-linux-arm64-musl@4.47.1':
426 | resolution: {integrity: sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==}
427 | cpu: [arm64]
428 | os: [linux]
429 |
430 | '@rollup/rollup-linux-loongarch64-gnu@4.47.1':
431 | resolution: {integrity: sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==}
432 | cpu: [loong64]
433 | os: [linux]
434 |
435 | '@rollup/rollup-linux-ppc64-gnu@4.47.1':
436 | resolution: {integrity: sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==}
437 | cpu: [ppc64]
438 | os: [linux]
439 |
440 | '@rollup/rollup-linux-riscv64-gnu@4.47.1':
441 | resolution: {integrity: sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==}
442 | cpu: [riscv64]
443 | os: [linux]
444 |
445 | '@rollup/rollup-linux-riscv64-musl@4.47.1':
446 | resolution: {integrity: sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==}
447 | cpu: [riscv64]
448 | os: [linux]
449 |
450 | '@rollup/rollup-linux-s390x-gnu@4.47.1':
451 | resolution: {integrity: sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==}
452 | cpu: [s390x]
453 | os: [linux]
454 |
455 | '@rollup/rollup-linux-x64-gnu@4.47.1':
456 | resolution: {integrity: sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==}
457 | cpu: [x64]
458 | os: [linux]
459 |
460 | '@rollup/rollup-linux-x64-musl@4.47.1':
461 | resolution: {integrity: sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==}
462 | cpu: [x64]
463 | os: [linux]
464 |
465 | '@rollup/rollup-win32-arm64-msvc@4.47.1':
466 | resolution: {integrity: sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==}
467 | cpu: [arm64]
468 | os: [win32]
469 |
470 | '@rollup/rollup-win32-ia32-msvc@4.47.1':
471 | resolution: {integrity: sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==}
472 | cpu: [ia32]
473 | os: [win32]
474 |
475 | '@rollup/rollup-win32-x64-msvc@4.47.1':
476 | resolution: {integrity: sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==}
477 | cpu: [x64]
478 | os: [win32]
479 |
480 | '@types/babel__core@7.20.5':
481 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
482 |
483 | '@types/babel__generator@7.27.0':
484 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
485 |
486 | '@types/babel__template@7.4.4':
487 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
488 |
489 | '@types/babel__traverse@7.28.0':
490 | resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
491 |
492 | '@types/estree@1.0.8':
493 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
494 |
495 | '@vitejs/plugin-react@5.0.1':
496 | resolution: {integrity: sha512-DE4UNaBXwtVoDJ0ccBdLVjFTWL70NRuWNCxEieTI3lrq9ORB9aOCQEKstwDXBl87NvFdbqh/p7eINGyj0BthJA==}
497 | engines: {node: ^20.19.0 || >=22.12.0}
498 | peerDependencies:
499 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
500 |
501 | accepts@2.0.0:
502 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
503 | engines: {node: '>= 0.6'}
504 |
505 | asn1js@3.0.6:
506 | resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==}
507 | engines: {node: '>=12.0.0'}
508 |
509 | body-parser@2.2.0:
510 | resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
511 | engines: {node: '>=18'}
512 |
513 | browserslist@4.25.3:
514 | resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==}
515 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
516 | hasBin: true
517 |
518 | bytes@3.1.2:
519 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
520 | engines: {node: '>= 0.8'}
521 |
522 | call-bind-apply-helpers@1.0.2:
523 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
524 | engines: {node: '>= 0.4'}
525 |
526 | call-bound@1.0.4:
527 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
528 | engines: {node: '>= 0.4'}
529 |
530 | caniuse-lite@1.0.30001737:
531 | resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==}
532 |
533 | clipboard@2.0.11:
534 | resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
535 |
536 | content-disposition@1.0.0:
537 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
538 | engines: {node: '>= 0.6'}
539 |
540 | content-type@1.0.5:
541 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
542 | engines: {node: '>= 0.6'}
543 |
544 | convert-source-map@2.0.0:
545 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
546 |
547 | cookie-signature@1.2.2:
548 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
549 | engines: {node: '>=6.6.0'}
550 |
551 | cookie@0.7.2:
552 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
553 | engines: {node: '>= 0.6'}
554 |
555 | cookie@1.0.2:
556 | resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
557 | engines: {node: '>=18'}
558 |
559 | debug@4.4.1:
560 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
561 | engines: {node: '>=6.0'}
562 | peerDependencies:
563 | supports-color: '*'
564 | peerDependenciesMeta:
565 | supports-color:
566 | optional: true
567 |
568 | delegate@3.2.0:
569 | resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
570 |
571 | depd@2.0.0:
572 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
573 | engines: {node: '>= 0.8'}
574 |
575 | detect-node-es@1.1.0:
576 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
577 |
578 | dunder-proto@1.0.1:
579 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
580 | engines: {node: '>= 0.4'}
581 |
582 | ee-first@1.1.1:
583 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
584 |
585 | electron-to-chromium@1.5.208:
586 | resolution: {integrity: sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==}
587 |
588 | encodeurl@2.0.0:
589 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
590 | engines: {node: '>= 0.8'}
591 |
592 | es-define-property@1.0.1:
593 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
594 | engines: {node: '>= 0.4'}
595 |
596 | es-errors@1.3.0:
597 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
598 | engines: {node: '>= 0.4'}
599 |
600 | es-object-atoms@1.1.1:
601 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
602 | engines: {node: '>= 0.4'}
603 |
604 | esbuild@0.25.9:
605 | resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
606 | engines: {node: '>=18'}
607 | hasBin: true
608 |
609 | escalade@3.2.0:
610 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
611 | engines: {node: '>=6'}
612 |
613 | escape-html@1.0.3:
614 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
615 |
616 | etag@1.8.1:
617 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
618 | engines: {node: '>= 0.6'}
619 |
620 | express@5.1.0:
621 | resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
622 | engines: {node: '>= 18'}
623 |
624 | fdir@6.5.0:
625 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
626 | engines: {node: '>=12.0.0'}
627 | peerDependencies:
628 | picomatch: ^3 || ^4
629 | peerDependenciesMeta:
630 | picomatch:
631 | optional: true
632 |
633 | finalhandler@2.1.0:
634 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
635 | engines: {node: '>= 0.8'}
636 |
637 | focus-lock@0.9.2:
638 | resolution: {integrity: sha512-YtHxjX7a0IC0ZACL5wsX8QdncXofWpGPNoVMuI/nZUrPGp6LmNI6+D5j0pPj+v8Kw5EpweA+T5yImK0rnWf7oQ==}
639 | engines: {node: '>=10'}
640 |
641 | forwarded@0.2.0:
642 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
643 | engines: {node: '>= 0.6'}
644 |
645 | fresh@2.0.0:
646 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
647 | engines: {node: '>= 0.8'}
648 |
649 | fsevents@2.3.3:
650 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
651 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
652 | os: [darwin]
653 |
654 | function-bind@1.1.2:
655 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
656 |
657 | gensync@1.0.0-beta.2:
658 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
659 | engines: {node: '>=6.9.0'}
660 |
661 | get-intrinsic@1.3.0:
662 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
663 | engines: {node: '>= 0.4'}
664 |
665 | get-nonce@1.0.1:
666 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
667 | engines: {node: '>=6'}
668 |
669 | get-proto@1.0.1:
670 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
671 | engines: {node: '>= 0.4'}
672 |
673 | good-listener@1.2.2:
674 | resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
675 |
676 | gopd@1.2.0:
677 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
678 | engines: {node: '>= 0.4'}
679 |
680 | gun@0.2020.1240:
681 | resolution: {integrity: sha512-uhnyadZTywn0HHgBjS2DePqpcdwLeVm6nFeSZZBPJRltm9O8MjFPyltaxk2PBKS+O8wSZac9qlbCIriJDgQQog==}
682 | engines: {node: '>=0.8.4'}
683 |
684 | gun@0.2020.1241:
685 | resolution: {integrity: sha512-rmGqLuJj4fAuZ/0lddCvXHbENPkEnBOBYpq+kXHrwQ5RdNtQ5p0Io99lD1qUXMFmtwNacQ/iqo3VTmjmMyAYZg==}
686 | engines: {node: '>=0.8.4'}
687 |
688 | has-symbols@1.1.0:
689 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
690 | engines: {node: '>= 0.4'}
691 |
692 | hasown@2.0.2:
693 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
694 | engines: {node: '>= 0.4'}
695 |
696 | http-errors@2.0.0:
697 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
698 | engines: {node: '>= 0.8'}
699 |
700 | iconv-lite@0.6.3:
701 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
702 | engines: {node: '>=0.10.0'}
703 |
704 | inherits@2.0.4:
705 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
706 |
707 | ipaddr.js@1.9.1:
708 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
709 | engines: {node: '>= 0.10'}
710 |
711 | is-promise@4.0.0:
712 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
713 |
714 | js-tokens@4.0.0:
715 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
716 |
717 | jsesc@3.1.0:
718 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
719 | engines: {node: '>=6'}
720 | hasBin: true
721 |
722 | json5@2.2.3:
723 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
724 | engines: {node: '>=6'}
725 | hasBin: true
726 |
727 | loose-envify@1.4.0:
728 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
729 | hasBin: true
730 |
731 | lru-cache@5.1.1:
732 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
733 |
734 | math-intrinsics@1.1.0:
735 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
736 | engines: {node: '>= 0.4'}
737 |
738 | media-typer@1.1.0:
739 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
740 | engines: {node: '>= 0.8'}
741 |
742 | merge-descriptors@2.0.0:
743 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
744 | engines: {node: '>=18'}
745 |
746 | mime-db@1.54.0:
747 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
748 | engines: {node: '>= 0.6'}
749 |
750 | mime-types@3.0.1:
751 | resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
752 | engines: {node: '>= 0.6'}
753 |
754 | ms@2.1.3:
755 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
756 |
757 | nanoid@3.3.11:
758 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
759 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
760 | hasBin: true
761 |
762 | negotiator@1.0.0:
763 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
764 | engines: {node: '>= 0.6'}
765 |
766 | node-releases@2.0.19:
767 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
768 |
769 | object-assign@4.1.1:
770 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
771 | engines: {node: '>=0.10.0'}
772 |
773 | object-inspect@1.13.4:
774 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
775 | engines: {node: '>= 0.4'}
776 |
777 | on-finished@2.4.1:
778 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
779 | engines: {node: '>= 0.8'}
780 |
781 | once@1.4.0:
782 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
783 |
784 | parseurl@1.3.3:
785 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
786 | engines: {node: '>= 0.8'}
787 |
788 | path-to-regexp@8.2.0:
789 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
790 | engines: {node: '>=16'}
791 |
792 | picocolors@1.1.1:
793 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
794 |
795 | picomatch@4.0.3:
796 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
797 | engines: {node: '>=12'}
798 |
799 | postcss@8.5.6:
800 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
801 | engines: {node: ^10 || ^12 || >=14}
802 |
803 | prop-types@15.8.1:
804 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
805 |
806 | proxy-addr@2.0.7:
807 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
808 | engines: {node: '>= 0.10'}
809 |
810 | pvtsutils@1.3.6:
811 | resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
812 |
813 | pvutils@1.1.3:
814 | resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==}
815 | engines: {node: '>=6.0.0'}
816 |
817 | qs@6.14.0:
818 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
819 | engines: {node: '>=0.6'}
820 |
821 | range-parser@1.2.1:
822 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
823 | engines: {node: '>= 0.6'}
824 |
825 | raw-body@3.0.0:
826 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
827 | engines: {node: '>= 0.8'}
828 |
829 | react-clientside-effect@1.2.8:
830 | resolution: {integrity: sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==}
831 | peerDependencies:
832 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
833 |
834 | react-dom@19.1.1:
835 | resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==}
836 | peerDependencies:
837 | react: ^19.1.1
838 |
839 | react-focus-lock@2.5.2:
840 | resolution: {integrity: sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ==}
841 | peerDependencies:
842 | react: ^16.8.0 || ^17.0.0
843 |
844 | react-is@16.13.1:
845 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
846 |
847 | react-refresh@0.17.0:
848 | resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
849 | engines: {node: '>=0.10.0'}
850 |
851 | react-remove-scroll-bar@2.3.8:
852 | resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
853 | engines: {node: '>=10'}
854 | peerDependencies:
855 | '@types/react': '*'
856 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
857 | peerDependenciesMeta:
858 | '@types/react':
859 | optional: true
860 |
861 | react-remove-scroll@2.4.3:
862 | resolution: {integrity: sha512-lGWYXfV6jykJwbFpsuPdexKKzp96f3RbvGapDSIdcyGvHb7/eqyn46C7/6h+rUzYar1j5mdU+XECITHXCKBk9Q==}
863 | engines: {node: '>=8.5.0'}
864 | peerDependencies:
865 | '@types/react': ^16.8.0 || ^17.0.0
866 | react: ^16.8.0 || ^17.0.0
867 | peerDependenciesMeta:
868 | '@types/react':
869 | optional: true
870 |
871 | react-router-dom@7.8.1:
872 | resolution: {integrity: sha512-NkgBCF3sVgCiAWIlSt89GR2PLaksMpoo3HDCorpRfnCEfdtRPLiuTf+CNXvqZMI5SJLZCLpVCvcZrTdtGW64xQ==}
873 | engines: {node: '>=20.0.0'}
874 | peerDependencies:
875 | react: '>=18'
876 | react-dom: '>=18'
877 |
878 | react-router@7.8.1:
879 | resolution: {integrity: sha512-5cy/M8DHcG51/KUIka1nfZ2QeylS4PJRs6TT8I4PF5axVsI5JUxp0hC0NZ/AEEj8Vw7xsEoD7L/6FY+zoYaOGA==}
880 | engines: {node: '>=20.0.0'}
881 | peerDependencies:
882 | react: '>=18'
883 | react-dom: '>=18'
884 | peerDependenciesMeta:
885 | react-dom:
886 | optional: true
887 |
888 | react-style-singleton@2.2.3:
889 | resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
890 | engines: {node: '>=10'}
891 | peerDependencies:
892 | '@types/react': '*'
893 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
894 | peerDependenciesMeta:
895 | '@types/react':
896 | optional: true
897 |
898 | react@19.1.1:
899 | resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==}
900 | engines: {node: '>=0.10.0'}
901 |
902 | rollup@4.47.1:
903 | resolution: {integrity: sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==}
904 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
905 | hasBin: true
906 |
907 | router@2.2.0:
908 | resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
909 | engines: {node: '>= 18'}
910 |
911 | safe-buffer@5.2.1:
912 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
913 |
914 | safer-buffer@2.1.2:
915 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
916 |
917 | scheduler@0.26.0:
918 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
919 |
920 | select@1.1.2:
921 | resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
922 |
923 | semver@6.3.1:
924 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
925 | hasBin: true
926 |
927 | send@1.2.0:
928 | resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
929 | engines: {node: '>= 18'}
930 |
931 | serve-static@2.2.0:
932 | resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
933 | engines: {node: '>= 18'}
934 |
935 | set-cookie-parser@2.7.1:
936 | resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
937 |
938 | setprototypeof@1.2.0:
939 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
940 |
941 | side-channel-list@1.0.0:
942 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
943 | engines: {node: '>= 0.4'}
944 |
945 | side-channel-map@1.0.1:
946 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
947 | engines: {node: '>= 0.4'}
948 |
949 | side-channel-weakmap@1.0.2:
950 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
951 | engines: {node: '>= 0.4'}
952 |
953 | side-channel@1.1.0:
954 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
955 | engines: {node: '>= 0.4'}
956 |
957 | source-map-js@1.2.1:
958 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
959 | engines: {node: '>=0.10.0'}
960 |
961 | statuses@2.0.1:
962 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
963 | engines: {node: '>= 0.8'}
964 |
965 | statuses@2.0.2:
966 | resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
967 | engines: {node: '>= 0.8'}
968 |
969 | tiny-emitter@2.1.0:
970 | resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
971 |
972 | tiny-invariant@1.3.3:
973 | resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
974 |
975 | tinyglobby@0.2.14:
976 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
977 | engines: {node: '>=12.0.0'}
978 |
979 | toidentifier@1.0.1:
980 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
981 | engines: {node: '>=0.6'}
982 |
983 | tslib@1.14.1:
984 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
985 |
986 | tslib@2.8.1:
987 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
988 |
989 | type-is@2.0.1:
990 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
991 | engines: {node: '>= 0.6'}
992 |
993 | unpipe@1.0.0:
994 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
995 | engines: {node: '>= 0.8'}
996 |
997 | update-browserslist-db@1.1.3:
998 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
999 | hasBin: true
1000 | peerDependencies:
1001 | browserslist: '>= 4.21.0'
1002 |
1003 | use-callback-ref@1.3.3:
1004 | resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
1005 | engines: {node: '>=10'}
1006 | peerDependencies:
1007 | '@types/react': '*'
1008 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1009 | peerDependenciesMeta:
1010 | '@types/react':
1011 | optional: true
1012 |
1013 | use-sidecar@1.1.3:
1014 | resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
1015 | engines: {node: '>=10'}
1016 | peerDependencies:
1017 | '@types/react': '*'
1018 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1019 | peerDependenciesMeta:
1020 | '@types/react':
1021 | optional: true
1022 |
1023 | vary@1.1.2:
1024 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
1025 | engines: {node: '>= 0.8'}
1026 |
1027 | vite@7.1.3:
1028 | resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==}
1029 | engines: {node: ^20.19.0 || >=22.12.0}
1030 | hasBin: true
1031 | peerDependencies:
1032 | '@types/node': ^20.19.0 || >=22.12.0
1033 | jiti: '>=1.21.0'
1034 | less: ^4.0.0
1035 | lightningcss: ^1.21.0
1036 | sass: ^1.70.0
1037 | sass-embedded: ^1.70.0
1038 | stylus: '>=0.54.8'
1039 | sugarss: ^5.0.0
1040 | terser: ^5.16.0
1041 | tsx: ^4.8.1
1042 | yaml: ^2.4.2
1043 | peerDependenciesMeta:
1044 | '@types/node':
1045 | optional: true
1046 | jiti:
1047 | optional: true
1048 | less:
1049 | optional: true
1050 | lightningcss:
1051 | optional: true
1052 | sass:
1053 | optional: true
1054 | sass-embedded:
1055 | optional: true
1056 | stylus:
1057 | optional: true
1058 | sugarss:
1059 | optional: true
1060 | terser:
1061 | optional: true
1062 | tsx:
1063 | optional: true
1064 | yaml:
1065 | optional: true
1066 |
1067 | webcrypto-core@1.8.1:
1068 | resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==}
1069 |
1070 | wrappy@1.0.2:
1071 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
1072 |
1073 | ws@7.5.10:
1074 | resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
1075 | engines: {node: '>=8.3.0'}
1076 | peerDependencies:
1077 | bufferutil: ^4.0.1
1078 | utf-8-validate: ^5.0.2
1079 | peerDependenciesMeta:
1080 | bufferutil:
1081 | optional: true
1082 | utf-8-validate:
1083 | optional: true
1084 |
1085 | yallist@3.1.1:
1086 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1087 |
1088 | snapshots:
1089 |
1090 | '@altrx/gundb-react-hooks@1.0.0-rc3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
1091 | dependencies:
1092 | react: 19.1.1
1093 | react-dom: 19.1.1(react@19.1.1)
1094 |
1095 | '@ampproject/remapping@2.3.0':
1096 | dependencies:
1097 | '@jridgewell/gen-mapping': 0.3.13
1098 | '@jridgewell/trace-mapping': 0.3.30
1099 |
1100 | '@babel/code-frame@7.27.1':
1101 | dependencies:
1102 | '@babel/helper-validator-identifier': 7.27.1
1103 | js-tokens: 4.0.0
1104 | picocolors: 1.1.1
1105 |
1106 | '@babel/compat-data@7.28.0': {}
1107 |
1108 | '@babel/core@7.28.3':
1109 | dependencies:
1110 | '@ampproject/remapping': 2.3.0
1111 | '@babel/code-frame': 7.27.1
1112 | '@babel/generator': 7.28.3
1113 | '@babel/helper-compilation-targets': 7.27.2
1114 | '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3)
1115 | '@babel/helpers': 7.28.3
1116 | '@babel/parser': 7.28.3
1117 | '@babel/template': 7.27.2
1118 | '@babel/traverse': 7.28.3
1119 | '@babel/types': 7.28.2
1120 | convert-source-map: 2.0.0
1121 | debug: 4.4.1
1122 | gensync: 1.0.0-beta.2
1123 | json5: 2.2.3
1124 | semver: 6.3.1
1125 | transitivePeerDependencies:
1126 | - supports-color
1127 |
1128 | '@babel/generator@7.28.3':
1129 | dependencies:
1130 | '@babel/parser': 7.28.3
1131 | '@babel/types': 7.28.2
1132 | '@jridgewell/gen-mapping': 0.3.13
1133 | '@jridgewell/trace-mapping': 0.3.30
1134 | jsesc: 3.1.0
1135 |
1136 | '@babel/helper-compilation-targets@7.27.2':
1137 | dependencies:
1138 | '@babel/compat-data': 7.28.0
1139 | '@babel/helper-validator-option': 7.27.1
1140 | browserslist: 4.25.3
1141 | lru-cache: 5.1.1
1142 | semver: 6.3.1
1143 |
1144 | '@babel/helper-globals@7.28.0': {}
1145 |
1146 | '@babel/helper-module-imports@7.27.1':
1147 | dependencies:
1148 | '@babel/traverse': 7.28.3
1149 | '@babel/types': 7.28.2
1150 | transitivePeerDependencies:
1151 | - supports-color
1152 |
1153 | '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)':
1154 | dependencies:
1155 | '@babel/core': 7.28.3
1156 | '@babel/helper-module-imports': 7.27.1
1157 | '@babel/helper-validator-identifier': 7.27.1
1158 | '@babel/traverse': 7.28.3
1159 | transitivePeerDependencies:
1160 | - supports-color
1161 |
1162 | '@babel/helper-plugin-utils@7.27.1': {}
1163 |
1164 | '@babel/helper-string-parser@7.27.1': {}
1165 |
1166 | '@babel/helper-validator-identifier@7.27.1': {}
1167 |
1168 | '@babel/helper-validator-option@7.27.1': {}
1169 |
1170 | '@babel/helpers@7.28.3':
1171 | dependencies:
1172 | '@babel/template': 7.27.2
1173 | '@babel/types': 7.28.2
1174 |
1175 | '@babel/parser@7.28.3':
1176 | dependencies:
1177 | '@babel/types': 7.28.2
1178 |
1179 | '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)':
1180 | dependencies:
1181 | '@babel/core': 7.28.3
1182 | '@babel/helper-plugin-utils': 7.27.1
1183 |
1184 | '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)':
1185 | dependencies:
1186 | '@babel/core': 7.28.3
1187 | '@babel/helper-plugin-utils': 7.27.1
1188 |
1189 | '@babel/runtime@7.28.3': {}
1190 |
1191 | '@babel/template@7.27.2':
1192 | dependencies:
1193 | '@babel/code-frame': 7.27.1
1194 | '@babel/parser': 7.28.3
1195 | '@babel/types': 7.28.2
1196 |
1197 | '@babel/traverse@7.28.3':
1198 | dependencies:
1199 | '@babel/code-frame': 7.27.1
1200 | '@babel/generator': 7.28.3
1201 | '@babel/helper-globals': 7.28.0
1202 | '@babel/parser': 7.28.3
1203 | '@babel/template': 7.27.2
1204 | '@babel/types': 7.28.2
1205 | debug: 4.4.1
1206 | transitivePeerDependencies:
1207 | - supports-color
1208 |
1209 | '@babel/types@7.28.2':
1210 | dependencies:
1211 | '@babel/helper-string-parser': 7.27.1
1212 | '@babel/helper-validator-identifier': 7.27.1
1213 |
1214 | '@esbuild/aix-ppc64@0.25.9':
1215 | optional: true
1216 |
1217 | '@esbuild/android-arm64@0.25.9':
1218 | optional: true
1219 |
1220 | '@esbuild/android-arm@0.25.9':
1221 | optional: true
1222 |
1223 | '@esbuild/android-x64@0.25.9':
1224 | optional: true
1225 |
1226 | '@esbuild/darwin-arm64@0.25.9':
1227 | optional: true
1228 |
1229 | '@esbuild/darwin-x64@0.25.9':
1230 | optional: true
1231 |
1232 | '@esbuild/freebsd-arm64@0.25.9':
1233 | optional: true
1234 |
1235 | '@esbuild/freebsd-x64@0.25.9':
1236 | optional: true
1237 |
1238 | '@esbuild/linux-arm64@0.25.9':
1239 | optional: true
1240 |
1241 | '@esbuild/linux-arm@0.25.9':
1242 | optional: true
1243 |
1244 | '@esbuild/linux-ia32@0.25.9':
1245 | optional: true
1246 |
1247 | '@esbuild/linux-loong64@0.25.9':
1248 | optional: true
1249 |
1250 | '@esbuild/linux-mips64el@0.25.9':
1251 | optional: true
1252 |
1253 | '@esbuild/linux-ppc64@0.25.9':
1254 | optional: true
1255 |
1256 | '@esbuild/linux-riscv64@0.25.9':
1257 | optional: true
1258 |
1259 | '@esbuild/linux-s390x@0.25.9':
1260 | optional: true
1261 |
1262 | '@esbuild/linux-x64@0.25.9':
1263 | optional: true
1264 |
1265 | '@esbuild/netbsd-arm64@0.25.9':
1266 | optional: true
1267 |
1268 | '@esbuild/netbsd-x64@0.25.9':
1269 | optional: true
1270 |
1271 | '@esbuild/openbsd-arm64@0.25.9':
1272 | optional: true
1273 |
1274 | '@esbuild/openbsd-x64@0.25.9':
1275 | optional: true
1276 |
1277 | '@esbuild/openharmony-arm64@0.25.9':
1278 | optional: true
1279 |
1280 | '@esbuild/sunos-x64@0.25.9':
1281 | optional: true
1282 |
1283 | '@esbuild/win32-arm64@0.25.9':
1284 | optional: true
1285 |
1286 | '@esbuild/win32-ia32@0.25.9':
1287 | optional: true
1288 |
1289 | '@esbuild/win32-x64@0.25.9':
1290 | optional: true
1291 |
1292 | '@gun-vue/gun-es@0.4.1240':
1293 | dependencies:
1294 | '@noble/curves': 1.9.0
1295 | gun: 0.2020.1240
1296 | transitivePeerDependencies:
1297 | - bufferutil
1298 | - utf-8-validate
1299 |
1300 | '@jridgewell/gen-mapping@0.3.13':
1301 | dependencies:
1302 | '@jridgewell/sourcemap-codec': 1.5.5
1303 | '@jridgewell/trace-mapping': 0.3.30
1304 |
1305 | '@jridgewell/resolve-uri@3.1.2': {}
1306 |
1307 | '@jridgewell/sourcemap-codec@1.5.5': {}
1308 |
1309 | '@jridgewell/trace-mapping@0.3.30':
1310 | dependencies:
1311 | '@jridgewell/resolve-uri': 3.1.2
1312 | '@jridgewell/sourcemap-codec': 1.5.5
1313 |
1314 | '@noble/curves@1.9.0':
1315 | dependencies:
1316 | '@noble/hashes': 1.8.0
1317 |
1318 | '@noble/hashes@1.8.0': {}
1319 |
1320 | '@peculiar/asn1-schema@2.4.0':
1321 | dependencies:
1322 | asn1js: 3.0.6
1323 | pvtsutils: 1.3.6
1324 | tslib: 2.8.1
1325 | optional: true
1326 |
1327 | '@peculiar/json-schema@1.1.12':
1328 | dependencies:
1329 | tslib: 2.8.1
1330 | optional: true
1331 |
1332 | '@peculiar/webcrypto@1.5.0':
1333 | dependencies:
1334 | '@peculiar/asn1-schema': 2.4.0
1335 | '@peculiar/json-schema': 1.1.12
1336 | pvtsutils: 1.3.6
1337 | tslib: 2.8.1
1338 | webcrypto-core: 1.8.1
1339 | optional: true
1340 |
1341 | '@reach/alert-dialog@0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
1342 | dependencies:
1343 | '@reach/auto-id': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1344 | '@reach/dialog': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1345 | '@reach/polymorphic': 0.18.0(react@19.1.1)
1346 | '@reach/utils': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1347 | react: 19.1.1
1348 | react-dom: 19.1.1(react@19.1.1)
1349 | tiny-invariant: 1.3.3
1350 | transitivePeerDependencies:
1351 | - '@types/react'
1352 |
1353 | '@reach/auto-id@0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
1354 | dependencies:
1355 | '@reach/utils': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1356 | react: 19.1.1
1357 | react-dom: 19.1.1(react@19.1.1)
1358 |
1359 | '@reach/dialog@0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
1360 | dependencies:
1361 | '@reach/polymorphic': 0.18.0(react@19.1.1)
1362 | '@reach/portal': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1363 | '@reach/utils': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1364 | react: 19.1.1
1365 | react-dom: 19.1.1(react@19.1.1)
1366 | react-focus-lock: 2.5.2(react@19.1.1)
1367 | react-remove-scroll: 2.4.3(react@19.1.1)
1368 | transitivePeerDependencies:
1369 | - '@types/react'
1370 |
1371 | '@reach/polymorphic@0.18.0(react@19.1.1)':
1372 | dependencies:
1373 | react: 19.1.1
1374 |
1375 | '@reach/portal@0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
1376 | dependencies:
1377 | '@reach/utils': 0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1378 | react: 19.1.1
1379 | react-dom: 19.1.1(react@19.1.1)
1380 |
1381 | '@reach/utils@0.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
1382 | dependencies:
1383 | react: 19.1.1
1384 | react-dom: 19.1.1(react@19.1.1)
1385 |
1386 | '@rolldown/pluginutils@1.0.0-beta.32': {}
1387 |
1388 | '@rollup/rollup-android-arm-eabi@4.47.1':
1389 | optional: true
1390 |
1391 | '@rollup/rollup-android-arm64@4.47.1':
1392 | optional: true
1393 |
1394 | '@rollup/rollup-darwin-arm64@4.47.1':
1395 | optional: true
1396 |
1397 | '@rollup/rollup-darwin-x64@4.47.1':
1398 | optional: true
1399 |
1400 | '@rollup/rollup-freebsd-arm64@4.47.1':
1401 | optional: true
1402 |
1403 | '@rollup/rollup-freebsd-x64@4.47.1':
1404 | optional: true
1405 |
1406 | '@rollup/rollup-linux-arm-gnueabihf@4.47.1':
1407 | optional: true
1408 |
1409 | '@rollup/rollup-linux-arm-musleabihf@4.47.1':
1410 | optional: true
1411 |
1412 | '@rollup/rollup-linux-arm64-gnu@4.47.1':
1413 | optional: true
1414 |
1415 | '@rollup/rollup-linux-arm64-musl@4.47.1':
1416 | optional: true
1417 |
1418 | '@rollup/rollup-linux-loongarch64-gnu@4.47.1':
1419 | optional: true
1420 |
1421 | '@rollup/rollup-linux-ppc64-gnu@4.47.1':
1422 | optional: true
1423 |
1424 | '@rollup/rollup-linux-riscv64-gnu@4.47.1':
1425 | optional: true
1426 |
1427 | '@rollup/rollup-linux-riscv64-musl@4.47.1':
1428 | optional: true
1429 |
1430 | '@rollup/rollup-linux-s390x-gnu@4.47.1':
1431 | optional: true
1432 |
1433 | '@rollup/rollup-linux-x64-gnu@4.47.1':
1434 | optional: true
1435 |
1436 | '@rollup/rollup-linux-x64-musl@4.47.1':
1437 | optional: true
1438 |
1439 | '@rollup/rollup-win32-arm64-msvc@4.47.1':
1440 | optional: true
1441 |
1442 | '@rollup/rollup-win32-ia32-msvc@4.47.1':
1443 | optional: true
1444 |
1445 | '@rollup/rollup-win32-x64-msvc@4.47.1':
1446 | optional: true
1447 |
1448 | '@types/babel__core@7.20.5':
1449 | dependencies:
1450 | '@babel/parser': 7.28.3
1451 | '@babel/types': 7.28.2
1452 | '@types/babel__generator': 7.27.0
1453 | '@types/babel__template': 7.4.4
1454 | '@types/babel__traverse': 7.28.0
1455 |
1456 | '@types/babel__generator@7.27.0':
1457 | dependencies:
1458 | '@babel/types': 7.28.2
1459 |
1460 | '@types/babel__template@7.4.4':
1461 | dependencies:
1462 | '@babel/parser': 7.28.3
1463 | '@babel/types': 7.28.2
1464 |
1465 | '@types/babel__traverse@7.28.0':
1466 | dependencies:
1467 | '@babel/types': 7.28.2
1468 |
1469 | '@types/estree@1.0.8': {}
1470 |
1471 | '@vitejs/plugin-react@5.0.1(vite@7.1.3)':
1472 | dependencies:
1473 | '@babel/core': 7.28.3
1474 | '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3)
1475 | '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3)
1476 | '@rolldown/pluginutils': 1.0.0-beta.32
1477 | '@types/babel__core': 7.20.5
1478 | react-refresh: 0.17.0
1479 | vite: 7.1.3
1480 | transitivePeerDependencies:
1481 | - supports-color
1482 |
1483 | accepts@2.0.0:
1484 | dependencies:
1485 | mime-types: 3.0.1
1486 | negotiator: 1.0.0
1487 |
1488 | asn1js@3.0.6:
1489 | dependencies:
1490 | pvtsutils: 1.3.6
1491 | pvutils: 1.1.3
1492 | tslib: 2.8.1
1493 | optional: true
1494 |
1495 | body-parser@2.2.0:
1496 | dependencies:
1497 | bytes: 3.1.2
1498 | content-type: 1.0.5
1499 | debug: 4.4.1
1500 | http-errors: 2.0.0
1501 | iconv-lite: 0.6.3
1502 | on-finished: 2.4.1
1503 | qs: 6.14.0
1504 | raw-body: 3.0.0
1505 | type-is: 2.0.1
1506 | transitivePeerDependencies:
1507 | - supports-color
1508 |
1509 | browserslist@4.25.3:
1510 | dependencies:
1511 | caniuse-lite: 1.0.30001737
1512 | electron-to-chromium: 1.5.208
1513 | node-releases: 2.0.19
1514 | update-browserslist-db: 1.1.3(browserslist@4.25.3)
1515 |
1516 | bytes@3.1.2: {}
1517 |
1518 | call-bind-apply-helpers@1.0.2:
1519 | dependencies:
1520 | es-errors: 1.3.0
1521 | function-bind: 1.1.2
1522 |
1523 | call-bound@1.0.4:
1524 | dependencies:
1525 | call-bind-apply-helpers: 1.0.2
1526 | get-intrinsic: 1.3.0
1527 |
1528 | caniuse-lite@1.0.30001737: {}
1529 |
1530 | clipboard@2.0.11:
1531 | dependencies:
1532 | good-listener: 1.2.2
1533 | select: 1.1.2
1534 | tiny-emitter: 2.1.0
1535 |
1536 | content-disposition@1.0.0:
1537 | dependencies:
1538 | safe-buffer: 5.2.1
1539 |
1540 | content-type@1.0.5: {}
1541 |
1542 | convert-source-map@2.0.0: {}
1543 |
1544 | cookie-signature@1.2.2: {}
1545 |
1546 | cookie@0.7.2: {}
1547 |
1548 | cookie@1.0.2: {}
1549 |
1550 | debug@4.4.1:
1551 | dependencies:
1552 | ms: 2.1.3
1553 |
1554 | delegate@3.2.0: {}
1555 |
1556 | depd@2.0.0: {}
1557 |
1558 | detect-node-es@1.1.0: {}
1559 |
1560 | dunder-proto@1.0.1:
1561 | dependencies:
1562 | call-bind-apply-helpers: 1.0.2
1563 | es-errors: 1.3.0
1564 | gopd: 1.2.0
1565 |
1566 | ee-first@1.1.1: {}
1567 |
1568 | electron-to-chromium@1.5.208: {}
1569 |
1570 | encodeurl@2.0.0: {}
1571 |
1572 | es-define-property@1.0.1: {}
1573 |
1574 | es-errors@1.3.0: {}
1575 |
1576 | es-object-atoms@1.1.1:
1577 | dependencies:
1578 | es-errors: 1.3.0
1579 |
1580 | esbuild@0.25.9:
1581 | optionalDependencies:
1582 | '@esbuild/aix-ppc64': 0.25.9
1583 | '@esbuild/android-arm': 0.25.9
1584 | '@esbuild/android-arm64': 0.25.9
1585 | '@esbuild/android-x64': 0.25.9
1586 | '@esbuild/darwin-arm64': 0.25.9
1587 | '@esbuild/darwin-x64': 0.25.9
1588 | '@esbuild/freebsd-arm64': 0.25.9
1589 | '@esbuild/freebsd-x64': 0.25.9
1590 | '@esbuild/linux-arm': 0.25.9
1591 | '@esbuild/linux-arm64': 0.25.9
1592 | '@esbuild/linux-ia32': 0.25.9
1593 | '@esbuild/linux-loong64': 0.25.9
1594 | '@esbuild/linux-mips64el': 0.25.9
1595 | '@esbuild/linux-ppc64': 0.25.9
1596 | '@esbuild/linux-riscv64': 0.25.9
1597 | '@esbuild/linux-s390x': 0.25.9
1598 | '@esbuild/linux-x64': 0.25.9
1599 | '@esbuild/netbsd-arm64': 0.25.9
1600 | '@esbuild/netbsd-x64': 0.25.9
1601 | '@esbuild/openbsd-arm64': 0.25.9
1602 | '@esbuild/openbsd-x64': 0.25.9
1603 | '@esbuild/openharmony-arm64': 0.25.9
1604 | '@esbuild/sunos-x64': 0.25.9
1605 | '@esbuild/win32-arm64': 0.25.9
1606 | '@esbuild/win32-ia32': 0.25.9
1607 | '@esbuild/win32-x64': 0.25.9
1608 |
1609 | escalade@3.2.0: {}
1610 |
1611 | escape-html@1.0.3: {}
1612 |
1613 | etag@1.8.1: {}
1614 |
1615 | express@5.1.0:
1616 | dependencies:
1617 | accepts: 2.0.0
1618 | body-parser: 2.2.0
1619 | content-disposition: 1.0.0
1620 | content-type: 1.0.5
1621 | cookie: 0.7.2
1622 | cookie-signature: 1.2.2
1623 | debug: 4.4.1
1624 | encodeurl: 2.0.0
1625 | escape-html: 1.0.3
1626 | etag: 1.8.1
1627 | finalhandler: 2.1.0
1628 | fresh: 2.0.0
1629 | http-errors: 2.0.0
1630 | merge-descriptors: 2.0.0
1631 | mime-types: 3.0.1
1632 | on-finished: 2.4.1
1633 | once: 1.4.0
1634 | parseurl: 1.3.3
1635 | proxy-addr: 2.0.7
1636 | qs: 6.14.0
1637 | range-parser: 1.2.1
1638 | router: 2.2.0
1639 | send: 1.2.0
1640 | serve-static: 2.2.0
1641 | statuses: 2.0.2
1642 | type-is: 2.0.1
1643 | vary: 1.1.2
1644 | transitivePeerDependencies:
1645 | - supports-color
1646 |
1647 | fdir@6.5.0(picomatch@4.0.3):
1648 | optionalDependencies:
1649 | picomatch: 4.0.3
1650 |
1651 | finalhandler@2.1.0:
1652 | dependencies:
1653 | debug: 4.4.1
1654 | encodeurl: 2.0.0
1655 | escape-html: 1.0.3
1656 | on-finished: 2.4.1
1657 | parseurl: 1.3.3
1658 | statuses: 2.0.2
1659 | transitivePeerDependencies:
1660 | - supports-color
1661 |
1662 | focus-lock@0.9.2:
1663 | dependencies:
1664 | tslib: 2.8.1
1665 |
1666 | forwarded@0.2.0: {}
1667 |
1668 | fresh@2.0.0: {}
1669 |
1670 | fsevents@2.3.3:
1671 | optional: true
1672 |
1673 | function-bind@1.1.2: {}
1674 |
1675 | gensync@1.0.0-beta.2: {}
1676 |
1677 | get-intrinsic@1.3.0:
1678 | dependencies:
1679 | call-bind-apply-helpers: 1.0.2
1680 | es-define-property: 1.0.1
1681 | es-errors: 1.3.0
1682 | es-object-atoms: 1.1.1
1683 | function-bind: 1.1.2
1684 | get-proto: 1.0.1
1685 | gopd: 1.2.0
1686 | has-symbols: 1.1.0
1687 | hasown: 2.0.2
1688 | math-intrinsics: 1.1.0
1689 |
1690 | get-nonce@1.0.1: {}
1691 |
1692 | get-proto@1.0.1:
1693 | dependencies:
1694 | dunder-proto: 1.0.1
1695 | es-object-atoms: 1.1.1
1696 |
1697 | good-listener@1.2.2:
1698 | dependencies:
1699 | delegate: 3.2.0
1700 |
1701 | gopd@1.2.0: {}
1702 |
1703 | gun@0.2020.1240:
1704 | dependencies:
1705 | ws: 7.5.10
1706 | optionalDependencies:
1707 | '@peculiar/webcrypto': 1.5.0
1708 | transitivePeerDependencies:
1709 | - bufferutil
1710 | - utf-8-validate
1711 |
1712 | gun@0.2020.1241:
1713 | dependencies:
1714 | ws: 7.5.10
1715 | optionalDependencies:
1716 | '@peculiar/webcrypto': 1.5.0
1717 | transitivePeerDependencies:
1718 | - bufferutil
1719 | - utf-8-validate
1720 |
1721 | has-symbols@1.1.0: {}
1722 |
1723 | hasown@2.0.2:
1724 | dependencies:
1725 | function-bind: 1.1.2
1726 |
1727 | http-errors@2.0.0:
1728 | dependencies:
1729 | depd: 2.0.0
1730 | inherits: 2.0.4
1731 | setprototypeof: 1.2.0
1732 | statuses: 2.0.1
1733 | toidentifier: 1.0.1
1734 |
1735 | iconv-lite@0.6.3:
1736 | dependencies:
1737 | safer-buffer: 2.1.2
1738 |
1739 | inherits@2.0.4: {}
1740 |
1741 | ipaddr.js@1.9.1: {}
1742 |
1743 | is-promise@4.0.0: {}
1744 |
1745 | js-tokens@4.0.0: {}
1746 |
1747 | jsesc@3.1.0: {}
1748 |
1749 | json5@2.2.3: {}
1750 |
1751 | loose-envify@1.4.0:
1752 | dependencies:
1753 | js-tokens: 4.0.0
1754 |
1755 | lru-cache@5.1.1:
1756 | dependencies:
1757 | yallist: 3.1.1
1758 |
1759 | math-intrinsics@1.1.0: {}
1760 |
1761 | media-typer@1.1.0: {}
1762 |
1763 | merge-descriptors@2.0.0: {}
1764 |
1765 | mime-db@1.54.0: {}
1766 |
1767 | mime-types@3.0.1:
1768 | dependencies:
1769 | mime-db: 1.54.0
1770 |
1771 | ms@2.1.3: {}
1772 |
1773 | nanoid@3.3.11: {}
1774 |
1775 | negotiator@1.0.0: {}
1776 |
1777 | node-releases@2.0.19: {}
1778 |
1779 | object-assign@4.1.1: {}
1780 |
1781 | object-inspect@1.13.4: {}
1782 |
1783 | on-finished@2.4.1:
1784 | dependencies:
1785 | ee-first: 1.1.1
1786 |
1787 | once@1.4.0:
1788 | dependencies:
1789 | wrappy: 1.0.2
1790 |
1791 | parseurl@1.3.3: {}
1792 |
1793 | path-to-regexp@8.2.0: {}
1794 |
1795 | picocolors@1.1.1: {}
1796 |
1797 | picomatch@4.0.3: {}
1798 |
1799 | postcss@8.5.6:
1800 | dependencies:
1801 | nanoid: 3.3.11
1802 | picocolors: 1.1.1
1803 | source-map-js: 1.2.1
1804 |
1805 | prop-types@15.8.1:
1806 | dependencies:
1807 | loose-envify: 1.4.0
1808 | object-assign: 4.1.1
1809 | react-is: 16.13.1
1810 |
1811 | proxy-addr@2.0.7:
1812 | dependencies:
1813 | forwarded: 0.2.0
1814 | ipaddr.js: 1.9.1
1815 |
1816 | pvtsutils@1.3.6:
1817 | dependencies:
1818 | tslib: 2.8.1
1819 | optional: true
1820 |
1821 | pvutils@1.1.3:
1822 | optional: true
1823 |
1824 | qs@6.14.0:
1825 | dependencies:
1826 | side-channel: 1.1.0
1827 |
1828 | range-parser@1.2.1: {}
1829 |
1830 | raw-body@3.0.0:
1831 | dependencies:
1832 | bytes: 3.1.2
1833 | http-errors: 2.0.0
1834 | iconv-lite: 0.6.3
1835 | unpipe: 1.0.0
1836 |
1837 | react-clientside-effect@1.2.8(react@19.1.1):
1838 | dependencies:
1839 | '@babel/runtime': 7.28.3
1840 | react: 19.1.1
1841 |
1842 | react-dom@19.1.1(react@19.1.1):
1843 | dependencies:
1844 | react: 19.1.1
1845 | scheduler: 0.26.0
1846 |
1847 | react-focus-lock@2.5.2(react@19.1.1):
1848 | dependencies:
1849 | '@babel/runtime': 7.28.3
1850 | focus-lock: 0.9.2
1851 | prop-types: 15.8.1
1852 | react: 19.1.1
1853 | react-clientside-effect: 1.2.8(react@19.1.1)
1854 | use-callback-ref: 1.3.3(react@19.1.1)
1855 | use-sidecar: 1.1.3(react@19.1.1)
1856 | transitivePeerDependencies:
1857 | - '@types/react'
1858 |
1859 | react-is@16.13.1: {}
1860 |
1861 | react-refresh@0.17.0: {}
1862 |
1863 | react-remove-scroll-bar@2.3.8(react@19.1.1):
1864 | dependencies:
1865 | react: 19.1.1
1866 | react-style-singleton: 2.2.3(react@19.1.1)
1867 | tslib: 2.8.1
1868 |
1869 | react-remove-scroll@2.4.3(react@19.1.1):
1870 | dependencies:
1871 | react: 19.1.1
1872 | react-remove-scroll-bar: 2.3.8(react@19.1.1)
1873 | react-style-singleton: 2.2.3(react@19.1.1)
1874 | tslib: 1.14.1
1875 | use-callback-ref: 1.3.3(react@19.1.1)
1876 | use-sidecar: 1.1.3(react@19.1.1)
1877 |
1878 | react-router-dom@7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
1879 | dependencies:
1880 | react: 19.1.1
1881 | react-dom: 19.1.1(react@19.1.1)
1882 | react-router: 7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
1883 |
1884 | react-router@7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
1885 | dependencies:
1886 | cookie: 1.0.2
1887 | react: 19.1.1
1888 | set-cookie-parser: 2.7.1
1889 | optionalDependencies:
1890 | react-dom: 19.1.1(react@19.1.1)
1891 |
1892 | react-style-singleton@2.2.3(react@19.1.1):
1893 | dependencies:
1894 | get-nonce: 1.0.1
1895 | react: 19.1.1
1896 | tslib: 2.8.1
1897 |
1898 | react@19.1.1: {}
1899 |
1900 | rollup@4.47.1:
1901 | dependencies:
1902 | '@types/estree': 1.0.8
1903 | optionalDependencies:
1904 | '@rollup/rollup-android-arm-eabi': 4.47.1
1905 | '@rollup/rollup-android-arm64': 4.47.1
1906 | '@rollup/rollup-darwin-arm64': 4.47.1
1907 | '@rollup/rollup-darwin-x64': 4.47.1
1908 | '@rollup/rollup-freebsd-arm64': 4.47.1
1909 | '@rollup/rollup-freebsd-x64': 4.47.1
1910 | '@rollup/rollup-linux-arm-gnueabihf': 4.47.1
1911 | '@rollup/rollup-linux-arm-musleabihf': 4.47.1
1912 | '@rollup/rollup-linux-arm64-gnu': 4.47.1
1913 | '@rollup/rollup-linux-arm64-musl': 4.47.1
1914 | '@rollup/rollup-linux-loongarch64-gnu': 4.47.1
1915 | '@rollup/rollup-linux-ppc64-gnu': 4.47.1
1916 | '@rollup/rollup-linux-riscv64-gnu': 4.47.1
1917 | '@rollup/rollup-linux-riscv64-musl': 4.47.1
1918 | '@rollup/rollup-linux-s390x-gnu': 4.47.1
1919 | '@rollup/rollup-linux-x64-gnu': 4.47.1
1920 | '@rollup/rollup-linux-x64-musl': 4.47.1
1921 | '@rollup/rollup-win32-arm64-msvc': 4.47.1
1922 | '@rollup/rollup-win32-ia32-msvc': 4.47.1
1923 | '@rollup/rollup-win32-x64-msvc': 4.47.1
1924 | fsevents: 2.3.3
1925 |
1926 | router@2.2.0:
1927 | dependencies:
1928 | debug: 4.4.1
1929 | depd: 2.0.0
1930 | is-promise: 4.0.0
1931 | parseurl: 1.3.3
1932 | path-to-regexp: 8.2.0
1933 | transitivePeerDependencies:
1934 | - supports-color
1935 |
1936 | safe-buffer@5.2.1: {}
1937 |
1938 | safer-buffer@2.1.2: {}
1939 |
1940 | scheduler@0.26.0: {}
1941 |
1942 | select@1.1.2: {}
1943 |
1944 | semver@6.3.1: {}
1945 |
1946 | send@1.2.0:
1947 | dependencies:
1948 | debug: 4.4.1
1949 | encodeurl: 2.0.0
1950 | escape-html: 1.0.3
1951 | etag: 1.8.1
1952 | fresh: 2.0.0
1953 | http-errors: 2.0.0
1954 | mime-types: 3.0.1
1955 | ms: 2.1.3
1956 | on-finished: 2.4.1
1957 | range-parser: 1.2.1
1958 | statuses: 2.0.2
1959 | transitivePeerDependencies:
1960 | - supports-color
1961 |
1962 | serve-static@2.2.0:
1963 | dependencies:
1964 | encodeurl: 2.0.0
1965 | escape-html: 1.0.3
1966 | parseurl: 1.3.3
1967 | send: 1.2.0
1968 | transitivePeerDependencies:
1969 | - supports-color
1970 |
1971 | set-cookie-parser@2.7.1: {}
1972 |
1973 | setprototypeof@1.2.0: {}
1974 |
1975 | side-channel-list@1.0.0:
1976 | dependencies:
1977 | es-errors: 1.3.0
1978 | object-inspect: 1.13.4
1979 |
1980 | side-channel-map@1.0.1:
1981 | dependencies:
1982 | call-bound: 1.0.4
1983 | es-errors: 1.3.0
1984 | get-intrinsic: 1.3.0
1985 | object-inspect: 1.13.4
1986 |
1987 | side-channel-weakmap@1.0.2:
1988 | dependencies:
1989 | call-bound: 1.0.4
1990 | es-errors: 1.3.0
1991 | get-intrinsic: 1.3.0
1992 | object-inspect: 1.13.4
1993 | side-channel-map: 1.0.1
1994 |
1995 | side-channel@1.1.0:
1996 | dependencies:
1997 | es-errors: 1.3.0
1998 | object-inspect: 1.13.4
1999 | side-channel-list: 1.0.0
2000 | side-channel-map: 1.0.1
2001 | side-channel-weakmap: 1.0.2
2002 |
2003 | source-map-js@1.2.1: {}
2004 |
2005 | statuses@2.0.1: {}
2006 |
2007 | statuses@2.0.2: {}
2008 |
2009 | tiny-emitter@2.1.0: {}
2010 |
2011 | tiny-invariant@1.3.3: {}
2012 |
2013 | tinyglobby@0.2.14:
2014 | dependencies:
2015 | fdir: 6.5.0(picomatch@4.0.3)
2016 | picomatch: 4.0.3
2017 |
2018 | toidentifier@1.0.1: {}
2019 |
2020 | tslib@1.14.1: {}
2021 |
2022 | tslib@2.8.1: {}
2023 |
2024 | type-is@2.0.1:
2025 | dependencies:
2026 | content-type: 1.0.5
2027 | media-typer: 1.1.0
2028 | mime-types: 3.0.1
2029 |
2030 | unpipe@1.0.0: {}
2031 |
2032 | update-browserslist-db@1.1.3(browserslist@4.25.3):
2033 | dependencies:
2034 | browserslist: 4.25.3
2035 | escalade: 3.2.0
2036 | picocolors: 1.1.1
2037 |
2038 | use-callback-ref@1.3.3(react@19.1.1):
2039 | dependencies:
2040 | react: 19.1.1
2041 | tslib: 2.8.1
2042 |
2043 | use-sidecar@1.1.3(react@19.1.1):
2044 | dependencies:
2045 | detect-node-es: 1.1.0
2046 | react: 19.1.1
2047 | tslib: 2.8.1
2048 |
2049 | vary@1.1.2: {}
2050 |
2051 | vite@7.1.3:
2052 | dependencies:
2053 | esbuild: 0.25.9
2054 | fdir: 6.5.0(picomatch@4.0.3)
2055 | picomatch: 4.0.3
2056 | postcss: 8.5.6
2057 | rollup: 4.47.1
2058 | tinyglobby: 0.2.14
2059 | optionalDependencies:
2060 | fsevents: 2.3.3
2061 |
2062 | webcrypto-core@1.8.1:
2063 | dependencies:
2064 | '@peculiar/asn1-schema': 2.4.0
2065 | '@peculiar/json-schema': 1.1.12
2066 | asn1js: 3.0.6
2067 | pvtsutils: 1.3.6
2068 | tslib: 2.8.1
2069 | optional: true
2070 |
2071 | wrappy@1.0.2: {}
2072 |
2073 | ws@7.5.10: {}
2074 |
2075 | yallist@3.1.1: {}
2076 |
--------------------------------------------------------------------------------