From ade42d909ed0b21b594c40bdf2221d313f8d93c2 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 24 Oct 2025 12:45:36 -0400 Subject: [PATCH 001/109] add contextual help component --- .../ContextualHelp/ContextualHelp.d.ts | 5 + .../ContextualHelp/ContextualHelp.tsx | 14 + package-lock.json | 3166 ++++++++++++----- package.json | 5 +- 4 files changed, 2386 insertions(+), 804 deletions(-) create mode 100644 app/components/ContextualHelp/ContextualHelp.d.ts create mode 100644 app/components/ContextualHelp/ContextualHelp.tsx diff --git a/app/components/ContextualHelp/ContextualHelp.d.ts b/app/components/ContextualHelp/ContextualHelp.d.ts new file mode 100644 index 00000000..7fba74d4 --- /dev/null +++ b/app/components/ContextualHelp/ContextualHelp.d.ts @@ -0,0 +1,5 @@ +import React, { ReactElement } from "react" + +export type ContextualHelpProps = { + text: string; +} diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx new file mode 100644 index 00000000..35876aa3 --- /dev/null +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -0,0 +1,14 @@ +import type { ContextualHelpProps } from './ContextualHelp.d'; +import {useFloating} from '@floating-ui/react'; + +export const ContextualHelp = ({text}: ContextualHelpProps) => { + const {refs, floatingStyles} = useFloating(); + return ( + <> + +
+ {text} +
+ + ); +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7d996bf4..44e2fc5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,9 @@ "@digitalcredentials/vc": "^9.0.1", "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", "@digitalcredentials/vc-status-list": "^9.0.0", - "@digitalcredentials/verifier-core": "^1.0.0-beta.7", + "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", + "@floating-ui/react": "^0.27.16", "@types/luxon": "^3.7.1", "@zxing/library": "^0.21.3", "axios": "^1.7.7", @@ -33,8 +34,7 @@ "react": "19.1.0", "react-dom": "19.1.0", "react-markdown": "^10.1.0", - "uuid": "^9.0.0", - "validator": "^13.15.15" + "uuid": "^9.0.0" }, "devDependencies": { "@playwright/test": "^1.55.0", @@ -42,7 +42,6 @@ "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@types/validator": "^13.15.3", "dotenv": "^17.2.1", "tailwindcss": "^4.1.13", "typescript": "^5" @@ -57,6 +56,7 @@ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -64,10 +64,750 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.882.0.tgz", + "integrity": "sha512-8uKuGFZFTE3Wfd0VApn1TVtLe2xrzAf73vHNFrqGlg1RsEU2Fu4XK5Cs10qc2aG24l1FrfyfsRS5KjzszmH6/Q==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.882.0", + "@aws-sdk/credential-provider-node": "3.882.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.882.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.882.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.2", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.21", + "@smithy/middleware-retry": "^4.1.22", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.29", + "@smithy/util-defaults-mode-node": "^4.0.29", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.882.0.tgz", + "integrity": "sha512-JFWJB+2PZvygDuqb4iWKCro1Tl5L4tGBXMHe94jYMYnfajYGm58bW3RsPj3cKD2+TvIMUSXmNriNv+LbDKZmNw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.882.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.882.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.882.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.2", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.21", + "@smithy/middleware-retry": "^4.1.22", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.29", + "@smithy/util-defaults-mode-node": "^4.0.29", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.882.0.tgz", + "integrity": "sha512-m43/gEDbxqxLT/Mbn/OA21TuFpyocOUzjiSA2HBnLQ3KivA4ez0nsW91vh0Sp3TOfLgiZbRbVhmI6XfsFinwBg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/core": "^3.9.2", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.882.0.tgz", + "integrity": "sha512-lYeXME58p5GxmtCB8peUtofPALM98HxlHIkqUzPfjzgVYmF56CSz1dl5fdPnHpm+0JXjV5SlG9LLRPTCTxaMZA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.882.0.tgz", + "integrity": "sha512-khhE1k+4XvGm8Mk6vVUbrVvEnx3r8E6dymSKSiAKf0lwsnKWAWd1RLGwLusqVgtGR4Jfsrbg7ox9MczIjgCiTg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.882.0.tgz", + "integrity": "sha512-j3mBF+Q6RU3u8t5O1KOWbQQCi0WNSl47sNIa1RvyN6qK1WIA8BxM1hB25mI9TMPrNZMFthljVec+JcNjRNG34A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.882.0.tgz", + "integrity": "sha512-nUacsSYKyTUmv/Fqe0efihCRCabea5MZtGSZF0l2V8QBo39yJjw0wVmRK6G4bfm5lY7v2EVVIUCpiTvxRRUbHg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/credential-provider-env": "3.882.0", + "@aws-sdk/credential-provider-http": "3.882.0", + "@aws-sdk/credential-provider-process": "3.882.0", + "@aws-sdk/credential-provider-sso": "3.882.0", + "@aws-sdk/credential-provider-web-identity": "3.882.0", + "@aws-sdk/nested-clients": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.882.0.tgz", + "integrity": "sha512-sELdV+leCfY+Bw8NQo3H65oIT+9thqZU0RWyv85EfZVvKEwWDt4McA7+Co1VkH+nCY21s5jz4SOqIrYuT0cSQg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.882.0", + "@aws-sdk/credential-provider-http": "3.882.0", + "@aws-sdk/credential-provider-ini": "3.882.0", + "@aws-sdk/credential-provider-process": "3.882.0", + "@aws-sdk/credential-provider-sso": "3.882.0", + "@aws-sdk/credential-provider-web-identity": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.882.0.tgz", + "integrity": "sha512-S3BgGcaR+L7CQAQn3Ysy9KSnck7+hDicAGM/dYvvJ8GwZNIOc0542Y+ntpV1UYa7OuZPWzGy2v2NcJSCbYDXEA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.882.0.tgz", + "integrity": "sha512-1pZRTKiDl6Oh/jP75lEoSkJrer1YEm8lMconB8dX9bsaWbp9cZeMJMK6pts5VQcveeOLr/8/U9TESboPjHBcyA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-sso": "3.882.0", + "@aws-sdk/core": "3.882.0", + "@aws-sdk/token-providers": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.882.0.tgz", + "integrity": "sha512-EvpsD0Vcz5WgXjpC53KAQ2CkeUp0KwwiV6brgQTXl+9yV/M8M0aK5Qk5ep/MPbAn5gtbqXHaCkiExaN4YYOhCg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/nested-clients": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.882.0.tgz", + "integrity": "sha512-HkxhpafmewS3D50cYv9J2dWHiGrfRPeZepJh2o2z0KoOMKMwDXYeLOM/oczyQSk24PouiCyEHwiuGei6TlZyHQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.882.0", + "@aws-sdk/core": "3.882.0", + "@aws-sdk/credential-provider-cognito-identity": "3.882.0", + "@aws-sdk/credential-provider-env": "3.882.0", + "@aws-sdk/credential-provider-http": "3.882.0", + "@aws-sdk/credential-provider-ini": "3.882.0", + "@aws-sdk/credential-provider-node": "3.882.0", + "@aws-sdk/credential-provider-process": "3.882.0", + "@aws-sdk/credential-provider-sso": "3.882.0", + "@aws-sdk/credential-provider-web-identity": "3.882.0", + "@aws-sdk/nested-clients": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.2", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.882.0.tgz", + "integrity": "sha512-IdLVpV2b0qryxFb/gNPwZoayLUdgmb41fWpLiIf99pyNwR7TGs/9Ri2amS3PnaQHuES947xYSYZ9Ej0kBgjHKg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@smithy/core": "^3.9.2", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.882.0.tgz", + "integrity": "sha512-IQkOtl/DhLV5+tJI7ZwjBDJO1lIoYOcmNQzcg8ly9RTdMoTcEtklevxmAwWB4DEFiIctUk2OSjHqhfWjeYredA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.882.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.882.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.882.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.2", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.21", + "@smithy/middleware-retry": "^4.1.22", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.29", + "@smithy/util-defaults-mode-node": "^4.0.29", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.882.0.tgz", + "integrity": "sha512-/Z6F8Cc+QjBMEPh3ZXy7JM1vMZCS41+Nh9VgdUwvvdJTA7LRXSDBRDL3cQPa7bii9unZ8SqsIC+7Nlw1LKwwJA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.882.0", + "@aws-sdk/nested-clients": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz", + "integrity": "sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-endpoints": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", + "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.882.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.882.0.tgz", + "integrity": "sha512-7zPtGXeAs6UzKjrrSbMNiFMSLZ/2DWvJ26KBOasS3zQbL534yoNos4HUA3OOXSpKFBAIEcYWu6rzR4ptlvx50w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.882.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@digitalbazaar/data-integrity-context": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/data-integrity-context/-/data-integrity-context-2.0.1.tgz", "integrity": "sha512-XpXUzId6ZIEaNq9R+Fv3LrArj1bRj0QX3yfYgxi2bGZGIMs8EkdwsQdzTq38cmHXBQz4DASVun7mBtwrEqjf3g==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -76,6 +816,7 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", + "license": "BSD-3-Clause", "dependencies": { "ky": "^0.33.3", "ky-universal": "^0.11.0", @@ -89,6 +830,7 @@ "version": "0.33.3", "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -100,6 +842,7 @@ "version": "5.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -111,6 +854,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@digitalbazaar/lru-memoize/-/lru-memoize-4.0.0.tgz", "integrity": "sha512-ScN6RH3e9ktTjR+x+WnyGxRZj3u+PCzPgOY3WUFeYaabhuxUFl2BhBL0VVlEzpv411YjBerCBX0iPZ0CnSb8YA==", + "license": "BSD-3-Clause", "dependencies": { "lru-cache": "^11.1.0" }, @@ -121,12 +865,14 @@ "node_modules/@digitalbazaar/security-context": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/security-context/-/security-context-1.0.1.tgz", - "integrity": "sha512-0WZa6tPiTZZF8leBtQgYAfXQePFQp2z5ivpCEN/iZguYYZ0TB9qRmWtan5XH6mNFuusHtMcyIzAcReyE6rZPhA==" + "integrity": "sha512-0WZa6tPiTZZF8leBtQgYAfXQePFQp2z5ivpCEN/iZguYYZ0TB9qRmWtan5XH6mNFuusHtMcyIzAcReyE6rZPhA==", + "license": "BSD-3-Clause" }, "node_modules/@digitalbazaar/vc-bitstring-status-list-context": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@digitalbazaar/vc-bitstring-status-list-context/-/vc-bitstring-status-list-context-1.1.0.tgz", "integrity": "sha512-IULBb2BJ/FQwTwdmvtltBb9JspWXY4tS2ZimRtFfWBJW6T35r6x8TzRK6eDVHpLLEzeJs1jCvqqTXWH0RJgQRA==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -134,12 +880,14 @@ "node_modules/@digitalbazaar/vc-status-list-context": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/vc-status-list-context/-/vc-status-list-context-3.1.1.tgz", - "integrity": "sha512-cMVtd+EV+4KN2kUG4/vsV74JVsGE6dcpod6zRoFB/AJA2W/sZbJqR44KL3G6P262+GcAECNhtnSsKsTnQ6y8+w==" + "integrity": "sha512-cMVtd+EV+4KN2kUG4/vsV74JVsGE6dcpod6zRoFB/AJA2W/sZbJqR44KL3G6P262+GcAECNhtnSsKsTnQ6y8+w==", + "license": "BSD-3-Clause" }, "node_modules/@digitalcredentials/base58-universal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/base58-universal/-/base58-universal-1.0.1.tgz", "integrity": "sha512-1xKdJnfITMvrF/sCgwBx2C4p7qcNAARyIvrAOZGqIHmBaT/hAenpC8bf44qVY+UIMuCYP23kqpIfJQebQDThDQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -148,6 +896,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@digitalcredentials/base64url-universal/-/base64url-universal-2.0.6.tgz", "integrity": "sha512-QJyK6xS8BYNnkKLhEAgQc6Tb9DMe+GkHnBAWJKITCxVRXJAFLhJnr+FsJnCThS3x2Y0UiiDAXoWjwMqtUrp4Kg==", + "license": "BSD-3-Clause", "dependencies": { "base64url": "^3.0.1" }, @@ -159,6 +908,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@digitalcredentials/bitstring/-/bitstring-3.1.2.tgz", "integrity": "sha512-ixe9f8RbnmaZ9XP0cnjKlEhSytWerk1CKseYS8XtF3wOsT/fhzdIRtZP8iL6oDiFijsBLsnvxosgWTgltK/k8A==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base64url-universal": "^2.0.6", "pako": "^2.0.4" @@ -171,6 +921,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/@digitalcredentials/cborld/-/cborld-4.3.4.tgz", "integrity": "sha512-oioFq5uTDvqRrEP2OZNnIAuPeZ3sCkerOwnsKyItZyaVifu44497F6eMDZIewOESiDxAUN14gjkoevMCF5m5uQ==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base58-universal": "^1.0.1", "cborg": "^1.2.0", @@ -185,6 +936,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -193,6 +945,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/credentials-v2-context/-/credentials-v2-context-1.0.0.tgz", "integrity": "sha512-n+zBS+fYlKfvDmt8jdpB6n6p2JRLo6v6A2BGLVmbqzHFvfdQZXS+t489TWipFmi5g3FV12/bDCILUpCrqswDvg==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -201,6 +954,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/@digitalcredentials/crypto-ld/-/crypto-ld-7.0.6.tgz", "integrity": "sha512-wxgjiU08rIMUaPhaOOVUjcdWZoL1FVfzGuX9ADHiyx0O34lJ4wdXnGk5QMYgwpl7B4gy1vDDp5VVHpO8l+aVFQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=16" } @@ -209,6 +963,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/data-integrity/-/data-integrity-2.6.0.tgz", "integrity": "sha512-vk8nFmkdQfOf6VvJk2lw6tIdORI8r4rOrxYZvb1pBh/1d+IJ7O6csnXJUmmQA2UJ6dwfxFuFyADORgc2ZYb4iA==", + "license": "MIT", "dependencies": { "@digitalcredentials/jsonld-signatures": "^12.0.1", "base58-universal": "^2.0.0", @@ -223,6 +978,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64url-universal/-/base64url-universal-2.0.0.tgz", "integrity": "sha512-6Hpg7EBf3t148C3+fMzjf+CHnADVDafWzlJUXAqqqbm4MKNXbsoPdOkWeRTjNlkYG7TpyjIpRO1Gk0SnsFD1rw==", + "license": "BSD-3-Clause", "dependencies": { "base64url": "^3.0.1" }, @@ -233,12 +989,14 @@ "node_modules/@digitalcredentials/dcc-context": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/dcc-context/-/dcc-context-1.0.0.tgz", - "integrity": "sha512-iun3HTqOqcAoG0lz5GWx/fJYxpbKjzqq866dBo0osxs+pj/CwZDNHKXVC6sdd662tXg9EF0r4YdZ/AW6DOnS6A==" + "integrity": "sha512-iun3HTqOqcAoG0lz5GWx/fJYxpbKjzqq866dBo0osxs+pj/CwZDNHKXVC6sdd662tXg9EF0r4YdZ/AW6DOnS6A==", + "license": "MIT" }, "node_modules/@digitalcredentials/did-io": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@digitalcredentials/did-io/-/did-io-1.0.2.tgz", "integrity": "sha512-z6lLRe4drHYwtfxbySQJZZl2YbCPvG5UDkh/H3kAK2NSZY9GaIm9iz9A6E/J5Lu6rct/BOj1XQhtEJnzRdB8wQ==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/lru-memoize": "^2.1.1" }, @@ -250,6 +1008,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/did-method-key/-/did-method-key-3.0.0.tgz", "integrity": "sha512-Cq75fbUkDed1O3TPFY89xlqq+oCKvBCMjDJz8KIVx75eZCnxhcE9h/a4t9yW0FRnp0LBrV9HDoSPNyN9P6dr1A==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/did-io": "^1.0.2", "@digitalcredentials/x25519-key-agreement-key-2020": "^2.0.2" @@ -262,6 +1021,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@digitalcredentials/x25519-key-agreement-key-2020/-/x25519-key-agreement-key-2020-2.0.2.tgz", "integrity": "sha512-7Ay5AkGfIEWBRJiHl6PhrpFrjAqCZ/+G4rV6sqTUGK8fBnkxqlJ/XiD7NouUF6uTalVm7mJWJXHuCN5FAuXGsg==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base58-universal": "^1.0.0", "crypto-ld": "^6.0.0", @@ -276,6 +1036,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/did-method-web/-/did-method-web-1.1.0.tgz", "integrity": "sha512-FgsCNGz6Iniy1fR5G8wcT1EMfQzVPJUhz3ei9Ha0aavN3K3dD2XTIKG83vAV3L9tpmtcQhdwcIG+2JaBO1PBYQ==", + "license": "MIT", "dependencies": { "@digitalcredentials/did-io": "^1.0.2", "@digitalcredentials/did-method-key": "^3.0.0", @@ -304,6 +1065,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-2.0.1.tgz", "integrity": "sha512-U9iAO8lXgEDONsA0zPPSgcf3HUBNAqHiJmSHgZz62OvC3Hi2Bhc5kTnQ3S1/L+sthDTHtCMhcEiklmIly6uQ3w==", + "license": "MIT", "dependencies": { "@stablelib/int": "^2.0.1" } @@ -312,6 +1074,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-2.0.2.tgz", "integrity": "sha512-d/lJ5sgzhtmpMIbKFWfev+i6WebBdIzzBpMzXtZdvUijoksjXosYFNqytoMj7cRshNj+/XTLYnnVMdZfd+penw==", + "license": "MIT", "dependencies": { "@stablelib/random": "^2.0.1", "@stablelib/sha512": "^2.0.1", @@ -321,17 +1084,20 @@ "node_modules/@digitalcredentials/ed25519-multikey/node_modules/@stablelib/hash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-2.0.0.tgz", - "integrity": "sha512-u3WPSqGido8lwJuMcrBgM5K54LrPGhkWAdtsyccf7dGsLixAZUds77zOAbu7bvKPwQlmoByH0txBi5rTmEKuHg==" + "integrity": "sha512-u3WPSqGido8lwJuMcrBgM5K54LrPGhkWAdtsyccf7dGsLixAZUds77zOAbu7bvKPwQlmoByH0txBi5rTmEKuHg==", + "license": "MIT" }, "node_modules/@digitalcredentials/ed25519-multikey/node_modules/@stablelib/int": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-2.0.1.tgz", - "integrity": "sha512-Ht63fQp3wz/F8U4AlXEPb7hfJOIILs8Lq55jgtD7KueWtyjhVuzcsGLSTAWtZs3XJDZYdF1WcSKn+kBtbzupww==" + "integrity": "sha512-Ht63fQp3wz/F8U4AlXEPb7hfJOIILs8Lq55jgtD7KueWtyjhVuzcsGLSTAWtZs3XJDZYdF1WcSKn+kBtbzupww==", + "license": "MIT" }, "node_modules/@digitalcredentials/ed25519-multikey/node_modules/@stablelib/random": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-2.0.1.tgz", "integrity": "sha512-W6GAtXEEs7r+dSbuBsvoFmlyL3gLxle41tQkjKu17dDWtDdjhVUbtRfRCQcCUeczwkgjQxMPopgwYEvxXtHXGw==", + "license": "MIT", "dependencies": { "@stablelib/binary": "^2.0.1", "@stablelib/wipe": "^2.0.1" @@ -341,6 +1107,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-2.0.1.tgz", "integrity": "sha512-DUNe5cbnoH3sSIN+MG04RvTCLXtkbyy/SnQxiNO+GgF/KSXkkUSlF6mUVvCUdZBZ2X3NgogR+tAvaRSn8wxnLw==", + "license": "MIT", "dependencies": { "@stablelib/binary": "^2.0.1", "@stablelib/hash": "^2.0.0", @@ -350,12 +1117,14 @@ "node_modules/@digitalcredentials/ed25519-multikey/node_modules/@stablelib/wipe": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-2.0.1.tgz", - "integrity": "sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==" + "integrity": "sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==", + "license": "MIT" }, "node_modules/@digitalcredentials/ed25519-multikey/node_modules/base64url-universal": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64url-universal/-/base64url-universal-2.0.0.tgz", "integrity": "sha512-6Hpg7EBf3t148C3+fMzjf+CHnADVDafWzlJUXAqqqbm4MKNXbsoPdOkWeRTjNlkYG7TpyjIpRO1Gk0SnsFD1rw==", + "license": "BSD-3-Clause", "dependencies": { "base64url": "^3.0.1" }, @@ -367,6 +1136,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/ed25519-signature-2020/-/ed25519-signature-2020-6.0.0.tgz", "integrity": "sha512-ncjJxGxMRtm7ooR1XdUT2dgXrGnFa4oAG1WMShBi93N5I1OUdUlNUtKrMiMzp6PlhVD+4x7VMuOA4oRM8adEgw==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base58-universal": "^1.0.1", "@digitalcredentials/ed25519-verification-key-2020": "^3.1.1", @@ -382,6 +1152,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/@digitalcredentials/ed25519-verification-key-2020/-/ed25519-verification-key-2020-3.2.2.tgz", "integrity": "sha512-ZfxNFZlA379MZpf+gV2tUYyiZ15eGVgjtCQLWlyu3frWxsumUgv++o0OJlMnrDsWGwzFMRrsXcosd5+752rLOA==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base58-universal": "^1.0.1", "@stablelib/ed25519": "^1.0.1", @@ -396,6 +1167,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/eddsa-rdfc-2022-cryptosuite/-/eddsa-rdfc-2022-cryptosuite-1.3.0.tgz", "integrity": "sha512-tLebsSZGTqGu6VxGjxv8g18NuBmRxew20WgaIxaBoWpLr2cbWDKKkTs40nWWLQPhm/UPC7x4XWkkIWZq33K4eg==", + "license": "MIT", "dependencies": { "@digitalcredentials/ed25519-multikey": "^1.4.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -409,6 +1181,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-4.0.1.tgz", "integrity": "sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==", + "license": "BSD-3-Clause", "dependencies": { "setimmediate": "^1.0.5" }, @@ -420,6 +1193,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@digitalcredentials/http-client/-/http-client-5.0.4.tgz", "integrity": "sha512-TbbfFauhd5fUAcZ/6TDenTuYqkzqdEhxYk1Rqicxcz33B9rzvJcmT+/81KF9DrUXmu6gpoqCranT2UkZftsxZA==", + "license": "BSD-3-Clause", "dependencies": { "ky": "^1.0.1", "undici": "^6.6.2" @@ -432,6 +1206,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/issuer-registry-client/-/issuer-registry-client-3.1.0.tgz", "integrity": "sha512-RY5F9aCx1MU/Iw2fW/CzMEAF1AMbWXyVb8E52kUlwfCqqfIQdG+5nzYK3HGlcHGZgexkQyQOcg2HtaLE9s8WSg==", + "license": "MIT", "dependencies": { "@digitalcredentials/http-client": "^5.0.2" }, @@ -443,6 +1218,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/jsonld/-/jsonld-9.0.0.tgz", "integrity": "sha512-lWVpg65xQbi4lvXWs3BezCwPrGDAllFjHwTBUWJCoKsfGzxtxTwbRNXpfhii5psQ2vvpjPXSI+y0uyRNOzr4cw==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/http-client": "^5.0.1", "canonicalize": "^1.0.1", @@ -457,6 +1233,7 @@ "version": "12.0.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/jsonld-signatures/-/jsonld-signatures-12.0.1.tgz", "integrity": "sha512-KdyE7Bex+boqKRbvxofRyuI09BD6/8hQGSC5qbrXEmHd0oSLqePqKBM2pu9UZnzjxMZrN9sB3RqHxpijYEFh/w==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/security-context": "^1.0.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -471,6 +1248,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -481,12 +1259,14 @@ "node_modules/@digitalcredentials/jsonld/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/@digitalcredentials/lru-memoize": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@digitalcredentials/lru-memoize/-/lru-memoize-2.1.4.tgz", "integrity": "sha512-dvgeYYHW8lAWJrGyIY1qhuTahqvVJYXxuSkJ2A1MgenFLb/nWnIcSov0K/5nDnPYA5TilItmMpAxt6iuNtaKQg==", + "license": "BSD-3-Clause", "dependencies": { "lru-cache": "^6.0.0" }, @@ -498,6 +1278,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -508,17 +1289,20 @@ "node_modules/@digitalcredentials/lru-memoize/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/@digitalcredentials/open-badges-context": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/open-badges-context/-/open-badges-context-3.0.0.tgz", - "integrity": "sha512-pyXirpq29gy+NIaTBozDEm7nk1Oh8Yqie2WR0JuIqRX0ePCbiFeMv2uPEP3TXzyh1Jz++28fD+qjNojlhUmiIw==" + "integrity": "sha512-pyXirpq29gy+NIaTBozDEm7nk1Oh8Yqie2WR0JuIqRX0ePCbiFeMv2uPEP3TXzyh1Jz++28fD+qjNojlhUmiIw==", + "license": "MIT" }, "node_modules/@digitalcredentials/security-document-loader": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/security-document-loader/-/security-document-loader-8.0.0.tgz", "integrity": "sha512-0rURdip0S/L4aegONkef5yzaGqQ35n7TXE0RhtEJa6scEaZssazaADgg9ApMA47kiGRjCn30yKrds9YULwoltA==", + "license": "MIT", "dependencies": { "@digitalbazaar/data-integrity-context": "^2.0.0", "@digitalbazaar/vc-bitstring-status-list-context": "^1.0.0", @@ -549,6 +1333,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc/-/vc-9.0.1.tgz", "integrity": "sha512-oqwOq2mJqvrFabc/89jupkNkhhmFrOe93efSjCMmtd4XnM0Tcj3PYOq/ptmyXKpj8+vEqzeGxqF7AXiCMh3dig==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/credentials-v2-context": "~0.0.1-beta.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -565,6 +1350,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc-bitstring-status-list/-/vc-bitstring-status-list-1.0.0.tgz", "integrity": "sha512-07CZVU3cH1rwLJ5a1DzUT4vBvbYZKtX8l2au9e3wd21iSRXCwzCOVtPy496JjEWnmstyUJCIskAeyfv6MS4H2A==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/vc-bitstring-status-list-context": "^1.0.0", "@digitalcredentials/bitstring": "^3.1.2", @@ -580,6 +1366,7 @@ "version": "0.0.1-beta.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/credentials-v2-context/-/credentials-v2-context-0.0.1-beta.0.tgz", "integrity": "sha512-i0AQXFnMeOqf2uKNBUcnN78mO8L9H91QKMdpDqsgDYzTIKGLnNCOOxbRbrJOimhR+soYO64xn54U8/R7Qx0nyA==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -588,6 +1375,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/jsonld-signatures/-/jsonld-signatures-11.0.0.tgz", "integrity": "sha512-M44z5H66kr0p5CftQH3BlHkj2s9jCzEntIjauSZw/vUo/AALbRr50sICallaHi/KiuJ3qVyVJDRo/UxrsUN5jQ==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/security-context": "^1.0.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -602,12 +1390,14 @@ "node_modules/@digitalcredentials/vc-bitstring-status-list/node_modules/@digitalcredentials/open-badges-context": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/open-badges-context/-/open-badges-context-2.1.0.tgz", - "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==" + "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==", + "license": "MIT" }, "node_modules/@digitalcredentials/vc-bitstring-status-list/node_modules/@digitalcredentials/vc": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc/-/vc-8.0.1.tgz", "integrity": "sha512-QbfdAo4czT4gqCyS9c+YMMw8Vy5h1/pVmjpRrsTPGfBjWudHoT8OAa5VCfxdsiCFFdXZnGSqruPslt1W8RC/hw==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/credentials-v2-context": "~0.0.1-beta.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -620,50 +1410,11 @@ "node": ">=18" } }, - "node_modules/@digitalcredentials/vc-bitstring-status-list/node_modules/@sphereon/isomorphic-webcrypto": { - "version": "2.5.0-unstable.0", - "resolved": "https://registry.npmjs.org/@sphereon/isomorphic-webcrypto/-/isomorphic-webcrypto-2.5.0-unstable.0.tgz", - "integrity": "sha512-HEOpZATW7zzYiF8Ak2X0lMvrVQL+6FTeIHm6E815zu7xP5PLjwYPJ0galBjc/F+kex22BzK9hndsdH0/y3bjqA==", - "dependencies": { - "@peculiar/webcrypto": "^1.5.0", - "asmcrypto.js": "^2.3.2", - "b64-lite": "^1.4.0", - "b64u-lite": "^1.1.0", - "cipher-base": "^1.0.4", - "create-hash": "^1.2.0", - "inherits": "^2.0.4", - "md5.js": "^1.3.5", - "randomfill": "^1.0.4", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11", - "str2buf": "^1.3.0", - "webcrypto-shim": "^0.1.7" - }, - "peerDependencies": { - "expo": "*", - "expo-crypto": "*", - "msrcrypto": "^1.5.8", - "react-native-securerandom": "^1.0.1" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-crypto": { - "optional": true - }, - "msrcrypt": { - "optional": true - }, - "react-native-securerandom": { - "optional": true - } - } - }, - "node_modules/@digitalcredentials/vc-status-list": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@digitalcredentials/vc-status-list/-/vc-status-list-9.0.0.tgz", - "integrity": "sha512-Lwc4FFH5l4dJa0REtPAm+GR+F0jKN+SlAbW2gXf6T3xfHHIldO/B6wY/197Z7Wh+14Nza+uXWB499SHT4YS5lg==", + "node_modules/@digitalcredentials/vc-status-list": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@digitalcredentials/vc-status-list/-/vc-status-list-9.0.0.tgz", + "integrity": "sha512-Lwc4FFH5l4dJa0REtPAm+GR+F0jKN+SlAbW2gXf6T3xfHHIldO/B6wY/197Z7Wh+14Nza+uXWB499SHT4YS5lg==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/vc-status-list-context": "^3.0.1", "@digitalcredentials/bitstring": "^3.1.2", @@ -678,6 +1429,7 @@ "version": "0.0.1-beta.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/credentials-v2-context/-/credentials-v2-context-0.0.1-beta.0.tgz", "integrity": "sha512-i0AQXFnMeOqf2uKNBUcnN78mO8L9H91QKMdpDqsgDYzTIKGLnNCOOxbRbrJOimhR+soYO64xn54U8/R7Qx0nyA==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -686,6 +1438,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/jsonld-signatures/-/jsonld-signatures-11.0.0.tgz", "integrity": "sha512-M44z5H66kr0p5CftQH3BlHkj2s9jCzEntIjauSZw/vUo/AALbRr50sICallaHi/KiuJ3qVyVJDRo/UxrsUN5jQ==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/security-context": "^1.0.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -700,12 +1453,14 @@ "node_modules/@digitalcredentials/vc-status-list/node_modules/@digitalcredentials/open-badges-context": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/open-badges-context/-/open-badges-context-2.1.0.tgz", - "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==" + "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==", + "license": "MIT" }, "node_modules/@digitalcredentials/vc-status-list/node_modules/@digitalcredentials/vc": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc/-/vc-8.0.1.tgz", "integrity": "sha512-QbfdAo4czT4gqCyS9c+YMMw8Vy5h1/pVmjpRrsTPGfBjWudHoT8OAa5VCfxdsiCFFdXZnGSqruPslt1W8RC/hw==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/credentials-v2-context": "~0.0.1-beta.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -718,50 +1473,11 @@ "node": ">=18" } }, - "node_modules/@digitalcredentials/vc-status-list/node_modules/@sphereon/isomorphic-webcrypto": { - "version": "2.5.0-unstable.0", - "resolved": "https://registry.npmjs.org/@sphereon/isomorphic-webcrypto/-/isomorphic-webcrypto-2.5.0-unstable.0.tgz", - "integrity": "sha512-HEOpZATW7zzYiF8Ak2X0lMvrVQL+6FTeIHm6E815zu7xP5PLjwYPJ0galBjc/F+kex22BzK9hndsdH0/y3bjqA==", - "dependencies": { - "@peculiar/webcrypto": "^1.5.0", - "asmcrypto.js": "^2.3.2", - "b64-lite": "^1.4.0", - "b64u-lite": "^1.1.0", - "cipher-base": "^1.0.4", - "create-hash": "^1.2.0", - "inherits": "^2.0.4", - "md5.js": "^1.3.5", - "randomfill": "^1.0.4", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11", - "str2buf": "^1.3.0", - "webcrypto-shim": "^0.1.7" - }, - "peerDependencies": { - "expo": "*", - "expo-crypto": "*", - "msrcrypto": "^1.5.8", - "react-native-securerandom": "^1.0.1" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-crypto": { - "optional": true - }, - "msrcrypt": { - "optional": true - }, - "react-native-securerandom": { - "optional": true - } - } - }, "node_modules/@digitalcredentials/vc/node_modules/@digitalcredentials/credentials-v2-context": { "version": "0.0.1-beta.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/credentials-v2-context/-/credentials-v2-context-0.0.1-beta.0.tgz", "integrity": "sha512-i0AQXFnMeOqf2uKNBUcnN78mO8L9H91QKMdpDqsgDYzTIKGLnNCOOxbRbrJOimhR+soYO64xn54U8/R7Qx0nyA==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -769,12 +1485,14 @@ "node_modules/@digitalcredentials/vc/node_modules/@digitalcredentials/open-badges-context": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/open-badges-context/-/open-badges-context-2.1.0.tgz", - "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==" + "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==", + "license": "MIT" }, "node_modules/@digitalcredentials/verifier-core": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/@digitalcredentials/verifier-core/-/verifier-core-1.0.0-beta.8.tgz", - "integrity": "sha512-vsmDwcSZHxac6oMy33a8rUoUy3vTM6yKyZFJNH4adwy/hiQjBMY5yDV9aBorHi5K21z6kTWAT9oGx5ElArlHAA==", + "version": "1.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@digitalcredentials/verifier-core/-/verifier-core-1.0.0-beta.10.tgz", + "integrity": "sha512-R5yzRPPaIp/QaKZbd6ApwjBRLUZR2W6iO8Ulm3WWIov6IkD1Be1EctuLYj2ceai+CdsI/YnS9rCZlC2F8CI2Ww==", + "license": "MIT", "dependencies": { "@digitalcredentials/data-integrity": "^2.6.0", "@digitalcredentials/ed25519-signature-2020": "^7.0.0", @@ -783,7 +1501,9 @@ "@digitalcredentials/jsonld-signatures": "^12.0.1", "@digitalcredentials/security-document-loader": "^8.0.0", "@digitalcredentials/vc": "^10.0.0", - "@digitalcredentials/vc-bitstring-status-list": "^1.0.0" + "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1" }, "engines": { "node": ">=18.0" @@ -793,6 +1513,7 @@ "version": "0.0.1-beta.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/credentials-v2-context/-/credentials-v2-context-0.0.1-beta.0.tgz", "integrity": "sha512-i0AQXFnMeOqf2uKNBUcnN78mO8L9H91QKMdpDqsgDYzTIKGLnNCOOxbRbrJOimhR+soYO64xn54U8/R7Qx0nyA==", + "license": "BSD-3-Clause", "engines": { "node": ">=18" } @@ -801,6 +1522,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/ed25519-signature-2020/-/ed25519-signature-2020-7.0.0.tgz", "integrity": "sha512-Q0HdBdYKfg6yiPMJ1NlZMbUslSAVVwet/WhA/8emddb7W9lmmAtPJv3f9AuMfLFhY70z29Iedc5KWxqqbkMHbA==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base58-universal": "^1.0.1", "@digitalcredentials/ed25519-multikey": "^1.4.0", @@ -817,6 +1539,7 @@ "version": "3.2.0-beta.5", "resolved": "https://registry.npmjs.org/@digitalcredentials/issuer-registry-client/-/issuer-registry-client-3.2.0-beta.5.tgz", "integrity": "sha512-uwL7xkRpeANAtJ5Cgn6FDcVCjjEA959+HPokHB4IzV/gabnBBN1y8r3uCFwMTF6qCq30pA6+RZAhKsqMCI1SDw==", + "license": "MIT", "dependencies": { "@digitalcredentials/http-client": "^5.0.2", "core-js": "^3.42.0", @@ -829,12 +1552,14 @@ "node_modules/@digitalcredentials/verifier-core/node_modules/@digitalcredentials/open-badges-context": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/open-badges-context/-/open-badges-context-2.1.0.tgz", - "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==" + "integrity": "sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==", + "license": "MIT" }, "node_modules/@digitalcredentials/verifier-core/node_modules/@digitalcredentials/vc": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc/-/vc-10.0.1.tgz", "integrity": "sha512-p8pfyB0lV+yGfyy13RaZWvxL22TeEXu3xR7VGEEiyj9aF1P05xUI0L8TDRINnvGbGgPiFHB3x2zUew0wAXSyPA==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/credentials-v2-context": "^0.0.1-beta.0", "@digitalcredentials/jsonld": "^9.0.0", @@ -851,6 +1576,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@digitalcredentials/vpqr/-/vpqr-2.2.1.tgz", "integrity": "sha512-Pv4EXtG8s0baCFLGt+GxFF3rouIyGAYAc+qn6n3K/e8Yzpic53K7+bFWt7GgQfVori0Cf2pEOLHrci2VqdYXVw==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/cborld": "^4.3.1", "@nuintun/qrcode": "^3.0.1", @@ -865,6 +1591,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/x25519-key-agreement-key-2020/-/x25519-key-agreement-key-2020-3.0.0.tgz", "integrity": "sha512-mCh6eRh6opBZiEtAWZ3RvCGs6JP9QpN2/xPxncQIKBK9WBUxONgL1CEsTUTRcisGvWQrUcqVXRHQ0Tl6b8weSQ==", + "license": "BSD-3-Clause", "dependencies": { "@digitalcredentials/base58-universal": "^1.0.0", "@noble/ed25519": "^1.6.0", @@ -879,6 +1606,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -888,14 +1616,69 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", "engines": { "node": ">=14" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", + "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/utils": "^0.2.10", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", "optional": true, "engines": { "node": ">=18" @@ -908,6 +1691,7 @@ "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -929,6 +1713,7 @@ "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -950,6 +1735,7 @@ "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -965,6 +1751,7 @@ "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -980,6 +1767,7 @@ "cpu": [ "arm" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -995,6 +1783,7 @@ "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -1010,6 +1799,7 @@ "cpu": [ "ppc64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -1025,6 +1815,7 @@ "cpu": [ "s390x" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -1040,6 +1831,7 @@ "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -1055,6 +1847,7 @@ "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -1070,6 +1863,7 @@ "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" @@ -1085,6 +1879,7 @@ "cpu": [ "arm" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1106,6 +1901,7 @@ "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1127,6 +1923,7 @@ "cpu": [ "ppc64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1148,6 +1945,7 @@ "cpu": [ "s390x" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1169,6 +1967,7 @@ "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1190,6 +1989,7 @@ "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1211,6 +2011,7 @@ "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1232,6 +2033,7 @@ "cpu": [ "wasm32" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { "@emnapi/runtime": "^1.5.0" @@ -1250,6 +2052,7 @@ "cpu": [ "arm64" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -1268,6 +2071,7 @@ "cpu": [ "ia32" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -1286,6 +2090,7 @@ "cpu": [ "x64" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" @@ -1302,6 +2107,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -1314,6 +2120,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -1324,6 +2131,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -1334,6 +2142,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1342,38 +2151,43 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.1.tgz", - "integrity": "sha512-6nZrq5kfAz0POWyhljnbWQQJQ5uT8oE2ddX303q1uY0tWsivWKgBDXBBvuFPwOqRRalXJuVO9EjOdVtuhLX0zg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz", + "integrity": "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==", + "license": "MIT", "dependencies": { "sparse-bitfield": "^3.0.3" } }, "node_modules/@next/env": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.6.tgz", - "integrity": "sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q==" + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz", + "integrity": "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==", + "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.6.tgz", - "integrity": "sha512-ES3nRz7N+L5Umz4KoGfZ4XX6gwHplwPhioVRc25+QNsDa7RtUF/z8wJcbuQ2Tffm5RZwuN2A063eapoJ1u4nPg==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz", + "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1383,12 +2197,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.6.tgz", - "integrity": "sha512-JIGcytAyk9LQp2/nuVZPAtj8uaJ/zZhsKOASTjxDug0SPU9LAM3wy6nPU735M1OqacR4U20LHVF5v5Wnl9ptTA==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.4.tgz", + "integrity": "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1398,12 +2213,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.6.tgz", - "integrity": "sha512-qvz4SVKQ0P3/Im9zcS2RmfFL/UCQnsJKJwQSkissbngnB/12c6bZTCB0gHTexz1s6d/mD0+egPKXAIRFVS7hQg==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz", + "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1413,12 +2229,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.6.tgz", - "integrity": "sha512-FsbGVw3SJz1hZlvnWD+T6GFgV9/NYDeLTNQB2MXoPN5u9VA9OEDy6fJEfePfsUKAhJufFbZLgp0cPxMuV6SV0w==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz", + "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1428,12 +2245,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.6.tgz", - "integrity": "sha512-3QnHGFWlnvAgyxFxt2Ny8PTpXtQD7kVEeaFat5oPAHHI192WKYB+VIKZijtHLGdBBvc16tiAkPTDmQNOQ0dyrA==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz", + "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1443,12 +2261,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.6.tgz", - "integrity": "sha512-OsGX148sL+TqMK9YFaPFPoIaJKbFJJxFzkXZljIgA9hjMjdruKht6xDCEv1HLtlLNfkx3c5w2GLKhj7veBQizQ==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz", + "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1458,12 +2277,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.6.tgz", - "integrity": "sha512-ONOMrqWxdzXDJNh2n60H6gGyKed42Ieu6UTVPZteXpuKbLZTH4G4eBMsr5qWgOBA+s7F+uB4OJbZnrkEDnZ5Fg==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz", + "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1473,12 +2293,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.6.tgz", - "integrity": "sha512-pxK4VIjFRx1MY92UycLOOw7dTdvccWsNETQ0kDHkBlcFH1GrTLUjSiHU1ohrznnux6TqRHgv5oflhfIWZwVROQ==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz", + "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1496,71 +2317,767 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@nuintun/qrcode": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@nuintun/qrcode/-/qrcode-3.4.0.tgz", "integrity": "sha512-ZsxHR8NLGN/FYiGzyQ/sQEOxCIS1pmHDIGaAisQXibUb0x3LHAvObNJKoXAhaMrNnzEKQj8q9fXYeaJurmNrnw==", + "license": "MIT", "dependencies": { "tslib": "^2.6.1" } }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.5.0.tgz", - "integrity": "sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==", + "node_modules/@peculiar/asn1-schema": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.4.0.tgz", + "integrity": "sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.8.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", + "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.55.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.0.tgz", + "integrity": "sha512-wEhSYznxOmx7EdwK1tYEWJF5+/wmSFsff9BfTOn8oO/+KPl3gsmThrb6MJlWbOC391+Ya31s5JuHiC2RlT80Zg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.0.tgz", + "integrity": "sha512-FA10YhPFLy23uxeWu7pOM2ctlw+gzbPMTZQwrZ8FRIfyJ/p8YIVz7AVTB5jjLD+QIerydyKcVMZur8qzzDILAQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.2.0", + "@smithy/types": "^4.4.0", + "@smithy/util-config-provider": "^4.1.0", + "@smithy/util-middleware": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.10.0.tgz", + "integrity": "sha512-bXyD3Ij6b1qDymEYlEcF+QIjwb9gObwZNaRjETJsUEvSIzxFdynSQ3E4ysY7lUFSBzeWBNaFvX+5A0smbC2q6A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/middleware-serde": "^4.1.0", + "@smithy/protocol-http": "^5.2.0", + "@smithy/types": "^4.4.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-middleware": "^4.1.0", + "@smithy/util-stream": "^4.3.0", + "@smithy/util-utf8": "^4.1.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.0.tgz", + "integrity": "sha512-iVwNhxTsCQTPdp++4C/d9xvaDmuEWhXi55qJobMp9QMaEHRGH3kErU4F8gohtdsawRqnUy/ANylCjKuhcR2mPw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.2.0", + "@smithy/property-provider": "^4.1.0", + "@smithy/types": "^4.4.0", + "@smithy/url-parser": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.0.tgz", + "integrity": "sha512-VZenjDdVaUGiy3hwQtxm75nhXZrhFG+3xyL93qCQAlYDyhT/jeDWM8/3r5uCFMlTmmyrIjiDyiOynVFchb0BSg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.2.0", + "@smithy/querystring-builder": "^4.1.0", + "@smithy/types": "^4.4.0", + "@smithy/util-base64": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.0.tgz", + "integrity": "sha512-mXkJQ/6lAXTuoSsEH+d/fHa4ms4qV5LqYoPLYhmhCRTNcMMdg+4Ya8cMgU1W8+OR40eX0kzsExT7fAILqtTl2w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.0.tgz", + "integrity": "sha512-4/FcV6aCMzgpM4YyA/GRzTtG28G0RQJcWK722MmpIgzOyfSceWcI9T9c8matpHU9qYYLaWtk8pSGNCLn5kzDRw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz", + "integrity": "sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.0.tgz", + "integrity": "sha512-x3dgLFubk/ClKVniJu+ELeZGk4mq7Iv0HgCRUlxNUIcerHTLVmq7Q5eGJL0tOnUltY6KFw5YOKaYxwdcMwox/w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.2.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.0.tgz", + "integrity": "sha512-J1eCF7pPDwgv7fGwRd2+Y+H9hlIolF3OZ2PjptonzzyOXXGh/1KGJAHpEcY1EX+WLlclKu2yC5k+9jWXdUG4YQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/core": "^3.10.0", + "@smithy/middleware-serde": "^4.1.0", + "@smithy/node-config-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.1.0", + "@smithy/types": "^4.4.0", + "@smithy/url-parser": "^4.1.0", + "@smithy/util-middleware": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.0.tgz", + "integrity": "sha512-raL5oWYf5ALl3jCJrajE8enKJEnV/2wZkKS6mb3ZRY2tg3nj66ssdWy5Ps8E6Yu8Wqh3Tt+Sb9LozjvwZupq+A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.2.0", + "@smithy/protocol-http": "^5.2.0", + "@smithy/service-error-classification": "^4.1.0", + "@smithy/smithy-client": "^4.6.0", + "@smithy/types": "^4.4.0", + "@smithy/util-middleware": "^4.1.0", + "@smithy/util-retry": "^4.1.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.0.tgz", + "integrity": "sha512-CtLFYlHt7c2VcztyVRc+25JLV4aGpmaSv9F1sPB0AGFL6S+RPythkqpGDa2XBQLJQooKkjLA1g7Xe4450knShg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.2.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.0.tgz", + "integrity": "sha512-91Fuw4IKp0eK8PNhMXrHRcYA1jvbZ9BJGT91wwPy3bTQT8mHTcQNius/EhSQTlT9QUI3Ki1wjHeNXbWK0tO8YQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.0.tgz", + "integrity": "sha512-8/fpilqKurQ+f8nFvoFkJ0lrymoMJ+5/CQV5IcTv/MyKhk2Q/EFYCAgTSWHD4nMi9ux9NyBBynkyE9SLg2uSLA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.1.0", + "@smithy/shared-ini-file-loader": "^4.1.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.0.tgz", + "integrity": "sha512-G4NV70B4hF9vBrUkkvNfWO6+QR4jYjeO4tc+4XrKCb4nPYj49V9Hu8Ftio7Mb0/0IlFyEOORudHrm+isY29nCA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/abort-controller": "^4.1.0", + "@smithy/protocol-http": "^5.2.0", + "@smithy/querystring-builder": "^4.1.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.0.tgz", + "integrity": "sha512-eksMjMHUlG5PwOUWO3k+rfLNOPVPJ70mUzyYNKb5lvyIuAwS4zpWGsxGiuT74DFWonW0xRNy+jgzGauUzX7SyA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.0.tgz", + "integrity": "sha512-bwjlh5JwdOQnA01be+5UvHK4HQz4iaRKlVG46hHSJuqi0Ribt3K06Z1oQ29i35Np4G9MCDgkOGcHVyLMreMcbg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.0.tgz", + "integrity": "sha512-JqTWmVIq4AF8R8OK/2cCCiQo5ZJ0SRPsDkDgLO5/3z8xxuUp1oMIBBjfuueEe+11hGTZ6rRebzYikpKc6yQV9Q==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "@smithy/util-uri-escape": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.0.tgz", + "integrity": "sha512-VgdHhr8YTRsjOl4hnKFm7xEMOCRTnKw3FJ1nU+dlWNhdt/7eEtxtkdrJdx7PlRTabdANTmvyjE4umUl9cK4awg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.0.tgz", + "integrity": "sha512-UBpNFzBNmS20jJomuYn++Y+soF8rOK9AvIGjS9yGP6uRXF5rP18h4FDUsoNpWTlSsmiJ87e2DpZo9ywzSMH7PQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.1.0.tgz", + "integrity": "sha512-W0VMlz9yGdQ/0ZAgWICFjFHTVU0YSfGoCVpKaExRM/FDkTeP/yz8OKvjtGjs6oFokCRm0srgj/g4Cg0xuHu8Rw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.0.tgz", + "integrity": "sha512-ObX1ZqG2DdZQlXx9mLD7yAR8AGb7yXurGm+iWx9x4l1fBZ8CZN2BRT09aSbcXVPZXWGdn5VtMuupjxhOTI2EjA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.1.0", + "@smithy/protocol-http": "^5.2.0", + "@smithy/types": "^4.4.0", + "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-middleware": "^4.1.0", + "@smithy/util-uri-escape": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.0.tgz", + "integrity": "sha512-TvlIshqx5PIi0I0AiR+PluCpJ8olVG++xbYkAIGCUkByaMUlfOXLgjQTmYbr46k4wuDe8eHiTIlUflnjK2drPQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/core": "^3.10.0", + "@smithy/middleware-endpoint": "^4.2.0", + "@smithy/middleware-stack": "^4.1.0", + "@smithy/protocol-http": "^5.2.0", + "@smithy/types": "^4.4.0", + "@smithy/util-stream": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.4.0.tgz", + "integrity": "sha512-4jY91NgZz+ZnSFcVzWwngOW6VuK3gR/ihTwSU1R/0NENe9Jd8SfWgbhDCAGUWL3bI7DiDSW7XF6Ui6bBBjrqXw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.0.tgz", + "integrity": "sha512-/LYEIOuO5B2u++tKr1NxNxhZTrr3A63jW8N73YTwVeUyAlbB/YM+hkftsvtKAcMt3ADYo0FsF1GY3anehffSVQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/querystring-parser": "^4.1.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.1.0.tgz", + "integrity": "sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz", + "integrity": "sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz", + "integrity": "sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz", + "integrity": "sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz", + "integrity": "sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.0.tgz", + "integrity": "sha512-D27cLtJtC4EEeERJXS+JPoogz2tE5zeE3zhWSSu6ER5/wJ5gihUxIzoarDX6K1U27IFTHit5YfHqU4Y9RSGE0w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.1.0", + "@smithy/smithy-client": "^4.6.0", + "@smithy/types": "^4.4.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.0.tgz", + "integrity": "sha512-gnZo3u5dP1o87plKupg39alsbeIY1oFFnCyV2nI/++pL19vTtBLgOyftLEjPjuXmoKn2B2rskX8b7wtC/+3Okg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/config-resolver": "^4.2.0", + "@smithy/credential-provider-imds": "^4.1.0", + "@smithy/node-config-provider": "^4.2.0", + "@smithy/property-provider": "^4.1.0", + "@smithy/smithy-client": "^4.6.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.0.tgz", + "integrity": "sha512-5LFg48KkunBVGrNs3dnQgLlMXJLVo7k9sdZV5su3rjO3c3DmQ2LwUZI0Zr49p89JWK6sB7KmzyI2fVcDsZkwuw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.2.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz", + "integrity": "sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.0.tgz", + "integrity": "sha512-612onNcKyxhP7/YOTKFTb2F6sPYtMRddlT5mZvYf1zduzaGzkYhpYIPxIeeEwBZFjnvEqe53Ijl2cYEfJ9d6/Q==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.0.tgz", + "integrity": "sha512-5AGoBHb207xAKSVwaUnaER+L55WFY8o2RhlafELZR3mB0J91fpL+Qn+zgRkPzns3kccGaF2vy0HmNVBMWmN6dA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/service-error-classification": "^4.1.0", + "@smithy/types": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.0.tgz", + "integrity": "sha512-ZOYS94jksDwvsCJtppHprUhsIscRnCKGr6FXCo3SxgQ31ECbza3wqDBqSy6IsAak+h/oAXb1+UYEBmDdseAjUQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" + "@smithy/fetch-http-handler": "^5.2.0", + "@smithy/node-http-handler": "^4.2.0", + "@smithy/types": "^4.4.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "node_modules/@smithy/util-uri-escape": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz", + "integrity": "sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" } }, - "node_modules/@peculiar/webcrypto": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", - "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", + "node_modules/@smithy/util-utf8": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.1.0.tgz", + "integrity": "sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.8.0" + "@smithy/util-buffer-from": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10.12.0" + "node": ">=18.0.0" } }, - "node_modules/@playwright/test": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", - "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", - "devOptional": true, + "node_modules/@sphereon/isomorphic-webcrypto": { + "version": "2.5.0-unstable.0", + "resolved": "https://registry.npmjs.org/@sphereon/isomorphic-webcrypto/-/isomorphic-webcrypto-2.5.0-unstable.0.tgz", + "integrity": "sha512-HEOpZATW7zzYiF8Ak2X0lMvrVQL+6FTeIHm6E815zu7xP5PLjwYPJ0galBjc/F+kex22BzK9hndsdH0/y3bjqA==", + "license": "MIT", "dependencies": { - "playwright": "1.56.1" + "@peculiar/webcrypto": "^1.5.0", + "asmcrypto.js": "^2.3.2", + "b64-lite": "^1.4.0", + "b64u-lite": "^1.1.0", + "cipher-base": "^1.0.4", + "create-hash": "^1.2.0", + "inherits": "^2.0.4", + "md5.js": "^1.3.5", + "randomfill": "^1.0.4", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11", + "str2buf": "^1.3.0", + "webcrypto-shim": "^0.1.7" }, - "bin": { - "playwright": "cli.js" + "peerDependencies": { + "expo": "*", + "expo-crypto": "*", + "msrcrypto": "^1.5.8", + "react-native-securerandom": "^1.0.1" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-crypto": { + "optional": true + }, + "msrcrypt": { + "optional": true + }, + "react-native-securerandom": { + "optional": true + } } }, "node_modules/@stablelib/binary": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "license": "MIT", "dependencies": { "@stablelib/int": "^1.0.1" } @@ -1569,6 +3086,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz", "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==", + "license": "MIT", "dependencies": { "@stablelib/random": "^1.0.2", "@stablelib/sha512": "^1.0.1", @@ -1578,17 +3096,20 @@ "node_modules/@stablelib/hash": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", - "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==", + "license": "MIT" }, "node_modules/@stablelib/int": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", - "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==", + "license": "MIT" }, "node_modules/@stablelib/random": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", + "license": "MIT", "dependencies": { "@stablelib/binary": "^1.0.1", "@stablelib/wipe": "^1.0.1" @@ -1598,6 +3119,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz", "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==", + "license": "MIT", "dependencies": { "@stablelib/binary": "^1.0.1", "@stablelib/hash": "^1.0.1", @@ -1607,83 +3129,79 @@ "node_modules/@stablelib/wipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", - "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==", + "license": "MIT" }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tailwindcss/node": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", - "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.0", + "jiti": "^2.5.1", "lightningcss": "1.30.1", - "magic-string": "^0.30.19", + "magic-string": "^0.30.17", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.14" + "tailwindcss": "4.1.12" } }, + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "dev": true, + "license": "MIT" + }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", - "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "detect-libc": "^2.0.4", - "tar": "^7.5.1" + "tar": "^7.4.3" }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.14", - "@tailwindcss/oxide-darwin-arm64": "4.1.14", - "@tailwindcss/oxide-darwin-x64": "4.1.14", - "@tailwindcss/oxide-freebsd-x64": "4.1.14", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", - "@tailwindcss/oxide-linux-x64-musl": "4.1.14", - "@tailwindcss/oxide-wasm32-wasi": "4.1.14", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", - "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", - "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1692,196 +3210,32 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", - "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", - "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", - "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", - "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", - "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", - "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", - "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", - "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.0.5", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", - "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", - "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz", - "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", + "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", "dev": true, + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.14", - "@tailwindcss/oxide": "4.1.14", + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", "postcss": "^8.4.41", - "tailwindcss": "4.1.14" + "tailwindcss": "4.1.12" } }, + "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -1889,12 +3243,14 @@ "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -1903,6 +3259,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -1910,12 +3267,14 @@ "node_modules/@types/luxon": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", - "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==" + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", + "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -1923,13 +3282,15 @@ "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.22.tgz", - "integrity": "sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==", + "version": "20.19.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.13.tgz", + "integrity": "sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } @@ -1937,45 +3298,53 @@ "node_modules/@types/offscreencanvas": { "version": "2019.7.3", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", - "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", + "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", - "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", "dev": true, + "license": "MIT", "peerDependencies": { - "@types/react": "^19.2.0" + "@types/react": "^19.0.0" } }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/@types/validator": { - "version": "13.15.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.3.tgz", - "integrity": "sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==", - "dev": true + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" }, "node_modules/@types/whatwg-url": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", "dependencies": { "@types/webidl-conversions": "*" } @@ -1983,12 +3352,14 @@ "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" }, "node_modules/@zxing/library": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.21.3.tgz", "integrity": "sha512-hZHqFe2JyH/ZxviJZosZjV+2s6EDSY0O24R+FQmlWZBZXP9IqMo7S3nb3+2LBWxodJQkSurdQGnqE7KXqrYgow==", + "license": "MIT", "dependencies": { "ts-custom-error": "^3.2.1" }, @@ -2003,12 +3374,14 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "license": "(Unlicense OR Apache-2.0)", "optional": true }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -2016,15 +3389,50 @@ "node": ">=6.5" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/asmcrypto.js": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-2.3.2.tgz", - "integrity": "sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA==" + "integrity": "sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA==", + "license": "MIT" }, "node_modules/asn1js": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", + "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", @@ -2037,12 +3445,14 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2054,9 +3464,10 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -2067,6 +3478,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/b64-lite/-/b64-lite-1.4.0.tgz", "integrity": "sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==", + "license": "MIT", "dependencies": { "base-64": "^0.1.0" } @@ -2075,6 +3487,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/b64u-lite/-/b64u-lite-1.1.0.tgz", "integrity": "sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A==", + "license": "MIT", "dependencies": { "b64-lite": "^1.4.0" } @@ -2083,6 +3496,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2096,12 +3510,14 @@ "node_modules/base32-decode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base32-decode/-/base32-decode-1.0.0.tgz", - "integrity": "sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g==" + "integrity": "sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g==", + "license": "MIT" }, "node_modules/base32-encode": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "license": "MIT", "dependencies": { "to-data-view": "^1.1.0" } @@ -2110,6 +3526,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/base58-universal/-/base58-universal-2.0.0.tgz", "integrity": "sha512-BgkgF8zVLOAygszG4W8NkLm7iXrw80VYAOcedrzANrIhS14+4W6zVqjyGTFUBM/FpqkHUt8aAYd4DbBBfn3zKg==", + "license": "BSD-3-Clause", "engines": { "node": ">=14" } @@ -2118,6 +3535,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2126,6 +3544,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/base64url-universal/-/base64url-universal-1.1.0.tgz", "integrity": "sha512-WyftvZqye29YQ10ZnuiBeEj0lk8SN8xHU9hOznkLc85wS1cLTp6RpzlMrHxMPD9nH7S55gsBqMqgGyz93rqmkA==", + "license": "BSD-3-Clause", "dependencies": { "base64url": "^3.0.0" }, @@ -2133,10 +3552,19 @@ "node": ">=8.3.0" } }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/bson": { "version": "6.10.4", "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", + "license": "Apache-2.0", "engines": { "node": ">=16.20.1" } @@ -2145,6 +3573,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -2162,6 +3591,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -2174,6 +3604,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -2186,9 +3617,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", "funding": [ { "type": "opencollective", @@ -2202,17 +3633,20 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/canonicalize": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", - "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==" + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", + "license": "Apache-2.0" }, "node_modules/cborg": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.2.tgz", "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", + "license": "Apache-2.0", "bin": { "cborg": "cli.js" } @@ -2221,6 +3655,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2230,6 +3665,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2239,6 +3675,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2248,6 +3685,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2257,6 +3695,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2267,18 +3706,19 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.10" @@ -2287,12 +3727,14 @@ "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2304,6 +3746,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2314,20 +3757,17 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -2340,6 +3780,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/credential-handler-polyfill/-/credential-handler-polyfill-4.0.0.tgz", "integrity": "sha512-uUG2vzCDdNkZs/t33NjKeTN6PhTK8nArMHwVdF2de00domlnvMJPCle+iqqQ5HNvyQ41ziFb+RlHpS8E5rJdFA==", + "license": "BSD-3-Clause", "dependencies": { "web-request-rpc": "^3.0.0" } @@ -2347,12 +3788,14 @@ "node_modules/credentials-context": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/credentials-context/-/credentials-context-2.0.0.tgz", - "integrity": "sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ==" + "integrity": "sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ==", + "license": "SEE LICENSE IN LICENSE.md" }, "node_modules/crypto-ld": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/crypto-ld/-/crypto-ld-6.0.0.tgz", "integrity": "sha512-XWL1LslqggNoaCI/m3I7HcvaSt9b2tYzdrXO+jHLUj9G1BvRfvV7ZTFDVY5nifYuIGAPdAGu7unPxLRustw3VA==", + "license": "BSD-3-Clause", "engines": { "node": ">=8.3.0" } @@ -2360,12 +3803,14 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -2374,6 +3819,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -2390,6 +3836,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -2402,6 +3849,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2418,6 +3866,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2426,15 +3875,17 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "devOptional": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -2443,6 +3894,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -2454,13 +3906,15 @@ "node_modules/did-context": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/did-context/-/did-context-3.1.1.tgz", - "integrity": "sha512-iFpszgSxc7d1kNBJWC+PAzNTpe5LPalzsIunTMIpbG3O37Q7Zi7u4iIaedaM7UhziBhT+Agr9DyvAiXSUyfepQ==" + "integrity": "sha512-iFpszgSxc7d1kNBJWC+PAzNTpe5LPalzsIunTMIpbG3O37Q7Zi7u4iIaedaM7UhziBhT+Agr9DyvAiXSUyfepQ==", + "license": "SEE LICENSE IN LICENSE.md" }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -2472,6 +3926,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -2484,17 +3939,20 @@ "node_modules/ed25519-signature-2018-context": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ed25519-signature-2018-context/-/ed25519-signature-2018-context-1.1.0.tgz", - "integrity": "sha512-ppDWYMNwwp9bploq0fS4l048vHIq41nWsAbPq6H4mNVx9G/GxW3fwg4Ln0mqctP13MoEpREK7Biz8TbVVdYXqA==" + "integrity": "sha512-ppDWYMNwwp9bploq0fS4l048vHIq41nWsAbPq6H4mNVx9G/GxW3fwg4Ln0mqctP13MoEpREK7Biz8TbVVdYXqA==", + "license": "BSD-3-Clause" }, "node_modules/ed25519-signature-2020-context": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ed25519-signature-2020-context/-/ed25519-signature-2020-context-1.1.0.tgz", - "integrity": "sha512-dBGSmoUIK6h2vadDctrDnhhTO01PR2hJk0mRNEfrRDPCjaIwrfy4J+eziEQ9Q1m8By4f/CSRgKM1h53ydKfdNg==" + "integrity": "sha512-dBGSmoUIK6h2vadDctrDnhhTO01PR2hJk0mRNEfrRDPCjaIwrfy4J+eziEQ9Q1m8By4f/CSRgKM1h53ydKfdNg==", + "license": "BSD-3-Clause" }, "node_modules/ed2curve": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "license": "Unlicense", "dependencies": { "tweetnacl": "1.x.x" } @@ -2504,6 +3962,7 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -2516,6 +3975,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2524,6 +3984,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2532,6 +3993,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -2543,6 +4005,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -2557,6 +4020,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -2566,6 +4030,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2573,12 +4038,56 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "license": "Apache-2.0" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } }, "node_modules/fetch-blob": { "version": "3.2.0", @@ -2594,6 +4103,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -2612,6 +4122,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2625,6 +4136,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -2639,6 +4151,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2654,6 +4167,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -2667,6 +4181,7 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2679,6 +4194,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2687,6 +4203,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -2710,6 +4227,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -2722,6 +4240,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2733,12 +4252,14 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -2750,6 +4271,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2761,6 +4283,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -2772,23 +4295,24 @@ } }, "node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2800,6 +4324,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -2826,6 +4351,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -2847,12 +4373,14 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/html-url-attributes": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -2861,17 +4389,31 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 12" + } }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2881,6 +4423,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -2894,6 +4437,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2905,6 +4449,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2914,6 +4459,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2923,6 +4469,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2934,6 +4481,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -2945,15 +4493,17 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", "dev": true, + "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -2961,12 +4511,20 @@ "node_modules/js-base64": { "version": "3.7.8", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", - "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==" + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "license": "BSD-3-Clause" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/jsonld": { "version": "8.3.3", "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.3.tgz", "integrity": "sha512-9YcilrF+dLfg9NTEof/mJLMtbdX1RJ8dbWtJgE00cMOIohb1lIyJl710vFiTaiHTl6ZYODJuBd32xFvUhmv3kg==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/http-client": "^3.4.1", "canonicalize": "^1.0.1", @@ -2981,6 +4539,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/jsonld-document-loader/-/jsonld-document-loader-1.2.1.tgz", "integrity": "sha512-CtFyIBZApeVvs6QgyS7Gcp8h1dUs+1XNHcV4Sr6O9ItPaL0hVgqe47Tgs3RNH0A5Bc4p3UFPKAJVHKSOQq4mhQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -2989,6 +4548,7 @@ "version": "11.5.0", "resolved": "https://registry.npmjs.org/jsonld-signatures/-/jsonld-signatures-11.5.0.tgz", "integrity": "sha512-Kdto+e8uvY/5u3HYkmAbpy52bplWX9uqS8fmqdCv6oxnCFwCTM0hMt6r4rWqlhw5/aHoCHJIRxwYb4QKGC69Jw==", + "license": "BSD-3-Clause", "dependencies": { "@digitalbazaar/security-context": "^1.0.0", "jsonld": "^8.0.0", @@ -3003,6 +4563,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-4.0.1.tgz", "integrity": "sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==", + "license": "BSD-3-Clause", "dependencies": { "setimmediate": "^1.0.5" }, @@ -3014,6 +4575,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3024,12 +4586,14 @@ "node_modules/jsonld/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/jwt-decode": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", "engines": { "node": ">=18" } @@ -3038,14 +4602,16 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/ky": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.12.0.tgz", - "integrity": "sha512-YRLmSUHCwOJRBMArtqMRLOmO7fewn3yOoui6aB8ERkRVXupa0UiaQaKbIXteMt4jUElhbdqTMsLFHs8APxxUoQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.10.0.tgz", + "integrity": "sha512-YRPCzHEWZffbfvmRrfwa+5nwBHwZuYiTrfDX0wuhGBPV0pA/zCqcOq93MDssON/baIkpYbvehIX5aLpMxrRhaA==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -3057,6 +4623,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "node-fetch": "^3.2.10" @@ -3082,6 +4649,7 @@ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, + "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" }, @@ -3113,6 +4681,7 @@ "arm64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -3125,192 +4694,14 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss/node_modules/lightningcss-linux-arm64-musl": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], - "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -3323,14 +4714,14 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss/node_modules/lightningcss-linux-x64-musl": { + "node_modules/lightningcss-linux-x64-musl": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], - "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -3347,15 +4738,17 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz", + "integrity": "sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==", + "license": "ISC", "engines": { "node": "20 || >=22" } @@ -3364,15 +4757,17 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -3380,12 +4775,14 @@ "node_modules/material-icons": { "version": "1.13.14", "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.14.tgz", - "integrity": "sha512-kZOfc7xCC0rAT8Q3DQixYAeT+tBqZnxkseQtp2bxBxz7q5pMAC+wmit7vJn1g/l7wRU+HEPq23gER4iPjGs5Cg==" + "integrity": "sha512-kZOfc7xCC0rAT8Q3DQixYAeT+tBqZnxkseQtp2bxBxz7q5pMAC+wmit7vJn1g/l7wRU+HEPq23gER4iPjGs5Cg==", + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3394,6 +4791,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -3404,6 +4802,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -3427,6 +4826,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -3444,6 +4844,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -3467,6 +4868,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -3484,6 +4886,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -3497,6 +4900,7 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -3517,6 +4921,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -3537,6 +4942,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -3548,7 +4954,8 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" }, "node_modules/micromark": { "version": "4.0.2", @@ -3564,6 +4971,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -3598,6 +5006,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -3631,6 +5040,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -3651,6 +5061,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -3672,6 +5083,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -3691,6 +5103,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -3712,6 +5125,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -3733,6 +5147,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -3752,6 +5167,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -3770,6 +5186,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -3790,6 +5207,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -3809,6 +5227,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -3827,6 +5246,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -3847,7 +5267,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", @@ -3862,7 +5283,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", @@ -3878,6 +5300,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -3896,6 +5319,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } @@ -3914,6 +5338,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -3934,6 +5359,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -3954,7 +5380,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.2", @@ -3969,12 +5396,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3983,6 +5412,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3995,15 +5425,17 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -4011,14 +5443,31 @@ "node": ">= 18" } }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mongodb": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", - "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.19.0.tgz", + "integrity": "sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==", + "license": "Apache-2.0", "dependencies": { - "@mongodb-js/saslprep": "^1.3.0", + "@mongodb-js/saslprep": "^1.1.9", "bson": "^6.10.4", - "mongodb-connection-string-url": "^3.0.2" + "mongodb-connection-string-url": "^3.0.0" }, "engines": { "node": ">=16.20.1" @@ -4060,6 +5509,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", "dependencies": { "@types/whatwg-url": "^11.0.2", "whatwg-url": "^14.1.0 || ^13.0.0" @@ -4068,12 +5518,14 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/msrcrypto": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/msrcrypto/-/msrcrypto-1.5.8.tgz", "integrity": "sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q==", + "license": "Apache-2.0", "peer": true }, "node_modules/nanoid": { @@ -4086,6 +5538,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4094,11 +5547,12 @@ } }, "node_modules/next": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.6.tgz", - "integrity": "sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz", + "integrity": "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==", + "license": "MIT", "dependencies": { - "@next/env": "15.5.6", + "@next/env": "15.5.4", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -4111,14 +5565,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.6", - "@next/swc-darwin-x64": "15.5.6", - "@next/swc-linux-arm64-gnu": "15.5.6", - "@next/swc-linux-arm64-musl": "15.5.6", - "@next/swc-linux-x64-gnu": "15.5.6", - "@next/swc-linux-x64-musl": "15.5.6", - "@next/swc-win32-arm64-msvc": "15.5.6", - "@next/swc-win32-x64-msvc": "15.5.6", + "@next/swc-darwin-arm64": "15.5.4", + "@next/swc-darwin-x64": "15.5.4", + "@next/swc-linux-arm64-gnu": "15.5.4", + "@next/swc-linux-arm64-musl": "15.5.4", + "@next/swc-linux-x64-gnu": "15.5.4", + "@next/swc-linux-x64-musl": "15.5.4", + "@next/swc-win32-arm64-msvc": "15.5.4", + "@next/swc-win32-x64-msvc": "15.5.4", "sharp": "^0.34.3" }, "peerDependencies": { @@ -4162,6 +5616,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -4186,6 +5641,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -4194,6 +5650,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -4211,6 +5668,7 @@ "version": "6.10.1", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", + "license": "MIT-0", "engines": { "node": ">=6.0.0" } @@ -4218,12 +5676,14 @@ "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", @@ -4241,20 +5701,23 @@ "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/playwright": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", - "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", + "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.56.1" + "playwright-core": "1.55.0" }, "bin": { "playwright": "cli.js" @@ -4267,10 +5730,11 @@ } }, "node_modules/playwright-core": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", - "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", + "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", "devOptional": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -4282,6 +5746,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4305,6 +5770,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4314,15 +5780,11 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4331,12 +5793,14 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4345,6 +5809,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", "dependencies": { "tslib": "^2.8.1" } @@ -4353,6 +5818,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -4361,6 +5827,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/qr-scanner/-/qr-scanner-1.4.2.tgz", "integrity": "sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==", + "license": "MIT", "dependencies": { "@types/offscreencanvas": "^2019.6.4" } @@ -4369,6 +5836,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "license": "ISC", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -4377,6 +5845,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -4385,6 +5854,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -4394,6 +5864,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "license": "BSD-3-Clause", "dependencies": { "setimmediate": "^1.0.5" }, @@ -4405,6 +5876,7 @@ "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4413,6 +5885,7 @@ "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", "dependencies": { "scheduler": "^0.26.0" }, @@ -4424,6 +5897,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -4447,28 +5921,24 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -4484,6 +5954,7 @@ "version": "11.1.2", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -4496,16 +5967,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "node_modules/safe-buffer": { @@ -4525,17 +6003,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver.js" @@ -4548,6 +6029,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4562,6 +6044,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -4577,12 +6060,14 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", @@ -4603,6 +6088,7 @@ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", "hasInstallScript": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "@img/colour": "^1.0.0", @@ -4640,10 +6126,39 @@ "@img/sharp-win32-x64": "0.34.4" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4652,6 +6167,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4661,6 +6177,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", "dependencies": { "memory-pager": "^1.0.2" } @@ -4668,25 +6185,23 @@ "node_modules/str2buf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz", - "integrity": "sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==" + "integrity": "sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==", + "license": "MIT" }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -4696,18 +6211,34 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/style-to-js": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.18.tgz", - "integrity": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", "dependencies": { - "style-to-object": "1.0.11" + "style-to-object": "1.0.9" } }, "node_modules/style-to-object": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.11.tgz", - "integrity": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", "dependencies": { "inline-style-parser": "0.2.4" } @@ -4716,6 +6247,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", "dependencies": { "client-only": "0.0.1" }, @@ -4734,17 +6266,25 @@ } } }, + "node_modules/tabbable": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", + "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "license": "MIT" + }, "node_modules/tailwindcss": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", - "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", - "dev": true + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", + "dev": true, + "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -4754,15 +6294,17 @@ } }, "node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.1.0", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", "yallist": "^5.0.0" }, "engines": { @@ -4770,9 +6312,10 @@ } }, "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "license": "MIT", "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", @@ -4782,20 +6325,17 @@ "node": ">= 0.4" } }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/to-data-view": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", - "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==" + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "license": "MIT" }, "node_modules/tr46": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, @@ -4807,6 +6347,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4816,6 +6357,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4825,6 +6367,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -4832,17 +6375,20 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4854,6 +6400,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -4864,10 +6411,11 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4877,9 +6425,10 @@ } }, "node_modules/undici": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", - "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "license": "MIT", "engines": { "node": ">=18.17" } @@ -4888,12 +6437,14 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -4909,9 +6460,10 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -4924,6 +6476,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -4936,6 +6489,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -4948,6 +6502,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -4959,9 +6514,10 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -4974,7 +6530,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", @@ -4984,22 +6541,16 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/validator": { - "version": "13.15.15", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", - "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" @@ -5013,6 +6564,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -5025,12 +6577,14 @@ "node_modules/web-request-rpc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/web-request-rpc/-/web-request-rpc-3.0.0.tgz", - "integrity": "sha512-REyTB+PnvhmUcaVbFHnRLfP2aczu/J8qRJYRv8L4/uxp15Bk+lh6uYhrMrsoOCKOgnb5ltqV6DNSKxLtt0fnFw==" + "integrity": "sha512-REyTB+PnvhmUcaVbFHnRLfP2aczu/J8qRJYRv8L4/uxp15Bk+lh6uYhrMrsoOCKOgnb5ltqV6DNSKxLtt0fnFw==", + "license": "BSD-3-Clause" }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -5039,6 +6593,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.3.13", "@peculiar/json-schema": "^1.1.12", @@ -5050,12 +6605,14 @@ "node_modules/webcrypto-shim": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/webcrypto-shim/-/webcrypto-shim-0.1.7.tgz", - "integrity": "sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg==" + "integrity": "sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg==", + "license": "MIT" }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" } @@ -5064,6 +6621,7 @@ "version": "14.2.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" @@ -5076,6 +6634,7 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -5095,13 +6654,15 @@ "node_modules/x25519-key-agreement-2020-context": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/x25519-key-agreement-2020-context/-/x25519-key-agreement-2020-context-1.0.0.tgz", - "integrity": "sha512-zblYd8oSg6hNAD+fA9X7ek1hJQRircl3jVlEVCaBTNN9Mv9b4G32uJvRZFMQEMmda8iaTtYo9i2dRMdXX8pjpA==" + "integrity": "sha512-zblYd8oSg6hNAD+fA9X7ek1hJQRircl3jVlEVCaBTNN9Mv9b4G32uJvRZFMQEMmda8iaTtYo9i2dRMdXX8pjpA==", + "license": "BSD-3-Clause" }, "node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -5110,6 +6671,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/package.json b/package.json index d5c8b881..a53c2aaa 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "dev": "next dev --turbopack", "build": "next build --turbopack", "start": "next start", - "test": "playwright test --project=DesktopChrome --project=API" + "test": "playwright test --project=DesktopChrome" }, "dependencies": { "@digitalbazaar/lru-memoize": "^4.0.0", @@ -15,8 +15,9 @@ "@digitalcredentials/vc": "^9.0.1", "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", "@digitalcredentials/vc-status-list": "^9.0.0", - "@digitalcredentials/verifier-core": "^1.0.0-beta.7", + "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", + "@floating-ui/react": "^0.27.16", "@types/luxon": "^3.7.1", "@zxing/library": "^0.21.3", "axios": "^1.7.7", From ac754580b7a331dc604164594812f5f4f31f1926 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Sun, 26 Oct 2025 14:18:32 -0400 Subject: [PATCH 002/109] make help clickably toggled --- .../ContextualHelp/ContextualHelp.tsx | 35 +++++++++++++++---- app/components/Issuer/Issuer.tsx | 2 ++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 35876aa3..50bf8dc1 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -1,14 +1,37 @@ import type { ContextualHelpProps } from './ContextualHelp.d'; -import {useFloating} from '@floating-ui/react'; - +import {useFloating, useClick, useInteractions} from '@floating-ui/react'; +import { useState } from 'react'; export const ContextualHelp = ({text}: ContextualHelpProps) => { - const {refs, floatingStyles} = useFloating(); + + const [isOpen, setIsOpen] = useState(false); + + const {refs, floatingStyles, context} = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + }); + + const click = useClick(context); + + const {getReferenceProps, getFloatingProps} = useInteractions([ + click, + ]); + return ( <> - -
- {text} +
+ +
+ {isOpen && ( +
+ Floating element +
+ )} ); + } \ No newline at end of file diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index 7266db66..41468ce9 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -2,6 +2,7 @@ import { useRef } from 'react'; import type { IssuerProps } from './Issuer.d'; import styles from './Issuer.module.css'; import { TestId } from '@/lib/testIds'; +import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => { const issuerImage = useRef(null); @@ -29,6 +30,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {

{issuer.address}

{issuer.url} + From 292fc5601368eb94dec8ad5e71b45fae26ee4ae7 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Sun, 26 Oct 2025 14:36:45 -0400 Subject: [PATCH 003/109] add help icon to contextual help component --- .../ContextualHelp/ContextualHelp.tsx | 4 +- package-lock.json | 901 +++++++++++++++++- package.json | 4 + 3 files changed, 904 insertions(+), 5 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 50bf8dc1..f2319c89 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -1,6 +1,8 @@ import type { ContextualHelpProps } from './ContextualHelp.d'; import {useFloating, useClick, useInteractions} from '@floating-ui/react'; import { useState } from 'react'; +import HelpIcon from '@mui/icons-material/HelpOutlined'; + export const ContextualHelp = ({text}: ContextualHelpProps) => { const [isOpen, setIsOpen] = useState(false); @@ -19,7 +21,7 @@ export const ContextualHelp = ({text}: ContextualHelpProps) => { return ( <>
- +
{isOpen && ( diff --git a/package-lock.json b/package-lock.json index 44e2fc5b..df9f0462 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,11 @@ "@digitalcredentials/vc-status-list": "^9.0.0", "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "@floating-ui/react": "^0.27.16", + "@mui/icons-material": "^7.3.4", + "@mui/material": "^7.3.4", "@types/luxon": "^3.7.1", "@zxing/library": "^0.21.3", "axios": "^1.7.7", @@ -803,6 +807,145 @@ "node": ">=18.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@digitalbazaar/data-integrity-context": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/data-integrity-context/-/data-integrity-context-2.0.1.tgz", @@ -1612,6 +1755,152 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@fastify/busboy": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", @@ -2119,7 +2408,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -2141,7 +2429,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -2151,14 +2438,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.30", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2174,6 +2459,239 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.4.tgz", + "integrity": "sha512-BIktMapG3r4iXwIhYNpvk97ZfYWTreBBQTWjQKbNbzI64+ULHfYavQEX2w99aSWHS58DvXESWIgbD9adKcUOBw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.4.tgz", + "integrity": "sha512-9n6Xcq7molXWYb680N2Qx+FRW8oT6j/LXF5PZFH3ph9X/Rct0B/BlLAsFI7iL9ySI6LVLuQIVtrLiPT82R7OZw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^7.3.4", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.4.tgz", + "integrity": "sha512-gEQL9pbJZZHT7lYJBKQCS723v1MGys2IFc94COXbUIyCTWa+qC77a7hUax4Yjd5ggEm35dk4AyYABpKKWC4MLw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/core-downloads-tracker": "^7.3.4", + "@mui/system": "^7.3.3", + "@mui/types": "^7.4.7", + "@mui/utils": "^7.3.3", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.1.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^7.3.3", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.3.tgz", + "integrity": "sha512-OJM+9nj5JIyPUvsZ5ZjaeC9PfktmK+W5YaVLToLR8L0lB/DGmv1gcKE43ssNLSvpoW71Hct0necfade6+kW3zQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.3.tgz", + "integrity": "sha512-CmFxvRJIBCEaWdilhXMw/5wFJ1+FT9f3xt+m2pPXhHPeVIbBg9MnMvNSJjdALvnQJMPw8jLhrUtXmN7QAZV2fw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.3.tgz", + "integrity": "sha512-Lqq3emZr5IzRLKaHPuMaLBDVaGvxoh6z7HMWd1RPKawBM5uMRaQ4ImsmmgXWtwJdfZux5eugfDhXJUo2mliS8Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/private-theming": "^7.3.3", + "@mui/styled-engine": "^7.3.3", + "@mui/types": "^7.4.7", + "@mui/utils": "^7.3.3", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.7.tgz", + "integrity": "sha512-8vVje9rdEr1rY8oIkYgP+Su5Kwl6ik7O3jQ0wl78JGSmiZhRHV+vkjooGdKD8pbtZbutXFVTWQYshu2b3sG9zw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.3.tgz", + "integrity": "sha512-kwNAUh7bLZ7mRz9JZ+6qfRnnxbE4Zuc+RzXnhSpRSxjTlSTj7b4JxRLXpG+MVtPVtqks5k/XC8No1Vs3x4Z2gg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/types": "^7.4.7", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.1.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@next/env": { "version": "15.5.4", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz", @@ -2384,6 +2902,16 @@ "node": ">=18" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@smithy/abort-controller": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.0.tgz", @@ -3301,6 +3829,18 @@ "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.1.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", @@ -3320,6 +3860,15 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -3492,6 +4041,21 @@ "b64-lite": "^1.4.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -3616,6 +4180,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001743", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", @@ -3730,6 +4303,15 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3752,6 +4334,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, "node_modules/core-js": { "version": "3.46.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", @@ -3763,6 +4351,22 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -3909,6 +4513,16 @@ "integrity": "sha512-iFpszgSxc7d1kNBJWC+PAzNTpe5LPalzsIunTMIpbG3O37Q7Zi7u4iIaedaM7UhziBhT+Agr9DyvAiXSUyfepQ==", "license": "SEE LICENSE IN LICENSE.md" }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dotenv": { "version": "17.2.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", @@ -3971,6 +4585,15 @@ "node": ">=10.13.0" } }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4016,6 +4639,18 @@ "node": ">= 0.4" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -4112,6 +4747,12 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -4360,6 +5001,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -4386,6 +5042,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -4433,6 +5105,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4445,6 +5123,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -4514,6 +5207,30 @@ "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", "license": "BSD-3-Clause" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4734,6 +5451,12 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4744,6 +5467,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz", @@ -5673,12 +6408,33 @@ "node": ">=6.0.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -5704,6 +6460,39 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5780,6 +6569,23 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -5893,6 +6699,12 @@ "react": "^19.1.0" } }, + "node_modules/react-is": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.0.tgz", + "integrity": "sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==", + "license": "MIT" + }, "node_modules/react-markdown": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -5920,6 +6732,22 @@ "react": ">=18" } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -5976,6 +6804,35 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -6154,6 +7011,15 @@ "npm": ">= 3.0.0" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6266,6 +7132,24 @@ } } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tabbable": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", @@ -6667,6 +7551,15 @@ "node": ">=18" } }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index a53c2aaa..b9bdb7df 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,11 @@ "@digitalcredentials/vc-status-list": "^9.0.0", "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "@floating-ui/react": "^0.27.16", + "@mui/icons-material": "^7.3.4", + "@mui/material": "^7.3.4", "@types/luxon": "^3.7.1", "@zxing/library": "^0.21.3", "axios": "^1.7.7", From 5359626dbefb351cdbe7f3f9122d69615c49c2a8 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 27 Oct 2025 08:26:39 -0400 Subject: [PATCH 004/109] add styling to info icon --- .../ContextualHelp/ContextualHelp.module.css | 7 +++++++ app/components/ContextualHelp/ContextualHelp.tsx | 10 +++++----- app/components/Issuer/Issuer.tsx | 4 ++-- 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 app/components/ContextualHelp/ContextualHelp.module.css diff --git a/app/components/ContextualHelp/ContextualHelp.module.css b/app/components/ContextualHelp/ContextualHelp.module.css new file mode 100644 index 00000000..fb591934 --- /dev/null +++ b/app/components/ContextualHelp/ContextualHelp.module.css @@ -0,0 +1,7 @@ +.icon { + margin-left: 5px; + font-weight: bold; + font-size: 12px; +} + + diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index f2319c89..1a161a81 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -2,6 +2,7 @@ import type { ContextualHelpProps } from './ContextualHelp.d'; import {useFloating, useClick, useInteractions} from '@floating-ui/react'; import { useState } from 'react'; import HelpIcon from '@mui/icons-material/HelpOutlined'; +import styles from './ContextualHelp.module.css'; export const ContextualHelp = ({text}: ContextualHelpProps) => { @@ -20,17 +21,16 @@ export const ContextualHelp = ({text}: ContextualHelpProps) => { return ( <> -
- - -
+ + + {isOpen && (
- Floating element + {text}
)} diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index 41468ce9..0057b1b5 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -17,7 +17,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {
{(issuer?.image || issuer?.name || issuer?.url) && (
-

{header}

+

{header}

{issuer.image && ( {`${issuer.name} @@ -30,7 +30,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {

{issuer.address}

{issuer.url} - +
From 8fa6c90b88440b47ecbdf0db27d9a465e300ca0a Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 27 Oct 2025 09:03:11 -0400 Subject: [PATCH 005/109] replace @floating-ui/react with @base-ui-components/react --- .../ContextualHelp/ContextualHelp.tsx | 60 ++++++------- app/components/Issuer/Issuer.tsx | 2 +- package-lock.json | 86 +++++++++++++++---- package.json | 2 +- 4 files changed, 100 insertions(+), 50 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 1a161a81..982f2b0c 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -1,39 +1,35 @@ +import * as React from 'react'; import type { ContextualHelpProps } from './ContextualHelp.d'; -import {useFloating, useClick, useInteractions} from '@floating-ui/react'; -import { useState } from 'react'; import HelpIcon from '@mui/icons-material/HelpOutlined'; -import styles from './ContextualHelp.module.css'; +import { Dialog } from '@base-ui-components/react/dialog'; +import styles from './ContextualHelp.module.css' -export const ContextualHelp = ({text}: ContextualHelpProps) => { - const [isOpen, setIsOpen] = useState(false); - - const {refs, floatingStyles, context} = useFloating({ - open: isOpen, - onOpenChange: setIsOpen, - }); - - const click = useClick(context); - - const {getReferenceProps, getFloatingProps} = useInteractions([ - click, - ]); - +export const ContextualHelp = ({text}: ContextualHelpProps) => { return ( - <> - - - - {isOpen && ( -
- {text} -
- )} - + + }> + + + + + Notifications + + You are all caught up. Good job! + +
+ + Close + +
+
+
+
); +} + + + + + -} \ No newline at end of file diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index 0057b1b5..fb91a370 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -17,7 +17,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {
{(issuer?.image || issuer?.name || issuer?.url) && (
-

{header}

+

{header}

{issuer.image && ( {`${issuer.name} diff --git a/package-lock.json b/package-lock.json index df9f0462..9ce28764 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "verifier-plus", "version": "2.0.1", "dependencies": { + "@base-ui-components/react": "^1.0.0-beta.4", "@digitalbazaar/lru-memoize": "^4.0.0", "@digitalcredentials/ed25519-signature-2020": "^6.0.0", "@digitalcredentials/issuer-registry-client": "^3.0.0", @@ -19,7 +20,6 @@ "@digitalcredentials/vpqr": "^2.2.1", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@floating-ui/react": "^0.27.16", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.4", "@types/luxon": "^3.7.1", @@ -946,6 +946,60 @@ "node": ">=6.9.0" } }, + "node_modules/@base-ui-components/react": { + "version": "1.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@base-ui-components/react/-/react-1.0.0-beta.4.tgz", + "integrity": "sha512-sPYKj26gbFHD2ZsrMYqQshXnMuomBodzPn+d0dDxWieTj232XCQ9QGt9fU9l5SDGC9hi8s24lDlg9FXPSI7T8A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@base-ui-components/utils": "0.1.2", + "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/utils": "^0.2.10", + "reselect": "^5.1.1", + "tabbable": "^6.2.0", + "use-sync-external-store": "^1.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@base-ui-components/utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@base-ui-components/utils/-/utils-0.1.2.tgz", + "integrity": "sha512-aEitDGpMsYO2qnSpYOwZNykn9Rzn2ioyEVk2fyDRH7t+TIHVKpp9CeV7SPTq43M9mMSDxQ+7UeZJVkrj2dCVIQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@floating-ui/utils": "^0.2.10", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@digitalbazaar/data-integrity-context": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/data-integrity-context/-/data-integrity-context-2.0.1.tgz", @@ -1929,21 +1983,6 @@ "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@floating-ui/react": { - "version": "0.27.16", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", - "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.6", - "@floating-ui/utils": "^0.2.10", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, "node_modules/@floating-ui/react-dom": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", @@ -6804,6 +6843,12 @@ "node": ">=0.10.0" } }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -7411,6 +7456,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index b9bdb7df..332d5a80 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "test": "playwright test --project=DesktopChrome" }, "dependencies": { + "@base-ui-components/react": "^1.0.0-beta.4", "@digitalbazaar/lru-memoize": "^4.0.0", "@digitalcredentials/ed25519-signature-2020": "^6.0.0", "@digitalcredentials/issuer-registry-client": "^3.0.0", @@ -19,7 +20,6 @@ "@digitalcredentials/vpqr": "^2.2.1", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@floating-ui/react": "^0.27.16", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.4", "@types/luxon": "^3.7.1", From f15b02cc989137cd9030c33279dd963a17fd7e49 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 27 Oct 2025 09:16:42 -0400 Subject: [PATCH 006/109] enable tailwind --- app/globals.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/globals.css b/app/globals.css index b208e8d7..57ae40a8 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,4 +1,5 @@ @import url('https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;700&display=swap'); +@import "tailwindcss"; :root { --white: #FFFFFF; From b16569f61e68e361c9a3295345c40b8eb1ad77da Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 27 Oct 2025 10:10:00 -0400 Subject: [PATCH 007/109] set ContextualHelp children in dialog body --- app/components/ContextualHelp/ContextualHelp.d.ts | 5 +++-- app/components/ContextualHelp/ContextualHelp.module.css | 2 +- app/components/ContextualHelp/ContextualHelp.tsx | 6 +++--- app/components/Issuer/Issuer.tsx | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.d.ts b/app/components/ContextualHelp/ContextualHelp.d.ts index 7fba74d4..e7d92b31 100644 --- a/app/components/ContextualHelp/ContextualHelp.d.ts +++ b/app/components/ContextualHelp/ContextualHelp.d.ts @@ -1,5 +1,6 @@ -import React, { ReactElement } from "react" +import React, { ReactElement, ReactNode } from "react" export type ContextualHelpProps = { - text: string; + title?: string; + children: ReactNode; } diff --git a/app/components/ContextualHelp/ContextualHelp.module.css b/app/components/ContextualHelp/ContextualHelp.module.css index fb591934..d96348cb 100644 --- a/app/components/ContextualHelp/ContextualHelp.module.css +++ b/app/components/ContextualHelp/ContextualHelp.module.css @@ -1,7 +1,7 @@ .icon { margin-left: 5px; - font-weight: bold; font-size: 12px; + vertical-align: top; } diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 982f2b0c..fe46ac87 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -5,7 +5,7 @@ import { Dialog } from '@base-ui-components/react/dialog'; import styles from './ContextualHelp.module.css' -export const ContextualHelp = ({text}: ContextualHelpProps) => { +export const ContextualHelp = ({title, children}: ContextualHelpProps) => { return ( }> @@ -13,9 +13,9 @@ export const ContextualHelp = ({text}: ContextualHelpProps) => { - Notifications + {title} - You are all caught up. Good job! + {children}
diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index fb91a370..b4a859f9 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -17,7 +17,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {
{(issuer?.image || issuer?.name || issuer?.url) && (
-

{header}

+

{header}
some text

{issuer.image && ( {`${issuer.name} From 69e1baf5b0ca96f98981af13a47f6080e30a2bf0 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 27 Oct 2025 11:07:49 -0400 Subject: [PATCH 008/109] rework passing content into help dialog --- app/components/ContextualHelp/ContextualHelp.tsx | 4 +--- app/components/Issuer/Issuer.tsx | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index fe46ac87..41ee6270 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -14,9 +14,7 @@ export const ContextualHelp = ({title, children}: ContextualHelpProps) => { {title} - - {children} - + {children}
Close diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index b4a859f9..c243e515 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -7,6 +7,17 @@ import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => { const issuerImage = useRef(null); + const HelpText = () => { + return <> + The issuer is the person or institution that issued the Verifiable Credential. + This might be, for example, a university that has granted a degree to a student + and subsequently then issued a Verifiable Credential attesting that the student did earn the degree. + DCC logo + + } + const handleonError = () => { if (issuerImage.current != null) { issuerImage.current.style.visibility = 'hidden'; @@ -17,7 +28,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {
{(issuer?.image || issuer?.name || issuer?.url) && (
-

{header}
some text

+

{header}

{issuer.image && ( {`${issuer.name} @@ -30,7 +41,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {

{issuer.address}

{issuer.url} - +
From d903e595985ab54434689c61a81476087744987f Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 30 Oct 2025 11:48:20 -0400 Subject: [PATCH 009/109] add root div for base-ui --- app/layout.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/layout.tsx b/app/layout.tsx index 777f2e10..942c999c 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -28,7 +28,9 @@ export default function RootLayout({ +
{children} +
); From 62954676ac185a861fb5de32b53c71a56f015931 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 30 Oct 2025 11:49:12 -0400 Subject: [PATCH 010/109] add vc-help-react module definition --- app/types/modules.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/types/modules.d.ts b/app/types/modules.d.ts index a10930e4..d2053df9 100644 --- a/app/types/modules.d.ts +++ b/app/types/modules.d.ts @@ -11,3 +11,4 @@ declare module '@digitalcredentials/vc-status-list'; declare module 'jsonld-signatures'; declare module 'uuid'; declare module 'credential-handler-polyfill'; +declare module '@digitalcredentials/vc-help-react'; From 98e52862197cad2b3474a53079b80dcae1d8d4f9 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 30 Oct 2025 11:58:03 -0400 Subject: [PATCH 011/109] extract help content to @digitalcredentials/vc-help-react --- app/components/Issuer/Issuer.tsx | 14 ++------------ package-lock.json | 13 +++++++++++++ package.json | 2 ++ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index c243e515..d87b81c1 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -3,21 +3,11 @@ import type { IssuerProps } from './Issuer.d'; import styles from './Issuer.module.css'; import { TestId } from '@/lib/testIds'; import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; +import { IssuerHelp } from '@digitalcredentials/vc-help-react'; export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => { const issuerImage = useRef(null); - const HelpText = () => { - return <> - The issuer is the person or institution that issued the Verifiable Credential. - This might be, for example, a university that has granted a degree to a student - and subsequently then issued a Verifiable Credential attesting that the student did earn the degree. - DCC logo - - } - const handleonError = () => { if (issuerImage.current != null) { issuerImage.current.style.visibility = 'hidden'; @@ -28,7 +18,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {
{(issuer?.image || issuer?.name || issuer?.url) && (
-

{header}

+

{header}

{issuer.image && ( {`${issuer.name} diff --git a/package-lock.json b/package-lock.json index 9ce28764..f9d6c379 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@digitalcredentials/security-document-loader": "^8.0.0", "@digitalcredentials/vc": "^9.0.1", "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", + "@digitalcredentials/vc-help-react": "file:../vc-help-react", "@digitalcredentials/vc-status-list": "^9.0.0", "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", @@ -55,6 +56,14 @@ "lightningcss-linux-x64-musl": "^1.30.1" } }, + "../vc-help-react": { + "name": "@digitalcredentials/vc-help-react", + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -1607,6 +1616,10 @@ "node": ">=18" } }, + "node_modules/@digitalcredentials/vc-help-react": { + "resolved": "../vc-help-react", + "link": true + }, "node_modules/@digitalcredentials/vc-status-list": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc-status-list/-/vc-status-list-9.0.0.tgz", diff --git a/package.json b/package.json index 332d5a80..a603cab5 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "2.0.1", "scripts": { "dev": "next dev --turbopack", + "dev-no-turbopack": "next dev", "build": "next build --turbopack", "start": "next start", "test": "playwright test --project=DesktopChrome" @@ -15,6 +16,7 @@ "@digitalcredentials/security-document-loader": "^8.0.0", "@digitalcredentials/vc": "^9.0.1", "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", + "@digitalcredentials/vc-help-react": "file:../vc-help-react", "@digitalcredentials/vc-status-list": "^9.0.0", "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", From c1bc7a116ca0a90b6b92ace1919cf15e25c6cf02 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 30 Oct 2025 13:01:05 -0400 Subject: [PATCH 012/109] add expiration date contextual help --- app/components/CredentialCard/CredentialCard.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 27e86629..b601b488 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -15,6 +15,9 @@ import { extractNameFromOBV3Identifier } from '@/lib/extractNameFromOBV3Identifi import { TestId } from '@/lib/testIds'; import { Alignment } from '@/components/Alignment/Alignment'; +import { ContextualHelp } from '../ContextualHelp/ContextualHelp' +import { ExpirationDateHelp } from '@digitalcredentials/vc-help-react'; + export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { // TODO: add back IssuerInfoModal @@ -86,7 +89,7 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP : "N/A" } testId={TestId.ExpirationDate} - /> + />
{credential?.credentialSubject?.hasCredential?.awardedOnCompletionOf && ( From 3b11748d9389af64b16af1a14e6877f78c9b1a31 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 08:45:31 -0400 Subject: [PATCH 013/109] make modal wider --- app/components/ContextualHelp/ContextualHelp.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 41ee6270..b676c587 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -12,7 +12,7 @@ export const ContextualHelp = ({title, children}: ContextualHelpProps) => { - + {title} {children}
From d08489eaead8b465f04a78b1b738079a9dcfa04e Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 09:54:09 -0400 Subject: [PATCH 014/109] refactor contextual help --- .../CredentialCard/CredentialCard.tsx | 8 ++++--- app/components/Help/ExpirationDateHelp.tsx | 20 ++++++++++++++++++ app/components/Help/IssuerHelp.js | 13 ++++++++++++ app/components/Help/RegistryHelp.js | 21 +++++++++++++++++++ app/components/Help/VCHelp.js | 5 +++++ app/components/Help/index.js | 3 +++ app/components/InfoBlock/InfoBlock.d.ts | 2 ++ app/components/InfoBlock/InfoBlock.tsx | 6 ++++-- app/components/Issuer/Issuer.tsx | 4 ++-- package-lock.json | 6 +----- package.json | 1 - 11 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 app/components/Help/ExpirationDateHelp.tsx create mode 100644 app/components/Help/IssuerHelp.js create mode 100644 app/components/Help/RegistryHelp.js create mode 100644 app/components/Help/VCHelp.js create mode 100644 app/components/Help/index.js diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index b601b488..88e7d59e 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -15,8 +15,8 @@ import { extractNameFromOBV3Identifier } from '@/lib/extractNameFromOBV3Identifi import { TestId } from '@/lib/testIds'; import { Alignment } from '@/components/Alignment/Alignment'; -import { ContextualHelp } from '../ContextualHelp/ContextualHelp' -import { ExpirationDateHelp } from '@digitalcredentials/vc-help-react'; +import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' +import { ExpirationDateHelp } from '@/components/Help'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { @@ -83,13 +83,15 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP + />
{credential?.credentialSubject?.hasCredential?.awardedOnCompletionOf && ( diff --git a/app/components/Help/ExpirationDateHelp.tsx b/app/components/Help/ExpirationDateHelp.tsx new file mode 100644 index 00000000..85663378 --- /dev/null +++ b/app/components/Help/ExpirationDateHelp.tsx @@ -0,0 +1,20 @@ +export const ExpirationDateHelp = () => { + return <> +

There are a few key points here: +

    +
  • The credential is considered 'expired' after the given date.
  • +
  • The expiry date is set directly in the Verifiable Credential.
  • +
+

+

+

Version 1 Verifiable Credentials set the date like so:

+
"expirationDate": "2025-01-09T16:23:24Z"
+

For version 2 Verifiable Credentials, the date is set like so:

+
"validUntil": "2025-01-09T16:23:24Z"
+ +

One nuance, though, is that sometimes a credential is still useful even though it has expired. An expired driver's licence, for + example, can still be used to prove our age. Or to prove that we were in fact authorized to drive during a given period, + which might be useful when applying for a job that requires some number of years of driving experience. +

+ +} \ No newline at end of file diff --git a/app/components/Help/IssuerHelp.js b/app/components/Help/IssuerHelp.js new file mode 100644 index 00000000..7c64697a --- /dev/null +++ b/app/components/Help/IssuerHelp.js @@ -0,0 +1,13 @@ +export const IssuerHelp = () => { + return <> +

The issuer is the person or institution that issued the Verifiable Credential, for example, a university that gives students Verifiable Credentials confirming their graduation.

+

Fundmentally important is that to trust anything signed by an issuer, + the DID (Decentralized Identififer) used to + sign the credential must be known to us in some way. That might be because + we keep a list of DIDs in our verifier that we know about, or it might that we look up + the DID in some kind of registry that we in turn trust. Both are effectively lists + of DIDs that we trust. If a credential has not been signed by a DID that we know about + then we cannot trust the credential - it could have been faked and signed by anyone. +

+ +} \ No newline at end of file diff --git a/app/components/Help/RegistryHelp.js b/app/components/Help/RegistryHelp.js new file mode 100644 index 00000000..f4de0066 --- /dev/null +++ b/app/components/Help/RegistryHelp.js @@ -0,0 +1,21 @@ +export const RegistryHelp = () => { + return <> +

To know who issued a Verifiable Credential we must + know who controls the cryptographic key pair (a public key and a private key) used to sign the credential, which typically means + we must be told from a trustworthy source that the public key does in fact belong + to the claimed issuer. We can be told directly by the issuer themselves, which can be as a simple as saying, "Hey there, my DID is did:key:z6MkjoriXdbyWD25YXTed114F8hdJrLXQ567xxPHAUKxpKkS" or they might post it on their known + web site (e.g. mit.edu) so we can check it as needed, or they might add it to a registry so that it can be looked up along with the + keys of other issuers. +

+

It is fundamentally necessary that we are told in some trustworthy way that a public key does belong to the issuer. Without that knowledge, + fake key pairs could be used to sign fake credentials and we just wouldn't know. +

+

In this app, when verifying a credential, we look up public keys in a registry controlled by the Digital Credentials Consortium. + We don't, however, make any guarantees about the trustworthiness or legitimacy of the credentials - only that they + were signed by a key that has been registered in one of our registries. We make no guarantees because this is + strictly for demonstration purposes. A 'real' verifier would use a registry whose entries have been vetted and approved. +

+

A registry of keys controlled by the association of university registrars for a given coountry, for example, + could be used to verify digital degrees from accredited universities

+ +} \ No newline at end of file diff --git a/app/components/Help/VCHelp.js b/app/components/Help/VCHelp.js new file mode 100644 index 00000000..dfea9444 --- /dev/null +++ b/app/components/Help/VCHelp.js @@ -0,0 +1,5 @@ +export const VCHelp = () => { + return <> +

A Verifiable Credential is a cryptographically signed digital credential.

+ +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js new file mode 100644 index 00000000..d5208764 --- /dev/null +++ b/app/components/Help/index.js @@ -0,0 +1,3 @@ +export * from './IssuerHelp'; +export * from './ExpirationDateHelp'; +export * from './RegistryHelp'; \ No newline at end of file diff --git a/app/components/InfoBlock/InfoBlock.d.ts b/app/components/InfoBlock/InfoBlock.d.ts index 8a7a3633..5b44efb3 100644 --- a/app/components/InfoBlock/InfoBlock.d.ts +++ b/app/components/InfoBlock/InfoBlock.d.ts @@ -2,4 +2,6 @@ export type InfoBlockProps = { header: string; contents: string; testId?: string; + HelpContent?: ReactElement; + helpTitle?:string; } \ No newline at end of file diff --git a/app/components/InfoBlock/InfoBlock.tsx b/app/components/InfoBlock/InfoBlock.tsx index 6ab06d01..62735a44 100644 --- a/app/components/InfoBlock/InfoBlock.tsx +++ b/app/components/InfoBlock/InfoBlock.tsx @@ -1,11 +1,13 @@ import type { InfoBlockProps } from './InfoBlock.d'; import styles from './InfoBlock.module.css'; -export const InfoBlock = ({header, contents, testId}: InfoBlockProps) => { +import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' + +export const InfoBlock = ({header, contents, testId, helpTitle, HelpContent}: InfoBlockProps) => { // The testId allows playwright to more reliably find this element on the page return (
-

{header}

+

{header}{HelpContent&&}

{contents}
); diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index d87b81c1..4d4356a6 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -2,8 +2,8 @@ import { useRef } from 'react'; import type { IssuerProps } from './Issuer.d'; import styles from './Issuer.module.css'; import { TestId } from '@/lib/testIds'; -import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; -import { IssuerHelp } from '@digitalcredentials/vc-help-react'; +import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' +import { IssuerHelp } from '@/components/Help'; export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => { const issuerImage = useRef(null); diff --git a/package-lock.json b/package-lock.json index f9d6c379..6fde06bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@digitalcredentials/security-document-loader": "^8.0.0", "@digitalcredentials/vc": "^9.0.1", "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", - "@digitalcredentials/vc-help-react": "file:../vc-help-react", "@digitalcredentials/vc-status-list": "^9.0.0", "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", @@ -59,6 +58,7 @@ "../vc-help-react": { "name": "@digitalcredentials/vc-help-react", "version": "1.0.0", + "extraneous": true, "license": "MIT", "engines": { "node": ">=18.0" @@ -1616,10 +1616,6 @@ "node": ">=18" } }, - "node_modules/@digitalcredentials/vc-help-react": { - "resolved": "../vc-help-react", - "link": true - }, "node_modules/@digitalcredentials/vc-status-list": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@digitalcredentials/vc-status-list/-/vc-status-list-9.0.0.tgz", diff --git a/package.json b/package.json index a603cab5..9d0b922d 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "@digitalcredentials/security-document-loader": "^8.0.0", "@digitalcredentials/vc": "^9.0.1", "@digitalcredentials/vc-bitstring-status-list": "^1.0.0", - "@digitalcredentials/vc-help-react": "file:../vc-help-react", "@digitalcredentials/vc-status-list": "^9.0.0", "@digitalcredentials/verifier-core": "^1.0.0-beta.10", "@digitalcredentials/vpqr": "^2.2.1", From 3f3d085bd5c9227f12cdcd6b90ba64c4b4bede6f Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 12:56:44 -0400 Subject: [PATCH 015/109] rework help styling to use modules --- app/components/Help/ExpirationDateHelp.tsx | 20 ------------------- .../ExpirationDateHelp.module.css | 12 +++++++++++ .../ExpirationDateHelp/ExpirationDateHelp.tsx | 15 ++++++++++++++ app/components/Help/index.js | 2 +- 4 files changed, 28 insertions(+), 21 deletions(-) delete mode 100644 app/components/Help/ExpirationDateHelp.tsx create mode 100644 app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css create mode 100644 app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx diff --git a/app/components/Help/ExpirationDateHelp.tsx b/app/components/Help/ExpirationDateHelp.tsx deleted file mode 100644 index 85663378..00000000 --- a/app/components/Help/ExpirationDateHelp.tsx +++ /dev/null @@ -1,20 +0,0 @@ -export const ExpirationDateHelp = () => { - return <> -

There are a few key points here: -

    -
  • The credential is considered 'expired' after the given date.
  • -
  • The expiry date is set directly in the Verifiable Credential.
  • -
-

-

-

Version 1 Verifiable Credentials set the date like so:

-
"expirationDate": "2025-01-09T16:23:24Z"
-

For version 2 Verifiable Credentials, the date is set like so:

-
"validUntil": "2025-01-09T16:23:24Z"
- -

One nuance, though, is that sometimes a credential is still useful even though it has expired. An expired driver's licence, for - example, can still be used to prove our age. Or to prove that we were in fact authorized to drive during a given period, - which might be useful when applying for a job that requires some number of years of driving experience. -

- -} \ No newline at end of file diff --git a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css new file mode 100644 index 00000000..d7d34013 --- /dev/null +++ b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css @@ -0,0 +1,12 @@ +.note { + color: blue; + font-size: 16px; + background-color: lightgray; + padding: 10px; + margin: 20px; +} + +.list { + list-style-type: disc; + padding-left: 20px; +} \ No newline at end of file diff --git a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx new file mode 100644 index 00000000..58de77f2 --- /dev/null +++ b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx @@ -0,0 +1,15 @@ +import styles from './ExpirationDateHelp.module.css'; +export const ExpirationDateHelp = () => { + return <> +
    +
  • The expiry date is set directly in the Verifiable Credential and cannot be changed without invalidating the cryptographic signature.
  • +
  • Version 1 Verifiable Credentials set the date like so: "expirationDate": "2025-01-09T16:23:24Z"
  • +
  • Version 2 Verifiable Credentials set the date like so: "validUntil": "2025-01-09T16:23:24Z"
  • +
  • A credential is considered 'expired' after the given date.
  • +
+

Note that sometimes a credential is still useful even though it has expired. An expired driver's licence, for + example, can still be used to prove our age. Or to prove that we were authorized to drive during a given period, + which might be useful when applying for car insurance. +

+ +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index d5208764..5baf7ab9 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -1,3 +1,3 @@ export * from './IssuerHelp'; -export * from './ExpirationDateHelp'; +export * from './ExpirationDateHelp/ExpirationDateHelp'; export * from './RegistryHelp'; \ No newline at end of file From 850105434dae68219b92b753ec15fea010a2faf9 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 13:46:13 -0400 Subject: [PATCH 016/109] add help icons --- public/icons/info_24_lime.svg | 1 + public/icons/info_icon_24.svg | 1 + 2 files changed, 2 insertions(+) create mode 100644 public/icons/info_24_lime.svg create mode 100644 public/icons/info_icon_24.svg diff --git a/public/icons/info_24_lime.svg b/public/icons/info_24_lime.svg new file mode 100644 index 00000000..0d1a2c2f --- /dev/null +++ b/public/icons/info_24_lime.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/info_icon_24.svg b/public/icons/info_icon_24.svg new file mode 100644 index 00000000..9ae001c1 --- /dev/null +++ b/public/icons/info_icon_24.svg @@ -0,0 +1 @@ + \ No newline at end of file From 6c3841a016e13e367315a79083258389fdde95ad Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 13:46:51 -0400 Subject: [PATCH 017/109] add common help css --- app/components/Help/Help.module.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 app/components/Help/Help.module.css diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css new file mode 100644 index 00000000..9e9b8022 --- /dev/null +++ b/app/components/Help/Help.module.css @@ -0,0 +1,17 @@ +.note { + color: white; + font-size: 16px; + background-color: gray; + padding: 10px; + margin: 20px; + display: inline-block; +} + +.list { + list-style-type: disc; + padding-left: 20px; +} + +.image { + display:inline-block +} \ No newline at end of file From 26265de90b4245f03c98352d0d1c153c298c83d8 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 13:47:24 -0400 Subject: [PATCH 018/109] update expiration date help --- .../ExpirationDateHelp/ExpirationDateHelp.module.css | 9 +++++++-- .../Help/ExpirationDateHelp/ExpirationDateHelp.tsx | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css index d7d34013..9e9b8022 100644 --- a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css +++ b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css @@ -1,12 +1,17 @@ .note { - color: blue; + color: white; font-size: 16px; - background-color: lightgray; + background-color: gray; padding: 10px; margin: 20px; + display: inline-block; } .list { list-style-type: disc; padding-left: 20px; +} + +.image { + display:inline-block } \ No newline at end of file diff --git a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx index 58de77f2..2fd403c8 100644 --- a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx +++ b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx @@ -1,4 +1,4 @@ -import styles from './ExpirationDateHelp.module.css'; +import styles from '../Help.module.css'; export const ExpirationDateHelp = () => { return <>
    @@ -7,7 +7,7 @@ export const ExpirationDateHelp = () => {
  • Version 2 Verifiable Credentials set the date like so: "validUntil": "2025-01-09T16:23:24Z"
  • A credential is considered 'expired' after the given date.
-

Note that sometimes a credential is still useful even though it has expired. An expired driver's licence, for +

Note that sometimes a credential is still useful even though it has expired. An expired driver's licence, for example, can still be used to prove our age. Or to prove that we were authorized to drive during a given period, which might be useful when applying for car insurance.

From 6bc178789cd24bd7eb1fa6d1132e1e3fc1d04e8e Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 31 Oct 2025 13:47:41 -0400 Subject: [PATCH 019/109] update issuer help --- app/components/Help/IssuerHelp.js | 13 ------------ app/components/Help/IssuerHelp/IssuerHelp.js | 21 ++++++++++++++++++++ app/components/Help/index.js | 2 +- 3 files changed, 22 insertions(+), 14 deletions(-) delete mode 100644 app/components/Help/IssuerHelp.js create mode 100644 app/components/Help/IssuerHelp/IssuerHelp.js diff --git a/app/components/Help/IssuerHelp.js b/app/components/Help/IssuerHelp.js deleted file mode 100644 index 7c64697a..00000000 --- a/app/components/Help/IssuerHelp.js +++ /dev/null @@ -1,13 +0,0 @@ -export const IssuerHelp = () => { - return <> -

The issuer is the person or institution that issued the Verifiable Credential, for example, a university that gives students Verifiable Credentials confirming their graduation.

-

Fundmentally important is that to trust anything signed by an issuer, - the DID (Decentralized Identififer) used to - sign the credential must be known to us in some way. That might be because - we keep a list of DIDs in our verifier that we know about, or it might that we look up - the DID in some kind of registry that we in turn trust. Both are effectively lists - of DIDs that we trust. If a credential has not been signed by a DID that we know about - then we cannot trust the credential - it could have been faked and signed by anyone. -

- -} \ No newline at end of file diff --git a/app/components/Help/IssuerHelp/IssuerHelp.js b/app/components/Help/IssuerHelp/IssuerHelp.js new file mode 100644 index 00000000..b8994b58 --- /dev/null +++ b/app/components/Help/IssuerHelp/IssuerHelp.js @@ -0,0 +1,21 @@ +import styles from '../Help.module.css'; + +export const IssuerHelp = () => { + return <> +
    +
  • Typically whoever signed the Verifiable Credential, for example, a university that issues students Verifiable Credentials confirming their degree.
  • +
  • The issuer is described in the issuer property of the Verifiable Credential.
  • +
  • The issuer may also be described in an 'issuer registry'.
  • +
  • The LCW and VerifierPlus use issuer details from our registry in preference to the details in the VC.
  • +
  • An issuer's DID MUST be listed in a trusted registry in order for VCs issued with that DID to be trusted.
  • +
+

Fundmentally important is that to trust anything signed by an issuer, + the DID (Decentralized Identififer) used to + sign the credential must be known to us in some way. That might be because + we keep a list of DIDs in our verifier that we know about (an internal registry), or it might that we look up + the DID in some kind of shared registry that we in turn trust. Both are effectively lists + of DIDs that we trust. If a credential has not been signed by a DID that we know about + then we cannot trust the credential - it could have been faked and signed by anyone. +

+ +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 5baf7ab9..75d2e33e 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -1,3 +1,3 @@ -export * from './IssuerHelp'; +export * from './IssuerHelp/IssuerHelp'; export * from './ExpirationDateHelp/ExpirationDateHelp'; export * from './RegistryHelp'; \ No newline at end of file From e5f05f2825def8932ba32def7265b39f43e62190 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 10:03:09 -0500 Subject: [PATCH 020/109] add issuance date help --- .../CredentialCard/CredentialCard.tsx | 8 ++++++- .../ExpirationDateHelp.module.css | 17 --------------- .../IssuanceDateHelp/IssuanceDateHelp.tsx | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 18 deletions(-) delete mode 100644 app/components/Help/ExpirationDateHelp/ExpirationDateHelp.module.css create mode 100644 app/components/Help/IssuanceDateHelp/IssuanceDateHelp.tsx diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 88e7d59e..63107387 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -17,6 +17,7 @@ import { Alignment } from '@/components/Alignment/Alignment'; import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' import { ExpirationDateHelp } from '@/components/Help'; +import { IssuanceDateHelp } from '../Help/IssuanceDateHelp/IssuanceDateHelp'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { @@ -78,7 +79,12 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP
{displayValues.issuanceDate && ( - + )} { + return <> +
    +
  • The date the Verifiable Credential became valid.
  • +
  • The issuance date is set directly in the Verifiable Credential and cannot be changed without invalidating the cryptographic signature.
  • +
  • For Version 1 Verifiable Credentials we use the issuanceDate property
    e.g., "issuanceDate": "2025-01-09T16:23:24Z"
  • +
  • For Version 2 Verifiable Credentials we use the validFrom property
    e.g., "validFrom": "2025-01-09T16:23:24Z"
  • +
+ +

Note that the issuance date is not necessarily + the date that the Verifiable Credential was signed, although in most cases they will be the same. The issuance date can in + fact pre-date the VC or be in a date after the VC was signed. So it might be better to think of the issuance date as + the date at which the Verifiable Credential becomes valid, which could have been in the past or future. +

+

Note that the issuance date is not + the date when the underlying credential (like a degree) was awarded. In that case, when using OBv3, the better + field to use is awardedDate. +

+ +} \ No newline at end of file From 4190706ab3627ece9eb09648141dd94d314c55ce Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 10:43:53 -0500 Subject: [PATCH 021/109] add holder help --- .../CredentialCard/CredentialCard.tsx | 8 ++++- app/components/Help/Help.module.css | 6 +++- app/components/Help/HolderHelp/HolderHelp.tsx | 33 +++++++++++++++++++ app/components/Help/index.js | 3 +- 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 app/components/Help/HolderHelp/HolderHelp.tsx diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 63107387..255c51a5 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -18,6 +18,7 @@ import { Alignment } from '@/components/Alignment/Alignment'; import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' import { ExpirationDateHelp } from '@/components/Help'; import { IssuanceDateHelp } from '../Help/IssuanceDateHelp/IssuanceDateHelp'; +import { HolderHelp } from '../Help/HolderHelp/HolderHelp'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { @@ -110,7 +111,12 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP
{displayValues.issuedTo ? - + : null } diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index 9e9b8022..0ac77404 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -4,7 +4,7 @@ background-color: gray; padding: 10px; margin: 20px; - display: inline-block; + display: inline-block; } .list { @@ -14,4 +14,8 @@ .image { display:inline-block +} + +.title { + text-align: center; } \ No newline at end of file diff --git a/app/components/Help/HolderHelp/HolderHelp.tsx b/app/components/Help/HolderHelp/HolderHelp.tsx new file mode 100644 index 00000000..295e8729 --- /dev/null +++ b/app/components/Help/HolderHelp/HolderHelp.tsx @@ -0,0 +1,33 @@ +import styles from '../Help.module.css'; +export const HolderHelp = () => { + return <> +
    +
  • Typically the subject of the credential, e.g., a student who earned a diploma.
  • +
  • Sometimes called the 'subject', 'earner', 'recipient', or the 'holder'.
  • +
  • Set directly in the Verifiable Credential and cannot be changed without invalidating the cryptographic signature.
  • +
+ +

Note that + a credential might be 'issued to' someone other than the 'subject' of the credential. In this case we might say the + credential was issued to a 'holder'. An example could be a birth certificate for a child (the subject), but issued to the parent (the holder) + who can then act on the child's behalf. However, because Verifiable Credentials are a relatively new technology, there + isn't yet clear consensus on terminology, and the same term can often be used to describe different things, so it is + important to interpet context. +

+

Note that some Verifiable Credentials might not + explicitly define a subject. Such credentials are sometimes called 'bearer credentials' meaning they belong to + whoever holds the credential. As such, when determining what to show for the 'issued to' field we try our best (as described below) + to determine the name of the credential subject, but default in the end to credential.name if no other value is found. +

+

How we determine the value of this field

+ In order of preference: +
    +
  • credential.credentialSubject.name
  • +
  • Scredential.credentialSubject.identifiers[identityType=name].identityHash
  • +
  • credential.name
  • +
+

+ + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 75d2e33e..07660704 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -1,3 +1,4 @@ export * from './IssuerHelp/IssuerHelp'; export * from './ExpirationDateHelp/ExpirationDateHelp'; -export * from './RegistryHelp'; \ No newline at end of file +export * from './RegistryHelp'; +export * from './HolderHelp/HolderHelp' \ No newline at end of file From 19e9b1b68e55bd1a04302d700355dcad817ec77e Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 11:39:04 -0500 Subject: [PATCH 022/109] add description field help --- .../CredentialCard/CredentialCard.tsx | 8 ++++++- .../Help/DescriptionHelp/DescriptionHelp.tsx | 24 +++++++++++++++++++ app/components/Help/HolderHelp/HolderHelp.tsx | 7 +++++- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 app/components/Help/DescriptionHelp/DescriptionHelp.tsx diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 255c51a5..96721534 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -19,6 +19,7 @@ import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' import { ExpirationDateHelp } from '@/components/Help'; import { IssuanceDateHelp } from '../Help/IssuanceDateHelp/IssuanceDateHelp'; import { HolderHelp } from '../Help/HolderHelp/HolderHelp'; +import { DescriptionHelp } from '../Help/DescriptionHelp/DescriptionHelp'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { @@ -121,7 +122,12 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP null } {displayValues.credentialDescription ? - + : null } diff --git a/app/components/Help/DescriptionHelp/DescriptionHelp.tsx b/app/components/Help/DescriptionHelp/DescriptionHelp.tsx new file mode 100644 index 00000000..4b6a50ce --- /dev/null +++ b/app/components/Help/DescriptionHelp/DescriptionHelp.tsx @@ -0,0 +1,24 @@ +import styles from '../Help.module.css'; +export const DescriptionHelp = () => { + return <> +
    +
  • A short human readable description of the credential
    e.g, 'Bachelor of Science in Computer Science'.
  • +
  • Not required by Verifiable Credential data model.
  • Required by the OpenBadges version 3 data model.
  • +
  • If no description is provided, nothing is shown, including the 'Description' title.
  • +
+ +

Note that formatting is not accommodated in the + description field. To provide a more stylized presentation, consider using the 'Criteria' field, which does allow + Markdown syntax. +

+

How we determine the value of this field

+ In order of preference: +
    +
  • credential.credentialSubject.achievement.description (OBv3)
  • +
  • credential.credentialSubject.hasCredential.description
  • +
+

+ + + +} \ No newline at end of file diff --git a/app/components/Help/HolderHelp/HolderHelp.tsx b/app/components/Help/HolderHelp/HolderHelp.tsx index 295e8729..3e457e16 100644 --- a/app/components/Help/HolderHelp/HolderHelp.tsx +++ b/app/components/Help/HolderHelp/HolderHelp.tsx @@ -2,7 +2,7 @@ import styles from '../Help.module.css'; export const HolderHelp = () => { return <>
    -
  • Typically the subject of the credential, e.g., a student who earned a diploma.
  • +
  • Typically, this is the subject of the credential, e.g., a student who earned a diploma.
  • Sometimes called the 'subject', 'earner', 'recipient', or the 'holder'.
  • Set directly in the Verifiable Credential and cannot be changed without invalidating the cryptographic signature.
@@ -19,6 +19,11 @@ export const HolderHelp = () => { whoever holds the credential. As such, when determining what to show for the 'issued to' field we try our best (as described below) to determine the name of the credential subject, but default in the end to credential.name if no other value is found.

+

Note that some Verifiable Credentials are issued to + an identifier other than the name of a person. In particular, they can be issued to a Decentralized Identifier (DID) + belonging to the holder of the credential. The holder can later then use this DID to prove, using a cryptographic signature, that they + control the credential. +

How we determine the value of this field

In order of preference:
    From 549c7e0e79bbabc4afc14ae8ed5c544f63cdc44c Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 13:38:21 -0500 Subject: [PATCH 023/109] add criteria help --- .../CredentialCard/CredentialCard.tsx | 3 ++- .../Help/CriteriaHelp/CriteriaHelp.tsx | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 app/components/Help/CriteriaHelp/CriteriaHelp.tsx diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 96721534..1a4346f1 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -20,6 +20,7 @@ import { ExpirationDateHelp } from '@/components/Help'; import { IssuanceDateHelp } from '../Help/IssuanceDateHelp/IssuanceDateHelp'; import { HolderHelp } from '../Help/HolderHelp/HolderHelp'; import { DescriptionHelp } from '../Help/DescriptionHelp/DescriptionHelp'; +import { CriteriaHelp } from '../Help/CriteriaHelp/CriteriaHelp'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { @@ -133,7 +134,7 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP } {displayValues.criteria && (
    -

    Criteria

    +

    Criteria

    {/*
    {displayValues.criteria}
    */}
    {displayValues.criteria} diff --git a/app/components/Help/CriteriaHelp/CriteriaHelp.tsx b/app/components/Help/CriteriaHelp/CriteriaHelp.tsx new file mode 100644 index 00000000..42d128c4 --- /dev/null +++ b/app/components/Help/CriteriaHelp/CriteriaHelp.tsx @@ -0,0 +1,21 @@ +import styles from '../Help.module.css'; +export const CriteriaHelp = () => { + return <> +
      +
    • A human readable description of the criteria that must be satisfied to earn the credential.
    • +
    • Not required by Verifiable Credential data model.
    • Required by the OpenBadges version 3 data model.
    • +
    • If no criteria is provided, nothing is shown, including the 'Criteria' title.
    • +
    +

    Note that the criteria field supports + Markdown syntax. +

    +

    How we determine the value of this field

    + In order of preference: +
      +
    • credential.credentialSubject.achievement.criteria (OBv3)
    • +
    +

    + + + +} \ No newline at end of file From b1408fe1ad502d187d8cae4bc9018298f4b28911 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 14:49:46 -0500 Subject: [PATCH 024/109] refactor registry help --- app/components/CredentialCard/CredentialCard.tsx | 7 +------ app/components/Help/{ => RegistryHelp}/RegistryHelp.js | 2 ++ app/components/Help/index.js | 7 +++++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename app/components/Help/{ => RegistryHelp}/RegistryHelp.js (88%) diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 1a4346f1..d04f86c6 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -16,12 +16,7 @@ import { TestId } from '@/lib/testIds'; import { Alignment } from '@/components/Alignment/Alignment'; import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' -import { ExpirationDateHelp } from '@/components/Help'; -import { IssuanceDateHelp } from '../Help/IssuanceDateHelp/IssuanceDateHelp'; -import { HolderHelp } from '../Help/HolderHelp/HolderHelp'; -import { DescriptionHelp } from '../Help/DescriptionHelp/DescriptionHelp'; -import { CriteriaHelp } from '../Help/CriteriaHelp/CriteriaHelp'; - +import { ExpirationDateHelp, IssuanceDateHelp, HolderHelp, DescriptionHelp, CriteriaHelp } from '@/components/Help'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { // TODO: add back IssuerInfoModal diff --git a/app/components/Help/RegistryHelp.js b/app/components/Help/RegistryHelp/RegistryHelp.js similarity index 88% rename from app/components/Help/RegistryHelp.js rename to app/components/Help/RegistryHelp/RegistryHelp.js index f4de0066..7af12fac 100644 --- a/app/components/Help/RegistryHelp.js +++ b/app/components/Help/RegistryHelp/RegistryHelp.js @@ -17,5 +17,7 @@ export const RegistryHelp = () => {

    A registry of keys controlled by the association of university registrars for a given coountry, for example, could be used to verify digital degrees from accredited universities

    +

    A slight nuance is that Verifiable Credentials are typically signed with a Decentralized Identifier which + is simply a more durable way to describe a signing key. So we look up DIDs in our registry.

    } \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 07660704..2f82c5e0 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -1,4 +1,7 @@ export * from './IssuerHelp/IssuerHelp'; export * from './ExpirationDateHelp/ExpirationDateHelp'; -export * from './RegistryHelp'; -export * from './HolderHelp/HolderHelp' \ No newline at end of file +export * from './IssuanceDateHelp/IssuanceDateHelp'; +export * from './RegistryHelp/RegistryHelp'; +export * from './HolderHelp/HolderHelp' +export * from './DescriptionHelp/DescriptionHelp' +export * from './CriteriaHelp/CriteriaHelp' \ No newline at end of file From 194b0b6282adde92386297b9f72ee3cee91877e8 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 15:11:26 -0500 Subject: [PATCH 025/109] add verification indicator help --- .../VerifyIndicatorHelp.tsx | 28 +++++++++++++++++++ app/components/Help/index.js | 3 +- .../VerifyIndicator/VerifyIndicator.tsx | 4 ++- 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx diff --git a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx new file mode 100644 index 00000000..52b9389e --- /dev/null +++ b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx @@ -0,0 +1,28 @@ +import styles from '../Help.module.css'; +export const VerifyIndicatorHelp = () => { + return <> +
      +
    • An indication of the status of the credential.
    • +
    • Four possible statuses: Verified, Not Verified, Warning or Verifying...
    • +
    +

    Note that the only criteria for + saying a credential is Not Verified is if the credential has been tampered with + in some way, or we can't verify the signature because we can't retrieve the public key. If the credential + has expired, has been revoked or is from an issuer we don't recognize then we take a moderate approach + and simply show a Warning. We do this because our verification page is primarily for education and + demonstration. A verification page for a university that verifies degrees would likely more strictly enforce + expiry, revocation, and would most certainly not accept credentials from an unknown issuer. +

    +

    How we determine the value of this field

    + In order of preference: +
      +
    • Verifying if verification is still in progress.
    • +
    • Verified if nothing has been tampered with, the credential hasn't expired, hasn't been revoked, and is from a known issuer.
    • +
    • Not Verified if the credential has been tampered with.
    • +
    • Warning if the credential hasn't been tampered with, but has been revoked, has expired, or isn't from a known issuer.
    • +
    +

    + + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 2f82c5e0..5b8432bb 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -4,4 +4,5 @@ export * from './IssuanceDateHelp/IssuanceDateHelp'; export * from './RegistryHelp/RegistryHelp'; export * from './HolderHelp/HolderHelp' export * from './DescriptionHelp/DescriptionHelp' -export * from './CriteriaHelp/CriteriaHelp' \ No newline at end of file +export * from './CriteriaHelp/CriteriaHelp' +export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' \ No newline at end of file diff --git a/app/components/VerifyIndicator/VerifyIndicator.tsx b/app/components/VerifyIndicator/VerifyIndicator.tsx index 02bd67d6..a32894f6 100644 --- a/app/components/VerifyIndicator/VerifyIndicator.tsx +++ b/app/components/VerifyIndicator/VerifyIndicator.tsx @@ -1,6 +1,8 @@ import { useVerificationContext } from "@/lib/verificationContext"; import styles from './VerifyIndicator.module.css'; import { TestId } from "@/lib/testIds"; +import { ContextualHelp } from "../ContextualHelp/ContextualHelp"; +import { VerifyIndicatorHelp } from "../Help"; export const VERIFYING_MSG = 'Verifying...'; export const NOT_VERIFIED_MSG = 'Not Verified' @@ -61,7 +63,7 @@ export const VerifyIndicator = () => { {icon} {text} - +
    ); }; \ No newline at end of file From 4de869713aa6b3e71e813d66af7fc16a60892763 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 15:21:11 -0500 Subject: [PATCH 026/109] style the field choice section --- app/components/Help/CriteriaHelp/CriteriaHelp.tsx | 4 ++-- .../Help/DescriptionHelp/DescriptionHelp.tsx | 4 ++-- app/components/Help/Help.module.css | 11 +++++++++++ app/components/Help/HolderHelp/HolderHelp.tsx | 4 ++-- .../Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx | 4 ++-- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/components/Help/CriteriaHelp/CriteriaHelp.tsx b/app/components/Help/CriteriaHelp/CriteriaHelp.tsx index 42d128c4..c8189c97 100644 --- a/app/components/Help/CriteriaHelp/CriteriaHelp.tsx +++ b/app/components/Help/CriteriaHelp/CriteriaHelp.tsx @@ -9,8 +9,8 @@ export const CriteriaHelp = () => {

    Note that the criteria field supports Markdown syntax.

    -

    How we determine the value of this field

    - In order of preference: +

    How we determine the value of this field

    +
    • credential.credentialSubject.achievement.criteria (OBv3)
    diff --git a/app/components/Help/DescriptionHelp/DescriptionHelp.tsx b/app/components/Help/DescriptionHelp/DescriptionHelp.tsx index 4b6a50ce..fe9f6c6a 100644 --- a/app/components/Help/DescriptionHelp/DescriptionHelp.tsx +++ b/app/components/Help/DescriptionHelp/DescriptionHelp.tsx @@ -11,8 +11,8 @@ export const DescriptionHelp = () => { description field. To provide a more stylized presentation, consider using the 'Criteria' field, which does allow Markdown syntax.

    -

    How we determine the value of this field

    - In order of preference: +

    How we determine the value of this field

    +
    In order of preference:
    • credential.credentialSubject.achievement.description (OBv3)
    • credential.credentialSubject.hasCredential.description
    • diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index 0ac77404..43c4f670 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -18,4 +18,15 @@ .title { text-align: center; + font-size: 18px; + font-weight:500; +} + +.criteria { + background-color:aliceblue; + padding: 5px +} + +.preference { + padding-bottom: 5px; } \ No newline at end of file diff --git a/app/components/Help/HolderHelp/HolderHelp.tsx b/app/components/Help/HolderHelp/HolderHelp.tsx index 3e457e16..509eeb58 100644 --- a/app/components/Help/HolderHelp/HolderHelp.tsx +++ b/app/components/Help/HolderHelp/HolderHelp.tsx @@ -24,8 +24,8 @@ export const HolderHelp = () => { belonging to the holder of the credential. The holder can later then use this DID to prove, using a cryptographic signature, that they control the credential.

      -

      How we determine the value of this field

      - In order of preference: +

      How we determine the value of this field

      +
      In order of preference:
      • credential.credentialSubject.name
      • Scredential.credentialSubject.identifiers[identityType=name].identityHash
      • diff --git a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx index 52b9389e..5728b4d4 100644 --- a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx +++ b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx @@ -13,8 +13,8 @@ export const VerifyIndicatorHelp = () => { demonstration. A verification page for a university that verifies degrees would likely more strictly enforce expiry, revocation, and would most certainly not accept credentials from an unknown issuer.

        -

        How we determine the value of this field

        - In order of preference: +

        How we determine the value of this field

        +
        • Verifying if verification is still in progress.
        • Verified if nothing has been tampered with, the credential hasn't expired, hasn't been revoked, and is from a known issuer.
        • From fdba9774c4bdd292c1918ad5e8f61ac5e2fa8cd9 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 3 Nov 2025 15:24:41 -0500 Subject: [PATCH 027/109] fix warning and not verified criteria for verication help --- .../VerifyIndicatorHelp/VerifyIndicatorHelp.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx index 5728b4d4..482cf4c9 100644 --- a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx +++ b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx @@ -5,21 +5,20 @@ export const VerifyIndicatorHelp = () => {
        • An indication of the status of the credential.
        • Four possible statuses: Verified, Not Verified, Warning or Verifying...
        -

        Note that the only criteria for - saying a credential is Not Verified is if the credential has been tampered with - in some way, or we can't verify the signature because we can't retrieve the public key. If the credential - has expired, has been revoked or is from an issuer we don't recognize then we take a moderate approach +

        Note that we only flag a credential as Not Verified is if the credential has been tampered with + in some way or we can't otherwise verify the signature, or the credential has been revoked. If the credential + has expired or is from an issuer we don't recognize then we take a moderate approach and simply show a Warning. We do this because our verification page is primarily for education and demonstration. A verification page for a university that verifies degrees would likely more strictly enforce - expiry, revocation, and would most certainly not accept credentials from an unknown issuer. + expiry, and would most certainly not accept credentials from an unknown issuer.

        How we determine the value of this field

        • Verifying if verification is still in progress.
        • Verified if nothing has been tampered with, the credential hasn't expired, hasn't been revoked, and is from a known issuer.
        • -
        • Not Verified if the credential has been tampered with.
        • -
        • Warning if the credential hasn't been tampered with, but has been revoked, has expired, or isn't from a known issuer.
        • +
        • Not Verified if the credential has been tampered with, the signature can't been checked, or has been revoked.
        • +
        • Warning if the credential hasn't been tampered with, but has expired, or isn't from a known issuer.

        From 217b8b478a48aa61d615262510a7e83aa5824183 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 08:13:55 -0500 Subject: [PATCH 028/109] add credential title help --- .../CredentialCard/CredentialCard.tsx | 5 +++-- app/components/Help/TitleHelp/TitleHelp.tsx | 22 +++++++++++++++++++ app/components/Help/index.js | 3 ++- 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 app/components/Help/TitleHelp/TitleHelp.tsx diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index d04f86c6..615ebd72 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -16,7 +16,8 @@ import { TestId } from '@/lib/testIds'; import { Alignment } from '@/components/Alignment/Alignment'; import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' -import { ExpirationDateHelp, IssuanceDateHelp, HolderHelp, DescriptionHelp, CriteriaHelp } from '@/components/Help'; +import { ExpirationDateHelp, IssuanceDateHelp, HolderHelp, DescriptionHelp, CriteriaHelp, TitleHelp } from '@/components/Help'; + export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { // TODO: add back IssuerInfoModal @@ -66,7 +67,7 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP
        {displayValues.achievementImage ? achievement image : null}
        -

        {displayValues.credentialName}

        +

        {displayValues.credentialName}

        {displayValues.achievementType ?

        Achievement Type : {displayValues.achievementType}

        : null}
        diff --git a/app/components/Help/TitleHelp/TitleHelp.tsx b/app/components/Help/TitleHelp/TitleHelp.tsx new file mode 100644 index 00000000..591fb8ec --- /dev/null +++ b/app/components/Help/TitleHelp/TitleHelp.tsx @@ -0,0 +1,22 @@ +import styles from '../Help.module.css'; +export const TitleHelp = () => { + return <> +
          +
        • The name of the credential, or in other words, the name of the achievement attested by the credential.
        • +
        • Generally the same name for all instances of the credential, so not unique to the recipient.
        • +
        +

        Note that some issuers might make the name + unique to the holder. So where a a generic name might be Bachelor of Arts, some issuers might set the name as + Charlie Jones' Bachelor of Arts. +

        +

        How we determine the value of this field

        +
        In order of preference:
        +
          +
        • credential.credentialSubject.achievement.name (OBv3)
        • +
        • credential.credentialSubject.hasCredential.name
        • +
        +

        + + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 5b8432bb..82691525 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -5,4 +5,5 @@ export * from './RegistryHelp/RegistryHelp'; export * from './HolderHelp/HolderHelp' export * from './DescriptionHelp/DescriptionHelp' export * from './CriteriaHelp/CriteriaHelp' -export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' \ No newline at end of file +export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' +export * from './TitleHelp/TitleHelp' \ No newline at end of file From a6d5b7c8b30b218d989493aa307797a99f4930e5 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 09:48:18 -0500 Subject: [PATCH 029/109] add achievementType help --- .../CredentialCard/CredentialCard.tsx | 4 +-- .../AchievementTypeHelp.tsx | 25 +++++++++++++++++++ app/components/Help/index.js | 3 ++- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 615ebd72..0dc5db5d 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -16,7 +16,7 @@ import { TestId } from '@/lib/testIds'; import { Alignment } from '@/components/Alignment/Alignment'; import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' -import { ExpirationDateHelp, IssuanceDateHelp, HolderHelp, DescriptionHelp, CriteriaHelp, TitleHelp } from '@/components/Help'; +import { ExpirationDateHelp, IssuanceDateHelp, HolderHelp, DescriptionHelp, CriteriaHelp, TitleHelp, AchievementTypeHelp } from '@/components/Help'; export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardProps) => { @@ -68,7 +68,7 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP {displayValues.achievementImage ? achievement image : null}

        {displayValues.credentialName}

        - {displayValues.achievementType ?

        Achievement Type : {displayValues.achievementType}

        : null} + {displayValues.achievementType ?

        Achievement Type : {displayValues.achievementType}

        : null}
diff --git a/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx b/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx new file mode 100644 index 00000000..96a1127f --- /dev/null +++ b/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx @@ -0,0 +1,25 @@ +import styles from '../Help.module.css'; +export const AchievementTypeHelp = () => { + return <> +
    +
  • The type of Open Badge achievement attested to by the credential, for example 'Award', 'Certification', 'DoctoralDegree'.
  • +
  • A full list of pre-defined Open Badge achievement types is defined in the Open Badges Specification.
  • +
  • New OBv3 achievement types can be added by extending the OBv3 context.
  • +
  • If no achievementType is available, nothing is shown including the label.
  • +
+

Note that the goal of the achievementType field is interoperability. + If different credential issuers use the same achievementType for similar credentials then hopefully consumers of the + credential can treat the credentials as equivalent to some degree. It might of course be less useful to treat + two credentials with an achievementType of 'award' as equivalent, but hopefully moreso for two credential of type 'DoctoralDegree'. Over time + we expect that issuers will converge on common definitions. +

+

How we determine the value of this field

+
In order of preference:
+
    +
  • credential.credentialSubject.achievement.achievementType (OBv3)
  • +
+

+ + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 82691525..9042dfe1 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -6,4 +6,5 @@ export * from './HolderHelp/HolderHelp' export * from './DescriptionHelp/DescriptionHelp' export * from './CriteriaHelp/CriteriaHelp' export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' -export * from './TitleHelp/TitleHelp' \ No newline at end of file +export * from './TitleHelp/TitleHelp' +export * from './AchievementTypeHelp/AchievementTypeHelp' \ No newline at end of file From d45ed4ab0489472c75294483d6df2ce0e7aa7a5a Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 11:05:03 -0500 Subject: [PATCH 030/109] update title and criteria styling --- app/components/Help/Help.module.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index 43c4f670..6202b44f 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -22,6 +22,18 @@ font-weight:500; } +.criteriaTitle { + text-align: center; + font-size: 16px; + font-weight:600; + padding-bottom: 5px; +} + +.subtitle { + font-size: 15px; + font-weight:500; + padding: 5px; +} .criteria { background-color:aliceblue; padding: 5px @@ -29,4 +41,9 @@ .preference { padding-bottom: 5px; +} + +.infoIcon { + display: inline-block; + padding-right: 6px; } \ No newline at end of file From 80693bb66de89162d5e646e72fe56a16ebc6afc0 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 11:06:00 -0500 Subject: [PATCH 031/109] add badge image help to title help --- .../CredentialCard/CredentialCard.tsx | 2 +- app/components/Help/TitleHelp/TitleHelp.tsx | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/components/CredentialCard/CredentialCard.tsx b/app/components/CredentialCard/CredentialCard.tsx index 0dc5db5d..3891ed09 100644 --- a/app/components/CredentialCard/CredentialCard.tsx +++ b/app/components/CredentialCard/CredentialCard.tsx @@ -67,7 +67,7 @@ export const CredentialCard = ({ credential, wasMulti = false }: CredentialCardP
{displayValues.achievementImage ? achievement image : null}
-

{displayValues.credentialName}

+

{displayValues.credentialName}

{displayValues.achievementType ?

Achievement Type : {displayValues.achievementType}

: null}
diff --git a/app/components/Help/TitleHelp/TitleHelp.tsx b/app/components/Help/TitleHelp/TitleHelp.tsx index 591fb8ec..a5e2ec05 100644 --- a/app/components/Help/TitleHelp/TitleHelp.tsx +++ b/app/components/Help/TitleHelp/TitleHelp.tsx @@ -1,15 +1,16 @@ import styles from '../Help.module.css'; export const TitleHelp = () => { return <> +
Credential Name
    -
  • The name of the credential, or in other words, the name of the achievement attested by the credential.
  • -
  • Generally the same name for all instances of the credential, so not unique to the recipient.
  • +
  • The name of the credential, or in other words, the name of the achievement declared by the credential.
  • +
  • Generally the same name is used for all instances of the credential, so not unique to the recipient.
-

Note that some issuers might make the name +

Some issuers might make the name unique to the holder. So where a a generic name might be Bachelor of Arts, some issuers might set the name as Charlie Jones' Bachelor of Arts.

-

How we determine the value of this field

+

How we determine the value of the name

In order of preference:
  • credential.credentialSubject.achievement.name (OBv3)
  • @@ -17,6 +18,19 @@ export const TitleHelp = () => {

- +
+
Credential Image
+
    +
  • An image for the credential, sometimes called a badge image.
  • +
  • Generally the same image is used for all instances of the credential, so not unique to the recipient.
  • +
+

Note that in VerifierPlus we size the + image to 36px by 36px regardless of the actual size of the image. +

+

How we determine the image to show

+
    +
  • credential.credentialSubject.achievement.image.id (OBv3)
  • +
+

} \ No newline at end of file From 1145cd73e326210f592e636d9c4b2f5bcab56527 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 13:14:42 -0500 Subject: [PATCH 032/109] add resultItem typescript types --- app/components/ResultLog/ResultLog.d.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/components/ResultLog/ResultLog.d.ts b/app/components/ResultLog/ResultLog.d.ts index eba91e39..0e56950f 100644 --- a/app/components/ResultLog/ResultLog.d.ts +++ b/app/components/ResultLog/ResultLog.d.ts @@ -2,4 +2,16 @@ import { VerifyResponse } from "types/credential"; export type ResultLogProps = { verificationResult: VerifyResponse; +} + +export type ResultItem = { + verified:boolean, + positiveMessage:string, + negativeMessage?:string, + warningMessage?:string, + sourceLogId?:string, + testId:string, + helpTitle?:string, + HelpContent?:ReactElement, + issuer?:boolean } \ No newline at end of file From 39cd64a12e0d23c199a58af2073a0baf104af9f6 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 14:08:09 -0500 Subject: [PATCH 033/109] add credential format help --- .../ContextualHelp/ContextualHelp.d.ts | 1 + .../ContextualHelp/ContextualHelp.tsx | 4 ++-- .../CredentialFormatHelp.tsx | 22 +++++++++++++++++++ app/components/Help/index.js | 3 ++- app/components/ResultLog/ResultLog.tsx | 19 +++++++++++----- tests/log.spec.ts | 2 -- tests/verifyText.spec.ts | 4 ++-- 7 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx diff --git a/app/components/ContextualHelp/ContextualHelp.d.ts b/app/components/ContextualHelp/ContextualHelp.d.ts index e7d92b31..153177ac 100644 --- a/app/components/ContextualHelp/ContextualHelp.d.ts +++ b/app/components/ContextualHelp/ContextualHelp.d.ts @@ -3,4 +3,5 @@ import React, { ReactElement, ReactNode } from "react" export type ContextualHelpProps = { title?: string; children: ReactNode; + fontSize?: string; } diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index b676c587..47ab70ec 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -5,10 +5,10 @@ import { Dialog } from '@base-ui-components/react/dialog'; import styles from './ContextualHelp.module.css' -export const ContextualHelp = ({title, children}: ContextualHelpProps) => { +export const ContextualHelp = ({title, fontSize = '12px', children}: ContextualHelpProps) => { return ( - }> + }> diff --git a/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx b/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx new file mode 100644 index 00000000..4ebf094b --- /dev/null +++ b/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx @@ -0,0 +1,22 @@ +import styles from '../Help.module.css'; +export const CredentialFormatHelp = () => { + return <> +
    +
  • Various checks to confirm we are in fact dealing with a well-formed Verifiable Credential
  • +
  • These aren't checks on the validity of the signature or data, but rather simply that the data is in the format we expect.
  • +
+ +

We try to check for as many things as possible, but + of course there may be edge cases we haven't yet surfaced. +

+

How we determine the validity

+
The credential must:
+
    +
  • be valid JSON
  • +
  • have a JSON-LD context
  • +
+

+ + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 9042dfe1..17a24583 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -7,4 +7,5 @@ export * from './DescriptionHelp/DescriptionHelp' export * from './CriteriaHelp/CriteriaHelp' export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' export * from './TitleHelp/TitleHelp' -export * from './AchievementTypeHelp/AchievementTypeHelp' \ No newline at end of file +export * from './AchievementTypeHelp/AchievementTypeHelp' +export * from './CredentialFormatHelp/CredentialFormatHelp' \ No newline at end of file diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index 933ab704..75aeff2b 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -1,10 +1,12 @@ 'use client' import { useState } from 'react'; import { CredentialError } from '@/types/credential.d'; -import type { ResultLogProps } from './ResultLog.d'; +import type { ResultItem, ResultLogProps } from './ResultLog.d'; import styles from './ResultLog.module.css'; import { StatusPurpose, hasStatusPurpose } from '@/lib/credentialStatus'; import { TestId } from "@/lib/testIds" +import { CredentialFormatHelp } from '../Help'; +import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; export enum LogId { ValidSignature = 'valid_signature', @@ -20,7 +22,7 @@ export enum LogMessages { HasNotExpired = 'has not expired', GeneralError = 'There was an error verifing this credential.', UnknownError = 'There was an unknown error verifing this credential.', - WellFormed = 'is in a supported credential format', + WellFormed = 'is correctly formatted', MalFormed = 'is not a recognized credential type', ValidSignature = 'has a valid signature', InvalidSignature = 'has an invalid signature', @@ -44,8 +46,10 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { warningMessage = '', sourceLogId = '', testId = '', + helpTitle, + HelpContent, issuer = false - }) => { + }: ResultItem) => { const isIssuerCheck = sourceLogId === LogId.IssuerDIDResolves; const isExpirationCheck = sourceLogId === LogId.Expiration; const status = verified @@ -61,7 +65,7 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { }; return ( -
+
{ ? 'priority_high' : 'close'} -
+
{status === 'positive' && positiveMessage} {status === 'warning' && warningMessage} {status === 'negative' && negativeMessage} + {HelpContent&&}
); @@ -183,6 +188,8 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { positiveMessage={LogMessages.WellFormed} negativeMessage={LogMessages.MalFormed} testId={TestId.MalformedLogMsg} + HelpContent={CredentialFormatHelp} + helpTitle="Supported Credential Format" /> { positiveMessage={LogMessages.ValidSignature} negativeMessage={LogMessages.InvalidSignature} testId={TestId.SigningLogMsg} + HelpContent={CredentialFormatHelp} + helpTitle="Supported Credential Format" /> Date: Tue, 4 Nov 2025 15:13:15 -0500 Subject: [PATCH 034/109] replace generic css with tailwind for consistency --- app/components/ContextualHelp/ContextualHelp.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 47ab70ec..7fe03578 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -2,7 +2,6 @@ import * as React from 'react'; import type { ContextualHelpProps } from './ContextualHelp.d'; import HelpIcon from '@mui/icons-material/HelpOutlined'; import { Dialog } from '@base-ui-components/react/dialog'; -import styles from './ContextualHelp.module.css' export const ContextualHelp = ({title, fontSize = '12px', children}: ContextualHelpProps) => { From a3a85672d40158ad19df691a3eca231c227eb4e3 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 15:15:21 -0500 Subject: [PATCH 035/109] fix help icon placement and spacing in log section --- app/components/ResultLog/ResultLog.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index 75aeff2b..eefedbf6 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -83,11 +83,11 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { ? 'priority_high' : 'close'} -
+
{status === 'positive' && positiveMessage} {status === 'warning' && warningMessage} {status === 'negative' && negativeMessage} - {HelpContent&&} + {HelpContent&&
}
); From feafe545c241b8d73a1eb075c159e1b807498808 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Tue, 4 Nov 2025 17:41:27 -0500 Subject: [PATCH 036/109] add signature help --- .../Help/SignatureHelp/SignatureHelp.tsx | 33 +++++++++++++++++++ app/components/Help/index.js | 3 +- app/components/ResultLog/ResultLog.tsx | 6 ++-- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 app/components/Help/SignatureHelp/SignatureHelp.tsx diff --git a/app/components/Help/SignatureHelp/SignatureHelp.tsx b/app/components/Help/SignatureHelp/SignatureHelp.tsx new file mode 100644 index 00000000..c6c0abb6 --- /dev/null +++ b/app/components/Help/SignatureHelp/SignatureHelp.tsx @@ -0,0 +1,33 @@ +import styles from '../Help.module.css'; +export const SignatureHelp = () => { + return <> +
    +
  • Verifies that the cryptographic signature in the credential matches the content, in other words, verifies that the credential has not been tampered with.
  • +
  • Fails if the public signing key cannot be retrieved from the DID document of the DID used to sign the credential.
  • +
+ +

If anything at all changes in the credential, even adding + a blank space, the credential is no longer valid because the content no longer matches the content that was used to create + the specific cryptographic signature for the specific credential. +

+

If the signature is invalid, we cannot trust anything + in the credential - not the name of the credential, the date, the issuer - absolutely nothing. If the signature is invalid + you might ask the holder if they had changed anything in it, and if so, to instead give you the credential as it was + when the issuer gave them their copy. +

+

If we can't retrieve the DID document for the DID that signed the + credential, or the public signing key that was used to sign the credential is not in the DID document, then signature verification fails + because we can't know that the public key was ever 'registered' to that DID. This isn't an issue when using the did:key DID method + which doesn't require a separate DID document, + but is required for did:web and did:webvh methods or any method that stores the DID document remotely. +

+

className={styles.title}How we determine the validity
+
    +
  • The credential must not have been tampered with
  • +
  • We must be able to retrieve the DID document for the DID used to sign the credential, and that DID document must include the public key used to sign the credential.
  • +
+

+ + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 17a24583..e29f33f3 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -8,4 +8,5 @@ export * from './CriteriaHelp/CriteriaHelp' export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' export * from './TitleHelp/TitleHelp' export * from './AchievementTypeHelp/AchievementTypeHelp' -export * from './CredentialFormatHelp/CredentialFormatHelp' \ No newline at end of file +export * from './CredentialFormatHelp/CredentialFormatHelp' +export * from './SignatureHelp/SignatureHelp' \ No newline at end of file diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index eefedbf6..798ae520 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -5,7 +5,7 @@ import type { ResultItem, ResultLogProps } from './ResultLog.d'; import styles from './ResultLog.module.css'; import { StatusPurpose, hasStatusPurpose } from '@/lib/credentialStatus'; import { TestId } from "@/lib/testIds" -import { CredentialFormatHelp } from '../Help'; +import { CredentialFormatHelp, SignatureHelp } from '../Help'; import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; export enum LogId { @@ -197,8 +197,8 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { positiveMessage={LogMessages.ValidSignature} negativeMessage={LogMessages.InvalidSignature} testId={TestId.SigningLogMsg} - HelpContent={CredentialFormatHelp} - helpTitle="Supported Credential Format" + HelpContent={SignatureHelp} + helpTitle="Valid Signature" /> Date: Wed, 5 Nov 2025 08:16:03 -0500 Subject: [PATCH 037/109] add known issuer help --- .../Help/RegistryHelp/RegistryHelp.js | 39 ++++++++++++------- app/components/ResultLog/ResultLog.tsx | 4 +- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/app/components/Help/RegistryHelp/RegistryHelp.js b/app/components/Help/RegistryHelp/RegistryHelp.js index 7af12fac..784a77d3 100644 --- a/app/components/Help/RegistryHelp/RegistryHelp.js +++ b/app/components/Help/RegistryHelp/RegistryHelp.js @@ -1,23 +1,34 @@ +import styles from '../Help.module.css'; export const RegistryHelp = () => { return <> -

To know who issued a Verifiable Credential we must - know who controls the cryptographic key pair (a public key and a private key) used to sign the credential, which typically means - we must be told from a trustworthy source that the public key does in fact belong - to the claimed issuer. We can be told directly by the issuer themselves, which can be as a simple as saying, "Hey there, my DID is did:key:z6MkjoriXdbyWD25YXTed114F8hdJrLXQ567xxPHAUKxpKkS" or they might post it on their known - web site (e.g. mit.edu) so we can check it as needed, or they might add it to a registry so that it can be looked up along with the +

    +
  • Verifies that we recognize the key that signed the credential.
  • +
  • VerifierPlus looks up the key in the DCC registries.
  • +
  • The DCC makes no claims about the authenticity or relevance of credentials signed by keys in its registries - only that we know about the keys in some way.
  • +
+ +

+ It is fundamentally necessary that we are told in some + trustworthy way that a public key does belong to the issuer. Otherwise + fake key pairs could be used to sign fake credentials. + An issuer can tell us directly which keys are theirs, which can be as a simple as + saying, "Hey there, my DID is did:key:z6MkjoriXdbyWD25YXTed114F8hdJrLXQ567xxPHAUKxpKkS" + or they might post it on their known + web site (e.g. mit.edu) so we can check it as needed, or they might add it to a registry + so that it can be looked up along with the keys of other issuers.

-

It is fundamentally necessary that we are told in some trustworthy way that a public key does belong to the issuer. Without that knowledge, - fake key pairs could be used to sign fake credentials and we just wouldn't know. -

-

In this app, when verifying a credential, we look up public keys in a registry controlled by the Digital Credentials Consortium. +

+ We look up public keys in a registry controlled by the Digital Credentials Consortium. We don't, however, make any guarantees about the trustworthiness or legitimacy of the credentials - only that they - were signed by a key that has been registered in one of our registries. We make no guarantees because this is - strictly for demonstration purposes. A 'real' verifier would use a registry whose entries have been vetted and approved. + were signed by a key that has been registered in one of our registries. We make no guarantees because our registries are + strictly for demonstration purposes.

-

A registry of keys controlled by the association of university registrars for a given coountry, for example, - could be used to verify digital degrees from accredited universities

-

A slight nuance is that Verifiable Credentials are typically signed with a Decentralized Identifier which +

A 'real' verifier would use a registry whose entries have been vetted and approved. + A registry of keys controlled by the association of university registrars for a given coountry, for example, + could be used to verify digital degrees from accredited universities.

+ +

A slight nuance is that Verifiable Credentials are typically signed with a Decentralized Identifier which is simply a more durable way to describe a signing key. So we look up DIDs in our registry.

} \ No newline at end of file diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index 798ae520..7bd9c547 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -5,7 +5,7 @@ import type { ResultItem, ResultLogProps } from './ResultLog.d'; import styles from './ResultLog.module.css'; import { StatusPurpose, hasStatusPurpose } from '@/lib/credentialStatus'; import { TestId } from "@/lib/testIds" -import { CredentialFormatHelp, SignatureHelp } from '../Help'; +import { CredentialFormatHelp, RegistryHelp, SignatureHelp } from '../Help'; import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; export enum LogId { @@ -207,6 +207,8 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { sourceLogId={LogId.IssuerDIDResolves} testId={TestId.IssuerLogMsg} issuer={true} + HelpContent={RegistryHelp} + helpTitle="Known Issuer" /> { From 67c7293f3ca4f9488b0a0403de4b6cef778a9588 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 10:12:34 -0500 Subject: [PATCH 038/109] add revocation help --- .../Help/RegistryHelp/RegistryHelp.js | 6 ++- .../Help/RevocationHelp/RevocationHelp.tsx | 43 +++++++++++++++++++ app/components/Help/index.js | 3 +- app/components/ResultLog/ResultLog.tsx | 3 ++ 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 app/components/Help/RevocationHelp/RevocationHelp.tsx diff --git a/app/components/Help/RegistryHelp/RegistryHelp.js b/app/components/Help/RegistryHelp/RegistryHelp.js index 784a77d3..00ad0d4c 100644 --- a/app/components/Help/RegistryHelp/RegistryHelp.js +++ b/app/components/Help/RegistryHelp/RegistryHelp.js @@ -24,9 +24,11 @@ export const RegistryHelp = () => { were signed by a key that has been registered in one of our registries. We make no guarantees because our registries are strictly for demonstration purposes.

-

A 'real' verifier would use a registry whose entries have been vetted and approved. +

+ A 'real' verifier would use a registry whose registered issuers had been vetted and approved to issue specific credentials. A registry of keys controlled by the association of university registrars for a given coountry, for example, - could be used to verify digital degrees from accredited universities.

+ could be used to verify digital degrees from accredited universities. In this case, it might then be more accurate + to say it was a registry of 'trusted' issuers, rather than simply 'known' issuers.

A slight nuance is that Verifiable Credentials are typically signed with a Decentralized Identifier which is simply a more durable way to describe a signing key. So we look up DIDs in our registry.

diff --git a/app/components/Help/RevocationHelp/RevocationHelp.tsx b/app/components/Help/RevocationHelp/RevocationHelp.tsx new file mode 100644 index 00000000..254c02e0 --- /dev/null +++ b/app/components/Help/RevocationHelp/RevocationHelp.tsx @@ -0,0 +1,43 @@ +import styles from '../Help.module.css'; +export const RevocationHelp = () => { + return <> +
    +
  • Indicates if the credential has been revoked.
  • +
  • Optional - not required by Verifiable Credential data model or the OBv3 data model.
  • +
  • Applies only to the VC, not to the underlying credential.
  • +
  • The DCC uses the BitstringStatusList implementation.
  • +
+ +

A very + important point here is that the credentialStatus field revokes the + Verifiable Credential, and NOT the underlying credential. So the VC issued for a degree might be + revoked, but that does not imply the degree itself was revoked. It might be that the degree was + in fact revoked, but the credentialStatus only applies to the VC. +

+ +

Other approaches + are possible - a simple list of credential ids for example - + but the BitstringStatusList has a good mix of pretty-good-privacy, simplicity, and size for most needs.

+A bitstring + is simply a list of zeros and ones like so: 010000100. For that list, the credential that has been assigned the + second position and third last positions in the list have been revoked. If credentials have + been assigned the other positions they have not been revoked.

+ When a verifier is checking a given credential they ask the issuer for the entire bistring ( + which ideally is very long, so thousands of bits providing status for thousands of VCs), but without telling the + issuer which specific credential they are checking. This is often called 'herd-privacy'. +

+ +

How we determine if a credential has been revoked

+
For a VC with a 'credentialStatus' entry like the following:
+
{`"credentialStatus": {
+        "id": "https://example.com/list/e5Wmbrj#7",
+        "type": "BitstringStatusListEntry",
+        "statusPurpose": "revocation",
+        "statusListCredential": "https://example.com/list/e5Wmbrj",
+        "statusListIndex": "7"
+    }`}
+ We retrieve the status list from the statusListCredential url and then check that the bit at the position indicated by 'statusListIndex' is + '0', that is that it hasn't been 'flipped' to a '1' to indicate revocation. +

+ +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index e29f33f3..2cdc7358 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -9,4 +9,5 @@ export * from './VerifyIndicatorHelp/VerifyIndicatorHelp' export * from './TitleHelp/TitleHelp' export * from './AchievementTypeHelp/AchievementTypeHelp' export * from './CredentialFormatHelp/CredentialFormatHelp' -export * from './SignatureHelp/SignatureHelp' \ No newline at end of file +export * from './SignatureHelp/SignatureHelp' +export * from './RevocationHelp/RevocationHelp' \ No newline at end of file diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index 7bd9c547..31de8840 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -7,6 +7,7 @@ import { StatusPurpose, hasStatusPurpose } from '@/lib/credentialStatus'; import { TestId } from "@/lib/testIds" import { CredentialFormatHelp, RegistryHelp, SignatureHelp } from '../Help'; import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; +import { RevocationHelp } from '../Help/RevocationHelp/RevocationHelp'; export enum LogId { ValidSignature = 'valid_signature', @@ -217,6 +218,8 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { positiveMessage={LogMessages.NotRevoked} negativeMessage={verificationResult.hasStatusError ? LogMessages.UncheckedRevocation : LogMessages.Revoked} testId={TestId.RevocationLogMsg} + HelpContent={RevocationHelp} + helpTitle="Revocation" /> } {/*
*/} From eb64f6dc88e6b7182de6a062071d3e9c9e0148d4 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 10:41:40 -0500 Subject: [PATCH 039/109] add scrolling for help content --- .../ContextualHelp/ContextualHelp.tsx | 20 +++++++++++++++++-- app/components/Help/Help.module.css | 1 + .../Help/RevocationHelp/RevocationHelp.tsx | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 7fe03578..7939de1b 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import type { ContextualHelpProps } from './ContextualHelp.d'; import HelpIcon from '@mui/icons-material/HelpOutlined'; import { Dialog } from '@base-ui-components/react/dialog'; +import { ScrollArea } from '@base-ui-components/react/scroll-area'; export const ContextualHelp = ({title, fontSize = '12px', children}: ContextualHelpProps) => { @@ -13,8 +14,23 @@ export const ContextualHelp = ({title, fontSize = '12px', children}: ContextualH {title} - {children} -
+ + + + +
+ {children} +
+
+ + + +
+ + + + +
Close diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index 6202b44f..e8661fad 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -41,6 +41,7 @@ .preference { padding-bottom: 5px; + padding-top: 5px; } .infoIcon { diff --git a/app/components/Help/RevocationHelp/RevocationHelp.tsx b/app/components/Help/RevocationHelp/RevocationHelp.tsx index 254c02e0..d92af866 100644 --- a/app/components/Help/RevocationHelp/RevocationHelp.tsx +++ b/app/components/Help/RevocationHelp/RevocationHelp.tsx @@ -2,7 +2,7 @@ import styles from '../Help.module.css'; export const RevocationHelp = () => { return <>
    -
  • Indicates if the credential has been revoked.
  • +
  • A revoked credential is considered entirely invalid.
  • Optional - not required by Verifiable Credential data model or the OBv3 data model.
  • Applies only to the VC, not to the underlying credential.
  • The DCC uses the BitstringStatusList implementation.
  • From 2ed68841caeae4cf31dc675950829be52b29f03d Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 11:36:55 -0500 Subject: [PATCH 040/109] fix viewport scrolling size --- .../ContextualHelp/ContextualHelp.tsx | 32 ++++++++----------- .../Help/RevocationHelp/RevocationHelp.tsx | 20 ++++++------ 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/app/components/ContextualHelp/ContextualHelp.tsx b/app/components/ContextualHelp/ContextualHelp.tsx index 7939de1b..fa739037 100644 --- a/app/components/ContextualHelp/ContextualHelp.tsx +++ b/app/components/ContextualHelp/ContextualHelp.tsx @@ -5,31 +5,27 @@ import { Dialog } from '@base-ui-components/react/dialog'; import { ScrollArea } from '@base-ui-components/react/scroll-area'; -export const ContextualHelp = ({title, fontSize = '12px', children}: ContextualHelpProps) => { +export const ContextualHelp = ({ title, fontSize = '12px', children }: ContextualHelpProps) => { return ( - }> + }> {title} + + +
    + {children} +
    +
    + + + +
    - - -
    - {children} -
    -
    - - - -
    - - - -
    Close @@ -41,8 +37,8 @@ export const ContextualHelp = ({title, fontSize = '12px', children}: ContextualH ); } - - + + diff --git a/app/components/Help/RevocationHelp/RevocationHelp.tsx b/app/components/Help/RevocationHelp/RevocationHelp.tsx index d92af866..677632c2 100644 --- a/app/components/Help/RevocationHelp/RevocationHelp.tsx +++ b/app/components/Help/RevocationHelp/RevocationHelp.tsx @@ -27,17 +27,19 @@ A bitstring issuer which specific credential they are checking. This is often called 'herd-privacy'.

    -

    How we determine if a credential has been revoked

    +
    How we determine if a credential has been revoked
    For a VC with a 'credentialStatus' entry like the following:
    -
    {`"credentialStatus": {
    -        "id": "https://example.com/list/e5Wmbrj#7",
    -        "type": "BitstringStatusListEntry",
    -        "statusPurpose": "revocation",
    -        "statusListCredential": "https://example.com/list/e5Wmbrj",
    -        "statusListIndex": "7"
    -    }`}
    +
    +          {`"credentialStatus": {
    +    "id": "https://example.com/list/e5Wmbrj#7",
    +    "type": "BitstringStatusListEntry",
    +    "statusPurpose": "revocation",
    +    "statusListCredential": "https://example.com/list/e5Wmbrj",
    +    "statusListIndex": "7"
    +  }`}
    +    
    We retrieve the status list from the statusListCredential url and then check that the bit at the position indicated by 'statusListIndex' is '0', that is that it hasn't been 'flipped' to a '1' to indicate revocation. -

    +
    } \ No newline at end of file From 34512b4f1dd3d7bbf189dcd4b97f0f59abfb1dc5 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 11:42:27 -0500 Subject: [PATCH 041/109] add expiration help to log --- app/components/Help/RevocationHelp/RevocationHelp.tsx | 8 ++++---- app/components/ResultLog/ResultLog.tsx | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/components/Help/RevocationHelp/RevocationHelp.tsx b/app/components/Help/RevocationHelp/RevocationHelp.tsx index 677632c2..ca4283be 100644 --- a/app/components/Help/RevocationHelp/RevocationHelp.tsx +++ b/app/components/Help/RevocationHelp/RevocationHelp.tsx @@ -3,8 +3,8 @@ export const RevocationHelp = () => { return <>
    • A revoked credential is considered entirely invalid.
    • -
    • Optional - not required by Verifiable Credential data model or the OBv3 data model.
    • -
    • Applies only to the VC, not to the underlying credential.
    • +
    • Revocation is optional - not required by Verifiable Credential data model nor the OBv3 data model.
    • +
    • Revocation applies only to the VC, not to the underlying credential.
    • The DCC uses the BitstringStatusList implementation.
    @@ -38,8 +38,8 @@ A bitstring "statusListIndex": "7" }`} - We retrieve the status list from the statusListCredential url and then check that the bit at the position indicated by 'statusListIndex' is - '0', that is that it hasn't been 'flipped' to a '1' to indicate revocation. + We retrieve the status list from the 'statusListCredential' url and then check the bit at the position indicated by 'statusListIndex'. + If it is '1' the credential has been revoked. If it is '0' it hasn't.
    } \ No newline at end of file diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index 31de8840..169cc226 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -5,7 +5,7 @@ import type { ResultItem, ResultLogProps } from './ResultLog.d'; import styles from './ResultLog.module.css'; import { StatusPurpose, hasStatusPurpose } from '@/lib/credentialStatus'; import { TestId } from "@/lib/testIds" -import { CredentialFormatHelp, RegistryHelp, SignatureHelp } from '../Help'; +import { CredentialFormatHelp, ExpirationDateHelp, RegistryHelp, SignatureHelp } from '../Help'; import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; import { RevocationHelp } from '../Help/RevocationHelp/RevocationHelp'; @@ -232,6 +232,8 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { warningMessage={LogMessages.HasExpired} sourceLogId={LogId.Expiration} testId={TestId.ExpirationLogMsg} + HelpContent={ExpirationDateHelp} + helpTitle="Expiration Date" /> {hasCredentialStatus && hasSuspensionStatus && From 5f81f5236558546823e9a7ee23a6f12aa41847e8 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 11:44:43 -0500 Subject: [PATCH 042/109] fix note icon alignment in description help --- app/components/Help/DescriptionHelp/DescriptionHelp.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Help/DescriptionHelp/DescriptionHelp.tsx b/app/components/Help/DescriptionHelp/DescriptionHelp.tsx index fe9f6c6a..c0e8fa07 100644 --- a/app/components/Help/DescriptionHelp/DescriptionHelp.tsx +++ b/app/components/Help/DescriptionHelp/DescriptionHelp.tsx @@ -7,7 +7,7 @@ export const DescriptionHelp = () => {
  • If no description is provided, nothing is shown, including the 'Description' title.
-

Note that formatting is not accommodated in the +

Note that formatting is not accommodated in the description field. To provide a more stylized presentation, consider using the 'Criteria' field, which does allow Markdown syntax.

From d089ce4ec0cc2626f473ce2db16112a5f338b83d Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 11:50:40 -0500 Subject: [PATCH 043/109] update expiration date help content --- .../Help/ExpirationDateHelp/ExpirationDateHelp.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx index 2fd403c8..e89bcd71 100644 --- a/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx +++ b/app/components/Help/ExpirationDateHelp/ExpirationDateHelp.tsx @@ -3,13 +3,21 @@ export const ExpirationDateHelp = () => { return <>
  • The expiry date is set directly in the Verifiable Credential and cannot be changed without invalidating the cryptographic signature.
  • +
  • The expiry date is not required. A credential can be issued that never expires.
  • Version 1 Verifiable Credentials set the date like so: "expirationDate": "2025-01-09T16:23:24Z"
  • Version 2 Verifiable Credentials set the date like so: "validUntil": "2025-01-09T16:23:24Z"
  • A credential is considered 'expired' after the given date.
-

Note that sometimes a credential is still useful even though it has expired. An expired driver's licence, for +

Note that sometimes a credential is still useful even though it has expired. An expired driver's licence, for example, can still be used to prove our age. Or to prove that we were authorized to drive during a given period, which might be useful when applying for car insurance.

- +

How we determine the expiration date
+
According to the version of Verifiable Credentials data model:
+
    +
  • credential.expirationDate (v1)
  • +
  • credential.validUntil (v2)
  • +
+

+ } \ No newline at end of file From fb13254132395320037d8b350039ab8c9e9040bc Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 15:22:40 -0500 Subject: [PATCH 044/109] fix achievement styling --- .../AchievementTypeHelp/AchievementTypeHelp.tsx | 14 ++++++++------ app/components/Help/Help.module.css | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx b/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx index 96a1127f..0649164a 100644 --- a/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx +++ b/app/components/Help/AchievementTypeHelp/AchievementTypeHelp.tsx @@ -2,23 +2,25 @@ import styles from '../Help.module.css'; export const AchievementTypeHelp = () => { return <>
    -
  • The type of Open Badge achievement attested to by the credential, for example 'Award', 'Certification', 'DoctoralDegree'.
  • +
  • The type of Open Badge achievement attested to by the credential
    + e.g., 'Award', 'Certification', 'DoctoralDegree'.
  • A full list of pre-defined Open Badge achievement types is defined in the Open Badges Specification.
  • New OBv3 achievement types can be added by extending the OBv3 context.
  • If no achievementType is available, nothing is shown including the label.
-

Note that the goal of the achievementType field is interoperability. +

+ The goal of the achievementType field is interoperability. If different credential issuers use the same achievementType for similar credentials then hopefully consumers of the credential can treat the credentials as equivalent to some degree. It might of course be less useful to treat two credentials with an achievementType of 'award' as equivalent, but hopefully moreso for two credential of type 'DoctoralDegree'. Over time we expect that issuers will converge on common definitions. -

-

How we determine the value of this field

-
In order of preference:
+
+
+
How we determine the achievement type
  • credential.credentialSubject.achievement.achievementType (OBv3)
-

+
diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index e8661fad..e32496ed 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -26,7 +26,7 @@ text-align: center; font-size: 16px; font-weight:600; - padding-bottom: 5px; + margin-bottom: 15px; } .subtitle { From 9364ceee0159c621dda5e68dc24d49bdf6c20713 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 15:26:22 -0500 Subject: [PATCH 045/109] fix format help styling --- .../Help/CredentialFormatHelp/CredentialFormatHelp.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx b/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx index 4ebf094b..7b91c0fa 100644 --- a/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx +++ b/app/components/Help/CredentialFormatHelp/CredentialFormatHelp.tsx @@ -6,16 +6,16 @@ export const CredentialFormatHelp = () => {
  • These aren't checks on the validity of the signature or data, but rather simply that the data is in the format we expect.
  • -

    We try to check for as many things as possible, but - of course there may be edge cases we haven't yet surfaced. -

    -

    How we determine the validity

    +
    We try to check for as many things as possible, but + of course there may be edge cases that haven't yet surfaced. +
    +
    How we determine the credential is properly formatted
    The credential must:
    • be valid JSON
    • have a JSON-LD context
    -

    +
    From 5281c51c5dccda64ab15beccefeab4b9898de96c Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 15:29:35 -0500 Subject: [PATCH 046/109] update signature help styling --- .../Help/SignatureHelp/SignatureHelp.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/components/Help/SignatureHelp/SignatureHelp.tsx b/app/components/Help/SignatureHelp/SignatureHelp.tsx index c6c0abb6..d88e1e4e 100644 --- a/app/components/Help/SignatureHelp/SignatureHelp.tsx +++ b/app/components/Help/SignatureHelp/SignatureHelp.tsx @@ -6,27 +6,27 @@ export const SignatureHelp = () => {
  • Fails if the public signing key cannot be retrieved from the DID document of the DID used to sign the credential.
  • -

    If anything at all changes in the credential, even adding +

    If anything at all changes in the credential, even adding a blank space, the credential is no longer valid because the content no longer matches the content that was used to create the specific cryptographic signature for the specific credential. -

    -

    If the signature is invalid, we cannot trust anything +

    +
    If the signature is invalid, we cannot trust anything in the credential - not the name of the credential, the date, the issuer - absolutely nothing. If the signature is invalid you might ask the holder if they had changed anything in it, and if so, to instead give you the credential as it was when the issuer gave them their copy. -

    -

    If we can't retrieve the DID document for the DID that signed the +

    +
    If we can't retrieve the DID document for the DID that signed the credential, or the public signing key that was used to sign the credential is not in the DID document, then signature verification fails because we can't know that the public key was ever 'registered' to that DID. This isn't an issue when using the did:key DID method which doesn't require a separate DID document, but is required for did:web and did:webvh methods or any method that stores the DID document remotely. -

    -

    className={styles.title}How we determine the validity
    +
    +
    How we determine the validity of the signature.
      -
    • The credential must not have been tampered with
    • +
    • The credential must not have been tampered with.
    • We must be able to retrieve the DID document for the DID used to sign the credential, and that DID document must include the public key used to sign the credential.
    -

    +
    From fd79ee1c7f6036ac015d62af27b32cd138ca64d5 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 16:09:41 -0500 Subject: [PATCH 047/109] update verification help styling --- .../VerifyIndicatorHelp/VerifyIndicatorHelp.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx index 482cf4c9..fa7db2d5 100644 --- a/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx +++ b/app/components/Help/VerifyIndicatorHelp/VerifyIndicatorHelp.tsx @@ -5,22 +5,22 @@ export const VerifyIndicatorHelp = () => {
  • An indication of the status of the credential.
  • Four possible statuses: Verified, Not Verified, Warning or Verifying...
  • -

    Note that we only flag a credential as Not Verified is if the credential has been tampered with - in some way or we can't otherwise verify the signature, or the credential has been revoked. If the credential +

    + We only flag a credential as Not Verified is if the credential has been tampered with + in some way or we can't otherwise verify the signature, or if the credential has been revoked. If the credential has expired or is from an issuer we don't recognize then we take a moderate approach and simply show a Warning. We do this because our verification page is primarily for education and demonstration. A verification page for a university that verifies degrees would likely more strictly enforce - expiry, and would most certainly not accept credentials from an unknown issuer. -

    -

    How we determine the value of this field

    - + expiry, and would most certainly reject credentials from an unknown issuer. +
    +
    How we determine the result of this verification
    • Verifying if verification is still in progress.
    • Verified if nothing has been tampered with, the credential hasn't expired, hasn't been revoked, and is from a known issuer.
    • -
    • Not Verified if the credential has been tampered with, the signature can't been checked, or has been revoked.
    • +
    • Not Verified if the credential has been tampered with, the signature can't been checked, or the credential has been revoked.
    • Warning if the credential hasn't been tampered with, but has expired, or isn't from a known issuer.
    -

    +
    From 4e2d5f51673838f1f62bd3b2c6a14632dfc44637 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Wed, 5 Nov 2025 16:16:17 -0500 Subject: [PATCH 048/109] update styling for issuer help --- app/components/Help/IssuerHelp/IssuerHelp.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/components/Help/IssuerHelp/IssuerHelp.js b/app/components/Help/IssuerHelp/IssuerHelp.js index b8994b58..620b98c6 100644 --- a/app/components/Help/IssuerHelp/IssuerHelp.js +++ b/app/components/Help/IssuerHelp/IssuerHelp.js @@ -5,17 +5,18 @@ export const IssuerHelp = () => {
    • Typically whoever signed the Verifiable Credential, for example, a university that issues students Verifiable Credentials confirming their degree.
    • The issuer is described in the issuer property of the Verifiable Credential.
    • -
    • The issuer may also be described in an 'issuer registry'.
    • +
    • The issuer may also be described in an 'issuer registry' completely separate from the credential.
    • The LCW and VerifierPlus use issuer details from our registry in preference to the details in the VC.
    • An issuer's DID MUST be listed in a trusted registry in order for VCs issued with that DID to be trusted.
    -

    Fundmentally important is that to trust anything signed by an issuer, +

    + Fundmentally important is that to trust anything signed by an issuer, the DID (Decentralized Identififer) used to sign the credential must be known to us in some way. That might be because we keep a list of DIDs in our verifier that we know about (an internal registry), or it might that we look up the DID in some kind of shared registry that we in turn trust. Both are effectively lists of DIDs that we trust. If a credential has not been signed by a DID that we know about then we cannot trust the credential - it could have been faked and signed by anyone. -

    +
    } \ No newline at end of file From 9ad189e1a1c5636b77e3eac56ec5854086f351ae Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 6 Nov 2025 07:15:38 -0500 Subject: [PATCH 049/109] separate issuer help into details and known issuer --- .../IssuerDetailsHelp.js} | 19 ++++++++-- .../Help/KnownIssuerHelp/KnownIssuerHelp.js | 36 +++++++++++++++++++ app/components/Help/index.js | 3 +- app/components/Issuer/Issuer.tsx | 4 +-- app/components/ResultLog/ResultLog.tsx | 4 +-- 5 files changed, 59 insertions(+), 7 deletions(-) rename app/components/Help/{IssuerHelp/IssuerHelp.js => IssuerDetailsHelp/IssuerDetailsHelp.js} (57%) create mode 100644 app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js diff --git a/app/components/Help/IssuerHelp/IssuerHelp.js b/app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js similarity index 57% rename from app/components/Help/IssuerHelp/IssuerHelp.js rename to app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js index 620b98c6..9d8d9123 100644 --- a/app/components/Help/IssuerHelp/IssuerHelp.js +++ b/app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js @@ -1,9 +1,9 @@ import styles from '../Help.module.css'; -export const IssuerHelp = () => { +export const IssuerDetailsHelp = () => { return <>
      -
    • Typically whoever signed the Verifiable Credential, for example, a university that issues students Verifiable Credentials confirming their degree.
    • +
    • Typically whoever signed the Verifiable Credential, for example, a university that issues students Verifiable Credentials confirming their degrees.
    • The issuer is described in the issuer property of the Verifiable Credential.
    • The issuer may also be described in an 'issuer registry' completely separate from the credential.
    • The LCW and VerifierPlus use issuer details from our registry in preference to the details in the VC.
    • @@ -18,5 +18,20 @@ export const IssuerHelp = () => { of DIDs that we trust. If a credential has not been signed by a DID that we know about then we cannot trust the credential - it could have been faked and signed by anyone.
    + +
    + If we can't find an issuer in one of our registries we only provide a warning, rather than declare the + credential completely invalid, because VerifierPlus is educational and we expect that people + will use our verification for demonstration and testing. +
    + +
    How we determine the issuer details.
    +
    In order of preference:
    +
      +
    • If the issuer is listed in a registry, we pull the issuer name, logo, and url from the registry.
    • +
    • If the issuer is listed in more than one registry we use the first registry in our ordered list of registries.
    • +
    • If the issuer is not in a registry we
    • +
    +
    } \ No newline at end of file diff --git a/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js b/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js new file mode 100644 index 00000000..95be4990 --- /dev/null +++ b/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js @@ -0,0 +1,36 @@ +import styles from '../Help.module.css'; +export const KnownIssuerHelp = () => { + return <> +
      +
    • Verifies that we recognize the key that signed the credential.
    • +
    • VerifierPlus looks up the key in the DCC registries.
    • +
    • The DCC makes no claims about the authenticity or relevance of credentials signed by keys in its registries - only that we know about the keys in some way.
    • +
    + +

    + It is fundamentally necessary that we are told in some + trustworthy way that a public key does belong to the issuer. Otherwise + fake key pairs could be used to sign fake credentials. + An issuer can tell us directly which keys are theirs, which can be as a simple as + saying, "Hey there, my DID is did:key:z6MkjoriXdbyWD25YXTed114F8hdJrLXQ567xxPHAUKxpKkS" + or they might post it on their known + web site (e.g. mit.edu) so we can check it as needed, or they might add it to a registry + so that it can be looked up along with the + keys of other issuers. +

    +

    + We look up public keys in a registry controlled by the Digital Credentials Consortium. + We don't, however, make any guarantees about the trustworthiness or legitimacy of the credentials - only that they + were signed by a key that has been registered in one of our registries. We make no guarantees because our registries are + strictly for demonstration purposes. +

    +

    + A 'real' verifier would use a registry whose registered issuers had been vetted and approved to issue specific credentials. + A registry of keys controlled by the association of university registrars for a given coountry, for example, + could be used to verify digital degrees from accredited universities. In this case, it might then be more accurate + to say it was a registry of 'trusted' issuers, rather than simply 'known' issuers.

    + +

    A slight nuance is that Verifiable Credentials are typically signed with a Decentralized Identifier which + is simply a more durable way to describe a signing key. So we look up DIDs in our registry.

    + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 2cdc7358..fe119658 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -1,4 +1,5 @@ -export * from './IssuerHelp/IssuerHelp'; +export * from './IssuerDetailsHelp/IssuerDetailsHelp'; +export * from './KnownIssuerHelp/KnownIssuerHelp'; export * from './ExpirationDateHelp/ExpirationDateHelp'; export * from './IssuanceDateHelp/IssuanceDateHelp'; export * from './RegistryHelp/RegistryHelp'; diff --git a/app/components/Issuer/Issuer.tsx b/app/components/Issuer/Issuer.tsx index 4d4356a6..aa79d751 100644 --- a/app/components/Issuer/Issuer.tsx +++ b/app/components/Issuer/Issuer.tsx @@ -3,7 +3,7 @@ import type { IssuerProps } from './Issuer.d'; import styles from './Issuer.module.css'; import { TestId } from '@/lib/testIds'; import { ContextualHelp } from '@/components/ContextualHelp/ContextualHelp' -import { IssuerHelp } from '@/components/Help'; +import { IssuerDetailsHelp } from '@/components/Help'; export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => { const issuerImage = useRef(null); @@ -18,7 +18,7 @@ export const Issuer = ({ issuer, header, infoButtonPushed }: IssuerProps) => {
    {(issuer?.image || issuer?.name || issuer?.url) && (
    -

    {header}

    +

    {header}

    {issuer.image && ( {`${issuer.name} diff --git a/app/components/ResultLog/ResultLog.tsx b/app/components/ResultLog/ResultLog.tsx index 169cc226..c6d65d81 100644 --- a/app/components/ResultLog/ResultLog.tsx +++ b/app/components/ResultLog/ResultLog.tsx @@ -5,7 +5,7 @@ import type { ResultItem, ResultLogProps } from './ResultLog.d'; import styles from './ResultLog.module.css'; import { StatusPurpose, hasStatusPurpose } from '@/lib/credentialStatus'; import { TestId } from "@/lib/testIds" -import { CredentialFormatHelp, ExpirationDateHelp, RegistryHelp, SignatureHelp } from '../Help'; +import { CredentialFormatHelp, ExpirationDateHelp, KnownIssuerHelp, RegistryHelp, SignatureHelp } from '../Help'; import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; import { RevocationHelp } from '../Help/RevocationHelp/RevocationHelp'; @@ -208,7 +208,7 @@ export const ResultLog = ({ verificationResult }: ResultLogProps) => { sourceLogId={LogId.IssuerDIDResolves} testId={TestId.IssuerLogMsg} issuer={true} - HelpContent={RegistryHelp} + HelpContent={KnownIssuerHelp} helpTitle="Known Issuer" /> From ef86185d4a91fed66d27ff57bd8db7ee93485f48 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 6 Nov 2025 11:50:56 -0500 Subject: [PATCH 050/109] rework issuer help --- .../IssuerDetailsHelp/IssuerDetailsHelp.js | 24 ++++------- .../Help/KnownIssuerHelp/KnownIssuerHelp.js | 43 +++++++++++-------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js b/app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js index 9d8d9123..b08f625e 100644 --- a/app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js +++ b/app/components/Help/IssuerDetailsHelp/IssuerDetailsHelp.js @@ -10,27 +10,21 @@ export const IssuerDetailsHelp = () => {
  • An issuer's DID MUST be listed in a trusted registry in order for VCs issued with that DID to be trusted.
  • - Fundmentally important is that to trust anything signed by an issuer, - the DID (Decentralized Identififer) used to - sign the credential must be known to us in some way. That might be because - we keep a list of DIDs in our verifier that we know about (an internal registry), or it might that we look up - the DID in some kind of shared registry that we in turn trust. Both are effectively lists - of DIDs that we trust. If a credential has not been signed by a DID that we know about - then we cannot trust the credential - it could have been faked and signed by anyone. + We always show issuer details from the registry (when available) rather than from the credential itself as a safeguard against the possibility that someone used the signing key to issue + credentials in which they've claimed to be a different issuer.
    -
    - If we can't find an issuer in one of our registries we only provide a warning, rather than declare the - credential completely invalid, because VerifierPlus is educational and we expect that people - will use our verification for demonstration and testing. -
    - -
    How we determine the issuer details.
    +
    How we determine the issuer details.
    In order of preference:
    • If the issuer is listed in a registry, we pull the issuer name, logo, and url from the registry.
    • If the issuer is listed in more than one registry we use the first registry in our ordered list of registries.
    • -
    • If the issuer is not in a registry we
    • +
    • If the issuer is not in a registry we use:
    • +
        +
      • Logo: issuer.image.id otherwise issuer.image
      • +
      • Name: issuer.name
      • +
      • URL: issuer.url
      • +
    diff --git a/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js b/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js index 95be4990..dc1fcdb3 100644 --- a/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js +++ b/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js @@ -2,35 +2,40 @@ import styles from '../Help.module.css'; export const KnownIssuerHelp = () => { return <>
      -
    • Verifies that we recognize the key that signed the credential.
    • -
    • VerifierPlus looks up the key in the DCC registries.
    • -
    • The DCC makes no claims about the authenticity or relevance of credentials signed by keys in its registries - only that we know about the keys in some way.
    • +
    • Verifies that we recognize the Decentralized Identifier (DID) that signed the credential.
    • +
    • VerifierPlus looks up the DID in the DCC registries.
    • +
    • The DCC makes no claims about the authenticity or relevance of credentials signed by DIDs in its registries - only that we know about the DIDs in some way.
    +
    + Fundmentally important is that to trust anything signed by an issuer, + the DID (Decentralized Identififer) used to + sign the credential must be known to us in some way. That might be because + we keep a list of DIDs in our verifier that we know about (an internal registry), or it might that we look up + the DID in some kind of shared registry that we in turn trust. Both are effectively lists + of DIDs that we trust. If a credential has not been signed by a DID that we know about + then we cannot trust the credential - it could have been faked and signed by anyone. +
    +

    - It is fundamentally necessary that we are told in some - trustworthy way that a public key does belong to the issuer. Otherwise - fake key pairs could be used to sign fake credentials. - An issuer can tell us directly which keys are theirs, which can be as a simple as - saying, "Hey there, my DID is did:key:z6MkjoriXdbyWD25YXTed114F8hdJrLXQ567xxPHAUKxpKkS" - or they might post it on their known - web site (e.g. mit.edu) so we can check it as needed, or they might add it to a registry - so that it can be looked up along with the - keys of other issuers. -

    -

    - We look up public keys in a registry controlled by the Digital Credentials Consortium. + We look up DIDs in a registry controlled by the Digital Credentials Consortium. We don't, however, make any guarantees about the trustworthiness or legitimacy of the credentials - only that they - were signed by a key that has been registered in one of our registries. We make no guarantees because our registries are + were signed by a key that has been registered as a DID in one of our registries. We make no guarantees because our registries are strictly for demonstration purposes.

    + +
    + If we can't find an issuer's DID in one of our registries we only provide a warning, rather than declare the + credential completely invalid, because VerifierPlus is educational and we expect that people + will use our verification for demonstration and testing. +
    + +

    A 'real' verifier would use a registry whose registered issuers had been vetted and approved to issue specific credentials. - A registry of keys controlled by the association of university registrars for a given coountry, for example, + A registry of DIDs controlled by the association of university registrars for a given coountry, for example, could be used to verify digital degrees from accredited universities. In this case, it might then be more accurate to say it was a registry of 'trusted' issuers, rather than simply 'known' issuers.

    -

    A slight nuance is that Verifiable Credentials are typically signed with a Decentralized Identifier which - is simply a more durable way to describe a signing key. So we look up DIDs in our registry.

    } \ No newline at end of file From a158c5aee1d1778930d9f70447837e6580dda63c Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 6 Nov 2025 11:58:31 -0500 Subject: [PATCH 051/109] resize and align info icons --- app/components/Help/Help.module.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index e32496ed..c450761b 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -47,4 +47,7 @@ .infoIcon { display: inline-block; padding-right: 6px; + width: 22px; + height: 22px; + vertical-align: top; } \ No newline at end of file From d991c7726b73f2361306e4c927b02d0dd69eda7e Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 6 Nov 2025 13:51:23 -0500 Subject: [PATCH 052/109] fix spacing on note sections --- app/components/Help/Help.module.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index c450761b..cce316b4 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -3,7 +3,9 @@ font-size: 16px; background-color: gray; padding: 10px; - margin: 20px; + margin-top: 10px; + margin-left: 20px; + margin-right: 20px; display: inline-block; } From d347365e9b14a06751a1480353792ac982a7bce3 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Thu, 6 Nov 2025 13:51:42 -0500 Subject: [PATCH 053/109] rework known issuer help text --- .../Help/KnownIssuerHelp/KnownIssuerHelp.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js b/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js index dc1fcdb3..7e0fdfe7 100644 --- a/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js +++ b/app/components/Help/KnownIssuerHelp/KnownIssuerHelp.js @@ -17,25 +17,21 @@ export const KnownIssuerHelp = () => { then we cannot trust the credential - it could have been faked and signed by anyone.
    -

    +

    We look up DIDs in a registry controlled by the Digital Credentials Consortium. We don't, however, make any guarantees about the trustworthiness or legitimacy of the credentials - only that they were signed by a key that has been registered as a DID in one of our registries. We make no guarantees because our registries are strictly for demonstration purposes. -

    +
    If we can't find an issuer's DID in one of our registries we only provide a warning, rather than declare the credential completely invalid, because VerifierPlus is educational and we expect that people - will use our verification for demonstration and testing. -
    - - -

    + will use our verification for demonstration and testing.

    A 'real' verifier would use a registry whose registered issuers had been vetted and approved to issue specific credentials. A registry of DIDs controlled by the association of university registrars for a given coountry, for example, could be used to verify digital degrees from accredited universities. In this case, it might then be more accurate - to say it was a registry of 'trusted' issuers, rather than simply 'known' issuers.

    + to say it was a registry of 'trusted' issuers, rather than simply 'known' issuers.
    } \ No newline at end of file From e9a05e66650ccf4ff028b84570f994102e7c9b11 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 7 Nov 2025 08:47:13 -0500 Subject: [PATCH 054/109] rework warning and error messages --- .../VerificationCard.module.css | 17 +++++++++ .../VerificationCard/VerificationCard.tsx | 35 +++++++------------ 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/app/components/VerificationCard/VerificationCard.module.css b/app/components/VerificationCard/VerificationCard.module.css index 6777254d..349daa9e 100644 --- a/app/components/VerificationCard/VerificationCard.module.css +++ b/app/components/VerificationCard/VerificationCard.module.css @@ -49,4 +49,21 @@ display: flex; height: 100%; align-items: center; +} + +.message { + height: 60px; /* Sets the height of the box */ + border: 2px solid black; /* Adds a border around the box */ + padding: 15px; /* Adds space between the content and the border */ + text-align: center; + font-weight: 700; + margin-bottom: 20px; /* Adds space outside the border, between this box and other elements */ +} + +.error { + background-color: darkorange; /* Sets the background color of the box */ +} + +.warning { + background-color: lightgreen; /* Sets the background color of the box */ } \ No newline at end of file diff --git a/app/components/VerificationCard/VerificationCard.tsx b/app/components/VerificationCard/VerificationCard.tsx index 330edc2e..9ae6de4e 100644 --- a/app/components/VerificationCard/VerificationCard.tsx +++ b/app/components/VerificationCard/VerificationCard.tsx @@ -9,12 +9,11 @@ import { TestId } from '@/lib/testIds'; export const UNSUCCESSFUL_VERIFICATION_MSG = 'This credential was not verified successfully.'; export const VERIFICATION_WARNING_MSG = 'There is a warning about this credential.' -export const SUCCESSFUL_VERIFICATION_MSG = 'This credential was verified successfully' export const VerificationCard = () => { const { loading, verificationResult, verifyCredential } = useVerificationContext(); - const resultMessage = () => { + const ErrorMessage = () => { const result = (verificationResult as VerifyResponse)?.results?.[0]; const log = result?.log ?? []; // Build a lookup of log validity @@ -39,24 +38,19 @@ export const VerificationCard = () => { ); if (hasFailure) { - return { - type: 'error', - text: UNSUCCESSFUL_VERIFICATION_MSG, - }; + return
    + {UNSUCCESSFUL_VERIFICATION_MSG} +
    + } else if (hasWarning) { - return { - type: 'warning', - text: VERIFICATION_WARNING_MSG, - }; - } else { - return { - type: 'success', - text: SUCCESSFUL_VERIFICATION_MSG, - }; - } + return
    + {VERIFICATION_WARNING_MSG} +
    + } + + return null }; - const { type, text } = resultMessage(); return (
    @@ -81,10 +75,7 @@ export const VerificationCard = () => {
    ) : ( <> -
    - {text} -
    - +
    {(() => { const result = (verificationResult as VerifyResponse)?.results?.[0]; @@ -109,7 +100,7 @@ export const VerificationCard = () => { return ( <>

    - Issuer Details + Issuer Registration

    {matchingIssuers.map((match: any, index: number) => { const registryName = From 1f42a80b07ecf12269c07aaea54320e4932e01bd Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 7 Nov 2025 09:21:13 -0500 Subject: [PATCH 055/109] add registry list help --- .../Help/RegistryListHelp/RegistryListHelp.js | 38 +++++++++++++++++++ app/components/Help/index.js | 3 +- app/components/RegistryCard/RegistryCard.tsx | 1 - .../VerificationCard/VerificationCard.tsx | 4 +- 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 app/components/Help/RegistryListHelp/RegistryListHelp.js diff --git a/app/components/Help/RegistryListHelp/RegistryListHelp.js b/app/components/Help/RegistryListHelp/RegistryListHelp.js new file mode 100644 index 00000000..e0b2c22e --- /dev/null +++ b/app/components/Help/RegistryListHelp/RegistryListHelp.js @@ -0,0 +1,38 @@ +import styles from '../Help.module.css'; +export const RegistryListHelp = () => { + return <> +
      +
    • A list of all the registries in which the DID used to sign the credential is registered.
    • +
    • For each registry we provide the issuer name and url registered for that DID.
    • +
    • The DCC makes no claims about the legality of credentials signed by issuers who are registered in its registries - only that we know about the issuer.
    • +
    • We look up the issuer's DID dynamically so it can happen that one or more of the registries might be unreachable.
    • +
    • If we can't find the DID (that signed the credential) in any registry then we show a warning
    • +
    • In a production environment, if a DID can't be found in a registry it would be untrustworthy, unless we happen to know the DID is trustworthy for some other reason.
    • + +
    + +
    + It is fundamentally necessary that we are told in some + trustworthy way that a public key does belong to the issuer. Otherwise + fake key pairs could be used to sign fake credentials. + An issuer can tell us directly which keys are theirs, which can be as a simple as + saying, "Hey there, my DID is did:key:z6MkjoriXdbyWD25YXTed114F8hdJrLXQ567xxPHAUKxpKkS" + or they might post it on their known + web site (e.g. mit.edu) so we can check it as needed, or they can add it to a registry + so that it can be looked up along with the + keys of other issuers. +
    +
    + We look up public keys in a registry controlled by the Digital Credentials Consortium. + We don't, however, make any guarantees about the trustworthiness or legitimacy of the credentials - only that they + were signed by a key that has been registered in one of our registries. We make no guarantees because our registries are + strictly for demonstration purposes. +
    +
    + A 'real' verifier would use a registry whose registered issuers had been vetted and approved to issue specific credentials. + A registry of keys controlled by the association of university registrars for a given coountry, for example, + could be used to verify digital degrees from accredited universities. In this case, it might then be more accurate + to say it was a registry of 'trusted' issuers, rather than simply 'known' issuers.
    + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index fe119658..533073b2 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -11,4 +11,5 @@ export * from './TitleHelp/TitleHelp' export * from './AchievementTypeHelp/AchievementTypeHelp' export * from './CredentialFormatHelp/CredentialFormatHelp' export * from './SignatureHelp/SignatureHelp' -export * from './RevocationHelp/RevocationHelp' \ No newline at end of file +export * from './RevocationHelp/RevocationHelp' +export * from './RegistryListHelp/RegistryListHelp' \ No newline at end of file diff --git a/app/components/RegistryCard/RegistryCard.tsx b/app/components/RegistryCard/RegistryCard.tsx index ba3cc355..4d0878d3 100644 --- a/app/components/RegistryCard/RegistryCard.tsx +++ b/app/components/RegistryCard/RegistryCard.tsx @@ -1,4 +1,3 @@ - import React from 'react'; import styles from './RegistryCard.module.css'; import { TestId } from '@/lib/testIds'; diff --git a/app/components/VerificationCard/VerificationCard.tsx b/app/components/VerificationCard/VerificationCard.tsx index 9ae6de4e..bced5bc0 100644 --- a/app/components/VerificationCard/VerificationCard.tsx +++ b/app/components/VerificationCard/VerificationCard.tsx @@ -6,6 +6,8 @@ import { VerifyResponse } from '@/types/credential'; import styles from './VerificationCard.module.css'; import { RegistryCard } from '@/components/RegistryCard/RegistryCard'; import { TestId } from '@/lib/testIds'; +import { ContextualHelp } from '../ContextualHelp/ContextualHelp'; +import { RegistryListHelp } from '../Help'; export const UNSUCCESSFUL_VERIFICATION_MSG = 'This credential was not verified successfully.'; export const VERIFICATION_WARNING_MSG = 'There is a warning about this credential.' @@ -100,7 +102,7 @@ export const VerificationCard = () => { return ( <>

    - Issuer Registration + Issuer Registration

    {matchingIssuers.map((match: any, index: number) => { const registryName = From 922042130a68b0d8750d8b8ada8c8556cae2da98 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Fri, 7 Nov 2025 16:50:21 -0500 Subject: [PATCH 056/109] add VPR help --- .../Help/LcwRequestHelp/LcwRequestHelp.tsx | 60 +++++++++++++++++++ app/components/Help/index.js | 3 +- app/index.module.css | 7 +++ app/page.tsx | 4 ++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx diff --git a/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx b/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx new file mode 100644 index 00000000..51be10cf --- /dev/null +++ b/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx @@ -0,0 +1,60 @@ +import styles from '../Help.module.css'; +export const LcwRequestHelp = () => { + return <> +
      +
    • Demonstrates requesting a credential from an LCW Wallet.
    • +
    • Uses the Verifiable Presentation Request specification.
    • +
    • Primarily here to demonstrate how the request might work in other applications.
    • +
    + +
    We've included this feature in VerifierPlus as a working demonstration + of how an application might request credentials from a wallet like the Learner Credential Wallet. In our case once we've gotten the + credential we run the verification process on the credential, but others might request a credential for other reasons, for example, to + obtain structured and verified data, say when applying for a job. +
    + +
    How the request works
    +
    The steps in the exchange, loosely:
    +
      +
    1. Click the 'Request credentials from LCW +' button in V+
    2. +
    3. The V+ UI generates a uuid for a new exchange and encodes it into a deeplink that is shown to the user (as a QR), like this one (UUID shortened for readability): +
      +{`dccrequest://request?request={"credentialRequestOrigin":`}
      +{`"https://verifierplus.org","protocols":{"vcapi":`}
      +{`"https://verifierplus.org/api/exchanges/80c8e5f0-93b9a9"}}`} +
      +
    4. +
    5. The important bit in there is the exchanges endpoint, i.e, the value of the 'vcapi' property: +https://verifierplus.org/api/exchanges/80c8e5f0-93b9a9
    6. +
    7. The V+ UI now starts polling that exchange endpoint until the GET returns a result. The endpoint won't return a result until the LCW has posted a credential.
    8. +
    9. User opens the deeplink on their phone (by scanning QR with phone camera)
    10. +
    11. The LCW posts an empty object to the exchanges endpoint.
    12. +
    13. The V+ server API receives the post and returns a verifiablePresentationRequest like so: +
      {`{
      +    "verifiablePresentationRequest": {
      +      "query": [
      +        {
      +          "type": "QueryByExample",
      +          "credentialQuery": {
      +            "reason": "Please present your 
      +            Verifiable Credential to complete 
      +            the verification process.",
      +            "example": {
      +              "type": ["VerifiableCredential"]
      +            }
      +          }
      +        }
      +      ]
      +    }
      +  }
      +    `}
      +  
    14. +
    15. The LCW receives that request and posts whatever credentials the user selects to the same exchanges endpoint.
    16. +
    17. The V+ exchanges endpoint receives the posted credentials and stores them.
    18. +
    19. Now the next time the V+ UI polls the exchanges endpoint, it will get back the credentials.
    20. +
    21. Finally, the LCW verifies the credentials.
    22. +
    +
    + + +} diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 533073b2..3da0f5ef 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -12,4 +12,5 @@ export * from './AchievementTypeHelp/AchievementTypeHelp' export * from './CredentialFormatHelp/CredentialFormatHelp' export * from './SignatureHelp/SignatureHelp' export * from './RevocationHelp/RevocationHelp' -export * from './RegistryListHelp/RegistryListHelp' \ No newline at end of file +export * from './RegistryListHelp/RegistryListHelp' +export * from './LcwRequestHelp/LcwRequestHelp' \ No newline at end of file diff --git a/app/index.module.css b/app/index.module.css index e8afc32a..c491fadf 100644 --- a/app/index.module.css +++ b/app/index.module.css @@ -384,6 +384,13 @@ margin-bottom: 8px; border: 2px solid var(--border); border-radius: 10px; + position: relative; +} + +.vprHelpIcon { + position: absolute; + top: 0; + right: 0; } .lcwLink { diff --git a/app/page.tsx b/app/page.tsx index 9224983f..c648b7cb 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -20,6 +20,8 @@ import Link from 'next/link' import { pollExchange } from '@/lib/exchanges'; import packageJson from '../package.json'; import * as polyfill from 'credential-handler-polyfill' +import { ContextualHelp } from './components/ContextualHelp/ContextualHelp' +import { LcwRequestHelp, RegistryListHelp } from './components/Help' // NOTE: We currently only support one credential at a time. If a presentation with more than one credential // is dropped, pasted, or scanned we only look at the first one @@ -437,6 +439,7 @@ export default function Home() { )}
    +
    +
    From e4ca25506574f24585d45d7a887d8d61f7ba3611 Mon Sep 17 00:00:00 2001 From: James Chartrand Date: Mon, 10 Nov 2025 10:24:44 -0500 Subject: [PATCH 057/109] add paste help --- app/components/Help/Help.module.css | 13 ++++ .../Help/LcwRequestHelp/LcwRequestHelp.tsx | 6 +- .../Help/PasteJsonUrlHelp/PasteJsonUrlHelp.js | 69 +++++++++++++++++++ app/components/Help/index.js | 3 +- app/page.tsx | 6 +- 5 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 app/components/Help/PasteJsonUrlHelp/PasteJsonUrlHelp.js diff --git a/app/components/Help/Help.module.css b/app/components/Help/Help.module.css index cce316b4..982ebbf3 100644 --- a/app/components/Help/Help.module.css +++ b/app/components/Help/Help.module.css @@ -52,4 +52,17 @@ width: 22px; height: 22px; vertical-align: top; +} + +.scrollableCode { + overflow-x: scroll; + padding-top: 20px; + padding-bottom: 20px; +} + +.scrollableLink { + overflow-x: scroll; + padding-top: 20px; + padding-bottom: 20px; + color:black } \ No newline at end of file diff --git a/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx b/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx index 51be10cf..390023a2 100644 --- a/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx +++ b/app/components/Help/LcwRequestHelp/LcwRequestHelp.tsx @@ -7,9 +7,9 @@ export const LcwRequestHelp = () => {
  • Primarily here to demonstrate how the request might work in other applications.
  • -
    We've included this feature in VerifierPlus as a working demonstration - of how an application might request credentials from a wallet like the Learner Credential Wallet. In our case once we've gotten the - credential we run the verification process on the credential, but others might request a credential for other reasons, for example, to +
    We've included this feature in VerifierPlus as a working demonstration + of how an application might request credentials from a wallet like the Learner Credential Wallet. In this demonstration, + once VerifierPlus has gotten the credential, it verifies it, but other applications might request a credential for other reasons, for example, to obtain structured and verified data, say when applying for a job.
    diff --git a/app/components/Help/PasteJsonUrlHelp/PasteJsonUrlHelp.js b/app/components/Help/PasteJsonUrlHelp/PasteJsonUrlHelp.js new file mode 100644 index 00000000..177702a1 --- /dev/null +++ b/app/components/Help/PasteJsonUrlHelp/PasteJsonUrlHelp.js @@ -0,0 +1,69 @@ +import styles from '../Help.module.css'; +export const PasteJsonUrlHelp = () => { + return <> +
      +
    • This is where you provide the Verifiable Credential you'd like to verify.
    • +
    • You can either paste in the credential itself, which is a text file containing the credential as JSON, or provide a URL that links to the file.
    • +
    • JSON (Javascript Object Notation) is a simple way to structure data in a parent/child hierachy.
    • +
    + +
    + A simple Verifiable Credential (and more specifically an Open Badge version 3 Verifiable Creential) looks like so (you can copy/paste this into the text area if you like): + +
    {`{
    +    "@context": [
    +        "https://www.w3.org/ns/credentials/v2",
    +        "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
    +    ],
    +    "validFrom": "2025-01-09T15:06:31Z",
    +    "id": "http://example.com/credentials/3527",
    +    "type": [
    +        "VerifiableCredential",
    +        "OpenBadgeCredential"
    +    ],
    +    "issuer": {
    +        "id": "did:key:z6MknNQD1WHLGGraFi6zcbGevuAgkVfdyCdtZnQTGWVVvR5Q",
    +        "type": [
    +            "Profile"
    +        ],
    +        "name": "Example Corp"
    +    },
    +    "name": "Teamwork Badge",
    +    "credentialSubject": {
    +        "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    +        "type": [
    +            "AchievementSubject"
    +        ],
    +        "achievement": {
    +            "id": "https://example.com/achievements/21st-century-skills/teamwork",
    +            "type": [
    +                "Achievement"
    +            ],
    +            "criteria": {
    +                "narrative": "Team members are nominated for this badge by their peers and recognized upon review by Example Corp management."
    +            },
    +            "description": "This badge recognizes the development of the capacity to collaborate within a group environment.",
    +            "name": "Teamwork"
    +        }
    +    },
    +    "proof": {
    +        "type": "DataIntegrityProof",
    +        "created": "2025-11-10T14:49:26Z",
    +        "verificationMethod": "did:key:z6MknNQD1WHLGGraFi6zcbGevuAgkVfdyCdtZnQTGWVVvR5Q#z6MknNQD1WHLGGraFi6zcbGevuAgkVfdyCdtZnQTGWVVvR5Q",
    +        "cryptosuite": "eddsa-rdfc-2022",
    +        "proofPurpose": "assertionMethod",
    +        "proofValue": "z3jqgQq2WpjsvHQp9XWxKcMvcehyTurrWawo33jvQk8CvbjQRvAgtsw9P2u2fXqY7iABSuBQdtt9UQyHsN82LRuq7"
    +    }
    +}`}
    +
    + +
    + A copy of that same Verifiable Credential is available at this URL: + You can also copy that URL and paste it into the text area. VerifierPlus will then retrieve the json from the URL and then run verification.
    + + + + +} \ No newline at end of file diff --git a/app/components/Help/index.js b/app/components/Help/index.js index 3da0f5ef..aecbce0d 100644 --- a/app/components/Help/index.js +++ b/app/components/Help/index.js @@ -13,4 +13,5 @@ export * from './CredentialFormatHelp/CredentialFormatHelp' export * from './SignatureHelp/SignatureHelp' export * from './RevocationHelp/RevocationHelp' export * from './RegistryListHelp/RegistryListHelp' -export * from './LcwRequestHelp/LcwRequestHelp' \ No newline at end of file +export * from './LcwRequestHelp/LcwRequestHelp' +export * from './PasteJsonUrlHelp/PasteJsonUrlHelp' \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index c648b7cb..8d67eb57 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -21,7 +21,7 @@ import { pollExchange } from '@/lib/exchanges'; import packageJson from '../package.json'; import * as polyfill from 'credential-handler-polyfill' import { ContextualHelp } from './components/ContextualHelp/ContextualHelp' -import { LcwRequestHelp, RegistryListHelp } from './components/Help' +import { LcwRequestHelp, PasteJsonUrlHelp, RegistryListHelp } from './components/Help' // NOTE: We currently only support one credential at a time. If a presentation with more than one credential // is dropped, pasted, or scanned we only look at the first one @@ -457,7 +457,7 @@ export default function Home() {
    -
    +