diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85e99cfc4..1bdd922f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,4 +13,4 @@ jobs: secrets: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: - node-version: 24.x \ No newline at end of file + node-version: 24.x diff --git a/package.json b/package.json index 983aa2983..b62e4f56d 100644 --- a/package.json +++ b/package.json @@ -13,20 +13,16 @@ "pnpm": ">=11.1.3" }, "dependencies": { - "@apollo/client": "^3.13.8", - "@babel/runtime": "^7.27.1", + "@apollo/client": "^3.14.0", + "@city-of-helsinki/react-helsinki-headless-cms": "^3.0.1", "@date-fns/tz": "^1.2.0", "@faker-js/faker": "^9.7.0", "@nabla/vite-plugin-eslint": "^3.0.1", "@playwright/test": "^1.60.0", "@sentry/browser": "^10.25.0", "@stylistic/eslint-plugin": "^5.10.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", + "@tanstack/react-table": "^8.20.0", "@types/apollo-upload-client": "^18.0.0", - "@types/classnames": "^2.3.4", - "@types/dompurify": "^3.2.0", "@types/draft-js": "^0.11.20", "@types/draftjs-to-html": "^0.8.4", "@types/file-saver": "^2.0.7", @@ -34,12 +30,10 @@ "@types/jsonwebtoken": "^9.0.9", "@types/lodash": "^4.17.16", "@types/node": "^20.17.43", - "@types/react": "^18.3.20", - "@types/react-dom": "^18.3.7", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", "@types/react-draft-wysiwyg": "^1.13.9", "@types/react-helmet": "^6.1.11", - "@types/react-modal": "^3.16.3", - "@types/react-table": "^7.7.20", "@typescript-eslint/eslint-plugin": "^8.57.2", "@typescript-eslint/parser": "^8.57.2", "@vitejs/plugin-react-swc": "^4.3.0", @@ -50,12 +44,10 @@ "classnames": "^2.5.1", "cross-env": "^7.0.3", "date-fns": "^4.1.0", - "dompurify": "^3.4.0", "dotenv": "^16.5.0", "draft-js": "^0.11.7", "draftjs-to-html": "^0.9.1", "eslint": "^9.39.4", - "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -68,9 +60,8 @@ "globals": "^16.1.0", "graphql": "^16.11.0", "graphql-tag": "^2.12.6", - "hds-design-tokens": "^5.0.0", - "hds-react": "^5.0.0", - "html-react-parser": "^5.2.3", + "hds-design-tokens": "^6.0.2", + "hds-react": "^6.0.2", "html-to-draftjs": "^1.5.0", "i18next": "^24.2.3", "i18next-browser-languagedetector": "^8.1.0", @@ -80,18 +71,13 @@ "jsonwebtoken": "^9.0.3", "msw": "^2.7.6", "path": "^0.12.7", - "react": "^18.3.1", - "react-content-loader": "^7.0.2", - "react-dom": "^18.3.1", + "react": "^19.2.5", + "react-dom": "^19.2.5", "react-draft-wysiwyg": "^1.15.0", "react-helmet": "^6.1.0", - "react-helsinki-headless-cms": "^1.0.2", "react-i18next": "^15.5.1", "react-idle-timer": "^5.7.2", - "react-modal": "^3.16.3", "react-router": "^7.15.0", - "react-table": "^7.8.0", - "react-toastify": "^11.0.5", "sass": "^1.87.0", "typescript": "^5.8.3", "use-deep-compare-effect": "^1.8.1", @@ -146,7 +132,10 @@ "@graphql-codegen/typescript": "^4.1.6", "@graphql-codegen/typescript-operations": "^4.6.1", "@graphql-codegen/typescript-react-apollo": "^4.3.2", - "dequal": "^2.0.3", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "doctoc": "^2.3.0", "husky": "^9.1.7", "lint-staged": "^16.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1f309be7..a3d33b466 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,11 +29,11 @@ importers: .: dependencies: '@apollo/client': - specifier: ^3.13.8 - version: 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@babel/runtime': - specifier: ^7.27.1 - version: 7.29.7 + specifier: ^3.14.0 + version: 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@city-of-helsinki/react-helsinki-headless-cms': + specifier: ^3.0.1 + version: 3.0.3(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/node@20.19.41)(@types/react@18.3.29)(hds-react@6.0.2(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) '@date-fns/tz': specifier: ^1.2.0 version: 1.5.0 @@ -52,24 +52,12 @@ importers: '@stylistic/eslint-plugin': specifier: ^5.10.0 version: 5.10.0(eslint@9.39.4(jiti@2.7.0)) - '@testing-library/jest-dom': - specifier: ^6.6.3 - version: 6.9.1 - '@testing-library/react': - specifier: ^16.3.0 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.29))(@types/react@18.3.29)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@testing-library/user-event': - specifier: ^14.6.1 - version: 14.6.1(@testing-library/dom@10.4.1) + '@tanstack/react-table': + specifier: ^8.20.0 + version: 8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/apollo-upload-client': specifier: ^18.0.0 - version: 18.0.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@types/classnames': - specifier: ^2.3.4 - version: 2.3.4 - '@types/dompurify': - specifier: ^3.2.0 - version: 3.2.0 + version: 18.0.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/draft-js': specifier: ^0.11.20 version: 0.11.20 @@ -95,20 +83,14 @@ importers: specifier: ^18.3.20 version: 18.3.29 '@types/react-dom': - specifier: ^18.3.7 - version: 18.3.7(@types/react@18.3.29) + specifier: ^19.2.3 + version: 19.2.3(@types/react@18.3.29) '@types/react-draft-wysiwyg': specifier: ^1.13.9 version: 1.13.9 '@types/react-helmet': specifier: ^6.1.11 version: 6.1.11 - '@types/react-modal': - specifier: ^3.16.3 - version: 3.16.3 - '@types/react-table': - specifier: ^7.7.20 - version: 7.7.20 '@typescript-eslint/eslint-plugin': specifier: ^8.57.2 version: 8.60.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) @@ -123,10 +105,10 @@ importers: version: 4.1.7(vitest@4.1.7) apollo-upload-client: specifier: ^18.0.1 - version: 18.0.1(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.14.0) + version: 18.0.1(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(graphql@16.14.0) apollo3-cache-persist: specifier: ^0.15.0 - version: 0.15.0(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 0.15.0(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) axios: specifier: ^1.16.0 version: 1.16.1 @@ -139,24 +121,18 @@ importers: date-fns: specifier: ^4.1.0 version: 4.3.0 - dompurify: - specifier: ^3.4.0 - version: 3.4.7 dotenv: specifier: ^16.5.0 version: 16.6.1 draft-js: specifier: ^0.11.7 - version: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) draftjs-to-html: specifier: ^0.9.1 version: 0.9.1 eslint: specifier: ^9.39.4 version: 9.39.4(jiti@2.7.0) - eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-import-resolver-typescript: specifier: ^4.4.4 version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) @@ -171,7 +147,7 @@ importers: version: 3.4.0 eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.3) + version: 5.5.6(@types/eslint@9.6.1)(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.3) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@9.39.4(jiti@2.7.0)) @@ -183,7 +159,7 @@ importers: version: 2.0.5 formik: specifier: ^2.4.6 - version: 2.4.9(@types/react@18.3.29)(react@18.3.1) + version: 2.4.9(@types/react@18.3.29)(react@19.2.7) globals: specifier: ^16.0.0 version: 16.5.0 @@ -194,17 +170,14 @@ importers: specifier: ^2.12.6 version: 2.12.6(graphql@16.14.0) hds-design-tokens: - specifier: ^5.0.0 - version: 5.2.0 + specifier: ^6.0.2 + version: 6.0.2 hds-react: - specifier: ^5.0.0 - version: 5.2.0(@types/react@18.3.29)(eslint@9.39.4(jiti@2.7.0))(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - html-react-parser: - specifier: ^5.2.3 - version: 5.2.17(@types/react@18.3.29)(react@18.3.1) + specifier: ^6.0.2 + version: 6.0.2(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) html-to-draftjs: specifier: ^1.5.0 - version: 1.5.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3) + version: 1.5.0(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3) i18next: specifier: ^24.2.3 version: 24.2.3(typescript@5.9.3) @@ -230,41 +203,26 @@ importers: specifier: ^0.12.7 version: 0.12.7 react: - specifier: ^18.3.1 - version: 18.3.1 - react-content-loader: - specifier: ^7.0.2 - version: 7.1.2(react@18.3.1) + specifier: ^19.2.5 + version: 19.2.7 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.2.5 + version: 19.2.7(react@19.2.7) react-draft-wysiwyg: specifier: ^1.15.0 - version: 1.15.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.15.0(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react-helmet: specifier: ^6.1.0 - version: 6.1.0(react@18.3.1) - react-helsinki-headless-cms: - specifier: ^1.0.2 - version: 1.3.0(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(date-fns@4.3.0)(hds-react@5.2.0(@types/react@18.3.29)(eslint@9.39.4(jiti@2.7.0))(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.1.0(react@19.2.7) react-i18next: specifier: ^15.5.1 - version: 15.7.4(i18next@24.2.3(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + version: 15.7.4(i18next@24.2.3(typescript@5.9.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) react-idle-timer: specifier: ^5.7.2 - version: 5.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-modal: - specifier: ^3.16.3 - version: 3.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.7.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react-router: specifier: ^7.15.0 - version: 7.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-table: - specifier: ^7.8.0 - version: 7.8.0(react@18.3.1) - react-toastify: - specifier: ^11.0.5 - version: 11.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.15.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) sass: specifier: ^1.87.0 version: 1.100.0 @@ -273,7 +231,7 @@ importers: version: 5.9.3 use-deep-compare-effect: specifier: ^1.8.1 - version: 1.8.1(react@18.3.1) + version: 1.8.1(react@19.2.7) vite: specifier: ^8.0.5 version: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.100.0)(tsx@4.22.3)(yaml@2.9.0) @@ -314,9 +272,18 @@ importers: '@graphql-codegen/typescript-react-apollo': specifier: ^4.3.2 version: 4.4.2(graphql@16.14.0) - dequal: - specifier: ^2.0.3 - version: 2.0.3 + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.1 + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 + '@testing-library/react': + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@18.3.29))(@types/react@18.3.29)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) doctoc: specifier: ^2.3.0 version: 2.4.1 @@ -470,6 +437,18 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true + '@city-of-helsinki/react-helsinki-headless-cms@3.0.3': + resolution: {integrity: sha512-wPGDRzc13eCDwbIUKmVei/2x8/AfpBzBT3AswWkvDs1L/6vrtzmU4RVs0qAUXHFPke9xNbdPWEvRkA420jHOow==} + engines: {node: '>=22.11.0'} + peerDependencies: + '@apollo/client': ^3.14.0 + hds-react: '>=4.8.1' + react: ^18 + react-dom: ^18 + peerDependenciesMeta: + '@apollo/client': + optional: true + '@commitlint/cli@20.5.3': resolution: {integrity: sha512-OJdL0EXWD5y9LPa0nr/geOwzaS8BsdaybKkcloB0JgsguGxNv2R+hC2FTPqrAcprg35zF33KOQerY0x8W1aesA==} engines: {node: '>=v18'} @@ -627,9 +606,6 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@emotion/styled-base@11.0.0': - resolution: {integrity: sha512-/NY/PXrQkl/wI0+0E3QWd+m9kMg7h4THmjbPEe0VVnplNtdJC6db0VHDqmaC2tsEDcda6zvy3b8giM9DHa6BLw==} - '@envelop/core@5.5.1': resolution: {integrity: sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==} engines: {node: '>=18.0.0'} @@ -1242,22 +1218,6 @@ packages: '@internationalized/string@3.2.8': resolution: {integrity: sha512-NdbMQUSfXLYIQol5VyMtinm9pZDciiMfN7RtmSuSB78io1hqwJ0naYfxyW6vgxWBkzWymQa/3uLDlbfmshtCaA==} - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1605,15 +1565,6 @@ packages: resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} engines: {node: '>=18'} - '@sinclair/typebox@0.27.10': - resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1719,6 +1670,17 @@ packages: '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} + '@tanstack/react-table@8.21.3': + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -1754,10 +1716,6 @@ packages: '@textlint/markdown-to-ast@15.7.1': resolution: {integrity: sha512-9DLSah7g6mYNHvO6pssLdFvFPAl3HHyEIm4RE5of/1QN9FXJXDgdOcVV3YpQmbYT/YntuIvOQiqOndCSPWTW2A==} - '@tootallnate/once@3.0.1': - resolution: {integrity: sha512-VyMVKRrpHTT8PnotUeV8L/mDaMwD5DaAKCFLP73zAqAtvF0FCqky+Ki7BYbFCYQmqFyTe9316Ed5zS70QUR9eg==} - engines: {node: '>= 10'} - '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} @@ -1770,20 +1728,12 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/classnames@2.3.4': - resolution: {integrity: sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ==} - deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/dompurify@3.2.0': - resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} - deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. - '@types/draft-js@0.11.20': resolution: {integrity: sha512-bZHtHxXnCu4wlUXlDWrIlJSG2LJ6wcycSWoxcTCcGd0cVOm35p0vh87qpIPzGK2NALMMvJhQXdS330iYB3iGlw==} @@ -1810,21 +1760,9 @@ packages: '@types/html-to-draftjs@1.5.0': resolution: {integrity: sha512-6t0ZAkSR4n822+XD7PCtf7kPcG9GmqJzC3sm38xU0TbozbCCjculgp9wfMgyWR1q8VuEO+3rCf7iLFU7vslkPQ==} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1849,8 +1787,8 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^18.3.20 @@ -1860,27 +1798,15 @@ packages: '@types/react-helmet@6.1.11': resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==} - '@types/react-modal@3.16.3': - resolution: {integrity: sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==} - - '@types/react-table@7.7.20': - resolution: {integrity: sha512-ahMp4pmjVlnExxNwxyaDrFgmKxSbPwU23sGQw2gJK4EhCvnvmib2s/O/+y1dfV57dXOwpr2plfyBol+vEHbi2w==} - '@types/react@18.3.29': resolution: {integrity: sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==} '@types/set-cookie-parser@2.4.10': resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1890,12 +1816,6 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.60.0': resolution: {integrity: sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1904,16 +1824,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.60.0': resolution: {integrity: sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1927,10 +1837,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@8.60.0': resolution: {integrity: sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1948,23 +1854,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@8.60.0': resolution: {integrity: sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.60.0': resolution: {integrity: sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1978,10 +1871,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@8.60.0': resolution: {integrity: sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2182,22 +2071,11 @@ packages: resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} engines: {node: '>=8'} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} - acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -2469,10 +2347,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -2632,16 +2506,6 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - cssstyle@4.6.0: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} @@ -2660,10 +2524,6 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -2786,11 +2646,6 @@ packages: domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -2942,25 +2797,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-import-context@0.1.9: resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3083,11 +2923,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -3110,9 +2945,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - exenv@1.2.2: - resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} - exit-on-epipe@1.0.1: resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==} engines: {node: '>=0.8'} @@ -3327,9 +3159,6 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphql-config@5.1.6: resolution: {integrity: sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==} engines: {node: '>= 16.0.0'} @@ -3398,25 +3227,25 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hds-core@5.2.0: - resolution: {integrity: sha512-8L7wi54U8u00Ei4H4614y3UT2YZcSIHO2Xijah+Vda3UUWoro+arOYsTEpUAa3pxjwCOXO9dydAzsQOGT0sozA==} - engines: {node: ^22.13.1} - - hds-design-tokens@3.13.0: - resolution: {integrity: sha512-AJXnFevroztUrZGkP9cM9pewkMt31EM0MhT8hBQN5nzzC1tKFVcn75Yxke4lS//hmB+Bdxv+/PudKPUeqF6ctw==} - deprecated: Versions prior to v4 are deprecated, please update. + hds-core@6.0.2: + resolution: {integrity: sha512-WJoIjxGFUSnpFQOGzkpphdbC/2fa9eDXYK2+ODt1pJCCZARLrkl5vMt3+0dqq5oRZ7g/kZd9j7Xc7ZDqR5/aDA==} + engines: {node: ^24} - hds-design-tokens@5.2.0: - resolution: {integrity: sha512-9fSl+Wfy3y0p26gESblyo91s2D32Q29r1jsioRCwD6W3mh/gF+xUsws/B+LYxyFz35vY5y+rwRluR1g6twQCXg==} + hds-design-tokens@4.10.0: + resolution: {integrity: sha512-MBfJRuH9/SiGGpQHqoCDjiCD7o8URTOQ4WH/8qg1lv6n5q8uyoPvguMqUH+EEqvRorzctXMuYe71lqPfkDCt1A==} engines: {node: ^22.13.1} - hds-react@5.2.0: - resolution: {integrity: sha512-MN1Y7WNWcD4RLpL4X9MF3NxhcBxXMdXBvQpALSw9dRnFeUMgyZnNzqyUQ+KBHGbxpSCdWsSoigAJt5QnOBGE5A==} - engines: {node: ^22.13.1} + hds-design-tokens@6.0.2: + resolution: {integrity: sha512-/OxfpXo+lTU8OkaXGVYhZxpdzRcO8sUSMo5gfxqAvryvtvNv4RPx0xDrAEq7mhr3I6DFPJVRYvExQicoqHFgPQ==} + engines: {node: ^24} + + hds-react@6.0.2: + resolution: {integrity: sha512-ALlUjw+rkJ6m3muH8r/9QsVvImQ8jAKuAK6W8gIQ55R09N9NoZf/imPelAvZBgi/w8mqhfyLsQfuexUWUJRaWw==} + engines: {node: ^24} peerDependencies: postcss: ^8.4.21 - react: ^16.8.0 || ^17 || ^18 || ^19 - react-dom: ^16.8.0 || ^17 || ^18 || ^19 + react: ^19.0.0 + react-dom: ^19.0.0 header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} @@ -3427,16 +3256,9 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-dom-parser@5.0.3: - resolution: {integrity: sha512-slsc6ipw88OUZjAayRs5NTmfOQCwcUa3hNyk6AdsbQxY09H5Lr1Y3CZ4ZlconMKql3Ga6sWg3HMoUzo7KSItaQ==} - html-dom-parser@5.1.8: resolution: {integrity: sha512-MCIUng//mF2qTtGHXJWr6OLfHWmg3Pm8ezpfiltF83tizPWY17JxT4dRLE8lykJ5bChJELoY3onQKPbufJHxYA==} - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -3454,11 +3276,6 @@ packages: html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} - html-react-parser@4.2.10: - resolution: {integrity: sha512-JyKZVQ+kQ8PdycISwkuLbEEvV/k4hWhU6cb6TT7yGaYwdqA7cPt4VRYXkCZcix2vlQtgDBSMJUmPI2jpNjPGvg==} - peerDependencies: - react: 0.14 || 15 || 16 || 17 || 18 - html-react-parser@5.2.17: resolution: {integrity: sha512-m+K/7Moq1jodAB4VL0RXSOmtwLUYoAsikZhwd+hGQe5Vtw2dbWfpFd60poxojMU0Tsh9w59mN1QLEcoHz0Dx9w==} peerDependencies: @@ -3480,13 +3297,6 @@ packages: htmlparser2@7.2.0: resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - htmlparser2@9.0.0: - resolution: {integrity: sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -3576,9 +3386,6 @@ packages: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} - inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} - inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -3807,27 +3614,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true @@ -3853,15 +3639,6 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - jsdom@26.1.0: resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} engines: {node: '>=18'} @@ -4522,10 +4299,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - printj@1.1.2: resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} engines: {node: '>=0.8'} @@ -4548,16 +4321,10 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4567,16 +4334,10 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-content-loader@7.1.2: - resolution: {integrity: sha512-naFG7OERUQNPKQt1QWHyBF0/y6Zmr7dOzqjs1U5yOnu4OZmcE3+b/blp40dEKa9lvYAzOuj5dvfTK1cg5YWJkA==} - engines: {node: '>=10'} + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: - react: '>=18.0.0' - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react: ^19.2.7 react-draft-wysiwyg@1.15.0: resolution: {integrity: sha512-p1cYZcWc6/ALFBVksbFoCM3b29fGQDlZLIMrXng0TU/UElxIOF2/AWWo4L5auIYVhmqKTZ0NkNjnXOzGGuxyeA==} @@ -4597,20 +4358,6 @@ packages: peerDependencies: react: '>=16.3.0' - react-helsinki-headless-cms@1.3.0: - resolution: {integrity: sha512-jbMLACpKk8a+AW7psHUD2AzT9kMVoGMK1qGvOOUU0YvKRnzEGle+LjimGmw1esDiPSoXAPJwjKxPoXnUFW3a9A==} - engines: {node: '>=18.17.1'} - deprecated: Package has been moved to a scoped name. Please use @city-of-helsinki/react-helsinki-headless-cms instead. - peerDependencies: - '@apollo/client': ^3.10.16 - date-fns: ^2.28.0 - hds-react: '>=1.11.1' - react: '>=16.8.0' - react-dom: '>=16.8.0' - peerDependenciesMeta: - '@apollo/client': - optional: true - react-hook-form@7.76.1: resolution: {integrity: sha512-rYM7tPiWlu3nZchkR/ex7piyzui2vFPyaLnXnI/RnblB/L4qfMmyses8llJVtF1NpE9WBBsJlGtcSZzPCXW1qQ==} engines: {node: '>=18.0.0'} @@ -4645,21 +4392,9 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - react-merge-refs@1.1.0: resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} - react-modal@3.16.3: - resolution: {integrity: sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==} - peerDependencies: - react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 - react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 - react-popper@2.2.5: resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} peerDependencies: @@ -4689,25 +4424,14 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-table@7.8.0: - resolution: {integrity: sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==} - peerDependencies: - react: ^16.8.3 || ^17.0.0-0 || ^18.0.0 - - react-toastify@11.1.0: - resolution: {integrity: sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==} - peerDependencies: - react: ^18 || ^19 - react-dom: ^18 || ^19 - react-use-measure@2.0.1: resolution: {integrity: sha512-lFfHiqcXbJ2/6aUkZwt8g5YYM7EGqNVxJhMqMPqv1BVXRKp8D7jYLlmma0SvhRY4WYxxkZpCdbJvhDylb5gcEA==} peerDependencies: react: '>=16.13' react-dom: '>=16.13' - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} readable-stream@3.6.2: @@ -4777,9 +4501,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - reselect@4.1.8: resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} @@ -4865,8 +4586,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} scuid@1.1.0: resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} @@ -4969,10 +4690,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - sponge-case@1.0.1: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} @@ -4980,10 +4697,6 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -5072,15 +4785,9 @@ packages: style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - style-to-js@1.1.8: - resolution: {integrity: sha512-bPSspCXkkhETLXnEgDbaoWRWyv3lF2bj32YIc8IElok2IIMHUlZtQUrxYmAkKUNxpluhH0qnKWrmuoXUyTY12g==} - style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - style-to-object@1.0.3: - resolution: {integrity: sha512-xOpx7S53E0V3DpVsvt7ySvoiumRpfXiC99PUXLqGB3wiAnN9ybEIpuzlZ8LAZg+h1sl9JkEUwtSQXxcCgFqbbg==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5167,10 +4874,6 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -5182,10 +4885,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -5197,12 +4896,6 @@ packages: trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -5244,10 +4937,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -5315,10 +5004,6 @@ packages: unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - unixify@1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} @@ -5344,9 +5029,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - urlpattern-polyfill@10.1.0: resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} @@ -5487,10 +5169,6 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -5519,20 +5197,11 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -5541,10 +5210,6 @@ packages: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - whatwg-url@14.2.0: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} @@ -5610,10 +5275,6 @@ packages: utf-8-validate: optional: true - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -5666,7 +5327,7 @@ snapshots: '@adobe/css-tools@4.5.0': {} - '@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.14.0) '@wry/caches': 1.0.1 @@ -5677,15 +5338,15 @@ snapshots: hoist-non-react-statics: 3.3.2 optimism: 0.18.1 prop-types: 15.8.1 - rehackt: 0.1.0(@types/react@18.3.29)(react@18.3.1) + rehackt: 0.1.0(@types/react@18.3.29)(react@19.2.7) symbol-observable: 4.0.0 ts-invariant: 0.10.3 tslib: 2.8.1 zen-observable-ts: 1.2.5 optionalDependencies: graphql-ws: 6.0.8(graphql@16.14.0)(ws@8.21.0) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) transitivePeerDependencies: - '@types/react' @@ -5839,6 +5500,30 @@ snapshots: dependencies: css-tree: 3.2.1 + '@city-of-helsinki/react-helsinki-headless-cms@3.0.3(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/node@20.19.41)(@types/react@18.3.29)(hds-react@6.0.2(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + classnames: 2.5.1 + date-fns: 4.3.0 + doctoc: 2.4.1 + hds-design-tokens: 4.10.0 + hds-react: 6.0.2(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + html-entities: 2.6.0 + html-react-parser: 5.2.17(@types/react@18.3.29)(react@19.2.7) + isomorphic-dompurify: 2.36.0 + lodash-es: 4.18.1 + msw: 2.14.6(@types/node@20.19.41)(typescript@5.9.3) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - '@noble/hashes' + - '@types/node' + - '@types/react' + - canvas + - supports-color + - typescript + '@commitlint/cli@20.5.3(@types/node@20.19.41)(conventional-commits-parser@6.4.0)(typescript@5.9.3)': dependencies: '@commitlint/format': 20.5.0 @@ -6019,8 +5704,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emotion/styled-base@11.0.0': {} - '@envelop/core@5.5.1': dependencies: '@envelop/instrumentation': 1.0.0 @@ -6603,7 +6286,7 @@ snapshots: '@graphql-tools/optimize@2.0.0(graphql@16.14.0)': dependencies: graphql: 16.14.0 - tslib: 2.6.3 + tslib: 2.8.1 '@graphql-tools/prisma-loader@8.0.17(@types/node@20.19.41)(graphql@16.14.0)': dependencies: @@ -6638,7 +6321,7 @@ snapshots: '@ardatan/relay-compiler': 13.0.1(graphql@16.14.0) '@graphql-tools/utils': 11.1.0(graphql@16.14.0) graphql: 16.14.0 - tslib: 2.6.3 + tslib: 2.8.1 '@graphql-tools/schema@10.0.33(graphql@16.14.0)': dependencies: @@ -6729,9 +6412,9 @@ snapshots: dependencies: graphql: 16.14.0 - '@hookform/resolvers@2.9.11(react-hook-form@7.76.1(react@18.3.1))': + '@hookform/resolvers@2.9.11(react-hook-form@7.76.1(react@19.2.7))': dependencies: - react-hook-form: 7.76.1(react@18.3.1) + react-hook-form: 7.76.1(react@19.2.7) '@humanfs/core@0.19.2': dependencies: @@ -6795,35 +6478,6 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.19.41 - jest-mock: 29.7.0 - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.41 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.10 - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.41 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6965,67 +6619,67 @@ snapshots: '@popperjs/core@2.11.5': {} - '@react-aria/interactions@3.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/interactions@3.28.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@react-types/shared': 3.34.0(react@18.3.1) + '@react-types/shared': 3.34.0(react@19.2.7) '@swc/helpers': 0.5.23 - react: 18.3.1 - react-aria: 3.48.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-aria: 3.48.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-dom: 19.2.7(react@19.2.7) - '@react-aria/utils@3.34.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/utils@3.34.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@swc/helpers': 0.5.23 - react: 18.3.1 - react-aria: 3.48.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - react-stately: 3.46.0(react@18.3.1) + react: 19.2.7 + react-aria: 3.48.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-dom: 19.2.7(react@19.2.7) + react-stately: 3.46.0(react@19.2.7) - '@react-aria/visually-hidden@3.8.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/visually-hidden@3.8.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@react-aria/interactions': 3.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.34.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-types/shared': 3.34.0(react@18.3.1) + '@react-aria/interactions': 3.28.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-aria/utils': 3.34.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-types/shared': 3.34.0(react@19.2.7) '@swc/helpers': 0.5.23 - react: 18.3.1 + react: 19.2.7 transitivePeerDependencies: - react-dom - '@react-spring/animated@9.3.2(react@18.3.1)': + '@react-spring/animated@9.3.2(react@19.2.7)': dependencies: - '@react-spring/shared': 9.3.2(react@18.3.1) + '@react-spring/shared': 9.3.2(react@19.2.7) '@react-spring/types': 9.3.2 - react: 18.3.1 + react: 19.2.7 - '@react-spring/core@9.3.2(react@18.3.1)': + '@react-spring/core@9.3.2(react@19.2.7)': dependencies: - '@react-spring/animated': 9.3.2(react@18.3.1) - '@react-spring/shared': 9.3.2(react@18.3.1) + '@react-spring/animated': 9.3.2(react@19.2.7) + '@react-spring/shared': 9.3.2(react@19.2.7) '@react-spring/types': 9.3.2 - react: 18.3.1 + react: 19.2.7 '@react-spring/rafz@9.3.2': {} - '@react-spring/shared@9.3.2(react@18.3.1)': + '@react-spring/shared@9.3.2(react@19.2.7)': dependencies: '@react-spring/rafz': 9.3.2 '@react-spring/types': 9.3.2 - react: 18.3.1 + react: 19.2.7 '@react-spring/types@9.3.2': {} - '@react-spring/web@9.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-spring/web@9.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@react-spring/animated': 9.3.2(react@18.3.1) - '@react-spring/core': 9.3.2(react@18.3.1) - '@react-spring/shared': 9.3.2(react@18.3.1) + '@react-spring/animated': 9.3.2(react@19.2.7) + '@react-spring/core': 9.3.2(react@19.2.7) + '@react-spring/shared': 9.3.2(react@19.2.7) '@react-spring/types': 9.3.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@react-types/shared@3.34.0(react@18.3.1)': + '@react-types/shared@3.34.0(react@19.2.7)': dependencies: - react: 18.3.1 + react: 19.2.7 '@repeaterjs/repeater@3.0.6': {} @@ -7116,16 +6770,6 @@ snapshots: '@simple-libs/stream-utils@1.2.0': {} - '@sinclair/typebox@0.27.10': {} - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin@5.10.0(eslint@9.39.4(jiti@2.7.0))': @@ -7203,6 +6847,14 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@tanstack/react-table@8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/table-core': 8.21.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/table-core@8.21.3': {} + '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.7 @@ -7223,15 +6875,15 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.29))(@types/react@18.3.29)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@18.3.29))(@types/react@18.3.29)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.29 - '@types/react-dom': 18.3.7(@types/react@18.3.29) + '@types/react-dom': 19.2.3(@types/react@18.3.29) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -7254,16 +6906,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@tootallnate/once@3.0.1': {} - '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true - '@types/apollo-upload-client@18.0.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@types/apollo-upload-client@18.0.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/extract-files': 13.0.2 graphql: 16.14.0 transitivePeerDependencies: @@ -7280,18 +6930,10 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/classnames@2.3.4': - dependencies: - classnames: 2.5.1 - '@types/cookie@0.6.0': {} '@types/deep-eql@4.0.2': {} - '@types/dompurify@3.2.0': - dependencies: - dompurify: 3.4.7 - '@types/draft-js@0.11.20': dependencies: '@types/react': 18.3.29 @@ -7321,24 +6963,8 @@ snapshots: dependencies: '@types/draft-js': 0.11.20 - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - '@types/js-yaml@4.0.9': {} - '@types/jsdom@20.0.1': - dependencies: - '@types/node': 20.19.41 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -7362,7 +6988,7 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@18.3.7(@types/react@18.3.29)': + '@types/react-dom@19.2.3(@types/react@18.3.29)': dependencies: '@types/react': 18.3.29 @@ -7375,14 +7001,6 @@ snapshots: dependencies: '@types/react': 18.3.29 - '@types/react-modal@3.16.3': - dependencies: - '@types/react': 18.3.29 - - '@types/react-table@7.7.20': - dependencies: - '@types/react': 18.3.29 - '@types/react@18.3.29': dependencies: '@types/prop-types': 15.7.15 @@ -7392,12 +7010,8 @@ snapshots: dependencies: '@types/node': 20.19.41 - '@types/stack-utils@2.0.3': {} - '@types/statuses@2.0.6': {} - '@types/tough-cookie@4.0.5': {} - '@types/trusted-types@2.0.7': optional: true @@ -7407,12 +7021,6 @@ snapshots: dependencies: '@types/node': 20.19.41 - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.35': - dependencies: - '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.60.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -7429,19 +7037,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.60.0 @@ -7463,11 +7058,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@8.60.0': dependencies: '@typescript-eslint/types': 8.60.0 @@ -7489,25 +7079,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@8.60.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 10.2.5 - semver: 7.8.1 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.60.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.60.0(typescript@5.9.3) @@ -7534,11 +7107,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.60.0': dependencies: '@typescript-eslint/types': 8.60.0 @@ -7715,21 +7283,10 @@ snapshots: dependencies: tslib: 2.8.1 - abab@2.0.6: {} - - acorn-globals@7.0.1: - dependencies: - acorn: 8.16.0 - acorn-walk: 8.3.5 - acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 - acorn-walk@8.3.5: - dependencies: - acorn: 8.16.0 - acorn@8.16.0: {} agent-base@6.0.2: @@ -7784,15 +7341,15 @@ snapshots: ansi-styles@6.2.3: {} - apollo-upload-client@18.0.1(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.14.0): + apollo-upload-client@18.0.1(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(graphql@16.14.0): dependencies: - '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) extract-files: 13.0.0 graphql: 16.14.0 - apollo3-cache-persist@0.15.0(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + apollo3-cache-persist@0.15.0(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)): dependencies: - '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) argparse@2.0.1: {} @@ -8043,8 +7600,6 @@ snapshots: dependencies: readdirp: 5.0.0 - ci-info@3.9.0: {} - classnames@2.5.1: {} clean-stack@2.2.0: {} @@ -8190,14 +7745,6 @@ snapshots: css.escape@1.5.1: {} - cssom@0.3.8: {} - - cssom@0.5.0: {} - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 @@ -8216,12 +7763,6 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-urls@3.0.2: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -8338,10 +7879,6 @@ snapshots: domelementtype@2.3.0: {} - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - domhandler@4.3.1: dependencies: domelementtype: 2.3.0 @@ -8377,21 +7914,21 @@ snapshots: dotenv@16.6.1: {} - draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: fbjs: 2.0.0 immutable: 3.8.3 object-assign: 4.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) transitivePeerDependencies: - encoding draftjs-to-html@0.9.1: {} - draftjs-utils@0.10.2(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3): + draftjs-utils@0.10.2(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3): dependencies: - draft-js: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + draft-js: 0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) immutable: 3.8.3 dset@3.1.4: {} @@ -8572,22 +8109,8 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)): - dependencies: - eslint: 9.39.4(jiti@2.7.0) - eslint-import-context@0.1.9(unrs-resolver@1.12.2): dependencies: get-tsconfig: 4.14.0 @@ -8679,7 +8202,7 @@ snapshots: eslint-plugin-no-only-tests@3.4.0: {} - eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.3): + eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.3): dependencies: eslint: 9.39.4(jiti@2.7.0) prettier: 3.8.3 @@ -8687,7 +8210,6 @@ snapshots: synckit: 0.11.13 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@2.7.0)): dependencies: @@ -8773,8 +8295,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 - esprima@4.0.1: {} - esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -8793,8 +8313,6 @@ snapshots: eventemitter3@5.0.4: {} - exenv@1.2.2: {} - exit-on-epipe@1.0.1: {} expect-type@1.3.0: {} @@ -8911,14 +8429,14 @@ snapshots: dependencies: fetch-blob: 3.2.0 - formik@2.4.9(@types/react@18.3.29)(react@18.3.1): + formik@2.4.9(@types/react@18.3.29)(react@19.2.7): dependencies: '@types/hoist-non-react-statics': 3.3.7(@types/react@18.3.29) deepmerge: 2.2.1 hoist-non-react-statics: 3.3.2 lodash: 4.18.1 lodash-es: 4.18.1 - react: 18.3.1 + react: 19.2.7 react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 2.8.1 @@ -9024,8 +8542,6 @@ snapshots: gopd@1.2.0: {} - graceful-fs@4.2.11: {} - graphql-config@5.1.6(@types/node@20.19.41)(graphql@16.14.0)(typescript@5.9.3): dependencies: '@graphql-tools/graphql-file-loader': 8.1.14(graphql@16.14.0) @@ -9091,51 +8607,47 @@ snapshots: dependencies: function-bind: 1.1.2 - hds-core@5.2.0: {} + hds-core@6.0.2: {} - hds-design-tokens@3.13.0: {} + hds-design-tokens@4.10.0: {} - hds-design-tokens@5.2.0: {} + hds-design-tokens@6.0.2: {} - hds-react@5.2.0(@types/react@18.3.29)(eslint@9.39.4(jiti@2.7.0))(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): + hds-react@6.0.2(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@babel/runtime': 7.29.7 - '@emotion/styled-base': 11.0.0 - '@hookform/resolvers': 2.9.11(react-hook-form@7.76.1(react@18.3.1)) + '@hookform/resolvers': 2.9.11(react-hook-form@7.76.1(react@19.2.7)) '@juggle/resize-observer': 3.2.0 '@popperjs/core': 2.11.5 - '@react-aria/visually-hidden': 3.8.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-spring/web': 9.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/visually-hidden': 3.8.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-spring/web': 9.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/cookie': 0.6.0 - '@typescript-eslint/parser': 6.21.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) await-to-js: 3.0.0 cookie: 0.7.2 crc-32: 1.2.0 date-fns: 2.16.1 graphql: 16.14.0 - hds-core: 5.2.0 + hds-core: 6.0.2 + hds-design-tokens: 6.0.2 jwt-decode: 3.1.2 kashe: 1.0.4 lodash: 4.18.1 memoize-one: 5.2.1 oidc-client-ts: 2.5.0 postcss: 8.5.15 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-hook-form: 7.76.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-hook-form: 7.76.1(react@19.2.7) react-merge-refs: 1.1.0 - react-popper: 2.2.5(@popperjs/core@2.11.5)(react@18.3.1) - react-use-measure: 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-popper: 2.2.5(@popperjs/core@2.11.5)(react@19.2.7) + react-use-measure: 2.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) uuid: 14.0.0 yup: 1.7.1 transitivePeerDependencies: - '@types/react' - - eslint - graphql-ws - subscriptions-transport-ws - - supports-color - - typescript header-case@2.0.4: dependencies: @@ -9151,20 +8663,11 @@ snapshots: dependencies: react-is: 16.13.1 - html-dom-parser@5.0.3: - dependencies: - domhandler: 5.0.3 - htmlparser2: 9.0.0 - html-dom-parser@5.1.8: dependencies: domhandler: 5.0.3 htmlparser2: 10.1.0 - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -9183,27 +8686,19 @@ snapshots: dependencies: void-elements: 3.1.0 - html-react-parser@4.2.10(react@18.3.1): - dependencies: - domhandler: 5.0.3 - html-dom-parser: 5.0.3 - react: 18.3.1 - react-property: 2.0.2 - style-to-js: 1.1.8 - - html-react-parser@5.2.17(@types/react@18.3.29)(react@18.3.1): + html-react-parser@5.2.17(@types/react@18.3.29)(react@19.2.7): dependencies: domhandler: 5.0.3 html-dom-parser: 5.1.8 - react: 18.3.1 + react: 19.2.7 react-property: 2.0.2 style-to-js: 1.1.21 optionalDependencies: '@types/react': 18.3.29 - html-to-draftjs@1.5.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3): + html-to-draftjs@1.5.0(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3): dependencies: - draft-js: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + draft-js: 0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) immutable: 3.8.3 htmlparser2@10.1.0: @@ -9220,21 +8715,6 @@ snapshots: domutils: 2.8.0 entities: 3.0.1 - htmlparser2@9.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 3.0.1 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -9313,8 +8793,6 @@ snapshots: ini@6.0.0: {} - inline-style-parser@0.2.2: {} - inline-style-parser@0.2.7: {} inquirer@8.2.7(@types/node@20.19.41): @@ -9560,48 +9038,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jest-environment-jsdom@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 20.19.41 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.29.7 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.19.41 - jest-util: 29.7.0 - - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.19.41 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.2 - jiti@1.21.7: {} jiti@2.6.1: {} @@ -9618,39 +9054,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@20.0.3: - dependencies: - abab: 2.0.6 - acorn: 8.16.0 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.6.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.5 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.23 - parse5: 7.3.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.21.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - jsdom@26.1.0: dependencies: cssstyle: 4.6.0 @@ -10404,12 +9807,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - printj@1.1.2: {} process@0.11.10: {} @@ -10428,174 +9825,116 @@ snapshots: proxy-from-env@2.1.0: {} - psl@1.15.0: - dependencies: - punycode: 2.3.1 - punycode@2.3.1: {} - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} - react-aria@3.48.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-aria@3.48.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 '@internationalized/string': 3.2.8 - '@react-types/shared': 3.34.0(react@18.3.1) + '@react-types/shared': 3.34.0(react@19.2.7) '@swc/helpers': 0.5.23 aria-hidden: 1.2.6 clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-stately: 3.46.0(react@18.3.1) - use-sync-external-store: 1.6.0(react@18.3.1) - - react-content-loader@7.1.2(react@18.3.1): - dependencies: - react: 18.3.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-stately: 3.46.0(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) - react-dom@18.3.1(react@18.3.1): + react-dom@19.2.7(react@19.2.7): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.2.7 + scheduler: 0.27.0 - react-draft-wysiwyg@1.15.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-draft-wysiwyg@1.15.0(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: classnames: 2.5.1 - draft-js: 0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - draftjs-utils: 0.10.2(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3) - html-to-draftjs: 1.5.0(draft-js@0.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immutable@3.8.3) + draft-js: 0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + draftjs-utils: 0.10.2(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3) + html-to-draftjs: 1.5.0(draft-js@0.11.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(immutable@3.8.3) immutable: 3.8.3 linkify-it: 2.2.0 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-fast-compare@2.0.4: {} react-fast-compare@3.2.2: {} - react-helmet@6.1.0(react@18.3.1): + react-helmet@6.1.0(react@19.2.7): dependencies: object-assign: 4.1.1 prop-types: 15.8.1 - react: 18.3.1 + react: 19.2.7 react-fast-compare: 3.2.2 - react-side-effect: 2.1.2(react@18.3.1) - - react-helsinki-headless-cms@1.3.0(@apollo/client@3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(date-fns@4.3.0)(hds-react@5.2.0(@types/react@18.3.29)(eslint@9.39.4(jiti@2.7.0))(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - classnames: 2.5.1 - date-fns: 4.3.0 - hds-design-tokens: 3.13.0 - hds-react: 5.2.0(@types/react@18.3.29)(eslint@9.39.4(jiti@2.7.0))(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(postcss@8.5.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - html-entities: 2.6.0 - html-react-parser: 4.2.10(react@18.3.1) - isomorphic-dompurify: 2.36.0 - jest-environment-jsdom: 29.7.0 - lodash-es: 4.18.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@apollo/client': 3.14.1(@types/react@18.3.29)(graphql-ws@6.0.8(graphql@16.14.0)(ws@8.21.0))(graphql@16.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - '@noble/hashes' - - bufferutil - - canvas - - supports-color - - utf-8-validate + react-side-effect: 2.1.2(react@19.2.7) - react-hook-form@7.76.1(react@18.3.1): + react-hook-form@7.76.1(react@19.2.7): dependencies: - react: 18.3.1 + react: 19.2.7 - react-i18next@15.7.4(i18next@24.2.3(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): + react-i18next@15.7.4(i18next@24.2.3(typescript@5.9.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3): dependencies: '@babel/runtime': 7.29.7 html-parse-stringify: 3.0.1 i18next: 24.2.3(typescript@5.9.3) - react: 18.3.1 + react: 19.2.7 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + react-dom: 19.2.7(react@19.2.7) typescript: 5.9.3 - react-idle-timer@5.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-idle-timer@5.7.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-is@16.13.1: {} react-is@17.0.2: {} - react-is@18.3.1: {} - - react-lifecycles-compat@3.0.4: {} - react-merge-refs@1.1.0: {} - react-modal@3.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - exenv: 1.2.2 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-lifecycles-compat: 3.0.4 - warning: 4.0.3 - - react-popper@2.2.5(@popperjs/core@2.11.5)(react@18.3.1): + react-popper@2.2.5(@popperjs/core@2.11.5)(react@19.2.7): dependencies: '@popperjs/core': 2.11.5 - react: 18.3.1 + react: 19.2.7 react-fast-compare: 3.2.2 warning: 4.0.3 react-property@2.0.2: {} - react-router@7.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router@7.15.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: cookie: 1.1.1 - react: 18.3.1 + react: 19.2.7 set-cookie-parser: 2.7.2 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + react-dom: 19.2.7(react@19.2.7) - react-side-effect@2.1.2(react@18.3.1): + react-side-effect@2.1.2(react@19.2.7): dependencies: - react: 18.3.1 + react: 19.2.7 - react-stately@3.46.0(react@18.3.1): + react-stately@3.46.0(react@19.2.7): dependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 '@internationalized/string': 3.2.8 - '@react-types/shared': 3.34.0(react@18.3.1) + '@react-types/shared': 3.34.0(react@19.2.7) '@swc/helpers': 0.5.23 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) - - react-table@7.8.0(react@18.3.1): - dependencies: - react: 18.3.1 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) - react-toastify@11.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-use-measure@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-use-measure@2.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: debounce: 1.2.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.2.7: {} readable-stream@3.6.2: dependencies: @@ -10630,10 +9969,10 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - rehackt@0.1.0(@types/react@18.3.29)(react@18.3.1): + rehackt@0.1.0(@types/react@18.3.29)(react@19.2.7): optionalDependencies: '@types/react': 18.3.29 - react: 18.3.1 + react: 19.2.7 remark-footnotes@3.0.0: dependencies: @@ -10674,8 +10013,6 @@ snapshots: require-from-string@2.0.2: {} - requires-port@1.0.0: {} - reselect@4.1.8: {} resolve-from@4.0.0: {} @@ -10779,9 +10116,7 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.27.0: {} scuid@1.1.0: {} @@ -10896,19 +10231,12 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.6.1: - optional: true - sponge-case@1.0.1: dependencies: tslib: 2.8.1 stable-hash-x@0.2.0: {} - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - stackback@0.0.2: {} statuses@2.0.2: {} @@ -11021,18 +10349,10 @@ snapshots: dependencies: style-to-object: 1.0.14 - style-to-js@1.1.8: - dependencies: - style-to-object: 1.0.3 - style-to-object@1.0.14: dependencies: inline-style-parser: 0.2.7 - style-to-object@1.0.3: - dependencies: - inline-style-parser: 0.2.2 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -11106,13 +10426,6 @@ snapshots: toposort@2.0.2: {} - tough-cookie@4.1.4: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -11123,10 +10436,6 @@ snapshots: tr46@0.0.3: {} - tr46@3.0.0: - dependencies: - punycode: 2.3.1 - tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -11137,10 +10446,6 @@ snapshots: trough@1.0.5: {} - ts-api-utils@1.4.3(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -11176,8 +10481,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.21.3: {} type-fest@2.19.0: {} @@ -11259,8 +10562,6 @@ snapshots: '@types/unist': 2.0.11 unist-util-is: 4.1.0 - universalify@0.2.0: {} - unixify@1.0.0: dependencies: normalize-path: 2.1.1 @@ -11312,22 +10613,17 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - urlpattern-polyfill@10.1.0: {} - use-deep-compare-effect@1.8.1(react@18.3.1): + use-deep-compare-effect@1.8.1(react@19.2.7): dependencies: '@babel/runtime': 7.29.7 dequal: 2.0.3 - react: 18.3.1 + react: 19.2.7 - use-sync-external-store@1.6.0(react@18.3.1): + use-sync-external-store@1.6.0(react@19.2.7): dependencies: - react: 18.3.1 + react: 19.2.7 util-arity@1.1.0: {} @@ -11423,10 +10719,6 @@ snapshots: void-elements@3.1.0: {} - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -11449,25 +10741,14 @@ snapshots: webidl-conversions@8.0.1: {} - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} - whatwg-mimetype@4.0.0: {} whatwg-mimetype@5.0.0: {} - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - whatwg-url@14.2.0: dependencies: tr46: 5.1.1 @@ -11558,8 +10839,6 @@ snapshots: ws@8.21.0: {} - xml-name-validator@4.0.0: {} - xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} diff --git a/src/clients/apiReportClient/useReportClientQuery.ts b/src/clients/apiReportClient/useReportClientQuery.ts index 78805a512..5f1d9cf39 100644 --- a/src/clients/apiReportClient/useReportClientQuery.ts +++ b/src/clients/apiReportClient/useReportClientQuery.ts @@ -1,7 +1,7 @@ import { useTranslation } from 'react-i18next'; -import { toast } from 'react-toastify'; import apiReportClient, { ROUTES } from './apiReportClient'; +import { useNotificationsContext } from '../../common/components/notificationsContext/hooks/useNotificationsContext'; /** * A browser hack to download a file instead of just a byte string. @@ -18,6 +18,8 @@ function downloadFile(data: string, filename: string) { function useDownloadEventsEnrolmentsCsvQuery(pEventId: string | undefined) { const { t } = useTranslation(); + const { addNotification } = useNotificationsContext(); + if (!pEventId) return undefined; return async () => { const filename = `kultus_events_approved_enrolments.csv`; @@ -39,7 +41,10 @@ function useDownloadEventsEnrolmentsCsvQuery(pEventId: string | undefined) { if (response.status === 200 && response?.data?.type === 'text/csv') { downloadFile(response.data, filename); } else { - toast.error(t('eventEnrolmentsReport.downloadError')); + addNotification({ + type: 'error', + label: t('eventEnrolmentsReport.downloadError'), + }); } }; } diff --git a/src/common/components/autoSuggest/__test__/AutoSuggest.test.tsx b/src/common/components/autoSuggest/__test__/AutoSuggest.test.tsx index b663204fa..e9c87e156 100644 --- a/src/common/components/autoSuggest/__test__/AutoSuggest.test.tsx +++ b/src/common/components/autoSuggest/__test__/AutoSuggest.test.tsx @@ -3,6 +3,7 @@ import userEvent from '@testing-library/user-event'; import * as React from 'react'; import { vi } from 'vitest'; +import { NotificationsProvider } from '../../notificationsContext/NotificationsContext'; import AutoSuggest, { AutoSuggestProps } from '../AutoSuggest'; const options = [ @@ -34,7 +35,11 @@ function renderAutoSuggest(props?: Partial) { ...props, }; - const { rerender } = render(); + const { rerender } = render( + + + + ); return { ...defaultProps, @@ -42,7 +47,11 @@ function renderAutoSuggest(props?: Partial) { onBlur, setInputValue, rerender: (newProps: Partial) => - rerender(), + rerender( + + + + ), }; } diff --git a/src/common/components/deleteButton/__tests__/__snapshots__/DeleteButton.test.tsx.snap b/src/common/components/deleteButton/__tests__/__snapshots__/DeleteButton.test.tsx.snap index 723db321a..45125c0ff 100644 --- a/src/common/components/deleteButton/__tests__/__snapshots__/DeleteButton.test.tsx.snap +++ b/src/common/components/deleteButton/__tests__/__snapshots__/DeleteButton.test.tsx.snap @@ -11,7 +11,7 @@ exports[`matches snapshot 1`] = `
-
    - {items.map((item, index) => { - return ( - - ); - })} -
-
- ); -}; - -export default MenuDropdown; diff --git a/src/common/components/menuDropdown/__tests__/MenuDropdown.test.tsx b/src/common/components/menuDropdown/__tests__/MenuDropdown.test.tsx deleted file mode 100644 index 32f13e3b6..000000000 --- a/src/common/components/menuDropdown/__tests__/MenuDropdown.test.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { - act, - fireEvent, - render, - screen, - waitFor, -} from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import * as React from 'react'; -import { vi } from 'vitest'; - -import MenuDropdown, { MenuDropdownProps, MenuItem } from '../MenuDropdown'; - -const renderMenuDropdown = async (props: MenuDropdownProps) => { - const ui = ; - - // FIXME: Remove act() wrapping workaround, see if warning can be fixed better: - const { container } = await act(() => render(ui)); - - const toggleButton = await screen.findByLabelText(props.buttonText, { - selector: 'button', - }); - - const getItemAtIndex = async (index: number) => - (await screen.findAllByRole('menuitem'))[index]; - - const arrowDown = () => { - fireEvent.keyDown(container, { key: 'ArrowDown' }); - }; - - const arrowUp = () => { - fireEvent.keyDown(container, { key: 'ArrowUp' }); - }; - - return { - toggleButton, - getItemAtIndex, - arrowDown, - arrowUp, - }; -}; - -const onClickMock = vi.fn(); - -const items: MenuItem[] = [1, 2, 3, 4].map((item) => ({ - onClick: onClickMock, - text: `Item ${item}`, - value: `item_${item}`, -})); - -const buttonText = 'Select item'; - -const defaultProps: MenuDropdownProps = { - buttonAriaLabel: buttonText, - buttonText, - items, -}; - -describe('MenuDropdown component', () => { - it('changes focused item correctly', async () => { - const { arrowDown, arrowUp, toggleButton, getItemAtIndex } = - await renderMenuDropdown(defaultProps); - - await userEvent.click(toggleButton); - - arrowDown(); - - expect(await getItemAtIndex(0)).toHaveClass('isFocused'); - - arrowDown(); - arrowDown(); - - expect(await getItemAtIndex(2)).toHaveClass('isFocused'); - - arrowDown(); - - expect(await getItemAtIndex(3)).toHaveClass('isFocused'); - - arrowDown(); - - expect(await getItemAtIndex(0)).toHaveClass('isFocused'); - - arrowUp(); - - expect(await getItemAtIndex(3)).toHaveClass('isFocused'); - }); - - it('calls onChange callback correctly', async () => { - const { getItemAtIndex, toggleButton } = - await renderMenuDropdown(defaultProps); - - await userEvent.click(toggleButton); - - for (const [index, item] of items.entries()) { - await userEvent.click(await getItemAtIndex(index)); - await waitFor(() => expect(onClickMock).toHaveBeenCalledTimes(index + 1)); - await waitFor(() => expect(onClickMock).toHaveBeenCalledWith(item.value)); - } - }); -}); diff --git a/src/common/components/menuDropdown/menuDropdown.module.scss b/src/common/components/menuDropdown/menuDropdown.module.scss deleted file mode 100644 index 23968bb67..000000000 --- a/src/common/components/menuDropdown/menuDropdown.module.scss +++ /dev/null @@ -1,120 +0,0 @@ -.menuDropdown { - --background-color-menu: var(--color-white); - --background-color-menu-item-focus: var(--color-fog); - - --border-color-button: var(--color-white); - --border-color-button-focus: var(--color-black); - --border-bottom-color-menu-item: var(--color-black-10); - - --color-button: var(--color-black); - - --fontsize-button: var(--fontsize-body-m); - --fontsize-menu-item: var(--fontsize-body-m); - - --fontweight-menu-item: normal; - --fontweight-menu-item-selected: 600; - - --margin-left-icon-angle: var(--spacing-xs); - - --margin-right-button-icon: var(--spacing-xs); - --margin-right-menu-item-icon: var(--spacing-xs); - - --size-menu-item-icon: 1.5rem; - --size-button-icon: 1.5rem; - --size-button-angle-icon: 1.25rem; - - --spacing-button: var(--spacing-2-xs); - --spacing-menu-item: var(--spacing-s); -} - -.menuDropdown { - position: relative; - align-self: center; -} - -.dropdownButton { - display: flex; - font-size: var(--fontsize-button); - color: var(--color-button); - font-weight: normal; - align-items: center; - padding: var(--spacing-button); - border: 2px solid var(--border-color-button); - - .iconWrapper { - height: var(--size-button-icon); - width: var(--size-button-icon); - margin-right: var(--margin-right-button-icon); - } - - .textWrapper { - display: flex; - align-items: center; - } - - .iconAngle { - height: var(--size-button-angle-icon); - width: var(--size-button-angle-icon); - margin-left: var(--margin-left-icon-angle); - } - - .iconAngleUp { - transform: rotate(180deg); - } - - &:focus { - border-color: var(--border-color-button-focus); - } -} - -.dropdownMenu { - display: none; - - &.isOpen { - display: block; - position: absolute; - margin: 0; - padding: 0; - list-style: none; - top: 100%; - right: 0; - background-color: var(--background-color-menu); - box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.2); - z-index: 1000; - min-width: -webkit-fill-available; - } -} - -.menuItem { - display: flex; - align-items: center; - cursor: pointer; - white-space: nowrap; - padding: var(--spacing-menu-item); - font-size: var(--fontsize-menu-item); - font-weight: var(--fontweight-menu-item); - border-bottom: 1px solid var(--border-bottom-color-menu-item); - - &.isSelected { - font-weight: var(--fontweight-menu-item-selected); - } - - &.isFocused { - background-color: var(--background-color-menu-item-focus); - } - - &:hover { - text-decoration: underline; - } - - .menuItemIconWrapper { - margin-right: var(--margin-right-menu-item-icon); - align-items: center; - display: flex; - - svg { - height: var(--size-menu-item-icon); - width: var(--size-menu-item-icon); - } - } -} diff --git a/src/common/components/modal/AlertModal.tsx b/src/common/components/modal/AlertModal.tsx index 896496a16..a684a275d 100644 --- a/src/common/components/modal/AlertModal.tsx +++ b/src/common/components/modal/AlertModal.tsx @@ -1,9 +1,8 @@ -import { Button, ButtonVariant, IconInfoCircle } from 'hds-react'; +import { Button, ButtonVariant } from 'hds-react'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import Modal from './Modal'; -import styles from './modal.module.scss'; +import BaseDialogModal from './BaseDialogModal'; interface Props { confirmButtonText: string; @@ -23,32 +22,35 @@ const AlertModal: React.FC = ({ toggleModal, }) => { const { t } = useTranslation(); + return ( - } + + + + + } > {children} -
- - -
-
+ ); }; diff --git a/src/common/components/modal/BaseDialogModal.tsx b/src/common/components/modal/BaseDialogModal.tsx new file mode 100644 index 000000000..7d8357ac8 --- /dev/null +++ b/src/common/components/modal/BaseDialogModal.tsx @@ -0,0 +1,61 @@ +import { Dialog, IconInfoCircle } from 'hds-react'; +import * as React from 'react'; +import { useTranslation } from 'react-i18next'; + +type Props = { + id: string; + isOpen: boolean; + title: string; + toggleModal: () => void; + actions: React.ReactNode; + children?: React.ReactNode; + variant?: React.ComponentProps['variant']; + iconStart?: React.ReactNode; + className?: string; + style?: React.CSSProperties; +}; + +const BaseDialogModal: React.FC = ({ + actions, + children, + id, + isOpen, + title, + toggleModal, + variant, + iconStart, + className, + style, +}) => { + const { t } = useTranslation(); + const instanceSuffix = React.useId().replaceAll(':', ''); + const dialogId = `${id}-${instanceSuffix}`; + + const titleId = `${dialogId}-title`; + const descriptionId = `${dialogId}-content`; + + return ( + + } + /> + {children} + {actions} + + ); +}; + +export default BaseDialogModal; diff --git a/src/common/components/modal/ConfirmationModal.tsx b/src/common/components/modal/ConfirmationModal.tsx index ab32829d0..66352b911 100644 --- a/src/common/components/modal/ConfirmationModal.tsx +++ b/src/common/components/modal/ConfirmationModal.tsx @@ -1,9 +1,8 @@ -import { Button, ButtonVariant, IconInfoCircle } from 'hds-react'; +import { Button, ButtonVariant } from 'hds-react'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import Modal from './Modal'; -import styles from './modal.module.scss'; +import BaseDialogModal from './BaseDialogModal'; interface Props { confirmButtonText: string; @@ -23,31 +22,34 @@ const ConfirmationModal: React.FC = ({ toggleModal, }) => { const { t } = useTranslation(); + return ( - } + + + + + } > {children} -
- - -
-
+ ); }; diff --git a/src/common/components/modal/Modal.tsx b/src/common/components/modal/Modal.tsx deleted file mode 100644 index 00711a966..000000000 --- a/src/common/components/modal/Modal.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import classNames from 'classnames'; -import * as React from 'react'; -import ReactModal from 'react-modal'; - -import styles from './modal.module.scss'; - -interface Props { - className?: string; - icon: React.ReactElement; - isOpen: boolean; - title: string; - toggleModal: () => void; - children?: React.ReactNode; -} - -const Modal: React.FC = ({ - children, - className, - icon, - isOpen, - title, - toggleModal, -}) => { - return ( -
- {isOpen && ( - -
-
{icon}
-
-
{title}
-
{children}
-
-
-
- )} -
- ); -}; - -export default Modal; diff --git a/src/common/components/modal/NotificationModal.tsx b/src/common/components/modal/NotificationModal.tsx index 04b3c99e4..f52d75b71 100644 --- a/src/common/components/modal/NotificationModal.tsx +++ b/src/common/components/modal/NotificationModal.tsx @@ -1,9 +1,8 @@ -import { Button, ButtonVariant, IconInfoCircle } from 'hds-react'; +import { Button, ButtonVariant } from 'hds-react'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import Modal from './Modal'; -import styles from './modal.module.scss'; +import BaseDialogModal from './BaseDialogModal'; interface Props { isOpen: boolean; @@ -21,15 +20,14 @@ const NotificationModal: React.FC = ({ onConfirm, }) => { const { t } = useTranslation(); + return ( - } + - {children} -
+ actions={ -
-
+ } + > + {children} + ); }; diff --git a/src/common/components/modal/confirmModal.module b/src/common/components/modal/confirmModal.module deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/components/modal/modal.module.scss b/src/common/components/modal/modal.module.scss deleted file mode 100644 index fcbd42408..000000000 --- a/src/common/components/modal/modal.module.scss +++ /dev/null @@ -1,105 +0,0 @@ -@use '~styles/layout'; - -.bodyOpen { - overflow: hidden; -} - -.overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(#000, 0.75); - display: flex; - align-items: center; - justify-content: center; - z-index: 10; -} - -.modal { - --background-color-modal: var(--color-white); - - --border-color-modal: var(--color-bus); - --border-color-modal-alert: var(--color-error); - - --color-icon: var(--color-black); - --color-title: var(--color-black); - - --fontsize-title: var(--fontsize-heading-s); - - --fontweight-title: bold; - - --lineheight-title: 2.5rem; - - --grid-gap: var(--spacing-m); - - --spacing-modal: var(--spacing-3-xl); - - --width-icon: 2.5rem; - --width-modal: 660px; -} - -.modal { - background-color: var(--background-color-modal); - border: 1px solid var(--border-color-modal); - position: relative; - padding: var(--spacing-modal); - outline: none; - - @include layout.respond-below(l-plus) { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - } - - @include layout.respond-above(l-plus) { - width: var(--width-modal); - } -} - -.modalContent { - display: grid; - grid-template-columns: var(--width-icon) 1fr var(--width-icon); - grid-gap: var(--grid-gap); - - p { - margin: var(--spacing-m) 0; - } -} - -.iconWrapper { - fill: var(--color-icon); - - svg { - height: var(--width-icon); - width: var(--width-icon); - } -} - -.title { - color: var(--color-title); - font-size: var(--fontsize-title); - font-weight: var(--fontweight-title); - line-height: var(--lineheight-title); - text-transform: uppercase; -} - -.buttonWrapper { - display: grid; - grid-template-columns: 1fr 1fr; - margin-top: var(--spacing-3-xl); - grid-gap: var(--grid-gap); -} - -.alertModal { - border-color: var(--border-color-modal-alert); - overflow-y: auto; -} - -.notificationButtonWrapper { - display: flex; - margin-top: var(--spacing-3-xl); -} diff --git a/src/common/components/notificationsContext/NotificationsContext.tsx b/src/common/components/notificationsContext/NotificationsContext.tsx new file mode 100644 index 000000000..28cc9bb37 --- /dev/null +++ b/src/common/components/notificationsContext/NotificationsContext.tsx @@ -0,0 +1,99 @@ +import { Notification, NotificationProps, NotificationSize } from 'hds-react'; +import uniqueId from 'lodash/uniqueId'; +import React, { + CSSProperties, + createContext, + FC, + PropsWithChildren, + useCallback, + useMemo, + useState, + useLayoutEffect, +} from 'react'; + +export type NotificationsContextProps = { + addNotification: (props: NotificationProps) => void; +}; + +export const NotificationsContext = createContext< + NotificationsContextProps | undefined +>(undefined); + +const NOTIFICATION_OFFSET = 24; +const NOTIFICATION_Z_INDEX = 1000; +const AUTO_CLOSE_DURATION = 10000; + +const removeNotificationById = ( + items: NotificationProps[], + id: NotificationProps['id'] +) => items.filter((item) => item.id !== id); + +const getNotificationStyle = ( + heights: number[], + index: number +): CSSProperties => { + const topMargin = heights + .slice(0, index) + .reduce( + (acc, curr) => acc + curr + NOTIFICATION_OFFSET, + NOTIFICATION_OFFSET + ); + + return { + top: topMargin, + transform: 'translate3d(0px, 0px, 0px)', + zIndex: NOTIFICATION_Z_INDEX, + }; +}; + +export const NotificationsProvider: FC = ({ children }) => { + const [notifications, setNotifications] = useState([]); + + const addNotification = useCallback((props: NotificationProps) => { + setNotifications((items) => [ + ...items, + { ...props, id: uniqueId('notification-') }, + ]); + }, []); + + const value = useMemo( + () => ({ addNotification }), + [addNotification] + ); + + const [heights, setHeights] = useState([]); + useLayoutEffect(() => { + setHeights( + notifications.map( + ({ id }) => document.getElementById(id as string)?.clientHeight ?? 0 + ) + ); + }, [notifications]); + + return ( + + {notifications.map((props, index) => { + return ( + + setNotifications((items) => + removeNotificationById(items, props.id) + ) + } + /> + ); + })} + {children} + + ); +}; diff --git a/src/common/components/notificationsContext/__tests__/NotificationsContext.test.tsx b/src/common/components/notificationsContext/__tests__/NotificationsContext.test.tsx new file mode 100644 index 000000000..6f744d8ef --- /dev/null +++ b/src/common/components/notificationsContext/__tests__/NotificationsContext.test.tsx @@ -0,0 +1,58 @@ +import { configure, render, screen, waitFor } from '@testing-library/react'; +import React, { useEffect } from 'react'; + +import { useNotificationsContext } from '../hooks/useNotificationsContext'; +import { NotificationsProvider } from '../NotificationsContext'; + +configure({ defaultHidden: true }); + +it('should show several notifications', async () => { + const Component = () => { + const { addNotification } = useNotificationsContext(); + + useEffect(() => { + addNotification({ label: 'Notification 1', type: 'success' }); + addNotification({ label: 'Notification 2', type: 'error' }); + addNotification({ label: 'Notification 3', type: 'info' }); + }, [addNotification]); + return null; + }; + + render( + + + + ); + + await screen.findByRole('alert', { name: 'Notification 1' }); + await screen.findByRole('alert', { name: 'Notification 2' }); + await screen.findByRole('alert', { name: 'Notification 3' }); +}); + +it('should automatically hide notification after certain period of time', async () => { + const Component = () => { + const { addNotification } = useNotificationsContext(); + + useEffect(() => { + addNotification({ + autoCloseDuration: 50, + label: 'Notification 1', + type: 'success', + }); + }); + return null; + }; + + render( + + + + ); + + await screen.findByRole('alert', { name: 'Notification 1' }); + await waitFor(() => + expect( + screen.queryByRole('alert', { name: 'Notification 1' }) + ).not.toBeInTheDocument() + ); +}); diff --git a/src/common/components/notificationsContext/hooks/useNotificationsContext.ts b/src/common/components/notificationsContext/hooks/useNotificationsContext.ts new file mode 100644 index 000000000..ea7eaa8f7 --- /dev/null +++ b/src/common/components/notificationsContext/hooks/useNotificationsContext.ts @@ -0,0 +1,23 @@ +/* eslint @typescript-eslint/explicit-function-return-type: 0 */ +import { useContext } from 'react'; + +import { + NotificationsContext, + NotificationsContextProps, +} from '../NotificationsContext'; + +export const useNotificationsContext = (): NotificationsContextProps => { + const context = useContext( + NotificationsContext + ); + + /* istanbul ignore next */ + if (!context) { + throw new Error( + // eslint-disable-next-line max-len + 'NotificationsContext context is undefined, please verify you are calling useNotificationsContext() as child of a component.' + ); + } + + return context; +}; diff --git a/src/common/components/resetFocus/ResetFocus.tsx b/src/common/components/resetFocus/ResetFocus.tsx deleted file mode 100644 index 49159bcd3..000000000 --- a/src/common/components/resetFocus/ResetFocus.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; - -export const resetFocusId = 'reset-focus'; - -/** - * Ensure that browser focus is set to body when navigating using - * from react-router. - */ -const ResetFocus = (): React.ReactElement => { - const pathname = window?.location?.pathname; - const node = React.useRef(null); - - React.useEffect(() => { - const isClient = typeof window !== 'undefined'; - if (isClient) { - node.current?.focus(); - } - }, [pathname]); - - return
; -}; - -export default ResetFocus; diff --git a/src/common/components/skeletonLoader/SkeletonLoader.tsx b/src/common/components/skeletonLoader/SkeletonLoader.tsx deleted file mode 100644 index 2679c7890..000000000 --- a/src/common/components/skeletonLoader/SkeletonLoader.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React, { FunctionComponent } from 'react'; -import ContentLoader from 'react-content-loader'; - -interface Props { - width?: string; - height?: string; - backgroundColor?: string; - foregroundColor?: string; -} - -const SkeletonLoader: FunctionComponent = ({ - width = '200', - height = '18', - backgroundColor = '#f3f3f3', - foregroundColor = '#ecebeb', -}) => { - return ( - - - - ); -}; - -export default SkeletonLoader; diff --git a/src/common/components/table/Table.tsx b/src/common/components/table/Table.tsx index 33abb222e..6f9d575f1 100644 --- a/src/common/components/table/Table.tsx +++ b/src/common/components/table/Table.tsx @@ -1,16 +1,23 @@ +import { + ColumnDef, + ExpandedState, + flexRender, + getCoreRowModel, + getExpandedRowModel, + useReactTable, +} from '@tanstack/react-table'; import classNames from 'classnames'; -import React, { ReactElement } from 'react'; -import { Column, Row, useExpanded, useTable } from 'react-table'; +import React, { ReactElement, useState } from 'react'; import styles from './table.module.scss'; -import { ExtendedCell, ExtendedHeaderGroup, ExtendedRow } from './types'; +import { ExtendedColumnDef, ExtendedRow } from './types'; type Props> = { - columns: Array>; + columns: Array>; data: Array; expandedAreaOffset?: number; - onRowClick?: (row: Row) => void; - renderExpandedArea?: (row: D) => JSX.Element; + onRowClick?: (row: ExtendedRow) => void; + renderExpandedArea?: (row: D) => React.ReactElement; tableHeaderRowClassName?: string; }; @@ -22,48 +29,47 @@ export default function Table>({ renderExpandedArea, tableHeaderRowClassName, }: Props): ReactElement { - const { getTableBodyProps, getTableProps, headerGroups, prepareRow, rows } = - useTable( - { - columns, - data, - }, - useExpanded - ); + const [expanded, setExpanded] = useState({}); + + const table = useReactTable({ + data, + columns, + state: { + expanded, + }, + onExpandedChange: setExpanded, + getCoreRowModel: getCoreRowModel(), + getExpandedRowModel: getExpandedRowModel(), + }); + + const { getHeaderGroups, getRowModel } = table; // Render the UI for your table return (
- +
- {headerGroups.map((headerGroup) => { - const headerGroupProps = headerGroup.getHeaderGroupProps({ - className: tableHeaderRowClassName, - }); - const { key, ...restHeaderGroupProps } = headerGroupProps; - return ( - - {headerGroup.headers.map((column: ExtendedHeaderGroup) => { - const { style, className } = column; - const { key, ...restHeaderProps } = column.getHeaderProps(); - return ( - - ); - })} - - ); - })} + {getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + const { className, style } = + (header.column.columnDef as ExtendedColumnDef) || {}; + return ( + + ); + })} + + ))} - - {rows.map((row: ExtendedRow) => { - prepareRow(row); - + + {getRowModel().rows.map((row) => { const handleClick = (event: React.MouseEvent) => { const element = event.target as HTMLElement; if ( @@ -87,40 +93,42 @@ export default function Table>({ } }; - const { key, ...restRowProps } = row.getRowProps(); - return ( - + - {row.cells.map((cell: ExtendedCell) => { - const { className, style } = cell.column; - const { key, ...restCellProps } = cell.getCellProps(); + {row.getVisibleCells().map((cell) => { + const { className, style } = + (cell.column.columnDef as ExtendedColumnDef) || {}; return ( - ); })} - {row.isExpanded && ( + {row.getIsExpanded() && ( - {expandedAreaOffset > 0 && ( - - )} - + )} + diff --git a/src/common/components/table/types.ts b/src/common/components/table/types.ts index c3371bad5..976dddfc4 100644 --- a/src/common/components/table/types.ts +++ b/src/common/components/table/types.ts @@ -1,34 +1,22 @@ -import { - Cell, - ColumnInstance, - HeaderGroup, - Row, - UseExpandedRowProps, -} from 'react-table'; +import { Cell, ColumnDef, Header, Row, Table } from '@tanstack/react-table'; type StyleProps = { className?: string; style?: React.CSSProperties; }; -type ExtendedColumnInstance> = - ColumnInstance & StyleProps; +export type ExtendedColumnDef> = + ColumnDef & StyleProps; -export type ExtendedCell> = Cell< +export type ExtendedCell> = Cell & + StyleProps; + +export type ExtendedHeader> = Header< D, unknown -> & { - column: ExtendedColumnInstance; -}; +> & + StyleProps; -export type ExtendedHeaderGroup> = - HeaderGroup & StyleProps; +export type ExtendedRow> = Row; -export type ExtendedRow> = Row & { - isExpanded?: boolean; -}; - -export type UseExpandedColumnCell> = { - value: D; - row: UseExpandedRowProps; -}; +export type ExtendedTable> = Table; diff --git a/src/domain/app/App.tsx b/src/domain/app/App.tsx index 05ecb1548..958b163dd 100644 --- a/src/domain/app/App.tsx +++ b/src/domain/app/App.tsx @@ -1,21 +1,26 @@ import { ApolloProvider } from '@apollo/client'; +import { ConfigProvider as RHHCConfigProvider } from '@city-of-helsinki/react-helsinki-headless-cms'; import * as React from 'react'; -import { ConfigProvider as RHHCConfigProvider } from 'react-helsinki-headless-cms'; import { BrowserRouter } from 'react-router'; -import { ToastContainer } from 'react-toastify'; import { useApolloClient } from './apollo/apolloClient'; import AppRoutes from './routes/AppRoutes'; import { FORCE_SCROLL_TO_TOP, IGNORE_SCROLL_TO_TOP } from './routes/constants'; import ScrollToTop from './ScrollToTop'; +import { useNotificationsContext } from '../../common/components/notificationsContext/hooks/useNotificationsContext'; +import { NotificationsProvider } from '../../common/components/notificationsContext/NotificationsContext'; import { useCMSApolloClient } from '../../headless-cms/apollo/apolloClient'; import useRHHCConfig from '../../hooks/useRHHCConfig'; import IdleTimer from '../auth/IdleTimerProvider'; import KultusAdminHDSLoginProvider from '../auth/KultusAdminHDSLoginProvider'; import { OrganisationProvider } from '../organisation/contextProviders/OrganisationProvider'; -const App = () => { - const apolloClient = useApolloClient(); +const AppContent = () => { + const { addNotification } = useNotificationsContext(); + const apolloClient = useApolloClient({ + addNotification, + initialApolloState: null, + }); const cmsClient = useCMSApolloClient(); const rhhcConfig = useRHHCConfig({ @@ -24,26 +29,31 @@ const App = () => { venuesApolloClient: apolloClient, }); return ( - <> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + ); +}; + +const App = () => { + return ( + + + ); }; diff --git a/src/domain/app/__tests__/__snapshots__/apolloRHHC.test.tsx.snap b/src/domain/app/__tests__/__snapshots__/apolloRHHC.test.tsx.snap index 00954fb12..a8746d14b 100644 --- a/src/domain/app/__tests__/__snapshots__/apolloRHHC.test.tsx.snap +++ b/src/domain/app/__tests__/__snapshots__/apolloRHHC.test.tsx.snap @@ -29,75 +29,75 @@ exports[`test issues in connection between the apollo client and the RHHC-lib > exports[`test issues in connection between the apollo client and the RHHC-lib > apollo client should work with RHHC-lib > renders component that needs the apollo client with a custom wrapper [Function ApolloNavigationComponent] 1`] = `
Siirry sisältöön
diff --git a/src/domain/app/__tests__/apolloRHHC.test.tsx b/src/domain/app/__tests__/apolloRHHC.test.tsx index 24881e2e8..7bcaf6253 100644 --- a/src/domain/app/__tests__/apolloRHHC.test.tsx +++ b/src/domain/app/__tests__/apolloRHHC.test.tsx @@ -4,15 +4,18 @@ import { useApolloClient, } from '@apollo/client'; import { MockedProvider } from '@apollo/client/testing'; -import { render, renderHook } from '@testing-library/react'; -import React from 'react'; -import { ConfigProvider, useConfig } from 'react-helsinki-headless-cms'; +import { + ConfigProvider, + useConfig, +} from '@city-of-helsinki/react-helsinki-headless-cms'; import { LanguagesDocument, MenuDocument, Navigation, useLanguagesQuery, -} from 'react-helsinki-headless-cms/apollo'; +} from '@city-of-helsinki/react-helsinki-headless-cms/apollo'; +import { render, renderHook } from '@testing-library/react'; +import React from 'react'; import { vi } from 'vitest'; import useRHHCConfig from '../../../hooks/useRHHCConfig'; diff --git a/src/domain/app/apollo/__tests__/apolloClient.test.ts b/src/domain/app/apollo/__tests__/apolloClient.test.ts index 561f71771..8cc0dd033 100644 --- a/src/domain/app/apollo/__tests__/apolloClient.test.ts +++ b/src/domain/app/apollo/__tests__/apolloClient.test.ts @@ -15,23 +15,23 @@ describe('initializeApolloClient', () => { }); it('should create a new Apollo Client instance if no instance exists', () => { - const client = initializeApolloClient(); + const client = initializeApolloClient(null, vi.fn()); expect(client).toBeInstanceOf(ApolloClient); }); it('should return the existing Apollo Client instance if one exists', () => { - const existingClient = initializeApolloClient(); - const client = initializeApolloClient(); + const existingClient = initializeApolloClient(null, vi.fn()); + const client = initializeApolloClient(null, vi.fn()); expect(client).toBe(existingClient); expect(client).toBeInstanceOf(ApolloClient); }); it('should hydrate the cache with initial state if provided', () => { - const client = initializeApolloClient(); + const client = initializeApolloClient(null, vi.fn()); const restoreSpy = vitest.spyOn(client.cache, 'restore'); const extractSpy = vitest.spyOn(client, 'extract'); - initializeApolloClient(initialState); + initializeApolloClient(initialState, vi.fn()); expect(extractSpy).toHaveBeenCalled(); expect(restoreSpy).toHaveBeenCalledWith( @@ -73,11 +73,11 @@ describe('initializeApolloClient', () => { }, }; - const client = initializeApolloClient(); + const client = initializeApolloClient(null, vi.fn()); client.cache.restore(existingState); const restoreSpy = vitest.spyOn(client.cache, 'restore'); - initializeApolloClient(initialState); + initializeApolloClient(initialState, vi.fn()); expect(restoreSpy).toHaveBeenCalled(); const mergedState = restoreSpy.mock.calls[0][0] as any; diff --git a/src/domain/app/apollo/apolloClient.ts b/src/domain/app/apollo/apolloClient.ts index 0d56de22e..b9539e2ac 100644 --- a/src/domain/app/apollo/apolloClient.ts +++ b/src/domain/app/apollo/apolloClient.ts @@ -8,10 +8,9 @@ import * as Sentry from '@sentry/browser'; import createUploadLink from 'apollo-upload-client/createUploadLink.mjs'; import fetch from 'cross-fetch'; import merge from 'deepmerge'; -import { ErrorMessage } from 'formik'; +import { NotificationProps } from 'hds-react'; import isEqual from 'lodash/isEqual'; import { useRef } from 'react'; -import { toast } from 'react-toastify'; import { createApolloCache } from './cache'; import { getKultusAdminApiTokenFromStorage } from '../../auth/kultusAdminApiUtils'; @@ -19,6 +18,23 @@ import AppConfig from '../AppConfig'; import i18n from '../i18n/i18nInit'; let apolloClient: ApolloClient | undefined; +const defaultNotify = () => {}; +let notify: (props: NotificationProps) => void = defaultNotify; + +function notifyGraphQLError(props: NotificationProps, errorMessage: string) { + if (notify === defaultNotify) { + if (import.meta.env.DEV) { + // eslint-disable-next-line no-console + console.warn( + '[Apollo] Notification callback missing; GraphQL error was not shown to the user.', + errorMessage + ); + } + return; + } + + notify(props); +} /** * Creates a new Apollo Client instance. @@ -39,12 +55,18 @@ function createApolloClient(): ApolloClient { graphQLErrors.forEach(({ extensions, message, locations, path }) => { const errorMessage = `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`; - Sentry.captureException(ErrorMessage); + Sentry.captureException(new Error(errorMessage)); const code = extensions && extensions['code']; switch (code) { case 'PERMISSION_DENIED_ERROR': - toast.error(i18n.t('apollo.graphQLErrors.permissionDeniedError')); + notifyGraphQLError( + { + label: i18n.t('apollo.graphQLErrors.permissionDeniedError'), + type: 'error', + }, + errorMessage + ); break; default: if (import.meta.env.DEV) { @@ -78,7 +100,11 @@ function createApolloClient(): ApolloClient { return new ApolloClient({ connectToDevTools: true, - link: ApolloLink.from([errorLink, authLink, httpLink]), + link: ApolloLink.from([ + errorLink, + authLink, + httpLink as unknown as ApolloLink, + ]), cache: createApolloCache(), }); @@ -94,8 +120,11 @@ function createApolloClient(): ApolloClient { * @returns An Apollo Client instance. */ export function initializeApolloClient( - initialState: NormalizedCacheObject | null = null + initialState: NormalizedCacheObject | null = null, + addNotification?: (props: NotificationProps) => void ): ApolloClient { + notify = addNotification ?? notify; + const _apolloClient = apolloClient ?? createApolloClient(); // Initial state hydration @@ -140,18 +169,18 @@ export function initializeApolloClient( * @param options Optional object containing `initialApolloState` for cache hydration. * @returns An Apollo Client instance. */ -export function useApolloClient( - { - initialApolloState, - }: - | { - initialApolloState: NormalizedCacheObject | null; - } - | undefined = { initialApolloState: null } -): ApolloClient { - const storeRef = useRef>(); +export function useApolloClient(options?: { + initialApolloState?: NormalizedCacheObject | null; + addNotification?: (props: NotificationProps) => void; +}): ApolloClient { + const { initialApolloState = null, addNotification } = options ?? {}; + + const storeRef = useRef | null>(null); if (!storeRef.current) { - storeRef.current = initializeApolloClient(initialApolloState); + storeRef.current = initializeApolloClient( + initialApolloState, + addNotification + ); } return storeRef.current; } @@ -162,6 +191,7 @@ export function useApolloClient( */ export function resetApolloClient() { apolloClient = undefined; + notify = defaultNotify; } export const clearApolloCache = async () => { diff --git a/src/domain/app/footer/Footer.tsx b/src/domain/app/footer/Footer.tsx index ee0dbee8e..19f11cea2 100644 --- a/src/domain/app/footer/Footer.tsx +++ b/src/domain/app/footer/Footer.tsx @@ -1,13 +1,13 @@ +import type { MenuItem } from '@city-of-helsinki/react-helsinki-headless-cms'; +import { useMenuQuery } from '@city-of-helsinki/react-helsinki-headless-cms/apollo'; import { Footer as HDSFooter, Logo, logoFi, LogoSize, logoSv } from 'hds-react'; import React, { FunctionComponent } from 'react'; -import type { MenuItem } from 'react-helsinki-headless-cms'; -import { useMenuQuery } from 'react-helsinki-headless-cms/apollo'; import { useTranslation } from 'react-i18next'; import styles from './footer.module.scss'; -import { resetFocusId } from '../../../common/components/resetFocus/ResetFocus'; import { FOOTER_MENU_NAME } from '../../../headless-cms/constants'; import useLocale from '../../../hooks/useLocale'; +import { resetFocusId } from '../ScrollToTop'; type ValidMenuItem = { id: MenuItem['id']; diff --git a/src/domain/app/footer/__tests__/__snapshots__/Footer.test.tsx.snap b/src/domain/app/footer/__tests__/__snapshots__/Footer.test.tsx.snap index d33e6ef07..3f1f84a9d 100644 --- a/src/domain/app/footer/__tests__/__snapshots__/Footer.test.tsx.snap +++ b/src/domain/app/footer/__tests__/__snapshots__/Footer.test.tsx.snap @@ -2,10 +2,10 @@ exports[`Footer matches snapshot 1`] = `
- {column.render('Header')} -
+ {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} +
- {cell.render('Cell')} + + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )}
+ {expandedAreaOffset > 0 && + expandedAreaOffset < row.getVisibleCells().length && ( + {renderExpandedArea && renderExpandedArea(row.original)}
- ); -}; - -export default OccurrencesTable; diff --git a/src/domain/occurrences/occurrencesTable/__tests__/ActionsDropdown.test.tsx b/src/domain/occurrences/occurrencesTable/__tests__/ActionsDropdown.test.tsx index 84ddd0268..60d0b5e8b 100644 --- a/src/domain/occurrences/occurrencesTable/__tests__/ActionsDropdown.test.tsx +++ b/src/domain/occurrences/occurrencesTable/__tests__/ActionsDropdown.test.tsx @@ -1,7 +1,6 @@ import { screen } from '@testing-library/react'; import { userEvent } from '@testing-library/user-event'; import * as React from 'react'; -import Modal from 'react-modal'; import * as Router from 'react-router'; import { vi } from 'vitest'; @@ -136,9 +135,7 @@ it.each([EnrolmentType.External, EnrolmentType.Unenrollable])( it('renders cancel modal and cancel functionality works', async () => { const onCancelMock = vi.fn(); - const { container } = renderComponent({ onCancel: onCancelMock }); - - Modal.setAppElement(container); + renderComponent({ onCancel: onCancelMock }); await userEvent.click(screen.getByRole('button', { name: 'Valitse' })); @@ -183,9 +180,7 @@ it('renders cancel modal and cancel functionality works', async () => { it('renders delete modal correctly and delete functionality works', async () => { const onDeleteMock = vi.fn(); - const { container } = renderComponent({ onDelete: onDeleteMock }); - - Modal.setAppElement(container); + renderComponent({ onDelete: onDeleteMock }); expect(screen.getByRole('menu')).not.toHaveClass('isOpen'); diff --git a/src/domain/occurrences/occurrencesTable/occurrencesTable.module.scss b/src/domain/occurrences/occurrencesTable/occurrencesTable.module.scss deleted file mode 100644 index 06a38541a..000000000 --- a/src/domain/occurrences/occurrencesTable/occurrencesTable.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -.tableHeaderRow { - vertical-align: top; - line-height: var(--lineheight-m); -} - -.enrolmentsInfoText { - font-size: var(--fontsize-body-s); -} diff --git a/src/domain/occurrences/occurrencesTableReadOnly/OccurrencesTableSummary.tsx b/src/domain/occurrences/occurrencesTableReadOnly/OccurrencesTableSummary.tsx index 237f26652..0281128bf 100644 --- a/src/domain/occurrences/occurrencesTableReadOnly/OccurrencesTableSummary.tsx +++ b/src/domain/occurrences/occurrencesTableReadOnly/OccurrencesTableSummary.tsx @@ -1,7 +1,7 @@ +import { ColumnDef, Row } from '@tanstack/react-table'; import { LoadingSpinner } from 'hds-react'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { Row } from 'react-table'; import styles from './occurrencesTableSummary.module.scss'; import Table from '../../../common/components/table/Table'; @@ -33,6 +33,23 @@ export interface Props { loadingOccurrences: string[]; } +type EnrolmentsHeaderProps = { + title: string; + helper: string; +}; + +const EnrolmentsHeader: React.FC = ({ + title, + helper, +}) => { + return ( + <> +
{title}
+
{helper}
+ + ); +}; + const OccurrencesTableSummary: React.FC = ({ eventData, occurrences, @@ -62,10 +79,10 @@ const OccurrencesTableSummary: React.FC = ({ : EnrolmentType.Internal; const isInternalEnrolment = EnrolmentType.Internal === enrolmentType; - const enrolmentColumns = [ + const enrolmentColumns: ColumnDef[] = [ { - Header: t('occurrences.table.columnAmountOfSeats'), - accessor: (row: OccurrenceFieldsFragment) => { + header: t('occurrences.table.columnAmountOfSeats'), + accessorFn: (row) => { if ( row.seatType === OccurrencesOccurrenceSeatTypeChoices.EnrolmentCount ) { @@ -78,9 +95,9 @@ const OccurrencesTableSummary: React.FC = ({ id: 'amountOfSeats', }, { - Header: t('occurrences.table.columnEnrolmentStarts'), - // eslint-disable-next-line @typescript-eslint/no-unused-vars -- enrolmentStarts comes from event, not occurrence - accessor: (row: OccurrenceFieldsFragment) => + header: t('occurrences.table.columnEnrolmentStarts'), + + accessorFn: () => eventData?.event?.pEvent?.enrolmentStart ? formatLocalizedDate( new Date(eventData?.event?.pEvent?.enrolmentStart) @@ -89,31 +106,34 @@ const OccurrencesTableSummary: React.FC = ({ id: 'enrolmentStarts', }, { - Header: ( - <> -
{t('occurrences.table.columnEnrolments')}
-
- {t('occurrences.table.columnEnrolmentsHelper')} -
- + header: () => ( + ), - accessor: (row: OccurrenceFieldsFragment) => { - if (loadingOccurrences.includes(row.id)) { + cell: ({ row }) => { + if (loadingOccurrences.includes(row.original.id)) { return ; } - if (row.cancelled) { + if (row.original.cancelled) { return ( {t('occurrences.status.cancelled')} ); } - if (row.seatsTaken != null && row.seatsApproved != null) { + if ( + row.original.seatsTaken != null && + row.original.seatsApproved != null + ) { return ( ); } @@ -123,10 +143,10 @@ const OccurrencesTableSummary: React.FC = ({ }, ]; - const columns = [ + const columns: Array> = [ { - Header: t('occurrences.table.columnDate'), - accessor: (row: OccurrenceFieldsFragment) => { + header: t('occurrences.table.columnDate'), + accessorFn: (row) => { return isMultidayOccurrence(row) ? formatDateRange(new Date(row.startTime), new Date(row.endTime)) : formatLocalizedDate(new Date(row.startTime), DATE_FORMAT, locale); @@ -134,35 +154,34 @@ const OccurrencesTableSummary: React.FC = ({ id: 'date', }, { - accessor: (row: OccurrenceFieldsFragment) => + accessorFn: (row) => isMultidayOccurrence(row) ? null : formatTimeRange(new Date(row.startTime), new Date(row.endTime)), id: 'time', }, { - Header: t('occurrences.table.columnLocation'), - accessor: (row: OccurrenceFieldsFragment) => { - const placeId = row.placeId || eventLocationId; + header: t('occurrences.table.columnLocation'), + cell: ({ row }) => { + const placeId = row.original.placeId || eventLocationId; return placeId ? : '-'; }, id: 'place', }, ...(isInternalEnrolment ? enrolmentColumns : []), { - Header: t('occurrences.table.columnActions'), - accessor: (row: OccurrenceFieldsFragment) => ( + header: t('occurrences.table.columnActions'), + cell: ({ row }) => ( ), id: 'actions', - rowClickDisabled: true, }, ]; diff --git a/src/domain/venue/types.ts b/src/domain/venue/types.ts index 8454814e8..8c4d88186 100644 --- a/src/domain/venue/types.ts +++ b/src/domain/venue/types.ts @@ -1,16 +1,5 @@ import { LocalisedObjectInput } from '../../generated/graphql'; -export type OldVenueDataFields = { - locationDescription: LocalisedObjectInput; - hasClothingStorage: boolean; - hasSnackEatingPlace: boolean; - outdoorActivity: boolean; - hasToiletNearby: boolean; - hasAreaForGroupWork: boolean; - hasIndoorPlayingArea: boolean; - hasOutdoorPlayingArea: boolean; -}; - export type VenueDataFields = { locationDescription: LocalisedObjectInput; hasClothingStorage: boolean; diff --git a/src/headless-cms/__tests__/services.test.ts b/src/headless-cms/__tests__/services.test.ts index 6b39e79cc..55d722115 100644 --- a/src/headless-cms/__tests__/services.test.ts +++ b/src/headless-cms/__tests__/services.test.ts @@ -1,4 +1,4 @@ -import { dequal } from 'dequal'; +import isEqual from 'lodash/isEqual'; import { graphql, HttpResponse } from 'msw'; import { @@ -19,7 +19,7 @@ describe('queryPageWithUri', () => { const page = fakePage(); server.use( graphql.query('Page', ({ variables }) => { - if (dequal(variables, { id: 'test-page/nested-page', idType })) { + if (isEqual(variables, { id: 'test-page/nested-page', idType })) { return HttpResponse.json({ data: { page, diff --git a/src/headless-cms/apollo/apolloClient.ts b/src/headless-cms/apollo/apolloClient.ts index f02b96fa7..534ed019f 100644 --- a/src/headless-cms/apollo/apolloClient.ts +++ b/src/headless-cms/apollo/apolloClient.ts @@ -214,7 +214,7 @@ export function useCMSApolloClient( } | undefined = { initialCMSApolloState: null } ): ApolloClient { - const storeRef = useRef>(); + const storeRef = useRef | null>(null); if (!storeRef.current) { storeRef.current = initializeCMSApolloClient(initialCMSApolloState); } diff --git a/src/headless-cms/components/CmsPageContent.tsx b/src/headless-cms/components/CmsPageContent.tsx index 9c1a7953d..a2e1b0f9b 100644 --- a/src/headless-cms/components/CmsPageContent.tsx +++ b/src/headless-cms/components/CmsPageContent.tsx @@ -1,5 +1,5 @@ +import { HtmlToReact } from '@city-of-helsinki/react-helsinki-headless-cms'; import React from 'react'; -import { HtmlToReact } from 'react-helsinki-headless-cms'; import styles from './cmsPage.module.scss'; import CmsSidebarContent from './cmsSidebarContent/CmsSidebarContent'; diff --git a/src/headless-cms/components/__tests__/CmsPage.test.tsx b/src/headless-cms/components/__tests__/CmsPage.test.tsx index b8d731792..d7069511c 100644 --- a/src/headless-cms/components/__tests__/CmsPage.test.tsx +++ b/src/headless-cms/components/__tests__/CmsPage.test.tsx @@ -1,8 +1,8 @@ import { MockedResponse } from '@apollo/client/testing'; import { act, screen, waitFor, within } from '@testing-library/react'; import { userEvent } from '@testing-library/user-event'; -import { dequal } from 'dequal'; import * as HdsReact from 'hds-react'; +import isEqual from 'lodash/isEqual'; import { graphql, HttpResponse } from 'msw'; import React from 'react'; import { Route, Routes } from 'react-router'; @@ -327,7 +327,7 @@ beforeEach(() => { server.use( graphql.query('Page', ({ variables }) => { const mock = mocks.Page.find(({ variables: mockVariables }) => { - return dequal(mockVariables, variables); + return isEqual(mockVariables, variables); }); if (mock) { @@ -345,7 +345,7 @@ beforeEach(() => { ({ variables }) => { const mock = mocks.SubPagesSearch.find( ({ variables: mockVariables }) => { - return dequal(mockVariables, variables); + return isEqual(mockVariables, variables); } ); diff --git a/src/headless-cms/components/cmsSidebarContent/CmsSidebarContentLayoutLinkList.tsx b/src/headless-cms/components/cmsSidebarContent/CmsSidebarContentLayoutLinkList.tsx index 402726a45..ef1631845 100644 --- a/src/headless-cms/components/cmsSidebarContent/CmsSidebarContentLayoutLinkList.tsx +++ b/src/headless-cms/components/cmsSidebarContent/CmsSidebarContentLayoutLinkList.tsx @@ -1,6 +1,6 @@ +import { HtmlToReact } from '@city-of-helsinki/react-helsinki-headless-cms'; import { IconArrowRight } from 'hds-react'; import React from 'react'; -import { HtmlToReact } from 'react-helsinki-headless-cms'; import styles from './cmsSidebarContentLayoutLinkList.module.scss'; import ExternalLink from '../../../common/components/externalLink/ExternalLink'; diff --git a/src/hooks/useRHHCConfig.tsx b/src/hooks/useRHHCConfig.tsx index cc99f3290..6b26b2f2e 100644 --- a/src/hooks/useRHHCConfig.tsx +++ b/src/hooks/useRHHCConfig.tsx @@ -1,5 +1,5 @@ -import type { Config } from 'react-helsinki-headless-cms'; -import { defaultConfig as rhhcDefaultConfig } from 'react-helsinki-headless-cms'; +import type { Config } from '@city-of-helsinki/react-helsinki-headless-cms'; +import { defaultConfig as rhhcDefaultConfig } from '@city-of-helsinki/react-helsinki-headless-cms'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router'; diff --git a/src/index.tsx b/src/index.tsx index f40cfff45..24650d024 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -5,7 +5,6 @@ import './domain/app/i18n/i18nInit'; import * as Sentry from '@sentry/browser'; import * as React from 'react'; import { createRoot } from 'react-dom/client'; -import Modal from 'react-modal'; import App from './domain/app/App'; import * as serviceWorker from './serviceWorker'; @@ -35,8 +34,6 @@ if (getEnvValue('VITE_APP_SENTRY_DSN')) { }); } -Modal.setAppElement('#root'); - const container = document.getElementById('root') as Element; const root = createRoot(container); // HDS Login Component is too aggressive with the login time issues and the StrictMode gives unwanted issues. diff --git a/src/test/apollo-mocks/footerMenuMock.ts b/src/test/apollo-mocks/footerMenuMock.ts index 68fc4994e..bc2d68a3b 100644 --- a/src/test/apollo-mocks/footerMenuMock.ts +++ b/src/test/apollo-mocks/footerMenuMock.ts @@ -1,5 +1,5 @@ import { MockedResponse } from '@apollo/client/testing'; -import { MenuDocument } from 'react-helsinki-headless-cms/apollo'; +import { MenuDocument } from '@city-of-helsinki/react-helsinki-headless-cms/apollo'; import type { MenuQueryResponse } from './types'; import { FOOTER_MENU_NAME } from '../../headless-cms/constants'; diff --git a/src/test/apollo-mocks/headerMenuMock.ts b/src/test/apollo-mocks/headerMenuMock.ts index afd7598b0..aa32d8c10 100644 --- a/src/test/apollo-mocks/headerMenuMock.ts +++ b/src/test/apollo-mocks/headerMenuMock.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ import { MockedResponse } from '@apollo/client/testing'; -import { MenuDocument } from 'react-helsinki-headless-cms/apollo'; +import { MenuDocument } from '@city-of-helsinki/react-helsinki-headless-cms/apollo'; import type { MenuQueryResponse } from './types'; import { HEADER_MENU_NAME } from '../../headless-cms/constants'; diff --git a/src/test/apollo-mocks/languagesMock.ts b/src/test/apollo-mocks/languagesMock.ts index a27e547b1..2182eacdb 100644 --- a/src/test/apollo-mocks/languagesMock.ts +++ b/src/test/apollo-mocks/languagesMock.ts @@ -1,6 +1,6 @@ import { MockedResponse } from '@apollo/client/testing'; -import { LanguageCodeEnum } from 'react-helsinki-headless-cms'; -import { LanguagesDocument } from 'react-helsinki-headless-cms/apollo'; +import { LanguageCodeEnum } from '@city-of-helsinki/react-helsinki-headless-cms'; +import { LanguagesDocument } from '@city-of-helsinki/react-helsinki-headless-cms/apollo'; import type { LanguagesQueryResponse } from './types'; diff --git a/src/test/apollo-mocks/types.ts b/src/test/apollo-mocks/types.ts index 6840af23b..98758135c 100644 --- a/src/test/apollo-mocks/types.ts +++ b/src/test/apollo-mocks/types.ts @@ -1,4 +1,7 @@ -import type { Menu, Language } from 'react-helsinki-headless-cms'; +import type { + Menu, + Language, +} from '@city-of-helsinki/react-helsinki-headless-cms'; export type MenuQueryResponse = { data: { diff --git a/src/utils/__tests__/getLanguageCode.test.ts b/src/utils/__tests__/getLanguageCode.test.ts index 00dfdc6fa..eef877f41 100644 --- a/src/utils/__tests__/getLanguageCode.test.ts +++ b/src/utils/__tests__/getLanguageCode.test.ts @@ -1,4 +1,4 @@ -import { LanguageCodeEnum } from 'react-helsinki-headless-cms'; +import { LanguageCodeEnum } from '@city-of-helsinki/react-helsinki-headless-cms'; import getLanguageCode from '../getLanguageCode'; diff --git a/src/utils/getLanguageCode.ts b/src/utils/getLanguageCode.ts index c430cf1f9..b3dd759d8 100644 --- a/src/utils/getLanguageCode.ts +++ b/src/utils/getLanguageCode.ts @@ -1,4 +1,4 @@ -import { LanguageCodeEnum } from 'react-helsinki-headless-cms'; +import { LanguageCodeEnum } from '@city-of-helsinki/react-helsinki-headless-cms'; import type { Language } from '../types'; diff --git a/src/utils/testUtils.tsx b/src/utils/testUtils.tsx index 5bfba11f9..c57605de0 100644 --- a/src/utils/testUtils.tsx +++ b/src/utils/testUtils.tsx @@ -1,6 +1,7 @@ import type { ApolloClient, NormalizedCacheObject } from '@apollo/client'; import { useApolloClient } from '@apollo/client'; import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { ConfigProvider as RHHCConfigProvider } from '@city-of-helsinki/react-helsinki-headless-cms'; import { act, createEvent, @@ -10,11 +11,10 @@ import { } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import * as React from 'react'; -import { ConfigProvider as RHHCConfigProvider } from 'react-helsinki-headless-cms'; -import Modal from 'react-modal'; import { BrowserRouter, Route, Routes } from 'react-router'; import wait from 'waait'; +import { NotificationsProvider } from '../common/components/notificationsContext/NotificationsContext'; import { createApolloCache } from '../domain/app/apollo/cache'; import IdleTimer from '../domain/auth/IdleTimerProvider'; import KultusAdminHDSLoginProvider from '../domain/auth/KultusAdminHDSLoginProvider'; @@ -71,19 +71,21 @@ export const customRender: CustomRender = ( }); const user = userEvent.setup(); const Wrapper: React.FC<{ children?: React.ReactNode }> = ({ children }) => ( - - - - - - - {children} - - - - - - + + + + + + + + {children} + + + + + + + ); const renderResult = render(ui, { wrapper: Wrapper }); @@ -99,26 +101,27 @@ export const renderWithRoute: CustomRender = ( }); const user = userEvent.setup(); const Wrapper: React.FC<{ children?: React.ReactNode }> = ({ children }) => ( - - - - - - - - {children}} /> - {children}} /> - - - - - - - + + + + + + + + + {children}} /> + {children}} /> + + + + + + + + ); const renderResult = render(ui, { wrapper: Wrapper }); - Modal.setAppElement(renderResult.container); return { ...renderResult, user }; }; diff --git a/tsconfig.json b/tsconfig.json index 6390f5e63..26534729e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true,