Merge branch 'develop'

This commit is contained in:
molvqingtai 2024-10-29 10:24:34 +08:00
commit 859a8f4a01
11 changed files with 412 additions and 285 deletions

View file

@ -44,7 +44,7 @@
},
"homepage": "https://github.com/molvqingtai/WebChat",
"dependencies": {
"@hookform/resolvers": "^3.9.0",
"@hookform/resolvers": "^3.9.1",
"@lottiefiles/dotlottie-react": "^0.9.2",
"@perfsee/jsonr": "^1.13.0",
"@radix-ui/react-avatar": "^1.1.1",
@ -72,8 +72,8 @@
"date-fns": "^4.1.0",
"framer-motion": "^11.11.10",
"idb-keyval": "^6.2.1",
"lucide-react": "^0.453.0",
"nanoid": "^5.0.7",
"lucide-react": "^0.454.0",
"nanoid": "^5.0.8",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.53.1",
@ -96,7 +96,7 @@
"devDependencies": {
"@commitlint/cli": "^19.5.0",
"@commitlint/config-conventional": "^19.5.0",
"@eslint-react/eslint-plugin": "^1.15.1",
"@eslint-react/eslint-plugin": "^1.15.2",
"@eslint/js": "^9.13.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^6.0.3",
@ -104,10 +104,10 @@
"@types/eslint": "^9.6.1",
"@types/eslint__js": "^8.42.3",
"@types/eslint-plugin-tailwindcss": "^3.17.0",
"@types/node": "^22.8.1",
"@types/node": "^22.8.2",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@typescript-eslint/parser": "^8.11.0",
"@typescript-eslint/parser": "^8.12.1",
"@vitejs/plugin-react": "^4.3.3",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
@ -128,7 +128,7 @@
"tailwindcss": "^3.4.14",
"tailwindcss-animate": "^1.0.7",
"typescript": "^5.6.3",
"typescript-eslint": "^8.11.0",
"typescript-eslint": "^8.12.1",
"vite-plugin-svgr": "^4.2.0",
"webext-bridge": "^6.0.1",
"wxt": "^0.19.13"

View file

@ -9,8 +9,8 @@ importers:
.:
dependencies:
'@hookform/resolvers':
specifier: ^3.9.0
version: 3.9.0(react-hook-form@7.53.1(react@18.3.1))
specifier: ^3.9.1
version: 3.9.1(react-hook-form@7.53.1(react@18.3.1))
'@lottiefiles/dotlottie-react':
specifier: ^0.9.2
version: 0.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -93,11 +93,11 @@ importers:
specifier: ^6.2.1
version: 6.2.1
lucide-react:
specifier: ^0.453.0
version: 0.453.0(react@18.3.1)
specifier: ^0.454.0
version: 0.454.0(react@18.3.1)
nanoid:
specifier: ^5.0.7
version: 5.0.7
specifier: ^5.0.8
version: 5.0.8
react:
specifier: ^18.3.1
version: 18.3.1
@ -155,13 +155,13 @@ importers:
devDependencies:
'@commitlint/cli':
specifier: ^19.5.0
version: 19.5.0(@types/node@22.8.1)(typescript@5.6.3)
version: 19.5.0(@types/node@22.8.2)(typescript@5.6.3)
'@commitlint/config-conventional':
specifier: ^19.5.0
version: 19.5.0
'@eslint-react/eslint-plugin':
specifier: ^1.15.1
version: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
specifier: ^1.15.2
version: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint/js':
specifier: ^9.13.0
version: 9.13.0
@ -184,8 +184,8 @@ importers:
specifier: ^8.42.3
version: 8.42.3
'@types/node':
specifier: ^22.8.1
version: 22.8.1
specifier: ^22.8.2
version: 22.8.2
'@types/react':
specifier: ^18.3.12
version: 18.3.12
@ -193,11 +193,11 @@ importers:
specifier: ^18.3.1
version: 18.3.1
'@typescript-eslint/parser':
specifier: ^8.11.0
version: 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
specifier: ^8.12.1
version: 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@vitejs/plugin-react':
specifier: ^4.3.3
version: 4.3.3(vite@5.4.10(@types/node@22.8.1))
version: 4.3.3(vite@5.4.10(@types/node@22.8.2))
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.47)
@ -256,17 +256,17 @@ importers:
specifier: ^5.6.3
version: 5.6.3
typescript-eslint:
specifier: ^8.11.0
version: 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
specifier: ^8.12.1
version: 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
vite-plugin-svgr:
specifier: ^4.2.0
version: 4.2.0(rollup@4.21.3)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.1))
version: 4.2.0(rollup@4.21.3)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.2))
webext-bridge:
specifier: ^6.0.1
version: 6.0.1
wxt:
specifier: ^0.19.13
version: 0.19.13(@types/node@22.8.1)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4)
version: 0.19.13(@types/node@22.8.2)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4)
packages:
@ -633,14 +633,14 @@ packages:
resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint-react/ast@1.15.1':
resolution: {integrity: sha512-vR69yo/9lihImDK4fvay0i6yHtgrjl6gSDwVomOgFJpkFp0nZ1E2OkVuOkqmXvKvOUxs/SJxPq4n6HxRdA4q7A==}
'@eslint-react/ast@1.15.2':
resolution: {integrity: sha512-Dtn6Ai/P74CLoZ4mPR/9Mm4xXuulXULaXNXAzusZSNfa3+4podw6LCxKHpLcLqsvfZN3mciW3cC8CAyH7/MZwg==}
'@eslint-react/core@1.15.1':
resolution: {integrity: sha512-sVRGwz8lzTRoONgya18xErhkJ0SOabCbJm//OXWfb3GiCQ0iWHcagyLEOWeFg9rTbV+touBc2vvNbSNAUS8/qg==}
'@eslint-react/core@1.15.2':
resolution: {integrity: sha512-F8qh1oeqdXrepTQKp0kbQ8UTVDhSbJGvsQhO6YMSOC/Bci98Z2ad/VZXfZtMcYtvj+/4s0nmifzrYfvjt7easw==}
'@eslint-react/eslint-plugin@1.15.1':
resolution: {integrity: sha512-EEs5M+8rO7fBxpLAssJEw7l0ErYWzywtHYeFNeyaiA42OCfC8gLICUdfA6QWbJSxG04THje6gvMrdkTe9m0ymQ==}
'@eslint-react/eslint-plugin@1.15.2':
resolution: {integrity: sha512-j4O+dVFG24VrEu0lfiY7PTiAdKpYBWrc16/J4OymTERxwJYAZLuedoIYextSYjpJ7Hn9RhQyhGq4jqbcIpyVwg==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -649,20 +649,20 @@ packages:
typescript:
optional: true
'@eslint-react/jsx@1.15.1':
resolution: {integrity: sha512-FP+Q8lesrKgWfbVJZbB7PrLqasjJy2zk4+YVP0L2fmT6PzDMidxHVLbEqN9fT8FUtyexSBMonvetZTD2V4+nWw==}
'@eslint-react/jsx@1.15.2':
resolution: {integrity: sha512-IwkmPazUhEpMQgu6gVzCWuvWU7Za7SmddKowNIelSfoX0o5uZVh42anrVnGyX0jgx9X7XcZOUYll3F701Ftyqw==}
'@eslint-react/shared@1.15.1':
resolution: {integrity: sha512-SfP1yU9taJMjwr06C/jvTowFcq5AoIKJEPNpyKmVED3pHYjdq1IpziTAU8FjB2GBbVfU6kHdbMxkcO30PfSRCA==}
'@eslint-react/shared@1.15.2':
resolution: {integrity: sha512-5xOCUbf+AhWcMKdQSPRmqJrnsepiP1SYyoc0w8M69DLhkuRfTnzVsJsvXNGS74+8oG8jBfRU/C1dkQxNWoODWg==}
'@eslint-react/tools@1.15.1':
resolution: {integrity: sha512-j+/fTzPc91KPFISegS0+ljDiHGb5AbxDqK/O/E+MH4CSrLJFiChJh7pVMw6vs7Y1TjxEhoK+Gl3WDxZWnNBM9A==}
'@eslint-react/tools@1.15.2':
resolution: {integrity: sha512-u5vASGC6Ui+5G0AkorTZHevHE1w6Spaun9UdmadMDTuZdPLbfIUPoD4dfZ5AaqH6wVfdpmieHFXsItuvRWHWxw==}
'@eslint-react/types@1.15.1':
resolution: {integrity: sha512-59Tp35OeEoUB8jVyuLd0YbaOSeNKyYkW8eeh2radkIz5gQe2Whns+Nk6kIq2qYCr3vVVWBfiI3corkIByWBukA==}
'@eslint-react/types@1.15.2':
resolution: {integrity: sha512-s8HfvVPl8aCb+coIPrFULDugR22GiRKU6keXwdRqQaHR4U0a6YtSqNFssoxEvMdkesNAQ2kIhZEE4oXRyR7gFw==}
'@eslint-react/var@1.15.1':
resolution: {integrity: sha512-9IRZoXHkYtesgYQzEi4Gz93yG3mkUWQeBb+FNv44CRiKQ0egbGfDJCe+nqGsD67OebI1JKnmTMqLRR8YWPxMnw==}
'@eslint-react/var@1.15.2':
resolution: {integrity: sha512-Kd37TnpjGWXUshTruUxH2wyo4ODItf/yn8P8VbgOAirkKg/Y7cSsep3hXuY4hXlpOd/ZgoGmtGE8JHsm65Vfxw==}
'@eslint/config-array@0.18.0':
resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
@ -910,8 +910,8 @@ packages:
engines: {node: '>=6'}
hasBin: true
'@hookform/resolvers@3.9.0':
resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==}
'@hookform/resolvers@3.9.1':
resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==}
peerDependencies:
react-hook-form: ^7.0.0
@ -2003,8 +2003,8 @@ packages:
'@types/murmurhash3js-revisited@3.0.3':
resolution: {integrity: sha512-QvlqvYtGBYIDeO8dFdY4djkRubcrc+yTJtBc7n8VZPlJDUS/00A+PssbvERM8f9bYRmcaSEHPZgZojeQj7kzAA==}
'@types/node@22.8.1':
resolution: {integrity: sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==}
'@types/node@22.8.2':
resolution: {integrity: sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@ -2045,8 +2045,8 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@typescript-eslint/eslint-plugin@8.11.0':
resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==}
'@typescript-eslint/eslint-plugin@8.12.1':
resolution: {integrity: sha512-gNg/inLRcPoBsKKIe4Vv38SVSOhk4BKWNO0T56sVff33gRqtTpOsrhHtiOKD1lmIOmCtZMPaW2x/h2FlM+sCEg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@ -2056,8 +2056,8 @@ packages:
typescript:
optional: true
'@typescript-eslint/parser@8.11.0':
resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==}
'@typescript-eslint/parser@8.12.1':
resolution: {integrity: sha512-I/I9Bg7qFa8rOgBnUUHIWTgzbB5wVkSLX+04xGUzTcJUtdq/I2uHWR9mbW6qUYJG/UmkuDcTax5JHvoEWOAHOQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -2066,12 +2066,12 @@ packages:
typescript:
optional: true
'@typescript-eslint/scope-manager@8.11.0':
resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==}
'@typescript-eslint/scope-manager@8.12.1':
resolution: {integrity: sha512-bma6sD1iViTt+y9MAwDlBdPTMCqoH/BNdcQk4rKhIZWv3eM0xHmzeSrPJA663PAqFqfpOmtdugycpr0E1mZDVA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@8.11.0':
resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==}
'@typescript-eslint/type-utils@8.12.1':
resolution: {integrity: sha512-zJzrvbDVjIzVKV2TGHcjembEhws8RWXJhmqfO9hS2gRXBN0gDwGhRPEdJ6AZglzfJ+YA1q09EWpSLSXjBJpIMQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@ -2079,12 +2079,12 @@ packages:
typescript:
optional: true
'@typescript-eslint/types@8.11.0':
resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==}
'@typescript-eslint/types@8.12.1':
resolution: {integrity: sha512-anMS4es5lxBe4UVcDXOkcDb3csnm5BvaNIbOFfvy/pJEohorsggdVB8MFbl5EZiEuBnZZ0ei1z7W5b6FdFiV1Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.11.0':
resolution: {integrity: sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==}
'@typescript-eslint/typescript-estree@8.12.1':
resolution: {integrity: sha512-k/o9khHOckPeDXilFTIPsP9iAYhhdMh3OsOL3i2072PNpFqhqzRHx472/0DeC8H/WZee3bZG0z2ddGRSPgeOKw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@ -2092,14 +2092,14 @@ packages:
typescript:
optional: true
'@typescript-eslint/utils@8.11.0':
resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==}
'@typescript-eslint/utils@8.12.1':
resolution: {integrity: sha512-sDv9yFHrhKe1WN8EYuzfhKCh/sFRupe9P+m/lZ5YgVvPoCUGHNN50IO4llSu7JAbftUM/QcCh+GeCortXPrBYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
'@typescript-eslint/visitor-keys@8.11.0':
resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==}
'@typescript-eslint/visitor-keys@8.12.1':
resolution: {integrity: sha512-2RwdwnNGuOQKdGjuhujQHUqBZhEuodg2sLVPvOfWktvA9sOXOVqARjOyHSyhN2LiJGKxV6c8oOcmOtRcAnEeFw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.2.0':
@ -3141,8 +3141,8 @@ packages:
eslint-config-prettier:
optional: true
eslint-plugin-react-debug@1.15.1:
resolution: {integrity: sha512-UY/Ey0yP/X+4chhXpgTqouIy6+uMbgKQR5hyLjR9Rrj10IdW6tQoMRC2od/ibErQlIWfFAZS2D1W0X82Ks2IJg==}
eslint-plugin-react-debug@1.15.2:
resolution: {integrity: sha512-k+4Z+Gel0Vh3eQ5fLTOe+wvHuvD6ApOzBDupIRISv+sU24KXykT3J0+xZLy3gu5OfhxQ0hE7b3gY8bZvYaW41w==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -3151,8 +3151,8 @@ packages:
typescript:
optional: true
eslint-plugin-react-dom@1.15.1:
resolution: {integrity: sha512-f9zHIZc3ktda8TK/DkGlhu6XLhMYSazQvFuaxxCUNWsKHKQaGr/YbMmNnanwPa4qHEHBfhy0nXr77e2gYa7rLA==}
eslint-plugin-react-dom@1.15.2:
resolution: {integrity: sha512-strNT28BHy7yeQgdbBzPGUHDqRkZFI5IfKlkuiozk+vPSZfLj0K2X8L25DvNXr5eRMTyV6TlUsk1Y6xr6ZJgPg==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -3161,8 +3161,8 @@ packages:
typescript:
optional: true
eslint-plugin-react-hooks-extra@1.15.1:
resolution: {integrity: sha512-BqHXPejTBVurYJkUeAND/ku3zGT2ONtMXFRMPZqTWImrtzNb/fIHohhtGxs8RQVfpzda6GgBc0x0TIUVhBxFiQ==}
eslint-plugin-react-hooks-extra@1.15.2:
resolution: {integrity: sha512-v+PazTS64GPCCGj9dEvSirHc4oNQm74zhE/CpsEo+0IBre38CavN7Ausq/OAgipmnihoyEH7hMgUzJsCAABEmQ==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -3171,8 +3171,8 @@ packages:
typescript:
optional: true
eslint-plugin-react-naming-convention@1.15.1:
resolution: {integrity: sha512-Ynhhn2I9OHbSZsDamNU7+swMlWSVAI9QYMtmDtlCDglRTVIFKHtG0rKnTk1X8VYJIX0un40rowwakQwQnkleVQ==}
eslint-plugin-react-naming-convention@1.15.2:
resolution: {integrity: sha512-Vj4SOKlFAs0c+ICal0rVZHjVmEFAKEROhJV8xBu6ZO7JcVDb3Yc7N6t8/vTwhGJDk0jQ8quNSV0dPCX4gvLlDw==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -3181,8 +3181,8 @@ packages:
typescript:
optional: true
eslint-plugin-react-web-api@1.15.1:
resolution: {integrity: sha512-ZVZ+ReoFGcm98i5ULGo9Ee4Z1YOn6rKKWCCJ3uacnXT0DqhzTPXi88P8a6z16uKrWeHWjTNYdIssKIpw2oys4g==}
eslint-plugin-react-web-api@1.15.2:
resolution: {integrity: sha512-UIwuLvJn/2vbnB8IRnfNpsgcNQlJPJKfF/6/XwselRcRkgl5qk1B8pypapG/g3MqJ85jIAUj1Xn+bQu2BiTa7g==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -3191,8 +3191,8 @@ packages:
typescript:
optional: true
eslint-plugin-react-x@1.15.1:
resolution: {integrity: sha512-PjscVhBiEuFP6sLFTNVdBRlybqS5PEN3H3NG91Ag4Va/QI6bkedZbRpalhCL0rvsZYlhp0e0Oa9EZvwW/H+w5A==}
eslint-plugin-react-x@1.15.2:
resolution: {integrity: sha512-HIpYzojk5fzalJ09UJRhtu1cJcFxM/YsTCdVPE/v3sqWb/1v8bzPVtUkQbR787G4o/M0wTUy+pBzTYAJeBRnOw==}
engines: {bun: '>=1.0.15', node: '>=18.18.0'}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -4412,8 +4412,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
lucide-react@0.453.0:
resolution: {integrity: sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==}
lucide-react@0.454.0:
resolution: {integrity: sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
@ -4753,8 +4753,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanoid@5.0.7:
resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==}
nanoid@5.0.8:
resolution: {integrity: sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==}
engines: {node: ^18 || >=20}
hasBin: true
@ -6197,8 +6197,8 @@ packages:
typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
typescript-eslint@8.11.0:
resolution: {integrity: sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==}
typescript-eslint@8.12.1:
resolution: {integrity: sha512-SsKedZnq4TStkrpqnk+OqTnmkC9CkYBRNKjQ965CLpFruGcRkPF5UhKxbcbF6c/m2r6YAgKw/UtQxdlMjh3mug==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@ -6895,11 +6895,11 @@ snapshots:
'@colors/colors@1.5.0':
optional: true
'@commitlint/cli@19.5.0(@types/node@22.8.1)(typescript@5.6.3)':
'@commitlint/cli@19.5.0(@types/node@22.8.2)(typescript@5.6.3)':
dependencies:
'@commitlint/format': 19.5.0
'@commitlint/lint': 19.5.0
'@commitlint/load': 19.5.0(@types/node@22.8.1)(typescript@5.6.3)
'@commitlint/load': 19.5.0(@types/node@22.8.2)(typescript@5.6.3)
'@commitlint/read': 19.5.0
'@commitlint/types': 19.5.0
tinyexec: 0.3.0
@ -6946,7 +6946,7 @@ snapshots:
'@commitlint/rules': 19.5.0
'@commitlint/types': 19.5.0
'@commitlint/load@19.5.0(@types/node@22.8.1)(typescript@5.6.3)':
'@commitlint/load@19.5.0(@types/node@22.8.2)(typescript@5.6.3)':
dependencies:
'@commitlint/config-validator': 19.5.0
'@commitlint/execute-rule': 19.5.0
@ -6954,7 +6954,7 @@ snapshots:
'@commitlint/types': 19.5.0
chalk: 5.3.0
cosmiconfig: 9.0.0(typescript@5.6.3)
cosmiconfig-typescript-loader: 5.0.0(@types/node@22.8.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
cosmiconfig-typescript-loader: 5.0.0(@types/node@22.8.2)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
lodash.uniq: 4.5.0
@ -7097,13 +7097,13 @@ snapshots:
'@eslint-community/regexpp@4.11.1': {}
'@eslint-react/ast@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/ast@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
birecord: 0.1.1
string-ts: 2.2.0
ts-pattern: 5.5.0
@ -7112,18 +7112,18 @@ snapshots:
- supports-color
- typescript
'@eslint-react/core@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/core@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
birecord: 0.1.1
short-unique-id: 5.2.0
ts-pattern: 5.5.0
@ -7132,72 +7132,72 @@ snapshots:
- supports-color
- typescript
'@eslint-react/eslint-plugin@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/eslint-plugin@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
eslint-plugin-react-debug: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-dom: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-hooks-extra: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-naming-convention: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-web-api: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-x: 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-debug: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-dom: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-hooks-extra: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-naming-convention: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-web-api: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint-plugin-react-x: 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
'@eslint-react/jsx@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/jsx@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
ts-pattern: 5.5.0
transitivePeerDependencies:
- eslint
- supports-color
- typescript
'@eslint-react/shared@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/shared@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/tools': 1.15.1
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
picomatch: 4.0.2
transitivePeerDependencies:
- eslint
- supports-color
- typescript
'@eslint-react/tools@1.15.1': {}
'@eslint-react/tools@1.15.2': {}
'@eslint-react/types@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/types@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/tools': 1.15.1
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
transitivePeerDependencies:
- eslint
- supports-color
- typescript
'@eslint-react/var@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@eslint-react/var@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
ts-pattern: 5.5.0
transitivePeerDependencies:
- eslint
@ -7580,7 +7580,7 @@ snapshots:
'@grpc/grpc-js@1.9.15':
dependencies:
'@grpc/proto-loader': 0.7.13
'@types/node': 22.8.1
'@types/node': 22.8.2
'@grpc/proto-loader@0.7.13':
dependencies:
@ -7589,7 +7589,7 @@ snapshots:
protobufjs: 7.4.0
yargs: 17.7.2
'@hookform/resolvers@3.9.0(react-hook-form@7.53.1(react@18.3.1))':
'@hookform/resolvers@3.9.1(react-hook-form@7.53.1(react@18.3.1))':
dependencies:
react-hook-form: 7.53.1(react@18.3.1)
@ -8511,7 +8511,7 @@ snapshots:
'@rtco/peer': 0.2.17
bufferutil: 4.0.8
eventemitter3: 5.0.1
nanoid: 5.0.7
nanoid: 5.0.8
socket.io-client: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
utf-8-validate: 6.0.4
transitivePeerDependencies:
@ -8804,7 +8804,7 @@ snapshots:
'@types/conventional-commits-parser@5.0.0':
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
'@types/debug@4.1.12':
dependencies:
@ -8812,7 +8812,7 @@ snapshots:
'@types/dns-packet@5.6.5':
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
'@types/eslint-plugin-tailwindcss@3.17.0':
dependencies:
@ -8863,7 +8863,7 @@ snapshots:
'@types/murmurhash3js-revisited@3.0.3': {}
'@types/node@22.8.1':
'@types/node@22.8.2':
dependencies:
undici-types: 6.19.8
@ -8884,7 +8884,7 @@ snapshots:
'@types/readable-stream@4.0.15':
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
safe-buffer: 5.1.2
'@types/semver@7.5.8': {}
@ -8899,21 +8899,21 @@ snapshots:
'@types/ws@8.5.12':
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
optional: true
'@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@typescript-eslint/eslint-plugin@8.12.1(@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-community/regexpp': 4.11.1
'@typescript-eslint/parser': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.11.0
'@typescript-eslint/parser': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.12.1
eslint: 9.13.0(jiti@2.3.3)
graphemer: 1.4.0
ignore: 5.3.2
@ -8924,12 +8924,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.11.0
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.12.1
debug: 4.3.7
eslint: 9.13.0(jiti@2.3.3)
optionalDependencies:
@ -8937,15 +8937,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/scope-manager@8.11.0':
'@typescript-eslint/scope-manager@8.12.1':
dependencies:
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/visitor-keys': 8.11.0
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/visitor-keys': 8.12.1
'@typescript-eslint/type-utils@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@typescript-eslint/type-utils@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
debug: 4.3.7
ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
@ -8954,12 +8954,12 @@ snapshots:
- eslint
- supports-color
'@typescript-eslint/types@8.11.0': {}
'@typescript-eslint/types@8.12.1': {}
'@typescript-eslint/typescript-estree@8.11.0(typescript@5.6.3)':
'@typescript-eslint/typescript-estree@8.12.1(typescript@5.6.3)':
dependencies:
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/visitor-keys': 8.11.0
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/visitor-keys': 8.12.1
debug: 4.3.7
fast-glob: 3.3.2
is-glob: 4.0.3
@ -8971,32 +8971,32 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
'@typescript-eslint/utils@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3))
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
transitivePeerDependencies:
- supports-color
- typescript
'@typescript-eslint/visitor-keys@8.11.0':
'@typescript-eslint/visitor-keys@8.12.1':
dependencies:
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/types': 8.12.1
eslint-visitor-keys: 3.4.3
'@ungap/structured-clone@1.2.0': {}
'@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@22.8.1))':
'@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@22.8.2))':
dependencies:
'@babel/core': 7.25.2
'@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 5.4.10(@types/node@22.8.1)
vite: 5.4.10(@types/node@22.8.2)
transitivePeerDependencies:
- supports-color
@ -9524,7 +9524,7 @@ snapshots:
chrome-launcher@1.1.0:
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 2.0.1
@ -9716,9 +9716,9 @@ snapshots:
core-util-is@1.0.3: {}
cosmiconfig-typescript-loader@5.0.0(@types/node@22.8.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3):
cosmiconfig-typescript-loader@5.0.0(@types/node@22.8.2)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3):
dependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
cosmiconfig: 9.0.0(typescript@5.6.3)
jiti: 1.21.6
typescript: 5.6.3
@ -10153,19 +10153,19 @@ snapshots:
'@types/eslint': 9.6.1
eslint-config-prettier: 9.1.0(eslint@9.13.0(jiti@2.3.3))
eslint-plugin-react-debug@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
eslint-plugin-react-debug@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
string-ts: 2.2.0
ts-pattern: 5.5.0
@ -10174,18 +10174,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react-dom@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
eslint-plugin-react-dom@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
ts-pattern: 5.5.0
optionalDependencies:
@ -10193,19 +10193,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react-hooks-extra@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
eslint-plugin-react-hooks-extra@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
ts-pattern: 5.5.0
optionalDependencies:
@ -10213,18 +10213,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react-naming-convention@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
eslint-plugin-react-naming-convention@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
ts-pattern: 5.5.0
optionalDependencies:
@ -10232,18 +10232,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react-web-api@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
eslint-plugin-react-web-api@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
birecord: 0.1.1
eslint: 9.13.0(jiti@2.3.3)
ts-pattern: 5.5.0
@ -10252,19 +10252,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react-x@1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
eslint-plugin-react-x@1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@eslint-react/ast': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.1
'@eslint-react/types': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.11.0
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/ast': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/core': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/jsx': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/shared': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/tools': 1.15.2
'@eslint-react/types': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@eslint-react/var': 1.15.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.12.1
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/types': 8.12.1
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
is-immutable-type: 5.0.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
ts-pattern: 5.5.0
@ -11103,7 +11103,7 @@ snapshots:
is-immutable-type@5.0.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.3.3)
ts-api-utils: 1.3.0(typescript@5.6.3)
ts-declaration-location: 1.0.4(typescript@5.6.3)
@ -11604,7 +11604,7 @@ snapshots:
dependencies:
yallist: 3.1.1
lucide-react@0.453.0(react@18.3.1):
lucide-react@0.454.0(react@18.3.1):
dependencies:
react: 18.3.1
@ -12158,7 +12158,7 @@ snapshots:
nanoid@3.3.7: {}
nanoid@5.0.7: {}
nanoid@5.0.8: {}
napi-build-utils@1.0.2: {}
@ -12672,7 +12672,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 22.8.1
'@types/node': 22.8.2
long: 5.2.3
protons-runtime@5.5.0:
@ -13700,11 +13700,11 @@ snapshots:
typedarray@0.0.6: {}
typescript-eslint@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
typescript-eslint@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/parser': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/eslint-plugin': 8.12.1(@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/parser': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
@ -13947,12 +13947,12 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
vite-node@2.1.3(@types/node@22.8.1):
vite-node@2.1.3(@types/node@22.8.2):
dependencies:
cac: 6.7.14
debug: 4.3.7
pathe: 1.1.2
vite: 5.4.10(@types/node@22.8.1)
vite: 5.4.10(@types/node@22.8.2)
transitivePeerDependencies:
- '@types/node'
- less
@ -13964,24 +13964,24 @@ snapshots:
- supports-color
- terser
vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.1)):
vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.2)):
dependencies:
'@rollup/pluginutils': 5.1.0(rollup@4.21.3)
'@svgr/core': 8.1.0(typescript@5.6.3)
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))
vite: 5.4.10(@types/node@22.8.1)
vite: 5.4.10(@types/node@22.8.2)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
vite@5.4.10(@types/node@22.8.1):
vite@5.4.10(@types/node@22.8.2):
dependencies:
esbuild: 0.21.5
postcss: 8.4.47
rollup: 4.21.3
optionalDependencies:
'@types/node': 22.8.1
'@types/node': 22.8.2
fsevents: 2.3.3
watchpack@2.4.1:
@ -14166,7 +14166,7 @@ snapshots:
bufferutil: 4.0.8
utf-8-validate: 6.0.4
wxt@0.19.13(@types/node@22.8.1)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4):
wxt@0.19.13(@types/node@22.8.2)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4):
dependencies:
'@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.21.3)
'@types/chrome': 0.0.269
@ -14209,8 +14209,8 @@ snapshots:
publish-browser-extension: 2.2.2
scule: 1.3.0
unimport: 3.13.1(rollup@4.21.3)
vite: 5.4.10(@types/node@22.8.1)
vite-node: 2.1.3(@types/node@22.8.1)
vite: 5.4.10(@types/node@22.8.2)
vite-node: 2.1.3(@types/node@22.8.2)
web-ext-run: 0.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)
webextension-polyfill: 0.12.0
transitivePeerDependencies:

View file

@ -0,0 +1,34 @@
import { Button } from '@/components/ui/Button'
import { createElement } from '@/utils'
import { ImageIcon } from 'lucide-react'
export interface ImageButtonProps {
onSelect?: (file: File) => void
disabled?: boolean
}
const ImageButton = ({ onSelect, disabled }: ImageButtonProps) => {
const handleClick = () => {
const input = createElement<HTMLInputElement>(`<input type="file" accept="image/png,image/jpeg,image/webp" />`)
input.addEventListener(
'change',
async (e: Event) => {
onSelect?.((e.target as HTMLInputElement).files![0])
},
{ once: true }
)
input.click()
}
return (
<Button disabled={disabled} onClick={handleClick} variant="ghost" size="icon" className="dark:text-white">
<ImageIcon size={20} />
</Button>
)
}
ImageButton.displayName = 'ImageButton'
export default ImageButton

View file

@ -3,6 +3,7 @@ import { forwardRef, type ChangeEvent, CompositionEvent, type KeyboardEvent } fr
import { cn } from '@/utils'
import { Textarea } from '@/components/ui/Textarea'
import { ScrollArea } from '@/components/ui/ScrollArea'
import LoadingIcon from '@/assets/images/loading.svg'
export interface MessageInputProps {
value?: string
@ -11,6 +12,7 @@ export interface MessageInputProps {
preview?: boolean
autoFocus?: boolean
disabled?: boolean
loading?: boolean
onInput?: (e: ChangeEvent<HTMLTextAreaElement>) => void
onKeyDown?: (e: KeyboardEvent<HTMLTextAreaElement>) => void
onCompositionStart?: (e: CompositionEvent<HTMLTextAreaElement>) => void
@ -33,7 +35,8 @@ const MessageInput = forwardRef<HTMLTextAreaElement, MessageInputProps>(
onCompositionStart,
onCompositionEnd,
autoFocus,
disabled
disabled,
loading
},
ref
) => {
@ -45,7 +48,12 @@ const MessageInput = forwardRef<HTMLTextAreaElement, MessageInputProps>(
onKeyDown={onKeyDown}
autoFocus={autoFocus}
maxLength={maxLength}
className="box-border resize-none whitespace-pre-wrap break-words border-none bg-gray-50 pb-5 [field-sizing:content] [word-break:break-word] focus:ring-0 focus:ring-offset-0 dark:bg-slate-800"
className={cn(
'box-border resize-none whitespace-pre-wrap break-words border-none bg-slate-100 pb-5 [field-sizing:content] [word-break:break-word] focus:ring-0 focus:ring-offset-0 dark:bg-slate-800',
{
'disabled:opacity-100': loading
}
)}
rows={2}
value={value}
spellCheck={false}
@ -53,12 +61,21 @@ const MessageInput = forwardRef<HTMLTextAreaElement, MessageInputProps>(
onCompositionEnd={onCompositionEnd}
placeholder="Type your message here."
onInput={onInput}
disabled={disabled}
disabled={disabled || loading}
/>
</ScrollArea>
<div className="absolute bottom-1 right-3 rounded-lg text-xs text-slate-400 dark:text-slate-50">
<div
className={cn('absolute bottom-1 right-3 rounded-lg text-xs text-slate-400', {
'opacity-50': disabled || loading
})}
>
{value?.length ?? 0}/{maxLength}
</div>
{loading && (
<div className="absolute inset-0 flex items-center justify-center text-slate-800 after:absolute after:inset-0 after:backdrop-blur-xs dark:text-slate-100">
<LoadingIcon className="relative z-10 size-10"></LoadingIcon>
</div>
)}
</div>
)
}

View file

@ -111,7 +111,7 @@ const AppButton: FC<AppButtonProps> = ({ className }) => {
>
<div
className={cn(
'absolute grid grid-rows-[repeat(2,minmax(0,2.5rem))] w-full justify-center items-center transition-all duration-500',
'absolute grid grid-rows-[repeat(2,minmax(0,2.5rem))] w-full justify-center items-center transition-all duration-300',
isDarkMode ? 'top-0' : '-top-10',
isDarkMode ? 'bg-slate-950 text-white' : 'bg-white text-orange-400'
)}

View file

@ -15,10 +15,12 @@ import useTriggerAway from '@/hooks/useTriggerAway'
import { ScrollArea } from '@/components/ui/ScrollArea'
import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'
import UserInfoDomain from '@/domain/UserInfo'
import { cn, getRootNode, getTextSimilarity } from '@/utils'
import { blobToBase64, cn, compressImage, getRootNode, getTextSimilarity } from '@/utils'
import { Avatar, AvatarFallback } from '@/components/ui/Avatar'
import { AvatarImage } from '@radix-ui/react-avatar'
import ToastDomain from '@/domain/Toast'
import ImageButton from '../../components/ImageButton'
import { nanoid } from 'nanoid'
const Footer: FC = () => {
const send = useRemeshSend()
@ -40,6 +42,7 @@ const Footer: FC = () => {
const shareAutoCompleteListRef = useShareRef(setAutoCompleteListRef, autoCompleteListRef)
const isComposing = useRef(false)
const virtuosoRef = useRef<VirtuosoHandle>(null)
const [inputLoading, setInputLoading] = useState(false)
const shareRef = useShareRef(inputRef, setRef)
@ -47,6 +50,7 @@ const Footer: FC = () => {
* When inserting a username using the @ syntax, record the username's position information and the mapping relationship between the position information and userId to distinguish between users with the same name.
*/
const atUserRecord = useRef<Map<string, Set<[number, number]>>>(new Map())
const imageRecord = useRef<Map<string, string>>(new Map())
const updateAtUserAtRecord = useMemo(
() => (message: string, start: number, end: number, offset: number, atUserId?: string) => {
@ -102,11 +106,29 @@ const Footer: FC = () => {
const selectedUser = autoCompleteList.find((_, index) => index === selectedUserIndex)!
const handleSend = () => {
// Replace the hash URL in ![Image](hash:${hash}) with base64 and update the atUserRecord.
const transformMessage = async (message: string) => {
let newMessage = message
const matchList = [...message.matchAll(/!\[Image\]\(hash:([^\s)]+)\)/g)]
matchList?.forEach((match) => {
const base64 = imageRecord.current.get(match[1])
if (base64) {
const base64Syntax = `![Image](${base64})`
const hashSyntax = match[0]
const startIndex = match.index
const endIndex = startIndex + base64Syntax.length - hashSyntax.length
newMessage = newMessage.replace(hashSyntax, base64Syntax)
updateAtUserAtRecord(newMessage, startIndex, endIndex, 0)
}
})
return newMessage
}
const handleSend = async () => {
if (!`${message}`.trim()) {
return send(toastDomain.command.WarningCommand('Message cannot be empty.'))
}
const transformedMessage = await transformMessage(message)
const atUsers = [...atUserRecord.current]
.map(([userId, positions]) => {
const user = userList.find((user) => user.userId === userId)
@ -114,7 +136,7 @@ const Footer: FC = () => {
})
.filter(Boolean)
send(roomDomain.command.SendTextMessageCommand({ body: message, atUsers }))
send(roomDomain.command.SendTextMessageCommand({ body: transformedMessage, atUsers }))
send(messageInputDomain.command.ClearCommand())
}
@ -211,6 +233,33 @@ const Footer: FC = () => {
})
}
const handleInjectImage = async (file: File) => {
try {
setInputLoading(true)
const blob = await compressImage({ input: file, targetSize: 30 * 1024, outputType: 'image/webp' })
const base64 = await blobToBase64(blob)
const hash = nanoid()
const newMessage = `${message.slice(0, selectionEnd)}![Image](hash:${hash})${message.slice(selectionEnd)}`
const start = selectionStart
const end = selectionEnd + newMessage.length - message.length
updateAtUserAtRecord(newMessage, start, end, 0)
send(messageInputDomain.command.InputCommand(newMessage))
imageRecord.current.set(hash, base64)
requestIdleCallback(() => {
inputRef.current?.setSelectionRange(end, end)
inputRef.current?.focus()
})
} catch (error) {
send(toastDomain.command.ErrorCommand((error as Error).message))
} finally {
setInputLoading(false)
}
}
const handleInjectAtSyntax = (username: string) => {
const atIndex = message.lastIndexOf('@', selectionEnd - 1)
// Determine if there is a space before @
@ -285,11 +334,13 @@ const Footer: FC = () => {
ref={shareRef}
value={message}
onInput={handleInput}
loading={inputLoading}
onKeyDown={handleKeyDown}
maxLength={MESSAGE_MAX_LENGTH}
></MessageInput>
<div className="flex items-center">
<EmojiButton onSelect={handleInjectEmoji}></EmojiButton>
<ImageButton disabled={inputLoading} onSelect={handleInjectImage}></ImageButton>
<Button className="ml-auto" size="sm" onClick={handleSend}>
<span className="mr-2">Send</span>
<CornerDownLeftIcon className="text-slate-400" size={12}></CornerDownLeftIcon>

View file

@ -3,7 +3,7 @@ import { type ChangeEvent } from 'react'
import { ImagePlusIcon } from 'lucide-react'
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/Avatar'
import { Label } from '@/components/ui/Label'
import { cn, compressImage } from '@/utils'
import { blobToBase64, cn, compressImage } from '@/utils'
export interface AvatarSelectProps {
value?: string
@ -31,15 +31,10 @@ const AvatarSelect = React.forwardRef<HTMLInputElement, AvatarSelectProps>(
* In chrome storage.sync, each key-value pair supports a maximum storage of 8kb
* and all key-value pairs support a maximum storage of 100kb.
*/
const blob = await compressImage({ input: file, targetSize: compressSize })
const reader = new FileReader()
reader.onload = (e) => {
const base64 = e.target?.result as string
const blob = await compressImage({ input: file, targetSize: compressSize, outputType: 'image/webp' })
const base64 = await blobToBase64(blob)
onSuccess?.(base64)
onChange?.(base64)
}
reader.onerror = () => onError?.(new Error('Failed to read image file.'))
reader.readAsDataURL(blob)
} catch (error) {
onError?.(error as Error)
}
@ -63,7 +58,14 @@ const AvatarSelect = React.forwardRef<HTMLInputElement, AvatarSelectProps>(
<ImagePlusIcon size={30} className="text-slate-400 group-hover:text-slate-500" />
</AvatarFallback>
</Avatar>
<input ref={ref} hidden disabled={disabled} type="file" accept="image/png,image/jpeg" onChange={handleChange} />
<input
ref={ref}
hidden
disabled={disabled}
type="file"
accept="image/png,image/jpeg,image/webp"
onChange={handleChange}
/>
</Label>
)
}

View file

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
<radialGradient id="a4" cx=".66" fx=".66" cy=".3125" fy=".3125" gradientTransform="scale(1.5)">
<stop offset="0" stop-color="currentColor"></stop><stop offset=".3" stop-color="currentColor" stop-opacity=".9"></stop>
<stop offset=".6" stop-color="currentColor" stop-opacity=".6"></stop>
<stop offset=".8" stop-color="currentColor" stop-opacity=".3"></stop>
<stop offset="1" stop-color="currentColor" stop-opacity="0"></stop>
</radialGradient>
<circle transform-origin="center" fill="none" stroke="url(#a4)" stroke-width="15" stroke-linecap="round" stroke-dasharray="200 1000" stroke-dashoffset="0" cx="100" cy="100" r="70">
<animateTransform type="rotate" attributeName="transform" calcMode="spline" dur="2" values="360;0" keyTimes="0;1" keySplines="0 0 1 1" repeatCount="indefinite"></animateTransform>
</circle>
<circle transform-origin="center" fill="none" opacity=".2" stroke="currentColor" stroke-width="15" stroke-linecap="round" cx="100" cy="100" r="70"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

10
src/utils/blobToBase64.ts Normal file
View file

@ -0,0 +1,10 @@
const blobToBase64 = (blob: Blob) => {
return new Promise<string>((resolve, reject) => {
const reader = new FileReader()
reader.onload = (e) => resolve(e.target?.result as string)
reader.onerror = () => reject(new Error('Failed to read file.'))
reader.readAsDataURL(blob)
})
}
export default blobToBase64

View file

@ -60,7 +60,7 @@ const compress = async (
const compressImage = async (options: Options) => {
const { input, targetSize, toleranceSize = -1024 } = options
if (!['image/jpeg', 'image/png', 'image/webp'].includes(input.type)) {
throw new Error('Invalid input type, only support image/jpeg, image/png, image/webp')
throw new Error('Only PNG, JPEG and WebP image are supported.')
}
if (input.size <= targetSize) {

View file

@ -14,3 +14,4 @@ export { default as generateRandomName } from './generateRandomName'
export { default as getCursorPosition } from './getCursorPosition'
export { default as getTextSimilarity } from './getTextSimilarity'
export { default as getRootNode } from './getRootNode'
export { default as blobToBase64 } from './blobToBase64'