diff --git a/package-lock.json b/package-lock.json index 3114d679f..fe50e8989 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "eslint-plugin-jsdoc": "62.5.5", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-security": "3.0.1", - "eslint-plugin-yml": "3.1.2", + "eslint-plugin-yml": "3.2.0", "focus-trap": "8.0.0", "gsap": "^3.14.2", "happy-dom": "^20.6.1", @@ -3193,6 +3193,106 @@ } } }, + "node_modules/@eslint/markdown": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.5.1.tgz", + "integrity": "sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==", + "license": "MIT", + "peer": true, + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^0.17.0", + "@eslint/plugin-kit": "^0.4.1", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-util-normalize-identifier": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/markdown/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/markdown/node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/markdown/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/markdown/node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@eslint/markdown/node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "peer": true, + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/@eslint/object-schema": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.0.tgz", @@ -5189,6 +5289,25 @@ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, + "node_modules/@ota-meshi/ast-token-store": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@ota-meshi/ast-token-store/-/ast-token-store-0.2.0.tgz", + "integrity": "sha512-VQNg9OyqbvjMb+/EoFl1t5mp5qU53AHd6VLIKvj0nfnBiLnom2OSm+heyXD3++GePoVNf1D/KKU8fOIHi4y0xw==", + "license": "MIT", + "dependencies": { + "eslint-plugin-markdown-preferences": "^0.40.2" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "@eslint/markdown": "^7.4.0", + "eslint": ">=9.0.0" + } + }, "node_modules/@oxc-project/types": { "version": "0.110.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.110.0.tgz", @@ -18818,6 +18937,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", @@ -19658,6 +19786,99 @@ "node": "*" } }, + "node_modules/eslint-plugin-markdown-preferences": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown-preferences/-/eslint-plugin-markdown-preferences-0.40.2.tgz", + "integrity": "sha512-zaHQpfQijr/v7werfw6yQd05TpNoY6FTBTFAlxpFaOvoxfmQg89GLlU7KhrS0Ty++YCVVDgMJURwEn/c2w5n7g==", + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "emoji-regex-xs": "^2.0.1", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-extension-math": "^3.1.0", + "micromark-factory-space": "^2.0.1", + "micromark-util-character": "^2.1.1", + "micromark-util-symbol": "^2.0.1", + "string-width": "^8.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "@eslint/markdown": "^7.4.0", + "eslint": ">=9.0.0" + } + }, + "node_modules/eslint-plugin-markdown-preferences/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-markdown-preferences/node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-markdown-preferences/node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-markdown-preferences/node_modules/string-width": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-security": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz", @@ -19674,13 +19895,14 @@ } }, "node_modules/eslint-plugin-yml": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-3.1.2.tgz", - "integrity": "sha512-n9lxbFrNlGDLOSyIrEYkkYr7icbULMh66wwkIEluisq0lXSu1qVEEXM0g8MM8UQbtd9t1HMgN6bC+DaOe5dWdQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-3.2.0.tgz", + "integrity": "sha512-69gbDR+2IqaGJHyTXJ/FKJsv5QL3wKCfI2Z/rGjXwM88RxAqSOtM/AmF/YPhSWdHwezE8xyZbvDVnzgUPbO4ag==", "license": "MIT", "dependencies": { "@eslint/core": "^1.0.1", "@eslint/plugin-kit": "^0.6.0", + "@ota-meshi/ast-token-store": "^0.2.0", "debug": "^4.3.2", "diff-sequences": "^29.0.0", "escape-string-regexp": "5.0.0", diff --git a/package.json b/package.json index 6aa132af6..274980bec 100644 --- a/package.json +++ b/package.json @@ -150,7 +150,7 @@ "eslint-plugin-jsdoc": "62.5.5", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-security": "3.0.1", - "eslint-plugin-yml": "3.1.2", + "eslint-plugin-yml": "3.2.0", "focus-trap": "8.0.0", "gsap": "^3.14.2", "happy-dom": "^20.6.1", diff --git a/src/components/Pages/MyData/client/__tests__/index.spec.ts b/src/components/Pages/MyData/client/__tests__/index.spec.ts index aa097aeb4..2e3f65a5c 100644 --- a/src/components/Pages/MyData/client/__tests__/index.spec.ts +++ b/src/components/Pages/MyData/client/__tests__/index.spec.ts @@ -26,10 +26,37 @@ const myDataContent = { title: 'My Data & Privacy Rights', description: 'Under GDPR, you have the right to access and control your personal data.', }, + intro: 'Review your rights and submit a request for access or deletion of your personal data.', introLinks: { privacyPolicyText: 'Privacy Policy', consentPreferencesText: 'Consent Preferences', }, + accessData: { + heading: 'Access your data', + description: 'Submit your email to receive a secure access link.', + label: 'Email address', + buttonText: 'Request access', + }, + deleteData: { + heading: 'Delete your data', + description: 'Submit a deletion request for your account data.', + label: 'Email address', + buttonText: 'Request deletion', + confirmText: 'I understand this action is irreversible.', + }, + next: { + heading: 'What happens next', + items: [ + { + lead: 'Verification', + text: 'We verify request ownership before processing.', + }, + { + lead: 'Response', + text: 'You receive follow-up instructions by email.', + }, + ], + }, } vi.mock('astro:actions', () => ({ diff --git a/src/components/Pages/MyData/client/__tests__/selectors.spec.ts b/src/components/Pages/MyData/client/__tests__/selectors.spec.ts index 8962b2b7f..e84bef66e 100644 --- a/src/components/Pages/MyData/client/__tests__/selectors.spec.ts +++ b/src/components/Pages/MyData/client/__tests__/selectors.spec.ts @@ -21,10 +21,37 @@ const myDataContent = { title: 'My Data & Privacy Rights', description: 'Under GDPR, you have the right to access and control your personal data.', }, + intro: 'Review your rights and submit a request for access or deletion of your personal data.', introLinks: { privacyPolicyText: 'Privacy Policy', consentPreferencesText: 'Consent Preferences', }, + accessData: { + heading: 'Access your data', + description: 'Submit your email to receive a secure access link.', + label: 'Email address', + buttonText: 'Request access', + }, + deleteData: { + heading: 'Delete your data', + description: 'Submit a deletion request for your account data.', + label: 'Email address', + buttonText: 'Request deletion', + confirmText: 'I understand this action is irreversible.', + }, + next: { + heading: 'What happens next', + items: [ + { + lead: 'Verification', + text: 'We verify request ownership before processing.', + }, + { + lead: 'Response', + text: 'You receive follow-up instructions by email.', + }, + ], + }, } vi.mock('astro:actions', () => ({ diff --git a/src/components/Pages/MyData/index.astro b/src/components/Pages/MyData/index.astro index f960bd0d8..da794a995 100644 --- a/src/components/Pages/MyData/index.astro +++ b/src/components/Pages/MyData/index.astro @@ -1,7 +1,6 @@ --- -// import List from '@components/List/index.astro' import Icon from '@components/Icon/index.astro' -// import HeadingAnchor from '@components/Layout/HeadingAnchor/index.astro' +import List from '@components/List/index.astro' export type Props = { content: { @@ -9,10 +8,31 @@ export type Props = { title: string description: string } + intro: string introLinks: { privacyPolicyText: string consentPreferencesText: string } + accessData: { + heading: string + description: string + label: string + buttonText: string + }, + deleteData: { + heading: string + description: string + label: string + buttonText: string + confirmText: string + }, + next: { + heading: string + items: { + lead: string + text: string + }[] + } } } @@ -44,12 +64,15 @@ const { content } = Astro.props class="hidden rounded-xl border px-4 py-3 text-sm" > -
+

Overview

- Use the forms below to request a copy of your data or request its deletion. + {content.intro}

-