diff --git a/package.json b/package.json index de87b9a3..d6b19405 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@samvera/clover-iiif", - "version": "2.3.2", + "version": "2.4.0-rc.0", "description": "Extensible IIIF front-end toolkit and Manifest viewer. Accessible. Composable. Open Source.", "files": [ "dist" @@ -69,7 +69,7 @@ "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "^1.0.4", "@stitches/react": "^1.2.8", - "hls.js": "^1.4.14", + "hls.js": "^1.5.3", "node-webvtt": "^1.9.4", "openseadragon": "^2.4.2", "react": "^18.2.0", @@ -81,37 +81,37 @@ }, "devDependencies": { "@iiif/presentation-3": "^1.1.3", - "@testing-library/jest-dom": "^6.1.6", - "@testing-library/react": "^14.1.2", + "@testing-library/jest-dom": "^6.4.1", + "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", - "@types/node": "20.10.6", + "@types/node": "20.11.16", "@types/openseadragon": "^3.0.10", - "@types/react": "^18.2.46", + "@types/react": "^18.2.51", "@types/react-dom": "^18.2.18", "@types/sanitize-html": "^2.9.5", - "@typescript-eslint/eslint-plugin": "^6.17.0", + "@typescript-eslint/eslint-plugin": "^6.20.0", "@vitejs/plugin-react": "^4.2.1", - "@vitest/coverage-v8": "^1.1.1", - "@vitest/ui": "^1.1.1", + "@vitest/coverage-v8": "^1.2.2", + "@vitest/ui": "^1.2.2", "cross-fetch": "^4.0.0", "dts-bundle-generator": "8.0.1", - "eslint-config-next": "14.0.4", + "eslint-config-next": "14.1.0", "eslint-config-prettier": "^9.1.0", "execa": "^8.0.1", "husky": "^8.0.3", - "jsdom": "^23.0.1", - "lint-staged": "^15.2.0", - "next": "^14.0.4", - "nextra": "^2.13.2", - "nextra-theme-docs": "^2.13.2", + "jsdom": "^23.2.0", + "lint-staged": "^15.2.1", + "next": "^14.1.0", + "nextra": "^2.13.3", + "nextra-theme-docs": "^2.13.3", "preact": "^10.19.3", - "prettier": "^3.1.1", + "prettier": "^3.2.4", "rimraf": "^5.0.5", - "terser": "^5.26.0", + "terser": "^5.27.0", "typescript": "^5.3.3", - "vite": "^5.0.10", - "vite-tsconfig-paths": "^4.2.3", - "vitest": "^1.1.1" + "vite": "^5.0.12", + "vite-tsconfig-paths": "^4.3.1", + "vitest": "^1.2.2" }, "peerDependencies": { "swiper": "^9.0.0" diff --git a/pages/docs/viewer/_meta.json b/pages/docs/viewer/_meta.json index 9fa9a053..8de628c4 100644 --- a/pages/docs/viewer/_meta.json +++ b/pages/docs/viewer/_meta.json @@ -1,9 +1,9 @@ { "demo": { - "title": "Demo", "theme": { - "sidebar": false, - "layout": "full" - } + "layout": "full", + "sidebar": false + }, + "title": "Demo" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3775bad0..d45ab85a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,37 +13,37 @@ dependencies: version: 0.9.22 '@iiif/vault-helpers': specifier: ^0.10.0 - version: 0.10.0(@atlas-viewer/iiif-image-api@2.1.1)(@iiif/vault@0.9.22)(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0) + version: 0.10.0(@atlas-viewer/iiif-image-api@2.1.1)(@iiif/vault@0.9.22)(i18next@23.8.2)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-aspect-ratio': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collapsible': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-form': specifier: ^0.0.3 - version: 0.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 0.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-popover': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-radio-group': specifier: ^1.1.3 - version: 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-switch': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) '@stitches/react': specifier: ^1.2.8 version: 1.2.8(react@18.2.0) hls.js: - specifier: ^1.4.14 - version: 1.4.14 + specifier: ^1.5.3 + version: 1.5.3 node-webvtt: specifier: ^1.9.4 version: 1.9.4 @@ -74,23 +74,23 @@ devDependencies: specifier: ^1.1.3 version: 1.1.3 '@testing-library/jest-dom': - specifier: ^6.1.6 - version: 6.2.0(vitest@1.1.2) + specifier: ^6.4.1 + version: 6.4.1(vitest@1.2.2) '@testing-library/react': - specifier: ^14.1.2 - version: 14.1.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.2.1 + version: 14.2.1(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.3) + version: 14.5.2(@testing-library/dom@9.3.4) '@types/node': - specifier: 20.10.6 - version: 20.10.6 + specifier: 20.11.16 + version: 20.11.16 '@types/openseadragon': specifier: ^3.0.10 version: 3.0.10 '@types/react': - specifier: ^18.2.46 - version: 18.2.46 + specifier: ^18.2.51 + version: 18.2.51 '@types/react-dom': specifier: ^18.2.18 version: 18.2.18 @@ -98,17 +98,17 @@ devDependencies: specifier: ^2.9.5 version: 2.9.5 '@typescript-eslint/eslint-plugin': - specifier: ^6.17.0 - version: 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.20.0 + version: 6.20.0(@typescript-eslint/parser@6.20.0)(eslint@8.56.0)(typescript@5.3.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.0.10) + version: 4.2.1(vite@5.0.12) '@vitest/coverage-v8': - specifier: ^1.1.1 - version: 1.1.2(vitest@1.1.2) + specifier: ^1.2.2 + version: 1.2.2(vitest@1.2.2) '@vitest/ui': - specifier: ^1.1.1 - version: 1.1.2(vitest@1.1.2) + specifier: ^1.2.2 + version: 1.2.2(vitest@1.2.2) cross-fetch: specifier: ^4.0.0 version: 4.0.0 @@ -116,8 +116,8 @@ devDependencies: specifier: 8.0.1 version: 8.0.1 eslint-config-next: - specifier: 14.0.4 - version: 14.0.4(eslint@8.56.0)(typescript@5.3.3) + specifier: 14.1.0 + version: 14.1.0(eslint@8.56.0)(typescript@5.3.3) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.56.0) @@ -128,44 +128,44 @@ devDependencies: specifier: ^8.0.3 version: 8.0.3 jsdom: - specifier: ^23.0.1 - version: 23.0.1 + specifier: ^23.2.0 + version: 23.2.0 lint-staged: - specifier: ^15.2.0 - version: 15.2.0 + specifier: ^15.2.1 + version: 15.2.1 next: - specifier: ^14.0.4 - version: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.1.0 + version: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0) nextra: - specifier: ^2.13.2 - version: 2.13.2(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.13.3 + version: 2.13.3(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) nextra-theme-docs: - specifier: ^2.13.2 - version: 2.13.2(next@14.0.4)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.13.3 + version: 2.13.3(next@14.1.0)(nextra@2.13.3)(react-dom@18.2.0)(react@18.2.0) preact: specifier: ^10.19.3 version: 10.19.3 prettier: - specifier: ^3.1.1 - version: 3.1.1 + specifier: ^3.2.4 + version: 3.2.4 rimraf: specifier: ^5.0.5 version: 5.0.5 terser: - specifier: ^5.26.0 - version: 5.26.0 + specifier: ^5.27.0 + version: 5.27.0 typescript: specifier: ^5.3.3 version: 5.3.3 vite: - specifier: ^5.0.10 - version: 5.0.10(@types/node@20.10.6)(terser@5.26.0) + specifier: ^5.0.12 + version: 5.0.12(@types/node@20.11.16)(terser@5.27.0) vite-tsconfig-paths: - specifier: ^4.2.3 - version: 4.2.3(typescript@5.3.3)(vite@5.0.10) + specifier: ^4.3.1 + version: 4.3.1(typescript@5.3.3)(vite@5.0.12) vitest: - specifier: ^1.1.1 - version: 1.1.2(@types/node@20.10.6)(@vitest/ui@1.1.2)(jsdom@23.0.1)(terser@5.26.0) + specifier: ^1.2.2 + version: 1.2.2(@types/node@20.11.16)(@vitest/ui@1.2.2)(jsdom@23.2.0)(terser@5.27.0) packages: @@ -174,8 +174,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@adobe/css-tools@4.3.2: - resolution: {integrity: sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==} + /@adobe/css-tools@4.3.3: + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} dev: true /@ampproject/remapping@2.2.1: @@ -183,7 +183,15 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + + /@asamuzakjp/dom-selector@2.0.2: + resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} + dependencies: + bidi-js: 1.0.3 + css-tree: 2.3.1 + is-potential-custom-element-name: 1.0.1 dev: true /@atlas-viewer/iiif-image-api@2.1.1: @@ -206,20 +214,20 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helpers': 7.23.7 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -233,9 +241,9 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 dev: true @@ -245,7 +253,7 @@ packages: dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 + browserslist: 4.22.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -259,31 +267,31 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -300,14 +308,14 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-string-parser@7.23.4: @@ -325,13 +333,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.23.7: - resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color dev: true @@ -345,51 +353,51 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/runtime@7.23.7: - resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + /@babel/runtime@7.23.9: + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 dev: true - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 @@ -398,16 +406,16 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 @@ -423,8 +431,8 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: true - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -432,8 +440,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -441,8 +449,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -450,8 +458,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -459,8 +467,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -468,8 +476,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -477,8 +485,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -486,8 +494,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -495,8 +503,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -504,8 +512,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -513,8 +521,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -522,8 +530,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -531,8 +539,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -540,8 +548,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -549,8 +557,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -558,8 +566,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -567,8 +575,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -576,8 +584,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -585,8 +593,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -594,8 +602,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -603,8 +611,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -612,8 +620,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -621,8 +629,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -653,7 +661,7 @@ packages: debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -667,51 +675,52 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@floating-ui/core@1.5.2: - resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: - '@floating-ui/utils': 0.1.6 + '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/dom@1.5.3: - resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + /@floating-ui/dom@1.6.1: + resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} dependencies: - '@floating-ui/core': 1.5.2 - '@floating-ui/utils': 0.1.6 + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/react-dom@2.0.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==} + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.5.3 + '@floating-ui/dom': 1.6.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@floating-ui/utils@0.1.6: - resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false - /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} + /@headlessui/react@1.7.18(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==} engines: {node: '>=10'} peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 dependencies: + '@tanstack/react-virtual': 3.0.2(react-dom@18.2.0)(react@18.2.0) client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -723,8 +732,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true /@iiif/parser@1.1.2: @@ -732,7 +741,7 @@ packages: dependencies: '@iiif/presentation-2': 1.0.4(@iiif/presentation-3@1.1.3) '@iiif/presentation-3': 1.1.3 - '@types/geojson': 7946.0.13 + '@types/geojson': 7946.0.14 dev: false /@iiif/presentation-2@1.0.4(@iiif/presentation-3@1.1.3): @@ -746,9 +755,9 @@ packages: /@iiif/presentation-3@1.1.3: resolution: {integrity: sha512-Ek+25nkQouo0pXAqCsWYbAeS4jLDEBQA7iul2jzgnvoJrucxDQN2lXyNLgOUDRqpTdSqJ69iz5lm6DLaxil+Nw==} dependencies: - '@types/geojson': 7946.0.13 + '@types/geojson': 7946.0.14 - /@iiif/vault-helpers@0.10.0(@atlas-viewer/iiif-image-api@2.1.1)(@iiif/vault@0.9.22)(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0): + /@iiif/vault-helpers@0.10.0(@atlas-viewer/iiif-image-api@2.1.1)(@iiif/vault@0.9.22)(i18next@23.8.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-gnjTPcZJMIDjwU5K8HYNU8Iix49Awmsr7IhIyxA5ZCqugnLjHvJUOmOvT7q1NRd6ia4+09wxx+EMH0D9mt4cxQ==} peerDependencies: '@atlas-viewer/iiif-image-api': ^2.1.1 @@ -761,7 +770,7 @@ packages: optionalDependencies: abs-svg-path: 0.1.1 parse-svg-path: 0.1.2 - react-i18next: 11.18.6(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0) + react-i18next: 11.18.6(i18next@23.8.2)(react-dom@18.2.0)(react@18.2.0) svg-arc-to-cubic-bezier: 3.2.0 transitivePeerDependencies: - i18next @@ -813,7 +822,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 dev: true /@jridgewell/resolve-uri@3.1.1: @@ -830,15 +839,15 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 @@ -847,8 +856,8 @@ packages: /@mdx-js/mdx@2.3.0: resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/mdx': 2.0.10 + '@types/estree-jsx': 1.0.4 + '@types/mdx': 2.0.11 estree-util-build-jsx: 2.2.2 estree-util-is-identifier-name: 2.1.0 estree-util-to-js: 1.2.0 @@ -873,13 +882,13 @@ packages: peerDependencies: react: '>=16' dependencies: - '@types/mdx': 2.0.10 - '@types/react': 18.2.46 + '@types/mdx': 2.0.11 + '@types/react': 18.2.51 react: 18.2.0 dev: true - /@napi-rs/simple-git-android-arm-eabi@0.1.9: - resolution: {integrity: sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==} + /@napi-rs/simple-git-android-arm-eabi@0.1.16: + resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} engines: {node: '>= 10'} cpu: [arm] os: [android] @@ -887,8 +896,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-android-arm64@0.1.9: - resolution: {integrity: sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==} + /@napi-rs/simple-git-android-arm64@0.1.16: + resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] @@ -896,8 +905,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-darwin-arm64@0.1.9: - resolution: {integrity: sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==} + /@napi-rs/simple-git-darwin-arm64@0.1.16: + resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -905,8 +914,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-darwin-x64@0.1.9: - resolution: {integrity: sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==} + /@napi-rs/simple-git-darwin-x64@0.1.16: + resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -914,8 +923,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9: - resolution: {integrity: sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==} + /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16: + resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -923,8 +932,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-linux-arm64-gnu@0.1.9: - resolution: {integrity: sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==} + /@napi-rs/simple-git-linux-arm64-gnu@0.1.16: + resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -932,8 +941,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-linux-arm64-musl@0.1.9: - resolution: {integrity: sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==} + /@napi-rs/simple-git-linux-arm64-musl@0.1.16: + resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -941,8 +950,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-linux-x64-gnu@0.1.9: - resolution: {integrity: sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==} + /@napi-rs/simple-git-linux-x64-gnu@0.1.16: + resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -950,8 +959,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-linux-x64-musl@0.1.9: - resolution: {integrity: sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==} + /@napi-rs/simple-git-linux-x64-musl@0.1.16: + resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -959,8 +968,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-win32-arm64-msvc@0.1.9: - resolution: {integrity: sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==} + /@napi-rs/simple-git-win32-arm64-msvc@0.1.16: + resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -968,8 +977,8 @@ packages: dev: true optional: true - /@napi-rs/simple-git-win32-x64-msvc@0.1.9: - resolution: {integrity: sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==} + /@napi-rs/simple-git-win32-x64-msvc@0.1.16: + resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -977,35 +986,35 @@ packages: dev: true optional: true - /@napi-rs/simple-git@0.1.9: - resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} + /@napi-rs/simple-git@0.1.16: + resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} engines: {node: '>= 10'} optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.9 - '@napi-rs/simple-git-android-arm64': 0.1.9 - '@napi-rs/simple-git-darwin-arm64': 0.1.9 - '@napi-rs/simple-git-darwin-x64': 0.1.9 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.9 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.9 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.9 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.9 - '@napi-rs/simple-git-linux-x64-musl': 0.1.9 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.9 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.9 + '@napi-rs/simple-git-android-arm-eabi': 0.1.16 + '@napi-rs/simple-git-android-arm64': 0.1.16 + '@napi-rs/simple-git-darwin-arm64': 0.1.16 + '@napi-rs/simple-git-darwin-x64': 0.1.16 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.16 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.16 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.16 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.16 + '@napi-rs/simple-git-linux-x64-musl': 0.1.16 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 dev: true - /@next/env@14.0.4: - resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} + /@next/env@14.1.0: + resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} dev: true - /@next/eslint-plugin-next@14.0.4: - resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} + /@next/eslint-plugin-next@14.1.0: + resolution: {integrity: sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==} dependencies: - glob: 7.1.7 + glob: 10.3.10 dev: true - /@next/swc-darwin-arm64@14.0.4: - resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==} + /@next/swc-darwin-arm64@14.1.0: + resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -1013,8 +1022,8 @@ packages: dev: true optional: true - /@next/swc-darwin-x64@14.0.4: - resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==} + /@next/swc-darwin-x64@14.1.0: + resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -1022,8 +1031,8 @@ packages: dev: true optional: true - /@next/swc-linux-arm64-gnu@14.0.4: - resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==} + /@next/swc-linux-arm64-gnu@14.1.0: + resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1031,8 +1040,8 @@ packages: dev: true optional: true - /@next/swc-linux-arm64-musl@14.0.4: - resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==} + /@next/swc-linux-arm64-musl@14.1.0: + resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1040,8 +1049,8 @@ packages: dev: true optional: true - /@next/swc-linux-x64-gnu@14.0.4: - resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==} + /@next/swc-linux-x64-gnu@14.1.0: + resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1049,8 +1058,8 @@ packages: dev: true optional: true - /@next/swc-linux-x64-musl@14.0.4: - resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==} + /@next/swc-linux-x64-musl@14.1.0: + resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1058,8 +1067,8 @@ packages: dev: true optional: true - /@next/swc-win32-arm64-msvc@14.0.4: - resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==} + /@next/swc-win32-arm64-msvc@14.1.0: + resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -1067,8 +1076,8 @@ packages: dev: true optional: true - /@next/swc-win32-ia32-msvc@14.0.4: - resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==} + /@next/swc-win32-ia32-msvc@14.1.0: + resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -1076,8 +1085,8 @@ packages: dev: true optional: true - /@next/swc-win32-x64-msvc@14.0.4: - resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==} + /@next/swc-win32-x64-msvc@14.1.0: + resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1103,7 +1112,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 + fastq: 1.17.0 dev: true /@pkgjs/parseargs@0.11.0: @@ -1124,16 +1133,16 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 dev: false /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -1146,15 +1155,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-aspect-ratio@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-aspect-ratio@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA==} peerDependencies: '@types/react': '*' @@ -1167,15 +1176,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -1188,22 +1197,22 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -1216,18 +1225,18 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -1236,12 +1245,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -1250,12 +1259,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -1264,12 +1273,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -1282,19 +1291,19 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -1303,12 +1312,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -1321,17 +1330,17 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-form@0.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-form@0.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==} peerDependencies: '@types/react': '*' @@ -1344,20 +1353,20 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-label': 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-label': 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -1366,13 +1375,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: '@types/react': '*' @@ -1385,15 +1394,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' @@ -1406,29 +1415,29 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.46)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.51)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -1441,24 +1450,24 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@babel/runtime': 7.23.9 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.51)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.46 + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -1471,15 +1480,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -1492,16 +1501,16 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -1514,15 +1523,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} peerDependencies: '@types/react': '*' @@ -1535,24 +1544,24 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -1565,23 +1574,23 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: '@types/react': '*' @@ -1594,35 +1603,35 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.46)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.51)(react@18.2.0) dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -1631,13 +1640,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: '@types/react': '*' @@ -1650,21 +1659,21 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} peerDependencies: '@types/react': '*' @@ -1677,22 +1686,22 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -1701,12 +1710,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -1715,13 +1724,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -1730,13 +1739,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -1745,12 +1754,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: '@types/react': '*' @@ -1759,12 +1768,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -1773,13 +1782,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.46 + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.46)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1788,13 +1797,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.51)(react@18.2.0) + '@types/react': 18.2.51 react: 18.2.0 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1807,9 +1816,9 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.46 + '@babel/runtime': 7.23.9 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.51)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.51 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1818,115 +1827,115 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 dev: false - /@rollup/rollup-android-arm-eabi@4.9.2: - resolution: {integrity: sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==} + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.9.2: - resolution: {integrity: sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==} + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.9.2: - resolution: {integrity: sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==} + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.9.2: - resolution: {integrity: sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==} + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.2: - resolution: {integrity: sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.2: - resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==} + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.9.2: - resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==} + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.2: - resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==} + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.9.2: - resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==} + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.9.2: - resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==} + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.2: - resolution: {integrity: sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==} + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.2: - resolution: {integrity: sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==} + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.9.2: - resolution: {integrity: sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==} + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@rushstack/eslint-patch@1.6.1: - resolution: {integrity: sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==} + /@rushstack/eslint-patch@1.7.2: + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} dev: true /@sinclair/typebox@0.27.8: @@ -1947,12 +1956,27 @@ packages: tslib: 2.6.2 dev: true - /@testing-library/dom@9.3.3: - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + /@tanstack/react-virtual@3.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9XbRLPKgnhMwwmuQMnJMv+5a9sitGNCSEtf/AZXzmJdesYk7XsjYHaEDny+IrJzvPNwZliIIDwCRiaUqR3zzCA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/virtual-core': 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@tanstack/virtual-core@3.0.0: + resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} + dev: true + + /@testing-library/dom@9.3.4: + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -1961,17 +1985,20 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@6.2.0(vitest@1.1.2): - resolution: {integrity: sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw==} + /@testing-library/jest-dom@6.4.1(vitest@1.2.2): + resolution: {integrity: sha512-Z7qMM3J2Zw5H/nC2/5CYx5YcuaD56JmDFKNIozZ89VIo6o6Y9FMhssics4e2madEKYDNEpZz3+glPGz0yWMOag==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: '@jest/globals': '>= 28' + '@types/bun': latest '@types/jest': '>= 28' jest: '>= 28' vitest: '>= 0.32' peerDependenciesMeta: '@jest/globals': optional: true + '@types/bun': + optional: true '@types/jest': optional: true jest: @@ -1979,38 +2006,38 @@ packages: vitest: optional: true dependencies: - '@adobe/css-tools': 4.3.2 - '@babel/runtime': 7.23.7 + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.23.9 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - vitest: 1.1.2(@types/node@20.10.6)(@vitest/ui@1.1.2)(jsdom@23.0.1)(terser@5.26.0) + vitest: 1.2.2(@types/node@20.11.16)(@vitest/ui@1.2.2)(jsdom@23.2.0)(terser@5.27.0) dev: true - /@testing-library/react@14.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} + /@testing-library/react@14.2.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==} engines: {node: '>=14'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.23.7 - '@testing-library/dom': 9.3.3 + '@babel/runtime': 7.23.9 + '@testing-library/dom': 9.3.4 '@types/react-dom': 18.2.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.3): + /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.3 + '@testing-library/dom': 9.3.4 dev: true /@theguild/remark-mermaid@0.0.5(react@18.2.0): @@ -2018,7 +2045,7 @@ packages: peerDependencies: react: ^18.2.0 dependencies: - mermaid: 10.6.1 + mermaid: 10.8.0 react: 18.2.0 unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -2045,8 +2072,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 @@ -2055,20 +2082,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 dev: true /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@types/d3-scale-chromatic@3.0.3: @@ -2091,8 +2118,8 @@ packages: '@types/ms': 0.7.34 dev: true - /@types/estree-jsx@1.0.3: - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + /@types/estree-jsx@1.0.4: + resolution: {integrity: sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==} dependencies: '@types/estree': 1.0.5 dev: true @@ -2101,17 +2128,17 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/geojson@7946.0.13: - resolution: {integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==} + /@types/geojson@7946.0.14: + resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - /@types/hast@2.3.9: - resolution: {integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==} + /@types/hast@2.3.10: + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} dependencies: '@types/unist': 2.0.10 dev: true - /@types/hast@3.0.3: - resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: '@types/unist': 3.0.2 dev: true @@ -2148,16 +2175,16 @@ packages: '@types/unist': 3.0.2 dev: true - /@types/mdx@2.0.10: - resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + /@types/mdx@2.0.11: + resolution: {integrity: sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==} dev: true /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: true - /@types/node@20.10.6: - resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + /@types/node@20.11.16: + resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} dependencies: undici-types: 5.26.5 dev: true @@ -2172,10 +2199,10 @@ packages: /@types/react-dom@18.2.18: resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.51 - /@types/react@18.2.46: - resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + /@types/react@18.2.51: + resolution: {integrity: sha512-XeoMaU4CzyjdRr3c4IQQtiH7Rpo18V07rYZUucEZQwOUEtGgTXv7e6igQiQ+xnV6MbMe1qjEmKdgMNnfppnXfg==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 @@ -2202,8 +2229,8 @@ packages: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} dev: true - /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} + /@typescript-eslint/eslint-plugin@6.20.0(@typescript-eslint/parser@6.20.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2214,15 +2241,15 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/type-utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.20.0 + '@typescript-eslint/type-utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.20.0 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -2231,8 +2258,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} + /@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2241,10 +2268,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/scope-manager': 6.20.0 + '@typescript-eslint/types': 6.20.0 + '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.20.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -2252,16 +2279,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.17.0: - resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + /@typescript-eslint/scope-manager@6.20.0: + resolution: {integrity: sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.20.0 + '@typescript-eslint/visitor-keys': 6.20.0 dev: true - /@typescript-eslint/type-utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==} + /@typescript-eslint/type-utils@6.20.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2270,8 +2297,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -2280,13 +2307,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.17.0: - resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} + /@typescript-eslint/types@6.20.0: + resolution: {integrity: sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): - resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + /@typescript-eslint/typescript-estree@6.20.0(typescript@5.3.3): + resolution: {integrity: sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2294,8 +2321,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.20.0 + '@typescript-eslint/visitor-keys': 6.20.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2307,8 +2334,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} + /@typescript-eslint/utils@6.20.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2316,9 +2343,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.20.0 + '@typescript-eslint/types': 6.20.0 + '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -2326,11 +2353,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.17.0: - resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + /@typescript-eslint/visitor-keys@6.20.0: + resolution: {integrity: sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/types': 6.20.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2338,24 +2365,24 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react@4.2.1(vite@5.0.10): + /@vitejs/plugin-react@4.2.1(vite@5.0.12): resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.0.10(@types/node@20.10.6)(terser@5.26.0) + vite: 5.0.12(@types/node@20.11.16)(terser@5.27.0) transitivePeerDependencies: - supports-color dev: true - /@vitest/coverage-v8@1.1.2(vitest@1.1.2): - resolution: {integrity: sha512-W12+EiqKxNgcot5ZdUA/8G/P+3bHVr1Ggi4G7qWbLGXFfyEANCDidpV7KzxnOgFGrL4DAB1nsh4mzTIZ3Nz79A==} + /@vitest/coverage-v8@1.2.2(vitest@1.2.2): + resolution: {integrity: sha512-IHyKnDz18SFclIEEAHb9Y4Uxx0sPKC2VO1kdDCs1BF6Ip4S8rQprs971zIsooLUn7Afs71GRxWMWpkCGZpRMhw==} peerDependencies: vitest: ^1.0.0 dependencies: @@ -2366,64 +2393,64 @@ packages: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.6 - magic-string: 0.30.5 - magicast: 0.3.2 + magic-string: 0.30.6 + magicast: 0.3.3 picocolors: 1.0.0 std-env: 3.7.0 test-exclude: 6.0.0 v8-to-istanbul: 9.2.0 - vitest: 1.1.2(@types/node@20.10.6)(@vitest/ui@1.1.2)(jsdom@23.0.1)(terser@5.26.0) + vitest: 1.2.2(@types/node@20.11.16)(@vitest/ui@1.2.2)(jsdom@23.2.0)(terser@5.27.0) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@1.1.2: - resolution: {integrity: sha512-1aOqDLbgkvJ2e1nLQ/5dkUX54V1Alwt2e6M2u03Oy7wGbDYHV5ZLKm1XbcT45h8TMXtc2q/BPtkeIjyRv1oDHQ==} + /@vitest/expect@1.2.2: + resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} dependencies: - '@vitest/spy': 1.1.2 - '@vitest/utils': 1.1.2 - chai: 4.3.10 + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 + chai: 4.4.1 dev: true - /@vitest/runner@1.1.2: - resolution: {integrity: sha512-oTqXCGtZzu9EaXq9cO/QDGnC721iryuTPs5rLyVZUJsdm33IQeIOwTRIWUB7EYFwpJsI+qMiCiuGZS49+DP5hA==} + /@vitest/runner@1.2.2: + resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} dependencies: - '@vitest/utils': 1.1.2 + '@vitest/utils': 1.2.2 p-limit: 5.0.0 - pathe: 1.1.1 + pathe: 1.1.2 dev: true - /@vitest/snapshot@1.1.2: - resolution: {integrity: sha512-hXXd5KjURGt6GCrmw55A+PNIlrOaE6x6KcdEANXac76xmvVbJZXSiNVJ1JuMCiyvLLTzdpPnrgWyCX9/CepFCQ==} + /@vitest/snapshot@1.2.2: + resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 + magic-string: 0.30.6 + pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.1.2: - resolution: {integrity: sha512-1Nn70K3oY00lhThDXsVQxjslUvJij1YQDzH/4FMxMLgjYxB5u4Aw4yXeICNSSap04wyV2dtGL3RqdBGwoR3sPA==} + /@vitest/spy@1.2.2: + resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} dependencies: tinyspy: 2.2.0 dev: true - /@vitest/ui@1.1.2(vitest@1.1.2): - resolution: {integrity: sha512-l+fPKIJWEwBHP1TUnBKkCVxWG26/LAc5VIkXFOyKaz/NWoHQBuNa4OArLMsREHYo5EhozzbKQMdZiJVPxjcajA==} + /@vitest/ui@1.2.2(vitest@1.2.2): + resolution: {integrity: sha512-CG+5fa8lyoBr+9i+UZGS31Qw81v33QlD10uecHxN2CLJVN+jLnqx4pGzGvFFeJ7jSnUCT0AlbmVWY6fU6NJZmw==} peerDependencies: vitest: ^1.0.0 dependencies: - '@vitest/utils': 1.1.2 + '@vitest/utils': 1.2.2 fast-glob: 3.3.2 fflate: 0.8.1 flatted: 3.2.9 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 sirv: 2.0.4 - vitest: 1.1.2(@types/node@20.10.6)(@vitest/ui@1.1.2)(jsdom@23.0.1)(terser@5.26.0) + vitest: 1.2.2(@types/node@20.11.16)(@vitest/ui@1.2.2)(jsdom@23.2.0)(terser@5.27.0) dev: true - /@vitest/utils@1.1.2: - resolution: {integrity: sha512-QrXfDieptshDkTkXnA+HmlVQto1h0jengbkSKcJjlbCMeXbSCr3AcALPPzozRQxEOKvFjqx9WHjljz62uxrGew==} + /@vitest/utils@1.2.2: + resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -2445,8 +2472,8 @@ packages: acorn: 8.11.3 dev: true - /acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} dev: true @@ -2656,8 +2683,8 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + /available-typed-arrays@1.0.6: + resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} engines: {node: '>= 0.4'} dev: true @@ -2680,6 +2707,12 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + dependencies: + require-from-string: 2.0.2 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2700,15 +2733,15 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + /browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001574 - electron-to-chromium: 1.4.620 + caniuse-lite: 1.0.30001583 + electron-to-chromium: 1.4.655 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) + update-browserslist-db: 1.0.13(browserslist@4.22.3) dev: true /buffer-from@1.1.2: @@ -2732,7 +2765,7 @@ packages: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + set-function-length: 1.2.0 dev: true /callsites@3.1.0: @@ -2740,16 +2773,16 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001574: - resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} + /caniuse-lite@1.0.30001583: + resolution: {integrity: sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==} dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: true - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 @@ -2834,7 +2867,7 @@ packages: engines: {node: '>=18'} dependencies: slice-ansi: 5.0.0 - string-width: 7.0.0 + string-width: 7.1.0 dev: true /client-only@0.0.1: @@ -2935,12 +2968,6 @@ packages: layout-base: 1.0.2 dev: true - /cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} - dependencies: - layout-base: 2.0.1 - dev: true - /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} dependencies: @@ -2966,13 +2993,21 @@ packages: which: 2.0.2 dev: true + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /cssstyle@3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} + /cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} dependencies: rrweb-cssom: 0.6.0 dev: true @@ -2989,15 +3024,6 @@ packages: cytoscape: 3.28.1 dev: true - /cytoscape-fcose@2.2.0(cytoscape@3.28.1): - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 - dependencies: - cose-base: 2.2.0 - cytoscape: 3.28.1 - dev: true - /cytoscape@3.28.1: resolution: {integrity: sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==} engines: {node: '>=0.10'} @@ -3058,7 +3084,7 @@ packages: resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} engines: {node: '>=12'} dependencies: - delaunator: 5.0.0 + delaunator: 5.0.1 dev: true /d3-dispatch@3.0.1: @@ -3366,7 +3392,7 @@ packages: side-channel: 1.0.4 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true /deep-is@0.1.4: @@ -3396,8 +3422,8 @@ packages: object-keys: 1.1.1 dev: true - /delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + /delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} dependencies: robust-predicates: 3.0.2 dev: true @@ -3477,8 +3503,8 @@ packages: dependencies: domelementtype: 2.3.0 - /dompurify@3.0.7: - resolution: {integrity: sha512-BViYTZoqP3ak/ULKOc101y+CtHDUvBsVgSxIF1ku0HmK6BRf+C03MC+tArMvOPtVtZp83DDh5puywKDu4sbVjQ==} + /dompurify@3.0.8: + resolution: {integrity: sha512-b7uwreMYL2eZhrSCRC4ahLTeZcPZxSmYfmcQGXGkXiZSNW1X85v+SDM5KsWcpivIiUBH47Ji7NtyUdpLeF5JZQ==} dev: true /domutils@3.1.0: @@ -3501,12 +3527,12 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.620: - resolution: {integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==} + /electron-to-chromium@1.4.655: + resolution: {integrity: sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg==} dev: true - /elkjs@0.8.2: - resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + /elkjs@0.9.1: + resolution: {integrity: sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ==} dev: true /emoji-regex@10.3.0: @@ -3539,7 +3565,7 @@ packages: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 + available-typed-arrays: 1.0.6 call-bind: 1.0.5 es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 @@ -3559,14 +3585,14 @@ packages: is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.2 string.prototype.trim: 1.2.8 string.prototype.trimend: 1.0.7 string.prototype.trimstart: 1.0.7 @@ -3575,7 +3601,7 @@ packages: typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true /es-get-iterator@1.1.3: @@ -3608,7 +3634,7 @@ packages: has-symbols: 1.0.3 internal-slot: 1.0.6 iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 + safe-array-concat: 1.1.0 dev: true /es-set-tostringtag@2.0.2: @@ -3616,7 +3642,7 @@ packages: engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 hasown: 2.0.0 dev: true @@ -3635,35 +3661,35 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.19.11 - '@esbuild/android-arm': 0.19.11 - '@esbuild/android-arm64': 0.19.11 - '@esbuild/android-x64': 0.19.11 - '@esbuild/darwin-arm64': 0.19.11 - '@esbuild/darwin-x64': 0.19.11 - '@esbuild/freebsd-arm64': 0.19.11 - '@esbuild/freebsd-x64': 0.19.11 - '@esbuild/linux-arm': 0.19.11 - '@esbuild/linux-arm64': 0.19.11 - '@esbuild/linux-ia32': 0.19.11 - '@esbuild/linux-loong64': 0.19.11 - '@esbuild/linux-mips64el': 0.19.11 - '@esbuild/linux-ppc64': 0.19.11 - '@esbuild/linux-riscv64': 0.19.11 - '@esbuild/linux-s390x': 0.19.11 - '@esbuild/linux-x64': 0.19.11 - '@esbuild/netbsd-x64': 0.19.11 - '@esbuild/openbsd-x64': 0.19.11 - '@esbuild/sunos-x64': 0.19.11 - '@esbuild/win32-arm64': 0.19.11 - '@esbuild/win32-ia32': 0.19.11 - '@esbuild/win32-x64': 0.19.11 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 dev: true /escalade@3.1.1: @@ -3685,8 +3711,8 @@ packages: engines: {node: '>=12'} dev: true - /eslint-config-next@14.0.4(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==} + /eslint-config-next@14.1.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -3694,13 +3720,13 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 14.0.4 - '@rushstack/eslint-patch': 1.6.1 - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@next/eslint-plugin-next': 14.1.0 + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-react: 7.33.2(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) @@ -3729,7 +3755,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3739,8 +3765,8 @@ packages: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -3752,7 +3778,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -3773,16 +3799,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -3792,7 +3818,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -3801,7 +3827,7 @@ packages: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.20.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -3823,7 +3849,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -3898,7 +3924,7 @@ packages: '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -3919,7 +3945,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -3979,7 +4005,7 @@ packages: /estree-util-build-jsx@2.2.2: resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} dependencies: - '@types/estree-jsx': 1.0.3 + '@types/estree-jsx': 1.0.4 estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 dev: true @@ -3991,7 +4017,7 @@ packages: /estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: - '@types/estree-jsx': 1.0.3 + '@types/estree-jsx': 1.0.4 astring: 1.8.6 source-map: 0.7.4 dev: true @@ -4006,7 +4032,7 @@ packages: /estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: - '@types/estree-jsx': 1.0.3 + '@types/estree-jsx': 1.0.4 '@types/unist': 2.0.10 dev: true @@ -4087,8 +4113,8 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + /fastq@1.17.0: + resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} dependencies: reusify: 1.0.4 dev: true @@ -4140,8 +4166,8 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /flexsearch@0.7.31: - resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + /flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} dev: true /focus-visible@5.2.0: @@ -4296,10 +4322,6 @@ packages: is-glob: 4.0.3 dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - /glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} @@ -4312,17 +4334,6 @@ packages: path-scurry: 1.10.1 dev: true - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -4360,7 +4371,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.0 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -4428,8 +4439,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 @@ -4454,7 +4465,7 @@ packages: /hast-util-from-dom@5.0.0: resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 hastscript: 8.0.0 web-namespaces: 2.0.1 dev: true @@ -4462,7 +4473,7 @@ packages: /hast-util-from-html-isomorphic@2.0.0: resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 hast-util-from-dom: 5.0.0 hast-util-from-html: 2.0.1 unist-util-remove-position: 5.0.0 @@ -4471,7 +4482,7 @@ packages: /hast-util-from-html@2.0.1: resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 devlop: 1.1.0 hast-util-from-parse5: 8.0.1 parse5: 7.1.2 @@ -4482,11 +4493,11 @@ packages: /hast-util-from-parse5@8.0.1: resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 '@types/unist': 3.0.2 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.4.0 + property-information: 6.4.1 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 @@ -4495,25 +4506,25 @@ packages: /hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 dev: true /hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 dev: true - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + /hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 '@types/unist': 3.0.2 '@ungap/structured-clone': 1.2.0 hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 + mdast-util-to-hast: 13.1.0 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -4526,8 +4537,8 @@ packages: resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} dependencies: '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 + '@types/estree-jsx': 1.0.4 + '@types/hast': 2.3.10 '@types/unist': 2.0.10 comma-separated-tokens: 2.0.3 estree-util-attach-comments: 2.1.1 @@ -4535,7 +4546,7 @@ packages: hast-util-whitespace: 2.0.1 mdast-util-mdx-expression: 1.3.2 mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 unist-util-position: 4.0.4 @@ -4547,10 +4558,10 @@ packages: /hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -4559,7 +4570,7 @@ packages: /hast-util-to-text@4.0.0: resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 '@types/unist': 3.0.2 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 @@ -4572,10 +4583,10 @@ packages: /hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 dev: true @@ -4583,8 +4594,8 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true - /hls.js@1.4.14: - resolution: {integrity: sha512-UppQjyvPVclg+6t2KY/Rv03h0+bA5u6zwqVoz4LAC/L0fgYmIaCD7ZCrwe8WI1Gv01be1XL0QFsRbSdIHV/Wbw==} + /hls.js@1.5.3: + resolution: {integrity: sha512-gonnYpZ5bxuVdwpcbzfylUlNZ8917LjACUjpWXiaeo8zPAIDfPcMZjEQPy6CeeRSJbcg1P+aVqwxrXr2J+SeUg==} dev: false /html-encoding-sniffer@4.0.0: @@ -4649,10 +4660,10 @@ packages: hasBin: true dev: true - /i18next@23.7.16: - resolution: {integrity: sha512-SrqFkMn9W6Wb43ZJ9qrO6U2U4S80RsFMA7VYFSqp7oc7RllQOYDCdRfsse6A7Cq/V8MnpxKvJCYgM8++27n4Fw==} + /i18next@23.8.2: + resolution: {integrity: sha512-Z84zyEangrlERm0ZugVy4bIt485e/H8VecGUZkZWrH7BDePG6jT73QdL9EA1tRTTVVMpry/MgWIP1FjEn0DRXA==} dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 dev: false optional: true @@ -4663,8 +4674,8 @@ packages: safer-buffer: 2.1.2 dev: true - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} dev: true @@ -4745,7 +4756,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-array-buffer@3.0.2: @@ -4753,14 +4764,14 @@ packages: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-bigint@1.0.4: @@ -4774,7 +4785,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-buffer@2.0.5: @@ -4797,7 +4808,7 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-decimal@2.0.1: @@ -4841,7 +4852,7 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-glob@4.0.3: @@ -4868,7 +4879,7 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-number@7.0.0: @@ -4916,7 +4927,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-set@2.0.2: @@ -4949,7 +4960,7 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-symbol@1.0.4: @@ -4959,11 +4970,11 @@ packages: has-symbols: 1.0.3 dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true /is-weakmap@2.0.1: @@ -5061,8 +5072,8 @@ packages: argparse: 2.0.1 dev: true - /jsdom@23.0.1: - resolution: {integrity: sha512-2i27vgvlUsGEBO9+/kJQRbtqtm+191b5zAZrU/UezVmnC2dlDAFLgDYJvAEi94T4kjsRKkezEtLQTgsNEsW2lQ==} + /jsdom@23.2.0: + resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} engines: {node: '>=18'} peerDependencies: canvas: ^2.11.2 @@ -5070,7 +5081,8 @@ packages: canvas: optional: true dependencies: - cssstyle: 3.0.0 + '@asamuzakjp/dom-selector': 2.0.2 + cssstyle: 4.0.1 data-urls: 5.0.0 decimal.js: 10.4.3 form-data: 4.0.0 @@ -5078,7 +5090,6 @@ packages: http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 parse5: 7.1.2 rrweb-cssom: 0.6.0 saxes: 6.0.0 @@ -5128,8 +5139,8 @@ packages: hasBin: true dev: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} dev: true /jsx-ast-utils@3.3.5: @@ -5184,10 +5195,6 @@ packages: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} dev: true - /layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - dev: true - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5201,8 +5208,8 @@ packages: engines: {node: '>=14'} dev: true - /lint-staged@15.2.0: - resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} + /lint-staged@15.2.1: + resolution: {integrity: sha512-dhwAPnM85VdshybV9FWI/9ghTvMLoQLEXgVMx+ua2DN7mdfzd/tRfoU2yhMcBac0RHkofoxdnnJUokr8s4zKmQ==} engines: {node: '>=18.12.0'} hasBin: true dependencies: @@ -5211,7 +5218,7 @@ packages: debug: 4.3.4 execa: 8.0.1 lilconfig: 3.0.0 - listr2: 8.0.0 + listr2: 8.0.1 micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 @@ -5220,15 +5227,15 @@ packages: - supports-color dev: true - /listr2@8.0.0: - resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} engines: {node: '>=18.0.0'} dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.0.0 - rfdc: 1.3.0 + rfdc: 1.3.1 wrap-ansi: 9.0.0 dev: true @@ -5236,7 +5243,7 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.4.2 + mlly: 1.5.0 pkg-types: 1.0.3 dev: true @@ -5290,8 +5297,8 @@ packages: get-func-name: 2.0.2 dev: true - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: true @@ -5320,18 +5327,18 @@ packages: hasBin: true dev: true - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + /magic-string@0.30.6: + resolution: {integrity: sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /magicast@0.3.2: - resolution: {integrity: sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==} + /magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 source-map-js: 1.0.2 dev: true @@ -5351,11 +5358,11 @@ packages: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: true - /match-sorter@6.3.1: - resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + /match-sorter@6.3.3: + resolution: {integrity: sha512-sgiXxrRijEe0SzHKGX4HouCpfHRPnqteH42UdMEW7BlWy990ZkzcvonJGv4Uu9WE7Y1f8Yocm91+4qFPCbmNww==} dependencies: - '@babel/runtime': 7.23.7 - remove-accents: 0.4.2 + '@babel/runtime': 7.23.9 + remove-accents: 0.5.0 dev: true /mdast-util-definitions@5.1.2: @@ -5461,8 +5468,8 @@ packages: /mdast-util-mdx-expression@1.3.2: resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 + '@types/estree-jsx': 1.0.4 + '@types/hast': 2.3.10 '@types/mdast': 3.0.15 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 @@ -5473,8 +5480,8 @@ packages: /mdast-util-mdx-jsx@2.1.4: resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 + '@types/estree-jsx': 1.0.4 + '@types/hast': 2.3.10 '@types/mdast': 3.0.15 '@types/unist': 2.0.10 ccount: 2.0.1 @@ -5504,8 +5511,8 @@ packages: /mdast-util-mdxjs-esm@1.3.1: resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 + '@types/estree-jsx': 1.0.4 + '@types/hast': 2.3.10 '@types/mdast': 3.0.15 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 @@ -5523,7 +5530,7 @@ packages: /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 2.3.9 + '@types/hast': 2.3.10 '@types/mdast': 3.0.15 mdast-util-definitions: 5.1.2 micromark-util-sanitize-uri: 1.2.0 @@ -5533,10 +5540,10 @@ packages: unist-util-visit: 4.1.2 dev: true - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 '@types/mdast': 4.0.3 '@ungap/structured-clone': 1.2.0 devlop: 1.1.0 @@ -5544,6 +5551,7 @@ packages: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 + vfile: 6.0.1 dev: true /mdast-util-to-markdown@1.5.0: @@ -5565,6 +5573,10 @@ packages: '@types/mdast': 3.0.15 dev: true + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -5574,21 +5586,20 @@ packages: engines: {node: '>= 8'} dev: true - /mermaid@10.6.1: - resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==} + /mermaid@10.8.0: + resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 '@types/d3-scale-chromatic': 3.0.3 cytoscape: 3.28.1 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.28.1) - cytoscape-fcose: 2.2.0(cytoscape@3.28.1) d3: 7.8.5 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.10 - dompurify: 3.0.7 - elkjs: 0.8.2 + dompurify: 3.0.8 + elkjs: 0.9.1 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 @@ -5596,7 +5607,7 @@ packages: stylis: 4.3.1 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.2.0 + web-worker: 1.3.0 transitivePeerDependencies: - supports-color dev: true @@ -5829,8 +5840,8 @@ packages: micromark-util-types: 1.1.0 dev: true - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 @@ -5920,7 +5931,7 @@ packages: /micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 dev: true @@ -6035,11 +6046,11 @@ packages: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: false - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + /mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} dependencies: acorn: 8.11.3 - pathe: 1.1.1 + pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.3.2 dev: true @@ -6088,32 +6099,32 @@ packages: - supports-color dev: true - /next-seo@6.4.0(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): + /next-seo@6.4.0(next@14.1.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + next: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /next-themes@0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): + /next-themes@0.2.1(next@14.1.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + next: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /next@14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} + /next@14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -6127,70 +6138,69 @@ packages: sass: optional: true dependencies: - '@next/env': 14.0.4 + '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001574 + caniuse-lite: 1.0.30001583 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.7)(react@18.2.0) - watchpack: 2.4.0 + styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 14.0.4 - '@next/swc-darwin-x64': 14.0.4 - '@next/swc-linux-arm64-gnu': 14.0.4 - '@next/swc-linux-arm64-musl': 14.0.4 - '@next/swc-linux-x64-gnu': 14.0.4 - '@next/swc-linux-x64-musl': 14.0.4 - '@next/swc-win32-arm64-msvc': 14.0.4 - '@next/swc-win32-ia32-msvc': 14.0.4 - '@next/swc-win32-x64-msvc': 14.0.4 + '@next/swc-darwin-arm64': 14.1.0 + '@next/swc-darwin-x64': 14.1.0 + '@next/swc-linux-arm64-gnu': 14.1.0 + '@next/swc-linux-arm64-musl': 14.1.0 + '@next/swc-linux-x64-gnu': 14.1.0 + '@next/swc-linux-x64-musl': 14.1.0 + '@next/swc-win32-arm64-msvc': 14.1.0 + '@next/swc-win32-ia32-msvc': 14.1.0 + '@next/swc-win32-x64-msvc': 14.1.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: true - /nextra-theme-docs@2.13.2(next@14.0.4)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} + /nextra-theme-docs@2.13.3(next@14.1.0)(nextra@2.13.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B6xrnR86Gg4GzV56AomSwtmvSyAvnJz1xKOGGav1XKxkwvC8QeI17jdt/CqiKyIObJ+5bLqSFiKhaAZ5DYQP3g==} peerDependencies: next: '>=9.5.3' - nextra: 2.13.2 + nextra: 2.13.3 react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@headlessui/react': 1.7.18(react-dom@18.2.0)(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.1.0 escape-string-regexp: 5.0.0 - flexsearch: 0.7.31 + flexsearch: 0.7.43 focus-visible: 5.2.0 git-url-parse: 13.1.1 intersection-observer: 0.12.2 - match-sorter: 6.3.1 - next: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) - next-seo: 6.4.0(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) - next-themes: 0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) - nextra: 2.13.2(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + match-sorter: 6.3.3 + next: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0) + next-seo: 6.4.0(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) + next-themes: 0.2.1(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) + nextra: 2.13.3(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.1.0 zod: 3.22.4 dev: true - /nextra@2.13.2(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} + /nextra@2.13.3(next@14.1.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OBVuyQKh+oqrbVt0AosgNYnuReWuNrtJVEN7q18b/oEg2wEpuiq3UJfmIvGgOdNYc3zv3OYrzbcq7IhwtdHHEw==} engines: {node: '>=16'} peerDependencies: next: '>=9.5.3' react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@headlessui/react': 1.7.18(react-dom@18.2.0)(react@18.2.0) '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@napi-rs/simple-git': 0.1.9 + '@napi-rs/simple-git': 0.1.16 '@theguild/remark-mermaid': 0.0.5(react@18.2.0) '@theguild/remark-npm2yarn': 0.2.1 clsx: 2.1.0 @@ -6199,7 +6209,7 @@ packages: gray-matter: 4.0.3 katex: 0.16.9 lodash.get: 4.4.2 - next: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + next: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0) next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) p-limit: 3.1.0 react: 18.2.0 @@ -6281,10 +6291,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6507,7 +6513,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.1.0 + lru-cache: 10.2.0 minipass: 7.0.4 dev: true @@ -6516,8 +6522,8 @@ packages: engines: {node: '>=8'} dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true /pathval@1.1.1: @@ -6549,9 +6555,9 @@ packages: /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 + jsonc-parser: 3.2.1 + mlly: 1.5.0 + pathe: 1.1.2 dev: true /postcss@8.4.31: @@ -6563,8 +6569,8 @@ packages: source-map-js: 1.0.2 dev: true - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -6580,8 +6586,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + /prettier@3.2.4: + resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} engines: {node: '>=14'} hasBin: true dev: true @@ -6612,8 +6618,8 @@ packages: react-is: 16.13.1 dev: true - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + /property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} dev: true /protocols@2.0.1: @@ -6655,11 +6661,11 @@ packages: peerDependencies: react: '>=16.13.1' dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 react: 18.2.0 dev: false - /react-i18next@11.18.6(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0): + /react-i18next@11.18.6(i18next@23.8.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==} requiresBuild: true peerDependencies: @@ -6673,9 +6679,9 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 html-parse-stringify: 3.0.1 - i18next: 23.7.16 + i18next: 23.8.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -6698,7 +6704,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.46)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -6708,13 +6714,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.51 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.46)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.51)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.46)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -6724,16 +6730,16 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.51 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.46)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.46)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.51)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.51)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.46)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.46)(react@18.2.0) + use-callback-ref: 1.3.1(@types/react@18.2.51)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.51)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.46)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -6743,7 +6749,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.51 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -6771,7 +6777,7 @@ packages: /redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.23.7 + '@babel/runtime': 7.23.9 dev: false /reflect.getprototypeof@1.0.4: @@ -6801,7 +6807,7 @@ packages: /rehype-katex@7.0.0: resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 3.0.4 '@types/katex': 0.16.7 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.0 @@ -6816,7 +6822,7 @@ packages: peerDependencies: shiki: '*' dependencies: - '@types/hast': 2.3.9 + '@types/hast': 2.3.10 hash-obj: 4.0.0 parse-numeric-range: 1.3.0 shiki: 0.14.7 @@ -6825,8 +6831,8 @@ packages: /rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: - '@types/hast': 3.0.3 - hast-util-raw: 9.0.1 + '@types/hast': 3.0.4 + hast-util-raw: 9.0.2 vfile: 6.0.1 dev: true @@ -6881,14 +6887,14 @@ packages: /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/hast': 2.3.9 + '@types/hast': 2.3.10 '@types/mdast': 3.0.15 mdast-util-to-hast: 12.3.0 unified: 10.1.2 dev: true - /remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + /remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} dev: true /require-directory@2.1.1: @@ -6896,6 +6902,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true @@ -6940,8 +6951,8 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} dev: true /rimraf@3.0.2: @@ -6963,24 +6974,26 @@ packages: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: true - /rollup@4.9.2: - resolution: {integrity: sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==} + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.2 - '@rollup/rollup-android-arm64': 4.9.2 - '@rollup/rollup-darwin-arm64': 4.9.2 - '@rollup/rollup-darwin-x64': 4.9.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.2 - '@rollup/rollup-linux-arm64-gnu': 4.9.2 - '@rollup/rollup-linux-arm64-musl': 4.9.2 - '@rollup/rollup-linux-riscv64-gnu': 4.9.2 - '@rollup/rollup-linux-x64-gnu': 4.9.2 - '@rollup/rollup-linux-x64-musl': 4.9.2 - '@rollup/rollup-win32-arm64-msvc': 4.9.2 - '@rollup/rollup-win32-ia32-msvc': 4.9.2 - '@rollup/rollup-win32-x64-msvc': 4.9.2 + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 fsevents: 2.3.3 dev: true @@ -7005,8 +7018,8 @@ packages: mri: 1.2.0 dev: true - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.5 @@ -7015,8 +7028,9 @@ packages: isarray: 2.0.5 dev: true - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + /safe-regex-test@1.0.2: + resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -7035,7 +7049,7 @@ packages: htmlparser2: 8.0.2 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.4.32 + postcss: 8.4.33 dev: false /saxes@6.0.0: @@ -7077,11 +7091,12 @@ packages: lru-cache: 6.0.0 dev: true - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 @@ -7124,7 +7139,7 @@ packages: resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} dependencies: ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.0 + jsonc-parser: 3.2.1 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 dev: true @@ -7263,8 +7278,8 @@ packages: strip-ansi: 7.1.0 dev: true - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} dependencies: emoji-regex: 10.3.0 @@ -7376,7 +7391,7 @@ packages: inline-style-parser: 0.1.1 dev: true - /styled-jsx@5.1.1(@babel/core@7.23.7)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.23.9)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -7389,7 +7404,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 client-only: 0.0.1 react: 18.2.0 dev: true @@ -7446,8 +7461,8 @@ packages: engines: {node: '>=6'} dev: true - /terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} + /terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} engines: {node: '>=10'} hasBin: true dependencies: @@ -7474,12 +7489,12 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true - /tinypool@0.8.1: - resolution: {integrity: sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==} + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} engines: {node: '>=14.0.0'} dev: true @@ -7563,12 +7578,12 @@ packages: engines: {node: '>=6.10'} dev: true - /tsconfck@2.1.2(typescript@5.3.3): - resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} - engines: {node: ^14.13.1 || ^16 || >=18} + /tsconfck@3.0.1(typescript@5.3.3): + resolution: {integrity: sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==} + engines: {node: ^18 || >=20} hasBin: true peerDependencies: - typescript: ^4.3.5 || ^5.0.0 + typescript: ^5.0.0 peerDependenciesMeta: typescript: optional: true @@ -7621,7 +7636,7 @@ packages: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-byte-length@1.0.0: @@ -7631,18 +7646,18 @@ packages: call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-byte-offset@1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 + available-typed-arrays: 1.0.6 call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-length@1.0.4: @@ -7650,7 +7665,7 @@ packages: dependencies: call-bind: 1.0.5 for-each: 0.3.3 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typesafe-actions@5.1.0: @@ -7818,13 +7833,13 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): + /update-browserslist-db@1.0.13(browserslist@4.22.3): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.2 + browserslist: 4.22.3 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -7842,7 +7857,7 @@ packages: requires-port: 1.0.0 dev: true - /use-callback-ref@1.3.1(@types/react@18.2.46)(react@18.2.0): + /use-callback-ref@1.3.1(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} engines: {node: '>=10'} peerDependencies: @@ -7852,12 +7867,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.51 react: 18.2.0 tslib: 2.6.2 dev: false - /use-sidecar@1.1.2(@types/react@18.2.46)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.51)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -7867,7 +7882,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.51 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -7892,7 +7907,7 @@ packages: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 dev: true @@ -7943,16 +7958,16 @@ packages: vfile-message: 4.0.2 dev: true - /vite-node@1.1.2(@types/node@20.10.6)(terser@5.26.0): - resolution: {integrity: sha512-2S3Y7T68PMrBbFS2H9Oda2GeordkIU5gLx2toubxPUcFZ+LKZ9L6U69pLtofotwQUrb3NcUImP3fl9GfLplebA==} + /vite-node@1.2.2(@types/node@20.11.16)(terser@5.27.0): + resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.0.10(@types/node@20.10.6)(terser@5.26.0) + vite: 5.0.12(@types/node@20.11.16)(terser@5.27.0) transitivePeerDependencies: - '@types/node' - less @@ -7964,8 +7979,8 @@ packages: - terser dev: true - /vite-tsconfig-paths@4.2.3(typescript@5.3.3)(vite@5.0.10): - resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==} + /vite-tsconfig-paths@4.3.1(typescript@5.3.3)(vite@5.0.12): + resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -7974,15 +7989,15 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.2(typescript@5.3.3) - vite: 5.0.10(@types/node@20.10.6)(terser@5.26.0) + tsconfck: 3.0.1(typescript@5.3.3) + vite: 5.0.12(@types/node@20.11.16)(terser@5.27.0) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@5.0.10(@types/node@20.10.6)(terser@5.26.0): - resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} + /vite@5.0.12(@types/node@20.11.16)(terser@5.27.0): + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -8009,17 +8024,17 @@ packages: terser: optional: true dependencies: - '@types/node': 20.10.6 - esbuild: 0.19.11 - postcss: 8.4.32 - rollup: 4.9.2 - terser: 5.26.0 + '@types/node': 20.11.16 + esbuild: 0.19.12 + postcss: 8.4.33 + rollup: 4.9.6 + terser: 5.27.0 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.1.2(@types/node@20.10.6)(@vitest/ui@1.1.2)(jsdom@23.0.1)(terser@5.26.0): - resolution: {integrity: sha512-nEw58z0PFBARwo3hWx6aKmI0Rob2avL9Mt2IYW+5mH5dS4S39J+VLH9aG8x6KZIgyegdE1p7/3JjZ93FzVCsoQ==} + /vitest@1.2.2(@types/node@20.11.16)(@vitest/ui@1.2.2)(jsdom@23.2.0)(terser@5.27.0): + resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -8043,29 +8058,29 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.10.6 - '@vitest/expect': 1.1.2 - '@vitest/runner': 1.1.2 - '@vitest/snapshot': 1.1.2 - '@vitest/spy': 1.1.2 - '@vitest/ui': 1.1.2(vitest@1.1.2) - '@vitest/utils': 1.1.2 - acorn-walk: 8.3.1 + '@types/node': 20.11.16 + '@vitest/expect': 1.2.2 + '@vitest/runner': 1.2.2 + '@vitest/snapshot': 1.2.2 + '@vitest/spy': 1.2.2 + '@vitest/ui': 1.2.2(vitest@1.2.2) + '@vitest/utils': 1.2.2 + acorn-walk: 8.3.2 cac: 6.7.14 - chai: 4.3.10 + chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 - jsdom: 23.0.1 + jsdom: 23.2.0 local-pkg: 0.5.0 - magic-string: 0.30.5 - pathe: 1.1.1 + magic-string: 0.30.6 + pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 1.3.0 - tinybench: 2.5.1 - tinypool: 0.8.1 - vite: 5.0.10(@types/node@20.10.6)(terser@5.26.0) - vite-node: 1.1.2(@types/node@20.10.6)(terser@5.26.0) + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.0.12(@types/node@20.11.16)(terser@5.27.0) + vite-node: 1.2.2(@types/node@20.11.16)(terser@5.27.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8099,14 +8114,6 @@ packages: xml-name-validator: 5.0.0 dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: true @@ -8116,8 +8123,8 @@ packages: engines: {node: '>= 8'} dev: false - /web-worker@1.2.0: - resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + /web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} dev: true /webidl-conversions@3.0.1: @@ -8171,7 +8178,7 @@ packages: engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -8181,7 +8188,7 @@ packages: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true /which-collection@1.0.1: @@ -8193,15 +8200,15 @@ packages: is-weakset: 2.0.2 dev: true - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + /which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 + available-typed-arrays: 1.0.6 call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /which@1.3.1: @@ -8251,7 +8258,7 @@ packages: engines: {node: '>=18'} dependencies: ansi-styles: 6.2.1 - string-width: 7.0.0 + string-width: 7.1.0 strip-ansi: 7.1.0 dev: true diff --git a/public/manifest/annotations/annotations.json b/public/manifest/annotations/annotations.json new file mode 100644 index 00000000..12a4a534 --- /dev/null +++ b/public/manifest/annotations/annotations.json @@ -0,0 +1,110 @@ +{ + "@context": ["http://iiif.io/api/presentation/3/context.json"], + "id": "http://localhost:3000/manifest/newspaper/annotation_demo.json", + "items": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/manifest.json", + "label": { + "en": ["0219 - Using Caption and Subtitle Files with Video Content"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json", + "label": { + "en": ["0266 - Simplest annotation"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/manifest.json", + "label": { + "en": ["0019 - HTML in Annotations"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0021-tagging/manifest.json", + "label": { + "en": ["0021 - Simple Annotation - Tagging"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/manifest.json", + "label": { + "en": ["0261 - Annotation with a Non-Rectangular Polygon"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0258-tagging-external-resource/manifest.json", + "label": { + "en": ["0258 Tagging with an External Resource"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0326-annotating-image-layer/manifest.json", + "label": { + "en": ["0326 - Annotate a specific images or layers"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0135-annotating-point-in-canvas/manifest.json", + "label": { + "en": ["0135 - Annotating a specific point of an image"] + }, + "type": "Manifest" + }, + { + "id": "https://raw.githubusercontent.com/mathewjordan/iiif/main/manifest/recipes/0135-annotating-point-in-canvas.json", + "label": { + "en": ["0135 - Annotating a specific point of an image (FIXED)"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0139-geolocate-canvas-fragment/manifest.json", + "label": { + "en": ["0139 - Geographic coordinates"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0269-embedded-or-referenced-annotations/manifest.json", + "label": { + "en": ["0269 - Embedded or Referenced Annotations"] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0306-linking-annotations-to-manifests/manifest.json", + "label": { + "en": [ + "0306 - Linking external Annotations targeting a Canvas to a Manifest" + ] + }, + "type": "Manifest" + }, + { + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/manifest.json", + "label": { + "en": ["0377 - Image in annotations"] + }, + "type": "Manifest" + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1.json", + "label": { + "en": ["Local Newspaper Demo"] + }, + "type": "Manifest" + } + ], + "label": { + "en": ["Cookbook Annotation Examples"] + }, + "type": "Collection" +} diff --git a/public/manifest/newspaper/newspaper_collection.json b/public/manifest/newspaper/newspaper_collection.json new file mode 100644 index 00000000..a2f70070 --- /dev/null +++ b/public/manifest/newspaper/newspaper_collection.json @@ -0,0 +1,24 @@ +{ + "@context": ["http://iiif.io/api/presentation/3/context.json"], + "id": "http://localhost:3000/manifest/newspaper/newspaper_collection.json", + "type": "Collection", + "label": { + "de": ["Berliner Tageblatt"] + }, + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1.json", + "type": "Manifest", + "label": { + "de": ["1. Berliner Tageblatt - 1925-02-16"] + } + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2.json", + "type": "Manifest", + "label": { + "de": ["2. Berliner Tageblatt - 1925-03-13"] + } + } + ] +} diff --git a/public/manifest/newspaper/newspaper_issue_1.json b/public/manifest/newspaper/newspaper_issue_1.json new file mode 100644 index 00000000..bdcab997 --- /dev/null +++ b/public/manifest/newspaper/newspaper_issue_1.json @@ -0,0 +1,213 @@ +{ + "@context": ["http://iiif.io/api/presentation/3/context.json"], + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1.json", + "type": "Manifest", + "label": { + "de": ["1. Berliner Tageblatt - 1925-02-16"] + }, + "thumbnail": [ + { + "id": "https://api.europeana.eu/api/v2/thumbnail-by-url.json?uri=https%3A%2F%2Fiiif.europeana.eu%2Fimage%2F2YMIN6YXMQ6COVM5AO2XKB5KMCKPMT2YKEKNMAGHVRBIHOOY4AVA%2Fpresentation_images%2F9340afd0-ffe2-11e5-b68d-fa163e60dd72%2Fnode-2%2Fimage%2FSBB%2FBerliner_Tageblatt%2F1925%2F02%2F16%2F0%2FF_SBB_00001_19250216_054_079_0_001%2Ffull%2Ffull%2F0%2Fdefault.jpg&type=TEXT", + "type": "Image", + "format": "image/jpeg", + "height": 300, + "width": 300 + } + ], + "partOf": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_collection.json", + "type": "Collection", + "label": { + "de": ["Berliner Tageblatt"] + } + } + ], + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/canvas/i1p1", + "type": "Canvas", + "height": 5000, + "width": 3602, + "label": { + "none": ["p. 1"] + }, + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/annotation_page_painting/ap1", + "type": "AnnotationPage", + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/annotation/p1", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p1/full/max/0/default.jpg", + "type": "Image", + "format": "image/jpeg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p1", + "type": "ImageService3", + "profile": "level1" + } + ] + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p1" + } + ] + } + ], + "annotations": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json", + "type": "AnnotationPage", + "label": { + "en": ["Search results"] + }, + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-1", + "type": "Annotation", + "motivation": "highlighting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "de", + "value": "Berliner" + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=839,3259,118,27" + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-2", + "type": "Annotation", + "motivation": "highlighting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "de", + "value": "Berliner" + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=161,459,1063,329" + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-3", + "type": "Annotation", + "motivation": "highlighting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "de", + "value": "Berliner" + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=1942,1579,106,23" + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-4", + "type": "Annotation", + "motivation": "highlighting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "de", + "value": "„Berliner" + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=1608,4429,123,25" + } + ] + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json", + "type": "AnnotationPage", + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json-1", + "type": "Annotation", + "motivation": "commenting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "en", + "value": "This is a newspaper." + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p1" + } + ] + } + ] + }, + { + "id": "http://localhost:3000/manifest/newspaper/canvas/i1p2", + "type": "Canvas", + "height": 4999, + "width": 3536, + "label": { + "none": ["p. 2"] + }, + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/annotation_page_painting/ap2", + "type": "AnnotationPage", + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/annotation/p2", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2/full/max/0/default.jpg", + "type": "Image", + "format": "image/jpeg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2", + "type": "ImageService3", + "profile": "level1" + } + ] + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p2" + } + ] + } + ], + "annotations": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json", + "type": "AnnotationPage", + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json-1", + "type": "Annotation", + "label": { + "en": ["Search results"] + }, + "motivation": "highlighting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "de", + "value": "„Berliner" + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p2#xywh=1996,3996,122,26" + }, + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json-2", + "type": "Annotation", + "label": { + "en": ["Search results"] + }, + "motivation": "highlighting", + "body": { + "type": "TextualBody", + "format": "text/plain", + "language": "de", + "value": "Berliner" + }, + "target": "http://localhost:3000/manifest/newspaper/canvas/i1p2#xywh=2468,4313,106,26" + } + ] + } + ] + } + ] +} diff --git a/public/manifest/newspaper/newspaper_issue_2.json b/public/manifest/newspaper/newspaper_issue_2.json new file mode 100644 index 00000000..1c641b61 --- /dev/null +++ b/public/manifest/newspaper/newspaper_issue_2.json @@ -0,0 +1,180 @@ +{ + "@context": ["http://iiif.io/api/presentation/3/context.json"], + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2.json", + "items": [ + { + "annotations": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p1.json", + "items": [ + { + "body": { + "format": "text/plain", + "language": "de", + "type": "TextualBody", + "value": "Berliner" + }, + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p1.json-5", + "motivation": "highlighting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p1#xywh=184,558,1052,322", + "type": "Annotation" + }, + { + "body": { + "format": "text/plain", + "language": "de", + "type": "TextualBody", + "value": "Berliner" + }, + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p1.json-6", + "motivation": "highlighting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p1#xywh=2123,1645,117,27", + "type": "Annotation" + }, + { + "body": { + "format": "text/plain", + "language": "de", + "type": "TextualBody", + "value": "Berliner" + }, + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p1.json-7", + "motivation": "highlighting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p1#xywh=2399,2207,170,40", + "type": "Annotation" + } + ], + "label": { + "en": ["Search results"] + }, + "type": "AnnotationPage" + } + ], + "height": 5000, + "id": "http://localhost:3000/manifest/newspaper/canvas/i2p1", + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/annotation_page_painting/i2ap1", + "items": [ + { + "body": { + "format": "image/jpeg", + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-issue2-p1/full/max/0/default.jpg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-issue2-p1/", + "profile": "level1", + "type": "ImageService3" + } + ], + "type": "Image" + }, + "id": "http://localhost:3000/manifest/newspaper/annotation/i2p1", + "motivation": "painting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p1", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "label": { + "none": ["p. 1"] + }, + "type": "Canvas", + "width": 3517 + }, + { + "annotations": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p2.json", + "items": [ + { + "body": { + "format": "text/plain", + "language": "de", + "type": "TextualBody", + "value": "Berliner" + }, + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p2.json-1", + "label": { + "en": ["Search results"] + }, + "motivation": "highlighting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p2#xywh=1134,768,106,25", + "type": "Annotation" + }, + { + "body": { + "format": "text/plain", + "language": "de", + "type": "TextualBody", + "value": "Berliner" + }, + "id": "http://localhost:3000/manifest/newspaper/newspaper_issue_2-anno_p2.json-2", + "label": { + "en": ["Search results"] + }, + "motivation": "highlighting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p2#xywh=3301,4156,96,22", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "height": 5000, + "id": "http://localhost:3000/manifest/newspaper/canvas/i2p2", + "items": [ + { + "id": "http://localhost:3000/manifest/newspaper/annotation_page_painting/ap2", + "items": [ + { + "body": { + "format": "image/jpeg", + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-issue2-p2/full/max/0/default.jpg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-issue2-p2", + "profile": "level1", + "type": "ImageService3" + } + ], + "type": "Image" + }, + "id": "http://localhost:3000/manifest/newspaper/annotation/p2", + "motivation": "painting", + "target": "http://localhost:3000/manifest/newspaper/canvas/i2p2", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "label": { + "none": ["p. 2"] + }, + "type": "Canvas", + "width": 3502 + } + ], + "label": { + "de": ["Berliner Tageblatt - 1925-03-13"] + }, + "partOf": [ + { + "id": "http://localhost:3000/manifest/newspaper/newspaper_collection.json", + "type": "Collection" + } + ], + "thumbnail": [ + { + "format": "image/jpeg", + "height": 300, + "id": "https://api.europeana.eu/api/v2/thumbnail-by-url.json?uri=https%3A%2F%2Fiiif.europeana.eu%2Fimage%2F3UU6R3RRZZGU2VNISCQX7N474GR7X4VMGYBTIWV2SNCBRGSR2WAA%2Fpresentation_images%2Fea1ba210-ffd3-11e5-b68d-fa163e60dd72%2Fnode-2%2Fimage%2FSBB%2FBerliner_Tageblatt%2F1925%2F03%2F13%2F0%2FF_SBB_00001_19250313_054_123_0_001%2Ffull%2Ffull%2F0%2Fdefault.jpg&type=TEXT", + "type": "Image", + "width": 300 + } + ], + "type": "Manifest" +} diff --git a/src/components/Viewer/ImageViewer/ImageViewer.test.tsx b/src/components/Viewer/ImageViewer/ImageViewer.test.tsx index 87e94651..f4112f6c 100644 --- a/src/components/Viewer/ImageViewer/ImageViewer.test.tsx +++ b/src/components/Viewer/ImageViewer/ImageViewer.test.tsx @@ -21,6 +21,7 @@ describe("ImageViewer component", () => { height: 4440, }} hasPlaceholder={false} + annotationResources={[]} />, ); }); diff --git a/src/components/Viewer/ImageViewer/ImageViewer.tsx b/src/components/Viewer/ImageViewer/ImageViewer.tsx index d1894b8f..c797542f 100644 --- a/src/components/Viewer/ImageViewer/ImageViewer.tsx +++ b/src/components/Viewer/ImageViewer/ImageViewer.tsx @@ -1,17 +1,20 @@ import OSD, { osdImageTypes } from "src/components/Viewer/ImageViewer/OSD"; import React, { useEffect, useState } from "react"; +import { AnnotationResources } from "src/types/annotations"; import { LabeledIIIFExternalWebResource } from "src/types/presentation-3"; import { getImageServiceURI } from "src/lib/iiif"; interface ImageViewerProps { painting: LabeledIIIFExternalWebResource; hasPlaceholder: boolean; + annotationResources: AnnotationResources; } const ImageViewer: React.FC = ({ painting, hasPlaceholder, + annotationResources, }) => { const [imageType, setImageType] = useState(); const [uri, setUri] = useState(); @@ -32,6 +35,7 @@ const ImageViewer: React.FC = ({ key={uri} hasPlaceholder={hasPlaceholder} imageType={imageType} + annotationResources={annotationResources} /> ); }; diff --git a/src/components/Viewer/ImageViewer/OSD.test.tsx b/src/components/Viewer/ImageViewer/OSD.test.tsx index dd6cc7d0..691b47c1 100644 --- a/src/components/Viewer/ImageViewer/OSD.test.tsx +++ b/src/components/Viewer/ImageViewer/OSD.test.tsx @@ -2,24 +2,33 @@ import OSD, { osdImageTypes } from "./OSD"; import { render, screen } from "@testing-library/react"; import React from "react"; +import { ViewerProvider } from "src/context/viewer-context"; const props = { uri: "foobar", hasPlaceholder: false, imageType: "simpleImage" as osdImageTypes, + annotationResources: [], }; vi.mock("openseadragon", () => ({ default: () => { return { + addOverlaysToViewer: () => {}, addSimpleImage: () => {}, }; }, })); +vi.mock("src/lib/openseadragon-helpers.ts"); + describe("OSD", () => { test("renders an element with the 'clover-viewer-osd' class name", () => { - render(); + render( + + + , + ); expect(screen.getByTestId("clover-viewer-osd-wrapper")).toHaveClass( "clover-viewer-osd-wrapper", ); diff --git a/src/components/Viewer/ImageViewer/OSD.tsx b/src/components/Viewer/ImageViewer/OSD.tsx index 641fc273..86e916f8 100644 --- a/src/components/Viewer/ImageViewer/OSD.tsx +++ b/src/components/Viewer/ImageViewer/OSD.tsx @@ -5,11 +5,21 @@ import { } from "src/components/Viewer/ImageViewer/ImageViewer.styled"; import OpenSeadragon, { Options } from "openseadragon"; import React, { useEffect, useState } from "react"; -import { ViewerContextStore, useViewerState } from "src/context/viewer-context"; +import { + ViewerContextStore, + useViewerState, + useViewerDispatch, +} from "src/context/viewer-context"; import Controls from "src/components/Viewer/ImageViewer/Controls"; import { getInfoResponse } from "src/lib/iiif"; import { v4 as uuidv4 } from "uuid"; +import { addOverlaysToViewer } from "src/lib/openseadragon-helpers"; +import { + AnnotationNormalized, + type CanvasNormalized, +} from "@iiif/presentation-3"; +import { AnnotationResources } from "src/types/annotations"; export type osdImageTypes = "tiledImage" | "simpleImage" | undefined; @@ -17,13 +27,24 @@ interface OSDProps { uri: string | undefined; hasPlaceholder: boolean; imageType: osdImageTypes; + annotationResources: AnnotationResources; } -const OSD: React.FC = ({ uri, hasPlaceholder, imageType }) => { +const OSD: React.FC = ({ + uri, + hasPlaceholder, + imageType, + annotationResources, +}) => { const [osdUri, setOsdUri] = useState(); const [osdInstance, setOsdInstance] = useState(); const viewerState: ViewerContextStore = useViewerState(); - const { configOptions } = viewerState; + const { configOptions, vault, activeCanvas } = viewerState; + const dispatch: any = useViewerDispatch(); + const canvas: CanvasNormalized = vault.get({ + id: activeCanvas, + type: "Canvas", + }); const config: Options = { id: `openseadragon-viewport-${osdInstance}`, @@ -51,6 +72,13 @@ const OSD: React.FC = ({ uri, hasPlaceholder, imageType }) => { ajaxWithCredentials: configOptions.withCredentials, }; + const annotations: Array = []; + + annotationResources[0]?.items?.forEach((item) => { + const annotationResource = vault.get(item.id); + annotations.push(annotationResource as unknown as AnnotationNormalized); + }); + useEffect(() => { if (uri !== osdUri) { setOsdUri(uri); @@ -62,16 +90,32 @@ const OSD: React.FC = ({ uri, hasPlaceholder, imageType }) => { if (osdUri) { switch (imageType) { case "simpleImage": - OpenSeadragon(config).addSimpleImage({ + const viewer = OpenSeadragon(config); + viewer.addSimpleImage({ url: osdUri, }); + dispatch({ + type: "updateOpenSeadragonViewer", + openSeadragonViewer: viewer, + }); + if (configOptions.annotationOverlays?.renderOverlays) { + addOverlaysToViewer(viewer, canvas, configOptions, annotations); + } break; case "tiledImage": - getInfoResponse(osdUri).then((tileSource) => - OpenSeadragon(config).addTiledImage({ + getInfoResponse(osdUri).then((tileSource) => { + const viewer = OpenSeadragon(config); + viewer.addTiledImage({ tileSource: tileSource, - }), - ); + }); + dispatch({ + type: "updateOpenSeadragonViewer", + openSeadragonViewer: viewer, + }); + if (configOptions.annotationOverlays?.renderOverlays) { + addOverlaysToViewer(viewer, canvas, configOptions, annotations); + } + }); break; default: console.warn( diff --git a/src/components/Viewer/InformationPanel/Annotation/HTML.test.tsx b/src/components/Viewer/InformationPanel/Annotation/HTML.test.tsx new file mode 100644 index 00000000..b6b94e1f --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/HTML.test.tsx @@ -0,0 +1,36 @@ +import { render, screen } from "@testing-library/react"; + +import AnnotationItemHTML from "./HTML"; +import React from "react"; +import userEvent from "@testing-library/user-event"; + +const user = userEvent.setup(); + +const props = { + value: ` +

Foo bar label here and this is a link

+ `, + handleClick: vitest.fn(), +}; + +describe("AnnotationItemHTML", () => { + it("should render the component", () => { + render(); + expect(screen.getByText("Foo bar label here and")).toBeInTheDocument(); + expect(screen.getByText("this is a link")).toHaveAttribute( + `href`, + `https://www.northwestern.edu`, + ); + }); + + it("should handle the click event", async () => { + const handleClick = vitest.fn(); + + render( + , + ); + const el = screen.getByText("Foo bar label", { exact: false }); + await user.click(el); + expect(handleClick).toHaveBeenCalled(); + }); +}); diff --git a/src/components/Viewer/InformationPanel/Annotation/HTML.tsx b/src/components/Viewer/InformationPanel/Annotation/HTML.tsx new file mode 100644 index 00000000..bbbb3b9a --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/HTML.tsx @@ -0,0 +1,21 @@ +import { ItemHTMLWrapper } from "./Item.styled"; +import React from "react"; + +type AnnotationItemHTMLProps = { + value: string; + handleClick: (e) => void; +}; + +const AnnotationItemHTML: React.FC = ({ + value, + handleClick, +}) => { + return ( + + ); +}; + +export default AnnotationItemHTML; diff --git a/src/components/Viewer/InformationPanel/Annotation/Image.test.tsx b/src/components/Viewer/InformationPanel/Annotation/Image.test.tsx new file mode 100644 index 00000000..fda25e27 --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Image.test.tsx @@ -0,0 +1,27 @@ +import { render, screen } from "@testing-library/react"; + +import AnnotationItemImage from "./Image"; +import React from "react"; + +const props = { + caption: "Foo bar", + handleClick: vitest.fn(), + imageUri: "https://example.com/image.jpg", +}; + +describe("AnnotationItemImage", () => { + it("should render the Image and text caption", () => { + render(); + expect(screen.getByText("Foo bar")).toBeInTheDocument(); + const imageEl = screen.getByAltText( + `A visual annotation for ${props.caption}`, + ); + expect(imageEl).toHaveAttribute("src", props.imageUri); + }); + + it("should handle the click event", () => { + render(); + screen.getByText("Foo bar").click(); + expect(props.handleClick).toHaveBeenCalledOnce(); + }); +}); diff --git a/src/components/Viewer/InformationPanel/Annotation/Image.tsx b/src/components/Viewer/InformationPanel/Annotation/Image.tsx new file mode 100644 index 00000000..a28d10b6 --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Image.tsx @@ -0,0 +1,23 @@ +import { ButtonStyled } from "./Item.styled"; +import React from "react"; + +type AnnotationItemImageProps = { + caption: string; + handleClick: (e) => void; + imageUri: string; +}; + +const AnnotationItemImage: React.FC = ({ + caption, + handleClick, + imageUri, +}) => { + return ( + + {`A + {caption} + + ); +}; + +export default AnnotationItemImage; diff --git a/src/components/Viewer/InformationPanel/Annotation/Item.styled.tsx b/src/components/Viewer/InformationPanel/Annotation/Item.styled.tsx new file mode 100644 index 00000000..6143a27c --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Item.styled.tsx @@ -0,0 +1,44 @@ +import { CSS, styled } from "src/styles/stitches.config"; + +const annotationItemRow: CSS = { + position: "relative", + cursor: "pointer", + display: "flex", + width: "100%", + justifyContent: "space-between", + textAlign: "left", + margin: "0", + padding: "0.5rem 1.618rem", + fontFamily: "inherit", + lineHeight: "1.25em", + fontSize: "1rem", + color: "inherit", + border: "none", + background: "none", +}; + +const ButtonStyled = styled("button", { + textAlign: "left", + + "&:hover": { + color: "$accent", + }, +}); + +const Group = styled("div", { + display: "flex", + flexDirection: "column", + width: "100%", +}); + +const Item = styled("div", { + ...annotationItemRow, +}); + +const ItemHTMLWrapper = styled("div", { + "&:hover": { + color: "$accent", + }, +}); + +export { annotationItemRow, ButtonStyled, Group, Item, ItemHTMLWrapper }; diff --git a/src/components/Viewer/InformationPanel/Annotation/Item.test.tsx b/src/components/Viewer/InformationPanel/Annotation/Item.test.tsx new file mode 100644 index 00000000..9164c8bc --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Item.test.tsx @@ -0,0 +1,91 @@ +import { ViewerProvider, defaultState } from "src/context/viewer-context"; +import { render, screen } from "@testing-library/react"; + +import AnnotationItem from "./Item"; +import AnnotationItemHTML from "./HTML"; +import AnnotationItemImage from "./Image"; +import AnnotationItemPlainText from "./PlainText"; +import AnnotationItemVTT from "./VTT/VTT"; +import { AnnotationNormalized } from "@iiif/presentation-3"; +import React from "react"; +import { Vault } from "@iiif/vault"; +import htmlAnnotationManifest from "src/fixtures/iiif-cookbook/0019-html-in-annotations.json"; +import imageInAnntationManifest from "src/fixtures/iiif-cookbook/0377-image-in-annotation.json"; +import simpleAnnotationManifest from "src/fixtures/iiif-cookbook/simple-annotation.json"; +import vttAnnotationManifest from "src/fixtures/iiif-cookbook/0219-using-caption-file.json"; + +vi.mock("src/components/Viewer/InformationPanel/Annotation/HTML"); +vi.mocked(AnnotationItemHTML).mockReturnValue(
HTML
); + +vi.mock("src/components/Viewer/InformationPanel/Annotation/Image"); +vi.mocked(AnnotationItemImage).mockReturnValue(
Image
); + +vi.mock("src/components/Viewer/InformationPanel/Annotation/PlainText"); +vi.mocked(AnnotationItemPlainText).mockReturnValue(
Plain Text
); + +vi.mock("src/components/Viewer/InformationPanel/Annotation/VTT/VTT"); +vi.mocked(AnnotationItemVTT).mockReturnValue(
VTT
); + +describe("AnnotationItem", () => { + let vault: Vault; + + beforeEach(() => { + vault = new Vault(); + }); + + it("should render a plain text annotation item", async () => { + await vault.loadManifest("", simpleAnnotationManifest); + const mockAnnotation: AnnotationNormalized = vault.get( + "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2/anno-1", + ); + + render( + + + , + ); + expect(screen.getByText("Plain Text")).toBeInTheDocument(); + }); + + it("should render an HTML annotation item", async () => { + await vault.loadManifest("", htmlAnnotationManifest); + const mockAnnotation: AnnotationNormalized = vault.get( + "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1/annopage-2/anno-1", + ); + + render( + + + , + ); + expect(screen.getByText("HTML")).toBeInTheDocument(); + }); + + it("should render an image annotation item", async () => { + await vault.loadManifest("", imageInAnntationManifest); + const mockAnnotation: AnnotationNormalized = vault.get( + "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2/anno-1", + ); + + render( + + + , + ); + expect(screen.getByText("Image")).toBeInTheDocument(); + }); + + it("should render an VTT annotation item", async () => { + await vault.loadManifest("", vttAnnotationManifest); + const mockAnnotation: AnnotationNormalized = vault.get( + "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2/a1", + ); + + render( + + + , + ); + expect(screen.getByText("VTT")).toBeInTheDocument(); + }); +}); diff --git a/src/components/Viewer/InformationPanel/Annotation/Item.tsx b/src/components/Viewer/InformationPanel/Annotation/Item.tsx new file mode 100644 index 00000000..f5438428 --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Item.tsx @@ -0,0 +1,111 @@ +import React from "react"; +import { Item as ItemStyled } from "src/components/Viewer/InformationPanel/Annotation/Item.styled"; +import { ViewerContextStore, useViewerState } from "src/context/viewer-context"; +import { + AnnotationNormalized, + type CanvasNormalized, + EmbeddedResource, + InternationalString, +} from "@iiif/presentation-3"; +import AnnotationItemPlainText from "./PlainText"; +import AnnotationItemHTML from "./HTML"; +import AnnotationItemVTT from "./VTT/VTT"; +import { parseAnnotationTarget } from "src/lib/annotation-helpers"; +import { createOpenSeadragonRect } from "src/lib/openseadragon-helpers"; +import AnnotationItemImage from "./Image"; + +type Props = { + annotation: AnnotationNormalized; +}; + +export const AnnotationItem: React.FC = ({ annotation }) => { + const { target } = annotation; + + const viewerState: ViewerContextStore = useViewerState(); + const { openSeadragonViewer, vault, activeCanvas, configOptions } = + viewerState; + + const annotationBody: Array< + EmbeddedResource & { + label?: InternationalString; + } + > = annotation.body.map((body) => vault.get(body.id)); + + const annotationBodyFormat = + annotationBody.find((body) => body.format)?.format || ""; + + const annotationBodyValue = + annotationBody.find((body) => body.value)?.value || ""; + + const canvas: CanvasNormalized = vault.get({ + id: activeCanvas, + type: "Canvas", + }); + + function handleClick() { + if (!target) return; + + const zoomLevel = configOptions.annotationOverlays?.zoomLevel || 1; + // @ts-ignore + const parsedAnnotationTarget = parseAnnotationTarget(target); + + const { point, rect, svg } = parsedAnnotationTarget; + + if (point || rect || svg) { + const rect = createOpenSeadragonRect( + canvas, + parsedAnnotationTarget, + zoomLevel, + ); + openSeadragonViewer?.viewport.fitBounds(rect); + } + } + + function renderItemBody() { + switch (annotationBodyFormat) { + case "text/plain": + return ( + + ); + case "text/html": + return ( + + ); + case "text/vtt": + return ( + + ); + case annotationBodyFormat.match(/^image\//)?.input: + const imageUri = + annotationBody.find((body) => !body.id?.includes("vault://"))?.id || + ""; + return ( + + ); + default: + return ( + + ); + } + } + + return {renderItemBody()}; +}; + +export default AnnotationItem; diff --git a/src/components/Viewer/InformationPanel/Annotation/Page.test.tsx b/src/components/Viewer/InformationPanel/Annotation/Page.test.tsx new file mode 100644 index 00000000..9f797d11 --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Page.test.tsx @@ -0,0 +1,76 @@ +import { ViewerProvider, defaultState } from "src/context/viewer-context"; +import { render, screen } from "@testing-library/react"; + +import { AnnotationPageNormalized } from "@iiif/presentation-3"; +import Page from "./Page"; +import React from "react"; +import { Vault } from "@iiif/vault"; +import simpleAnnotationManifest from "src/fixtures/iiif-cookbook/simple-annotation.json"; + +const props: { annotationPage: AnnotationPageNormalized } = { + annotationPage: { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2/anno-1", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, +}; + +describe("Page", () => { + const vault = new Vault(); + + it("should render the component", async () => { + await vault.loadManifest("", simpleAnnotationManifest); + + render( + + + , + ); + + const el = screen.getByTestId("annotation-page"); + + expect(el).toBeInTheDocument(); + expect(el.children.length).toBe(1); + }); + + it("should not render the component if no annotations exist on the canvas", async () => { + const newProps: { annotationPage: AnnotationPageNormalized } = { + annotationPage: { + ...props.annotationPage, + items: [], + }, + }; + + await vault.loadManifest("", simpleAnnotationManifest); + + render( + + + , + ); + + const el = screen.queryByTestId("annotation-page"); + expect(el).not.toBeInTheDocument(); + }); +}); diff --git a/src/components/Viewer/InformationPanel/Annotation/Page.tsx b/src/components/Viewer/InformationPanel/Annotation/Page.tsx new file mode 100644 index 00000000..b9bccd56 --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/Page.tsx @@ -0,0 +1,40 @@ +import { + AnnotationNormalized, + AnnotationPageNormalized, +} from "@iiif/presentation-3"; +import { ViewerContextStore, useViewerState } from "src/context/viewer-context"; + +import AnnotationItem from "src/components/Viewer/InformationPanel/Annotation/Item"; +import { Group } from "src/components/Viewer/InformationPanel/Annotation/Item.styled"; +import React from "react"; + +type Props = { + annotationPage: AnnotationPageNormalized; +}; +export const AnnotationPage: React.FC = ({ annotationPage }) => { + const viewerState: ViewerContextStore = useViewerState(); + const { vault } = viewerState; + + if ( + !annotationPage || + !annotationPage.items || + annotationPage.items?.length === 0 + ) + return <>; + + const annotations = annotationPage.items.map((item) => { + return vault.get(item.id) as AnnotationNormalized; + }); + + if (!annotations) return <>; + + return ( + + {annotations?.map((annotation) => ( + + ))} + + ); +}; + +export default AnnotationPage; diff --git a/src/components/Viewer/InformationPanel/Annotation/PlainText.test.tsx b/src/components/Viewer/InformationPanel/Annotation/PlainText.test.tsx new file mode 100644 index 00000000..b84723ae --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/PlainText.test.tsx @@ -0,0 +1,18 @@ +import { render, screen } from "@testing-library/react"; + +import AnnotationItemPlainText from "./PlainText"; +import React from "react"; + +describe("AnnotationItemPlainText", () => { + it("should render the component", () => { + render( {}} />); + expect(screen.getByText("Hello")).toBeInTheDocument(); + }); + + it("should handle the click event", () => { + const handleClick = vitest.fn(); + render(); + screen.getByText("Hello").click(); + expect(handleClick).toHaveBeenCalled(); + }); +}); diff --git a/src/components/Viewer/InformationPanel/Annotation/PlainText.tsx b/src/components/Viewer/InformationPanel/Annotation/PlainText.tsx new file mode 100644 index 00000000..962a0957 --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/PlainText.tsx @@ -0,0 +1,16 @@ +import { ButtonStyled } from "./Item.styled"; +import React from "react"; + +type AnnotationItemPlainTextProps = { + value: string; + handleClick: (e) => void; +}; + +const AnnotationItemPlainText: React.FC = ({ + value, + handleClick, +}) => { + return {value}; +}; + +export default AnnotationItemPlainText; diff --git a/src/components/Viewer/InformationPanel/Cue.styled.tsx b/src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled.tsx similarity index 88% rename from src/components/Viewer/InformationPanel/Cue.styled.tsx rename to src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled.tsx index 533a368a..70913a7c 100644 --- a/src/components/Viewer/InformationPanel/Cue.styled.tsx +++ b/src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled.tsx @@ -2,6 +2,8 @@ import * as RadioGroup from "@radix-ui/react-radio-group"; import { keyframes, styled } from "src/styles/stitches.config"; +import { annotationItemRow } from "src/components/Viewer/InformationPanel/Annotation/Item.styled"; + const spin = keyframes({ from: { transform: "rotate(360deg)" }, to: { transform: "rotate(0deg)" }, @@ -14,20 +16,7 @@ export const Group = styled(RadioGroup.Root, { }); export const Item = styled(RadioGroup.Item, { - position: "relative", - cursor: "pointer", - display: "flex", - width: "100%", - justifyContent: "space-between", - textAlign: "left", - margin: "0", - padding: "0.5rem 1.618rem", - fontFamily: "inherit", - lineHeight: "1.25em", - fontSize: "1rem", - color: "inherit", - border: "none", - background: "none", + ...annotationItemRow, "@sm": { padding: "0.5rem 1rem", diff --git a/src/components/Viewer/InformationPanel/Cue.test.tsx b/src/components/Viewer/InformationPanel/Annotation/VTT/Cue.test.tsx similarity index 70% rename from src/components/Viewer/InformationPanel/Cue.test.tsx rename to src/components/Viewer/InformationPanel/Annotation/VTT/Cue.test.tsx index b36c70ad..c042ac77 100644 --- a/src/components/Viewer/InformationPanel/Cue.test.tsx +++ b/src/components/Viewer/InformationPanel/Annotation/VTT/Cue.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from "@testing-library/react"; -import Cue from "src/components/Viewer/InformationPanel/Cue"; -import { Group } from "src/components/Viewer/InformationPanel/Cue.styled"; +import Cue from "src/components/Viewer/InformationPanel/Annotation/VTT/Cue"; +import { Group } from "src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled"; import React from "react"; describe("Information panel cue component", () => { diff --git a/src/components/Viewer/InformationPanel/Cue.tsx b/src/components/Viewer/InformationPanel/Annotation/VTT/Cue.tsx similarity index 92% rename from src/components/Viewer/InformationPanel/Cue.tsx rename to src/components/Viewer/InformationPanel/Annotation/VTT/Cue.tsx index 65c51ab9..fe6f28b9 100644 --- a/src/components/Viewer/InformationPanel/Cue.tsx +++ b/src/components/Viewer/InformationPanel/Annotation/VTT/Cue.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from "react"; -import { Item } from "src/components/Viewer/InformationPanel/Cue.styled"; +import { Item } from "src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled"; import { convertTime } from "src/lib/utils"; interface Props { diff --git a/src/components/Viewer/InformationPanel/Annotation/VTT/VTT.test.tsx b/src/components/Viewer/InformationPanel/Annotation/VTT/VTT.test.tsx new file mode 100644 index 00000000..902f1f0a --- /dev/null +++ b/src/components/Viewer/InformationPanel/Annotation/VTT/VTT.test.tsx @@ -0,0 +1,57 @@ +import { render, screen } from "@testing-library/react"; + +import AnnotationItemVTT from "./VTT"; +import Menu from "src/components/Viewer/InformationPanel/Menu"; +import React from "react"; + +vi.mock("src/components/Viewer/InformationPanel/Menu"); +vi.mocked(Menu).mockReturnValue(
Menu Component
); + +const props = { + label: { + en: ["Captions in WebVTT format"], + }, + vttUri: "https://example.com/image.jpg", +}; + +describe("AnnotationItemVTT", () => { + it("should render the component and aria-label caption", () => { + render(); + const el = screen.getByTestId("annotation-item-vtt"); + expect(el).toHaveAttribute( + "aria-label", + "navigate Captions in WebVTT format", + ); + }); + + it("should render the child Menu component", () => { + render(); + expect(screen.getByText("Menu Component")).toBeInTheDocument(); + }); + + it("should make a request to the provided URI", () => { + global.fetch = vitest.fn(() => + Promise.resolve( + new Response("WEBVTT\n\n1\n00:00:00.000 --> 00:00:01.000\nCaption"), + ), + ); + render(); + expect(global.fetch).toHaveBeenCalledTimes(1); + expect(global.fetch).toHaveBeenCalledWith("https://example.com/image.jpg", { + headers: { + "Content-Type": "text/plain", + Accept: "application/json", + }, + }); + }); + + it("should handle a failed network request to the provided URI", async () => { + global.fetch = vitest.fn(() => + Promise.reject(new Error("I am the error message")), + ); + render(); + expect(await screen.findByTestId("error-message")).toHaveTextContent( + "Network Error: Error: I am the error message", + ); + }); +}); diff --git a/src/components/Viewer/InformationPanel/Resource.tsx b/src/components/Viewer/InformationPanel/Annotation/VTT/VTT.tsx similarity index 55% rename from src/components/Viewer/InformationPanel/Resource.tsx rename to src/components/Viewer/InformationPanel/Annotation/VTT/VTT.tsx index da8cf7b7..f84cebf1 100644 --- a/src/components/Viewer/InformationPanel/Resource.tsx +++ b/src/components/Viewer/InformationPanel/Annotation/VTT/VTT.tsx @@ -4,25 +4,28 @@ import useWebVtt, { NodeWebVttCueNested, } from "src/hooks/use-webvtt"; -import { Group } from "src/components/Viewer/InformationPanel/Cue.styled"; +import { Group } from "src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled"; import { InternationalString } from "@iiif/presentation-3"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; import Menu from "src/components/Viewer/InformationPanel/Menu"; import { getLabel } from "src/hooks/use-iiif"; import { parse } from "node-webvtt"; -interface Resource { - resource: LabeledResource; -} +type AnnotationItemVTTProps = { + label: InternationalString | undefined; + vttUri: string; +}; -const Resource: React.FC = ({ resource }) => { +const AnnotationItemVTT: React.FC = ({ + label, + vttUri, +}) => { const [cues, setCues] = React.useState>([]); - const { id, label } = resource; const { createNestedCues, orderCuesByTime } = useWebVtt(); + const [isNetworkError, setIsNetworkError] = React.useState(); useEffect(() => { - if (id) - fetch(id, { + if (vttUri) + fetch(vttUri, { headers: { "Content-Type": "text/plain", Accept: "application/json", @@ -35,16 +38,25 @@ const Resource: React.FC = ({ resource }) => { const nestedCues = createNestedCues(orderedCues); setCues(nestedCues); }) - .catch((error) => console.error(id, error.toString())); - }, [id]); + .catch((error) => { + console.error(vttUri, error.toString()); + setIsNetworkError(error); + }); + }, [vttUri]); // NOTE: Do not include createNestedCues and orderCuesByTime in the dependency array as it will cause an infinite loop return ( + {isNetworkError && ( +
+ Network Error: {isNetworkError.toString()} +
+ )} ); }; -export default Resource; +export default AnnotationItemVTT; diff --git a/src/components/Viewer/InformationPanel/InformationPanel.test.tsx b/src/components/Viewer/InformationPanel/InformationPanel.test.tsx index 5a2318b2..d5d40741 100644 --- a/src/components/Viewer/InformationPanel/InformationPanel.test.tsx +++ b/src/components/Viewer/InformationPanel/InformationPanel.test.tsx @@ -1,22 +1,14 @@ -// Write a unit test for whether the InformationPanel component renders correctly and also renders an element with the 'clover-viewer-information-panel' class name. - import { render, screen } from "@testing-library/react"; import About from "src/components/Viewer/InformationPanel/About/About"; import InformationPanel from "src/components/Viewer/InformationPanel/InformationPanel"; import React from "react"; -import Resource from "./Resource"; const props = { activeCanvas: "foobar", resources: [], }; -vi.mock("src/components/Viewer/InformationPanel/Resource"); -vi.mocked(Resource).mockReturnValue( -
Resource
, -); - vi.mock("src/components/Viewer/InformationPanel/About/About"); vi.mocked(About).mockReturnValue(
About
); diff --git a/src/components/Viewer/InformationPanel/InformationPanel.tsx b/src/components/Viewer/InformationPanel/InformationPanel.tsx index 89d27fd5..2745ac8f 100644 --- a/src/components/Viewer/InformationPanel/InformationPanel.tsx +++ b/src/components/Viewer/InformationPanel/InformationPanel.tsx @@ -8,45 +8,47 @@ import { import React, { useEffect, useState } from "react"; import { ViewerContextStore, useViewerState } from "src/context/viewer-context"; +import AnnotationPage from "src/components/Viewer/InformationPanel/Annotation/Page"; +import { AnnotationResources } from "src/types/annotations"; import Information from "src/components/Viewer/InformationPanel/About/About"; +import { InternationalString } from "@iiif/presentation-3"; import { Label } from "src/components/Primitives"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; -import Resource from "src/components/Viewer/InformationPanel/Resource"; interface NavigatorProps { activeCanvas: string; - resources?: Array; + annotationResources?: AnnotationResources; } export const InformationPanel: React.FC = ({ activeCanvas, - resources, + annotationResources, }) => { const viewerState: ViewerContextStore = useViewerState(); - const { configOptions } = viewerState; - const { informationPanel } = configOptions; + const { + configOptions: { informationPanel }, + } = viewerState; const [activeResource, setActiveResource] = useState(); - const renderAbout = - informationPanel?.renderAbout || - configOptions?.informationPanel?.renderAbout; - const renderSupplementing = informationPanel?.renderSupplementing; + const renderAbout = informationPanel?.renderAbout; + const renderAnnotation = informationPanel?.renderAnnotation; useEffect(() => { if (renderAbout) { setActiveResource("manifest-about"); - } else if (resources && resources?.length > 0 && !renderAbout) { - setActiveResource(resources[0].id); + } else if ( + annotationResources && + annotationResources?.length > 0 && + !renderAbout + ) { + setActiveResource(annotationResources[0].id); } - }, [activeCanvas, renderAbout, resources]); + }, [activeCanvas, renderAbout, annotationResources]); const handleValueChange = (value: string) => { setActiveResource(value); }; - if (!resources) return <>; - return ( = ({ > {renderAbout && About} - {renderSupplementing && - resources && - resources.map(({ id, label }) => ( - - @@ -72,12 +75,13 @@ export const InformationPanel: React.FC = ({ )} - {renderSupplementing && - resources && - resources.map((resource) => { + + {renderAnnotation && + annotationResources && + annotationResources.map((annotationPage) => { return ( - - + + ); })} diff --git a/src/components/Viewer/InformationPanel/Menu.styled.tsx b/src/components/Viewer/InformationPanel/Menu.styled.tsx index eaa0aca0..bf8dbd7f 100644 --- a/src/components/Viewer/InformationPanel/Menu.styled.tsx +++ b/src/components/Viewer/InformationPanel/Menu.styled.tsx @@ -1,4 +1,4 @@ -import { Item } from "src/components/Viewer/InformationPanel/Cue.styled"; +import { Item } from "src/components/Viewer/InformationPanel/Annotation/VTT/Cue.styled"; import { styled } from "src/styles/stitches.config"; export const MenuStyled = styled("ul", { diff --git a/src/components/Viewer/InformationPanel/Menu.tsx b/src/components/Viewer/InformationPanel/Menu.tsx index 524ba616..9f6cb2b6 100644 --- a/src/components/Viewer/InformationPanel/Menu.tsx +++ b/src/components/Viewer/InformationPanel/Menu.tsx @@ -1,4 +1,4 @@ -import Cue from "src/components/Viewer/InformationPanel/Cue"; +import Cue from "src/components/Viewer/InformationPanel/Annotation/VTT/Cue"; import { MenuStyled } from "src/components/Viewer/InformationPanel/Menu.styled"; import { NodeWebVttCueNested } from "src/hooks/use-webvtt"; import React from "react"; diff --git a/src/components/Viewer/Painting/Painting.test.tsx b/src/components/Viewer/Painting/Painting.test.tsx index cb6f325e..7f7018b0 100644 --- a/src/components/Viewer/Painting/Painting.test.tsx +++ b/src/components/Viewer/Painting/Painting.test.tsx @@ -46,6 +46,7 @@ const defaultProps = { isMedia: false, painting, resources: [], + annotationResources: [], }; // Mock child components diff --git a/src/components/Viewer/Painting/Painting.tsx b/src/components/Viewer/Painting/Painting.tsx index f35fb21c..70914189 100644 --- a/src/components/Viewer/Painting/Painting.tsx +++ b/src/components/Viewer/Painting/Painting.tsx @@ -1,10 +1,10 @@ import { PaintingCanvas, PaintingStyled } from "./Painting.styled"; import { Select, SelectOption } from "src/components/internal/Select"; +import { AnnotationResources } from "src/types/annotations"; import { CanvasNormalized } from "@iiif/presentation-3"; import ImageViewer from "src/components/Viewer/ImageViewer/ImageViewer"; import { LabeledIIIFExternalWebResource } from "src/types/presentation-3"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; import PaintingPlaceholder from "./Placeholder"; import Player from "src/components/Viewer/Player/Player"; import React from "react"; @@ -12,17 +12,17 @@ import Toggle from "./Toggle"; import { useViewerState } from "src/context/viewer-context"; interface PaintingProps { - painting: LabeledIIIFExternalWebResource[]; - resources: LabeledResource[]; activeCanvas: string; + annotationResources: AnnotationResources; isMedia: boolean; + painting: LabeledIIIFExternalWebResource[]; } const Painting: React.FC = ({ activeCanvas, + annotationResources, isMedia, painting, - resources, }) => { const [annotationIndex, setAnnotationIndex] = React.useState(0); const [isInteractive, setIsInteractive] = React.useState(false); @@ -94,7 +94,7 @@ const Painting: React.FC = ({ ) : ( painting && ( @@ -102,6 +102,7 @@ const Painting: React.FC = ({ painting={painting[annotationIndex]} hasPlaceholder={hasPlaceholder} key={activeCanvas} + annotationResources={annotationResources} /> ) ))} diff --git a/src/components/Viewer/Player/Player.test.tsx b/src/components/Viewer/Player/Player.test.tsx index ccd1aaa0..4457177a 100644 --- a/src/components/Viewer/Player/Player.test.tsx +++ b/src/components/Viewer/Player/Player.test.tsx @@ -1,8 +1,8 @@ import { describe, it } from "vitest"; import { render, screen } from "@testing-library/react"; +import { AnnotationResources } from "src/types/annotations"; import { LabeledIIIFExternalWebResource } from "src/types/presentation-3"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; import Player from "src/components/Viewer/Player/Player"; import React from "react"; import { Vault } from "@iiif/vault"; @@ -45,12 +45,12 @@ describe("Player component", () => { duration: 268.776, }; - const resources = []; + const annotationResources = []; const props = { allSources: allSources as LabeledIIIFExternalWebResource[], painting: painting as LabeledIIIFExternalWebResource, - resources: resources as LabeledResource[], + annotationResources: annotationResources as AnnotationResources, }; const vault = new Vault(); @@ -69,6 +69,7 @@ describe("Player component", () => { informationOpen: false, isLoaded: false, vault, + openSeadragonViewer: null, }} > @@ -98,12 +99,12 @@ describe("Player component", () => { duration: 1985.024, }; - const resources = []; + const annotationResources = []; const props = { allSources: allSources as LabeledIIIFExternalWebResource[], painting: painting as LabeledIIIFExternalWebResource, - resources: resources as LabeledResource[], + annotationResources: annotationResources as AnnotationResources, }; const vault = new Vault(); @@ -122,6 +123,7 @@ describe("Player component", () => { informationOpen: false, isLoaded: false, vault, + openSeadragonViewer: null, }} > diff --git a/src/components/Viewer/Player/Player.tsx b/src/components/Viewer/Player/Player.tsx index 8b307c26..82d51b01 100644 --- a/src/components/Viewer/Player/Player.tsx +++ b/src/components/Viewer/Player/Player.tsx @@ -1,11 +1,11 @@ +import { AnnotationNormalized, CanvasNormalized } from "@iiif/presentation-3"; import Hls, { HlsConfig } from "hls.js"; import React, { useEffect } from "react"; import { ViewerContextStore, useViewerState } from "src/context/viewer-context"; +import { AnnotationResources } from "src/types/annotations"; import AudioVisualizer from "src/components/Viewer/Player/AudioVisualizer"; -import { CanvasNormalized } from "@iiif/presentation-3"; import { LabeledIIIFExternalWebResource } from "src/types/presentation-3"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; import { PlayerWrapper } from "src/components/Viewer/Player/Player.styled"; import Track from "src/components/Viewer/Player/Track"; import { getPaintingResource } from "src/hooks/use-iiif"; @@ -14,11 +14,15 @@ import { getPaintingResource } from "src/hooks/use-iiif"; interface PlayerProps { allSources: LabeledIIIFExternalWebResource[]; + annotationResources: AnnotationResources; painting: LabeledIIIFExternalWebResource; - resources: LabeledResource[]; } -const Player: React.FC = ({ allSources, resources, painting }) => { +const Player: React.FC = ({ + allSources, + annotationResources, + painting, +}) => { const [currentTime, setCurrentTime] = React.useState(0); const [poster, setPoster] = React.useState(); const playerRef = React.useRef(null); @@ -161,14 +165,33 @@ const Player: React.FC = ({ allSources, resources, painting }) => { {allSources.map((painting) => ( ))} - {resources.length > 0 && - resources.map((resource) => ( - - ))} + {annotationResources?.length > 0 && + annotationResources.map((annotationPage) => { + const annotationBodies: LabeledIIIFExternalWebResource[] = []; + + annotationPage.items.forEach((annotation) => { + const annotationNormalized = vault.get( + annotation.id, + ) as AnnotationNormalized; + + annotationNormalized.body.forEach((body) => { + const annotationBody = vault.get( + body.id, + ) as LabeledIIIFExternalWebResource; + annotationBodies.push(annotationBody); + }); + }); + + return annotationBodies.map((body) => { + return ( + + ); + }); + })} Sorry, your browser doesn't support embedded videos. diff --git a/src/components/Viewer/Player/Track.test.tsx b/src/components/Viewer/Player/Track.test.tsx index 13f422ed..88a8c4a0 100644 --- a/src/components/Viewer/Player/Track.test.tsx +++ b/src/components/Viewer/Player/Track.test.tsx @@ -1,9 +1,10 @@ -import React from "react"; import { render, screen } from "@testing-library/react"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; + +import { LabeledIIIFExternalWebResource } from "src/types/presentation-3"; +import React from "react"; import Track from "src/components/Viewer/Player/Track"; -const mockResourceCaptions: LabeledResource = { +const mockResourceCaptions: LabeledIIIFExternalWebResource = { id: "https://raw.githubusercontent.com/mathewjordan/mirador-playground/main/assets/iiif/supplementing/new_airliner_en.vtt", type: "Text", format: "text/vtt", @@ -11,7 +12,7 @@ const mockResourceCaptions: LabeledResource = { language: "en", }; -const mockResourceChapters: LabeledResource = { +const mockResourceChapters: LabeledIIIFExternalWebResource = { id: "https://raw.githubusercontent.com/mathewjordan/mirador-playground/main/assets/iiif/supplementing/new_airliner_en.vtt", type: "Text", format: "text/vtt", @@ -20,7 +21,7 @@ const mockResourceChapters: LabeledResource = { }; describe("Player component", () => { - it("Renders Video for caption resourc", async () => { + it("Renders Video for caption resource", async () => { render(); const el = await screen.findByTestId("player-track"); expect(el); @@ -40,7 +41,7 @@ describe("Player component", () => { />, ); - const el = await screen.queryByTestId("player-track"); + const el = screen.queryByTestId("player-track"); expect(el).not.toBeInTheDocument(); }); }); diff --git a/src/components/Viewer/Player/Track.tsx b/src/components/Viewer/Player/Track.tsx index 53e4c13b..35480e05 100644 --- a/src/components/Viewer/Player/Track.tsx +++ b/src/components/Viewer/Player/Track.tsx @@ -1,10 +1,10 @@ import { InternationalString } from "@iiif/presentation-3"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; +import { LabeledIIIFExternalWebResource } from "src/types/presentation-3"; import React from "react"; import { getLabel } from "src/hooks/use-iiif"; export interface TrackProps { - resource: LabeledResource; + resource: LabeledIIIFExternalWebResource; ignoreCaptionLabels: string[]; } diff --git a/src/components/Viewer/Viewer/Content.test.tsx b/src/components/Viewer/Viewer/Content.test.tsx index e302184f..c6f7ac23 100644 --- a/src/components/Viewer/Viewer/Content.test.tsx +++ b/src/components/Viewer/Viewer/Content.test.tsx @@ -21,6 +21,7 @@ const props = { activeCanvas: "foobar", painting: [], resources: [], + annotationResources: [], items: [], isAudioVideo: false, }; diff --git a/src/components/Viewer/Viewer/Content.tsx b/src/components/Viewer/Viewer/Content.tsx index 9e2cda07..a0f8d451 100644 --- a/src/components/Viewer/Viewer/Content.tsx +++ b/src/components/Viewer/Viewer/Content.tsx @@ -8,27 +8,27 @@ import { } from "src/components/Viewer/Viewer/Viewer.styled"; import { Canvas, IIIFExternalWebResource } from "@iiif/presentation-3"; +import { AnnotationResources } from "src/types/annotations"; import InformationPanel from "src/components/Viewer/InformationPanel/InformationPanel"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; import Media from "src/components/Viewer/Media/Media"; import Painting from "../Painting/Painting"; import React from "react"; import { useViewerState } from "src/context/viewer-context"; -interface Props { +interface ViewerContentProps { activeCanvas: string; - painting: IIIFExternalWebResource[]; - resources: LabeledResource[]; - items: Canvas[]; + annotationResources: AnnotationResources; isAudioVideo: boolean; + items: Canvas[]; + painting: IIIFExternalWebResource[]; } -const ViewerContent: React.FC = ({ +const ViewerContent: React.FC = ({ activeCanvas, - painting, - resources, - items, + annotationResources, isAudioVideo, + items, + painting, }) => { const { informationOpen, configOptions } = useViewerState(); const { informationPanel } = configOptions; @@ -40,7 +40,7 @@ const ViewerContent: React.FC = ({ const isAside = informationPanel?.renderAbout || - (informationPanel?.renderSupplementing && resources.length > 0); + (informationPanel?.renderAnnotation && annotationResources.length > 0); return ( = ({
{isAside && ( @@ -72,7 +72,7 @@ const ViewerContent: React.FC = ({ diff --git a/src/components/Viewer/Viewer/Viewer.tsx b/src/components/Viewer/Viewer/Viewer.tsx index c874617c..ac1126ce 100644 --- a/src/components/Viewer/Viewer/Viewer.tsx +++ b/src/components/Viewer/Viewer/Viewer.tsx @@ -12,14 +12,14 @@ import { useViewerState, } from "src/context/viewer-context"; import { + getAnnotationResources, getPaintingResource, - getSupplementingResources, } from "src/hooks/use-iiif"; +import { AnnotationResources } from "src/types/annotations"; import { ErrorBoundary } from "react-error-boundary"; import ErrorFallback from "src/components/Viewer/Viewer/ErrorFallback"; import { IIIFExternalWebResource } from "@iiif/presentation-3"; -import { LabeledResource } from "src/hooks/use-iiif/getSupplementingResources"; import ViewerContent from "src/components/Viewer/Viewer/Content"; import ViewerHeader from "src/components/Viewer/Viewer/Header"; import { Wrapper } from "src/components/Viewer/Viewer/Viewer.styled"; @@ -47,7 +47,8 @@ const Viewer: React.FC = ({ manifest, theme }) => { const [isInformationPanel, setIsInformationPanel] = useState(false); const [isAudioVideo, setIsAudioVideo] = useState(false); const [painting, setPainting] = useState([]); - const [resources, setResources] = useState([]); + const [annotationResources, setAnnotationResources] = + useState([]); const [isBodyLocked, setIsBodyLocked] = useBodyLocked(false); const isSmallViewport = useMediaQuery(media.sm); @@ -82,11 +83,7 @@ const Viewer: React.FC = ({ manifest, theme }) => { useEffect(() => { const painting = getPaintingResource(vault, activeCanvas); - const resources = getSupplementingResources( - vault, - activeCanvas, - "text/vtt", - ); + if (painting) { setIsAudioVideo( ["Sound", "Video"].indexOf(painting[0].type as ExternalResourceTypes) > @@ -96,9 +93,11 @@ const Viewer: React.FC = ({ manifest, theme }) => { ); setPainting(painting); } - setResources(resources); - setIsInformationPanel(resources.length !== 0); - }, [activeCanvas, vault]); + + setAnnotationResources(getAnnotationResources(vault, activeCanvas)); + + setIsInformationPanel(annotationResources.length !== 0); + }, [activeCanvas, annotationResources.length, vault]); return ( @@ -120,7 +119,7 @@ const Viewer: React.FC = ({ manifest, theme }) => { diff --git a/src/context/viewer-context.tsx b/src/context/viewer-context.tsx index 105b7643..b9c95bf0 100644 --- a/src/context/viewer-context.tsx +++ b/src/context/viewer-context.tsx @@ -2,11 +2,20 @@ import React, { useReducer } from "react"; import { CollectionNormalized } from "@iiif/presentation-3"; import { IncomingHttpHeaders } from "http"; -import { Options as OpenSeadragonOptions } from "openseadragon"; +import OpenSeadragon, { Options as OpenSeadragonOptions } from "openseadragon"; import { Vault } from "@iiif/vault"; import { deepMerge } from "src/lib/utils"; export type ViewerConfigOptions = { + annotationOverlays?: { + backgroundColor?: string; + borderColor?: string; + borderType?: string; + borderWidth?: string; + opacity?: string; + renderOverlays?: boolean; + zoomLevel?: number; + }; background?: string; canvasBackgroundColor?: string; canvasHeight?: string; @@ -16,6 +25,7 @@ export type ViewerConfigOptions = { renderAbout?: boolean; renderSupplementing?: boolean; renderToggle?: boolean; + renderAnnotation?: boolean; }; openSeadragon?: OpenSeadragonOptions; requestHeaders?: IncomingHttpHeaders; @@ -25,6 +35,15 @@ export type ViewerConfigOptions = { }; const defaultConfigOptions = { + annotationOverlays: { + backgroundColor: "#ff6666", + borderColor: "#990000", + borderType: "solid", + borderWidth: "1px", + opacity: "0.5", + renderOverlays: true, + zoomLevel: 2, + }, background: "transparent", canvasBackgroundColor: "#6662", canvasHeight: "61.8vh", @@ -34,6 +53,7 @@ const defaultConfigOptions = { renderAbout: true, renderSupplementing: true, renderToggle: true, + renderAnnotation: true, }, openSeadragon: {}, requestHeaders: { "Content-Type": "application/json" }, @@ -62,6 +82,7 @@ export interface ViewerContextStore { informationOpen: boolean; isLoaded: boolean; vault: Vault; + openSeadragonViewer: OpenSeadragon.Viewer | null; } export interface ViewerAction { @@ -73,6 +94,7 @@ export interface ViewerAction { isLoaded: boolean; manifestId: string; vault: Vault; + openSeadragonViewer: OpenSeadragon.Viewer; } export const defaultState: ViewerContextStore = { @@ -84,6 +106,7 @@ export const defaultState: ViewerContextStore = { informationOpen: defaultConfigOptions?.informationPanel?.open, isLoaded: false, vault: new Vault(), + openSeadragonViewer: null, }; const ViewerStateContext = @@ -133,6 +156,12 @@ function viewerReducer(state: ViewerContextStore, action: ViewerAction) { isLoaded: action.isLoaded, }; } + case "updateOpenSeadragonViewer": { + return { + ...state, + openSeadragonViewer: action.openSeadragonViewer, + }; + } default: { throw new Error(`Unhandled action type: ${action.type}`); } diff --git a/src/fixtures/iiif-cookbook/0019-html-in-annotations.json b/src/fixtures/iiif-cookbook/0019-html-in-annotations.json new file mode 100644 index 00000000..0c7de8c4 --- /dev/null +++ b/src/fixtures/iiif-cookbook/0019-html-in-annotations.json @@ -0,0 +1,64 @@ +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/manifest.json", + "items": [ + { + "annotations": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1/annopage-2", + "items": [ + { + "body": { + "format": "text/html", + "language": "de", + "type": "TextualBody", + "value": "

Göttinger Marktplatz mit Gänseliesel Brunnen Wikipedia logo

" + }, + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1/annopage-2/anno-1", + "motivation": "commenting", + "target": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "height": 3024, + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1", + "items": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1/annopage-1", + "items": [ + { + "body": { + "format": "image/jpeg", + "height": 3024, + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + "profile": "level1", + "type": "ImageService3" + } + ], + "type": "Image", + "width": 4032 + }, + "id": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1/annopage-1/anno-1", + "motivation": "painting", + "target": "https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "type": "Canvas", + "width": 4032 + } + ], + "label": { + "en": ["Picture of Göttingen taken during the 2019 IIIF Conference"] + }, + "type": "Manifest" +} diff --git a/src/fixtures/iiif-cookbook/0219-using-caption-file.json b/src/fixtures/iiif-cookbook/0219-using-caption-file.json new file mode 100644 index 00000000..f9c229f0 --- /dev/null +++ b/src/fixtures/iiif-cookbook/0219-using-caption-file.json @@ -0,0 +1,62 @@ +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/manifest.json", + "items": [ + { + "annotations": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2", + "items": [ + { + "body": { + "format": "text/vtt", + "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/lunchroom_manners.vtt", + "label": { + "en": ["Captions in WebVTT format"] + }, + "language": "en", + "type": "Text" + }, + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2/a1", + "motivation": "supplementing", + "target": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "duration": 572.034, + "height": 360, + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + "items": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page", + "items": [ + { + "body": { + "duration": 572.034, + "format": "video/mp4", + "height": 360, + "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4", + "type": "Video", + "width": 480 + }, + "id": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page/annotation1", + "motivation": "painting", + "target": "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "type": "Canvas", + "width": 480 + } + ], + "label": { + "en": ["Lunchroom Manners"] + }, + "type": "Manifest" +} diff --git a/src/fixtures/iiif-cookbook/0377-image-in-annotation.json b/src/fixtures/iiif-cookbook/0377-image-in-annotation.json new file mode 100644 index 00000000..192c775e --- /dev/null +++ b/src/fixtures/iiif-cookbook/0377-image-in-annotation.json @@ -0,0 +1,70 @@ +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/manifest.json", + "items": [ + { + "annotations": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2", + "items": [ + { + "body": [ + { + "format": "image/jpeg", + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-fountain/full/300,/0/default.jpg", + "type": "Image" + }, + { + "language": "en", + "type": "TextualBody", + "value": "Night picture of the Gänseliesel fountain in Göttingen taken during the 2019 IIIF Conference" + } + ], + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2/anno-1", + "motivation": "commenting", + "target": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1#xywh=138,550,1477,1710", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "height": 3024, + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1", + "items": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-1", + "items": [ + { + "body": { + "format": "image/jpeg", + "height": 3024, + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + "profile": "level1", + "type": "ImageService3" + } + ], + "type": "Image", + "width": 4032 + }, + "id": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-1/anno-1", + "motivation": "painting", + "target": "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "type": "Canvas", + "width": 4032 + } + ], + "label": { + "en": ["Picture of Göttingen taken during the 2019 IIIF Conference"] + }, + "type": "Manifest" +} diff --git a/src/fixtures/iiif-cookbook/simple-annotation.json b/src/fixtures/iiif-cookbook/simple-annotation.json new file mode 100644 index 00000000..687dce51 --- /dev/null +++ b/src/fixtures/iiif-cookbook/simple-annotation.json @@ -0,0 +1,64 @@ +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json", + "items": [ + { + "annotations": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2", + "items": [ + { + "body": { + "format": "text/plain", + "language": "de", + "type": "TextualBody", + "value": "Göttinger Marktplatz mit Gänseliesel Brunnen" + }, + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2/anno-1", + "motivation": "commenting", + "target": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "height": 3024, + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + "items": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-1", + "items": [ + { + "body": { + "format": "image/jpeg", + "height": 3024, + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + "profile": "level1", + "type": "ImageService3" + } + ], + "type": "Image", + "width": 4032 + }, + "id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-1/anno-1", + "motivation": "painting", + "target": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + "type": "Annotation" + } + ], + "type": "AnnotationPage" + } + ], + "type": "Canvas", + "width": 4032 + } + ], + "label": { + "en": ["Picture of Göttingen taken during the 2019 IIIF Conference"] + }, + "type": "Manifest" +} diff --git a/src/fixtures/openSeadragonHelpers.ts b/src/fixtures/openSeadragonHelpers.ts new file mode 100644 index 00000000..74da683e --- /dev/null +++ b/src/fixtures/openSeadragonHelpers.ts @@ -0,0 +1,59 @@ +import { CanvasNormalized } from "@iiif/presentation-3"; +import { ParsedAnnotationTarget } from "src/types/annotations"; + +export const openSeadragonHelpersCanvas: CanvasNormalized = { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1", + type: "Canvas", + label: null, + behavior: [], + motivation: null, + thumbnail: [], + posterCanvas: null, + accompanyingCanvas: null, + placeholderCanvas: null, + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + navDate: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/page/p1/1", + type: "AnnotationPage", + }, + ], + annotations: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/page/p2/1", + type: "AnnotationPage", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + partOf: [], + rendering: [], + service: [], + duration: 0, + height: 3024, + width: 4032, +}; + +export const openSeadragonHelpersRect: ParsedAnnotationTarget = { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1", + rect: { + x: 265, + y: 661, + w: 1260, + h: 1239, + }, +}; + +export const openSeadragonHelpersPoint: ParsedAnnotationTarget = { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1", + point: { + x: 500, + y: 700, + }, +}; diff --git a/src/fixtures/use-iiif/get-annotation-resources.ts b/src/fixtures/use-iiif/get-annotation-resources.ts new file mode 100644 index 00000000..259b9d02 --- /dev/null +++ b/src/fixtures/use-iiif/get-annotation-resources.ts @@ -0,0 +1,559 @@ +export const multipleHighlighting = { + "@context": ["http://iiif.io/api/presentation/3/context.json"], + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1.json", + type: "Manifest", + label: { + de: ["1. Berliner Tageblatt - 1925-02-16"], + }, + thumbnail: [ + { + id: "https://api.europeana.eu/api/v2/thumbnail-by-url.json?uri=https%3A%2F%2Fiiif.europeana.eu%2Fimage%2F2YMIN6YXMQ6COVM5AO2XKB5KMCKPMT2YKEKNMAGHVRBIHOOY4AVA%2Fpresentation_images%2F9340afd0-ffe2-11e5-b68d-fa163e60dd72%2Fnode-2%2Fimage%2FSBB%2FBerliner_Tageblatt%2F1925%2F02%2F16%2F0%2FF_SBB_00001_19250216_054_079_0_001%2Ffull%2Ffull%2F0%2Fdefault.jpg&type=TEXT", + type: "Image", + format: "image/jpeg", + height: 300, + width: 300, + }, + ], + partOf: [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_collection.json", + type: "Collection", + label: { + de: ["Berliner Tageblatt"], + }, + }, + ], + items: [ + { + id: "http://localhost:3000/manifest/newspaper/canvas/i1p1", + type: "Canvas", + height: 5000, + width: 3602, + label: { + none: ["p. 1"], + }, + items: [ + { + id: "http://localhost:3000/manifest/newspaper/annotation_page_painting/ap1", + type: "AnnotationPage", + items: [ + { + id: "http://localhost:3000/manifest/newspaper/annotation/p1", + type: "Annotation", + motivation: "painting", + body: { + id: "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p1/full/max/0/default.jpg", + type: "Image", + format: "image/jpeg", + service: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p1", + type: "ImageService3", + profile: "level1", + }, + ], + }, + target: "http://localhost:3000/manifest/newspaper/canvas/i1p1", + }, + ], + }, + ], + annotations: [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json", + type: "AnnotationPage", + items: [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-1", + type: "Annotation", + label: { + en: ["Search results"], + }, + motivation: "highlighting", + body: { + type: "TextualBody", + format: "text/plain", + language: "de", + value: "Berliner", + }, + target: + "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=839,3259,118,27", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-2", + type: "Annotation", + label: { + en: ["Search results"], + }, + motivation: "highlighting", + body: { + type: "TextualBody", + format: "text/plain", + language: "de", + value: "Berliner", + }, + target: + "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=161,459,1063,329", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-3", + type: "Annotation", + label: { + en: ["Search results"], + }, + motivation: "highlighting", + body: { + type: "TextualBody", + format: "text/plain", + language: "de", + value: "Berliner", + }, + target: + "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=1942,1579,106,23", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-4", + type: "Annotation", + label: { + en: ["Search results"], + }, + motivation: "highlighting", + body: { + type: "TextualBody", + format: "text/plain", + language: "de", + value: "„Berliner", + }, + target: + "http://localhost:3000/manifest/newspaper/canvas/i1p1#xywh=1608,4429,123,25", + }, + ], + }, + ], + }, + { + id: "http://localhost:3000/manifest/newspaper/canvas/i1p2", + type: "Canvas", + height: 4999, + width: 3536, + label: { + none: ["p. 2"], + }, + items: [ + { + id: "http://localhost:3000/manifest/newspaper/annotation_page_painting/ap2", + type: "AnnotationPage", + items: [ + { + id: "http://localhost:3000/manifest/newspaper/annotation/p2", + type: "Annotation", + motivation: "painting", + body: { + id: "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2/full/max/0/default.jpg", + type: "Image", + format: "image/jpeg", + service: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2", + type: "ImageService3", + profile: "level1", + }, + ], + }, + target: "http://localhost:3000/manifest/newspaper/canvas/i1p2", + }, + ], + }, + ], + annotations: [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json", + type: "AnnotationPage", + items: [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json-1", + type: "Annotation", + label: { + en: ["Search results"], + }, + motivation: "highlighting", + body: { + type: "TextualBody", + format: "text/plain", + language: "de", + value: "„Berliner", + }, + target: + "http://localhost:3000/manifest/newspaper/canvas/i1p2#xywh=1996,3996,122,26", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p2.json-2", + type: "Annotation", + label: { + en: ["Search results"], + }, + motivation: "highlighting", + body: { + type: "TextualBody", + format: "text/plain", + language: "de", + value: "Berliner", + }, + target: + "http://localhost:3000/manifest/newspaper/canvas/i1p2#xywh=2468,4313,106,26", + }, + ], + }, + ], + }, + ], +}; + +export const simpleAnnotations = { + "@context": "http://iiif.io/api/presentation/3/context.json", + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json", + type: "Manifest", + label: { + en: ["Picture of Göttingen taken during the 2019 IIIF Conference"], + }, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + type: "Canvas", + height: 3024, + width: 4032, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-1", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-1/anno-1", + type: "Annotation", + motivation: "painting", + body: { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + type: "Image", + format: "image/jpeg", + height: 3024, + width: 4032, + service: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + profile: "level1", + type: "ImageService3", + }, + ], + }, + target: + "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + }, + ], + }, + ], + annotations: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2/anno-1", + type: "Annotation", + motivation: "commenting", + body: { + type: "TextualBody", + language: "de", + format: "text/plain", + value: "Göttinger Marktplatz mit Gänseliesel Brunnen", + }, + target: + "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + }, + ], + }, + ], + }, + ], +}; + +export const simpleTagging = { + "@context": "http://iiif.io/api/presentation/3/context.json", + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/manifest.json", + type: "Manifest", + label: { + en: ["Picture of Göttingen taken during the 2019 IIIF Conference"], + }, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1", + type: "Canvas", + height: 3024, + width: 4032, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/page/p1/1", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/annotation/p0001-image", + type: "Annotation", + motivation: "painting", + body: { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + type: "Image", + format: "image/jpeg", + height: 3024, + width: 4032, + service: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + profile: "level1", + type: "ImageService3", + }, + ], + }, + target: + "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1", + }, + ], + }, + ], + annotations: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/page/p2/1", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/annotation/p0002-tag", + type: "Annotation", + motivation: "tagging", + body: { + type: "TextualBody", + value: "Gänseliesel-Brunnen", + language: "de", + format: "text/plain", + }, + target: + "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1#xywh=265,661,1260,1239", + }, + ], + }, + ], + }, + ], +}; + +export const nonRectangularPolygon = { + "@context": "http://iiif.io/api/presentation/3/context.json", + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/manifest.json", + type: "Manifest", + label: { + en: ["Picture of Göttingen taken during the 2019 IIIF Conference"], + }, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/canvas/p1", + type: "Canvas", + height: 3024, + width: 4032, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/page/p1/1", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/annotation/p0001-image", + type: "Annotation", + motivation: "painting", + body: { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + type: "Image", + format: "image/jpeg", + height: 3024, + width: 4032, + service: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + profile: "level1", + type: "ImageService3", + }, + ], + }, + target: + "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/canvas/p1", + }, + ], + }, + ], + annotations: [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/page/p2/1", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/annotation/p0002-svg", + type: "Annotation", + motivation: "tagging", + body: { + type: "TextualBody", + value: "Gänseliesel-Brunnen", + language: "de", + format: "text/plain", + }, + target: { + type: "SpecificResource", + source: + "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/canvas/p1", + selector: { + type: "SvgSelector", + value: + "", + }, + }, + }, + ], + }, + ], + }, + ], +}; + +export const imagesAnnotations = { + "@context": "http://iiif.io/api/presentation/3/context.json", + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/manifest.json", + type: "Manifest", + label: { + en: ["Picture of Göttingen taken during the 2019 IIIF Conference"], + }, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1", + type: "Canvas", + height: 3024, + width: 4032, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-1", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-1/anno-1", + type: "Annotation", + motivation: "painting", + body: { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", + type: "Image", + format: "image/jpeg", + height: 3024, + width: 4032, + service: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + profile: "level1", + type: "ImageService3", + }, + ], + }, + target: + "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1", + }, + ], + }, + ], + annotations: [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2/anno-1", + type: "Annotation", + motivation: "commenting", + body: [ + { + id: "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-fountain/full/300,/0/default.jpg", + type: "Image", + format: "image/jpeg", + }, + { + type: "TextualBody", + language: "en", + value: + "Night picture of the Gänseliesel fountain in Göttingen taken during the 2019 IIIF Conference", + }, + ], + target: + "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1#xywh=138,550,1477,1710", + }, + ], + }, + ], + }, + ], +}; + +// IIIF Cookbook recipe: https://iiif.io/api/cookbook/recipe/0219-using-caption-file/manifest.json +export const recipe0219captionFile = { + "@context": "http://iiif.io/api/presentation/3/context.json", + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/manifest.json", + type: "Manifest", + label: { + en: ["Lunchroom Manners"], + }, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + type: "Canvas", + height: 360, + width: 480, + duration: 572.034, + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page/annotation1", + type: "Annotation", + motivation: "painting", + body: { + id: "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4", + type: "Video", + height: 360, + width: 480, + duration: 572.034, + format: "video/mp4", + }, + target: + "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + }, + ], + }, + ], + annotations: [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2", + type: "AnnotationPage", + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2/a1", + type: "Annotation", + motivation: "supplementing", + body: { + id: "https://fixtures.iiif.io/video/indiana/lunchroom_manners/lunchroom_manners.vtt", + type: "Text", + format: "text/vtt", + label: { + en: ["Captions in WebVTT format"], + }, + language: "en", + }, + target: + "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + }, + ], + }, + ], + }, + ], +}; diff --git a/src/hooks/use-iiif/getAnnotationResources.test.ts b/src/hooks/use-iiif/getAnnotationResources.test.ts new file mode 100644 index 00000000..1dbf3792 --- /dev/null +++ b/src/hooks/use-iiif/getAnnotationResources.test.ts @@ -0,0 +1,280 @@ +import { + imagesAnnotations, + multipleHighlighting, + nonRectangularPolygon, + recipe0219captionFile, + simpleAnnotations, + simpleTagging, +} from "src/fixtures/use-iiif/get-annotation-resources"; + +import { Vault } from "@iiif/vault"; +import { getAnnotationResources } from "./getAnnotationResources"; +import { manifestNoAnnotations } from "src/fixtures/use-iiif/get-supplementing-resources"; + +describe("getAnnotationResources method", () => { + it("processes manifest with simple annotations", async () => { + const vault = new Vault(); + await vault.loadManifest("", simpleAnnotations); + + const result = getAnnotationResources( + vault, + "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1", + ); + + const expected = [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2/anno-1", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, + ]; + + expect(result).toStrictEqual(expected); + }); + + it("processes manifest with simple tagging annotations", async () => { + const vault = new Vault(); + await vault.loadManifest("", simpleTagging); + + const result = getAnnotationResources( + vault, + "https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1", + ); + + const expected = [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/page/p2/1", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/annotation/p0002-tag", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, + ]; + expect(result).toStrictEqual(expected); + }); + + it("processes manifest with non-rectangular polygon annotations", async () => { + const vault = new Vault(); + await vault.loadManifest("", nonRectangularPolygon); + + const result = getAnnotationResources( + vault, + "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/canvas/p1", + ); + + const expected = [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/page/p2/1", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/annotation/p0002-svg", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, + ]; + expect(result).toStrictEqual(expected); + }); + + it("processes manifest with multiple highlighting annotations", async () => { + const vault = new Vault(); + await vault.loadManifest("", multipleHighlighting); + + const result = getAnnotationResources( + vault, + "http://localhost:3000/manifest/newspaper/canvas/i1p1", + ); + + const expected = [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-1", + type: "Annotation", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-2", + type: "Annotation", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-3", + type: "Annotation", + }, + { + id: "http://localhost:3000/manifest/newspaper/newspaper_issue_1-anno_p1.json-4", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, + ]; + expect(result).toStrictEqual(expected); + }); + + it("processes manifest with images in the annotations", async () => { + const vault = new Vault(); + await vault.loadManifest("", imagesAnnotations); + + const result = getAnnotationResources( + vault, + "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1", + ); + + const expected = [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1/annopage-2/anno-1", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, + ]; + expect(result).toStrictEqual(expected); + }); + + it("returns an empty array if there are no annotations", async () => { + const vault = new Vault(); + await vault.loadManifest("", manifestNoAnnotations); + + const result = getAnnotationResources( + vault, + "https://api.dc.library.northwestern.edu/api/v2/works/57446da0-dc8b-4be6-998d-efb67c71f654?as=iiif/canvas/access/0", + ); + + expect(result).toHaveLength(0); + }); + + it("Processes a manifest with supplementing motivation (for example VTT)", async () => { + const vault = new Vault(); + await vault.loadManifest("", recipe0219captionFile); + + const expected = [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2", + type: "AnnotationPage", + behavior: [], + motivation: null, + label: { + none: ["Annotations"], + }, + thumbnail: [], + summary: null, + requiredStatement: null, + metadata: [], + rights: null, + provider: [], + items: [ + { + id: "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas/page2/a1", + type: "Annotation", + }, + ], + seeAlso: [], + homepage: [], + logo: [], + rendering: [], + service: [], + }, + ]; + + const result = getAnnotationResources( + vault, + "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/canvas", + ); + + expect(result).toStrictEqual(expected); + }); +}); diff --git a/src/hooks/use-iiif/getAnnotationResources.ts b/src/hooks/use-iiif/getAnnotationResources.ts new file mode 100644 index 00000000..02d67f33 --- /dev/null +++ b/src/hooks/use-iiif/getAnnotationResources.ts @@ -0,0 +1,37 @@ +import { AnnotationResources } from "src/types/annotations"; +import { CanvasNormalized } from "@iiif/presentation-3"; + +export type FormattedAnnotationItem = { + [k: string]: any; +}; + +export const getAnnotationResources = ( + vault: any, + activeCanvas: string, +): AnnotationResources => { + const canvas: CanvasNormalized = vault.get({ + id: activeCanvas, + type: "Canvas", + }); + + if (!canvas?.annotations || !canvas.annotations[0]) return []; + + const annotationPages: AnnotationResources = vault.get(canvas.annotations); + + /** + * Filter out annotation pages that don't have any Annotations in the items array. + */ + return annotationPages + .filter((annotationPage) => { + if (!annotationPage.items || !annotationPage.items.length) return false; + return annotationPage; + }) + .map((annotationPage) => { + /** + * If the annotation page doesn't have a label, add a default label. + * Set this value in a CONFIG and not here. + */ + const label = annotationPage.label || { none: ["Annotations"] }; + return { ...annotationPage, label }; + }); +}; diff --git a/src/hooks/use-iiif/getSupplementingResources.test.ts b/src/hooks/use-iiif/getSupplementingResources.test.ts deleted file mode 100644 index 26b60baa..00000000 --- a/src/hooks/use-iiif/getSupplementingResources.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - manifestNoAnnotations, - vttManifest, -} from "src/fixtures/use-iiif/get-supplementing-resources"; - -import { Vault } from "@iiif/vault"; -import { getSupplementingResources } from "./getSupplementingResources"; - -describe("getSupplementingResources", () => { - test("returns an empty array if there are no annotations", async () => { - const vault = new Vault(); - await vault.loadManifest("", manifestNoAnnotations); - - const result = getSupplementingResources( - vault, - "https://api.dc.library.northwestern.edu/api/v2/works/57446da0-dc8b-4be6-998d-efb67c71f654?as=iiif/canvas/access/0", - "text/vtt", - ); - - expect(result).toHaveLength(0); - }); - - test("returns an empty array if annotations is not an array in annotations page", async () => { - const vault = new Vault(); - const badAnnotationItems = { - id: "https://iiif.stack.rdc-staging.library.northwestern.edu/public/iiif3/9d/67/f8/c5/-1/a2/e-/4f/bd/-8/47/1-/4a/1a/fa/7d/6e/5a-manifest.json", - items: [ - { - annotations: [ - { - id: "https://iiif.stack.rdc-staging.library.northwestern.edu/public/iiif3/9d/67/f8/c5/-1/a2/e-/4f/bd/-8/47/1-/4a/1a/fa/7d/6e/5a-manifest.json/canvas/ca6a621f-d3dd-43b2-8aed-40fdfda4c024/annotation_page/a1", - items: "", - type: "AnnotationPage", - }, - ], - duration: 30.0, - height: 480, - id: "https://iiif.stack.rdc-staging.library.northwestern.edu/public/iiif3/9d/67/f8/c5/-1/a2/e-/4f/bd/-8/47/1-/4a/1a/fa/7d/6e/5a-manifest.json/canvas/ca6a621f-d3dd-43b2-8aed-40fdfda4c024", - items: [], - label: { - en: ["access mov"], - }, - type: "Canvas", - width: 640, - }, - ], - label: { - en: ["Canary Record TEST 2"], - }, - type: "Manifest", - "@context": "http://iiif.io/api/presentation/3/context.json", - }; - await vault.loadManifest("", badAnnotationItems); - - const result = getSupplementingResources( - vault, - "https://iiif.stack.rdc-staging.library.northwestern.edu/public/iiif3/9d/67/f8/c5/-1/a2/e-/4f/bd/-8/47/1-/4a/1a/fa/7d/6e/5a-manifest.json/canvas/ca6a621f-d3dd-43b2-8aed-40fdfda4c024", - "text/vtt", - ); - - expect(result).toHaveLength(0); - }); - - test("returns a filtered list of annotation bodies", async () => { - const vault = new Vault(); - await vault.loadManifest("", vttManifest); - - const result = getSupplementingResources( - vault, - "https://iiif.stack.rdc-staging.library.northwestern.edu/public/iiif3/9d/67/f8/c5/-1/a2/e-/4f/bd/-8/47/1-/4a/1a/fa/7d/6e/5a-manifest.json/canvas/ca6a621f-d3dd-43b2-8aed-40fdfda4c024", - "text/vtt", - ); - - expect(result).toHaveLength(1); - expect(result[0].id).toBe( - "https://iiif.stack.rdc-staging.library.northwestern.edu/public/vtt/ca/6a/62/1f/-d/3d/d-/43/b2/-8/ae/d-/40/fd/fd/a4/c0/24/ca6a621f-d3dd-43b2-8aed-40fdfda4c024.vtt", - ); - }); -}); diff --git a/src/hooks/use-iiif/getSupplementingResources.ts b/src/hooks/use-iiif/getSupplementingResources.ts deleted file mode 100644 index 22972927..00000000 --- a/src/hooks/use-iiif/getSupplementingResources.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - Annotation, - AnnotationPage, - CanvasNormalized, - ContentResource, - IIIFExternalWebResource, - InternationalString, -} from "@iiif/presentation-3"; - -export interface LabeledResource { - id?: string; - type: "Dataset" | "Image" | "Video" | "Sound" | "Text"; - format?: string; - label: InternationalString; - language?: string | string[]; - processingLanguage?: string; - textDirection?: "ltr" | "rtl" | "auto"; -} - -// Get webVtt annotations from activeCanvas -export const getSupplementingResources = ( - vault: any, - activeCanvas: string, - format: string, -): Array => { - const canvas: CanvasNormalized = vault.get({ - id: activeCanvas, - type: "Canvas", - }); - - if (!canvas?.annotations || !canvas.annotations[0]) return []; - - const annotationPage: AnnotationPage = vault.get(canvas.annotations[0]); - - const annotations: Annotation[] = vault.get(annotationPage.items); - if (!Array.isArray(annotations)) return []; - - return annotations - .filter((annotation) => { - if (!annotation.body) return; - if (annotation.motivation?.includes("supplementing")) { - let annotationBody = annotation.body as - | ContentResource - | ContentResource[]; - - if (Array.isArray(annotationBody)) annotationBody = annotationBody[0]; - - const resource: IIIFExternalWebResource = vault.get(annotationBody.id); - if (resource.format === format) { - annotation.body = resource; - return annotation; - } - } - }) - .map((filtered: Annotation) => { - return filtered.body as LabeledResource; - }); -}; diff --git a/src/hooks/use-iiif/index.ts b/src/hooks/use-iiif/index.ts index 7b6cd56f..ba584138 100644 --- a/src/hooks/use-iiif/index.ts +++ b/src/hooks/use-iiif/index.ts @@ -1,8 +1,8 @@ import { getAccompanyingCanvasImage } from "src/hooks/use-iiif/getAccompanyingCanvasImage"; +import { getAnnotationResources } from "src/hooks/use-iiif/getAnnotationResources"; import { getCanvasByCriteria } from "src/hooks/use-iiif/getCanvasByCriteria"; import { getLabel } from "src/hooks/use-iiif/getLabel"; import { getPaintingResource } from "src/hooks/use-iiif/getPaintingResource"; -import { getSupplementingResources } from "src/hooks/use-iiif/getSupplementingResources"; import { getThumbnail } from "src/hooks/use-iiif/getThumbnail"; export { @@ -10,6 +10,6 @@ export { getCanvasByCriteria, getLabel, getPaintingResource, - getSupplementingResources, getThumbnail, + getAnnotationResources, }; diff --git a/src/lib/annotation-helpers.ts b/src/lib/annotation-helpers.ts new file mode 100644 index 00000000..789bea7c --- /dev/null +++ b/src/lib/annotation-helpers.ts @@ -0,0 +1,59 @@ +import { AnnotationTarget } from "@iiif/presentation-3"; +import { ParsedAnnotationTarget } from "src/types/annotations"; + +type AnnotationTargetExtended = AnnotationTarget & { + selector?: any; + source?: string; + svg?: string; +}; + +const parseAnnotationTarget = (target: AnnotationTargetExtended | string) => { + let parsedTarget: ParsedAnnotationTarget = { + id: typeof target === "string" ? target : target.source, + }; + + if (typeof target === "string") { + if (target.includes("#xywh=")) { + const parts = target.split("#xywh="); + if (parts && parts[1]) { + const [x, y, w, h] = parts[1].split(",").map((value) => Number(value)); + parsedTarget = { + id: parts[0], + rect: { + x, + y, + w, + h, + }, + }; + } + } else if (target.includes("#t=")) { + const parts = target.split("#t="); + if (parts && parts[1]) { + parsedTarget = { + id: parts[0], + t: parts[1], + }; + } + } + } else if (typeof target === "object") { + if (target.selector?.type === "PointSelector") { + parsedTarget = { + id: target.source, + point: { + x: target.selector.x!, + y: target.selector.y!, + }, + }; + } else if (target.selector?.type === "SvgSelector") { + parsedTarget = { + id: target.source, + svg: target.selector.value, + }; + } + } + + return parsedTarget; +}; + +export { parseAnnotationTarget }; diff --git a/src/lib/openseadragon-helpers.test.ts b/src/lib/openseadragon-helpers.test.ts new file mode 100644 index 00000000..d1c80b2c --- /dev/null +++ b/src/lib/openseadragon-helpers.test.ts @@ -0,0 +1,217 @@ +import { + addOverlaysToViewer, + createOpenSeadragonRect, +} from "./openseadragon-helpers"; +import { afterEach, describe, expect, it, vi, Mock } from "vitest"; +import { + AnnotationNormalized, + type CanvasNormalized, +} from "@iiif/presentation-3"; + +import { OsdSvgOverlay } from "src/lib/openseadragon-svg"; +import { + openSeadragonHelpersCanvas, + openSeadragonHelpersRect, + openSeadragonHelpersPoint, +} from "src/fixtures/openSeadragonHelpers"; + +vi.mock("src/lib/openseadragon-svg"); +const mockedOsdSvgOverlay = OsdSvgOverlay as Mock; + +describe("addOverlaysToViewer", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + function createAnnotations(target1): AnnotationNormalized[] { + return [ + { + id: "https://iiif.io/api/cookbook/recipe/0021-tagging/annotation/p0002-tag", + type: "Annotation", + motivation: ["tagging"], + body: [ + { + id: "vault://605b9d93", + type: "ContentResource", + }, + ], + target: target1, + }, + ]; + } + + const viewer = { + addOverlay: () => {}, + svgOverlay: () => { + return { + node: () => { + return { append: () => {} }; + }, + }; + }, + } as any; + const canvas = { width: 10 } as CanvasNormalized; + const configOptions = { + annotationOverlays: { + backgroundColor: "#ff6666", + borderColor: "#990000", + borderType: "solid", + borderWidth: "1px", + opacity: "0.5", + renderOverlays: true, + }, + }; + + function createDiv() { + const div = document.createElement("div"); + const { backgroundColor, opacity, borderType, borderColor, borderWidth } = + configOptions.annotationOverlays; + + div.style.backgroundColor = backgroundColor as string; + div.style.opacity = opacity as string; + div.style.border = `${borderType} ${borderWidth} ${borderColor}`; + div.setAttribute("class", "annotation-overlay"); + + return div; + } + + it("adds a rectangle overlay when target string has #xywh=", () => { + const spy = vi.spyOn(viewer, "addOverlay"); + const target1 = "https://example.com/1#xywh=100,101,102,103"; + const annotations = createAnnotations(target1); + + addOverlaysToViewer(viewer, canvas, configOptions, annotations); + + expect(spy).toHaveBeenCalledTimes(1); + expect(spy.mock.calls[0]).toEqual([ + createDiv(), + { + degrees: 0, + height: 10.3, + width: 10.200000000000001, + x: 10, + y: 10.100000000000001, + }, + ]); + }); + + it("does not add overlay when target string does not have #xywh=", () => { + const spy = vi.spyOn(viewer, "addOverlay"); + const target1 = "https://example.com/1"; + const annotations = createAnnotations(target1); + + addOverlaysToViewer(viewer, canvas, configOptions, annotations); + + expect(spy).toHaveBeenCalledTimes(0); + }); + + it("adds a circle overlay when target is PointSelector", async () => { + const mockDataTable = { + node: vi.fn().mockReturnThis(), + append: vi.fn().mockReturnThis(), + }; + mockedOsdSvgOverlay.mockReturnValueOnce(mockDataTable); + + const target1 = { + type: "SpecificResource", + source: + "https://iiif.io/api/cookbook/recipe/0135-annotating-point-in-canvas/canvas.json", + selector: { + type: "PointSelector", + x: 100, + y: 101, + }, + }; + const annotations = createAnnotations(target1); + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + "circle", + ); + newElement.setAttribute("cx", "100"); + newElement.setAttribute("cy", "101"); + newElement.setAttribute("r", "20"); + newElement.setAttribute("transform", "scale(0.1)"); + newElement.setAttribute( + "style", + "stroke: #990000; stroke-width: 1px; fill: #ff6666; fill-opacity: 0.5;", + ); + + addOverlaysToViewer(viewer, canvas, configOptions, annotations); + + expect(mockedOsdSvgOverlay).toHaveBeenCalledTimes(1); + expect(mockDataTable.append).toHaveBeenCalledTimes(1); + expect(mockDataTable.append.mock.calls).toEqual([[newElement]]); + }); + + it("adds a SVG overlay when target is SvgSelector", () => { + const mockDataTable = { + node: vi.fn().mockReturnThis(), + append: vi.fn().mockReturnThis(), + }; + mockedOsdSvgOverlay.mockReturnValueOnce(mockDataTable); + const target1 = { + type: "SpecificResource", + source: + "https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/canvas/p1", + selector: { + type: "SvgSelector", + value: + "", + }, + }; + const annotations = createAnnotations(target1); + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect", + ); + newElement.setAttribute("x", "10"); + newElement.setAttribute("y", "11"); + newElement.setAttribute("width", "12"); + newElement.setAttribute("height", "13"); + newElement.setAttribute("transform", "scale(0.1)"); + newElement.setAttribute( + "style", + "stroke: #990000; stroke-width: 1px; fill: #ff6666; fill-opacity: 0.5;", + ); + + addOverlaysToViewer(viewer, canvas, configOptions, annotations); + + expect(mockedOsdSvgOverlay).toHaveBeenCalledTimes(1); + expect(mockDataTable.append).toHaveBeenCalledTimes(1); + expect(mockDataTable.append.mock.calls).toEqual([[newElement]]); + }); +}); + +describe("createOpenSeadragonRect", () => { + it("creates OpenSeadrgon.Rect object from provided rect", () => { + const rect = createOpenSeadragonRect( + openSeadragonHelpersCanvas, + openSeadragonHelpersRect, + 2, + ); + + expect(rect).toEqual({ + degrees: 0, + height: 0.6145833333333333, + width: 0.625, + x: -0.09052579365079365, + y: 0.010292658730158749, + }); + }); + + it("creates OpenSeadrgon.Rect object from provided point", () => { + const rect = createOpenSeadragonRect( + openSeadragonHelpersCanvas, + openSeadragonHelpersPoint, + 2, + ); + + expect(rect).toEqual({ + degrees: 0, + height: 0.01984126984126984, + width: 0.01984126984126984, + x: 0.11904761904761904, + y: 0.16865079365079363, + }); + }); +}); diff --git a/src/lib/openseadragon-helpers.ts b/src/lib/openseadragon-helpers.ts new file mode 100644 index 00000000..ccbf7384 --- /dev/null +++ b/src/lib/openseadragon-helpers.ts @@ -0,0 +1,239 @@ +import { + Annotation, + AnnotationNormalized, + type CanvasNormalized, +} from "@iiif/presentation-3"; +import OpenSeadragon from "openseadragon"; +import { type ViewerConfigOptions } from "src/context/viewer-context"; +import { OsdSvgOverlay } from "src/lib/openseadragon-svg"; +import { parseAnnotationTarget } from "src/lib/annotation-helpers"; + +import { ParsedAnnotationTarget } from "src/types/annotations"; + +export function addOverlaysToViewer( + viewer: OpenSeadragon.Viewer, + canvas: CanvasNormalized, + configOptions: ViewerConfigOptions, + annotations: Annotation[] | AnnotationNormalized[], +): void { + if (!viewer) return; + + const scale = 1 / canvas.width; + + annotations.forEach((annotation) => { + if (!annotation.target) return; + + const parsedAnnotationTarget = parseAnnotationTarget(annotation.target); + const { point, rect, svg } = parsedAnnotationTarget; + + if (rect) { + const { x, y, w, h } = rect; + addRectangularOverlay( + viewer, + x * scale, + y * scale, + w * scale, + h * scale, + configOptions, + ); + } + + if (point) { + const { x, y } = point; + const svg = ` + + + + `; + + addSvgOverlay(viewer, svg, configOptions, scale); + } + + if (svg) { + addSvgOverlay(viewer, svg, configOptions, scale); + } + }); +} + +export function createOpenSeadragonRect( + canvas: CanvasNormalized, + parsedAnnotationTarget: ParsedAnnotationTarget, + zoomLevel: number, +) { + let x, + y, + w = 40, + h = 40; + + if (parsedAnnotationTarget.rect) { + x = parsedAnnotationTarget.rect.x; + y = parsedAnnotationTarget.rect.y; + w = parsedAnnotationTarget.rect.w; + h = parsedAnnotationTarget.rect.h; + } + + if (parsedAnnotationTarget.point) { + x = parsedAnnotationTarget.point.x; + y = parsedAnnotationTarget.point.y; + } + + // TODO: How to handle SVG where no rect or point exists? + // @ts-ignore + if (parseAnnotationTarget.svg) { + } + + const scale = 1 / canvas.width; + const rect = new OpenSeadragon.Rect( + x * scale - ((w * scale) / 2) * (zoomLevel - 1), + y * scale - ((h * scale) / 2) * (zoomLevel - 1), + w * scale * zoomLevel, + h * scale * zoomLevel, + ); + + return rect; +} + +/** + * Add a rectangular overlay to an OpenSeadragon viewer + */ +function addRectangularOverlay( + viewer: OpenSeadragon.Viewer, + x: number, + y: number, + w: number, + h: number, + configOptions: ViewerConfigOptions, +): void { + const rect = new OpenSeadragon.Rect(x, y, w, h); + const div = document.createElement("div"); + + if (configOptions.annotationOverlays) { + const { backgroundColor, opacity, borderType, borderColor, borderWidth } = + configOptions.annotationOverlays; + + div.style.backgroundColor = backgroundColor as string; + div.style.opacity = opacity as string; + div.style.border = `${borderType} ${borderWidth} ${borderColor}`; + div.className = "annotation-overlay"; + } + + viewer.addOverlay(div, rect); +} + +function convertSVGStringToHTML(svgString) { + if (!svgString) return null; + const template = document.createElement("template"); + template.innerHTML = svgString.trim(); + const result = template.content.children; + + return result[0]; +} + +export function addSvgOverlay( + viewer: any, + svgString: string, + configOptions: ViewerConfigOptions, + scale: number, +) { + const svgEl = convertSVGStringToHTML(svgString); + if (svgEl) { + for (const child of svgEl.children) { + svg_processChild(viewer, child, configOptions, scale); + } + } +} + +function svg_processChild( + viewer: any, + child: ChildNode, + configOptions: ViewerConfigOptions, + scale: number, +) { + if (child.nodeName === "#text") { + svg_handleTextNode(child); + } else { + const newElement = svg_handleElementNode(child, configOptions, scale); + const overlay = OsdSvgOverlay(viewer); + overlay.node().append(newElement); + overlay._svg?.setAttribute("class", "annotation-overlay"); + + // BUG: svg with children elements aren't formated correctly. + child.childNodes.forEach((child) => { + svg_processChild(viewer, child, configOptions, scale); + }); + } +} + +export function svg_handleElementNode( + child: any, + configOptions: ViewerConfigOptions, + scale: number, +) { + let hasStrokeColor = false; + let hasStrokeWidth = false; + let hasFillColor = false; + let hasFillOpacity = false; + + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + child.nodeName, + ); + + if (child.attributes.length > 0) { + for (let index = 0; index < child.attributes.length; index++) { + const element = child.attributes[index]; + switch (element.name) { + case "fill": + hasFillColor = true; + break; + case "stroke": + hasStrokeColor = true; + break; + case "stroke-width": + hasStrokeWidth = true; + break; + case "fill-opacity": + hasFillOpacity = true; + break; + } + newElement.setAttribute(element.name, element.textContent); + } + } + + if (!hasStrokeColor) { + newElement.style.stroke = configOptions.annotationOverlays + ?.borderColor as string; + } + if (!hasStrokeWidth) { + newElement.style.strokeWidth = configOptions.annotationOverlays + ?.borderWidth as string; + } + if (!hasFillColor) { + newElement.style.fill = configOptions.annotationOverlays + ?.backgroundColor as string; + } + if (!hasFillOpacity) { + newElement.style.fillOpacity = configOptions.annotationOverlays + ?.opacity as string; + } + newElement.setAttribute("transform", `scale(${scale})`); + + return newElement; +} + +function svg_handleTextNode(child: ChildNode) { + if (!child.textContent) { + return; + } + if (child.textContent.includes("\n")) { + return; + } + console.log( + "nodeName:", + child.nodeName, + ", textContent:", + child.textContent, + ", childNodes.length", + child.childNodes.length, + ); +} diff --git a/src/lib/openseadragon-svg.ts b/src/lib/openseadragon-svg.ts new file mode 100644 index 00000000..7a31c99e --- /dev/null +++ b/src/lib/openseadragon-svg.ts @@ -0,0 +1,134 @@ +// OpenSeadragon SVG Overlay plugin 0.0.5 +// https://github.com/openseadragon/svg-overlay/issues/34#issuecomment-1147992921 +import OpenSeadragon from "openseadragon"; + +let $ = window.OpenSeadragon; + +if (!$) { + $ = OpenSeadragon; + if (!$) { + throw new Error("OpenSeadragon is missing."); + } +} + +const svgNS = "http://www.w3.org/2000/svg"; + +// ---------- +if ($.Viewer) { + // @ts-expect-error: svgOverlay does not exist on Viewer + $.Viewer.prototype.svgOverlay = function () { + if (this._svgOverlayInfo) { + return this._svgOverlayInfo; + } + + this._svgOverlayInfo = new Overlay(this); + return this._svgOverlayInfo; + }; +} +// ---------- +const Overlay = function (viewer) { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + this._viewer = viewer; + this._containerWidth = 0; + this._containerHeight = 0; + + this._svg = document.createElementNS(svgNS, "svg"); + this._svg.style.position = "absolute"; + this._svg.style.left = 0; + this._svg.style.top = 0; + this._svg.style.width = "100%"; + this._svg.style.height = "100%"; + this._viewer.canvas.appendChild(this._svg); + + this._node = document.createElementNS(svgNS, "g"); + this._svg.appendChild(this._node); + + this._viewer.addHandler("animation", function () { + self.resize(); + }); + + this._viewer.addHandler("open", function () { + self.resize(); + }); + + this._viewer.addHandler("rotate", function () { + self.resize(); + }); + + this._viewer.addHandler("flip", function () { + self.resize(); + }); + + this._viewer.addHandler("resize", function () { + self.resize(); + }); + + this.resize(); +}; + +// ---------- +Overlay.prototype = { + // ---------- + node: function () { + return this._node; + }, + + // ---------- + resize: function () { + if (this._containerWidth !== this._viewer.container.clientWidth) { + this._containerWidth = this._viewer.container.clientWidth; + this._svg.setAttribute("width", this._containerWidth); + } + + if (this._containerHeight !== this._viewer.container.clientHeight) { + this._containerHeight = this._viewer.container.clientHeight; + this._svg.setAttribute("height", this._containerHeight); + } + + const p = this._viewer.viewport.pixelFromPoint(new $.Point(0, 0), true); + const zoom = this._viewer.viewport.getZoom(true); + const rotation = this._viewer.viewport.getRotation(); + const flipped = this._viewer.viewport.getFlip(); + // TODO: Expose an accessor for _containerInnerSize in the OSD API so we don't have to use the private variable. + const containerSizeX = this._viewer.viewport._containerInnerSize.x; + let scaleX = containerSizeX * zoom; + const scaleY = scaleX; + + if (flipped) { + // Makes the x component of the scale negative to flip the svg + scaleX = -scaleX; + // Translates svg back into the correct coordinates when the x scale is made negative. + p.x = -p.x + containerSizeX; + } + + this._node.setAttribute( + "transform", + "translate(" + + p.x + + "," + + p.y + + ") scale(" + + scaleX + + "," + + scaleY + + ") rotate(" + + rotation + + ")", + ); + }, + // ---------- + onClick: function (node, handler) { + // TODO: Fast click for mobile browsers + + new $.MouseTracker({ + element: node, + clickHandler: handler, + }).setTracking(true); + }, +}; + +export const OsdSvgOverlay = (viewer) => { + return new Overlay(viewer); +}; diff --git a/src/types/annotations.ts b/src/types/annotations.ts new file mode 100644 index 00000000..f8d03153 --- /dev/null +++ b/src/types/annotations.ts @@ -0,0 +1,21 @@ +import { AnnotationPageNormalized } from "@iiif/presentation-3"; + +type AnnotationResources = AnnotationPageNormalized[]; + +interface ParsedAnnotationTarget { + id: string; + point?: { + x: number; + y: number; + }; + rect?: { + x: number; + y: number; + w: number; + h: number; + }; + svg?: string; + t?: string; +} + +export type { AnnotationResources, ParsedAnnotationTarget };