diff --git a/.eslintrc.cjs b/.eslintrc.cjs index be02b0d02..b383d8a61 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -66,7 +66,6 @@ module.exports = { { blankLine: 'any', prev: 'import', next: 'import' }, { blankLine: 'always', prev: 'block-like', next: '*' }, { blankLine: 'always', prev: 'block', next: '*' }, - ], }, ignorePatterns: ['src/**/*.test.ts', '**/__tests__/**/*.json', 'package.json', '__mocks__/*.ts'], diff --git a/.github/workflows/web_coverage.yaml b/.github/workflows/web_coverage.yaml index bee3ecc23..e49bb679a 100644 --- a/.github/workflows/web_coverage.yaml +++ b/.github/workflows/web_coverage.yaml @@ -44,7 +44,7 @@ jobs: with: component: true build: pnpm run build - start: pnpm run start + # start: pnpm run start browser: chrome env: COVERAGE: "true" @@ -58,7 +58,7 @@ jobs: - name: Upload coverage to Codecov uses: codecov/codecov-action@v2 with: - token: ${{ secrets.WEB_CODE_COV }} + token: cf9245e0-e136-4e21-b0ee-35755fa0c493 files: coverage/jest/lcov.info, coverage/cypress/lcov.info flags: appflowy_web name: codecov-umbrella diff --git a/package.json b/package.json index cd7975d74..e96c5dbe7 100644 --- a/package.json +++ b/package.json @@ -214,4 +214,4 @@ "engines": { "pnpm": "^8.0.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18ae10573..2fb02e62b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -967,7 +967,7 @@ packages: '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.3.7 + debug: 4.4.1 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -2342,7 +2342,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - debug: 4.3.7 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2359,7 +2359,7 @@ packages: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.7 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3055,7 +3055,7 @@ packages: '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.3.7 + debug: 4.4.1 kolorist: 1.8.0 local-pkg: 0.5.1 mlly: 1.7.3 @@ -6339,7 +6339,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.7 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true @@ -6512,8 +6512,16 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bind: 1.0.8 + is-array-buffer: 3.0.5 + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 dev: true /array-includes@3.1.8: @@ -6567,14 +6575,27 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + is-shared-array-buffer: 1.0.4 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 dev: true /asn1@0.2.6: @@ -6591,6 +6612,11 @@ packages: engines: {node: '>=8'} dev: true + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + /async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} dependencies: @@ -6947,6 +6973,13 @@ packages: write-file-atomic: 3.0.3 dev: true + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -6956,6 +6989,24 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 + dev: true + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.0 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -7938,29 +7989,56 @@ packages: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.1 dev: true + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.1 dev: true + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.1 dev: true + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /date-arithmetic@4.1.0: resolution: {integrity: sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==} dev: false @@ -8005,8 +8083,8 @@ packages: ms: 2.1.2 supports-color: 8.1.1 - /debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + /debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -8293,6 +8371,14 @@ packages: engines: {node: '>=12'} dev: true + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + /duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: @@ -8388,13 +8474,13 @@ packages: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 data-view-buffer: 1.0.1 data-view-byte-length: 1.0.1 data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 @@ -8433,12 +8519,73 @@ packages: which-typed-array: 1.1.15 dev: true + /es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + dev: true + /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -8458,11 +8605,27 @@ packages: es-errors: 1.3.0 dev: true + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 dev: true @@ -8482,6 +8645,15 @@ packages: is-symbol: 1.0.4 dev: true + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + /es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} dev: true @@ -8999,6 +9171,13 @@ packages: is-callable: 1.2.7 dev: true + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -9107,10 +9286,22 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + functions-have-names: 1.2.3 + dev: true + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 dev: true /functions-have-names@1.2.3: @@ -9134,6 +9325,21 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + /get-node-dimensions@1.2.1: resolution: {integrity: sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ==} dev: false @@ -9163,6 +9369,13 @@ packages: through: 2.3.8 dev: false + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + /get-stdin@5.0.1: resolution: {integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==} engines: {node: '>=0.12.0'} @@ -9190,9 +9403,18 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + dev: true + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 dev: true /getos@3.2.1: @@ -9272,6 +9494,14 @@ packages: define-properties: 1.2.1 dev: true + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -9303,7 +9533,11 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -9370,10 +9604,21 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -9604,7 +9849,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true @@ -9632,7 +9877,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true @@ -9737,6 +9982,15 @@ packages: side-channel: 1.0.6 dev: true + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + /internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} dev: false @@ -9760,7 +10014,7 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 dev: false @@ -9768,19 +10022,46 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + dev: true + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 dev: true /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.0.2 + dev: true + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -9791,7 +10072,15 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + has-tostringtag: 1.0.2 + dev: true + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 dev: true @@ -9820,6 +10109,13 @@ packages: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.2 + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 /is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} @@ -9828,12 +10124,29 @@ packages: is-typed-array: 1.1.13 dev: true + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + /is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} dev: true @@ -9848,6 +10161,13 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -9856,6 +10176,16 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -9879,6 +10209,11 @@ packages: is-path-inside: 3.0.3 dev: true + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -9891,6 +10226,14 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -9925,14 +10268,36 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 dev: true /is-stream@1.1.0: @@ -9951,11 +10316,28 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 dev: true /is-typed-array@1.1.13: @@ -9965,6 +10347,13 @@ packages: which-typed-array: 1.1.15 dev: true + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + dev: true + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -9973,10 +10362,30 @@ packages: engines: {node: '>=10'} dev: true + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 dev: true /is-windows@1.0.2: @@ -10057,7 +10466,7 @@ packages: '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -10085,7 +10494,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -10486,7 +10895,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -10982,6 +11391,7 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true /lucide-react@0.468.0(react@18.2.0): resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==} @@ -11041,7 +11451,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.0 + semver: 7.7.2 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -11066,6 +11476,10 @@ packages: resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} dev: false + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + /mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} dependencies: @@ -11481,7 +11895,7 @@ packages: resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.1 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.2 @@ -11809,11 +12223,16 @@ packages: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + /object-is@1.1.6: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 dev: false @@ -11825,12 +12244,24 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + /object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} @@ -11913,6 +12344,15 @@ packages: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} dev: true + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -12592,7 +13032,7 @@ packages: resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 dev: true /qs@6.5.3: @@ -13311,6 +13751,20 @@ packages: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} dev: false + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -13339,11 +13793,23 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -13470,7 +13936,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -13589,12 +14055,23 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 has-symbols: 1.0.3 isarray: 2.0.5 dev: true + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -13602,15 +14079,32 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-regex: 1.1.4 dev: true + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + /safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} @@ -13696,6 +14190,12 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true /sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -13735,6 +14235,15 @@ packages: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -13768,14 +14277,54 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 dev: true /signal-exit@3.0.7: @@ -14029,14 +14578,27 @@ packages: side-channel: 1.0.6 dev: true + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + /string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 dev: true /string.prototype.trimend@1.0.8: @@ -14047,13 +14609,23 @@ packages: es-object-atoms: 1.0.0 dev: true + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + /string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 dev: true /string_decoder@1.1.1: @@ -14672,20 +15244,40 @@ packages: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-typed-array: 1.1.13 dev: true + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + /typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 dev: true /typed-array-byte-offset@1.0.2: @@ -14693,18 +15285,31 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 dev: true /typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 @@ -14712,6 +15317,18 @@ packages: possible-typed-array-names: 1.0.0 dev: true + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + dev: true + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: @@ -14734,12 +15351,22 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 dev: true + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-bigints: 1.0.2 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + /uncontrollable@7.2.1(react@18.2.0): resolution: {integrity: sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==} peerDependencies: @@ -15326,10 +15953,50 @@ packages: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 - is-string: 1.0.7 + is-string: 1.1.1 is-symbol: 1.0.4 dev: true + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: true @@ -15339,12 +16006,25 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 dev: true + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -15468,6 +16148,7 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} diff --git a/src/@types/translations/en.json b/src/@types/translations/en.json index 0903aa25a..b13d03d52 100644 --- a/src/@types/translations/en.json +++ b/src/@types/translations/en.json @@ -298,7 +298,17 @@ "highlight": "Highlight", "color": "Color", "addLink": "Add Link", - "link": "Link" + "link": "Link", + "h1": "Heading 1", + "h2": "Heading 2", + "h3": "Heading 3", + "alignLeft": "Align left", + "alignRight": "Align right", + "alignCenter": "Align center", + "moreOptions": "More options", + "font": "Font", + "suggestions": "Suggestions", + "turnInto": "Turn into" }, "tooltip": { "lightMode": "Switch to Light mode", @@ -3120,4 +3130,4 @@ "joining": "Joining...", "hasJoined": "You’ve joined to\n{{workspaceName}}" } -} +} \ No newline at end of file diff --git a/src/@types/translations/es-VE.json b/src/@types/translations/es-VE.json index 375f42cce..c40169ce3 100644 --- a/src/@types/translations/es-VE.json +++ b/src/@types/translations/es-VE.json @@ -223,7 +223,17 @@ "highlight": "Resaltado", "color": "Color", "addLink": "Añadir enlace", - "link": "Enlace" + "link": "Enlace", + "h1": "Encabezado 1", + "h2": "Encabezado 2", + "h3": "Encabezado 3", + "alignLeft": "Alinear a la izquierda", + "alignRight": "Alinear a la derecha", + "alignCenter": "Alinear al centro", + "moreOptions": "Más opciones", + "font": "Fuente", + "suggestions": "Sugerencias", + "turnInto": "Convertir en" }, "tooltip": { "lightMode": "Cambiar a modo Claro", @@ -1547,4 +1557,4 @@ "betaTooltip": "Actualmente solo admitimos la búsqueda de páginas.", "fromTrashHint": "De la papelera" } -} +} \ No newline at end of file diff --git a/src/@types/translations/eu-ES.json b/src/@types/translations/eu-ES.json index be987e7a5..fe153883c 100644 --- a/src/@types/translations/eu-ES.json +++ b/src/@types/translations/eu-ES.json @@ -600,4 +600,4 @@ "deleteContentTitle": "Ziur {pageType} ezabatu nahi duzula?", "deleteContentCaption": "{pageType} hau ezabatzen baduzu, zaborrontzitik leheneratu dezakezu." } -} +} \ No newline at end of file diff --git a/src/@types/translations/fr-CA.json b/src/@types/translations/fr-CA.json index 405427c6b..3e9e8751e 100644 --- a/src/@types/translations/fr-CA.json +++ b/src/@types/translations/fr-CA.json @@ -171,7 +171,17 @@ "highlight": "Surligner", "color": "Couleur", "addLink": "Ajouter un lien", - "link": "Lien" + "link": "Lien", + "h1": "Titre 1", + "h2": "Titre 2", + "h3": "Titre 3", + "alignLeft": "Aligner à gauche", + "alignRight": "Aligner à droite", + "alignCenter": "Aligner le centre", + "moreOptions": "Plus d'options", + "font": "Police", + "suggestions": "Suggestions", + "turnInto": "Devenir" }, "tooltip": { "lightMode": "Passer en mode clair", @@ -1256,4 +1266,4 @@ "userIcon": "Icône utilisateur" }, "noLogFiles": "Il n'y a pas de log" -} +} \ No newline at end of file diff --git a/src/@types/translations/fr-FR.json b/src/@types/translations/fr-FR.json index 169d87119..30597d0dd 100644 --- a/src/@types/translations/fr-FR.json +++ b/src/@types/translations/fr-FR.json @@ -292,7 +292,17 @@ "highlight": "Surligner", "color": "Couleur", "addLink": "Ajouter un lien", - "link": "Lien" + "link": "Lien", + "h1": "Titre 1", + "h2": "Titre 2", + "h3": "Titre 3", + "alignLeft": "Aligner à gauche", + "alignRight": "Aligner à droite", + "alignCenter": "Aligner le centre", + "moreOptions": "Plus d'options", + "font": "Police", + "suggestions": "Suggestions", + "turnInto": "Devenir" }, "tooltip": { "lightMode": "Passer en mode clair", @@ -2945,4 +2955,4 @@ "permissionDenied": "Aucune autorisation d'ouvrir ce fichier", "unknownError": "Échec de l'ouverture du fichier" } -} +} \ No newline at end of file diff --git a/src/@types/translations/ja-JP.json b/src/@types/translations/ja-JP.json index 3491ea9cf..1afb7c9ed 100644 --- a/src/@types/translations/ja-JP.json +++ b/src/@types/translations/ja-JP.json @@ -252,7 +252,17 @@ "highlight": "ハイライト", "color": "カラー", "addLink": "リンクを追加", - "link": "リンク" + "link": "リンク", + "h1": "見出し1", + "h2": "見出し2", + "h3": "見出し3", + "alignLeft": "テキストを左揃え", + "alignCenter": "テキストを中央揃え", + "alignRight": "テキストを右揃え", + "moreOptions": "More options", + "font": "フォント", + "suggestions": "提案", + "turnInto": "変換" }, "tooltip": { "lightMode": "ライトモードに切り替える", @@ -2546,4 +2556,4 @@ "zoomIn": "ズームイン", "zoomOut": "ズームアウト" } -} +} \ No newline at end of file diff --git a/src/@types/translations/ko-KR.json b/src/@types/translations/ko-KR.json index 1e161022b..3685a3ca6 100644 --- a/src/@types/translations/ko-KR.json +++ b/src/@types/translations/ko-KR.json @@ -297,7 +297,18 @@ "highlight": "강조", "color": "색상", "addLink": "링크 추가", - "link": "링크" + "link": "링크", + "h1": "헤딩 1", + "h2": "헤딩 2", + "h3": "헤딩 3", + "alignLeft": "왼쪽 정렬", + "alignRight": "오른쪽 정렬", + "alignCenter": "가운데 정렬", + "textAlign": "텍스트 정렬", + "moreOptions": "더 많은 옵션", + "font": "글꼴", + "suggestions": "제안", + "turnInto": "변환" }, "tooltip": { "lightMode": "라이트 모드로 전환", @@ -3072,4 +3083,4 @@ "embedVideoLinkPlaceholder": "여기에 비디오 링크를 붙여넣으세요.", "videoSupported": "지원되는 서비스: YouTube, Vimeo 등.", "copiedVideoLink": "비디오 원본 링크가 클립보드에 복사되었습니다" -} +} \ No newline at end of file diff --git a/src/@types/translations/zh-CN.json b/src/@types/translations/zh-CN.json index 29ba0e50c..e44d119b1 100644 --- a/src/@types/translations/zh-CN.json +++ b/src/@types/translations/zh-CN.json @@ -277,7 +277,17 @@ "highlight": "高亮", "color": "颜色", "addLink": "添加链接", - "link": "关联" + "link": "关联", + "h1": "一级标题", + "h2": "二级标题", + "h3": "三级标题", + "alignLeft": "文本居左对齐", + "alignCenter": "文本居中对齐", + "alignRight": "文本居右对齐", + "moreOptions": "更多选项", + "font": "字体", + "suggestions": "建议", + "turnInto": "变成" }, "tooltip": { "lightMode": "切换到亮色模式", @@ -1889,4 +1899,4 @@ "yesterday": "昨天", "today": "今天" } -} +} \ No newline at end of file diff --git a/src/@types/translations/zh-TW.json b/src/@types/translations/zh-TW.json index 13aeb1225..c9cf467a7 100644 --- a/src/@types/translations/zh-TW.json +++ b/src/@types/translations/zh-TW.json @@ -248,7 +248,17 @@ "highlight": "醒目提示", "color": "顏色", "addLink": "新增連結", - "link": "連結" + "link": "連結", + "h1": "標題 1", + "h2": "標題 2", + "h3": "標題 3", + "alignLeft": "左對齊", + "alignRight": "右對齊", + "alignCenter": "中對齊", + "moreOptions": "更多選項", + "font": "字型", + "suggestions": "建議", + "turnInto": "變成" }, "tooltip": { "lightMode": "切換至亮色模式", @@ -1545,4 +1555,4 @@ "betaLabel": "BETA", "betaTooltip": "目前我們只支援搜尋頁面" } -} +} \ No newline at end of file diff --git a/src/assets/icons/text_color.svg b/src/assets/icons/text_color.svg index 123da8c04..eeac9edc6 100644 --- a/src/assets/icons/text_color.svg +++ b/src/assets/icons/text_color.svg @@ -1,4 +1,4 @@ - + diff --git a/src/assets/icons/text_highlight.svg b/src/assets/icons/text_highlight.svg index 2c2cb2ca8..f2056c2fe 100644 --- a/src/assets/icons/text_highlight.svg +++ b/src/assets/icons/text_highlight.svg @@ -1,4 +1,4 @@ - + diff --git a/src/components/_shared/popover/Popover.tsx b/src/components/_shared/popover/Popover.tsx index bc14c2d43..10908ec27 100644 --- a/src/components/_shared/popover/Popover.tsx +++ b/src/components/_shared/popover/Popover.tsx @@ -1,6 +1,6 @@ import { PopoverOrigin } from '@mui/material/Popover/Popover'; import isEqual from 'lodash-es/isEqual'; -import React, { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { Popover as PopoverComponent, PopoverProps as PopoverComponentProps } from '@mui/material'; const defaultProps: Partial = { @@ -33,7 +33,7 @@ const DEFAULT_ORIGINS: Origins = { }, }; -export function calculateOptimalOrigins ( +export function calculateOptimalOrigins( position: Position, popoverWidth: number, popoverHeight: number, @@ -103,7 +103,7 @@ export function calculateOptimalOrigins ( }; } -export function Popover ({ +export function Popover({ children, transformOrigin = DEFAULT_ORIGINS.transformOrigin, anchorOrigin = DEFAULT_ORIGINS.anchorOrigin, diff --git a/src/components/editor/components/blocks/heading/Heading.tsx b/src/components/editor/components/blocks/heading/Heading.tsx index 2fe32308b..4001504d4 100644 --- a/src/components/editor/components/blocks/heading/Heading.tsx +++ b/src/components/editor/components/blocks/heading/Heading.tsx @@ -1,6 +1,6 @@ import { HEADER_HEIGHT } from '@/application/constants'; import { EditorElementProps, HeadingNode } from '@/components/editor/editor.type'; -import React, { forwardRef, memo } from 'react'; +import { forwardRef, memo } from 'react'; export const Heading = memo( forwardRef>(({ node, children, ...attributes }, ref) => { diff --git a/src/components/editor/components/leaf/href/HrefPopover.tsx b/src/components/editor/components/leaf/href/HrefPopover.tsx index 6e51dbd10..dbf7666cb 100644 --- a/src/components/editor/components/leaf/href/HrefPopover.tsx +++ b/src/components/editor/components/leaf/href/HrefPopover.tsx @@ -1,16 +1,17 @@ -import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { Button, Divider, OutlinedInput, PopoverPosition } from '@mui/material'; +import { PopoverOrigin } from '@mui/material/Popover/Popover'; +import { debounce } from 'lodash-es'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { ReactEditor, useSlateStatic } from 'slate-react'; + +import { YjsEditor } from '@/application/slate-yjs'; import { CustomEditor } from '@/application/slate-yjs/command'; import { EditorMarkFormat } from '@/application/slate-yjs/types'; import { ReactComponent as DeleteIcon } from '@/assets/icons/delete.svg'; import { Popover } from '@/components/_shared/popover'; -import { ReactEditor, useSlateStatic } from 'slate-react'; -import { useTranslation } from 'react-i18next'; import { getRangeRect } from '@/components/editor/components/toolbar/selection-toolbar/utils'; -import { YjsEditor } from '@/application/slate-yjs'; import { createHotkey, HOT_KEY_NAME } from '@/utils/hotkeys'; -import { debounce } from 'lodash-es'; -import { PopoverOrigin } from '@mui/material/Popover/Popover'; import { processUrl } from '@/utils/url'; const defaultOrigin: PopoverOrigin = { @@ -31,9 +32,9 @@ function HrefPopover({ }: HrefPopoverProps) { const editor = useSlateStatic() as YjsEditor; const { t } = useTranslation(); - const [isActivated, setIsActivated] = React.useState(CustomEditor.isMarkActive(editor, EditorMarkFormat.Href)); - const [popoverType, setPopoverType] = React.useState<'add' | 'update' | undefined>(undefined); - const [anchorPosition, setAnchorPosition] = React.useState(undefined); + const [isActivated, setIsActivated] = useState(CustomEditor.isMarkActive(editor, EditorMarkFormat.Href)); + const [popoverType, setPopoverType] = useState<'add' | 'update' | undefined>(undefined); + const [anchorPosition, setAnchorPosition] = useState(undefined); useEffect(() => { if (isActivated) { @@ -125,7 +126,7 @@ function HrefPopover({ const urlRef = useRef(null); const textRef = useRef(null); const buttonRef = useRef(null); - const [urlValid, setUrlValid] = React.useState(true); + const [urlValid, setUrlValid] = useState(true); const addLink = useMemo(() => { if (!open || popoverType !== 'add') return null; return ( @@ -152,7 +153,7 @@ function HrefPopover({ setUrlValid(true); }} - size={'small'} fullWidth={true} placeholder={t('toolbar.addLink')}/> + size={'small'} fullWidth={true} placeholder={t('toolbar.addLink')} className="text-text-primary" /> {urlValid ? null : (
{t('editor.incorrectLink')} @@ -252,11 +253,11 @@ function HrefPopover({ } }} size={'small'} - fullWidth={true} placeholder={t('toolbar.addLink')}/> + fullWidth={true} placeholder={t('toolbar.addLink')} className="text-text-primary" />
- + + ); +} \ No newline at end of file diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/MoreOptions.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/MoreOptions.tsx new file mode 100644 index 000000000..823dda8b8 --- /dev/null +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/MoreOptions.tsx @@ -0,0 +1,131 @@ +import { useTranslation } from 'react-i18next'; +import { Editor, Text, Transforms } from 'slate'; +import { useSlate } from 'slate-react'; + +import { CustomEditor } from '@/application/slate-yjs/command'; +import { EditorMarkFormat } from '@/application/slate-yjs/types'; +import { ReactComponent as FormulaSvg } from '@/assets/icons/formula.svg'; +import { ReactComponent as MoreIcon } from '@/assets/icons/more.svg'; +import { ReactComponent as StrikeThroughSvg } from '@/assets/icons/strikethrough.svg'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { useSelectionToolbarContext } from '@/components/editor/components/toolbar/selection-toolbar/SelectionToolbar.hooks'; + +import { useKeyboardNavigation } from '../hooks/useKeyboardNavigation'; +import ActionButton from './ActionButton'; +import { useRef, useState } from 'react'; +import { MenuButton } from './MenuButton'; + +const options = [ + { + icon: , + labelKey: 'editor.strikethrough' as const, + isActive: (editor: Editor) => CustomEditor.isMarkActive(editor, EditorMarkFormat.StrikeThrough), + onClick: (editor: Editor, setOpen: (v: boolean) => void) => { + CustomEditor.toggleMark(editor, { + key: EditorMarkFormat.StrikeThrough, + value: true, + }); + setOpen(false); + }, + }, + { + icon: , + labelKey: 'document.plugins.createInlineMathEquation' as const, + isActive: (editor: Editor) => CustomEditor.isMarkActive(editor, EditorMarkFormat.Formula), + onClick: (editor: Editor, setOpen: (v: boolean) => void) => { + const selection = editor.selection; + + if (!selection) return; + const isActivated = CustomEditor.isMarkActive(editor, EditorMarkFormat.Formula); + + if (!isActivated) { + const text = editor.string(selection); + + editor.delete(); + editor.insertText('$'); + const newSelection = editor.selection; + + if (!newSelection) return; + Transforms.select(editor, { + anchor: { + path: newSelection.anchor.path, + offset: newSelection.anchor.offset - 1, + }, + focus: newSelection.focus, + }); + CustomEditor.addMark(editor, { + key: EditorMarkFormat.Formula, + value: text, + }); + } else { + const [entry] = editor.nodes({ + at: selection, + match: (n) => !Editor.isEditor(n) && Text.isText(n) && n.formula !== undefined, + }); + + if (!entry) return; + const [node, path] = entry; + const { formula } = node as Text; + + if (!formula) return; + editor.select(path); + CustomEditor.removeMark(editor, EditorMarkFormat.Formula); + editor.delete(); + editor.insertText(formula); + } + + setOpen(false); + }, + }, +]; + +export default function MoreOptions() { + const [open, setOpen] = useState(false); + const ref = useRef(null); + const { t } = useTranslation(); + const editor = useSlate(); + const { forceShow } = useSelectionToolbarContext(); + + const { getButtonProps, selectedIndex } = useKeyboardNavigation({ + itemCount: options.length, + isOpen: open, + onSelect: (index) => options[index].onClick(editor, setOpen), + onClose: () => setOpen(false), + }); + + return ( + + +
+ { + e.preventDefault(); + e.stopPropagation(); + setOpen(true); + forceShow(true); + }} + tooltip={t('toolbar.moreOptions', { defaultValue: 'More options' })} + > + + +
+
+ +
+ {options.map((opt, idx) => ( + opt.onClick(editor, setOpen)} + selected={selectedIndex === idx} + buttonProps={getButtonProps(idx)} + /> + ))} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/NumberedList.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/NumberedList.tsx index 17268fdcf..2d1258f22 100644 --- a/src/components/editor/components/toolbar/selection-toolbar/actions/NumberedList.tsx +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/NumberedList.tsx @@ -1,13 +1,15 @@ +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useSlateStatic } from 'slate-react'; + import { YjsEditor } from '@/application/slate-yjs'; import { CustomEditor } from '@/application/slate-yjs/command'; import { getBlockEntry } from '@/application/slate-yjs/utils/editor'; import { BlockType } from '@/application/types'; -import React, { useCallback } from 'react'; -import ActionButton from './ActionButton'; -import { useTranslation } from 'react-i18next'; -import { useSlateStatic } from 'slate-react'; import { ReactComponent as NumberedListSvg } from '@/assets/icons/numbered_list.svg'; +import ActionButton from './ActionButton'; + export function NumberedList() { const { t } = useTranslation(); const editor = useSlateStatic() as YjsEditor; @@ -32,7 +34,7 @@ export function NumberedList() { return ( - + ); } diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/Paragraph.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/Paragraph.tsx index 32eeb26da..2d8e90205 100644 --- a/src/components/editor/components/toolbar/selection-toolbar/actions/Paragraph.tsx +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/Paragraph.tsx @@ -1,11 +1,13 @@ +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useSlateStatic } from 'slate-react'; + import { YjsEditor } from '@/application/slate-yjs'; import { CustomEditor } from '@/application/slate-yjs/command'; import { getBlockEntry } from '@/application/slate-yjs/utils/editor'; import { BlockType } from '@/application/types'; import { ReactComponent as ParagraphSvg } from '@/assets/icons/text.svg'; -import { useCallback } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useSlateStatic } from 'slate-react'; + import ActionButton from './ActionButton'; export function Paragraph() { @@ -24,7 +26,7 @@ export function Paragraph() { return ( - + ); } diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/Quote.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/Quote.tsx index e44983125..c07e8d24d 100644 --- a/src/components/editor/components/toolbar/selection-toolbar/actions/Quote.tsx +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/Quote.tsx @@ -1,13 +1,15 @@ +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useSlateStatic } from 'slate-react'; + import { YjsEditor } from '@/application/slate-yjs'; import { CustomEditor } from '@/application/slate-yjs/command'; import { getBlockEntry } from '@/application/slate-yjs/utils/editor'; import { BlockType } from '@/application/types'; -import React, { useCallback } from 'react'; -import ActionButton from './ActionButton'; -import { useTranslation } from 'react-i18next'; -import { useSlateStatic } from 'slate-react'; import { ReactComponent as QuoteSvg } from '@/assets/icons/quote.svg'; +import ActionButton from './ActionButton'; + export function Quote() { const { t } = useTranslation(); const editor = useSlateStatic() as YjsEditor; @@ -32,7 +34,7 @@ export function Quote() { return ( - + ); } diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/StrikeThrough.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/StrikeThrough.tsx index 9dcb9ffc0..3eea2ecab 100644 --- a/src/components/editor/components/toolbar/selection-toolbar/actions/StrikeThrough.tsx +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/StrikeThrough.tsx @@ -1,11 +1,13 @@ +import { useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useSlateStatic } from 'slate-react'; + import { CustomEditor } from '@/application/slate-yjs/command'; import { EditorMarkFormat } from '@/application/slate-yjs/types'; +import { ReactComponent as StrikeThroughSvg } from '@/assets/icons/strikethrough.svg'; import ActionButton from '@/components/editor/components/toolbar/selection-toolbar/actions/ActionButton'; import { createHotKeyLabel, HOT_KEY_NAME } from '@/utils/hotkeys'; -import React, { useCallback, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useSlateStatic } from 'slate-react'; -import { ReactComponent as StrikeThroughSvg } from '@/assets/icons/strikethrough.svg'; + export function StrikeThrough() { const { t } = useTranslation(); @@ -31,7 +33,7 @@ export function StrikeThrough() { } > - + ); } diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/TurnInto.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/TurnInto.tsx new file mode 100644 index 000000000..fdeeb80ac --- /dev/null +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/TurnInto.tsx @@ -0,0 +1,325 @@ +import { FC, SVGProps, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useSlateStatic } from 'slate-react'; + +import { YjsEditor } from '@/application/slate-yjs'; +import { CustomEditor } from '@/application/slate-yjs/command'; +import { getBlockEntry } from '@/application/slate-yjs/utils/editor'; +import { type HeadingBlockData, BlockType, BlockData } from '@/application/types'; +import { ReactComponent as BulletedListSvg } from '@/assets/icons/bulleted_list.svg'; +import { ReactComponent as Heading1 } from '@/assets/icons/h1.svg'; +import { ReactComponent as Heading2 } from '@/assets/icons/h2.svg'; +import { ReactComponent as Heading3 } from '@/assets/icons/h3.svg'; +import { ReactComponent as NumberedListSvg } from '@/assets/icons/numbered_list.svg'; +import { ReactComponent as QuoteSvg } from '@/assets/icons/quote.svg'; +import { ReactComponent as ParagraphSvg } from '@/assets/icons/text.svg'; +import { ReactComponent as ToggleHeading1Icon } from '@/assets/icons/toggle_h1.svg'; +import { ReactComponent as ToggleHeading2Icon } from '@/assets/icons/toggle_h2.svg'; +import { ReactComponent as ToggleHeading3Icon } from '@/assets/icons/toggle_h3.svg'; +import { ReactComponent as ToggleListIcon } from '@/assets/icons/toggle_list.svg'; +import { ReactComponent as DownArrow } from '@/assets/icons/triangle_down.svg'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { useSelectionToolbarContext } from '@/components/editor/components/toolbar/selection-toolbar/SelectionToolbar.hooks'; + +import { useKeyboardNavigation } from '../hooks/useKeyboardNavigation'; +import ActionButton from './ActionButton'; +import { MenuButton } from './MenuButton'; + +type BlockOption = { + type: 'paragraph' | 'heading1' | 'heading2' | 'heading3' | 'quote' | 'bulleted' | 'numbered' | 'toggleHeading1' | 'toggleHeading2' | 'toggleHeading3' | 'toggle'; + icon: FC>; + label: string; + blockType: BlockType; + data?: BlockData | HeadingBlockData; + group: 'text' | 'list' | 'toggle' | 'other'; +}; + +const blockOptions: BlockOption[] = [ + { + type: 'paragraph', + icon: ParagraphSvg, + label: 'editor.text', + blockType: BlockType.Paragraph, + group: 'text', + }, + { + type: 'heading1', + icon: Heading1, + label: 'toolbar.h1', + blockType: BlockType.HeadingBlock, + data: { level: 1 }, + group: 'text', + }, + { + type: 'heading2', + icon: Heading2, + label: 'toolbar.h2', + blockType: BlockType.HeadingBlock, + data: { level: 2 }, + group: 'text', + }, + { + type: 'heading3', + icon: Heading3, + label: 'toolbar.h3', + blockType: BlockType.HeadingBlock, + data: { level: 3 }, + group: 'text', + }, + { + type: 'bulleted', + icon: BulletedListSvg, + label: 'editor.bulletedListShortForm', + blockType: BlockType.BulletedListBlock, + group: 'list', + }, + { + type: 'numbered', + icon: NumberedListSvg, + label: 'editor.numberedListShortForm', + blockType: BlockType.NumberedListBlock, + group: 'list', + }, + { + type: 'toggle', + icon: ToggleListIcon, + label: 'editor.toggleListShortForm', + blockType: BlockType.ToggleListBlock, + group: 'toggle', + }, + { + type: 'toggleHeading1', + icon: ToggleHeading1Icon, + label: 'editor.toggleHeading1ShortForm', + blockType: BlockType.ToggleListBlock, + data: { level: 1 }, + group: 'toggle', + }, + { + type: 'toggleHeading2', + icon: ToggleHeading2Icon, + label: 'editor.toggleHeading2ShortForm', + blockType: BlockType.ToggleListBlock, + data: { level: 2 }, + group: 'toggle', + }, + { + type: 'toggleHeading3', + icon: ToggleHeading3Icon, + label: 'editor.toggleHeading3ShortForm', + blockType: BlockType.ToggleListBlock, + data: { level: 3 }, + group: 'toggle', + }, + { + type: 'quote', + icon: QuoteSvg, + label: 'editor.quote', + blockType: BlockType.QuoteBlock, + group: 'other', + }, +]; + +function isHeadingBlockData(data: BlockOption['data']): data is HeadingBlockData { + return !!data && typeof (data as HeadingBlockData).level === 'number'; +} + +function TurnInfo() { + const [open, setOpen] = useState(false); + const ref = useRef(null); + const editor = useSlateStatic() as YjsEditor; + const { t } = useTranslation(); + const { visible, forceShow } = useSelectionToolbarContext(); + + // Helper: get current block type and heading level + let currentType: string | null = null; + let currentLevel: number | null = null; + let currentGroup: BlockOption['group'] | null = null; + + try { + const [node] = getBlockEntry(editor); + + switch (node.type) { + case BlockType.Paragraph: + currentType = 'paragraph'; + currentGroup = 'text'; + break; + case BlockType.HeadingBlock: + currentType = 'heading'; + currentLevel = (node.data as HeadingBlockData).level; + currentGroup = 'text'; + break; + case BlockType.QuoteBlock: + currentType = 'quote'; + currentGroup = 'other'; + break; + case BlockType.BulletedListBlock: + currentType = 'bulleted'; + currentGroup = 'list'; + break; + case BlockType.NumberedListBlock: + currentType = 'numbered'; + currentGroup = 'list'; + break; + case BlockType.ToggleListBlock: + currentType = 'toggle'; + currentGroup = 'toggle'; + break; + } + } catch (e) { } + + const getDisplayText = () => { + if (currentType === 'paragraph') return t('editor.text', { defaultValue: 'Text' }); + if (currentType === 'heading' && currentLevel) { + return t(`document.slashMenu.name.heading${currentLevel}`, { defaultValue: `Heading ${currentLevel}` }); + } + + if (currentType === 'quote') return t('toolbar.quote', { returnObjects: false, defaultValue: 'Quote' }); + if (currentType === 'bulleted') return t('toolbar.bulletList', { returnObjects: false, defaultValue: 'Bulleted List' }); + if (currentType === 'numbered') return t('toolbar.numberedList', { returnObjects: false, defaultValue: 'Numbered List' }); + + return 'Text'; + }; + + const handleBlockChange = (option: BlockOption) => { + try { + const [node] = getBlockEntry(editor); + + if (!node) return; + + if (node.type === option.blockType && + (!option.data || (node.type === BlockType.HeadingBlock && isHeadingBlockData(option.data) && (node.data as HeadingBlockData).level === option.data.level))) { + CustomEditor.turnToBlock(editor, node.blockId as string, BlockType.Paragraph, {}); + } else { + CustomEditor.turnToBlock(editor, node.blockId as string, option.blockType, option.data || {}); + } + + setOpen(false); + } catch (e) { setOpen(false); } + }; + + const getSuggestionOptions = () => { + if (!currentGroup) return []; + + // Get all options from the same group except the current one + return blockOptions.filter(option => + option.group === currentGroup && + (option.type !== currentType && + !(currentType === 'heading' && option.type === `heading${currentLevel}`)) + ); + }; + + const getTurnIntoOptions = () => { + const suggestionOptions = getSuggestionOptions(); + + // Filter out options that are already in suggestions + return blockOptions.filter(option => + !suggestionOptions.some(suggestion => suggestion.type === option.type) + ); + }; + + const suggestionOptions = getSuggestionOptions(); + const turnIntoOptions = getTurnIntoOptions(); + + const { getButtonProps, selectedIndex } = useKeyboardNavigation({ + itemCount: suggestionOptions.length + turnIntoOptions.length, + isOpen: open, + onSelect: (index) => { + const options = [...suggestionOptions, ...turnIntoOptions]; + + handleBlockChange(options[index]); + }, + onClose: () => setOpen(false) + }); + + function isOptionActive(option: BlockOption, currentType: string | null, currentLevel: number | null) { + if (!currentType) return false; + if (option.type === 'paragraph' && currentType === 'paragraph') return true; + if (option.type.startsWith('heading') && currentType === 'heading') { + return isHeadingBlockData(option.data) && option.data.level === currentLevel; + } + + if (option.type === 'bulleted' && currentType === 'bulleted') return true; + if (option.type === 'numbered' && currentType === 'numbered') return true; + if (option.type === 'toggle' && currentType === 'toggle') return true; + if (option.type.startsWith('toggleHeading') && currentType === 'toggle' && isHeadingBlockData(option.data) && option.data.level === currentLevel) return true; + if (option.type === 'quote' && currentType === 'quote') return true; + return false; + } + + return ( +
+ + +
+ { + e.preventDefault(); + e.stopPropagation(); + setOpen(true); + forceShow(true); + }} + tooltip={getDisplayText()} + > +
+ + {getDisplayText()} + + +
+
+
+
+ {visible && ( + +
+ {suggestionOptions.length > 0 && ( + <> +
+ {t('toolbar.suggestions', { defaultValue: 'Suggestions' })} +
+ {suggestionOptions.map((option, idx) => ( + } + label={t(option.label, { defaultValue: option.label })} + isActive={isOptionActive(option, currentType, currentLevel)} + onClick={() => handleBlockChange(option)} + selected={selectedIndex === idx} + buttonProps={getButtonProps(idx)} + /> + ))} + + )} +
+ {t('toolbar.turnInto', { defaultValue: 'Turn into' })} +
+ {turnIntoOptions.map((option, idx) => ( + } + label={t(option.label, { defaultValue: option.label })} + isActive={isOptionActive(option, currentType, currentLevel)} + onClick={() => handleBlockChange(option)} + selected={selectedIndex === idx + suggestionOptions.length} + buttonProps={getButtonProps(idx + suggestionOptions.length)} + /> + ))} +
+
+ )} +
+
+ ); +} + +export default TurnInfo; \ No newline at end of file diff --git a/src/components/editor/components/toolbar/selection-toolbar/actions/Underline.tsx b/src/components/editor/components/toolbar/selection-toolbar/actions/Underline.tsx index e084940b9..ebdb2c83e 100644 --- a/src/components/editor/components/toolbar/selection-toolbar/actions/Underline.tsx +++ b/src/components/editor/components/toolbar/selection-toolbar/actions/Underline.tsx @@ -1,11 +1,13 @@ +import { useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useSlateStatic } from 'slate-react'; + import { CustomEditor } from '@/application/slate-yjs/command'; import { EditorMarkFormat } from '@/application/slate-yjs/types'; +import { ReactComponent as UnderlineSvg } from '@/assets/icons/underline.svg'; import ActionButton from '@/components/editor/components/toolbar/selection-toolbar/actions/ActionButton'; import { createHotKeyLabel, HOT_KEY_NAME } from '@/utils/hotkeys'; -import React, { useCallback, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useSlateStatic } from 'slate-react'; -import { ReactComponent as UnderlineSvg } from '@/assets/icons/underline.svg'; + export function Underline() { const { t } = useTranslation(); @@ -31,7 +33,7 @@ export function Underline() { } > - + ); } diff --git a/src/components/editor/components/toolbar/selection-toolbar/hooks/useKeyboardNavigation.ts b/src/components/editor/components/toolbar/selection-toolbar/hooks/useKeyboardNavigation.ts new file mode 100644 index 000000000..761efedcc --- /dev/null +++ b/src/components/editor/components/toolbar/selection-toolbar/hooks/useKeyboardNavigation.ts @@ -0,0 +1,66 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; + +import { createHotkey, HOT_KEY_NAME } from '@/utils/hotkeys'; + +interface UseKeyboardNavigationProps { + itemCount: number; + onSelect: (index: number) => void; + onClose: () => void; + isOpen: boolean; +} + +export function useKeyboardNavigation({ itemCount, onSelect, onClose, isOpen }: UseKeyboardNavigationProps) { + const [selectedIndex, setSelectedIndex] = useState(-1); + const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]); + + useEffect(() => { + if (!isOpen) { + setSelectedIndex(-1); + return; + } + + const handleKeyDown = (e: KeyboardEvent) => { + if (createHotkey(HOT_KEY_NAME.UP)(e) || createHotkey(HOT_KEY_NAME.DOWN)(e)) { + e.preventDefault(); + e.stopPropagation(); + + if (createHotkey(HOT_KEY_NAME.UP)(e)) { + setSelectedIndex(prev => (prev <= 0 ? itemCount - 1 : prev - 1)); + } else { + setSelectedIndex(prev => (prev >= itemCount - 1 ? 0 : prev + 1)); + } + } else if (createHotkey(HOT_KEY_NAME.ENTER)(e)) { + e.preventDefault(); + e.stopPropagation(); + if (selectedIndex >= 0) { + onSelect(selectedIndex); + onClose(); + } + } + }; + + document.addEventListener('keydown', handleKeyDown, true); + return () => { + document.removeEventListener('keydown', handleKeyDown, true); + }; + }, [isOpen, selectedIndex, itemCount, onSelect, onClose]); + + const getButtonProps = useCallback((index: number) => ({ + ref: (el: HTMLButtonElement | null) => { + buttonRefs.current[index] = el; + }, + sx: { + '&:hover': { + backgroundColor: 'var(--fill-list-hover)' + }, + ...(selectedIndex === index && { + backgroundColor: 'var(--fill-list-hover)' + }) + } + }), [selectedIndex]); + + return { + selectedIndex, + getButtonProps + }; +} \ No newline at end of file diff --git a/src/components/main/AppTheme.tsx b/src/components/main/AppTheme.tsx index 55306a35c..c5add2830 100644 --- a/src/components/main/AppTheme.tsx +++ b/src/components/main/AppTheme.tsx @@ -1,12 +1,12 @@ -import { ThemeModeContext, useAppThemeMode } from '@/components/main/useAppThemeMode'; -import React, { useMemo } from 'react'; import createTheme from '@mui/material/styles/createTheme'; import ThemeProvider from '@mui/material/styles/ThemeProvider'; -import { i18nInstance } from '@/i18n/config'; - +import { ReactNode, useMemo } from 'react'; import { I18nextProvider } from 'react-i18next'; -function AppTheme({ children }: { children: React.ReactNode }) { +import { ThemeModeContext, useAppThemeMode } from '@/components/main/useAppThemeMode'; +import { i18nInstance } from '@/i18n/config'; + +function AppTheme({ children }: { children: ReactNode }) { const { isDark, setIsDark } = useAppThemeMode(); const theme = useMemo( @@ -191,7 +191,7 @@ function AppTheme({ children }: { children: React.ReactNode }) { MuiTooltip: { styleOverrides: { arrow: { - color: 'var(--fill-toolbar)', + color: 'var(--surface-primary)', }, tooltip: { backgroundColor: 'var(--fill-toolbar)', diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx index 30e92a2ab..210827304 100644 --- a/src/components/ui/popover.tsx +++ b/src/components/ui/popover.tsx @@ -3,15 +3,15 @@ import * as PopoverPrimitive from '@radix-ui/react-popover'; import { cn } from '@/lib/utils'; -function Popover ({ ...props }: React.ComponentProps) { +function Popover({ ...props }: React.ComponentProps) { return ; } -function PopoverTrigger ({ ...props }: React.ComponentProps) { +function PopoverTrigger({ ...props }: React.ComponentProps) { return ; } -function PopoverContent ({ +function PopoverContent({ className, align = 'center', sideOffset = 4, @@ -33,7 +33,7 @@ function PopoverContent ({ ); } -function PopoverAnchor ({ ...props }: React.ComponentProps) { +function PopoverAnchor({ ...props }: React.ComponentProps) { return ; } diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx index ffbc05360..ace291958 100644 --- a/src/components/ui/separator.tsx +++ b/src/components/ui/separator.tsx @@ -3,7 +3,7 @@ import * as SeparatorPrimitive from '@radix-ui/react-separator'; import { cn } from '@/lib/utils'; -function Separator ({ +function Separator({ className, orientation = 'horizontal', decorative = true, @@ -15,7 +15,7 @@ function Separator ({ decorative={decorative} orientation={orientation} className={cn( - 'bg-border-primary shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', + 'shrink-0 bg-border-primary data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', className, )} {...props} diff --git a/tailwind.config.cjs b/tailwind.config.cjs index f193c37ec..a6d3ec81d 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -31,6 +31,7 @@ module.exports = { 600: '20px', xs: '4px', sm: '6px', + m: '8px', md: '12px', lg: '16px', xl: '20px', diff --git a/vite.config.ts b/vite.config.ts index bb36c046b..248c32c46 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -99,6 +99,7 @@ export default defineConfig({ server: { port: process.env.PORT ? parseInt(process.env.PORT) : 3000, strictPort: true, + host: '0.0.0.0', watch: { ignored: ['node_modules'], }, @@ -125,7 +126,7 @@ export default defineConfig({ entryFileNames: 'static/js/[name]-[hash].js', assetFileNames: 'static/[ext]/[name]-[hash].[ext]', manualChunks(id) { - if( + if ( // id.includes('/react@') || // id.includes('/react-dom@') || id.includes('/react-is@') ||