From 9898718b1a14605d140852faca74b8af12f9b2a2 Mon Sep 17 00:00:00 2001 From: molvqingtai Date: Sun, 13 Oct 2024 04:11:37 +0800 Subject: [PATCH] feat: support notification --- package.json | 8 +- pnpm-lock.yaml | 426 ++++++++++----------- src/app/background/index.ts | 28 +- src/app/content/index.tsx | 20 +- src/app/content/views/AppButton/index.tsx | 3 +- src/app/content/views/Setup/index.tsx | 3 +- src/app/options/components/ProfileForm.tsx | 42 +- src/constants/event.ts | 4 +- src/domain/Danmaku.ts | 21 +- src/domain/Notification.ts | 110 ++++++ src/domain/Room.ts | 54 +-- src/domain/Toast.ts | 20 +- src/domain/UserInfo.ts | 1 + src/domain/externs/Notification.ts | 18 + src/domain/impls/Notification.ts | 17 + src/messenger/index.ts | 11 + src/utils/asyncMap.ts | 9 + wxt.config.ts | 2 +- 18 files changed, 518 insertions(+), 279 deletions(-) create mode 100644 src/domain/Notification.ts create mode 100644 src/domain/externs/Notification.ts create mode 100644 src/domain/impls/Notification.ts create mode 100644 src/messenger/index.ts create mode 100644 src/utils/asyncMap.ts diff --git a/package.json b/package.json index 32c1fa6..37e3e0d 100644 --- a/package.json +++ b/package.json @@ -67,9 +67,9 @@ "clsx": "^2.1.1", "danmu": "^0.12.0", "date-fns": "^4.1.0", - "framer-motion": "^11.11.7", + "framer-motion": "^11.11.8", "idb-keyval": "^6.2.1", - "lucide-react": "^0.451.0", + "lucide-react": "^0.452.0", "nanoid": "^5.0.7", "next-themes": "^0.3.0", "react": "^18.3.1", @@ -94,7 +94,7 @@ "devDependencies": { "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", - "@eslint-react/eslint-plugin": "^1.14.3", + "@eslint-react/eslint-plugin": "^1.15.0", "@eslint/js": "^9.12.0", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", @@ -104,7 +104,7 @@ "@types/eslint-plugin-tailwindcss": "^3.17.0", "@types/node": "^22.7.5", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@typescript-eslint/parser": "^8.8.1", "@vitejs/plugin-react": "^4.3.2", "autoprefixer": "^10.4.20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9cd7d39..58a77f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,37 +19,37 @@ importers: version: 1.13.0 '@radix-ui/react-avatar': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-checkbox': specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.2 - version: 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.3.1) '@radix-ui/react-label': specifier: ^2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-radio-group': specifier: ^1.2.1 - version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.1.0 version: 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-switch': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@resreq/event-hub': specifier: ^1.6.0 version: 1.6.0 @@ -78,14 +78,14 @@ importers: specifier: ^4.1.0 version: 4.1.0 framer-motion: - specifier: ^11.11.7 - version: 11.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^11.11.8 + version: 11.11.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) idb-keyval: specifier: ^6.2.1 version: 6.2.1 lucide-react: - specifier: ^0.451.0 - version: 0.451.0(react@18.3.1) + specifier: ^0.452.0 + version: 0.452.0(react@18.3.1) nanoid: specifier: ^5.0.7 version: 5.0.7 @@ -154,8 +154,8 @@ importers: specifier: ^19.5.0 version: 19.5.0 '@eslint-react/eslint-plugin': - specifier: ^1.14.3 - version: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + specifier: ^1.15.0 + version: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@eslint/js': specifier: ^9.12.0 version: 9.12.0 @@ -184,8 +184,8 @@ importers: specifier: ^18.3.11 version: 18.3.11 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 + specifier: ^18.3.1 + version: 18.3.1 '@typescript-eslint/parser': specifier: ^8.8.1 version: 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) @@ -775,14 +775,14 @@ packages: resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.14.3': - resolution: {integrity: sha512-JU0619vNfl0RaqbsyyEfLJWKupJOmf5JmHt4sCAD6Y1LCW80Pi0ZbBXeCUTdCR36mA8IJxm9PoLFliQyDYj6uw==} + '@eslint-react/ast@1.15.0': + resolution: {integrity: sha512-7rOLLfGER82FQJy7pCFNs4j/47RYTEiPDfMFGAu4W7yerJrvU2rRNqjSwwm1Iq0DrrasBV8a3IVtPYQoDOqycg==} - '@eslint-react/core@1.14.3': - resolution: {integrity: sha512-1T/Zubn9PSwJHNN+4SnXXPb6ZjL1ILl9hN2pkPClh8IyBoCTM+u/BHTfxI3aVF5I8yWLNDaiG7nkaxmxoBEOfQ==} + '@eslint-react/core@1.15.0': + resolution: {integrity: sha512-T7KirkdempegOxQznW1xclZtv5hQRChgbeYqisPRENkNg90w3uY7ia5iPf6FEZntkja/NF00VUnUetIw4rO0og==} - '@eslint-react/eslint-plugin@1.14.3': - resolution: {integrity: sha512-U06zO3F56RAYXI0ZKTEpdwyWllV+muvi2gdC1SLARwk4AOmLAV8ke+iHW5EXBfNkCJQ3SgKRan4tpQqqwfEsMA==} + '@eslint-react/eslint-plugin@1.15.0': + resolution: {integrity: sha512-5cuu7gNBgwQwgDX1YJugL7ujay0NT27g3UN0qtJAON9WLBv/ESq+qLMxddGwPSljV/XGxhwbbys09Jgww/fy8A==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -791,20 +791,20 @@ packages: typescript: optional: true - '@eslint-react/jsx@1.14.3': - resolution: {integrity: sha512-LJqS63/S8koDJNIqKZ/yLuFvVk4RiK7K3emjUFx+UXHrIdKwFDMpFkksVVbxqeMX70E+toMXgMepABE0pA54ag==} + '@eslint-react/jsx@1.15.0': + resolution: {integrity: sha512-VZy8RWPx+2PUuBKaXPtu2qWnWN9SpkdgY3ohkZoGdoqkEYkYaXjvABNByQLwvk2+Ewqt0K+1f8r7QoQi47pQmw==} - '@eslint-react/shared@1.14.3': - resolution: {integrity: sha512-GP+mjNZBGXq2CuwyVTE2+74K3tBixxNeaG3ho3ovpQ7e8NlTD3TOZk5vZyOJaeRqaOJoJa54PURe12Qt6loCdw==} + '@eslint-react/shared@1.15.0': + resolution: {integrity: sha512-LRgcKKhNePEJzuwICe3rgUC5KVd4ZhlKys91gMxmUob3RCiUj4BjfAURJMqzwsPGF32WQeHkipw1hWNGpQNdlw==} - '@eslint-react/tools@1.14.3': - resolution: {integrity: sha512-NtewO4fWxzGtVCjAhD6NG4FwLev5Xq87KWpW92brPF+AvTzkr04abt3/14CpojJlW9L9SMK6FsX9tFVP7ZBqJQ==} + '@eslint-react/tools@1.15.0': + resolution: {integrity: sha512-zdd2K3EV2tWaCzNH60wD159HuX904kWzv+X87yqzZ0Nf2OBUDJ4a561NoDX3Pn8A3E6hFdu666zpIGdeaej9eg==} - '@eslint-react/types@1.14.3': - resolution: {integrity: sha512-Hi3rBCX0pAxoQs3MQYX/rt4Fxdz97U0pTjSQsm03dGUBb/BEVgrVK9SEZkCqpfPZ7NXrVhuiYudoJRUylNZyCw==} + '@eslint-react/types@1.15.0': + resolution: {integrity: sha512-bajL6xIUxZp36fezn5HEhQpL0eJM923hwfRj6cym2Xl0Jn2YgahSztHorsOpId71MYBgn9ERy9yXItcnrz0rsQ==} - '@eslint-react/var@1.14.3': - resolution: {integrity: sha512-APJJVSyrDrvJn3t4qXBg1XpWMxmW5AEym56a9/ILzLtgOWFsDj6gJCy4o2g5UB2AZqtfS6YS5IfU5B1G/wYtiw==} + '@eslint-react/var@1.15.0': + resolution: {integrity: sha512-/QycKnbgZRygM/lhHtUFQrvvrswdOyaXfVxwtIFVEYoPHP9q7NaUn0mrBu4VWkXQC9zPk1nWQeC3rZMUxzretg==} '@eslint/config-array@0.18.0': resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} @@ -2152,8 +2152,8 @@ packages: '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} '@types/react@18.3.11': resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} @@ -3285,8 +3285,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-debug@1.14.3: - resolution: {integrity: sha512-qEsGT5LGFtYR1Hs9nqfrCqgE8MxrTe5VA7LO7Old8epgHgpgOGIuSIdIKYu7dxlEFGAXFB3JLW7ieYJYcgobbQ==} + eslint-plugin-react-debug@1.15.0: + resolution: {integrity: sha512-zD5WOVPwKNnO4897gz2yjZZcvdGIObKEi4QURDammVEc3sCU0evHcAPEknTC1WEd7T8A4Zu7Vt7sDaUz/DALnA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3295,8 +3295,8 @@ packages: typescript: optional: true - eslint-plugin-react-dom@1.14.3: - resolution: {integrity: sha512-tVA7RQI6Jxomeqrckqi/y1gEmcdI29b268p7K8WjRUWNUDXbZR6vEyaLBqzI8+ykO1HsK8+QhOKUHgUKHjOZBQ==} + eslint-plugin-react-dom@1.15.0: + resolution: {integrity: sha512-P8IdPfiEpDR8SHZdnYJzfdSkV++0hHzOJQhLW9eACyuGCBuzLj2gglmPR5gH2RG44R+Iq5+hsUVNv7sklThvRg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3305,8 +3305,8 @@ packages: typescript: optional: true - eslint-plugin-react-hooks-extra@1.14.3: - resolution: {integrity: sha512-G6mFfYiKgKbGJOUlmvcsN+n0hNiRGa9pNenv4hSlbm3TJFmlrLG+cHvOa9xe88AvaLJHfF5obgF8X/zhSekIfA==} + eslint-plugin-react-hooks-extra@1.15.0: + resolution: {integrity: sha512-guIcax3c4Z/iWyDwZdo5b0qzqpJrhH4svYIfj+wEpfjRdIwpAvL0xM1uqJKdz8Hbgw1D+6dePSau4zmVkuaMqA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3315,8 +3315,8 @@ packages: typescript: optional: true - eslint-plugin-react-naming-convention@1.14.3: - resolution: {integrity: sha512-qj7XpwYQAKNCTloWA9vPNYDRMsiLa5H/jlF3mH17Is+j/pLH97NRG9CQXbh6kEdLbBFSsHwTDvyP22+CPVZhiA==} + eslint-plugin-react-naming-convention@1.15.0: + resolution: {integrity: sha512-XjbkBFEsaGvhDUKCxDCdJ34dsr/XnQu5a7hq6h2aNpnu05VGCAW6CXf3VuyI/sKfj3Em+aX/9eHdcRi12+dmLg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3325,8 +3325,8 @@ packages: typescript: optional: true - eslint-plugin-react-web-api@1.14.3: - resolution: {integrity: sha512-1G/WIUe+ZIPW8px1lmn7ib5fy6LcuwoHDsnq9G92iE8MFXYPA0Pry0ZKaB2lAsjP8rUROv1L9B457QjyCpro2g==} + eslint-plugin-react-web-api@1.15.0: + resolution: {integrity: sha512-LUwzKumBApdKzUgl+9F5/TyJbYGQIOy450s6kr3rLPrc9tk8GQrBmSQKmWh2g7C1x7DIoMNFXeUuAD1q/1AKnw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3335,8 +3335,8 @@ packages: typescript: optional: true - eslint-plugin-react-x@1.14.3: - resolution: {integrity: sha512-VKyF4v1kWp9P6vI7JDJfonmny0HOQiS5v/rMLyldK9UC8k+efJN7dUtLE2Kt7TfxggE5gf+v4rsDB2Opvt5Tvg==} + eslint-plugin-react-x@1.15.0: + resolution: {integrity: sha512-TIZVElFYVXvybmMBVzHPF2hmsaG7greytHd80efUPopxlr+JGjKba6zA3cJAURn+yzN1x2zPJzss2BkB8/48aQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3562,8 +3562,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@11.11.7: - resolution: {integrity: sha512-89CgILOXPeG3L7ymOTGrLmf8IiKubYLUN/QkYgQuLvehAHfqgwJbLfCnhuyRI4WTds1TXkUp67A7IJrgRY/j1w==} + framer-motion@11.11.8: + resolution: {integrity: sha512-mnGQNEoz99GtFXBBPw+Ag5K4FcfP5XrXxrxHz+iE4Lmg7W3sf2gKmGuvfkZCW/yIfcdv5vJd6KiSPETH1Pw68Q==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 @@ -4556,8 +4556,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.451.0: - resolution: {integrity: sha512-OwQ3uljZLp2cerj8sboy5rnhtGTCl9UCJIhT1J85/yOuGVlEH+xaUPR7tvNdddPvmV5M5VLdr7cQuWE3hzA4jw==} + lucide-react@0.452.0: + resolution: {integrity: sha512-kNefjOUOGm+Mu3KDiryONyPba9r+nhcrz5oJs3N6JDzGboQNEXw5GB3yB8rnV9/FA4bPyggNU6CRSihZm9MvSw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc @@ -7331,10 +7331,10 @@ snapshots: '@eslint-community/regexpp@4.11.1': {} - '@eslint-react/ast@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/ast@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) @@ -7346,14 +7346,14 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/core@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 @@ -7366,33 +7366,33 @@ snapshots: - supports-color - typescript - '@eslint-react/eslint-plugin@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/eslint-plugin@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) eslint: 9.12.0(jiti@2.3.3) - eslint-plugin-react-debug: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-dom: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-hooks-extra: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-naming-convention: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-web-api: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint-plugin-react-x: 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-debug: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-dom: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-hooks-extra: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-naming-convention: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-web-api: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + eslint-plugin-react-x: 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/jsx@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) @@ -7402,9 +7402,9 @@ snapshots: - supports-color - typescript - '@eslint-react/shared@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/shared@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.14.3 + '@eslint-react/tools': 1.15.0 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) picomatch: 4.0.2 transitivePeerDependencies: @@ -7412,11 +7412,11 @@ snapshots: - supports-color - typescript - '@eslint-react/tools@1.14.3': {} + '@eslint-react/tools@1.15.0': {} - '@eslint-react/types@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/types@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.14.3 + '@eslint-react/tools': 1.15.0 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) transitivePeerDependencies: @@ -7424,11 +7424,11 @@ snapshots: - supports-color - typescript - '@eslint-react/var@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@eslint-react/var@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) @@ -8322,34 +8322,34 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8357,19 +8357,19 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: @@ -8395,33 +8395,33 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: @@ -8429,33 +8429,33 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 '@radix-ui/react-icons@1.3.0(react@18.3.1)': dependencies: @@ -8468,31 +8468,31 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) aria-hidden: 1.2.4 @@ -8501,21 +8501,21 @@ snapshots: react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) aria-hidden: 1.2.4 @@ -8524,15 +8524,15 @@ snapshots: react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8542,19 +8542,19 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8562,26 +8562,26 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-radio-group@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-radio-group@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8589,41 +8589,41 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 - '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 '@radix-ui/react-slot@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: @@ -8632,12 +8632,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8645,7 +8645,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: @@ -9122,7 +9122,7 @@ snapshots: '@types/prop-types@15.7.13': {} - '@types/react-dom@18.3.0': + '@types/react-dom@18.3.1': dependencies: '@types/react': 18.3.11 @@ -10452,15 +10452,15 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 9.1.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-react-debug@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-debug@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 @@ -10473,15 +10473,15 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-dom@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) @@ -10492,15 +10492,15 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-hooks-extra@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 @@ -10512,14 +10512,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-naming-convention@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 @@ -10531,15 +10531,15 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-web-api@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) @@ -10551,15 +10551,15 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-plugin-react-x@1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/core': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/jsx': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/shared': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/tools': 1.14.3 - '@eslint-react/types': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@eslint-react/var': 1.14.3(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/types': 8.8.1 @@ -10876,7 +10876,7 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@11.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@11.11.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.7.0 optionalDependencies: @@ -11900,7 +11900,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.451.0(react@18.3.1): + lucide-react@0.452.0(react@18.3.1): dependencies: react: 18.3.1 diff --git a/src/app/background/index.ts b/src/app/background/index.ts index c665d54..7b54c76 100644 --- a/src/app/background/index.ts +++ b/src/app/background/index.ts @@ -1,17 +1,31 @@ import { EVENT } from '@/constants/event' +import { messenger } from '@/messenger' import { browser } from 'wxt/browser' import { defineBackground } from 'wxt/sandbox' export default defineBackground({ - // Set manifest options - persistent: true, type: 'module', - main() { - browser.runtime.onMessage.addListener(async (event: EVENT) => { - if (event === EVENT.OPTIONS_PAGE_OPEN) { - browser.runtime.openOptionsPage() - } + messenger.onMessage(EVENT.OPTIONS_PAGE_OPEN, () => { + browser.runtime.openOptionsPage() + }) + messenger.onMessage(EVENT.NOTIFICATION_PUSH, async ({ data: message, sender }) => { + // Check if there is an active tab on the same site + const tabs = await browser.tabs.query({ active: true }) + const hasActiveSomeSiteTab = tabs.some((tab) => { + return new URL(tab.url!).origin === new URL(sender.tab!.url!).origin + }) + + if (hasActiveSomeSiteTab) return + browser.notifications.create(message.id, { + type: 'basic', + iconUrl: message.userAvatar, + title: message.username, + message: message.body + }) + }) + messenger.onMessage(EVENT.NOTIFICATION_CLEAR, async ({ data: id }) => { + browser.notifications.clear(id) }) } }) diff --git a/src/app/content/index.tsx b/src/app/content/index.tsx index 67ac2a0..6070418 100644 --- a/src/app/content/index.tsx +++ b/src/app/content/index.tsx @@ -1,7 +1,7 @@ import React from 'react' import { createRoot } from 'react-dom/client' import { Remesh } from 'remesh' -import { RemeshRoot } from 'remesh-react' +import { RemeshRoot, RemeshScope } from 'remesh-react' import { RemeshLogger } from 'remesh-logger' import { defineContentScript } from 'wxt/sandbox' import { createShadowRootUi } from 'wxt/client' @@ -9,12 +9,14 @@ import { createShadowRootUi } from 'wxt/client' import App from './App' import { LocalStorageImpl, IndexDBStorageImpl, BrowserSyncStorageImpl } from '@/domain/impls/Storage' import { DanmakuImpl } from '@/domain/impls/Danmaku' +import { NotificationImpl } from '@/domain/impls/Notification' +import { ToastImpl } from '@/domain/impls/Toast' // import { PeerRoomImpl } from '@/domain/impls/PeerRoom' import { PeerRoomImpl } from '@/domain/impls/PeerRoom2' import '@/assets/styles/tailwind.css' import '@/assets/styles/sonner.css' import { createElement } from '@/utils' -import { ToastImpl } from '@/domain/impls/Toast' +import NotificationDomain from '@/domain/Notification' export default defineContentScript({ cssInjectionMode: 'ui', @@ -23,7 +25,15 @@ export default defineContentScript({ excludeMatches: ['*://localhost/*', '*://127.0.0.1/*', '*://*.csdn.net/*', '*://*.csdn.com/*'], async main(ctx) { const store = Remesh.store({ - externs: [LocalStorageImpl, IndexDBStorageImpl, BrowserSyncStorageImpl, PeerRoomImpl, ToastImpl, DanmakuImpl] + externs: [ + LocalStorageImpl, + IndexDBStorageImpl, + BrowserSyncStorageImpl, + PeerRoomImpl, + ToastImpl, + DanmakuImpl, + NotificationImpl + ] // inspectors: __DEV__ ? [RemeshLogger()] : [] }) @@ -42,7 +52,9 @@ export default defineContentScript({ root.render( - + + + ) diff --git a/src/app/content/views/AppButton/index.tsx b/src/app/content/views/AppButton/index.tsx index 7f8a820..14ed7bf 100644 --- a/src/app/content/views/AppButton/index.tsx +++ b/src/app/content/views/AppButton/index.tsx @@ -19,6 +19,7 @@ import LogoIcon5 from '@/assets/images/logo-5.svg' import LogoIcon6 from '@/assets/images/logo-6.svg' import AppStatusDomain from '@/domain/AppStatus' import { getDay } from 'date-fns' +import { messenger } from '@/messenger' const AppButton: FC = () => { const send = useRemeshSend() @@ -56,7 +57,7 @@ const AppButton: FC = () => { } const handleOpenOptionsPage = () => { - browser.runtime.sendMessage(EVENT.OPTIONS_PAGE_OPEN) + messenger.sendMessage(EVENT.OPTIONS_PAGE_OPEN, undefined) } const handleToggleApp = () => { diff --git a/src/app/content/views/Setup/index.tsx b/src/app/content/views/Setup/index.tsx index b6d01aa..dbe0107 100644 --- a/src/app/content/views/Setup/index.tsx +++ b/src/app/content/views/Setup/index.tsx @@ -42,7 +42,8 @@ const generateUserInfo = async (): Promise => { avatar: await generateRandomAvatar(MAX_AVATAR_SIZE), createTime: Date.now(), themeMode: checkSystemDarkMode() ? 'dark' : 'system', - danmakuEnabled: true + danmakuEnabled: true, + notificationEnabled: false } } diff --git a/src/app/options/components/ProfileForm.tsx b/src/app/options/components/ProfileForm.tsx index cf92a43..e166ed5 100644 --- a/src/app/options/components/ProfileForm.tsx +++ b/src/app/options/components/ProfileForm.tsx @@ -14,7 +14,7 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/RadioGroup' import { Label } from '@/components/ui/Label' import { RefreshCcwIcon } from 'lucide-react' import { MAX_AVATAR_SIZE } from '@/constants/config' -import ToastDomain from '@/domain/Toast' +import { ToastImpl } from '@/domain/impls/Toast' import BlurFade from '@/components/magicui/BlurFade' import { Checkbox } from '@/components/ui/checkbox' import Link from '@/components/Link' @@ -25,7 +25,8 @@ const defaultUserInfo: UserInfo = { avatar: '', createTime: Date.now(), themeMode: checkSystemDarkMode() ? 'dark' : 'system', - danmakuEnabled: true + danmakuEnabled: true, + notificationEnabled: false } const formSchema = v.object({ @@ -52,12 +53,13 @@ const formSchema = v.object({ v.string(), v.union([v.literal('system'), v.literal('light'), v.literal('dark')], 'Please select extension theme mode.') ), - danmakuEnabled: v.boolean() + danmakuEnabled: v.boolean(), + notificationEnabled: v.boolean() }) const ProfileForm = () => { const send = useRemeshSend() - const toastDomain = useRemeshDomain(ToastDomain()) + const toast = ToastImpl.value const userInfoDomain = useRemeshDomain(UserInfoDomain()) const userInfo = useRemeshQuery(userInfoDomain.query.UserInfoQuery()) @@ -74,15 +76,15 @@ const ProfileForm = () => { const handleSubmit = (userInfo: UserInfo) => { send(userInfoDomain.command.UpdateUserInfoCommand(userInfo)) - send(toastDomain.command.SuccessCommand('Saved successfully!')) + toast.success('Saved successfully!') } const handleWarning = (error: Error) => { - send(toastDomain.command.WarningCommand(error.message)) + toast.warning(error.message) } const handleError = (error: Error) => { - send(toastDomain.command.ErrorCommand(error.message)) + toast.error(error.message) } const handleRefreshAvatar = async () => { @@ -163,7 +165,7 @@ const ProfileForm = () => { - Enabling this will display messages scrolling on the website. + Enabling this option will display scrolling messages on the website. Wikipedia @@ -172,6 +174,30 @@ const ProfileForm = () => { )} /> + ( + + {/* Username */} + +
+ + + Enable Notification + +
+
+ Enabling this option will display desktop notifications for messages. + +
+ )} + /> { const danmaku = domain.getExtern(DanmakuExtern) const userInfoDomain = domain.getDomain(UserInfoDomain()) + const roomDomain = domain.getDomain(RoomDomain()) const MountState = domain.state({ name: 'Danmaku.MountState', @@ -117,6 +118,22 @@ const DanmakuDomain = Remesh.domain({ } }) + domain.effect({ + name: 'Danmaku.OnRoomMessageEffect', + impl: ({ fromEvent, get }) => { + const sendTextMessage$ = fromEvent(roomDomain.event.SendTextMessageEvent) + const onTextMessage$ = fromEvent(roomDomain.event.OnTextMessageEvent) + + const onMessage$ = merge(sendTextMessage$, onTextMessage$).pipe( + map((message) => { + const danmakuEnabled = get(IsEnabledQuery()) + return danmakuEnabled ? PushCommand(message) : null + }) + ) + return onMessage$ + } + }) + return { query: { IsMountedQuery, diff --git a/src/domain/Notification.ts b/src/domain/Notification.ts new file mode 100644 index 0000000..25c3704 --- /dev/null +++ b/src/domain/Notification.ts @@ -0,0 +1,110 @@ +import { Remesh } from 'remesh' +import { NotificationExtern } from './externs/Notification' +import RoomDomain, { TextMessage } from './Room' +import UserInfoDomain from './UserInfo' +import { map, merge } from 'rxjs' + +const NotificationDomain = Remesh.domain({ + name: 'NotificationDomain', + impl: (domain) => { + const notification = domain.getExtern(NotificationExtern) + const userInfoDomain = domain.getDomain(UserInfoDomain()) + const roomDomain = domain.getDomain(RoomDomain()) + + const NotificationEnabledState = domain.state({ + name: 'Notification.EnabledState', + default: false + }) + + const IsEnabledQuery = domain.query({ + name: 'Notification.IsOpenQuery', + impl: ({ get }) => { + return get(NotificationEnabledState()) + } + }) + + const EnableCommand = domain.command({ + name: 'Notification.EnableCommand', + impl: () => { + return NotificationEnabledState().new(true) + } + }) + + const DisableCommand = domain.command({ + name: 'Notification.DisableCommand', + impl: () => { + return NotificationEnabledState().new(false) + } + }) + + const PushCommand = domain.command({ + name: 'Notification.PushCommand', + impl: (_, message: TextMessage) => { + notification.push(message) + return [PushEvent(message)] + } + }) + + const ClearCommand = domain.command({ + name: 'Notification.ClearCommand', + impl: (_, id: string) => { + notification.clear(id) + return [ClearEvent(id)] + } + }) + + const PushEvent = domain.event({ + name: 'Notification.PushEvent' + }) + + const ClearEvent = domain.event({ + name: 'Notification.ClearEvent' + }) + + domain.effect({ + name: 'Notification.OnUserInfoEffect', + impl: ({ fromEvent }) => { + const onUserInfo$ = fromEvent(userInfoDomain.event.UpdateUserInfoEvent) + return onUserInfo$.pipe( + map((userInfo) => { + return userInfo?.notificationEnabled ? EnableCommand() : DisableCommand() + }) + ) + } + }) + + domain.effect({ + name: 'Notification.OnRoomMessageEffect', + impl: ({ fromEvent, get }) => { + const onTextMessage$ = fromEvent(roomDomain.event.OnTextMessageEvent) + + const onMessage$ = merge(onTextMessage$).pipe( + map((message) => { + const notificationEnabled = get(IsEnabledQuery()) + return notificationEnabled ? PushCommand(message) : null + }) + ) + + return onMessage$ + } + }) + + return { + query: { + IsEnabledQuery + }, + command: { + EnableCommand, + DisableCommand, + PushCommand, + ClearCommand + }, + event: { + PushEvent, + ClearEvent + } + } + } +}) + +export default NotificationDomain diff --git a/src/domain/Room.ts b/src/domain/Room.ts index 9e24b43..70e5670 100644 --- a/src/domain/Room.ts +++ b/src/domain/Room.ts @@ -7,8 +7,6 @@ import UserInfoDomain from '@/domain/UserInfo' import { desert, upsert } from '@/utils' import { nanoid } from 'nanoid' import StatusModule from '@/domain/modules/Status' -import { ToastExtern } from '@/domain/externs/Toast' -import DanmakuDomain from '@/domain/Danmaku' export { MessageType } @@ -51,9 +49,7 @@ const RoomDomain = Remesh.domain({ impl: (domain) => { const messageListDomain = domain.getDomain(MessageListDomain()) const userInfoDomain = domain.getDomain(UserInfoDomain()) - const danmakuDomain = domain.getDomain(DanmakuDomain()) const peerRoom = domain.getExtern(PeerRoomExtern) - const toast = domain.getExtern(ToastExtern) const PeerIdState = domain.state({ name: 'Room.PeerIdState', @@ -139,12 +135,7 @@ const RoomDomain = Remesh.domain({ const SendTextMessageCommand = domain.command({ name: 'Room.SendTextMessageCommand', impl: ({ get }, message: string) => { - const { - id: userId, - name: username, - avatar: userAvatar, - danmakuEnabled - } = get(userInfoDomain.query.UserInfoQuery())! + const { id: userId, name: username, avatar: userAvatar } = get(userInfoDomain.query.UserInfoQuery())! const textMessage: TextMessage = { id: nanoid(), @@ -164,11 +155,7 @@ const RoomDomain = Remesh.domain({ } peerRoom.sendMessage(textMessage) - return [ - messageListDomain.command.CreateItemCommand(listMessage), - danmakuEnabled ? PushDanmakuCommand(textMessage) : null, - SendTextMessageEvent(textMessage) - ] + return [messageListDomain.command.CreateItemCommand(listMessage), SendTextMessageEvent(textMessage)] } }) @@ -244,20 +231,6 @@ const RoomDomain = Remesh.domain({ } }) - const PushDanmakuCommand = domain.command({ - name: 'Room.PushDanmakuCommand', - impl: (_, message: TextMessage) => { - return [danmakuDomain.command.PushCommand(message)] - } - }) - - // const UnshiftDanmakuCommand = domain.command({ - // name: 'Room.PushDanmakuCommand', - // impl: (_, message: TextMessage) => { - // return [danmakuDomain.command.UnshiftCommand(message)] - // } - // }) - const SendJoinMessageEvent = domain.event({ name: 'Room.SendJoinMessageEvent' }) @@ -286,6 +259,10 @@ const RoomDomain = Remesh.domain({ name: 'Room.OnMessageEvent' }) + const OnTextMessageEvent = domain.event({ + name: 'Room.OnTextMessageEvent' + }) + const OnJoinRoomEvent = domain.event({ name: 'Room.OnJoinRoomEvent' }) @@ -294,6 +271,10 @@ const RoomDomain = Remesh.domain({ name: 'Room.OnLeaveRoomEvent' }) + const OnErrorEvent = domain.event({ + name: 'Room.OnErrorEvent' + }) + domain.effect({ name: 'Room.OnJoinRoomEffect', impl: () => { @@ -317,10 +298,11 @@ const RoomDomain = Remesh.domain({ const onMessage$ = fromEventPattern(peerRoom.onMessage).pipe( mergeMap((message) => { // console.log('onMessage', message) - const { danmakuEnabled } = get(userInfoDomain.query.UserInfoQuery())! const messageEvent$ = of(OnMessageEvent(message)) + const textMessageEvent$ = of(message.type === SendType.Text ? OnTextMessageEvent(message) : null) + const messageCommand$ = (() => { switch (message.type) { case SendType.Join: { @@ -355,8 +337,7 @@ const RoomDomain = Remesh.domain({ date: Date.now(), likeUsers: [], hateUsers: [] - }), - danmakuEnabled ? PushDanmakuCommand(message) : null + }) ) case SendType.Like: case SendType.Hate: { @@ -386,7 +367,7 @@ const RoomDomain = Remesh.domain({ } })() - return merge(messageEvent$, messageCommand$) + return merge(messageEvent$, textMessageEvent$, messageCommand$) }) ) return onMessage$ @@ -428,8 +409,7 @@ const RoomDomain = Remesh.domain({ const onRoomError$ = fromEventPattern(peerRoom.onError).pipe( map((error) => { console.error(error) - toast.error(error.message) - return null + return OnErrorEvent(error) }) ) return onRoomError$ @@ -471,8 +451,10 @@ const RoomDomain = Remesh.domain({ JoinRoomEvent, LeaveRoomEvent, OnMessageEvent, + OnTextMessageEvent, OnJoinRoomEvent, - OnLeaveRoomEvent + OnLeaveRoomEvent, + OnErrorEvent } } } diff --git a/src/domain/Toast.ts b/src/domain/Toast.ts index 183a6e2..47a0232 100644 --- a/src/domain/Toast.ts +++ b/src/domain/Toast.ts @@ -1,10 +1,28 @@ import { Remesh } from 'remesh' import ToastModule from './modules/Toast' +import RoomDomain from './Room' +import { map, merge } from 'rxjs' const ToastDomain = Remesh.domain({ name: 'ToastDomain', impl: (domain) => { - return ToastModule(domain) + const roomDomain = domain.getDomain(RoomDomain()) + const toastModule = ToastModule(domain) + domain.effect({ + name: 'Toast.OnRoomErrorEffect', + impl: ({ fromEvent }) => { + const onRoomError$ = fromEvent(roomDomain.event.OnErrorEvent) + + const onError$ = merge(onRoomError$).pipe( + map((error) => { + return toastModule.command.ErrorCommand(error.message) + }) + ) + + return onError$ + } + }) + return toastModule } }) diff --git a/src/domain/UserInfo.ts b/src/domain/UserInfo.ts index b215ede..10ed78a 100644 --- a/src/domain/UserInfo.ts +++ b/src/domain/UserInfo.ts @@ -11,6 +11,7 @@ export interface UserInfo { createTime: number themeMode: 'system' | 'light' | 'dark' danmakuEnabled: boolean + notificationEnabled: boolean } const UserInfoDomain = Remesh.domain({ diff --git a/src/domain/externs/Notification.ts b/src/domain/externs/Notification.ts new file mode 100644 index 0000000..cf534e4 --- /dev/null +++ b/src/domain/externs/Notification.ts @@ -0,0 +1,18 @@ +import { Remesh } from 'remesh' +import { TextMessage } from '../Room' + +export interface Notification { + push: (message: TextMessage) => Promise + clear: (id: string) => Promise +} + +export const NotificationExtern = Remesh.extern({ + default: { + push: () => { + throw new Error('"push" not implemented.') + }, + clear: () => { + throw new Error('"clear" not implemented.') + } + } +}) diff --git a/src/domain/impls/Notification.ts b/src/domain/impls/Notification.ts new file mode 100644 index 0000000..38a66e7 --- /dev/null +++ b/src/domain/impls/Notification.ts @@ -0,0 +1,17 @@ +import { NotificationExtern } from '@/domain/externs/Notification' +import { TextMessage } from '../Room' +import { EVENT } from '@/constants/event' +import { messenger } from '@/messenger' + +class Notification { + async push(message: TextMessage) { + await messenger.sendMessage(EVENT.NOTIFICATION_PUSH, message) + return message.id + } + async clear(id: string) { + await messenger.sendMessage(EVENT.NOTIFICATION_CLEAR, id) + return true + } +} + +export const NotificationImpl = NotificationExtern.impl(new Notification()) diff --git a/src/messenger/index.ts b/src/messenger/index.ts new file mode 100644 index 0000000..f38047b --- /dev/null +++ b/src/messenger/index.ts @@ -0,0 +1,11 @@ +import { EVENT } from '@/constants/event' +import { defineExtensionMessaging } from '@webext-core/messaging' +import { TextMessage } from '@/domain/Room' + +interface ProtocolMap { + [EVENT.OPTIONS_PAGE_OPEN]: () => void + [EVENT.NOTIFICATION_PUSH]: (message: TextMessage) => void + [EVENT.NOTIFICATION_CLEAR]: (id: string) => void +} + +export const messenger = defineExtensionMessaging() diff --git a/src/utils/asyncMap.ts b/src/utils/asyncMap.ts new file mode 100644 index 0000000..e66ae5f --- /dev/null +++ b/src/utils/asyncMap.ts @@ -0,0 +1,9 @@ +const asyncMap = async (list: T[], run: (arg: T, index: number, list: T[]) => Promise) => { + const task: U[] = [] + for (let index = 0; index < list.length; index++) { + task.push(await run(list[index], index, list)) + } + return task +} + +export default asyncMap diff --git a/wxt.config.ts b/wxt.config.ts index 5e6b05e..64db5ad 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ manifest: ({ browser }) => { const common = { name: displayName, - permissions: ['storage'], + permissions: ['storage', 'notifications'], homepage_url: homepage, icons: { '16': 'logo.png',