diff --git a/interface/package.json b/interface/package.json
index 0234290c6..07dcf3af2 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -26,8 +26,8 @@
"@alova/adapter-xhr": "2.3.1",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
- "@mui/icons-material": "^7.3.9",
- "@mui/material": "^7.3.9",
+ "@mui/icons-material": "^9.0.0",
+ "@mui/material": "^9.0.0",
"@preact/compat": "^18.3.2",
"@table-library/react-table-library": "4.1.15",
"alova": "^3.5.1",
@@ -37,11 +37,11 @@
"jwt-decode": "^4.0.0",
"magic-string": "^0.30.21",
"mime-types": "^3.0.2",
- "preact": "^10.29.0",
- "react": "^19.2.4",
- "react-dom": "^19.2.4",
+ "preact": "^10.29.1",
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5",
"react-icons": "^5.6.0",
- "react-router": "^7.13.2",
+ "react-router": "^7.14.1",
"react-toastify": "^11.0.5",
"typesafe-i18n": "^5.27.1",
"typescript": "^6.0.2"
@@ -52,18 +52,18 @@
"@preact/compat": "^18.3.2",
"@preact/preset-vite": "^2.10.5",
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
- "@types/node": "^25.5.0",
+ "@types/node": "^25.6.0",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
- "axe-core": "^4.11.1",
+ "axe-core": "^4.11.3",
"concurrently": "^9.2.1",
- "eslint": "^10.1.0",
+ "eslint": "^10.2.0",
"eslint-config-prettier": "^10.1.8",
- "prettier": "^3.8.1",
+ "prettier": "^3.8.3",
"rollup-plugin-visualizer": "^7.0.1",
"terser": "^5.46.1",
- "typescript-eslint": "^8.58.0",
- "vite": "^8.0.3",
+ "typescript-eslint": "^8.58.2",
+ "vite": "^8.0.8",
"vite-plugin-imagemin": "^0.6.1"
},
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319"
diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml
index a40414691..4ff491e52 100644
--- a/interface/pnpm-lock.yaml
+++ b/interface/pnpm-lock.yaml
@@ -13,22 +13,22 @@ importers:
version: 2.3.1(alova@3.5.1)
'@emotion/react':
specifier: ^11.14.0
- version: 11.14.0(@types/react@19.2.14)(react@19.2.4)
+ version: 11.14.0(@types/react@19.2.14)(react@19.2.5)
'@emotion/styled':
specifier: ^11.14.1
- version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
+ version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
'@mui/icons-material':
- specifier: ^7.3.9
- version: 7.3.9(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
+ specifier: ^9.0.0
+ version: 9.0.0(@mui/material@9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
'@mui/material':
- specifier: ^7.3.9
- version: 7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ specifier: ^9.0.0
+ version: 9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@preact/compat':
specifier: ^18.3.2
- version: 18.3.2(preact@10.29.0)
+ version: 18.3.2(preact@10.29.1)
'@table-library/react-table-library':
specifier: 4.1.15
- version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
alova:
specifier: ^3.5.1
version: 3.5.1
@@ -51,23 +51,23 @@ importers:
specifier: ^3.0.2
version: 3.0.2
preact:
- specifier: ^10.29.0
- version: 10.29.0
+ specifier: ^10.29.1
+ version: 10.29.1
react:
- specifier: ^19.2.4
- version: 19.2.4
+ specifier: ^19.2.5
+ version: 19.2.5
react-dom:
- specifier: ^19.2.4
- version: 19.2.4(react@19.2.4)
+ specifier: ^19.2.5
+ version: 19.2.5(react@19.2.5)
react-icons:
specifier: ^5.6.0
- version: 5.6.0(react@19.2.4)
+ version: 5.6.0(react@19.2.5)
react-router:
- specifier: ^7.13.2
- version: 7.13.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ specifier: ^7.14.1
+ version: 7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react-toastify:
specifier: ^11.0.5
- version: 11.0.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ version: 11.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
typesafe-i18n:
specifier: ^5.27.1
version: 5.27.1(typescript@6.0.2)
@@ -80,16 +80,16 @@ importers:
version: 7.29.0
'@eslint/js':
specifier: ^10.0.1
- version: 10.0.1(eslint@10.1.0)
+ version: 10.0.1(eslint@10.2.0)
'@preact/preset-vite':
specifier: ^2.10.5
- version: 2.10.5(@babel/core@7.29.0)(preact@10.29.0)(rollup@4.59.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1))
+ version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1))
'@trivago/prettier-plugin-sort-imports':
specifier: ^6.0.2
- version: 6.0.2(prettier@3.8.1)
+ version: 6.0.2(prettier@3.8.3)
'@types/node':
- specifier: ^25.5.0
- version: 25.5.0
+ specifier: ^25.6.0
+ version: 25.6.0
'@types/react':
specifier: ^19.2.14
version: 19.2.14
@@ -97,35 +97,35 @@ importers:
specifier: ^19.2.3
version: 19.2.3(@types/react@19.2.14)
axe-core:
- specifier: ^4.11.1
- version: 4.11.1
+ specifier: ^4.11.3
+ version: 4.11.3
concurrently:
specifier: ^9.2.1
version: 9.2.1
eslint:
- specifier: ^10.1.0
- version: 10.1.0
+ specifier: ^10.2.0
+ version: 10.2.0
eslint-config-prettier:
specifier: ^10.1.8
- version: 10.1.8(eslint@10.1.0)
+ version: 10.1.8(eslint@10.2.0)
prettier:
- specifier: ^3.8.1
- version: 3.8.1
+ specifier: ^3.8.3
+ version: 3.8.3
rollup-plugin-visualizer:
specifier: ^7.0.1
- version: 7.0.1(rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1))(rollup@4.59.0)
+ version: 7.0.1(rolldown@1.0.0-rc.15)(rollup@4.59.0)
terser:
specifier: ^5.46.1
version: 5.46.1
typescript-eslint:
- specifier: ^8.58.0
- version: 8.58.0(eslint@10.1.0)(typescript@6.0.2)
+ specifier: ^8.58.2
+ version: 8.58.2(eslint@10.2.0)(typescript@6.0.2)
vite:
- specifier: ^8.0.3
- version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)
+ specifier: ^8.0.8
+ version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)
vite-plugin-imagemin:
specifier: ^0.6.1
- version: 0.6.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1))
+ version: 0.6.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1))
packages:
@@ -234,14 +234,14 @@ packages:
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'}
- '@emnapi/core@1.9.1':
- resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==}
+ '@emnapi/core@1.9.2':
+ resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==}
- '@emnapi/runtime@1.9.1':
- resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==}
+ '@emnapi/runtime@1.9.2':
+ resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==}
- '@emnapi/wasi-threads@1.2.0':
- resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==}
+ '@emnapi/wasi-threads@1.2.1':
+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
'@emotion/babel-plugin@11.13.5':
resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==}
@@ -469,16 +469,16 @@ packages:
resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- '@eslint/config-array@0.23.3':
- resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==}
+ '@eslint/config-array@0.23.5':
+ resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- '@eslint/config-helpers@0.5.3':
- resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==}
+ '@eslint/config-helpers@0.5.5':
+ resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- '@eslint/core@1.1.1':
- resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==}
+ '@eslint/core@1.2.1':
+ resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
'@eslint/js@10.0.1':
@@ -490,12 +490,12 @@ packages:
eslint:
optional: true
- '@eslint/object-schema@3.0.3':
- resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==}
+ '@eslint/object-schema@3.0.5':
+ resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- '@eslint/plugin-kit@0.6.1':
- resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==}
+ '@eslint/plugin-kit@0.7.1':
+ resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
'@humanfs/core@0.19.1':
@@ -533,27 +533,27 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@mui/core-downloads-tracker@7.3.9':
- resolution: {integrity: sha512-MOkOCTfbMJwLshlBCKJ59V2F/uaLYfmKnN76kksj6jlGUVdI25A9Hzs08m+zjBRdLv+sK7Rqdsefe8X7h/6PCw==}
+ '@mui/core-downloads-tracker@9.0.0':
+ resolution: {integrity: sha512-uwQNGkhv0lf7ufxw6QXev77BW6pWbW+7uxYjU5+rfp4lBkFtMEgJCsarTM3Tn+i0lGx6+Ol2u88JdGXr0GDskA==}
- '@mui/icons-material@7.3.9':
- resolution: {integrity: sha512-BT+zPJXss8Hg/oEMRmHl17Q97bPACG4ufFSfGEdhiE96jOyR5Dz1ty7ZWt1fVGR0y1p+sSgEwQT/MNZQmoWDCw==}
+ '@mui/icons-material@9.0.0':
+ resolution: {integrity: sha512-oDwyvI6LgjWRC9MBcSGvLkPud9S9ELgSBQFYxa1rYcZn6Br55dn22SyvsPDMsn0G8OndFk53iMT45W5mNqrogw==}
engines: {node: '>=14.0.0'}
peerDependencies:
- '@mui/material': ^7.3.9
+ '@mui/material': ^9.0.0
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
optional: true
- '@mui/material@7.3.9':
- resolution: {integrity: sha512-I8yO3t4T0y7bvDiR1qhIN6iBWZOTBfVOnmLlM7K6h3dx5YX2a7rnkuXzc2UkZaqhxY9NgTnEbdPlokR1RxCNRQ==}
+ '@mui/material@9.0.0':
+ resolution: {integrity: sha512-+VP/oQCDhDR87NQQgXnNBG8dwy6GNuQLnenS1pZvkbn2dKFSxRSRMybTpH9xUxXP+316mlYDy5CSbYtusnCWtw==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
'@emotion/styled': ^11.3.0
- '@mui/material-pigment-css': ^7.3.9
+ '@mui/material-pigment-css': ^9.0.0
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -567,8 +567,8 @@ packages:
'@types/react':
optional: true
- '@mui/private-theming@7.3.9':
- resolution: {integrity: sha512-ErIyRQvsiQEq7Yvcvfw9UDHngaqjMy9P3JDPnRAaKG5qhpl2C4tX/W1S4zJvpu+feihmZJStjIyvnv6KDbIrlw==}
+ '@mui/private-theming@9.0.0':
+ resolution: {integrity: sha512-JtuZoaiCqwD6vjgYu6Xp3T7DZkrxJlgtDz5yESzhI34fEX5hHMh2VJUbuL9UOg8xrfIFMrq6dcYoH/7Zi4G0RA==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -577,8 +577,8 @@ packages:
'@types/react':
optional: true
- '@mui/styled-engine@7.3.9':
- resolution: {integrity: sha512-JqujWt5bX4okjUPGpVof/7pvgClqh7HvIbsIBIOOlCh2u3wG/Bwp4+E1bc1dXSwkrkp9WUAoNdI5HEC+5HKvMw==}
+ '@mui/styled-engine@9.0.0':
+ resolution: {integrity: sha512-9RLGdX4Jg0aQPRuvqh/OLzYSPlgd5zyEw5/1HIRfdavSiOd03WtUaGZH9/w1RoTYuRKwpgy0hpIFaMHIqPVIWg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.4.1
@@ -590,8 +590,8 @@ packages:
'@emotion/styled':
optional: true
- '@mui/system@7.3.9':
- resolution: {integrity: sha512-aL1q9am8XpRrSabv9qWf5RHhJICJql34wnrc1nz0MuOglPRYF/liN+c8VqZdTvUn9qg+ZjRVbKf4sJVFfIDtmg==}
+ '@mui/system@9.0.0':
+ resolution: {integrity: sha512-YnC5Zg6j04IxiLc/boAKs0464jfZlLFVa7mf5E8lF0XOtZVUvG6R6gJK50lgUYdaaLdyLfxF6xR7LaPuEpeT/g==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -606,16 +606,16 @@ packages:
'@types/react':
optional: true
- '@mui/types@7.4.12':
- resolution: {integrity: sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==}
+ '@mui/types@9.0.0':
+ resolution: {integrity: sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
optional: true
- '@mui/utils@7.3.9':
- resolution: {integrity: sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==}
+ '@mui/utils@9.0.0':
+ resolution: {integrity: sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -624,8 +624,8 @@ packages:
'@types/react':
optional: true
- '@napi-rs/wasm-runtime@1.1.2':
- resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==}
+ '@napi-rs/wasm-runtime@1.1.3':
+ resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==}
peerDependencies:
'@emnapi/core': ^1.7.1
'@emnapi/runtime': ^1.7.1
@@ -646,8 +646,8 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@oxc-project/types@0.122.0':
- resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==}
+ '@oxc-project/types@0.124.0':
+ resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==}
'@paralleldrive/cuid2@2.3.1':
resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==}
@@ -683,103 +683,103 @@ packages:
preact: ^10.4.0 || ^11.0.0-0
vite: '>=2.0.0'
- '@rolldown/binding-android-arm64@1.0.0-rc.12':
- resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==}
+ '@rolldown/binding-android-arm64@1.0.0-rc.15':
+ resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rolldown/binding-darwin-arm64@1.0.0-rc.12':
- resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==}
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.15':
+ resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.0.0-rc.12':
- resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==}
+ '@rolldown/binding-darwin-x64@1.0.0-rc.15':
+ resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rolldown/binding-freebsd-x64@1.0.0-rc.12':
- resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==}
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.15':
+ resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12':
- resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==}
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15':
+ resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12':
- resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==}
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12':
- resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==}
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15':
+ resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12':
- resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==}
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12':
- resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==}
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12':
- resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==}
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.12':
- resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==}
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.15':
+ resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.12':
- resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==}
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.15':
+ resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.12':
- resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==}
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.15':
+ resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12':
- resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==}
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15':
+ resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12':
- resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==}
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15':
+ resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- '@rolldown/pluginutils@1.0.0-rc.12':
- resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==}
+ '@rolldown/pluginutils@1.0.0-rc.15':
+ resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==}
'@rollup/pluginutils@4.2.1':
resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
@@ -1005,8 +1005,8 @@ packages:
resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==}
deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.
- '@types/node@25.5.0':
- resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==}
+ '@types/node@25.6.0':
+ resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==}
'@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -1033,63 +1033,63 @@ packages:
'@types/svgo@2.6.4':
resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
- '@typescript-eslint/eslint-plugin@8.58.0':
- resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==}
+ '@typescript-eslint/eslint-plugin@8.58.2':
+ resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.58.0
+ '@typescript-eslint/parser': ^8.58.2
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.58.0':
- resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==}
+ '@typescript-eslint/parser@8.58.2':
+ resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/project-service@8.58.0':
- resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==}
+ '@typescript-eslint/project-service@8.58.2':
+ resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/scope-manager@8.58.0':
- resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==}
+ '@typescript-eslint/scope-manager@8.58.2':
+ resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.58.0':
- resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==}
+ '@typescript-eslint/tsconfig-utils@8.58.2':
+ resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.58.0':
- resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==}
+ '@typescript-eslint/type-utils@8.58.2':
+ resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/types@8.58.0':
- resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==}
+ '@typescript-eslint/types@8.58.2':
+ resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.58.0':
- resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==}
+ '@typescript-eslint/typescript-estree@8.58.2':
+ resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/utils@8.58.0':
- resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==}
+ '@typescript-eslint/utils@8.58.2':
+ resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/visitor-keys@8.58.0':
- resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==}
+ '@typescript-eslint/visitor-keys@8.58.2':
+ resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2:
@@ -1158,8 +1158,8 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- axe-core@4.11.1:
- resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==}
+ axe-core@4.11.3:
+ resolution: {integrity: sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==}
engines: {node: '>=4'}
babel-plugin-macros@3.1.0:
@@ -1181,8 +1181,8 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
- baseline-browser-mapping@2.10.12:
- resolution: {integrity: sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==}
+ baseline-browser-mapping@2.10.19:
+ resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -1212,11 +1212,11 @@ packages:
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
- brace-expansion@1.1.13:
- resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==}
+ brace-expansion@1.1.14:
+ resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==}
- brace-expansion@2.0.3:
- resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==}
+ brace-expansion@2.1.0:
+ resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==}
brace-expansion@5.0.5:
resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==}
@@ -1226,8 +1226,8 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.28.1:
- resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ browserslist@4.28.2:
+ resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -1260,8 +1260,8 @@ packages:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
- call-bind@1.0.8:
- resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ call-bind@1.0.9:
+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
engines: {node: '>= 0.4'}
call-bound@1.0.4:
@@ -1280,8 +1280,8 @@ packages:
resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==}
engines: {node: '>=0.10.0'}
- caniuse-lite@1.0.30001782:
- resolution: {integrity: sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==}
+ caniuse-lite@1.0.30001788:
+ resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==}
caw@2.0.1:
resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
@@ -1516,8 +1516,8 @@ packages:
duplexer3@0.1.5:
resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
- electron-to-chromium@1.5.328:
- resolution: {integrity: sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==}
+ electron-to-chromium@1.5.336:
+ resolution: {integrity: sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -1710,8 +1710,8 @@ packages:
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- eslint@10.1.0:
- resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==}
+ eslint@10.2.0:
+ resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
hasBin: true
peerDependencies:
@@ -1792,8 +1792,8 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- fast-xml-parser@4.5.5:
- resolution: {integrity: sha512-cK9c5I/DwIOI7/Q7AlGN3DuTdwN61gwSfL8rvuVPK+0mcCNHHGxRrpiFtaZZRfRMJL3Gl8B2AFlBG6qXf03w9A==}
+ fast-xml-parser@4.5.6:
+ resolution: {integrity: sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==}
hasBin: true
fastq@1.20.1:
@@ -2377,8 +2377,8 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
- lodash-es@4.17.23:
- resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
+ lodash-es@4.18.1:
+ resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
logalot@2.1.0:
resolution: {integrity: sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==}
@@ -2507,8 +2507,8 @@ packages:
node-html-parser@6.1.13:
resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==}
- node-releases@2.0.36:
- resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
+ node-releases@2.0.37:
+ resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==}
normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
@@ -2711,16 +2711,16 @@ packages:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
- postcss@8.5.8:
- resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+ postcss@8.5.9:
+ resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==}
engines: {node: ^10 || ^12 || >=14}
powershell-utils@0.1.0:
resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
engines: {node: '>=20'}
- preact@10.29.0:
- resolution: {integrity: sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==}
+ preact@10.29.1:
+ resolution: {integrity: sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==}
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@@ -2734,8 +2734,8 @@ packages:
resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
engines: {node: '>=4'}
- prettier@3.8.1:
- resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
+ prettier@3.8.3:
+ resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==}
engines: {node: '>=14'}
hasBin: true
@@ -2768,10 +2768,10 @@ packages:
rate-limiter-flexible@5.0.5:
resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==}
- react-dom@19.2.4:
- resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
+ react-dom@19.2.5:
+ resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==}
peerDependencies:
- react: ^19.2.4
+ react: ^19.2.5
react-icons@5.6.0:
resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==}
@@ -2781,11 +2781,11 @@ packages:
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- react-is@19.2.4:
- resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==}
+ react-is@19.2.5:
+ resolution: {integrity: sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==}
- react-router@7.13.2:
- resolution: {integrity: sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==}
+ react-router@7.14.1:
+ resolution: {integrity: sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==}
engines: {node: '>=20.0.0'}
peerDependencies:
react: '>=18'
@@ -2819,8 +2819,8 @@ packages:
react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- react@19.2.4:
- resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
+ react@19.2.5:
+ resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==}
engines: {node: '>=0.10.0'}
read-pkg-up@1.0.1:
@@ -2854,8 +2854,8 @@ packages:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
- resolve@1.22.11:
- resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ resolve@1.22.12:
+ resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
engines: {node: '>= 0.4'}
hasBin: true
@@ -2871,8 +2871,8 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
- rolldown@1.0.0-rc.12:
- resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==}
+ rolldown@1.0.0-rc.15:
+ resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -3136,8 +3136,8 @@ packages:
resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
engines: {node: '>=0.10.0'}
- tinyglobby@0.2.15:
- resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
engines: {node: '>=12.0.0'}
to-buffer@1.2.2:
@@ -3190,8 +3190,8 @@ packages:
peerDependencies:
typescript: '>=3.5.1'
- typescript-eslint@8.58.0:
- resolution: {integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==}
+ typescript-eslint@8.58.2:
+ resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -3205,8 +3205,8 @@ packages:
unbzip2-stream@1.4.3:
resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
- undici-types@7.18.2:
- resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+ undici-types@7.19.2:
+ resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==}
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
@@ -3254,14 +3254,14 @@ packages:
peerDependencies:
vite: 5.x || 6.x || 7.x || 8.x
- vite@8.0.3:
- resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==}
+ vite@8.0.8:
+ resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
'@vitejs/devtools': ^0.1.0
- esbuild: ^0.27.0
+ esbuild: ^0.27.0 || ^0.28.0
jiti: '>=1.21.0'
less: ^4.0.0
sass: ^1.70.0
@@ -3426,7 +3426,7 @@ snapshots:
dependencies:
'@babel/compat-data': 7.29.0
'@babel/helper-validator-option': 7.27.1
- browserslist: 4.28.1
+ browserslist: 4.28.2
lru-cache: 5.1.1
semver: 6.3.1
@@ -3513,18 +3513,18 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@emnapi/core@1.9.1':
+ '@emnapi/core@1.9.2':
dependencies:
- '@emnapi/wasi-threads': 1.2.0
+ '@emnapi/wasi-threads': 1.2.1
tslib: 2.8.1
optional: true
- '@emnapi/runtime@1.9.1':
+ '@emnapi/runtime@1.9.2':
dependencies:
tslib: 2.8.1
optional: true
- '@emnapi/wasi-threads@1.2.0':
+ '@emnapi/wasi-threads@1.2.1':
dependencies:
tslib: 2.8.1
optional: true
@@ -3561,17 +3561,17 @@ snapshots:
'@emotion/memoize@0.9.0': {}
- '@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4)':
+ '@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
'@emotion/babel-plugin': 11.13.5
'@emotion/cache': 11.14.0
'@emotion/serialize': 1.3.3
- '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.4)
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.5)
'@emotion/utils': 1.4.2
'@emotion/weak-memoize': 0.4.0
hoist-non-react-statics: 3.3.2
- react: 19.2.4
+ react: 19.2.5
optionalDependencies:
'@types/react': 19.2.14
transitivePeerDependencies:
@@ -3587,16 +3587,16 @@ snapshots:
'@emotion/sheet@1.4.0': {}
- '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)':
+ '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
'@emotion/babel-plugin': 11.13.5
'@emotion/is-prop-valid': 1.4.0
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.4)
+ '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
'@emotion/serialize': 1.3.3
- '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.4)
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.5)
'@emotion/utils': 1.4.2
- react: 19.2.4
+ react: 19.2.5
optionalDependencies:
'@types/react': 19.2.14
transitivePeerDependencies:
@@ -3604,9 +3604,9 @@ snapshots:
'@emotion/unitless@0.10.0': {}
- '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.4)':
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.5)':
dependencies:
- react: 19.2.4
+ react: 19.2.5
'@emotion/utils@1.4.2': {}
@@ -3693,38 +3693,38 @@ snapshots:
'@esbuild/win32-x64@0.27.4':
optional: true
- '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0)':
+ '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)':
dependencies:
- eslint: 10.1.0
+ eslint: 10.2.0
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
- '@eslint/config-array@0.23.3':
+ '@eslint/config-array@0.23.5':
dependencies:
- '@eslint/object-schema': 3.0.3
+ '@eslint/object-schema': 3.0.5
debug: 4.4.3
minimatch: 10.2.5
transitivePeerDependencies:
- supports-color
- '@eslint/config-helpers@0.5.3':
+ '@eslint/config-helpers@0.5.5':
dependencies:
- '@eslint/core': 1.1.1
+ '@eslint/core': 1.2.1
- '@eslint/core@1.1.1':
+ '@eslint/core@1.2.1':
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/js@10.0.1(eslint@10.1.0)':
+ '@eslint/js@10.0.1(eslint@10.2.0)':
optionalDependencies:
- eslint: 10.1.0
+ eslint: 10.2.0
- '@eslint/object-schema@3.0.3': {}
+ '@eslint/object-schema@3.0.5': {}
- '@eslint/plugin-kit@0.6.1':
+ '@eslint/plugin-kit@0.7.1':
dependencies:
- '@eslint/core': 1.1.1
+ '@eslint/core': 1.2.1
levn: 0.4.1
'@humanfs/core@0.19.1': {}
@@ -3762,47 +3762,47 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
- '@mui/core-downloads-tracker@7.3.9': {}
+ '@mui/core-downloads-tracker@9.0.0': {}
- '@mui/icons-material@7.3.9(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)':
+ '@mui/icons-material@9.0.0(@mui/material@9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
- '@mui/material': 7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
- react: 19.2.4
+ '@mui/material': 9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react: 19.2.5
optionalDependencies:
'@types/react': 19.2.14
- '@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ '@mui/material@9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
- '@mui/core-downloads-tracker': 7.3.9
- '@mui/system': 7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
- '@mui/types': 7.4.12(@types/react@19.2.14)
- '@mui/utils': 7.3.9(@types/react@19.2.14)(react@19.2.4)
+ '@mui/core-downloads-tracker': 9.0.0
+ '@mui/system': 9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
+ '@mui/types': 9.0.0(@types/react@19.2.14)
+ '@mui/utils': 9.0.0(@types/react@19.2.14)(react@19.2.5)
'@popperjs/core': 2.11.8
'@types/react-transition-group': 4.4.12(@types/react@19.2.14)
clsx: 2.1.1
csstype: 3.2.3
prop-types: 15.8.1
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
- react-is: 19.2.4
- react-transition-group: 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.5
+ react-dom: 19.2.5(react@19.2.5)
+ react-is: 19.2.5
+ react-transition-group: 4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
optionalDependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.4)
- '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
+ '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
'@types/react': 19.2.14
- '@mui/private-theming@7.3.9(@types/react@19.2.14)(react@19.2.4)':
+ '@mui/private-theming@9.0.0(@types/react@19.2.14)(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
- '@mui/utils': 7.3.9(@types/react@19.2.14)(react@19.2.4)
+ '@mui/utils': 9.0.0(@types/react@19.2.14)(react@19.2.5)
prop-types: 15.8.1
- react: 19.2.4
+ react: 19.2.5
optionalDependencies:
'@types/react': 19.2.14
- '@mui/styled-engine@7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4)':
+ '@mui/styled-engine@9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
'@emotion/cache': 11.14.0
@@ -3810,49 +3810,49 @@ snapshots:
'@emotion/sheet': 1.4.0
csstype: 3.2.3
prop-types: 15.8.1
- react: 19.2.4
+ react: 19.2.5
optionalDependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.4)
- '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
+ '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
- '@mui/system@7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)':
+ '@mui/system@9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
- '@mui/private-theming': 7.3.9(@types/react@19.2.14)(react@19.2.4)
- '@mui/styled-engine': 7.3.9(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4)
- '@mui/types': 7.4.12(@types/react@19.2.14)
- '@mui/utils': 7.3.9(@types/react@19.2.14)(react@19.2.4)
+ '@mui/private-theming': 9.0.0(@types/react@19.2.14)(react@19.2.5)
+ '@mui/styled-engine': 9.0.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5))(react@19.2.5)
+ '@mui/types': 9.0.0(@types/react@19.2.14)
+ '@mui/utils': 9.0.0(@types/react@19.2.14)(react@19.2.5)
clsx: 2.1.1
csstype: 3.2.3
prop-types: 15.8.1
- react: 19.2.4
+ react: 19.2.5
optionalDependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.4)
- '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
+ '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)
'@types/react': 19.2.14
- '@mui/types@7.4.12(@types/react@19.2.14)':
+ '@mui/types@9.0.0(@types/react@19.2.14)':
dependencies:
'@babel/runtime': 7.29.2
optionalDependencies:
'@types/react': 19.2.14
- '@mui/utils@7.3.9(@types/react@19.2.14)(react@19.2.4)':
+ '@mui/utils@9.0.0(@types/react@19.2.14)(react@19.2.5)':
dependencies:
'@babel/runtime': 7.29.2
- '@mui/types': 7.4.12(@types/react@19.2.14)
+ '@mui/types': 9.0.0(@types/react@19.2.14)
'@types/prop-types': 15.7.15
clsx: 2.1.1
prop-types: 15.8.1
- react: 19.2.4
- react-is: 19.2.4
+ react: 19.2.5
+ react-is: 19.2.5
optionalDependencies:
'@types/react': 19.2.14
- '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)':
+ '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)':
dependencies:
- '@emnapi/core': 1.9.1
- '@emnapi/runtime': 1.9.1
+ '@emnapi/core': 1.9.2
+ '@emnapi/runtime': 1.9.2
'@tybys/wasm-util': 0.10.1
optional: true
@@ -3870,7 +3870,7 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.20.1
- '@oxc-project/types@0.122.0': {}
+ '@oxc-project/types@0.124.0': {}
'@paralleldrive/cuid2@2.3.1':
dependencies:
@@ -3878,23 +3878,23 @@ snapshots:
'@popperjs/core@2.11.8': {}
- '@preact/compat@18.3.2(preact@10.29.0)':
+ '@preact/compat@18.3.2(preact@10.29.1)':
dependencies:
- preact: 10.29.0
+ preact: 10.29.1
- '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.0)(rollup@4.59.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1))':
+ '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0)
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0)
- '@prefresh/vite': 2.4.12(preact@10.29.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1))
+ '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1))
'@rollup/pluginutils': 5.3.0(rollup@4.59.0)
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0)
debug: 4.4.3
magic-string: 0.30.21
picocolors: 1.1.1
- vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)
- vite-prerender-plugin: 0.5.13(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1))
+ vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)
+ vite-prerender-plugin: 0.5.13(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1))
zimmerframe: 1.1.4
transitivePeerDependencies:
- preact
@@ -3903,75 +3903,74 @@ snapshots:
'@prefresh/babel-plugin@0.5.3': {}
- '@prefresh/core@1.5.9(preact@10.29.0)':
+ '@prefresh/core@1.5.9(preact@10.29.1)':
dependencies:
- preact: 10.29.0
+ preact: 10.29.1
'@prefresh/utils@1.2.1': {}
- '@prefresh/vite@2.4.12(preact@10.29.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1))':
+ '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1))':
dependencies:
'@babel/core': 7.29.0
'@prefresh/babel-plugin': 0.5.3
- '@prefresh/core': 1.5.9(preact@10.29.0)
+ '@prefresh/core': 1.5.9(preact@10.29.1)
'@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1
- preact: 10.29.0
- vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)
+ preact: 10.29.1
+ vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)
transitivePeerDependencies:
- supports-color
- '@rolldown/binding-android-arm64@1.0.0-rc.12':
+ '@rolldown/binding-android-arm64@1.0.0-rc.15':
optional: true
- '@rolldown/binding-darwin-arm64@1.0.0-rc.12':
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.15':
optional: true
- '@rolldown/binding-darwin-x64@1.0.0-rc.12':
+ '@rolldown/binding-darwin-x64@1.0.0-rc.15':
optional: true
- '@rolldown/binding-freebsd-x64@1.0.0-rc.12':
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12':
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12':
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12':
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12':
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12':
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12':
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15':
optional: true
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.12':
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.15':
optional: true
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.12':
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.15':
optional: true
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)':
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.15':
dependencies:
- '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
- transitivePeerDependencies:
- - '@emnapi/core'
- - '@emnapi/runtime'
+ '@emnapi/core': 1.9.2
+ '@emnapi/runtime': 1.9.2
+ '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)
optional: true
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12':
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15':
optional: true
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12':
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15':
optional: true
- '@rolldown/pluginutils@1.0.0-rc.12': {}
+ '@rolldown/pluginutils@1.0.0-rc.15': {}
'@rollup/pluginutils@4.2.1':
dependencies:
@@ -4063,26 +4062,26 @@ snapshots:
'@sindresorhus/is@0.7.0': {}
- '@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ '@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies:
- '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.4)
+ '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5)
clsx: 1.1.1
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
- react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
- react-window: 1.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.5
+ react-dom: 19.2.5(react@19.2.5)
+ react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ react-window: 1.8.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
- '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1)':
+ '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3)':
dependencies:
'@babel/generator': 7.29.1
'@babel/parser': 7.29.2
'@babel/traverse': 7.29.0
'@babel/types': 7.29.0
javascript-natural-sort: 0.7.1
- lodash-es: 4.17.23
+ lodash-es: 4.18.1
minimatch: 9.0.9
parse-imports-exports: 0.2.4
- prettier: 3.8.1
+ prettier: 3.8.3
transitivePeerDependencies:
- supports-color
@@ -4098,7 +4097,7 @@ snapshots:
'@types/glob@7.2.0':
dependencies:
'@types/minimatch': 6.0.0
- '@types/node': 25.5.0
+ '@types/node': 25.6.0
'@types/imagemin-gifsicle@7.0.4':
dependencies:
@@ -4127,21 +4126,21 @@ snapshots:
'@types/imagemin@7.0.1':
dependencies:
- '@types/node': 25.5.0
+ '@types/node': 25.6.0
'@types/json-schema@7.0.15': {}
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 25.5.0
+ '@types/node': 25.6.0
'@types/minimatch@6.0.0':
dependencies:
minimatch: 10.2.5
- '@types/node@25.5.0':
+ '@types/node@25.6.0':
dependencies:
- undici-types: 7.18.2
+ undici-types: 7.19.2
'@types/parse-json@4.0.2': {}
@@ -4161,21 +4160,21 @@ snapshots:
'@types/responselike@1.0.3':
dependencies:
- '@types/node': 25.5.0
+ '@types/node': 25.6.0
'@types/svgo@2.6.4':
dependencies:
- '@types/node': 25.5.0
+ '@types/node': 25.6.0
- '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2))(eslint@10.1.0)(typescript@6.0.2)':
+ '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.58.0(eslint@10.1.0)(typescript@6.0.2)
- '@typescript-eslint/scope-manager': 8.58.0
- '@typescript-eslint/type-utils': 8.58.0(eslint@10.1.0)(typescript@6.0.2)
- '@typescript-eslint/utils': 8.58.0(eslint@10.1.0)(typescript@6.0.2)
- '@typescript-eslint/visitor-keys': 8.58.0
- eslint: 10.1.0
+ '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2)
+ '@typescript-eslint/scope-manager': 8.58.2
+ '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2)
+ '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2)
+ '@typescript-eslint/visitor-keys': 8.58.2
+ eslint: 10.2.0
ignore: 7.0.5
natural-compare: 1.4.0
ts-api-utils: 2.5.0(typescript@6.0.2)
@@ -4183,79 +4182,79 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2)':
+ '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)':
dependencies:
- '@typescript-eslint/scope-manager': 8.58.0
- '@typescript-eslint/types': 8.58.0
- '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2)
- '@typescript-eslint/visitor-keys': 8.58.0
+ '@typescript-eslint/scope-manager': 8.58.2
+ '@typescript-eslint/types': 8.58.2
+ '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2)
+ '@typescript-eslint/visitor-keys': 8.58.2
debug: 4.4.3
- eslint: 10.1.0
+ eslint: 10.2.0
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.58.0(typescript@6.0.2)':
+ '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2)
- '@typescript-eslint/types': 8.58.0
+ '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2)
+ '@typescript-eslint/types': 8.58.2
debug: 4.4.3
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.58.0':
+ '@typescript-eslint/scope-manager@8.58.2':
dependencies:
- '@typescript-eslint/types': 8.58.0
- '@typescript-eslint/visitor-keys': 8.58.0
+ '@typescript-eslint/types': 8.58.2
+ '@typescript-eslint/visitor-keys': 8.58.2
- '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)':
+ '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)':
dependencies:
typescript: 6.0.2
- '@typescript-eslint/type-utils@8.58.0(eslint@10.1.0)(typescript@6.0.2)':
+ '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)':
dependencies:
- '@typescript-eslint/types': 8.58.0
- '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2)
- '@typescript-eslint/utils': 8.58.0(eslint@10.1.0)(typescript@6.0.2)
+ '@typescript-eslint/types': 8.58.2
+ '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2)
+ '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2)
debug: 4.4.3
- eslint: 10.1.0
+ eslint: 10.2.0
ts-api-utils: 2.5.0(typescript@6.0.2)
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.58.0': {}
+ '@typescript-eslint/types@8.58.2': {}
- '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.2)':
+ '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)':
dependencies:
- '@typescript-eslint/project-service': 8.58.0(typescript@6.0.2)
- '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2)
- '@typescript-eslint/types': 8.58.0
- '@typescript-eslint/visitor-keys': 8.58.0
+ '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2)
+ '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2)
+ '@typescript-eslint/types': 8.58.2
+ '@typescript-eslint/visitor-keys': 8.58.2
debug: 4.4.3
minimatch: 10.2.5
semver: 7.7.4
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
ts-api-utils: 2.5.0(typescript@6.0.2)
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.58.0(eslint@10.1.0)(typescript@6.0.2)':
+ '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0)
- '@typescript-eslint/scope-manager': 8.58.0
- '@typescript-eslint/types': 8.58.0
- '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2)
- eslint: 10.1.0
+ '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0)
+ '@typescript-eslint/scope-manager': 8.58.2
+ '@typescript-eslint/types': 8.58.2
+ '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2)
+ eslint: 10.2.0
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.58.0':
+ '@typescript-eslint/visitor-keys@8.58.2':
dependencies:
- '@typescript-eslint/types': 8.58.0
+ '@typescript-eslint/types': 8.58.2
eslint-visitor-keys: 5.0.1
acorn-jsx@5.3.2(acorn@8.16.0):
@@ -4308,13 +4307,13 @@ snapshots:
dependencies:
possible-typed-array-names: 1.1.0
- axe-core@4.11.1: {}
+ axe-core@4.11.3: {}
babel-plugin-macros@3.1.0:
dependencies:
'@babel/runtime': 7.29.2
cosmiconfig: 7.1.0
- resolve: 1.22.11
+ resolve: 1.22.12
babel-plugin-transform-hook-names@1.0.2(@babel/core@7.29.0):
dependencies:
@@ -4326,7 +4325,7 @@ snapshots:
base64-js@1.5.1: {}
- baseline-browser-mapping@2.10.12: {}
+ baseline-browser-mapping@2.10.19: {}
bin-build@3.0.0:
dependencies:
@@ -4368,12 +4367,12 @@ snapshots:
boolbase@1.0.0: {}
- brace-expansion@1.1.13:
+ brace-expansion@1.1.14:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
- brace-expansion@2.0.3:
+ brace-expansion@2.1.0:
dependencies:
balanced-match: 1.0.2
@@ -4385,13 +4384,13 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.28.1:
+ browserslist@4.28.2:
dependencies:
- baseline-browser-mapping: 2.10.12
- caniuse-lite: 1.0.30001782
- electron-to-chromium: 1.5.328
- node-releases: 2.0.36
- update-browserslist-db: 1.2.3(browserslist@4.28.1)
+ baseline-browser-mapping: 2.10.19
+ caniuse-lite: 1.0.30001788
+ electron-to-chromium: 1.5.336
+ node-releases: 2.0.37
+ update-browserslist-db: 1.2.3(browserslist@4.28.2)
buffer-alloc-unsafe@1.1.0: {}
@@ -4430,7 +4429,7 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
- call-bind@1.0.8:
+ call-bind@1.0.9:
dependencies:
call-bind-apply-helpers: 1.0.2
es-define-property: 1.0.1
@@ -4451,7 +4450,7 @@ snapshots:
camelcase@2.1.1: {}
- caniuse-lite@1.0.30001782: {}
+ caniuse-lite@1.0.30001788: {}
caw@2.0.1:
dependencies:
@@ -4753,7 +4752,7 @@ snapshots:
duplexer3@0.1.5: {}
- electron-to-chromium@1.5.328: {}
+ electron-to-chromium@1.5.336: {}
emoji-regex@10.6.0: {}
@@ -4899,9 +4898,9 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@10.1.8(eslint@10.1.0):
+ eslint-config-prettier@10.1.8(eslint@10.2.0):
dependencies:
- eslint: 10.1.0
+ eslint: 10.2.0
eslint-scope@9.1.2:
dependencies:
@@ -4914,14 +4913,14 @@ snapshots:
eslint-visitor-keys@5.0.1: {}
- eslint@10.1.0:
+ eslint@10.2.0:
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0)
+ '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0)
'@eslint-community/regexpp': 4.12.2
- '@eslint/config-array': 0.23.3
- '@eslint/config-helpers': 0.5.3
- '@eslint/core': 1.1.1
- '@eslint/plugin-kit': 0.6.1
+ '@eslint/config-array': 0.23.5
+ '@eslint/config-helpers': 0.5.5
+ '@eslint/core': 1.2.1
+ '@eslint/plugin-kit': 0.7.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
@@ -5050,7 +5049,7 @@ snapshots:
fast-levenshtein@2.0.6: {}
- fast-xml-parser@4.5.5:
+ fast-xml-parser@4.5.6:
dependencies:
strnum: 1.1.2
@@ -5461,7 +5460,7 @@ snapshots:
is-svg@4.4.0:
dependencies:
- fast-xml-parser: 4.5.5
+ fast-xml-parser: 4.5.6
is-typed-array@1.1.15:
dependencies:
@@ -5601,7 +5600,7 @@ snapshots:
dependencies:
p-locate: 5.0.0
- lodash-es@4.17.23: {}
+ lodash-es@4.18.1: {}
logalot@2.1.0:
dependencies:
@@ -5697,11 +5696,11 @@ snapshots:
minimatch@3.1.5:
dependencies:
- brace-expansion: 1.1.13
+ brace-expansion: 1.1.14
minimatch@9.0.9:
dependencies:
- brace-expansion: 2.0.3
+ brace-expansion: 2.1.0
minimist@1.2.8: {}
@@ -5723,12 +5722,12 @@ snapshots:
css-select: 5.2.2
he: 1.2.0
- node-releases@2.0.36: {}
+ node-releases@2.0.37: {}
normalize-package-data@2.5.0:
dependencies:
hosted-git-info: 2.8.9
- resolve: 1.22.11
+ resolve: 1.22.12
semver: 5.7.2
validate-npm-package-license: 3.0.4
@@ -5909,7 +5908,7 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss@8.5.8:
+ postcss@8.5.9:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
@@ -5917,7 +5916,7 @@ snapshots:
powershell-utils@0.1.0: {}
- preact@10.29.0: {}
+ preact@10.29.1: {}
prelude-ls@1.2.1: {}
@@ -5925,7 +5924,7 @@ snapshots:
prepend-http@2.0.0: {}
- prettier@3.8.1: {}
+ prettier@3.8.3: {}
process-nextick-args@2.0.1: {}
@@ -5956,55 +5955,55 @@ snapshots:
rate-limiter-flexible@5.0.5: {}
- react-dom@19.2.4(react@19.2.4):
+ react-dom@19.2.5(react@19.2.5):
dependencies:
- react: 19.2.4
+ react: 19.2.5
scheduler: 0.27.0
- react-icons@5.6.0(react@19.2.4):
+ react-icons@5.6.0(react@19.2.5):
dependencies:
- react: 19.2.4
+ react: 19.2.5
react-is@16.13.1: {}
- react-is@19.2.4: {}
+ react-is@19.2.5: {}
- react-router@7.13.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ react-router@7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies:
cookie: 1.1.1
- react: 19.2.4
+ react: 19.2.5
set-cookie-parser: 2.7.2
optionalDependencies:
- react-dom: 19.2.4(react@19.2.4)
+ react-dom: 19.2.5(react@19.2.5)
- react-toastify@11.0.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ react-toastify@11.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies:
clsx: 2.1.1
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
+ react: 19.2.5
+ react-dom: 19.2.5(react@19.2.5)
- react-transition-group@4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ react-transition-group@4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies:
'@babel/runtime': 7.29.2
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
+ react: 19.2.5
+ react-dom: 19.2.5(react@19.2.5)
- react-virtualized-auto-sizer@1.0.26(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ react-virtualized-auto-sizer@1.0.26(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies:
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
+ react: 19.2.5
+ react-dom: 19.2.5(react@19.2.5)
- react-window@1.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ react-window@1.8.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies:
'@babel/runtime': 7.29.2
memoize-one: 5.2.1
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
+ react: 19.2.5
+ react-dom: 19.2.5(react@19.2.5)
- react@19.2.4: {}
+ react@19.2.5: {}
read-pkg-up@1.0.1:
dependencies:
@@ -6042,8 +6041,9 @@ snapshots:
resolve-from@4.0.0: {}
- resolve@1.22.11:
+ resolve@1.22.12:
dependencies:
+ es-errors: 1.3.0
is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -6058,38 +6058,35 @@ snapshots:
dependencies:
glob: 7.2.3
- rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1):
+ rolldown@1.0.0-rc.15:
dependencies:
- '@oxc-project/types': 0.122.0
- '@rolldown/pluginutils': 1.0.0-rc.12
+ '@oxc-project/types': 0.124.0
+ '@rolldown/pluginutils': 1.0.0-rc.15
optionalDependencies:
- '@rolldown/binding-android-arm64': 1.0.0-rc.12
- '@rolldown/binding-darwin-arm64': 1.0.0-rc.12
- '@rolldown/binding-darwin-x64': 1.0.0-rc.12
- '@rolldown/binding-freebsd-x64': 1.0.0-rc.12
- '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12
- '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12
- '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12
- '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12
- '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12
- '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12
- '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12
- '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12
- '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
- '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12
- '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12
- transitivePeerDependencies:
- - '@emnapi/core'
- - '@emnapi/runtime'
+ '@rolldown/binding-android-arm64': 1.0.0-rc.15
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.15
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.15
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.15
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15
- rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1))(rollup@4.59.0):
+ rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.15)(rollup@4.59.0):
dependencies:
open: 11.0.0
picomatch: 4.0.4
source-map: 0.7.6
yargs: 18.0.0
optionalDependencies:
- rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
+ rolldown: 1.0.0-rc.15
rollup: 4.59.0
rollup@4.59.0:
@@ -6344,7 +6341,7 @@ snapshots:
timed-out@4.0.1: {}
- tinyglobby@0.2.15:
+ tinyglobby@0.2.16:
dependencies:
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4
@@ -6393,13 +6390,13 @@ snapshots:
dependencies:
typescript: 6.0.2
- typescript-eslint@8.58.0(eslint@10.1.0)(typescript@6.0.2):
+ typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2))(eslint@10.1.0)(typescript@6.0.2)
- '@typescript-eslint/parser': 8.58.0(eslint@10.1.0)(typescript@6.0.2)
- '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2)
- '@typescript-eslint/utils': 8.58.0(eslint@10.1.0)(typescript@6.0.2)
- eslint: 10.1.0
+ '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)
+ '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2)
+ '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2)
+ '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2)
+ eslint: 10.2.0
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
@@ -6411,13 +6408,13 @@ snapshots:
buffer: 5.7.1
through: 2.3.8
- undici-types@7.18.2: {}
+ undici-types@7.19.2: {}
universalify@2.0.1: {}
- update-browserslist-db@1.2.3(browserslist@4.28.1):
+ update-browserslist-db@1.2.3(browserslist@4.28.2):
dependencies:
- browserslist: 4.28.1
+ browserslist: 4.28.2
escalade: 3.2.0
picocolors: 1.1.1
@@ -6444,7 +6441,7 @@ snapshots:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
- vite-plugin-imagemin@0.6.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)):
+ vite-plugin-imagemin@0.6.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)):
dependencies:
'@types/imagemin': 7.0.1
'@types/imagemin-gifsicle': 7.0.4
@@ -6469,11 +6466,11 @@ snapshots:
imagemin-webp: 6.1.0
jpegtran-bin: 6.0.1
pathe: 0.2.0
- vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)
+ vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)
transitivePeerDependencies:
- supports-color
- vite-prerender-plugin@0.5.13(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)):
+ vite-prerender-plugin@0.5.13(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)):
dependencies:
kolorist: 1.8.0
magic-string: 0.30.21
@@ -6481,28 +6478,25 @@ snapshots:
simple-code-frame: 1.3.0
source-map: 0.7.6
stack-trace: 1.0.0-pre2
- vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1)
+ vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)
- vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(terser@5.46.1):
+ vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
- postcss: 8.5.8
- rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
- tinyglobby: 0.2.15
+ postcss: 8.5.9
+ rolldown: 1.0.0-rc.15
+ tinyglobby: 0.2.16
optionalDependencies:
- '@types/node': 25.5.0
+ '@types/node': 25.6.0
esbuild: 0.27.4
fsevents: 2.3.3
terser: 5.46.1
- transitivePeerDependencies:
- - '@emnapi/core'
- - '@emnapi/runtime'
which-typed-array@1.1.20:
dependencies:
available-typed-arrays: 1.0.7
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
for-each: 0.3.5
get-proto: 1.0.1
diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx
index c113fff17..7b26d94dc 100644
--- a/interface/src/SignIn.tsx
+++ b/interface/src/SignIn.tsx
@@ -3,6 +3,7 @@ import { toast } from 'react-toastify';
import ForwardIcon from '@mui/icons-material/Forward';
import { Box, Button, Paper, Typography } from '@mui/material';
+import type { Theme } from '@mui/material/styles';
import * as AuthenticationApi from 'components/routing/authentication';
import { useRequest } from 'alova/client';
@@ -36,7 +37,7 @@ const SignIn = memo(() => {
{
immediate: false
}
- ).onSuccess((response) => {
+ ).onSuccess((response: { data: { access_token: string } }) => {
if (response.data) {
authenticationContext.signIn(response.data.access_token);
}
@@ -78,7 +79,6 @@ const SignIn = memo(() => {
}
}, [signInRequest, signIn, LL]);
- // Memoize callback to prevent recreation on every render
const submitOnEnter = useMemo(() => onEnterCallback(signIn), [signIn]);
// get rid of scrollbar
@@ -92,13 +92,15 @@ const SignIn = memo(() => {
return (
theme.breakpoints.values.sm}
+ sx={(theme: Theme) => ({
+ display: 'flex',
+ height: '100vh',
+ margin: 'auto',
+ padding: 2,
+ justifyContent: 'center',
+ flexDirection: 'column',
+ maxWidth: theme.breakpoints.values.sm
+ })}
>
({
@@ -111,16 +113,18 @@ const SignIn = memo(() => {
width: '100%'
})}
>
-
+
{PROJECT_NAME}
{
return (
{blocker ? : null}
-
- {LL.ENTITIES_HELP_1()}.
-
+
+ {LL.ENTITIES_HELP_1()}.
+
{renderEntity()}
@@ -361,8 +361,8 @@ const CustomEntities = () => {
/>
)}
-
-
+
+
{numChanges > 0 && (
)}
-
+
}
variant="outlined"
diff --git a/interface/src/app/main/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx
index 1ec409d6e..170c5e888 100644
--- a/interface/src/app/main/CustomEntitiesDialog.tsx
+++ b/interface/src/app/main/CustomEntitiesDialog.tsx
@@ -7,7 +7,7 @@ import DoneIcon from '@mui/icons-material/Done';
import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined';
import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
import InsertCommentOutlinedIcon from '@mui/icons-material/InsertCommentOutlined';
-import RemoveIcon from '@mui/icons-material/RemoveCircleOutline';
+import RemoveIcon from '@mui/icons-material/RemoveCircleOutlined';
import {
Box,
Button,
@@ -178,7 +178,7 @@ const CustomEntitiesDialog = ({
onChange={updateFormValue}
/>
-
+
-
+
{!creating && (
-
+
}
variant="outlined"
diff --git a/interface/src/app/main/Customizations.tsx b/interface/src/app/main/Customizations.tsx
index 53fe71cfb..435c333bb 100644
--- a/interface/src/app/main/Customizations.tsx
+++ b/interface/src/app/main/Customizations.tsx
@@ -470,10 +470,10 @@ const Customizations = () => {
const renderDeviceList = () => (
<>
-
- {LL.CUSTOMIZATIONS_HELP_1()}.
-
-
+
+ {LL.CUSTOMIZATIONS_HELP_1()}.
+
+
{rename ? (
<>
{
const renderDeviceData = () => {
return (
<>
-
-
- ={LL.CUSTOMIZATIONS_HELP_2()}
-
- ={LL.CUSTOMIZATIONS_HELP_3()}
-
- =
- {LL.CUSTOMIZATIONS_HELP_4()}
- =
- {LL.CUSTOMIZATIONS_HELP_5()}
- ={LL.CUSTOMIZATIONS_HELP_6()}
-
-
+
+ ={LL.CUSTOMIZATIONS_HELP_2()}
+
+ ={LL.CUSTOMIZATIONS_HELP_3()}
+
+ =
+ {LL.CUSTOMIZATIONS_HELP_4()}
+ ={LL.CUSTOMIZATIONS_HELP_5()}
+
+ ={LL.CUSTOMIZATIONS_HELP_6()}
+
{
) : (
-
-
+
+
{numChanges !== 0 && (
-
+
-
+
©
{
return (
<>
-
- {LL.MODULES_DESCRIPTION()}.
-
+
+ {LL.MODULES_DESCRIPTION()}.
+
-
-
+
+
{numChanges !== 0 && (
-
+
{
return (
{blocker ? : null}
-
- {LL.SCHEDULER_HELP_1()}.
-
+
+ {LL.SCHEDULER_HELP_1()}.
+
{renderSchedule()}
{selectedScheduleItem && (
@@ -375,8 +375,8 @@ const Scheduler = () => {
/>
)}
-
-
+
+
{numChanges !== 0 && (
{
)}
-
+
}
diff --git a/interface/src/app/main/SchedulerDialog.tsx b/interface/src/app/main/SchedulerDialog.tsx
index 881aa14d0..8277da6e3 100644
--- a/interface/src/app/main/SchedulerDialog.tsx
+++ b/interface/src/app/main/SchedulerDialog.tsx
@@ -4,7 +4,7 @@ import AddIcon from '@mui/icons-material/Add';
import CancelIcon from '@mui/icons-material/Cancel';
import DoneIcon from '@mui/icons-material/Done';
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
-import RemoveIcon from '@mui/icons-material/RemoveCircleOutline';
+import RemoveIcon from '@mui/icons-material/RemoveCircleOutlined';
import {
Box,
Button,
@@ -338,11 +338,13 @@ const SchedulerDialog = ({
onChange={updateFormValue}
/>
{isTimerSchedule && (
-
-
- {LL.SCHEDULER_HELP_2()}
-
-
+
+ {LL.SCHEDULER_HELP_2()}
+
)}
>
) : (
@@ -391,7 +393,7 @@ const SchedulerDialog = ({
{!creating && (
-
+
}
variant="outlined"
diff --git a/interface/src/app/main/Sensors.tsx b/interface/src/app/main/Sensors.tsx
index 747034730..578140a43 100644
--- a/interface/src/app/main/Sensors.tsx
+++ b/interface/src/app/main/Sensors.tsx
@@ -591,7 +591,14 @@ const Sensors = () => {
/>
)}
{sensorData?.analog_enabled === true && me.admin && (
-
+
{fieldErrors && Object.keys(fieldErrors).length > 0 && (
-
+
{Object.values(fieldErrors).map((errArr, idx) =>
Array.isArray(errArr)
? errArr.map((err, j) => (
@@ -487,7 +487,7 @@ const SensorsAnalogDialog = ({
key={`${idx}-${j}`}
color="error"
variant="caption"
- display="block"
+ sx={{ display: 'block' }}
>
{err.message}
@@ -498,7 +498,7 @@ const SensorsAnalogDialog = ({
)}
{editItem.s && (
-
+
{!creating && (
-
+
}
disabled={editItem.s}
diff --git a/interface/src/app/main/SensorsTemperatureDialog.tsx b/interface/src/app/main/SensorsTemperatureDialog.tsx
index bc6ad2a09..31cdad43b 100644
--- a/interface/src/app/main/SensorsTemperatureDialog.tsx
+++ b/interface/src/app/main/SensorsTemperatureDialog.tsx
@@ -4,7 +4,6 @@ import CancelIcon from '@mui/icons-material/Cancel';
import DoneIcon from '@mui/icons-material/Done';
import WarningIcon from '@mui/icons-material/Warning';
import {
- Box,
Button,
Dialog,
DialogActions,
@@ -111,11 +110,9 @@ const SensorsTemperatureDialog = ({
);
@@ -367,7 +385,9 @@ const InstallPartitionDialog = memo(
{LL.INSTALL()} {LL.STORED_VERSIONS()}
- {LL.INSTALL_VERSION(LL.INSTALL(), version)}
+
+ {LL.INSTALL_VERSION(LL.INSTALL(), version)}
+
{
const [stableUpgradeAvailable, setStableUpgradeAvailable] =
useState(false);
const [internetLive, setInternetLive] = useState(false);
+ const [downloadOnly, setDownloadOnly] = useState(false);
const [showVersionInfo, setShowVersionInfo] = useState(0); // 1 = stable, 2 = dev, 3 = partition
const [firmwareSize, setFirmwareSize] = useState(0);
@@ -444,6 +465,9 @@ const Version = () => {
error
} = useRequest(SystemApi.readSystemStatus).onSuccess((event) => {
const systemData = event.data as VersionData;
+ if (systemData.arduino_version.startsWith('Tasmota')) {
+ setDownloadOnly(true);
+ }
setUsingDevVersion(systemData.emsesp_version.includes('dev'));
});
@@ -459,6 +483,26 @@ const Version = () => {
immediate: false
});
+ const [upgradeImportantMessageType, setUpgradeImportantMessageType] =
+ useState(0);
+
+ const { send: checkUpgradeImportantMessages } = useRequest(
+ (version: string) =>
+ callAction({ action: 'upgradeImportantMessages', param: version }),
+ {
+ immediate: false
+ }
+ )
+ .onSuccess((event) => {
+ const upgradeImportantMessageType_n = (
+ event.data as { upgradeImportantMessageType: number }
+ ).upgradeImportantMessageType;
+ setUpgradeImportantMessageType(upgradeImportantMessageType_n);
+ })
+ .onError((error) => {
+ toast.error(String(error.error?.message || 'An error occurred'));
+ });
+
// Memoized values
const platform = useMemo(() => (data ? getPlatform(data) : ''), [data]);
@@ -524,10 +568,16 @@ const Version = () => {
[]
);
- const showFirmwareDialog = useCallback((useDevVersion: boolean) => {
- setFetchDevVersion(useDevVersion);
- setOpenInstallDialog(true);
- }, []);
+ const showFirmwareDialog = useCallback(
+ (useDevVersion: boolean) => {
+ setFetchDevVersion(useDevVersion);
+ void checkUpgradeImportantMessages(
+ useDevVersion ? latestDevVersion?.name : latestVersion?.name
+ );
+ setOpenInstallDialog(true);
+ },
+ [latestDevVersion, latestVersion, fetchDevVersion]
+ );
const closeInstallDialog = useCallback(() => {
setOpenInstallDialog(false);
@@ -629,8 +679,8 @@ const Version = () => {
return (
<>
-
-
+
+
{LL.THIS_VERSION()}
@@ -695,7 +745,7 @@ const Version = () => {
{internetLive ? (
<>
-
+
{LL.AVAILABLE_VERSION()}
@@ -717,7 +767,7 @@ const Version = () => {
{otherPartitions.map((partition) => (
-
+
{partition.version}
@@ -783,7 +833,7 @@ const Version = () => {
>
) : (
-
+
{LL.INTERNET_CONNECTION_REQUIRED()}
@@ -807,6 +857,8 @@ const Version = () => {
fetchDevVersion={fetchDevVersion}
latestVersion={latestVersion}
latestDevVersion={latestDevVersion}
+ upgradeImportantMessageType={upgradeImportantMessageType}
+ downloadOnly={downloadOnly}
platform={platform}
LL={LL}
onClose={closeInstallDialog}
@@ -823,7 +875,7 @@ const Version = () => {
{LL.UPLOAD()}
-
+
>
)}
@@ -842,6 +894,7 @@ const Version = () => {
locale,
openInstallDialog,
fetchDevVersion,
+ downloadOnly,
me.admin,
showButtons,
handleVersionInfoClose,
diff --git a/interface/src/components/MessageBox.tsx b/interface/src/components/MessageBox.tsx
index d53e86776..aa17e6215 100644
--- a/interface/src/components/MessageBox.tsx
+++ b/interface/src/components/MessageBox.tsx
@@ -53,12 +53,16 @@ const MessageBox: FC> = ({
return (
{(message || children) && (
diff --git a/interface/src/components/layout/LayoutDrawer.tsx b/interface/src/components/layout/LayoutDrawer.tsx
index 8c85f666e..c89fb396b 100644
--- a/interface/src/components/layout/LayoutDrawer.tsx
+++ b/interface/src/components/layout/LayoutDrawer.tsx
@@ -29,7 +29,7 @@ const LayoutDrawerComponent = ({ mobileOpen, onClose }: LayoutDrawerProps) => {
() => (
<>
-
+
{PROJECT_NAME}
diff --git a/interface/src/components/layout/LayoutMenu.tsx b/interface/src/components/layout/LayoutMenu.tsx
index d37c96b5c..1fa3830b5 100644
--- a/interface/src/components/layout/LayoutMenu.tsx
+++ b/interface/src/components/layout/LayoutMenu.tsx
@@ -51,9 +51,7 @@ const LayoutMenuComponent = () => {
sx={{ my: 0 }}
slotProps={{
primary: {
- fontWeight: '600',
- mb: '2px',
- color: 'lightblue'
+ sx: { fontWeight: 600, mb: '2px', color: 'lightblue' }
}
}}
/>
diff --git a/interface/src/components/loading/FormLoader.tsx b/interface/src/components/loading/FormLoader.tsx
index 762909bc4..42be38bad 100644
--- a/interface/src/components/loading/FormLoader.tsx
+++ b/interface/src/components/loading/FormLoader.tsx
@@ -32,8 +32,16 @@ const FormLoaderComponent = ({ errorMessage, onRetry }: FormLoaderProps) => {
);
}
return (
-
-
+
+
diff --git a/interface/src/components/loading/LoadingSpinner.tsx b/interface/src/components/loading/LoadingSpinner.tsx
index c979f8c27..d4e052c5d 100644
--- a/interface/src/components/loading/LoadingSpinner.tsx
+++ b/interface/src/components/loading/LoadingSpinner.tsx
@@ -15,12 +15,14 @@ const circularProgressStyles: SxProps = (theme: Theme) => ({
const LoadingSpinner = ({ height = '100%' }: LoadingSpinnerProps) => {
return (
diff --git a/interface/src/components/upload/DragNdrop.tsx b/interface/src/components/upload/DragNdrop.tsx
index 1449f5e6c..4bc865fc3 100644
--- a/interface/src/components/upload/DragNdrop.tsx
+++ b/interface/src/components/upload/DragNdrop.tsx
@@ -1,4 +1,4 @@
-// Code inspired by Prince Azubuike from https://medium.com/@dprincecoder/creating-a-drag-and-drop-file-upload-component-in-react-a-step-by-step-guide-4d93b6cc21e0
+// drag/drop code inspired by Prince Azubuike from https://medium.com/@dprincecoder/creating-a-drag-and-drop-file-upload-component-in-react-a-step-by-step-guide-4d93b6cc21e0
import {
type ChangeEvent,
type DragEvent,
@@ -6,12 +6,28 @@ import {
useRef,
useState
} from 'react';
+import { Link } from 'react-router';
+import { toast } from 'react-toastify';
import CancelIcon from '@mui/icons-material/Cancel';
import CloudUploadIcon from '@mui/icons-material/CloudUpload';
import UploadIcon from '@mui/icons-material/Upload';
-import { Box, Button, Typography, styled } from '@mui/material';
+import WarningIcon from '@mui/icons-material/Warning';
+import {
+ Box,
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Typography,
+ styled
+} from '@mui/material';
+import { callAction } from 'api/app';
+
+import { dialogStyle } from '@/CustomTheme';
+import { useRequest } from 'alova/client';
import { useI18nContext } from 'i18n/i18n-react';
const DocumentUploader = styled(Box)<{ active?: boolean }>(({ theme, active }) => ({
@@ -58,6 +74,29 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => {
const [dragged, setDragged] = useState(false);
const inputRef = useRef(null);
const { LL } = useI18nContext();
+ const [showUpgradeDialog, setShowUpgradeDialog] = useState(false);
+ const [upgradeImportantMessageType, setUpgradeImportantMessageType] =
+ useState(0);
+
+ const { send: checkUpgradeImportantMessages } = useRequest(
+ (version: string) =>
+ callAction({ action: 'upgradeImportantMessages', param: version }),
+ {
+ immediate: false
+ }
+ )
+ .onSuccess((event) => {
+ const upgradeImportantMessageType_n = (
+ event.data as { upgradeImportantMessageType: number }
+ ).upgradeImportantMessageType;
+ setUpgradeImportantMessageType(upgradeImportantMessageType_n);
+ if (upgradeImportantMessageType_n === 0) {
+ onFileSelected(file);
+ }
+ })
+ .onError((error) => {
+ toast.error(String(error.error?.message || 'An error occurred'));
+ });
const checkFileExtension = (file: File) => {
const validExtensions = ['.json', '.bin', '.md5'];
@@ -97,9 +136,8 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => {
const handleUploadClick = (event: MouseEvent) => {
event.stopPropagation();
- if (file) {
- onFileSelected(file);
- }
+ void checkUpgradeImportantMessages(file?.name || '');
+ setShowUpgradeDialog(true);
};
const handleBrowseClick = () => {
@@ -158,6 +196,55 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => {
{LL.UPLOAD()}
+ {showUpgradeDialog && upgradeImportantMessageType > 0 && (
+ setShowUpgradeDialog(false)}
+ >
+
+
+
+ {LL.UPGRADE_IMPORTANT_MESSAGES()}
+
+
+ {upgradeImportantMessageType === 1 &&
+ LL.UPGRADE_IMPORTANT_MESSAGES_1()}
+ {upgradeImportantMessageType === 2 &&
+ LL.UPGRADE_IMPORTANT_MESSAGES_2()}
+
+
+ {LL.ONLINE_HELP()}
+
+
+
+
+ }
+ variant="outlined"
+ onClick={() => setShowUpgradeDialog(false)}
+ color="secondary"
+ >
+ {LL.CANCEL()}
+
+ }
+ variant="outlined"
+ onClick={() => onFileSelected(file)}
+ color="primary"
+ >
+ {LL.UPLOAD()}
+
+
+
+ )}
>
)}
diff --git a/interface/src/components/upload/SingleUpload.tsx b/interface/src/components/upload/SingleUpload.tsx
index 5ad6941f2..0363cd445 100644
--- a/interface/src/components/upload/SingleUpload.tsx
+++ b/interface/src/components/upload/SingleUpload.tsx
@@ -13,11 +13,10 @@ import DragNdrop from './DragNdrop';
import { LinearProgressWithLabel } from './LinearProgressWithLabel';
interface SingleUploadProps {
- text: string;
doRestart: () => void;
}
-const SingleUpload = ({ text, doRestart }: SingleUploadProps) => {
+const SingleUpload = ({ doRestart }: SingleUploadProps) => {
const [md5, setMd5] = useState();
const [file, setFile] = useState();
const { LL } = useI18nContext();
@@ -58,7 +57,7 @@ const SingleUpload = ({ text, doRestart }: SingleUploadProps) => {
<>
{isUploading ? (
<>
-
+
{
>
) : (
-
+
)}
{md5 && (
-
+
{'MD5: ' + md5}
)}
diff --git a/interface/src/i18n/cz/index.ts b/interface/src/i18n/cz/index.ts
index 2f0774454..9bc067dfb 100644
--- a/interface/src/i18n/cz/index.ts
+++ b/interface/src/i18n/cz/index.ts
@@ -359,7 +359,12 @@ const cz: Translation = {
NO_DATA: 'Žádná data',
USER_PROFILE: 'Uživatelský profil',
STORED_VERSIONS: 'Uložené verze',
- ONLINE_HELP: 'online nápověda'
+ ONLINE_HELP: 'online nápověda',
+ UPGRADE_IMPORTANT_MESSAGES: 'Aktualizovat důležité zprávy',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Tato aktualizace vyžaduje obnovení továrního nastavení. Ujistěte se, že jste vytvořili zálohu své konfigurace a nastavení před pokračováním a nahrajte ji po instalaci nové verze.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Aktualizujete se na novou hlavní verzi. Ujistěte se, že jste přečetli ChangeLog pro jakékoliv závažné změny.',
+ WARNING_SYSTEM_BACKUP: 'Toto vytvoří zálohu vašich celých systémových konfigurací a nastavení. Všechna hesla budou v zálohovém souboru čitelná. Buďte opatrní při sdílení! Opravdu chcete pokračovat?'
+
};
export default cz;
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index 2411acaab..12c1e6ed7 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -359,7 +359,12 @@ const de: Translation = {
NO_DATA: 'Keine Daten',
USER_PROFILE: 'Benutzerprofil',
STORED_VERSIONS: 'Gespeicherte Versionen',
- ONLINE_HELP: 'Online-Hilfe'
+ ONLINE_HELP: 'Online-Hilfe',
+ UPGRADE_IMPORTANT_MESSAGES: 'Wichtige Nachrichten aktualisieren',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Diese Aktualisierung erfordert eine Werkseinstellung. Stellen Sie sicher, dass Sie eine Sicherung Ihrer Konfiguration und Einstellungen vor dem Fortfahren erstellt haben und diese nach der Installation der neuen Version hochladen.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Sie aktualisieren auf eine neue Hauptversion. Stellen Sie sicher, dass Sie den ChangeLog für alle wichtigen Änderungen gelesen haben.',
+ WARNING_SYSTEM_BACKUP: 'Dies wird eine Sicherung Ihrer vollständigen Systemkonfiguration und -einstellungen erstellen. Alle Passwörter werden im Sicherungsdatei lesbar sein. Seien Sie vorsichtig beim Teilen! Möchten Sie fortfahren?'
+
};
export default de;
diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts
index 6549cee7a..8c8f8dcbd 100644
--- a/interface/src/i18n/en/index.ts
+++ b/interface/src/i18n/en/index.ts
@@ -359,7 +359,12 @@ const en: Translation = {
NO_DATA: 'No data',
USER_PROFILE: 'User Profile',
STORED_VERSIONS: 'Stored Versions',
- ONLINE_HELP: 'online help'
+ ONLINE_HELP: 'online help',
+ UPGRADE_IMPORTANT_MESSAGES: 'Upgrade Important Messages',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'This upgrade requires a factory reset. Make sure you have made a backup of your configuration and settings before continuing, and upload this after the new version is installed.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'You are upgrading to a new major version. Make sure you have read the ChangeLog for any breaking changes.',
+ WARNING_SYSTEM_BACKUP: 'This will create a backup of your full system configuration and settings. All passwords will be readable in the backup file. Be careful with sharing! Do you want to continue?'
+
};
export default en;
diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts
index 261ef5ac9..e576a5950 100644
--- a/interface/src/i18n/fr/index.ts
+++ b/interface/src/i18n/fr/index.ts
@@ -359,7 +359,12 @@ const fr: Translation = {
NO_DATA: 'Aucune donnée',
USER_PROFILE: 'Profil utilisateur',
STORED_VERSIONS: 'Versions stockées',
- ONLINE_HELP: 'aide en ligne'
+ ONLINE_HELP: 'aide en ligne',
+ UPGRADE_IMPORTANT_MESSAGES: 'Mettre à jour les messages importants',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Cette mise à jour nécessite une réinitialisation de fabrique. Assurez-vous d\'avoir créé une sauvegarde de vos configurations et paramètres avant de continuer et de la charger après l\'installation de la nouvelle version.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Vous mettez à jour vers une nouvelle version majeure. Assurez-vous de lire le ChangeLog pour tout changement important.',
+ WARNING_SYSTEM_BACKUP: 'Cela créera une sauvegarde de votre configuration et paramètres complets. Tous les mots de passe seront lisibles dans le fichier de sauvegarde. Soyez prudent avec le partage ! Voulez-vous continuer ?'
+
};
export default fr;
diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts
index 042415c95..4e86cbc03 100644
--- a/interface/src/i18n/it/index.ts
+++ b/interface/src/i18n/it/index.ts
@@ -359,7 +359,12 @@ const it: Translation = {
NO_DATA: 'Nessun dato',
USER_PROFILE: 'Profilo utente',
STORED_VERSIONS: 'Versioni memorizzate',
- ONLINE_HELP: 'aiuto online'
+ ONLINE_HELP: 'aiuto online',
+ UPGRADE_IMPORTANT_MESSAGES: 'Aggiorna Messaggi Importanti',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Questa aggiornamento richiede un ripristino di fabbrica. Assicurati di aver creato un backup delle tue configurazioni e impostazioni prima di continuare e di caricarlo dopo l\'installazione della nuova versione.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Stai aggiornando a una nuova versione principale. Assicurati di aver letto il ChangeLog per qualsiasi cambiamento importante.',
+ WARNING_SYSTEM_BACKUP: 'Questo creerà un backup delle tue configurazioni e impostazioni complete. Tutte le password saranno leggibili nel file di backup. Sei sicuro di voler continuare?'
+
};
export default it;
diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts
index 308c21075..f246aa684 100644
--- a/interface/src/i18n/nl/index.ts
+++ b/interface/src/i18n/nl/index.ts
@@ -359,7 +359,12 @@ const nl: Translation = {
NO_DATA: 'Geen data',
USER_PROFILE: 'Gebruikersprofiel',
STORED_VERSIONS: 'Opgeslagen versies',
- ONLINE_HELP: 'online help'
+ ONLINE_HELP: 'online help',
+ UPGRADE_IMPORTANT_MESSAGES: 'Upgrade Belangrijke Berichten',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Deze upgrade vereist een fabrieksinstelling. Zorg ervoor dat u een back-up van uw configuratie en instellingen hebt gemaakt voordat u doorgaat en upload deze na de installatie van de nieuwe versie.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'U updatet naar een nieuwe grote versie. Zorg ervoor dat u de ChangeLog hebt gelezen voor alle brekende wijzigingen.',
+ WARNING_SYSTEM_BACKUP: 'Dit zal een back-up van uw volledige systeemconfiguratie en instellingen maken. Alle wachtwoorden zijn leesbaar in het back-upbestand. Wees voorzichtig bij delen! Wilt u doorgaan?'
+
};
export default nl;
diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts
index 5afd33c4e..84f56b6ae 100644
--- a/interface/src/i18n/no/index.ts
+++ b/interface/src/i18n/no/index.ts
@@ -359,7 +359,12 @@ const no: Translation = {
NO_DATA: 'Ingen data',
USER_PROFILE: 'Brukerprofil',
STORED_VERSIONS: 'Lagret versjoner',
- ONLINE_HELP: 'online hjelp'
+ ONLINE_HELP: 'online hjelp',
+ UPGRADE_IMPORTANT_MESSAGES: 'Oppdater viktige meldinger',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Denne oppdateringen krever en fabriksinstilling. Sørg for at du har laget en sikkerhetskopi av din konfigurasjon og innstillinger før du fortsetter, og last denne opp etter at den nye versjonen er installert.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Du oppdaterer til en ny hovedversjon. Sørg for at du har lest ChangeLog for eventuelle bruddende endringer.',
+ WARNING_SYSTEM_BACKUP: 'Dette vil lage en sikkerhetskopi av din fullstendige systemkonfigurasjon og innstillinger. Alle passord vil være lesbare i sikkerhetskopien. Vær forsiktig med deling! Vil du fortsette?'
+
};
export default no;
diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts
index 9ba19d73c..da445c469 100644
--- a/interface/src/i18n/pl/index.ts
+++ b/interface/src/i18n/pl/index.ts
@@ -359,7 +359,12 @@ const pl: BaseTranslation = {
NO_DATA: 'Brak danych',
USER_PROFILE: 'Profil użytkownika',
STORED_VERSIONS: 'Zapisane wersje',
- ONLINE_HELP: 'pomoc online'
+ ONLINE_HELP: 'pomoc online',
+ UPGRADE_IMPORTANT_MESSAGES: 'Aktualizuj ważne wiadomości',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Ta aktualizacja wymaga resetu fabrycznego. Upewnij się, że masz utworzoną kopię swoich ustawień i konfiguracji przed kontynuowaniem i przesuń ją po zainstalowaniu nowej wersji.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Aktualizujesz się do nowej głównej wersji. Upewnij się, że przeczytałeś ChangeLog dla wszelkich istotnych zmian.',
+ WARNING_SYSTEM_BACKUP: 'To spowoduje utworzenie kopii zapasowej całej konfiguracji i ustawień systemu. Wszystkie hasła będą widoczne w pliku kopii zapasowej. Bądź ostrożny przy udostępnianiu! Chcesz kontynuować?'
+
};
export default pl;
diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts
index 56aa89dfe..0f4697fe0 100644
--- a/interface/src/i18n/sk/index.ts
+++ b/interface/src/i18n/sk/index.ts
@@ -4,7 +4,7 @@ const sk: Translation = {
LANGUAGE: 'Jazyk',
RETRY: 'Opakovať',
LOADING: 'Načítanie',
- IS_REQUIRED: '{0} je požadovaných',
+ IS_REQUIRED: '{0} je požadovaná',
SIGN_IN: 'Prihlásiť sa',
SIGN_OUT: 'Odhlásiť sa',
USERNAME: 'Užívateľské meno',
@@ -276,11 +276,11 @@ const sk: Translation = {
NETWORK_SUBNET: 'Maska podsiete',
NETWORK_DNS: 'DNS servery',
ADDRESS_OF: '{0} adresa',
- ADMINISTRATOR: 'Administrator',
+ ADMINISTRATOR: 'Administrátor',
GUEST: 'Hosť',
- NEW: 'Nová',
+ NEW: 'Novú',
NEW_NAME_OF: 'Nový názov {0}',
- ENTITY: 'entita',
+ ENTITY: 'entitu',
MIN: 'min',
MAX: 'max',
BLOCK_NAVIGATE_1: 'Máte neuložené zmeny',
@@ -359,7 +359,12 @@ const sk: Translation = {
NO_DATA: 'Žiadne dáta',
USER_PROFILE: 'Profil používateľa',
STORED_VERSIONS: 'Uložené verzie',
- ONLINE_HELP: 'online pomoc'
+ ONLINE_HELP: 'online pomoc',
+ UPGRADE_IMPORTANT_MESSAGES: 'Aktualizovať dôležité správy',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Táto aktualizácia vyžaduje reštart základných nastavení. Uistite sa, že ste vytvorili zálohu svojich konfigurácií a nastavení pred pokračovaním a nahrajte ju po instalácii novej verzie.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Aktualizujete sa na novú hlavnú verziu. Uistite sa, že ste prečítali ChangeLog pre akékoľvek dôležité zmeny.',
+ WARNING_SYSTEM_BACKUP: 'Toto vytvorí zálohu všetkých vašich celých systémových konfigurácií a nastavení. Všetky hesla budú čitateľné v zálohovom súbore. Buďte opatrní pri zdieľaní! Chcete pokračovať?'
+
};
export default sk;
diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts
index 4641ce56a..3cff59b90 100644
--- a/interface/src/i18n/sv/index.ts
+++ b/interface/src/i18n/sv/index.ts
@@ -359,7 +359,12 @@ const sv: Translation = {
NO_DATA: 'Ingen data',
USER_PROFILE: 'Användarprofil',
STORED_VERSIONS: 'Lagrad versioner',
- ONLINE_HELP: 'online hjälp'
+ ONLINE_HELP: 'online hjälp',
+ UPGRADE_IMPORTANT_MESSAGES: 'Uppdatera viktiga meddelanden',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Denna uppdatering kräver en fabriksåterställning. Se till att du har gjort en säkerhetskopia av din konfiguration och inställningar innan du fortsätter och ladda upp denna efter att den nya versionen är installerad.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Du uppdaterar till en ny huvudversion. Se till att du har läst ChangeLog för eventuella brkande ändringar.',
+ WARNING_SYSTEM_BACKUP: 'Detta kommer att skapa en säkerhetskopia av din fullständiga systemkonfiguration och inställningar. Alla lösenord kommer att vara läsbara i säkerhetskopien. Var försiktig med att dela! Vill du fortsätta?'
+
};
export default sv;
diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts
index 29c7450b8..4661b0b2f 100644
--- a/interface/src/i18n/tr/index.ts
+++ b/interface/src/i18n/tr/index.ts
@@ -359,7 +359,12 @@ const tr: Translation = {
NO_DATA: 'Hiçbir veri yok',
USER_PROFILE: 'Kullanıcı Profili',
STORED_VERSIONS: 'Kaydedilmiş Sürümler',
- ONLINE_HELP: 'online yardım'
+ ONLINE_HELP: 'online yardım',
+ UPGRADE_IMPORTANT_MESSAGES: 'Önemli Mesajları Güncelle',
+ UPGRADE_IMPORTANT_MESSAGES_1: 'Bu güncelleme továrnı ayarlarını gerektirir. Yapılandırmanızı ve ayarlarınızı önce yedekleyin ve ardından yeni sürüm yüklendikten sonra yükleyin.',
+ UPGRADE_IMPORTANT_MESSAGES_2: 'Yeni bir büyük sürüme yükselteceksiniz. Değişiklikleri ChangeLogı okuduğunuzdan emin olun.',
+ WARNING_SYSTEM_BACKUP: 'Bu, sistem yapılandırmanızı ve ayarlarınızın bir yedeklemesi oluşturacaktır. Tüm şifreler yedekleme dosyasında okunabilir olacaktır. Paylaşırken dikkatli olun! Devam etmek istediğinize emin misiniz?'
+
};
export default tr;
diff --git a/mock-api/package.json b/mock-api/package.json
index d5681fd0a..4ba91519e 100644
--- a/mock-api/package.json
+++ b/mock-api/package.json
@@ -13,7 +13,7 @@
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
"formidable": "^3.5.4",
"itty-router": "^5.0.23",
- "prettier": "^3.8.1"
+ "prettier": "^3.8.3"
},
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319"
}
diff --git a/mock-api/pnpm-lock.yaml b/mock-api/pnpm-lock.yaml
index 21e29fa74..d1f155ffa 100644
--- a/mock-api/pnpm-lock.yaml
+++ b/mock-api/pnpm-lock.yaml
@@ -13,7 +13,7 @@ importers:
version: 3.1.3
'@trivago/prettier-plugin-sort-imports':
specifier: ^6.0.2
- version: 6.0.2(prettier@3.8.1)
+ version: 6.0.2(prettier@3.8.3)
formidable:
specifier: ^3.5.4
version: 3.5.4
@@ -21,8 +21,8 @@ importers:
specifier: ^5.0.23
version: 5.0.23
prettier:
- specifier: ^3.8.1
- version: 3.8.1
+ specifier: ^3.8.3
+ version: 3.8.3
packages:
@@ -112,8 +112,8 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- brace-expansion@2.0.3:
- resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==}
+ brace-expansion@2.1.0:
+ resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@@ -145,8 +145,8 @@ packages:
engines: {node: '>=6'}
hasBin: true
- lodash-es@4.17.23:
- resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
+ lodash-es@4.18.1:
+ resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
minimatch@9.0.9:
resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
@@ -167,8 +167,8 @@ packages:
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- prettier@3.8.1:
- resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
+ prettier@3.8.3:
+ resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==}
engines: {node: '>=14'}
hasBin: true
@@ -246,17 +246,17 @@ snapshots:
dependencies:
'@noble/hashes': 1.8.0
- '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1)':
+ '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3)':
dependencies:
'@babel/generator': 7.29.1
'@babel/parser': 7.29.2
'@babel/traverse': 7.29.0
'@babel/types': 7.29.0
javascript-natural-sort: 0.7.1
- lodash-es: 4.17.23
+ lodash-es: 4.18.1
minimatch: 9.0.9
parse-imports-exports: 0.2.4
- prettier: 3.8.1
+ prettier: 3.8.3
transitivePeerDependencies:
- supports-color
@@ -264,7 +264,7 @@ snapshots:
balanced-match@1.0.2: {}
- brace-expansion@2.0.3:
+ brace-expansion@2.1.0:
dependencies:
balanced-match: 1.0.2
@@ -291,11 +291,11 @@ snapshots:
jsesc@3.1.0: {}
- lodash-es@4.17.23: {}
+ lodash-es@4.18.1: {}
minimatch@9.0.9:
dependencies:
- brace-expansion: 2.0.3
+ brace-expansion: 2.1.0
ms@2.1.3: {}
@@ -311,6 +311,6 @@ snapshots:
picocolors@1.1.1: {}
- prettier@3.8.1: {}
+ prettier@3.8.3: {}
wrappy@1.0.2: {}
diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts
index fe079638d..e7e924c33 100644
--- a/mock-api/restServer.ts
+++ b/mock-api/restServer.ts
@@ -388,13 +388,34 @@ function custom_support() {
'',
"For help and questions please contact your installer."
],
- img_url: 'https://emsesp.org/_media/images/designer.png'
+ img_url: 'https://emsesp.org/media/images/designer.png'
// img_url: 'https://picsum.photos/200/300'
}
};
}
-// called by Action endpoint
+// called by Action endpoint upgradeImportantMessages
+function upgradeImportantMessages(version: string) {
+ // 0 is do nothing
+ // 1 means 3.9 and factory reset required
+ // 2 means a major version upgrade
+ let upgradeImportantMessageType_n = 0;
+
+ // see if its a filename with a .bin extension
+ if (version.endsWith('.bin')) {
+ upgradeImportantMessageType_n = 1; // 1 means 3.9 and factory reset required
+ } else if (version.endsWith('.md')) {
+ upgradeImportantMessageType_n = 0;
+ } else {
+ // this is a version string like "3.9.0"
+ upgradeImportantMessageType_n = 2;
+ }
+
+ console.log('upgradeImportantMessageType: ' + upgradeImportantMessageType_n);
+ return { upgradeImportantMessageType: upgradeImportantMessageType_n };
+}
+
+// called by Action endpoint checkUpgrade
function check_upgrade(version: string) {
let data = {};
if (version) {
@@ -5170,6 +5191,9 @@ router
// set partition
console.log('setting partition to', content.param);
return status(200);
+ } else if (action === 'upgradeImportantMessages') {
+ // check upgrade important messages
+ return upgradeImportantMessages(content.param);
}
}
return status(404); // cmd not found
diff --git a/platformio.ini b/platformio.ini
index f9ba5a97b..1b2348bca 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -59,7 +59,7 @@ framework = arduino
board_build.partitions = partitions/esp32_partition_4M.csv
board_upload.flash_size = 4MB
board_build.app_partition_name = app0
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.03.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.7 based on IDF 5.5.3.260313
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.04.50/platform-espressif32.zip ; Platform 2026.04.50 Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407
; 16MB Flash variants
[espressif32_base_16M]
@@ -67,7 +67,7 @@ framework = arduino
board_build.partitions = partitions/esp32_partition_16M.csv
board_upload.flash_size = 16MB
board_build.app_partition_name = app0
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.03.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.7 based on IDF 5.5.3.260313
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.04.50/platform-espressif32.zip ; Platform 2026.04.50 Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407
; 32MB Flash variants
[espressif32_base_32M]
@@ -75,7 +75,7 @@ framework = arduino
board_build.partitions = partitions/esp32_partition_32M.csv
board_upload.flash_size = 32MB
board_build.app_partition_name = app0
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.03.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.7 based on IDF 5.5.3.260313
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.04.50/platform-espressif32.zip ; Platform 2026.04.50 Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407
[env]
build_flags =
diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp
index 4aa634c2a..3d4e99152 100644
--- a/src/ESP32React/UploadFileService.cpp
+++ b/src/ESP32React/UploadFileService.cpp
@@ -184,7 +184,7 @@ void UploadFileService::handleError(AsyncWebServerRequest * request, int code) {
}
void UploadFileService::handleEarlyDisconnect() {
- emsesp::EMSESP::logger().info("Upload completed");
+ emsesp::EMSESP::logger().info("Upload finished");
emsesp::EMSESP::system_.uart_init(); // re-enable UART
_is_firmware = false;
diff --git a/src/core/system.cpp b/src/core/system.cpp
index e9bbe3927..1f6f95797 100644
--- a/src/core/system.cpp
+++ b/src/core/system.cpp
@@ -38,15 +38,6 @@
#include "../test/test.h"
#endif
-#ifndef NO_TLS_SUPPORT
-#define ENABLE_SMTP
-#define USE_ESP_SSLCLIENT
-#define READYCLIENT_SSL_CLIENT ESP_SSLClient
-#define READYCLIENT_TYPE_1 // TYPE 1 when using ESP_SSLClient
-#include
-#include
-#endif
-
namespace emsesp {
// Languages supported. Note: the order is important
@@ -115,110 +106,6 @@ bool System::command_send(const char * value, const int8_t id) {
return EMSESP::txservice_.send_raw(value); // ignore id
}
-bool System::command_sendmail(const char * value, const int8_t id) {
- bool enabled = false;
- bool ssl, starttls;
- uint16_t port;
- String server, login, pass, sender, recp, subject;
- EMSESP::webSettingsService.read([&](WebSettings & settings) {
- enabled = settings.email_enabled;
- ssl = settings.email_ssl;
- starttls = settings.email_starttls;
- server = settings.email_server;
- port = settings.email_port;
- login = settings.email_login;
- pass = settings.email_pass;
- sender = settings.email_sender;
- recp = settings.email_recp;
- subject = settings.email_subject;
- });
- if (!enabled) {
- return false;
- }
- LOG_DEBUG("Command sendmail port %d%s called with '%s'", port, ssl ? " (SSL)" : starttls ? " (STARTTLS)" : "", value);
- // LOG_DEBUG("Command sendmail port %d called with '%s'", port, value);
- bool success = false;
-
-#ifndef NO_TLS_SUPPORT
- WiFiClient * basic_client;
- ESP_SSLClient * ssl_client;
- ReadyClient * r_client; // rClient(ssl_client);
- SMTPClient * smtp; // smtp(rClient);
- basic_client = new WiFiClient;
- ssl_client = new ESP_SSLClient;
- r_client = new ReadyClient(*ssl_client);
- smtp = new SMTPClient(*r_client);
-
- ssl_client->setClient(basic_client);
- ssl_client->setInsecure();
- ssl_client->setBufferSizes(1024, 1024);
- r_client->addPort(port, starttls ? readymail_protocol_tls : ssl ? readymail_protocol_ssl : readymail_protocol_plain_text);
-
- // smtp->connect(server, port, sendmailCallback);
- smtp->connect(server, port);
- if (!smtp->isConnected()) {
- LOG_ERROR("Sendmail connection error");
- delete smtp;
- delete r_client;
- delete ssl_client;
- delete basic_client;
- return false;
- }
-
- // LOG_INFO("authenticate %s:%s", login.c_str(), pass.c_str());
- smtp->authenticate(login, pass, readymail_auth_password);
- if (!smtp->isAuthenticated()) {
- LOG_ERROR("Sendmail authenticate error");
- delete smtp;
- delete r_client;
- delete ssl_client;
- delete basic_client;
- return false;
- }
- JsonDocument doc;
- String body = value;
- if (body.length()) {
- auto error = deserializeJson(doc, (const char *)value);
- if (!error && doc.as().size() >= 0) {
- subject = doc["subject"] | subject;
- recp = doc["to"] | recp;
- sender = doc["from"] | sender;
- body = doc["body"] | body;
- }
- }
-
- SMTPMessage & msg = smtp->getMessage();
- msg.headers.add(rfc822_subject, subject);
- msg.headers.add(rfc822_from, sender);
- msg.headers.add(rfc822_to, recp);
-
- // Use addCustom to add custom header e.g. Importance and Priority.
- // msg.headers.addCustom("Importance", PRIORITY);
- // msg.headers.addCustom("X-MSMail-Priority", PRIORITY);
- // msg.headers.addCustom("X-Priority", PRIORITY_NUM);
-
- msg.text.body(body);
-
- // bodyText.replace("\r\n", "
\r\n");
- // msg.html.body("" + bodyText + "
");
- // msg.html.transferEncoding("base64");
-
- // With embedFile function, the html message will send as attachment.
- // if (EMBED_MESSAGE)
- // msg.html.embedFile(true, "msg.html", embed_message_type_attachment);
-
- msg.timestamp = time(nullptr);
-
- success = smtp->send(msg);
-
- delete smtp;
- delete r_client;
- delete ssl_client;
- delete basic_client;
-#endif
- return success;
-}
-
// return string of languages and count
std::string System::languages_string() {
std::string languages_string = std::to_string(NUM_LANGUAGES) + " languages (";
@@ -309,26 +196,26 @@ bool System::command_publish(const char * value, const int8_t id) {
// syslog level
// commenting this out - don't see the point on having an API service to change the syslog level
/*
-bool System::command_syslog_level(const char * value, const int8_t id) {
- uint8_t s = 0xff;
- if (Helpers::value2enum(value, s, FL_(list_syslog_level))) {
- bool changed = false;
- EMSESP::webSettingsService.update(
- [&](WebSettings & settings) {
- if (settings.syslog_level != (int8_t)s - 1) {
- settings.syslog_level = (int8_t)s - 1;
- changed = true;
- }
- return StateUpdateResult::CHANGED;
- });
- if (changed) {
- EMSESP::system_.syslog_init();
- }
- return true;
- }
- return false;
-}
-*/
+ bool System::command_syslog_level(const char * value, const int8_t id) {
+ uint8_t s = 0xff;
+ if (Helpers::value2enum(value, s, FL_(list_syslog_level))) {
+ bool changed = false;
+ EMSESP::webSettingsService.update(
+ [&](WebSettings & settings) {
+ if (settings.syslog_level != (int8_t)s - 1) {
+ settings.syslog_level = (int8_t)s - 1;
+ changed = true;
+ }
+ return StateUpdateResult::CHANGED;
+ });
+ if (changed) {
+ EMSESP::system_.syslog_init();
+ }
+ return true;
+ }
+ return false;
+ }
+ */
// send message - to system log and MQTT
bool System::command_message(const char * value, const int8_t id, JsonObject output) {
@@ -576,6 +463,7 @@ void System::system_restart(const char * partitionname) {
Mqtt::disconnect(); // gracefully disconnect MQTT, needed for QOS1
EMSuart::stop(); // stop UART so there is no interference
+
#ifndef EMSESP_STANDALONE
delay(1000); // wait 1 second
ESP.restart(); // ka-boom! - this is the only place where the ESP32 restart is called
@@ -677,6 +565,7 @@ void System::store_settings(WebSettings & settings) {
locale_ = settings.locale;
developer_mode_ = settings.developer_mode;
+
// start services
if (settings.modbus_enabled) {
if (EMSESP::modbus_ == nullptr) {
@@ -718,11 +607,20 @@ void System::start() {
appfree_ = esp_ota_get_running_partition()->size / 1024 - appused_;
refreshHeapMem(); // refresh free heap and max alloc heap
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S2
+#if ESP_IDF_VERSION_MAJOR < 5
+ temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT();
+ temp_sensor_get_config(&temp_sensor);
+ temp_sensor.dac_offset = TSENS_DAC_DEFAULT; // DEFAULT: range:-10℃ ~ 80℃, error < 1℃.
+ temp_sensor_set_config(temp_sensor);
+ temp_sensor_start();
+ temp_sensor_read_celsius(&temperature_);
+#else
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80);
temperature_sensor_install(&temp_sensor_config, &temperature_handle_);
temperature_sensor_enable(temperature_handle_);
temperature_sensor_get_celsius(temperature_handle_, &temperature_);
#endif
+#endif
#endif
EMSESP::esp32React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) {
@@ -924,14 +822,14 @@ void System::send_info_mqtt() {
doc["network"] = "ethernet";
doc["hostname"] = ETH.getHostname();
/*
- doc["MAC"] = ETH.macAddress();
- doc["IPv4 address"] = uuid::printable_to_string(ETH.localIP()) + "/" + uuid::printable_to_string(ETH.subnetMask());
- doc["IPv4 gateway"] = uuid::printable_to_string(ETH.gatewayIP());
- doc["IPv4 nameserver"] = uuid::printable_to_string(ETH.dnsIP());
- if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && ETH.localIPv6().toString() != "::") {
- doc["IPv6 address"] = uuid::printable_to_string(ETH.localIPv6());
- }
- */
+ doc["MAC"] = ETH.macAddress();
+ doc["IPv4 address"] = uuid::printable_to_string(ETH.localIP()) + "/" + uuid::printable_to_string(ETH.subnetMask());
+ doc["IPv4 gateway"] = uuid::printable_to_string(ETH.gatewayIP());
+ doc["IPv4 nameserver"] = uuid::printable_to_string(ETH.dnsIP());
+ if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && ETH.localIPv6().toString() != "::") {
+ doc["IPv6 address"] = uuid::printable_to_string(ETH.localIPv6());
+ }
+ */
} else if (WiFi.status() == WL_CONNECTED) {
doc["network"] = "wifi";
@@ -943,9 +841,16 @@ void System::send_info_mqtt() {
doc["IPv4 gateway"] = uuid::printable_to_string(WiFi.gatewayIP());
doc["IPv4 nameserver"] = uuid::printable_to_string(WiFi.dnsIP());
+#if ESP_IDF_VERSION_MAJOR < 5
+ if (WiFi.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && WiFi.localIPv6().toString() != "::") {
+ doc["IPv6 address"] = uuid::printable_to_string(WiFi.localIPv6());
+ }
+#else
if (WiFi.linkLocalIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && WiFi.linkLocalIPv6().toString() != "::") {
doc["IPv6 address"] = uuid::printable_to_string(WiFi.linkLocalIPv6());
}
+
+#endif
}
#endif
Mqtt::queue_publish_retain(F_(info), doc.as()); // topic called "info" and it's Retained
@@ -1054,8 +959,13 @@ void System::network_init() {
delay(500);
digitalWrite(eth_power_, HIGH);
}
+
+#if ESP_IDF_VERSION_MAJOR < 5
+ eth_present_ = ETH.begin(phy_addr, power, mdc, mdio, type, clock_mode);
+#else
eth_present_ = ETH.begin(type, phy_addr, mdc, mdio, power, clock_mode);
#endif
+#endif
}
// check health of system, done every 5 seconds
@@ -1066,9 +976,13 @@ void System::system_check() {
#ifndef EMSESP_STANDALONE
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S2
+#if ESP_IDF_VERSION_MAJOR < 5
+ temp_sensor_read_celsius(&temperature_);
+#else
temperature_sensor_get_celsius(temperature_handle_, &temperature_);
#endif
#endif
+#endif
#ifdef EMSESP_PINGTEST
static uint64_t ping_count = 0;
@@ -1120,7 +1034,6 @@ void System::commands_init() {
Command::add(EMSdevice::DeviceType::SYSTEM, F_(read), System::command_read, FL_(read_cmd), CommandFlag::ADMIN_ONLY);
Command::add(EMSdevice::DeviceType::SYSTEM, F_(send), System::command_send, FL_(send_cmd), CommandFlag::ADMIN_ONLY);
Command::add(EMSdevice::DeviceType::SYSTEM, F_(fetch), System::command_fetch, FL_(fetch_cmd), CommandFlag::ADMIN_ONLY);
- Command::add(EMSdevice::DeviceType::SYSTEM, F_(sendmail), System::command_sendmail, FL_(sendmail_cmd), CommandFlag::ADMIN_ONLY);
Command::add(EMSdevice::DeviceType::SYSTEM, F_(restart), System::command_restart, FL_(restart_cmd), CommandFlag::ADMIN_ONLY);
Command::add(EMSdevice::DeviceType::SYSTEM, F_(format), System::command_format, FL_(format_cmd), CommandFlag::ADMIN_ONLY);
Command::add(EMSdevice::DeviceType::SYSTEM, F_(txpause), System::command_txpause, FL_(txpause_cmd), CommandFlag::ADMIN_ONLY);
@@ -1362,9 +1275,16 @@ void System::show_system(uuid::console::Shell & shell) {
shell.printfln(" IPv4 address: %s/%s", uuid::printable_to_string(WiFi.localIP()).c_str(), uuid::printable_to_string(WiFi.subnetMask()).c_str());
shell.printfln(" IPv4 gateway: %s", uuid::printable_to_string(WiFi.gatewayIP()).c_str());
shell.printfln(" IPv4 nameserver: %s", uuid::printable_to_string(WiFi.dnsIP()).c_str());
+#if ESP_IDF_VERSION_MAJOR < 5
+ if (WiFi.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && WiFi.localIPv6().toString() != "::") {
+ shell.printfln(" IPv6 address: %s", uuid::printable_to_string(WiFi.localIPv6()).c_str());
+ }
+#else
if (WiFi.linkLocalIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && WiFi.linkLocalIPv6().toString() != "::") {
shell.printfln(" IPv6 address: %s", uuid::printable_to_string(WiFi.linkLocalIPv6()).c_str());
}
+#endif
+
break;
case WL_CONNECT_FAILED:
@@ -1395,9 +1315,15 @@ void System::show_system(uuid::console::Shell & shell) {
shell.printfln(" IPv4 address: %s/%s", uuid::printable_to_string(ETH.localIP()).c_str(), uuid::printable_to_string(ETH.subnetMask()).c_str());
shell.printfln(" IPv4 gateway: %s", uuid::printable_to_string(ETH.gatewayIP()).c_str());
shell.printfln(" IPv4 nameserver: %s", uuid::printable_to_string(ETH.dnsIP()).c_str());
+#if ESP_IDF_VERSION_MAJOR < 5
+ if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && ETH.localIPv6().toString() != "::") {
+ shell.printfln(" IPv6 address: %s", uuid::printable_to_string(ETH.localIPv6()).c_str());
+ }
+#else
if (ETH.linkLocalIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && ETH.linkLocalIPv6().toString() != "::") {
shell.printfln(" IPv6 address: %s", uuid::printable_to_string(ETH.linkLocalIPv6()).c_str());
}
+#endif
}
shell.println();
@@ -1419,6 +1345,7 @@ void System::show_system(uuid::console::Shell & shell) {
}
shell.println();
+
#endif
}
@@ -1722,6 +1649,7 @@ bool System::check_upgrade() {
}
// map each config filename to its human-readable section key
+#ifndef EMSESP_STANDALONE
static const std::pair SECTION_MAP[] = {
{NETWORK_SETTINGS_FILE, "Network"},
{AP_SETTINGS_FILE, "AP"},
@@ -1734,6 +1662,7 @@ static const std::pair SECTION_MAP[] = {
{EMSESP_CUSTOMENTITY_FILE, "Entities"},
{EMSESP_MODULES_FILE, "Modules"},
};
+#endif
// convert a single config file into a section of the output json object
void System::exportSettings(const std::string & type, const char * filename, JsonObject output) {
@@ -1834,29 +1763,38 @@ void System::exportSystemBackup(JsonObject output) {
const char * nvs_part = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, "nvs1") ? "nvs1" : "nvs"; // nvs1 is on 16MBs
nvs_iterator_t it = nullptr;
- esp_err_t err = nvs_entry_find(nvs_part, "ems-esp", NVS_TYPE_ANY, &it);
+#if ESP_IDF_VERSION_MAJOR < 5
+ it = nvs_entry_find(nvs_part, "ems-esp", NVS_TYPE_ANY);
+ if (it == nullptr) {
+#else
+ esp_err_t err = nvs_entry_find(nvs_part, "ems-esp", NVS_TYPE_ANY, &it);
if (err != ESP_OK) {
+#endif
LOG_ERROR("Failed to find NVS entry for %s", nvs_part);
return;
}
JsonArray entries = node["nvs"].to();
+#if ESP_IDF_VERSION_MAJOR < 5
+ while (it != nullptr) {
+ nvs_entry_info_t info;
+ nvs_entry_info(it, &info);
+#else
while (err == ESP_OK) {
nvs_entry_info_t info;
nvs_entry_info(it, &info);
+#endif
JsonObject entry = entries.add();
- entry["type"] = info.type; // e.g. NVS_TYPE_U32 or NVS_TYPE_STR etc
+ entry["type"] = info.type;
entry["key"] = info.key;
LOG_DEBUG("Exporting NVS value: %s = %d", info.key, info.type);
- // serialize based on the type. We use putString, putChar, putUChar, putDouble, putBool, putULong only
switch (info.type) {
case NVS_TYPE_I8:
entry["value"] = EMSESP::nvs_.getChar(info.key);
break;
case NVS_TYPE_U8:
- // also used for bool
entry["value"] = EMSESP::nvs_.getUChar(info.key);
break;
case NVS_TYPE_I32:
@@ -1872,19 +1810,22 @@ void System::exportSystemBackup(JsonObject output) {
entry["value"] = EMSESP::nvs_.getULong64(info.key);
break;
case NVS_TYPE_BLOB:
- // used for double (e.g. sensor values, nrgheat, nrgww), and stored as bytes in NVS
- entry["value"] = EMSESP::nvs_.getDouble(info.key);
+ entry["value"] = EMSESP::nvs_.getDouble(info.key); // bytes used for double values
break;
case NVS_TYPE_STR:
case NVS_TYPE_ANY:
default:
- // any other value we store as a string
entry["value"] = EMSESP::nvs_.getString(info.key);
break;
}
+#if ESP_IDF_VERSION_MAJOR < 5
+ it = nvs_entry_next(it);
+ }
+#else
err = nvs_entry_next(&it);
}
+#endif
if (it != nullptr) {
nvs_release_iterator(it);
@@ -2686,12 +2627,12 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output
node["maxWebLogBuffer"] = settings.weblog_buffer;
/*
-#if defined(EMSESP_UNITY)
- node["webLogBuffer"] = 0;
-#else
- node["webLogBuffer"] = EMSESP::webLogService.num_log_messages();
-#endif
-*/
+ #if defined(EMSESP_UNITY)
+ node["webLogBuffer"] = 0;
+ #else
+ node["webLogBuffer"] = EMSESP::webLogService.num_log_messages();
+ #endif
+ */
node["modbusEnabled"] = settings.modbus_enabled;
node["forceHeatingOff"] = settings.boiler_heatingoff;
node["developerMode"] = settings.developer_mode;
@@ -3319,7 +3260,7 @@ void System::set_valid_system_gpios() {
valid_system_gpios_ = string_range_to_vector("0-21", "2, 8, 12-17, 18-19");
#elif CONFIG_IDF_TARGET_ESP32S2
- // https://docs.espressif.com/projects/esp-idf/en/stable/esp32s2/api-reference/peripherals/gpio.html
+ // https://docs.espressif.com/projects/esp-idf/en/stable/esp32s2/api-reference/peripherals/gpio.html
// excluded:
// GPIO26 - GPIO32 = SPI flash and PSRAM
// GPIO45 - GPIO46 = strapping pins
@@ -3332,7 +3273,7 @@ void System::set_valid_system_gpios() {
valid_system_gpios_ = string_range_to_vector("0-46", "19, 20, 26-32, 45-46, 39-42, 22-25");
#elif CONFIG_IDF_TARGET_ESP32S3
- // https://docs.espressif.com/projects/esp-idf/en/stable/esp32s3/api-reference/peripherals/gpio.html
+ // https://docs.espressif.com/projects/esp-idf/en/stable/esp32s3/api-reference/peripherals/gpio.html
// excluded:
// GPIO3, GPIO45 - GPIO46 = strapping pins
// GPIO26 - GPIO32 = SPI flash and PSRAM and not recommended
@@ -3351,7 +3292,7 @@ void System::set_valid_system_gpios() {
}
#elif CONFIG_IDF_TARGET_ESP32
- // https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/gpio.html
+ // https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/gpio.html
// excluded:
// GPIO6 - GPIO11, GPIO16 - GPIO17 = used for SPI flash and PSRAM (dio mode only GPIO06-GPIO08, GPIO11)
// GPIO20, GPIO24, GPIO28 - GPIO31 = don't exist
@@ -3382,10 +3323,6 @@ void System::set_valid_system_gpios() {
} else {
valid_system_gpios_ = string_range_to_vector("0-39", "6-11, 20, 24, 28-31");
}
-#elif CONFIG_IDF_TARGET_ESP32C6
- // https://docs.espressif.com/projects/esp-idf/en/v5.5.3/esp32c6/api-reference/peripherals/gpio.html
- // 24-30 used for flash, 12-13 USB, 16-17 uart0
- valid_system_gpios_ = string_range_to_vector("0-30", "12-13, 16-17, 24-30");
#elif defined(EMSESP_STANDALONE)
valid_system_gpios_ = string_range_to_vector("0-39");
#endif
diff --git a/src/emsesp_version.h b/src/emsesp_version.h
index ffc3ab2c2..29cd72cc1 100644
--- a/src/emsesp_version.h
+++ b/src/emsesp_version.h
@@ -1 +1 @@
-#define EMSESP_APP_VERSION "3.8.2-dev.C14"
+#define EMSESP_APP_VERSION "3.8.2-dev.C13"
diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp
index 106e7c052..c0b0b8d04 100644
--- a/src/web/WebSettingsService.cpp
+++ b/src/web/WebSettingsService.cpp
@@ -83,20 +83,6 @@ void WebSettings::read(WebSettings & settings, JsonObject root) {
root["modbus_max_clients"] = settings.modbus_max_clients;
root["modbus_timeout"] = settings.modbus_timeout;
root["developer_mode"] = settings.developer_mode;
-#ifndef NO_TLS_SUPPORT
- root["email_enabled"] = settings.email_enabled;
-#else
- root["email_enabled"] = false;
-#endif
- root["email_ssl"] = settings.email_ssl;
- root["email_starttls"] = settings.email_starttls;
- root["email_server"] = settings.email_server;
- root["email_port"] = settings.email_port;
- root["email_login"] = settings.email_login;
- root["email_pass"] = settings.email_pass;
- root["email_sender"] = settings.email_sender;
- root["email_recp"] = settings.email_recp;
- root["email_subject"] = settings.email_subject;
}
// call on initialization and also when settings are updated/saved via web or console
@@ -257,9 +243,13 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
// Modbus settings
settings.modbus_enabled = root["modbus_enabled"] | EMSESP_DEFAULT_MODBUS_ENABLED;
+ check_flag(original_settings.modbus_enabled, settings.modbus_enabled, ChangeFlags::RESTART);
settings.modbus_port = root["modbus_port"] | EMSESP_DEFAULT_MODBUS_PORT;
+ check_flag(original_settings.modbus_port, settings.modbus_port, ChangeFlags::RESTART);
settings.modbus_max_clients = root["modbus_max_clients"] | EMSESP_DEFAULT_MODBUS_MAX_CLIENTS;
+ check_flag(original_settings.modbus_max_clients, settings.modbus_max_clients, ChangeFlags::RESTART);
settings.modbus_timeout = root["modbus_timeout"] | EMSESP_DEFAULT_MODBUS_TIMEOUT;
+ check_flag(original_settings.modbus_timeout, settings.modbus_timeout, ChangeFlags::RESTART);
//
// these may need mqtt restart to rebuild HA discovery topics
@@ -310,20 +300,6 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
settings.weblog_level = root["weblog_level"] | EMSESP_DEFAULT_WEBLOG_LEVEL;
settings.weblog_compact = root["weblog_compact"] | EMSESP_DEFAULT_WEBLOG_COMPACT;
- settings.email_enabled = root["email_enabled"] | FACTORY_EMAIL_ENABLE;
- settings.email_ssl = root["email_ssl"] | FACTORY_EMAIL_SSL;
- settings.email_starttls = root["email_starttls"] | FACTORY_EMAIL_STARTTLS;
- settings.email_server = root["email_server"] | FACTORY_EMAIL_SERVER;
- settings.email_port = root["email_port"] | FACTORY_EMAIL_PORT;
- settings.email_login = root["email_login"] | FACTORY_EMAIL_LOGIN;
- settings.email_pass = root["email_pass"] | FACTORY_EMAIL_PASSWORD;
- settings.email_sender = root["email_sender"] | FACTORY_EMAIL_FROM;
- settings.email_recp = root["email_recp"] | FACTORY_EMAIL_TO;
- settings.email_subject = root["email_subject"] | FACTORY_EMAIL_SUBJECT;
-
- if (settings.email_ssl && settings.email_starttls) {
- settings.email_ssl = false;
- }
// if no psram limit weblog buffer to 25 messages
if (EMSESP::system_.PSram() > 0) {
settings.weblog_buffer = root["weblog_buffer"] | EMSESP_DEFAULT_WEBLOG_BUFFER;
@@ -482,14 +458,23 @@ void WebSettings::set_board_profile(WebSettings & settings) {
#if CONFIG_IDF_TARGET_ESP32
// check for no PSRAM, could be a E32 or S32?
if (!ESP.getPsramSize()) {
+#if ESP_ARDUINO_VERSION_MAJOR < 3
+ if (ETH.begin(1, 16, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO0_IN)) {
+#else
if (ETH.begin(ETH_PHY_LAN8720, 1, 23, 18, 16, ETH_CLOCK_GPIO0_IN)) {
+#endif
settings.board_profile = "E32"; // Ethernet without PSRAM
} else {
settings.board_profile = "S32"; // ESP32 standard WiFi without PSRAM
}
} else {
- // check for boards with PSRAM, could be a E32V2 otherwise default back to the S32
+// check for boards with PSRAM, could be a E32V2 otherwise default back to the S32
+#if ESP_ARDUINO_VERSION_MAJOR < 3
+ if (ETH.begin(0, 15, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO0_OUT)) {
+#else
if (ETH.begin(ETH_PHY_LAN8720, 0, 23, 18, 15, ETH_CLOCK_GPIO0_OUT)) {
+#endif
+
if (analogReadMilliVolts(39) > 700) { // core voltage > 2.6V
settings.board_profile = "E32V2_2"; // Ethernet, PSRAM, internal sensors
} else {
@@ -517,9 +502,9 @@ void WebSettings::set_board_profile(WebSettings & settings) {
#ifndef EMSESP_STANDALONE
uint32_t psram_size = ESP.getPsramSize() / 1024; // in KB
if (psram_size > 0) {
- EMSESP::logger().info("Loaded board profile %s, PSRAM: %lu KB", settings.board_profile.c_str(), psram_size);
+ EMSESP::logger().info("Loaded board profile %s (PSRAM: %lu KB)", settings.board_profile.c_str(), psram_size);
} else {
- EMSESP::logger().info("Loaded board profile %s, PSRAM: not available", settings.board_profile.c_str());
+ EMSESP::logger().info("Loaded board profile %s (PSRAM: not available)", settings.board_profile.c_str());
}
#endif
diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp
index e5e1225e1..23f4d3486 100644
--- a/src/web/WebStatusService.cpp
+++ b/src/web/WebStatusService.cpp
@@ -216,6 +216,9 @@ void WebStatusService::action(AsyncWebServerRequest * request, JsonVariant json)
} else if (action == "resetMQTT" && is_admin) {
EMSESP::mqtt_.reset_mqtt();
ok = true;
+ } else if (action == "upgradeImportantMessages") {
+ root["upgradeImportantMessageType"] = upgradeImportantMessages(param);
+ ok = true;
}
#if defined(EMSESP_STANDALONE) && !defined(EMSESP_UNITY)
@@ -237,13 +240,75 @@ void WebStatusService::action(AsyncWebServerRequest * request, JsonVariant json)
request->send(response);
}
+// action = upgradeImportantMessages
+// returns the type of upgrade important message to display in the UI
+// 0 = no message (if just a minor version upgrade)
+// 1 = going from <= 3.8 to 3.9 (has new partition layout)
+// 2 = major version upgrade
+// version can be like 3.8.2 or a filename like EMS-ESP-3_8_2-dev_13-ESP32-16MB+.bin
+uint8_t WebStatusService::upgradeImportantMessages(std::string & version) {
+ if (version.empty()) {
+ return 0;
+ }
+
+ // it's a filename with a .bin or .md extension, try and extract the version from it
+ // e.g. EMS-ESP-3_8_2-dev_13-ESP32-16MB+.bin -> major=3 minor=8 patch=2
+ version::Semver200_version latest_version;
+ if ((version.find(".bin") != std::string::npos) || (version.find(".md") != std::string::npos)) {
+ std::string filename = version;
+ auto pos = filename.find("EMS-ESP-");
+ if (pos == std::string::npos) {
+ EMSESP::logger().err("Invalid version string: %s", version.c_str());
+ return 0;
+ }
+
+ pos += 8; // skip past "EMS-ESP-"
+ auto underscore1 = filename.find('_', pos);
+ auto underscore2 = filename.find('_', underscore1 + 1);
+ auto dash = filename.find('-', underscore2 + 1);
+ if (underscore1 == std::string::npos || underscore2 == std::string::npos || dash == std::string::npos) {
+ EMSESP::logger().err("Invalid version string: %s", version.c_str());
+ return 0;
+ }
+
+ std::string major_version = filename.substr(pos, underscore1 - pos);
+ std::string minor_version = filename.substr(underscore1 + 1, underscore2 - underscore1 - 1);
+ std::string patch_version = filename.substr(underscore2 + 1, dash - underscore2 - 1);
+ latest_version = version::Semver200_version(major_version + "." + minor_version + "." + patch_version);
+ } else {
+ // if it's .json file exit
+ if (version.find(".json") != std::string::npos) {
+ return 0;
+ } else {
+ // treat it like a version string like "3.9.0"
+ latest_version = version::Semver200_version(version);
+ }
+ }
+
+ version::Semver200_version current_version(current_version_s); // get current version
+
+ if (latest_version > current_version && current_version.minor() < latest_version.minor()) {
+ return 0; // if it's just a minor version upgrade return 0
+ }
+
+ if ((current_version.major() <= 3 && current_version.minor() <= 8) && (latest_version.major() == 3 && latest_version.minor() == 9)) {
+ return 1; // if moving from below 3.8.x to 3.9.x return 1
+ }
+
+ if (latest_version > current_version && current_version.major() < latest_version.major()) {
+ return 2; // if it's a major version upgrade return 2
+ }
+
+ return 0; // if it's not a valid version upgrade return 0
+}
+
// action = checkUpgrade
// versions holds the latest development version and stable version in one string, comma separated
-bool WebStatusService::checkUpgrade(JsonObject root, std::string & versions) {
- if (!versions.empty()) {
+bool WebStatusService::checkUpgrade(JsonObject root, std::string & version) {
+ if (!version.empty()) {
version::Semver200_version current_version(current_version_s);
- version::Semver200_version latest_dev_version(versions.substr(0, versions.find(',')));
- version::Semver200_version latest_stable_version(versions.substr(versions.find(',') + 1));
+ version::Semver200_version latest_dev_version(version.substr(0, version.find(',')));
+ version::Semver200_version latest_stable_version(version.substr(version.find(',') + 1));
bool dev_upgradeable = latest_dev_version > current_version;
bool stable_upgradeable = latest_stable_version > current_version;
@@ -342,7 +407,7 @@ bool WebStatusService::getCustomSupport(JsonObject root) {
#if defined(EMSESP_STANDALONE)
// dummy test data for "test api3"
- deserializeJson(doc, "{\"type\":\"customSupport\",\"Support\":{\"html\":[\"html code\",\"here\"], \"img_url\": \"https://emsesp.org/_media/images/designer.png\"}");
+ deserializeJson(doc, "{\"type\":\"customSupport\",\"Support\":{\"html\":[\"html code\",\"here\"], \"img_url\": \"https://emsesp.org/media/images/designer.png\"}");
#else
// check if we have custom support file uploaded
File file = LittleFS.open(EMSESP_CUSTOMSUPPORT_FILE, "r");
diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h
index 0d38a5b73..8d2c69bfd 100644
--- a/src/web/WebStatusService.h
+++ b/src/web/WebStatusService.h
@@ -30,12 +30,13 @@ class WebStatusService {
SecurityManager * _securityManager;
// actions
- bool checkUpgrade(JsonObject root, std::string & latest_version);
- bool exportData(JsonObject root, std::string & type);
- bool getCustomSupport(JsonObject root);
- bool uploadURL(const char * url);
- bool setSystemStatus(const char * status);
- void allvalues(JsonObject output);
+ bool checkUpgrade(JsonObject root, std::string & latest_version);
+ bool exportData(JsonObject root, std::string & type);
+ bool getCustomSupport(JsonObject root);
+ bool uploadURL(const char * url);
+ bool setSystemStatus(const char * status);
+ void allvalues(JsonObject output);
+ uint8_t upgradeImportantMessages(std::string & version);
std::string current_version_s = EMSESP_APP_VERSION;
};
diff --git a/test/test_data/custom_support.json b/test/test_data/custom_support.json
index b528645a3..6d5b81502 100644
--- a/test/test_data/custom_support.json
+++ b/test/test_data/custom_support.json
@@ -13,6 +13,6 @@
"",
"For help and questions please contact your installer."
],
- "img_url": "https://emsesp.org/_media/images/designer.png"
+ "img_url": "https://emsesp.org/media/images/designer.png"
}
}
\ No newline at end of file
diff --git a/test/test_data/emsesp_allvalues.json b/test/test_data/emsesp_allvalues.json
new file mode 100644
index 000000000..6a8297eb1
--- /dev/null
+++ b/test/test_data/emsesp_allvalues.json
@@ -0,0 +1,103 @@
+{
+ "Boiler Nefit Trendline HRC30 (DeviceID:0x08, ProductID:123, Version:06.01)": {
+ "force heating off": "off",
+ "heating active": "off",
+ "tapwater active": "off",
+ "selected flow temperature": 5,
+ "heating pump modulation": 0,
+ "current flow temperature": 41.4,
+ "return temperature": 37.7,
+ "system pressure": 1.3,
+ "actual boiler temperature": 44.2,
+ "gas": "off",
+ "gas stage 2": "off",
+ "flame current": 0,
+ "fan": "off",
+ "ignition": "off",
+ "oil preheating": "off",
+ "burner min power": 0,
+ "burner max power": 50,
+ "burner min period": 10,
+ "hysteresis on temperature": -6,
+ "hysteresis off temperature": 6,
+ "heating activated": "on",
+ "heating temperature": 70,
+ "heating pump": "off",
+ "boiler pump max power": 70,
+ "boiler pump min power": 50,
+ "boiler pump mode": "proportional",
+ "pump delay": 2,
+ "burner selected max power": 0,
+ "burner current power": 0,
+ "burner starts": 394602,
+ "total burner operating time": "480 days 4 hours 23 minutes",
+ "burner stage 2 operating time": "0 days 0 hours 0 minutes",
+ "total heat operating time": "395 days 2 hours 14 minutes",
+ "burner starts heating": 46245,
+ "total UBA operating time": "3932 days 23 hours 58 minutes",
+ "last error code": "2E(207) 100.75.2000 65:00 (0 min)",
+ "service code": "0H",
+ "service code number": 203,
+ "maintenance message": "H00",
+ "maintenance scheduled": "manual",
+ "time to next maintenance": 6000,
+ "next maintenance date": "01.01.2012",
+ "dhw turn on/off": "on",
+ "dhw set temperature": 62,
+ "dhw selected temperature": 60,
+ "dhw type": "flow",
+ "dhw comfort": "hot",
+ "dhw flow temperature offset": 40,
+ "dhw max power": 100,
+ "dhw circulation pump available": "off",
+ "dhw charging type": "3-way valve",
+ "dhw hysteresis on temperature": -5,
+ "dhw hysteresis off temperature": 0,
+ "dhw disinfection temperature": 70,
+ "dhw circulation pump mode": "off",
+ "dhw circulation active": "off",
+ "dhw current intern temperature": 33.5,
+ "dhw current tap water flow": 0,
+ "dhw storage intern temperature": 33.5,
+ "dhw activated": "on",
+ "dhw one time charging": "off",
+ "dhw disinfecting": "off",
+ "dhw charging": "off",
+ "dhw recharging": "off",
+ "dhw temperature ok": "on",
+ "dhw active": "off",
+ "dhw 3-way valve active": "on",
+ "dhw set pump power": 0,
+ "dhw starts": 348357,
+ "dhw active time": "85 days 2 hours 9 minutes",
+ "nominal Power": 30,
+ "total energy": 3088.69,
+ "energy heating": 2532.94,
+ "dhw energy": 555.75
+ },
+ "Thermostat RC20 (DeviceID:0x17, ProductID:77, Version:03.03)": {
+ "date/time": "10.12.2023 13:49",
+ "hc1 how hot lounge should be": 19,
+ "hc1 current room temp": 19.5,
+ "hc1 mqtt discovery current room temperature": "roomTemp",
+ "hc1 mode": "auto",
+ "hc1 manual temperature": 21.5,
+ "hc1 temperature when mode is off": 7,
+ "hc1 day temperature T2": 20,
+ "hc1 day temperature T3": 20,
+ "hc1 day temperature T4": 20,
+ "hc1 night temperature T1": 15,
+ "hc1 program switchtime": "00 mo 00:00 T1"
+ },
+ "Controller Module BC10 (DeviceID:0x09, ProductID:190, Version:01.03)": {},
+ "Custom Entities": {
+ "boiler_flowtemp": 5,
+ "nominalpower": 30,
+ "minmodulation": 23,
+ "maxmodulation": 115
+ },
+ "Analog Sensors": {},
+ "Temperature Sensors": {
+ "zolder": 18.3
+ }
+}
\ No newline at end of file
diff --git a/test/test_data/emsesp_customizations.json b/test/test_data/emsesp_customizations.json
new file mode 100644
index 000000000..99ba91cef
--- /dev/null
+++ b/test/test_data/emsesp_customizations.json
@@ -0,0 +1,37 @@
+{
+ "type": "customizations",
+ "Customizations": {
+ "ts": [],
+ "as": [],
+ "masked_entities": [
+ {
+ "product_id": 77,
+ "device_id": 23,
+ "custom_name": "",
+ "custom_brand": "",
+ "entity_ids": [
+ "08datetime",
+ "08hc1/seltemp|<30",
+ "08hc1/currtemp",
+ "08hc1/mode"
+ ]
+ },
+ {
+ "product_id": 123,
+ "device_id": 8,
+ "custom_name": "",
+ "custom_brand": "",
+ "entity_ids": [
+ "08heatingactive",
+ "08burngas",
+ "08fanwork",
+ "08ignwork",
+ "08burnmaxpower|>23<121",
+ "08burnminperiod|<120",
+ "08lastcode",
+ "08servicecode"
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/test/test_data/emsesp_entities.json b/test/test_data/emsesp_entities.json
new file mode 100644
index 000000000..804cc81d4
--- /dev/null
+++ b/test/test_data/emsesp_entities.json
@@ -0,0 +1,6 @@
+{
+ "type": "entities",
+ "Entities": {
+ "entities": []
+ }
+}
\ No newline at end of file
diff --git a/test/test_data/emsesp_schedule.json b/test/test_data/emsesp_schedule.json
new file mode 100644
index 000000000..8674b3959
--- /dev/null
+++ b/test/test_data/emsesp_schedule.json
@@ -0,0 +1,6 @@
+{
+ "type": "schedule",
+ "Schedule": {
+ "schedule": []
+ }
+}
\ No newline at end of file
diff --git a/test/test_data/emsesp_settings.json b/test/test_data/emsesp_settings.json
new file mode 100644
index 000000000..80b8f74d4
--- /dev/null
+++ b/test/test_data/emsesp_settings.json
@@ -0,0 +1,145 @@
+{
+ "type": "settings",
+ "System": {
+ "version": "3.8.2"
+ },
+ "Network": {
+ "ssid": "",
+ "bssid": "",
+ "password": "",
+ "hostname": "ems-esp",
+ "static_ip_config": false,
+ "bandwidth20": false,
+ "nosleep": true,
+ "enableMDNS": true,
+ "enableCORS": false,
+ "CORSOrigin": "*",
+ "tx_power": 0
+ },
+ "AP": {
+ "provision_mode": 2,
+ "ssid": "ems-esp",
+ "password": "ems-esp-neo",
+ "channel": 1,
+ "ssid_hidden": false,
+ "max_clients": 4,
+ "local_ip": "192.168.4.1",
+ "gateway_ip": "192.168.4.1",
+ "subnet_mask": "255.255.255.0"
+ },
+ "MQTT": {
+ "enableTLS": false,
+ "rootCA": "",
+ "enabled": true,
+ "host": "192.168.X.X",
+ "port": 1883,
+ "base": "ems-esp",
+ "username": "xxxx",
+ "password": "xxxx",
+ "client_id": "esp32-395c7bcc",
+ "keep_alive": 60,
+ "clean_session": false,
+ "entity_format": 1,
+ "publish_time_boiler": 60,
+ "publish_time_thermostat": 60,
+ "publish_time_solar": 60,
+ "publish_time_mixer": 60,
+ "publish_time_water": 60,
+ "publish_time_other": 60,
+ "publish_time_sensor": 60,
+ "publish_time_heartbeat": 10,
+ "mqtt_qos": 0,
+ "mqtt_retain": false,
+ "ha_enabled": true,
+ "nested_format": 1,
+ "discovery_prefix": "homeassistant",
+ "discovery_type": 0,
+ "ha_number_mode": 1,
+ "publish_single": false,
+ "publish_single2cmd": false,
+ "send_response": false
+ },
+ "NTP": {
+ "enabled": true,
+ "server": "time.google.com",
+ "tz_label": "Europe/Amsterdam",
+ "tz_format": "CET-1CEST,M3.5.0,M10.5.0/3"
+ },
+ "Security": {
+ "jwt_secret": "ems-esp-neo",
+ "users": [
+ {
+ "username": "admin",
+ "password": "admin",
+ "admin": true
+ },
+ {
+ "username": "guest",
+ "password": "guest",
+ "admin": false
+ }
+ ]
+ },
+ "Settings": {
+ "version": "3.8.2",
+ "board_profile": "E32V2",
+ "platform": "ESP32",
+ "locale": "en",
+ "tx_mode": 1,
+ "ems_bus_id": 11,
+ "syslog_enabled": false,
+ "syslog_level": 3,
+ "trace_raw": false,
+ "syslog_mark_interval": 0,
+ "syslog_host": "",
+ "syslog_port": 514,
+ "boiler_heatingoff": false,
+ "remote_timeout": 24,
+ "remote_timeout_en": false,
+ "shower_timer": true,
+ "shower_alert": false,
+ "shower_alert_coldshot": 10,
+ "shower_alert_trigger": 7,
+ "shower_min_duration": 180,
+ "rx_gpio": 4,
+ "tx_gpio": 5,
+ "dallas_gpio": 14,
+ "dallas_parasite": false,
+ "led_gpio": 2,
+ "hide_led": true,
+ "led_type": 0,
+ "low_clock": false,
+ "telnet_enabled": true,
+ "notoken_api": false,
+ "readonly_mode": false,
+ "analog_enabled": true,
+ "pbutton_gpio": 34,
+ "solar_maxflow": 30,
+ "fahrenheit": false,
+ "bool_format": 1,
+ "bool_dashboard": 1,
+ "enum_format": 1,
+ "weblog_level": 6,
+ "weblog_buffer": 500,
+ "weblog_compact": true,
+ "phy_type": 1,
+ "eth_power": 15,
+ "eth_phy_addr": 0,
+ "eth_clock_mode": 1,
+ "modbus_enabled": false,
+ "modbus_port": 502,
+ "modbus_max_clients": 10,
+ "modbus_timeout": 300,
+ "developer_mode": true,
+ "email_enabled": false,
+ "email_ssl": false,
+ "email_starttls": true,
+ "email_server": "smtp.example.net",
+ "email_port": 587,
+ "email_login": "",
+ "email_pass": "",
+ "email_sender": "ems-esp@example.net",
+ "email_recp": "",
+ "email_subject": "ems-esp notification"
+ }
+}
\ No newline at end of file
diff --git a/test/test_data/emsesp_systembackup.json b/test/test_data/emsesp_systembackup.json
new file mode 100644
index 000000000..3f7b0816c
--- /dev/null
+++ b/test/test_data/emsesp_systembackup.json
@@ -0,0 +1,249 @@
+{
+ "type": "systembackup",
+ "version": "3.8.2",
+ "date": "2026-04-15T08:06:45",
+ "systembackup": [
+ {
+ "type": "settings",
+ "Network": {
+ "ssid": "",
+ "bssid": "",
+ "password": "",
+ "hostname": "ems-esp",
+ "static_ip_config": false,
+ "bandwidth20": false,
+ "nosleep": true,
+ "enableMDNS": true,
+ "enableCORS": false,
+ "CORSOrigin": "*",
+ "tx_power": 0
+ },
+ "AP": {
+ "provision_mode": 2,
+ "ssid": "ems-esp",
+ "password": "ems-esp-neo",
+ "channel": 1,
+ "ssid_hidden": false,
+ "max_clients": 4,
+ "local_ip": "192.168.X.X",
+ "gateway_ip": "192.168.X.X",
+ "subnet_mask": "255.255.255.0"
+ },
+ "MQTT": {
+ "enableTLS": false,
+ "rootCA": "",
+ "enabled": true,
+ "host": "192.168.X.X",
+ "port": 1883,
+ "base": "ems-esp",
+ "username": "xxxx",
+ "password": "xxxx",
+ "client_id": "esp32-395c7bcc",
+ "keep_alive": 60,
+ "clean_session": false,
+ "entity_format": 1,
+ "publish_time_boiler": 60,
+ "publish_time_thermostat": 60,
+ "publish_time_solar": 60,
+ "publish_time_mixer": 60,
+ "publish_time_water": 60,
+ "publish_time_other": 60,
+ "publish_time_sensor": 60,
+ "publish_time_heartbeat": 10,
+ "mqtt_qos": 0,
+ "mqtt_retain": false,
+ "ha_enabled": true,
+ "nested_format": 1,
+ "discovery_prefix": "homeassistant",
+ "discovery_type": 0,
+ "ha_number_mode": 1,
+ "publish_single": false,
+ "publish_single2cmd": false,
+ "send_response": false
+ },
+ "NTP": {
+ "enabled": true,
+ "server": "time.google.com",
+ "tz_label": "Europe/Amsterdam",
+ "tz_format": "CET-1CEST,M3.5.0,M10.5.0/3"
+ },
+ "Security": {
+ "jwt_secret": "ems-esp-neo",
+ "users": [
+ {
+ "username": "admin",
+ "password": "admin",
+ "admin": true
+ },
+ {
+ "username": "guest",
+ "password": "guest",
+ "admin": false
+ }
+ ]
+ },
+ "Settings": {
+ "version": "3.8.2",
+ "board_profile": "E32V2",
+ "platform": "ESP32",
+ "locale": "en",
+ "tx_mode": 1,
+ "ems_bus_id": 11,
+ "syslog_enabled": false,
+ "syslog_level": 3,
+ "trace_raw": false,
+ "syslog_mark_interval": 0,
+ "syslog_host": "",
+ "syslog_port": 514,
+ "boiler_heatingoff": false,
+ "remote_timeout": 24,
+ "remote_timeout_en": false,
+ "shower_timer": true,
+ "shower_alert": false,
+ "shower_alert_coldshot": 10,
+ "shower_alert_trigger": 7,
+ "shower_min_duration": 180,
+ "rx_gpio": 4,
+ "tx_gpio": 5,
+ "dallas_gpio": 14,
+ "dallas_parasite": false,
+ "led_gpio": 2,
+ "hide_led": true,
+ "led_type": 0,
+ "low_clock": false,
+ "telnet_enabled": true,
+ "notoken_api": false,
+ "readonly_mode": false,
+ "analog_enabled": true,
+ "pbutton_gpio": 34,
+ "solar_maxflow": 30,
+ "fahrenheit": false,
+ "bool_format": 1,
+ "bool_dashboard": 1,
+ "enum_format": 1,
+ "weblog_level": 6,
+ "weblog_buffer": 75,
+ "weblog_compact": true,
+ "phy_type": 1,
+ "eth_power": 15,
+ "eth_phy_addr": 0,
+ "eth_clock_mode": 1,
+ "modbus_enabled": false,
+ "modbus_port": 502,
+ "modbus_max_clients": 10,
+ "modbus_timeout": 300,
+ "developer_mode": true
+ }
+ },
+ {
+ "type": "schedule",
+ "Schedule": {
+ "schedule": []
+ }
+ },
+ {
+ "type": "customizations",
+ "Customizations": {
+ "ts": [],
+ "as": [],
+ "masked_entities": [
+ {
+ "product_id": 77,
+ "device_id": 23,
+ "custom_name": "",
+ "custom_brand": "",
+ "entity_ids": [
+ "08datetime",
+ "08hc1/seltemp|<30",
+ "08hc1/currtemp",
+ "08hc1/mode"
+ ]
+ },
+ {
+ "product_id": 123,
+ "device_id": 8,
+ "custom_name": "",
+ "custom_brand": "",
+ "entity_ids": [
+ "08heatingactive",
+ "08burngas",
+ "08fanwork",
+ "08ignwork",
+ "08burnmaxpower|>23<121",
+ "08burnminperiod|<120",
+ "08lastcode",
+ "08servicecode"
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "type": "entities",
+ "Entities": {
+ "entities": []
+ }
+ },
+ {
+ "type": "modules",
+ "Modules": {
+ "modules": []
+ }
+ },
+ {
+ "type": "nvs",
+ "nvs": [
+ {
+ "type": 1,
+ "key": "nompower",
+ "value": 30
+ },
+ {
+ "type": 33,
+ "key": "boot",
+ "value": "3.8.1-dev.4"
+ },
+ {
+ "type": 4,
+ "key": "d_boot",
+ "value": 1767525325
+ },
+ {
+ "type": 33,
+ "key": "app1",
+ "value": "3.8.2-dev.13"
+ },
+ {
+ "type": 33,
+ "key": "app0",
+ "value": "3.8.1"
+ },
+ {
+ "type": 4,
+ "key": "d_app0",
+ "value": 1774988066
+ },
+ {
+ "type": 1,
+ "key": "fresh_firmware",
+ "value": 0
+ },
+ {
+ "type": 4,
+ "key": "d_app1",
+ "value": 1776194060
+ },
+ {
+ "type": 66,
+ "key": "nrgheat",
+ "value": 485871.5481
+ },
+ {
+ "type": 66,
+ "key": "nrgww",
+ "value": 101649.2176
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file