diff --git a/.gitignore b/.gitignore index b393ff45d17..275436855f9 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ _imports /src/website/public/apis /src/website/src/pages/ec/_jsdoc /src/website/src/pages/eu/_jsdoc +/src/website-next/.next # Logs logs diff --git a/package.json b/package.json index f57733d2d8f..cf5716724c4 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "start:ec": "(cd src/presets/ec && npm run watch) & cd src/playground/ec && npm run start", "start:eu": "(cd src/presets/eu && npm run watch) & cd src/playground/eu && npm run start", "start:website": "cd src/website && npm run start", + "start:website-next": "cd src/website-next && npm run build && npm run start", "test": "run-p test:*", "test:components": "jest --verbose", "test:coding-conventions": "npm run lint && npm run pretty-check", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d4b722ca61..fc48e8c442f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ overrides: nanoid: 3.3.8 esbuild: 0.24.2 -pnpmfileChecksum: c7x4vkvjctt6fvpx5wjldiflnq +pnpmfileChecksum: sha256-ugnQgQaqfR/xp/Izh/pchLtIFTd2FiRGMQLrQUu38bM= importers: @@ -2799,6 +2799,283 @@ importers: specifier: 5.0.0 version: 5.0.0(webpack@5.97.1) + src/website-next: + dependencies: + '@ecl/accordion': + specifier: 5.0.0-alpha.3 + version: link:../components/accordion + '@ecl/banner': + specifier: 5.0.0-alpha.3 + version: link:../components/banner + '@ecl/blockquote': + specifier: 5.0.0-alpha.3 + version: link:../components/blockquote + '@ecl/breadcrumb': + specifier: 5.0.0-alpha.3 + version: link:../components/breadcrumb + '@ecl/button': + specifier: 5.0.0-alpha.3 + version: link:../components/button + '@ecl/card': + specifier: 5.0.0-alpha.3 + version: link:../components/card + '@ecl/carousel': + specifier: 5.0.0-alpha.3 + version: link:../components/carousel + '@ecl/category-filter': + specifier: 5.0.0-alpha.3 + version: link:../components/category-filter + '@ecl/checkbox': + specifier: 5.0.0-alpha.3 + version: link:../components/checkbox + '@ecl/content-block': + specifier: 5.0.0-alpha.3 + version: link:../components/content-block + '@ecl/content-item': + specifier: 5.0.0-alpha.3 + version: link:../components/content-item + '@ecl/date-block': + specifier: 5.0.0-alpha.3 + version: link:../components/date-block + '@ecl/datepicker': + specifier: 5.0.0-alpha.3 + version: link:../components/datepicker + '@ecl/description-list': + specifier: 5.0.0-alpha.3 + version: link:../components/description-list + '@ecl/expandable': + specifier: 5.0.0-alpha.3 + version: link:../components/expandable + '@ecl/fact-figures': + specifier: 5.0.0-alpha.3 + version: link:../components/fact-figures + '@ecl/featured-item': + specifier: 5.0.0-alpha.3 + version: link:../components/featured-item + '@ecl/file': + specifier: 5.0.0-alpha.3 + version: link:../components/file + '@ecl/file-upload': + specifier: 5.0.0-alpha.3 + version: link:../components/file-upload + '@ecl/form-group': + specifier: 5.0.0-alpha.3 + version: link:../components/form-group + '@ecl/gallery': + specifier: 5.0.0-alpha.3 + version: link:../components/gallery + '@ecl/grid': + specifier: 5.0.0-alpha.3 + version: link:../layout/grid + '@ecl/icon': + specifier: 5.0.0-alpha.3 + version: link:../components/icon + '@ecl/inpage-navigation': + specifier: 5.0.0-alpha.3 + version: link:../components/inpage-navigation + '@ecl/label': + specifier: 5.0.0-alpha.3 + version: link:../components/label + '@ecl/link': + specifier: 5.0.0-alpha.3 + version: link:../components/link + '@ecl/list-illustration': + specifier: 5.0.0-alpha.3 + version: link:../components/list-illustration + '@ecl/media-container': + specifier: 5.0.0-alpha.3 + version: link:../components/media-container + '@ecl/mega-menu': + specifier: 5.0.0-alpha.3 + version: link:../components/mega-menu + '@ecl/menu': + specifier: 5.0.0-alpha.3 + version: link:../components/menu + '@ecl/modal': + specifier: 5.0.0-alpha.3 + version: link:../components/modal + '@ecl/navigation-list': + specifier: 5.0.0-alpha.3 + version: link:../components/navigation-list + '@ecl/news-ticker': + specifier: 5.0.0-alpha.3 + version: link:../components/news-ticker + '@ecl/notification': + specifier: 5.0.0-alpha.3 + version: link:../components/notification + '@ecl/ordered-list': + specifier: 5.0.0-alpha.3 + version: link:../components/ordered-list + '@ecl/page-header': + specifier: 5.0.0-alpha.3 + version: link:../components/page-header + '@ecl/pagination': + specifier: 5.0.0-alpha.3 + version: link:../components/pagination + '@ecl/popover': + specifier: 5.0.0-alpha.3 + version: link:../components/popover + '@ecl/preset-ec': + specifier: 5.0.0-alpha.3 + version: link:../presets/ec + '@ecl/preset-eu': + specifier: 5.0.0-alpha.3 + version: link:../presets/eu + '@ecl/radio': + specifier: 5.0.0-alpha.3 + version: link:../components/radio + '@ecl/range': + specifier: 5.0.0-alpha.3 + version: link:../components/range + '@ecl/rating-field': + specifier: 5.0.0-alpha.3 + version: link:../components/rating-field + '@ecl/resources-ec-logo': + specifier: 5.0.0-alpha.3 + version: link:../resources/logo-ec + '@ecl/resources-ec-social-icons': + specifier: 5.0.0-alpha.3 + version: link:../resources/social-icons + '@ecl/resources-eu-logo': + specifier: 5.0.0-alpha.3 + version: link:../resources/logo-eu + '@ecl/resources-flag-icons': + specifier: 5.0.0-alpha.3 + version: link:../resources/icons-flag + '@ecl/resources-icons': + specifier: 5.0.0-alpha.3 + version: link:../resources/icons + '@ecl/resources-social-media-icons': + specifier: 5.0.0-alpha.3 + version: link:../resources/icons-social-media + '@ecl/search-form': + specifier: 5.0.0-alpha.3 + version: link:../components/search-form + '@ecl/select': + specifier: 5.0.0-alpha.3 + version: link:../components/select + '@ecl/separator': + specifier: 5.0.0-alpha.3 + version: link:../components/separator + '@ecl/site-footer': + specifier: 5.0.0-alpha.3 + version: link:../components/site-footer + '@ecl/site-header': + specifier: 5.0.0-alpha.3 + version: link:../components/site-header + '@ecl/skip-link': + specifier: 5.0.0-alpha.3 + version: link:../components/skip-link + '@ecl/social-media-follow': + specifier: 5.0.0-alpha.3 + version: link:../components/social-media-follow + '@ecl/social-media-share': + specifier: 5.0.0-alpha.3 + version: link:../components/social-media-share + '@ecl/spinner': + specifier: 5.0.0-alpha.3 + version: link:../components/spinner + '@ecl/splash-page': + specifier: 5.0.0-alpha.3 + version: link:../components/splash-page + '@ecl/table': + specifier: 5.0.0-alpha.3 + version: link:../components/table + '@ecl/tabs': + specifier: 5.0.0-alpha.3 + version: link:../components/tabs + '@ecl/tag': + specifier: 5.0.0-alpha.3 + version: link:../components/tag + '@ecl/text-area': + specifier: 5.0.0-alpha.3 + version: link:../components/text-area + '@ecl/text-input': + specifier: 5.0.0-alpha.3 + version: link:../components/text-input + '@ecl/theme-ec': + specifier: 5.0.0-alpha.3 + version: link:../themes/ec + '@ecl/theme-eu': + specifier: 5.0.0-alpha.3 + version: link:../themes/eu + '@ecl/timeline': + specifier: 5.0.0-alpha.3 + version: link:../components/timeline + '@ecl/unordered-list': + specifier: 5.0.0-alpha.3 + version: link:../components/unordered-list + '@ecl/utility-typography': + specifier: 5.0.0-alpha.3 + version: link:../utilities/typography + '@mdx-js/loader': + specifier: 2.3.0 + version: 2.3.0(webpack@5.97.1(esbuild@0.24.2)) + '@mdx-js/react': + specifier: 3.1.0 + version: 3.1.0(@types/react@19.0.7)(react@19.0.0) + '@next/mdx': + specifier: ^15.1.6 + version: 15.1.6(@mdx-js/loader@2.3.0(webpack@5.97.1(esbuild@0.24.2)))(@mdx-js/react@3.1.0(@types/react@19.0.7)(react@19.0.0)) + classnames: + specifier: ^2.5.1 + version: 2.5.1 + clipboard: + specifier: ^2.0.11 + version: 2.0.11 + fs: + specifier: 0.0.1-security + version: 0.0.1-security + gray-matter: + specifier: 4.0.3 + version: 4.0.3 + mdx-bundler: + specifier: ^10.0.3 + version: 10.1.0(acorn@8.14.0)(esbuild@0.24.2) + next: + specifier: 15.1.6 + version: 15.1.6(@babel/core@7.26.7)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.4) + next-mdx-remote: + specifier: ^5.0.0 + version: 5.0.0(@types/react@19.0.7)(acorn@8.14.0)(react@19.0.0) + path: + specifier: ^0.12.7 + version: 0.12.7 + prop-types: + specifier: 15.8.1 + version: 15.8.1 + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + rehype-stringify: + specifier: ^10.0.1 + version: 10.0.1 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-frontmatter: + specifier: 3.0.0 + version: 3.0.0 + remark-gfm: + specifier: 1.0.0 + version: 1.0.0 + remark-unwrap-images: + specifier: 2.1.0 + version: 2.1.0 + unified: + specifier: ^11.0.5 + version: 11.0.5 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.2.0 + eslint: + specifier: ^9 + version: 9.19.0(jiti@2.4.2) + packages: '@aashutoshrathi/word-wrap@https://codeload.github.com/aashutoshrathi/word-wrap/tar.gz/07cb5082d681d084c4a79c1588b169b0b9cfa349': @@ -3601,6 +3878,11 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild-plugins/node-resolve@0.2.2': + resolution: {integrity: sha512-+t5FdX3ATQlb53UFDBRb4nqjYBz492bIrnVWvpQHpzZlu9BQL5HasMZhqc409ygUwOWCXZhrWr6NyZ6T6Y+cxw==} + peerDependencies: + esbuild: 0.24.2 + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -3793,6 +4075,9 @@ packages: resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fal-works/esbuild-plugin-global-externals@2.1.2': + resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} + '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} @@ -3864,6 +4149,111 @@ packages: '@iframe-resizer/parent@5.3.2': resolution: {integrity: sha512-xjrQpRtsC9p1pBUKewYI9cmHoxomhGGSvspLq7Xgh4uYiifORaHqrqOnAgWKsV6Gl83s16g3RE1v1hRM7ZNOMQ==} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/checkbox@4.0.6': resolution: {integrity: sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==} engines: {node: '>=18'} @@ -4084,6 +4474,11 @@ packages: resolution: {integrity: sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==} engines: {node: '>=18.0.0'} + '@mdx-js/esbuild@3.1.0': + resolution: {integrity: sha512-Jk42xUb1SEJxh6n2GBAtJjQISFIZccjz8XVEsHVhrlvZJAJziIxR9KyaFF6nTeTB/jCAFQGDgO7+oMRH/ApRsg==} + peerDependencies: + esbuild: 0.24.2 + '@mdx-js/loader@2.3.0': resolution: {integrity: sha512-IqsscXh7Q3Rzb+f5DXYk0HU71PK+WuFsEhf+mSV3fOhpLcEpgsHvTQ2h0T6TlZ5gHOaBeFjkXwB52by7ypMyNg==} peerDependencies: @@ -4104,6 +4499,68 @@ packages: '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@next/env@15.1.6': + resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} + + '@next/mdx@15.1.6': + resolution: {integrity: sha512-jt9b9ayY8z3F/oQa2YCK7NugxY6ttAiJ8Eu29OTwwW5rcYMjXohIRaqsSrgFWhCFkJA6/EccKO+1ApocCZnn5A==} + peerDependencies: + '@mdx-js/loader': '>=0.15.0' + '@mdx-js/react': '>=0.15.0' + peerDependenciesMeta: + '@mdx-js/loader': + optional: true + '@mdx-js/react': + optional: true + + '@next/swc-darwin-arm64@15.1.6': + resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.1.6': + resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.1.6': + resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.1.6': + resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.1.6': + resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.1.6': + resolution: {integrity: sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.1.6': + resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.1.6': + resolution: {integrity: sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -4911,6 +5368,12 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -5889,6 +6352,10 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + byte-size@8.1.1: resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} engines: {node: '>=12.17'} @@ -6142,6 +6609,9 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipboard@2.0.11: resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} @@ -6215,6 +6685,10 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -6816,6 +7290,10 @@ packages: engines: {node: '>=0.10'} hasBin: true + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -7149,6 +7627,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -7378,6 +7860,9 @@ packages: estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-value-to-estree@3.3.2: + resolution: {integrity: sha512-hYH1aSvQI63Cvq3T3loaem6LW4u72F187zW4FHpTrReJSm6W66vYTFNO1vH/chmcOulp1HlAj1pxn8Ag0oXI5Q==} + estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} @@ -7504,6 +7989,9 @@ packages: fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -7740,6 +8228,9 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs@0.0.1-security: + resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -7839,6 +8330,10 @@ packages: gitconfiglocal@1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -7995,6 +8490,9 @@ packages: hast-util-to-estree@3.1.1: resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==} + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + hast-util-to-jsx-runtime@2.3.2: resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} @@ -8098,6 +8596,9 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html-webpack-plugin@5.6.3: resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} engines: {node: '>=10.13.0'} @@ -9275,6 +9776,9 @@ packages: mdast-util-frontmatter@0.2.0: resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + mdast-util-gfm-autolink-literal@0.1.3: resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} @@ -9365,6 +9869,12 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + mdx-bundler@10.1.0: + resolution: {integrity: sha512-HtyVyqzBz/rG3hjca2ZggI5Ghx8YdBeAfnDIgqiMVOZyum1WcmBsdPKYN0AhV4SNaxyohASIrwC8DiXtU55FUA==} + engines: {node: '>=18', npm: '>=6'} + peerDependencies: + esbuild: 0.24.2 + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -9418,6 +9928,9 @@ packages: micromark-extension-frontmatter@0.2.2: resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-gfm-autolink-literal@0.5.7: resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} @@ -9864,6 +10377,33 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} + next-mdx-remote@5.0.0: + resolution: {integrity: sha512-RNNbqRpK9/dcIFZs/esQhuLA8jANqlH694yqoDBK8hkVdJUndzzGmnPHa2nyi90N4Z9VmzuSWNRpr5ItT3M7xQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16' + + next@15.1.6: + resolution: {integrity: sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -10366,6 +10906,9 @@ packages: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} + path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -10938,6 +11481,11 @@ packages: peerDependencies: react: ^18.3.1 + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} @@ -11008,6 +11556,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + read-cmd-shim@4.0.0: resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -11137,6 +11689,9 @@ packages: rehype-recma@1.0.0: resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -11144,9 +11699,15 @@ packages: remark-frontmatter@3.0.0: resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + remark-gfm@1.0.0: resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + remark-mdx-frontmatter@4.0.0: + resolution: {integrity: sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg==} + remark-mdx@2.3.0: resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} @@ -11165,9 +11726,15 @@ packages: remark-rehype@11.1.1: resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-unwrap-images@2.1.0: resolution: {integrity: sha512-DpM7oEIXNjS3aDQpzxWrTWhUJcd5b8LznbSZnSPi1Yc3fJgLYJlx9uzkj5ekyp01PSBbSbPM2jq4959mcIetvA==} + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} @@ -11384,6 +11951,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} @@ -11488,6 +12058,10 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -11761,6 +12335,10 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + streamx@2.21.1: resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} @@ -11888,6 +12466,19 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylehacks@7.0.4: resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} @@ -12156,6 +12747,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -12403,6 +12997,9 @@ packages: unist-util-remove-position@4.0.2: resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + unist-util-remove@3.1.1: + resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} + unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} @@ -12499,6 +13096,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} @@ -12544,6 +13144,9 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-matter@5.0.0: + resolution: {integrity: sha512-jhPSqlj8hTSkTXOqyxbUeZAFFVq/iwu/jukcApEqc/7DOidaAth6rDc0Zgg0vWpzUnWkwFP7aK28l6nBmxMqdQ==} + vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} @@ -13970,6 +14573,16 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} + '@esbuild-plugins/node-resolve@0.2.2(esbuild@0.24.2)': + dependencies: + '@types/resolve': 1.20.2 + debug: 4.4.0 + esbuild: 0.24.2 + escape-string-regexp: 4.0.0 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + '@esbuild/aix-ppc64@0.24.2': optional: true @@ -14108,6 +14721,8 @@ snapshots: '@eslint/core': 0.10.0 levn: 0.4.1 + '@fal-works/esbuild-plugin-global-externals@2.1.2': {} + '@gar/promisify@1.1.3': {} '@hapi/address@4.1.0': @@ -14172,6 +14787,81 @@ snapshots: dependencies: '@iframe-resizer/core': 5.3.2 + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@inquirer/checkbox@4.0.6(@types/node@22.10.7)': dependencies: '@inquirer/core': 10.1.4(@types/node@22.10.7) @@ -14601,6 +15291,26 @@ snapshots: - supports-color - typescript + '@mdx-js/esbuild@3.1.0(acorn@8.14.0)(esbuild@0.24.2)': + dependencies: + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@types/unist': 3.0.3 + esbuild: 0.24.2 + source-map: 0.7.4 + vfile: 6.0.3 + vfile-message: 4.0.2 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/loader@2.3.0(webpack@5.97.1(esbuild@0.24.2))': + dependencies: + '@mdx-js/mdx': 2.3.0 + source-map: 0.7.4 + webpack: 5.97.1(esbuild@0.24.2) + transitivePeerDependencies: + - supports-color + '@mdx-js/loader@2.3.0(webpack@5.97.1)': dependencies: '@mdx-js/mdx': 2.3.0 @@ -14673,12 +15383,51 @@ snapshots: '@types/react': 19.0.7 react: 18.3.1 + '@mdx-js/react@3.1.0(@types/react@19.0.7)(react@19.0.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.0.7 + react: 19.0.0 + '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.3.1 '@emnapi/runtime': 1.3.1 '@tybys/wasm-util': 0.9.0 + '@next/env@15.1.6': {} + + '@next/mdx@15.1.6(@mdx-js/loader@2.3.0(webpack@5.97.1(esbuild@0.24.2)))(@mdx-js/react@3.1.0(@types/react@19.0.7)(react@19.0.0))': + dependencies: + source-map: 0.7.4 + optionalDependencies: + '@mdx-js/loader': 2.3.0(webpack@5.97.1(esbuild@0.24.2)) + '@mdx-js/react': 3.1.0(@types/react@19.0.7)(react@19.0.0) + + '@next/swc-darwin-arm64@15.1.6': + optional: true + + '@next/swc-darwin-x64@15.1.6': + optional: true + + '@next/swc-linux-arm64-gnu@15.1.6': + optional: true + + '@next/swc-linux-arm64-musl@15.1.6': + optional: true + + '@next/swc-linux-x64-gnu@15.1.6': + optional: true + + '@next/swc-linux-x64-musl@15.1.6': + optional: true + + '@next/swc-win32-arm64-msvc@15.1.6': + optional: true + + '@next/swc-win32-x64-msvc@15.1.6': + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -15702,6 +16451,12 @@ snapshots: dependencies: storybook: 8.5.3(prettier@3.4.2) + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.26.2 @@ -16776,7 +17531,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.0.1 + chalk: 5.4.1 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -16938,6 +17693,10 @@ snapshots: dependencies: run-applescript: 7.0.0 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + byte-size@8.1.1: {} bytes-iec@3.1.1: {} @@ -17209,6 +17968,8 @@ snapshots: cli-width@4.1.0: {} + client-only@0.0.1: {} + clipboard@2.0.11: dependencies: good-listener: 1.2.2 @@ -17285,6 +18046,12 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + colord@2.9.3: {} colorette@2.0.20: {} @@ -17939,6 +18706,9 @@ snapshots: detect-libc@1.0.3: optional: true + detect-libc@2.0.3: + optional: true + detect-newline@3.1.0: {} detect-node@2.1.0: {} @@ -18369,6 +19139,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -18725,6 +19497,10 @@ snapshots: astring: 1.9.0 source-map: 0.7.4 + estree-util-value-to-estree@3.3.2: + dependencies: + '@types/estree': 1.0.6 + estree-util-visit@1.2.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -18915,7 +19691,7 @@ snapshots: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 - glob-parent: 6.0.2 + glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -18935,6 +19711,10 @@ snapshots: dependencies: format: 0.2.2 + fault@2.0.1: + dependencies: + format: 0.2.2 + faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 @@ -19233,6 +20013,8 @@ snapshots: fs.realpath@1.0.0: {} + fs@0.0.1-security: {} + fsevents@2.3.3: optional: true @@ -19348,6 +20130,10 @@ snapshots: dependencies: ini: 1.3.8 + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -19566,6 +20352,20 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.2: dependencies: '@types/estree': 1.0.6 @@ -19721,6 +20521,8 @@ snapshots: html-tags@3.3.1: {} + html-void-elements@3.0.0: {} + html-webpack-plugin@5.6.3(webpack@5.97.1(esbuild@0.24.2)): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -20302,7 +21104,7 @@ snapshots: jake@10.9.2: dependencies: async: 3.2.6 - chalk: 4.1.0 + chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -20396,7 +21198,7 @@ snapshots: jest-diff@29.7.0: dependencies: - chalk: 4.1.0 + chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 @@ -21311,6 +22113,17 @@ snapshots: dependencies: micromark-extension-frontmatter: 0.2.2 + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-gfm-autolink-literal@0.1.3: dependencies: ccount: 1.1.0 @@ -21527,6 +22340,22 @@ snapshots: mdurl@2.0.0: {} + mdx-bundler@10.1.0(acorn@8.14.0)(esbuild@0.24.2): + dependencies: + '@babel/runtime': 7.26.7 + '@esbuild-plugins/node-resolve': 0.2.2(esbuild@0.24.2) + '@fal-works/esbuild-plugin-global-externals': 2.1.2 + '@mdx-js/esbuild': 3.1.0(acorn@8.14.0)(esbuild@0.24.2) + esbuild: 0.24.2 + gray-matter: 4.0.3 + remark-frontmatter: 5.0.0 + remark-mdx-frontmatter: 4.0.0 + uuid: 9.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + media-typer@0.3.0: {} memfs@3.5.3: @@ -21614,6 +22443,13 @@ snapshots: dependencies: fault: 1.0.4 + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + micromark-extension-gfm-autolink-literal@0.5.7: dependencies: micromark: 2.11.4 @@ -22287,6 +23123,46 @@ snapshots: netmask@2.0.2: {} + next-mdx-remote@5.0.0(@types/react@19.0.7)(acorn@8.14.0)(react@19.0.0): + dependencies: + '@babel/code-frame': 7.26.2 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@mdx-js/react': 3.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + unist-util-remove: 3.1.1 + vfile: 6.0.3 + vfile-matter: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + + next@15.1.6(@babel/core@7.26.7)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.4): + dependencies: + '@next/env': 15.1.6 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001695 + postcss: 8.5.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + styled-jsx: 5.1.6(@babel/core@7.26.7)(babel-plugin-macros@3.1.0)(react@19.0.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.1.6 + '@next/swc-darwin-x64': 15.1.6 + '@next/swc-linux-arm64-gnu': 15.1.6 + '@next/swc-linux-arm64-musl': 15.1.6 + '@next/swc-linux-x64-gnu': 15.1.6 + '@next/swc-linux-x64-musl': 15.1.6 + '@next/swc-win32-arm64-msvc': 15.1.6 + '@next/swc-win32-x64-msvc': 15.1.6 + sass: 1.83.4 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-try@1.0.5: {} no-case@2.3.2: @@ -22478,7 +23354,7 @@ snapshots: '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 axios: 1.7.9 - chalk: 4.1.0 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 @@ -22949,6 +23825,11 @@ snapshots: path-type@5.0.0: {} + path@0.12.7: + dependencies: + process: 0.11.10 + util: 0.10.4 + pathe@1.1.2: {} pathe@2.0.2: {} @@ -23534,6 +24415,11 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + react-error-overlay@6.0.11: {} react-fast-compare@3.2.2: {} @@ -23636,6 +24522,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.0.0: {} + read-cmd-shim@4.0.0: {} read-package-json-fast@3.0.2: @@ -23833,6 +24721,12 @@ snapshots: transitivePeerDependencies: - supports-color + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + unified: 11.0.5 + relateurl@0.2.7: {} remark-frontmatter@3.0.0: @@ -23840,6 +24734,15 @@ snapshots: mdast-util-frontmatter: 0.2.0 micromark-extension-frontmatter: 0.2.2 + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-gfm@1.0.0: dependencies: mdast-util-gfm: 0.1.2 @@ -23847,6 +24750,15 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx-frontmatter@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + estree-util-is-identifier-name: 3.0.0 + estree-util-value-to-estree: 3.3.2 + toml: 3.0.0 + unified: 11.0.5 + yaml: 2.7.0 + remark-mdx@2.3.0: dependencies: mdast-util-mdx: 2.0.1 @@ -23893,11 +24805,26 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + remark-unwrap-images@2.1.0: dependencies: hast-util-whitespace: 1.0.4 unist-util-visit: 2.0.3 + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remove-trailing-separator@1.1.0: {} renderkid@3.0.0: @@ -24116,6 +25043,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.25.0: {} + schema-utils@2.7.0: dependencies: '@types/json-schema': 7.0.15 @@ -24305,6 +25234,33 @@ snapshots: shallowequal@1.1.0: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -24647,6 +25603,8 @@ snapshots: commander: 2.20.3 limiter: 1.1.5 + streamsearch@1.1.0: {} + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 @@ -24808,6 +25766,14 @@ snapshots: dependencies: inline-style-parser: 0.2.4 + styled-jsx@5.1.6(@babel/core@7.26.7)(babel-plugin-macros@3.1.0)(react@19.0.0): + dependencies: + client-only: 0.0.1 + react: 19.0.0 + optionalDependencies: + '@babel/core': 7.26.7 + babel-plugin-macros: 3.1.0 + stylehacks@7.0.4(postcss@8.5.1): dependencies: browserslist: 4.24.4 @@ -25153,6 +26119,8 @@ snapshots: toidentifier@1.0.1: {} + toml@3.0.0: {} + tough-cookie@4.1.4: dependencies: psl: 1.15.0 @@ -25434,6 +26402,12 @@ snapshots: '@types/unist': 2.0.11 unist-util-visit: 4.1.2 + unist-util-remove@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.11 @@ -25538,6 +26512,10 @@ snapshots: util-deprecate@1.0.2: {} + util@0.10.4: + dependencies: + inherits: 2.0.3 + util@0.12.5: dependencies: inherits: 2.0.4 @@ -25580,6 +26558,11 @@ snapshots: vary@1.1.2: {} + vfile-matter@5.0.0: + dependencies: + vfile: 6.0.3 + yaml: 2.7.0 + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.11 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f4ebe2d6fef..fedf525df81 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,3 +12,4 @@ packages: - "src/presets/*" - "src/tools/*" - "src/website" + - "src/website-next" diff --git a/src/website-next/.gitignore b/src/website-next/.gitignore new file mode 100644 index 00000000000..5ef6a520780 --- /dev/null +++ b/src/website-next/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/src/website-next/README.md b/src/website-next/README.md new file mode 100644 index 00000000000..09a8a4d2c4e --- /dev/null +++ b/src/website-next/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/src/website-next/eslint.config.mjs b/src/website-next/eslint.config.mjs new file mode 100644 index 00000000000..838d5c8a85d --- /dev/null +++ b/src/website-next/eslint.config.mjs @@ -0,0 +1,14 @@ +import { dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { FlatCompat } from '@eslint/eslintrc'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [...compat.extends('next/core-web-vitals')]; + +export default eslintConfig; diff --git a/src/website-next/jsconfig.json b/src/website-next/jsconfig.json new file mode 100644 index 00000000000..a4f2367722a --- /dev/null +++ b/src/website-next/jsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + // Allows relative "paths" to be based on the project root. + "baseUrl": ".", + "paths": { + // Example wildcard alias for anything in `src/` + "@/*": ["./src/*"], + + // Aliases for `@ecl/website-components` + "@ecl/website-components": ["./src/website-components/*"], + + // Aliases for `@ecl/website-utils` + "@ecl/website-utils": ["./src/utils/*"] + } + } +} diff --git a/src/website-next/next.config.mjs b/src/website-next/next.config.mjs new file mode 100644 index 00000000000..a2327aab581 --- /dev/null +++ b/src/website-next/next.config.mjs @@ -0,0 +1,52 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; +import nextMDX from '@next/mdx'; +import frontmatter from 'remark-frontmatter'; +import remarkGfm from 'remark-gfm'; +import unwrapImages from 'remark-unwrap-images'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const withMDX = nextMDX({ + extension: /\.mdx?$/, + options: { + remarkPlugins: [ + frontmatter, + remarkGfm, + unwrapImages + ], + rehypePlugins: [], + providerImportSource: '@mdx-js/react', + }, +}); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx'], + images: { + disableStaticImages: true, + }, + webpack: (config) => { + config.resolve.alias = { + ...config.resolve.alias, + '@ecl/website-components': path.resolve( + __dirname, + 'src/website-components' + ), + '@ecl/website-utils': path.resolve(__dirname, 'src/utils'), + }; + + config.module.rules.push({ + test: /\.svg$/, + type: 'asset/resource', + generator: { + filename: 'static/[hash][ext][query]' + } + }); + + return config; + }, +}; + +export default withMDX(nextConfig); diff --git a/src/website-next/package.json b/src/website-next/package.json new file mode 100644 index 00000000000..279012fef1e --- /dev/null +++ b/src/website-next/package.json @@ -0,0 +1,106 @@ +{ + "name": "website-next", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@ecl/accordion": "5.0.0-alpha.3", + "@ecl/banner": "5.0.0-alpha.3", + "@ecl/blockquote": "5.0.0-alpha.3", + "@ecl/breadcrumb": "5.0.0-alpha.3", + "@ecl/button": "5.0.0-alpha.3", + "@ecl/card": "5.0.0-alpha.3", + "@ecl/carousel": "5.0.0-alpha.3", + "@ecl/category-filter": "5.0.0-alpha.3", + "@ecl/checkbox": "5.0.0-alpha.3", + "@ecl/content-block": "5.0.0-alpha.3", + "@ecl/content-item": "5.0.0-alpha.3", + "@ecl/date-block": "5.0.0-alpha.3", + "@ecl/datepicker": "5.0.0-alpha.3", + "@ecl/description-list": "5.0.0-alpha.3", + "@ecl/expandable": "5.0.0-alpha.3", + "@ecl/fact-figures": "5.0.0-alpha.3", + "@ecl/featured-item": "5.0.0-alpha.3", + "@ecl/file": "5.0.0-alpha.3", + "@ecl/file-upload": "5.0.0-alpha.3", + "@ecl/form-group": "5.0.0-alpha.3", + "@ecl/gallery": "5.0.0-alpha.3", + "@ecl/grid": "5.0.0-alpha.3", + "@ecl/icon": "5.0.0-alpha.3", + "@ecl/inpage-navigation": "5.0.0-alpha.3", + "@ecl/label": "5.0.0-alpha.3", + "@ecl/link": "5.0.0-alpha.3", + "@ecl/list-illustration": "5.0.0-alpha.3", + "@ecl/media-container": "5.0.0-alpha.3", + "@ecl/mega-menu": "5.0.0-alpha.3", + "@ecl/menu": "5.0.0-alpha.3", + "@ecl/modal": "5.0.0-alpha.3", + "@ecl/navigation-list": "5.0.0-alpha.3", + "@ecl/news-ticker": "5.0.0-alpha.3", + "@ecl/notification": "5.0.0-alpha.3", + "@ecl/ordered-list": "5.0.0-alpha.3", + "@ecl/page-header": "5.0.0-alpha.3", + "@ecl/pagination": "5.0.0-alpha.3", + "@ecl/popover": "5.0.0-alpha.3", + "@ecl/preset-ec": "5.0.0-alpha.3", + "@ecl/preset-eu": "5.0.0-alpha.3", + "@ecl/radio": "5.0.0-alpha.3", + "@ecl/range": "5.0.0-alpha.3", + "@ecl/rating-field": "5.0.0-alpha.3", + "@ecl/resources-ec-logo": "5.0.0-alpha.3", + "@ecl/resources-ec-social-icons": "5.0.0-alpha.3", + "@ecl/resources-eu-logo": "5.0.0-alpha.3", + "@ecl/resources-flag-icons": "5.0.0-alpha.3", + "@ecl/resources-icons": "5.0.0-alpha.3", + "@ecl/resources-social-media-icons": "5.0.0-alpha.3", + "@ecl/search-form": "5.0.0-alpha.3", + "@ecl/select": "5.0.0-alpha.3", + "@ecl/separator": "5.0.0-alpha.3", + "@ecl/site-footer": "5.0.0-alpha.3", + "@ecl/site-header": "5.0.0-alpha.3", + "@ecl/skip-link": "5.0.0-alpha.3", + "@ecl/social-media-follow": "5.0.0-alpha.3", + "@ecl/social-media-share": "5.0.0-alpha.3", + "@ecl/spinner": "5.0.0-alpha.3", + "@ecl/splash-page": "5.0.0-alpha.3", + "@ecl/table": "5.0.0-alpha.3", + "@ecl/tabs": "5.0.0-alpha.3", + "@ecl/tag": "5.0.0-alpha.3", + "@ecl/text-area": "5.0.0-alpha.3", + "@ecl/text-input": "5.0.0-alpha.3", + "@ecl/theme-ec": "5.0.0-alpha.3", + "@ecl/theme-eu": "5.0.0-alpha.3", + "@ecl/timeline": "5.0.0-alpha.3", + "@ecl/unordered-list": "5.0.0-alpha.3", + "@ecl/utility-typography": "5.0.0-alpha.3", + "@mdx-js/loader": "2.3.0", + "@mdx-js/react": "3.1.0", + "@next/mdx": "^15.1.6", + "classnames": "^2.5.1", + "clipboard": "^2.0.11", + "fs": "0.0.1-security", + "gray-matter": "4.0.3", + "mdx-bundler": "^10.0.3", + "next": "15.1.6", + "next-mdx-remote": "^5.0.0", + "path": "^0.12.7", + "prop-types": "15.8.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "rehype-stringify": "^10.0.1", + "remark": "^15.0.1", + "remark-frontmatter": "3.0.0", + "remark-gfm": "1.0.0", + "remark-unwrap-images": "2.1.0", + "unified": "^11.0.5" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "eslint": "^9" + } +} diff --git a/src/website-next/public/cms-images b/src/website-next/public/cms-images new file mode 120000 index 00000000000..7eaa267cd9f --- /dev/null +++ b/src/website-next/public/cms-images @@ -0,0 +1 @@ +../../../cms-images \ No newline at end of file diff --git a/src/website-next/public/favicon.ico b/src/website-next/public/favicon.ico new file mode 100644 index 00000000000..718d6fea483 Binary files /dev/null and b/src/website-next/public/favicon.ico differ diff --git a/src/website-next/public/file.svg b/src/website-next/public/file.svg new file mode 100644 index 00000000000..c457b79eba6 --- /dev/null +++ b/src/website-next/public/file.svg @@ -0,0 +1,6 @@ + diff --git a/src/website-next/public/globe.svg b/src/website-next/public/globe.svg new file mode 100644 index 00000000000..cec29af548c --- /dev/null +++ b/src/website-next/public/globe.svg @@ -0,0 +1,11 @@ + diff --git a/src/website-next/public/next.svg b/src/website-next/public/next.svg new file mode 100644 index 00000000000..e75f54fde1a --- /dev/null +++ b/src/website-next/public/next.svg @@ -0,0 +1,7 @@ + diff --git a/src/website-next/public/vercel.svg b/src/website-next/public/vercel.svg new file mode 100644 index 00000000000..158275d702c --- /dev/null +++ b/src/website-next/public/vercel.svg @@ -0,0 +1,5 @@ + diff --git a/src/website-next/public/window.svg b/src/website-next/public/window.svg new file mode 100644 index 00000000000..c223bf57989 --- /dev/null +++ b/src/website-next/public/window.svg @@ -0,0 +1,6 @@ + diff --git a/src/website-next/src/app/[...slug]/page.js b/src/website-next/src/app/[...slug]/page.js new file mode 100644 index 00000000000..4737a798938 --- /dev/null +++ b/src/website-next/src/app/[...slug]/page.js @@ -0,0 +1,17 @@ +// File: src/app/[...slug]/page.js + +import { getPostBySlug } from '../lib/md'; +import MdxRenderer from '../components/MdxRenderer'; + +export default async function Page({ params }) { + const parameters = await params; + const slug = parameters.slug?.join('/') ?? 'index'; + const { mdxSource, metadata } = await getPostBySlug(slug); + + return ( +
+

{metadata.title}

+ +
+ ); +} diff --git a/src/website-next/src/app/components/DocPage/DocPage.jsx b/src/website-next/src/app/components/DocPage/DocPage.jsx new file mode 100644 index 00000000000..44779fbd151 --- /dev/null +++ b/src/website-next/src/app/components/DocPage/DocPage.jsx @@ -0,0 +1,72 @@ +import React, { Component, Suspense } from 'react'; +import PropTypes from 'prop-types'; +import { Helmet } from 'react-helmet'; +import { withRouter } from 'react-router-dom'; +import Prism from 'prismjs'; + +import Header from './Header'; +import ScrollToTopOnMount from '../ScrollToTopOnMount/ScrollToTopOnMount'; +import Container from '../Grid/Container'; + +import mdStyles from '../../styles/markdown.module.scss'; + +import { getPageTitle, getSectionTitle } from './utils/title'; + +class DocPage extends Component { + componentDidMount() { + setTimeout(() => { + Prism.highlightAllUnder(document.querySelector('#main-content')); + }, 100); + } + + render() { + const { component } = this.props; + + let title = getPageTitle(component); + + const sectionTitle = getSectionTitle(component); + if (sectionTitle) { + title += ` - ${sectionTitle}`; + } + + return ( + <> + + +
+
+ + Loading, please wait... + } + > + {component.document && } + + +
+ + ); + } +} + +DocPage.propTypes = { + component: PropTypes.shape({ + section: PropTypes.string, + title: PropTypes.string, + tabs: PropTypes.arrayOf( + PropTypes.shape({ + url: PropTypes.string, + name: PropTypes.string, + component: PropTypes.func, + }), + ), + document: PropTypes.oneOfType([PropTypes.func, PropTypes.object]), + }), +}; + +DocPage.defaultProps = { + component: {}, +}; + +export default withRouter(DocPage); diff --git a/src/website-next/src/app/components/DocPage/Header.jsx b/src/website-next/src/app/components/DocPage/Header.jsx new file mode 100644 index 00000000000..662a9079e21 --- /dev/null +++ b/src/website-next/src/app/components/DocPage/Header.jsx @@ -0,0 +1,148 @@ +/* eslint-disable react/prop-types */ +import React from 'react'; +import { NavLink, withRouter } from 'react-router-dom'; +import PropTypes from 'prop-types'; +import icons from '@ecl/resources-icons/dist/sprites/icons.svg'; + +import Container from '../Grid/Container'; +import styles from './Header.module.scss'; + +import { getPageTitle, getSectionTitle } from './utils/title'; + +const navigateTab = (e, history) => { + if (e.target.value.indexOf('/playground/') !== -1) { + window.location.href = e.target.value; + return; + } + + history.push(e.target.value); +}; + +const Header = React.memo(({ component, history, location }) => { + if (!component || !component.attributes) return null; + + const pageTitle = getPageTitle(component); + const sectionTitle = getSectionTitle(component); + + return ( +
+ + {sectionTitle && ( +
{sectionTitle}
+ )} +

{pageTitle}

+ {component.attributes.isTab && ( + <> +
    + {component.parent.children + .filter((t) => t.attributes.isTab) + .map((tab) => ( +
  • + + {tab.attributes.title} + +
  • + ))} + {component.parent.attributes.playground && ( +
  • + + Playground + + +
  • + )} +
+
+ +
+ +
+
+ + )} +
+
+ ); +}); + +const componentType = PropTypes.shape({ + attributes: PropTypes.shape({ + url: PropTypes.string, + title: PropTypes.string, + isTab: PropTypes.bool, + }), +}); + +const componentDefaults = { + attributes: { + url: '', + title: '', + isTab: false, + }, +}; + +Header.propTypes = { + parent: componentType, + component: componentType, + history: PropTypes.shape({ + push: PropTypes.func, + }).isRequired, + location: PropTypes.shape({ + pathname: PropTypes.string, + }).isRequired, +}; + +Header.defaultProps = { + parent: componentDefaults, + component: componentDefaults, +}; + +export default withRouter(Header); diff --git a/src/website-next/src/app/components/DocPage/Header.module.scss b/src/website-next/src/app/components/DocPage/Header.module.scss new file mode 100644 index 00000000000..b9eb0d55d64 --- /dev/null +++ b/src/website-next/src/app/components/DocPage/Header.module.scss @@ -0,0 +1,157 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +$_header-bg-color: map.get($color, 'white'); +$_header-tabs-border-width: 2px; +$_border-color: var(--ws-c-d); +$_border-width: 1px; +$_border-color-hover: var(--ws-c-p); +$_border-color-focus: var(--ws-c-p); +$_border-width-focus: 2px; +$_arrow-width: 2.75rem; + +.header { + background-color: $_header-bg-color; + margin: 0; + padding-top: var(--ws-s-2xl); +} + +.header__page-title { + color: var(--ws-c-d); + font: var(--ws-f-4xl); + margin: 0; + padding-bottom: var(--ws-s-2xl); +} + +.header__section-header { + color: var(--ws-c-d); + font: var(--ws-f-m); + margin: 0 0 var(--ws-s-xs); + padding: 0; +} + +.header__tabs { + display: none; + flex-direction: row; + flex-wrap: nowrap; + list-style: none; + margin: 0; + padding: 0; + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + display: flex; + } +} + +.header__tabs-item { + border-bottom: $_header-tabs-border-width solid var(--ws-c-n-60); + color: var(--ws-c-d); + display: flex; + font: var(--ws-f-m); + padding: var(--ws-s-xs) var(--ws-s-m); + text-decoration: none; +} + +.header__tabs-item:hover, +.header__tabs-item:focus { + background-color: var(--ws-c-n-40); + border-bottom-color: var(--ws-c-d-80); +} + +.header__tabs-item--active { + border-bottom-color: var(--ws-c-p); + font-weight: map.get($theme, 'font-weight', 'bold'); +} + +.header__tabs-icon { + align-self: center; + height: 0.75rem; + margin-left: var(--ws-s-xs); + width: 0.75rem; +} + +.select__container { + background-color: map.get($theme, 'color', 'white'); + display: inline-flex; + margin-bottom: var(--ws-s-s); + position: relative; + width: 100%; + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + display: none; + } +} + +.select { + appearance: none; + background-color: transparent; + border: $_border-width solid $_border-color; + border-radius: 0; + box-sizing: border-box; + color: var(--ws-c-d); + display: block; + font: var(--ws-f-m); + margin: 0; + width: 100%; + padding: calc(var(--ws-s-s) - #{$_border-width}) + calc(var(--ws-s-s) + #{$_arrow-width} - #{$_border-width}) + calc(var(--ws-s-s) - #{$_border-width}) + calc(var(--ws-s-s) - #{$_border-width}); + z-index: 1; + + &::-ms-expand { + display: none; + } + + &:hover { + border-color: $_border-color-hover; + } + + &:focus { + border-color: $_border-color-focus; + border-width: $_border-width-focus; + outline: none; + padding: calc(var(--ws-s-s) - #{$_border-width-focus}) + calc(var(--ws-s-s) + #{$_arrow-width} - #{$_border-width-focus}) + calc(var(--ws-s-s) - #{$_border-width-focus}) + calc(var(--ws-s-s) - #{$_border-width-focus}); + } +} + +.select__icon { + align-items: center; + background-color: $_border-color; + display: flex; + height: 100%; + justify-content: center; + position: absolute; + right: 0; + top: 0; + width: $_arrow-width; + z-index: 0; +} + +.select:hover + .icon { + background-color: $_border-color-hover; +} + +.select:focus + .icon { + background-color: $_border-color; +} + +.select__icon-shape { + fill: map.get($theme, 'color', 'white'); + height: 1.25rem; + transform: rotate(180deg); + width: 1.25rem; +} +// stylelint-disable-next-line media-query-no-invalid +@media screen and (min-width: map.get($theme, 'breakpoint', 'm')) { + .select__container { + display: none; + } + + .header__tabs { + display: flex; + } +} diff --git a/src/website-next/src/app/components/DocPage/utils/title.js b/src/website-next/src/app/components/DocPage/utils/title.js new file mode 100644 index 00000000000..a0d631d1598 --- /dev/null +++ b/src/website-next/src/app/components/DocPage/utils/title.js @@ -0,0 +1,40 @@ +export const getTitle = (component) => { + if ( + component && + component.attributes && + component.attributes.level > 0 && + component.attributes.title + ) { + return component.attributes.title; + } + + return ''; +}; + +export const getPageTitle = (component) => { + if (component.attributes.isTab) { + if (component.parent) { + return getTitle(component.parent); + } + + return ''; + } + + return getTitle(component); +}; + +export const getSectionTitle = (component) => { + if (component.attributes.isTab) { + if (component.parent && component.parent.parent) { + return getTitle(component.parent.parent); + } + + return ''; + } + + if (component.parent) { + return getTitle(component.parent); + } + + return getTitle(component); +}; diff --git a/src/website-next/src/app/components/Example/Example.jsx b/src/website-next/src/app/components/Example/Example.jsx new file mode 100644 index 00000000000..cc83f7cdc72 --- /dev/null +++ b/src/website-next/src/app/components/Example/Example.jsx @@ -0,0 +1,30 @@ +import React from 'react'; + +import Container from '../Grid/Container'; +import mdStyles from '../../styles/markdown.module.scss'; +import styles from './Example.module.scss'; +import utilityStyles from '../../styles/utilities.module.scss'; + +const handleClick = () => window.history.back(); + +const Example = React.memo(() => ( +
+ + {' '} +

Example page

+

+ This page is established to be used for illustrative examples in + documents. +

+ +
+
+)); + +export default Example; diff --git a/src/website-next/src/app/components/Example/Example.module.scss b/src/website-next/src/app/components/Example/Example.module.scss new file mode 100644 index 00000000000..4f5921dda59 --- /dev/null +++ b/src/website-next/src/app/components/Example/Example.module.scss @@ -0,0 +1,27 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +$_outline-width: 2px; + +.button { + background: none; + border-width: 0; + box-sizing: border-box; + color: var(--ws-c-p); + font: var(--ws-f-m); + font-weight: map.get($theme, 'font-weight', 'bold'); + margin: 0; + padding: var(--ws-s-s) var(--ws-s-m); + text-decoration: none; + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } + + &:focus { + outline: $_outline-width solid var(--ws-c-s); + outline-offset: -($_outline-width); + } +} diff --git a/src/website-next/src/app/components/Grid/Col.jsx b/src/website-next/src/app/components/Grid/Col.jsx new file mode 100644 index 00000000000..9a5a34b0120 --- /dev/null +++ b/src/website-next/src/app/components/Grid/Col.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +import grid from './grid.module.scss'; +import utilities from '../../styles/utilities.module.scss'; + +const Col = React.memo( + ({ col, spacing, flex, className, children, ...props }) => { + const colClasses = col + .split(' ') + .map((c) => grid[`ecl-col-${c}`]) + .join(' '); + + const spacingClasses = spacing + .split(' ') + .map((sp) => utilities[sp]) + .join(' '); + + const classNames = classnames( + className, + grid['ecl-col'], + colClasses, + spacingClasses, + { [utilities['d-flex']]: flex }, + ); + + return ( +
+ {children} +
+ ); + }, +); + +Col.propTypes = { + col: PropTypes.string, + spacing: PropTypes.string, + flex: PropTypes.bool, + className: PropTypes.string, + children: PropTypes.node, +}; + +Col.defaultProps = { + col: '', + spacing: '', + flex: false, + className: '', + children: null, +}; + +export default Col; diff --git a/src/website-next/src/app/components/Grid/Container.jsx b/src/website-next/src/app/components/Grid/Container.jsx new file mode 100644 index 00000000000..ad141f772c6 --- /dev/null +++ b/src/website-next/src/app/components/Grid/Container.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +import grid from './grid.module.scss'; +import utilities from '../../styles/utilities.module.scss'; + +const Container = React.memo(({ spacing, className, children, ...props }) => { + const spacingClasses = spacing + .split(' ') + .map((sp) => utilities[sp]) + .join(' '); + + const classNames = classnames( + className, + grid['ecl-container'], + spacingClasses, + ); + + return ( +
+ {children} +
+ ); +}); + +Container.propTypes = { + spacing: PropTypes.string, + className: PropTypes.string, + children: PropTypes.node, +}; + +Container.defaultProps = { + spacing: '', + className: '', + children: null, +}; + +export default Container; diff --git a/src/website-next/src/app/components/Grid/Row.jsx b/src/website-next/src/app/components/Grid/Row.jsx new file mode 100644 index 00000000000..07698501084 --- /dev/null +++ b/src/website-next/src/app/components/Grid/Row.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +import grid from './grid.module.scss'; +import utilities from '../../styles/utilities.module.scss'; + +const Row = React.memo(({ spacing, className, children, ...props }) => { + // If spacing is null/undefined, treat it as an empty string. + const safeSpacing = spacing || ''; + const spacingClasses = safeSpacing + .split(' ') + .map((sp) => utilities[sp] || '') + .join(' '); + + const classNames = classnames(className, grid['ecl-row'], spacingClasses); + + return ( +
+ {children} +
+ ); +}); + +Row.propTypes = { + spacing: PropTypes.string, + className: PropTypes.string, + children: PropTypes.node, +}; + +Row.defaultProps = { + spacing: '', + className: '', + children: null, +}; + +export default Row; diff --git a/src/website-next/src/app/components/Grid/grid.module.scss b/src/website-next/src/app/components/Grid/grid.module.scss new file mode 100644 index 00000000000..64eee39da3c --- /dev/null +++ b/src/website-next/src/app/components/Grid/grid.module.scss @@ -0,0 +1,19 @@ +@use '@ecl/theme-ec/maps/layout' with ( + $breakpoint: ( + 'xs': 0, + 's': 480px, + 'm': 768px, + 'l': 1140px, + 'xl': 1500px, + ), + $container: ( + 's': 480px, + 'm': 768px, + 'l': 768px, + 'xl': 1140px, + ) +); +@use '@ecl/theme-ec/theme' as theme; +@use '@ecl/grid/grid' with ( + $theme: theme.$theme +); diff --git a/src/website-next/src/app/components/MainContainer/MainContainer.jsx b/src/website-next/src/app/components/MainContainer/MainContainer.jsx new file mode 100644 index 00000000000..ab4b65c1b90 --- /dev/null +++ b/src/website-next/src/app/components/MainContainer/MainContainer.jsx @@ -0,0 +1,28 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import styles from './MainContainer.module.scss'; + +const MainContainer = React.memo(({ children, forceRefresh, sidebarOpen }) => ( +
+ {children} +
+)); + +MainContainer.propTypes = { + children: PropTypes.node, + sidebarOpen: PropTypes.bool, + forceRefresh: PropTypes.bool, +}; + +MainContainer.defaultProps = { + children: null, + sidebarOpen: false, + forceRefresh: false, +}; + +export default MainContainer; diff --git a/src/website-next/src/app/components/MainContainer/MainContainer.module.scss b/src/website-next/src/app/components/MainContainer/MainContainer.module.scss new file mode 100644 index 00000000000..3c6cabb5a0c --- /dev/null +++ b/src/website-next/src/app/components/MainContainer/MainContainer.module.scss @@ -0,0 +1,18 @@ +.container { + box-sizing: border-box; + max-width: 100%; + overflow-x: hidden; + transition: margin-left 300ms ease; + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + @media screen and (width >= 1140px) { + margin-left: 15rem; + } + } +} + +.container--with-sidebar { + @media screen and (width >= 1140px) { + margin-left: 15rem; + } +} diff --git a/src/website-next/src/app/components/MdxRenderer.jsx b/src/website-next/src/app/components/MdxRenderer.jsx new file mode 100644 index 00000000000..e2e8897133b --- /dev/null +++ b/src/website-next/src/app/components/MdxRenderer.jsx @@ -0,0 +1,8 @@ +'use client'; + +import { MDXRemote } from 'next-mdx-remote'; +import { mdxComponents } from '../mdx-components'; + +export default function MdxRenderer({ source }) { + return ; +} diff --git a/src/website-next/src/app/components/Navigation/LinkGroup.jsx b/src/website-next/src/app/components/Navigation/LinkGroup.jsx new file mode 100644 index 00000000000..1efd71e9d54 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/LinkGroup.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withRouter } from 'react-router-dom'; + +import styles from './LinkGroup.module.scss'; +import LinkList from './LinkList'; // eslint-disable-line import/no-cycle + +const LinkGroup = React.memo(({ pages, level, showStatus, group }) => ( + <> + {group} + + +)); + +LinkGroup.propTypes = { + location: PropTypes.shape({ + pathname: PropTypes.string, + }).isRequired, + pages: PropTypes.array.isRequired, + showStatus: PropTypes.bool, + level: PropTypes.number, + group: PropTypes.string, +}; + +LinkGroup.defaultProps = { + showStatus: false, + level: 0, + group: '', +}; + +export default withRouter(LinkGroup); diff --git a/src/website-next/src/app/components/Navigation/LinkGroup.module.scss b/src/website-next/src/app/components/Navigation/LinkGroup.module.scss new file mode 100644 index 00000000000..a77e7d6a27d --- /dev/null +++ b/src/website-next/src/app/components/Navigation/LinkGroup.module.scss @@ -0,0 +1,11 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +.group { + color: var(--ws-c-d-80); + display: block; + font: var(--ws-f-m); + font-weight: map.get($theme, 'font-weight', 'bold'); + margin: 0; + padding: var(--ws-s-s) var(--ws-s-m) var(--ws-s-s) var(--ws-s-xl); +} diff --git a/src/website-next/src/app/components/Navigation/LinkList.jsx b/src/website-next/src/app/components/Navigation/LinkList.jsx new file mode 100644 index 00000000000..cc8344b0042 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/LinkList.jsx @@ -0,0 +1,74 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withRouter } from 'react-router-dom'; + +import SingleLink from './SingleLink'; +import LinkGroup from './LinkGroup'; // eslint-disable-line import/no-cycle +import LinkSection from './LinkSection'; // eslint-disable-line import/no-cycle +import styles from './LinkList.module.scss'; + +const LinkList = React.memo( + ({ pages, level, showStatus, 'aria-hidden': ariaHidden }) => ( +
    + {pages + .filter((p) => p.attributes.hidden !== true) + .filter((p) => p.attributes.isTab !== true) + .map((p) => { + const hasChildren = + p.children && + p.children.length > 0 && + p.children.filter( + (childPage) => childPage.attributes.isTab !== true, + ).length > 0; + return ( +
  • + {!hasChildren ? ( + + ) : ( + <> + {p.attributes.type === 'group' ? ( + + ) : ( + + )} + + )} +
  • + ); + })} +
+ ), +); + +LinkList.propTypes = { + location: PropTypes.shape({ + pathname: PropTypes.string, + }).isRequired, + pages: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + showStatus: PropTypes.bool, + level: PropTypes.number, + 'aria-hidden': PropTypes.bool, +}; + +LinkList.defaultProps = { + showStatus: false, + level: 0, + 'aria-hidden': false, +}; + +export default withRouter(LinkList); diff --git a/src/website-next/src/app/components/Navigation/LinkList.module.scss b/src/website-next/src/app/components/Navigation/LinkList.module.scss new file mode 100644 index 00000000000..532f7be139c --- /dev/null +++ b/src/website-next/src/app/components/Navigation/LinkList.module.scss @@ -0,0 +1,17 @@ +.list { + list-style-type: none; + margin: 0; + padding: 0; + + &[aria-hidden='true'] { + display: none; + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + display: block; + } + } + + &[data-level='0'] { + margin-top: var(--ws-s-xl); + } +} diff --git a/src/website-next/src/app/components/Navigation/LinkSection.jsx b/src/website-next/src/app/components/Navigation/LinkSection.jsx new file mode 100644 index 00000000000..58459ca8af2 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/LinkSection.jsx @@ -0,0 +1,110 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { Link, withRouter } from 'react-router-dom'; + +import icons from '@ecl/resources-icons/dist/sprites/icons.svg'; +import styles from './LinkSection.module.scss'; +import LinkList from './LinkList'; // eslint-disable-line import/no-cycle + +class LinkSection extends Component { + constructor(props) { + super(props); + + this.state = { + pathname: props.location.pathname, + isOpen: props.location.pathname.indexOf(props.attributes.url) === 0, + }; + + this.toggleSection = this.toggleSection.bind(this); + } + + static getDerivedStateFromProps(nextProps, prevState) { + if ( + prevState.pathname !== nextProps.location.pathname && + nextProps.location.pathname.indexOf(nextProps.attributes.url) === 0 + ) { + return { pathname: nextProps.location.pathname, isOpen: true }; + } + + return { + pathname: nextProps.location.pathname, + }; + } + + toggleSection() { + this.setState((state) => ({ + isOpen: !state.isOpen, + })); + } + + render() { + const { pages, level, showStatus, section, attributes } = this.props; + + const { isOpen } = this.state; + + const to = attributes.defaultTab + ? `${attributes.url}${attributes.defaultTab}/` + : attributes.url; + + return ( + <> + + + {section} + + + + + + ); + } +} + +LinkSection.propTypes = { + location: PropTypes.shape({ + pathname: PropTypes.string, + }).isRequired, + attributes: PropTypes.shape({ + url: PropTypes.string, + defaultTab: PropTypes.string, + }).isRequired, + pages: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + showStatus: PropTypes.bool, + level: PropTypes.number, + section: PropTypes.string, +}; + +LinkSection.defaultProps = { + showStatus: false, + level: 0, + section: '', +}; + +export default withRouter(LinkSection); diff --git a/src/website-next/src/app/components/Navigation/LinkSection.module.scss b/src/website-next/src/app/components/Navigation/LinkSection.module.scss new file mode 100644 index 00000000000..7ad48bdbc8a --- /dev/null +++ b/src/website-next/src/app/components/Navigation/LinkSection.module.scss @@ -0,0 +1,83 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +.group-list-parent { + box-sizing: border-box; + display: flex; + align-items: stretch; +} + +.group-list-item { + background-color: var(--ws-c-n-20); + border-width: 0; + box-sizing: border-box; + color: var(--ws-c-d); + display: block; + font: var(--ws-f-m); + font-weight: map.get($theme, 'font-weight', 'bold'); + margin: 0; + padding: var(--ws-s-s) var(--ws-s-xs) var(--ws-s-s) var(--ws-s-m); + text-align: left; + text-decoration: none; + text-transform: capitalize; + width: 100%; + + &.level-0 { + padding: var(--ws-s-s) var(--ws-s-xs) var(--ws-s-s) var(--ws-s-m); + } + + &.level-1 { + padding: var(--ws-s-s) var(--ws-s-xs) var(--ws-s-s) var(--ws-s-xl); + } + + &.level-2 { + padding: var(--ws-s-s) var(--ws-s-xs) var(--ws-s-s) var(--ws-s-3xl); + } +} + +.group-list-item:hover, +.group-list-item:focus { + background-color: var(--ws-c-n-60); + outline: none; +} + +.group-list-item:active { + background-color: var(--ws-c-n-80); +} + +.button { + appearance: none; + background-color: transparent; + border-width: 0; + padding: var(--ws-s-s); +} + +.button:hover, +.button:focus { + background-color: var(--ws-c-n-60); + cursor: pointer; + outline: none; +} + +.button:active { + background-color: var(--ws-c-n-80); +} + +.icon { + display: block; + height: 0.875rem; + width: 0.875rem; + transition: transform 200ms ease-in-out; +} + +.icon-rotate-90 { + transform: rotate(90deg); +} + +.icon-rotate-180 { + transform: rotate(180deg); +} +/* stylelint-disable-next-line selector-pseudo-class-no-unknown */ +:global(.no-js) .icon { + transform: rotate(180deg); +} diff --git a/src/website-next/src/app/components/Navigation/Navigation.jsx b/src/website-next/src/app/components/Navigation/Navigation.jsx new file mode 100644 index 00000000000..97b98a23f45 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/Navigation.jsx @@ -0,0 +1,101 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Link, NavLink, withRouter } from 'react-router-dom'; + +import LinkList from './LinkList'; +import styles from './Navigation.module.scss'; + +const Navigation = React.memo( + ({ + sidebarOpen, + onToggleSidebar, + pages, + prefix, + forceRefresh, + isLoading, + }) => ( + + ), +); + +Navigation.propTypes = { + sidebarOpen: PropTypes.bool, + onToggleSidebar: PropTypes.func, + pages: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + prefix: PropTypes.string.isRequired, + forceRefresh: PropTypes.bool, + isLoading: PropTypes.bool, +}; + +Navigation.defaultProps = { + sidebarOpen: true, + onToggleSidebar: () => {}, + forceRefresh: false, + isLoading: false, +}; + +// Use withRouter to update links when they become active +export default withRouter(Navigation); diff --git a/src/website-next/src/app/components/Navigation/Navigation.module.scss b/src/website-next/src/app/components/Navigation/Navigation.module.scss new file mode 100644 index 00000000000..21c155ed600 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/Navigation.module.scss @@ -0,0 +1,219 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +$_nav-width: 15rem; +$_nav-logo-height: 2rem; +$_nav-logo-max-width: 10rem; +$_nav-toggle-size: 2.75rem; // 44px +$_nav-toggle-bar-width: 1.5rem; // 24px +$_nav-toggle-bar-height: 0.125rem; // 2px +$_nav-toggle-bar-spacing-between: 0.375rem; + +.nav { + background-color: var(--ws-c-n-20); + box-shadow: 0 2px 4px rgb(0 0 0 / 0.4); + bottom: 0; + left: 0; + overflow: auto; + position: fixed; + top: 0; + transition: transform 300ms ease; + width: $_nav-width; + z-index: 50; + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + position: static; + width: 100%; + + @media screen and (width >= 1140px) { + position: fixed; + width: $_nav-width; + } + } +} + +.nav--closed { + overflow: visible; + transform: translate(-$_nav-width, 0); + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + transform: translate(0, 0); + } +} + +.header { + background-color: map.get($theme, 'color', 'white'); + border-bottom: 2px solid var(--ws-c-n-60); + padding: var(--ws-s-m) var(--ws-s-s) var(--ws-s-m) var(--ws-s-m); +} + +.version { + background-color: var(--ws-c-p-20); + border-radius: 12px; + color: var(--ws-c-d); + display: inline-block; + font: var(--ws-f-s); + padding: var(--ws-s-2xs) var(--ws-s-s); +} + +.logo { + background-image: url('~@ecl/preset-ec/dist/images/logo/positive/logo-ec--en.svg'); + background-position: 0 50%; + background-repeat: no-repeat; + background-size: contain; + display: block; + height: $_nav-logo-height; + margin-top: var(--ws-s-l); + max-width: $_nav-logo-max-width; +} + +.logo--eu { + background-image: url('~@ecl/preset-eu/dist/images/logo/standard-version/positive/logo-eu--en.svg'); +} + +.logo-sr { + display: none; +} + +.title { + color: var(--ws-c-d); + font: var(--ws-f-m); + margin-top: var(--ws-s-s); +} + +.system-list { + display: flex; + list-style-type: none; + margin: 0; + padding: 0; +} + +.system-list-item { + flex-grow: 1; + text-align: center; +} + +.system-list-item-link { + background-color: var(--ws-c-n-80); + color: var(--ws-c-d); + display: block; + font: var(--ws-f-l); + font-weight: map.get($theme, 'font-weight', 'bold'); + padding: var(--ws-s-s) 0; + text-decoration: none; + + &:hover, + &:focus { + background-color: var(--ws-c-n-60); + outline: none; + } +} + +.system-list-item-link--selected { + background-color: var(--ws-c-n-20); +} + +.loading { + color: var(--ws-c-d); + font: var(--ws-f-m); + padding: var(--ws-s-s); +} + +/* Burger */ + +.button-toggle { + align-items: center; + background-color: map.get($theme, 'color', 'white'); + border: 1px solid transparent; + color: var(--ws-c-d); + display: flex; + justify-content: center; + height: $_nav-toggle-size; + position: absolute; + right: 0; + top: 0; + transition: transform 300ms; + width: $_nav-toggle-size; + z-index: 51; + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + :global(.no-js) & { + display: none; + } + + &:hover { + background-color: var(--ws-c-p-20); + border-color: var(--ws-c-d-80); + cursor: pointer; + } +} + +.button-toggle--closed { + transform: translate($_nav-toggle-size); +} + +.hamburger-inner { + display: block; + margin-top: -($_nav-toggle-bar-height * 0.5); +} + +.hamburger-inner, +.hamburger-inner::before, +.hamburger-inner::after { + background-color: var(--ws-c-d-80); + height: $_nav-toggle-bar-height; + position: absolute; + width: $_nav-toggle-bar-width; +} + +.hamburger-inner::before, +.hamburger-inner::after { + content: ''; + display: block; +} + +.hamburger-inner::before { + top: -($_nav-toggle-bar-spacing-between + $_nav-toggle-bar-height); +} + +.hamburger-inner::after { + bottom: -($_nav-toggle-bar-spacing-between + $_nav-toggle-bar-height); +} + +.button-toggle .hamburger-inner { + transition-duration: 0.075s; + transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.button-toggle .hamburger-inner::before { + transition: + top 0.075s 0.12s ease, + opacity 0.075s ease; +} + +.button-toggle--open .hamburger-inner { + transform: rotate(45deg); + transition-delay: 0.12s; + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); +} + +.button-toggle--open .hamburger-inner::before { + opacity: 0; + top: 0; + transition: + top 0.075s ease, + opacity 0.075s 0.12s ease; +} + +.button-toggle--open .hamburger-inner::after { + bottom: 0; + transform: rotate(-90deg); + transition: + bottom 0.075s ease, + transform 0.075s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1); +} + +.button-toggle--closed .hamburger-inner::after { + transition: + bottom 0.075s 0.12s ease, + transform 0.075s cubic-bezier(0.55, 0.055, 0.675, 0.19); +} diff --git a/src/website-next/src/app/components/Navigation/NavigationLink.jsx b/src/website-next/src/app/components/Navigation/NavigationLink.jsx new file mode 100644 index 00000000000..3cbfec2baa6 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/NavigationLink.jsx @@ -0,0 +1,62 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { NavLink, withRouter } from 'react-router-dom'; + +class NavigationLink extends Component { + constructor(props) { + super(props); + this.isActive = this.isActive.bind(this); + + // The URL is not supposed to change + // Thus we can compute it in the constructor and save it + const { meta } = props; + this.to = meta.defaultTab ? `${meta.url}${meta.defaultTab}/` : meta.url; + } + + // Only update if "isActive" state has changed + shouldComponentUpdate(nextProps) { + const { location, meta } = this.props; + const nextLocation = nextProps.location; + const nextUrl = nextProps.meta.url; + + return ( + location.pathname.indexOf(meta.url) !== + nextLocation.pathname.indexOf(nextUrl) + ); + } + + // Custom matcher (ignore default tab) + isActive(match, location) { + const { meta } = this.props; + return location.pathname.indexOf(meta.url) === 0; + } + + render() { + // Exclude some properties not needed by NavLink + const { history, location, match, meta, staticContext, ...props } = + this.props; + + return ; + } +} + +NavigationLink.propTypes = { + history: PropTypes.shape(), + match: PropTypes.shape(), + staticContext: PropTypes.shape(), + location: PropTypes.shape({ + pathname: PropTypes.string, + }).isRequired, + meta: PropTypes.shape({ + url: PropTypes.string.isRequired, + defaultTab: PropTypes.string, + }).isRequired, +}; + +NavigationLink.defaultProps = { + history: {}, + match: {}, + staticContext: {}, +}; + +export default withRouter(NavigationLink); diff --git a/src/website-next/src/app/components/Navigation/SingleLink.jsx b/src/website-next/src/app/components/Navigation/SingleLink.jsx new file mode 100644 index 00000000000..6bd63627aed --- /dev/null +++ b/src/website-next/src/app/components/Navigation/SingleLink.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withRouter } from 'react-router-dom'; +// import classnames from 'classnames'; + +import NavigationLink from './NavigationLink'; +import styles from './SingleLink.module.scss'; + +const SingleLink = React.memo(({ page, level }) => ( + + {/* page.status && ( + + ) */} + {page.title} + +)); + +SingleLink.propTypes = { + location: PropTypes.shape({ + pathname: PropTypes.string, + }).isRequired, + page: PropTypes.shape({ + url: PropTypes.string, + title: PropTypes.string, + status: PropTypes.string, + }).isRequired, + level: PropTypes.number, +}; + +SingleLink.defaultProps = { + level: 0, +}; + +export default withRouter(SingleLink); diff --git a/src/website-next/src/app/components/Navigation/SingleLink.module.scss b/src/website-next/src/app/components/Navigation/SingleLink.module.scss new file mode 100644 index 00000000000..4b0da4a8f81 --- /dev/null +++ b/src/website-next/src/app/components/Navigation/SingleLink.module.scss @@ -0,0 +1,56 @@ +.page-list-item { + align-items: center; + background-color: var(--ws-c-n-20); + border-width: 0; + color: var(--ws-c-d); + display: flex; + font: var(--ws-f-m); + margin: 0; + text-decoration: none; + + &.level-0 { + padding: var(--ws-s-s) var(--ws-s-m); + } + + &.level-1 { + padding: var(--ws-s-s) var(--ws-s-m) var(--ws-s-s) var(--ws-s-xl); + } + + &.level-2 { + padding: var(--ws-s-s) var(--ws-s-m) var(--ws-s-s) var(--ws-s-3xl); + } + + &.level-3 { + padding: var(--ws-s-s) var(--ws-s-m) var(--ws-s-s) var(--ws-s-4xl); + } +} + +.page-list-item:hover, +.page-list-item:focus { + background-color: var(--ws-c-n-60); + outline: none; +} + +.page-list-item:active { + background-color: var(--ws-c-n-80); +} + +.page-list-item--active { + border-left: 4px solid var(--ws-c-p); + + &.level-0 { + padding-left: calc(var(--ws-s-m) - 4px); + } + + &.level-1 { + padding-left: calc(var(--ws-s-xl) - 4px); + } + + &.level-2 { + padding-left: calc(var(--ws-s-3xl) - 4px); + } + + &.level-3 { + padding-left: calc(var(--ws-s-4xl) - 4px); + } +} diff --git a/src/website-next/src/app/components/PageNotFound/PageNotFound.jsx b/src/website-next/src/app/components/PageNotFound/PageNotFound.jsx new file mode 100644 index 00000000000..3704edd3979 --- /dev/null +++ b/src/website-next/src/app/components/PageNotFound/PageNotFound.jsx @@ -0,0 +1,20 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import Container from '../Grid/Container'; + +const PageNotFound = React.memo(({ children }) => ( +
+ {children} +
+)); + +PageNotFound.propTypes = { + children: PropTypes.node, +}; + +PageNotFound.defaultProps = { + children: null, +}; + +export default PageNotFound; diff --git a/src/website-next/src/app/components/ScrollToTopOnMount/ScrollToTopOnMount.jsx b/src/website-next/src/app/components/ScrollToTopOnMount/ScrollToTopOnMount.jsx new file mode 100644 index 00000000000..e582ee4b308 --- /dev/null +++ b/src/website-next/src/app/components/ScrollToTopOnMount/ScrollToTopOnMount.jsx @@ -0,0 +1,15 @@ +import React from 'react'; + +/* Scroll restoration component */ + +class ScrollToTopOnMount extends React.Component { + componentDidMount() { + window.scrollTo(0, 0); + } + + render() { + return null; + } +} + +export default ScrollToTopOnMount; diff --git a/src/website-next/src/app/components/SimplePage/SimplePage.jsx b/src/website-next/src/app/components/SimplePage/SimplePage.jsx new file mode 100644 index 00000000000..e4d83d9aa47 --- /dev/null +++ b/src/website-next/src/app/components/SimplePage/SimplePage.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import ScrollToTopOnMount from '../ScrollToTopOnMount/ScrollToTopOnMount'; + +import Container from '../Grid/Container'; + +const HomePage = React.memo(({ children }) => ( +
+ + {children} +
+)); + +HomePage.propTypes = { + children: PropTypes.node, +}; + +HomePage.defaultProps = { + children: null, +}; + +export default HomePage; diff --git a/src/website-next/src/app/components/SplashPage/LogoLink.jsx b/src/website-next/src/app/components/SplashPage/LogoLink.jsx new file mode 100644 index 00000000000..df5e1b724c9 --- /dev/null +++ b/src/website-next/src/app/components/SplashPage/LogoLink.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { Link } from 'react-router-dom'; + +import styles from './LogoLink.module.scss'; + +const LogoLink = React.memo(({ system, logo, children, ...props }) => ( + + {logo ? ( + + ) : ( + children + )} + +)); + +LogoLink.propTypes = { + system: PropTypes.string, + logo: PropTypes.string, + children: PropTypes.node, +}; + +LogoLink.defaultProps = { + system: 'ec', + logo: '', + children: '', +}; + +export default LogoLink; diff --git a/src/website-next/src/app/components/SplashPage/LogoLink.module.scss b/src/website-next/src/app/components/SplashPage/LogoLink.module.scss new file mode 100644 index 00000000000..cd4a187690c --- /dev/null +++ b/src/website-next/src/app/components/SplashPage/LogoLink.module.scss @@ -0,0 +1,29 @@ +.logo-link { + align-items: center; + background-color: var(--ws-c-n-40); + border: 1px solid var(--ws-c-n-80); + box-sizing: border-box; + display: flex; + flex-grow: 1; + justify-content: center; + padding: calc(var(--ws-s-xl) - 1px); +} + +.logo-link:hover, +.logo-link:focus { + border: 2px solid var(--ws-c-p); + outline: none; + padding: calc(var(--ws-s-xl) - 2px); +} + +.logo-link--ec img { + max-height: 5rem; + max-width: 20rem; + width: 100%; +} + +.logo-link--eu img { + max-height: 3rem; + max-width: 20rem; + width: 100%; +} diff --git a/src/website-next/src/app/components/SplashPage/SplashPage.jsx b/src/website-next/src/app/components/SplashPage/SplashPage.jsx new file mode 100644 index 00000000000..a5bd5bd3763 --- /dev/null +++ b/src/website-next/src/app/components/SplashPage/SplashPage.jsx @@ -0,0 +1,58 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +// Import resources +import { logoEcEn } from '@ecl/preset-ec/dist/images/logo/positive/esm-export'; +import { logoEuEn } from '@ecl/preset-eu/dist/images/logo/standard-version/positive/esm-export'; +import LogoLink from './LogoLink'; +import ScrollToTopOnMount from '../ScrollToTopOnMount/ScrollToTopOnMount'; + +import Container from '../Grid/Container'; +import Row from '../Grid/Row'; +import Col from '../Grid/Col'; + +import utilities from '../../styles/utilities.module.scss'; +import styles from './SplashPage.module.scss'; + +const SplashPage = React.memo(({ children }) => ( +
+ + + {children} + + + + + + + + + +
+)); + +SplashPage.propTypes = { + children: PropTypes.node, +}; + +SplashPage.defaultProps = { + children: null, +}; + +export default SplashPage; diff --git a/src/website-next/src/app/components/SplashPage/SplashPage.module.scss b/src/website-next/src/app/components/SplashPage/SplashPage.module.scss new file mode 100644 index 00000000000..2a0c3515605 --- /dev/null +++ b/src/website-next/src/app/components/SplashPage/SplashPage.module.scss @@ -0,0 +1,22 @@ +.splash-page { + background-color: var(--ws-c-n-40); + box-sizing: border-box; + min-height: 100vh; + padding: var(--ws-s-4xl) 0 var(--ws-s-xl); +} + +.splash-page-actions-row { + margin-top: var(--ws-s-xl); + + @media screen and (width >= 768px) { + margin-top: var(--ws-s-4xl); + } +} + +.splash-page-actions-row .splash-page-actions-col + .splash-page-actions-col { + margin-top: var(--ws-s-m); + + @media screen and (width >= 768px) { + margin-top: 0; + } +} diff --git a/src/website-next/src/app/layout.js b/src/website-next/src/app/layout.js new file mode 100644 index 00000000000..34462bfb022 --- /dev/null +++ b/src/website-next/src/app/layout.js @@ -0,0 +1,7 @@ +export default function RootLayout({ children }) { + return ( + + {children} + + ); +} diff --git a/src/website-next/src/app/lib/md.ts b/src/website-next/src/app/lib/md.ts new file mode 100644 index 00000000000..a42a63f2678 --- /dev/null +++ b/src/website-next/src/app/lib/md.ts @@ -0,0 +1,71 @@ +// File: src/lib/markdown.js + +import fs from 'fs'; +import path from 'path'; +import matter from 'gray-matter'; +import { serialize } from 'next-mdx-remote/serialize'; // If you still use next-mdx-remote + +// Use process.cwd() so this works regardless of where the code is called. +const contentDir = path.join(process.cwd(), 'src', 'content'); + +/** + * Recursively collect any subfolder that contains an index.md or index.mdx, + * returning an array of "slugs" (relative folder paths). + */ +export function getAllSlugs(dir = contentDir, basePath = '') { + return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const fullPath = path.join(dir, entry.name); + const relativePath = path.join(basePath, entry.name); + + // If this is a directory, check if it has index.md or index.mdx. + if (entry.isDirectory()) { + const mdFile = path.join(fullPath, 'index.md'); + const mdxFile = path.join(fullPath, 'index.mdx'); + + if (fs.existsSync(mdFile) || fs.existsSync(mdxFile)) { + // If a folder has either 'index.md' or 'index.mdx', treat the folder itself as a "slug" + return relativePath; + } else { + // Otherwise, recurse into it + return getAllSlugs(fullPath, relativePath); + } + } + return []; + }); +} + +/** + * Given a slug (which is essentially the folder name under src/content), + * load either index.mdx or index.md, parse frontmatter, and return the data. + */ +export async function getPostBySlug(slug) { + // Build absolute paths for mdx or md + const mdxPath = path.join(contentDir, slug, 'index.mdx'); + const mdPath = path.join(contentDir, slug, 'index.md'); + + // Check which one actually exists + const isMDX = fs.existsSync(mdxPath); + const filePath = isMDX ? mdxPath : fs.existsSync(mdPath) ? mdPath : null; + + if (!filePath) { + throw new Error(`File not found for slug: ${slug}`); + } + console.log(mdxPath); + + // Read file content + const fileContent = fs.readFileSync(filePath, 'utf8').trim(); + if (!fileContent) { + throw new Error(`File is empty: ${slug}`); + } + + // Extract front matter + const { data, content } = matter(fileContent); + + const mdxSource = await serialize(content, { scope: data }); + + return { + slug, + metadata: data, + mdxSource, + }; +} diff --git a/src/website-next/src/app/mdx-components.js b/src/website-next/src/app/mdx-components.js new file mode 100644 index 00000000000..2bd4717c78a --- /dev/null +++ b/src/website-next/src/app/mdx-components.js @@ -0,0 +1,175 @@ +'use client'; + +import styles from './styles/markdown.module.scss'; + +import ColorLayout from '../website-components/color/Layout'; +import ColorPalette from '../website-components/color/Palette'; +import ColorPaletteItem from '../website-components/color/PaletteItem'; +import Link from '../website-components/Link/Link'; +import Thumbnail from '../website-components/Thumbnail/Thumbnail'; + +import Col from './components/Grid/Col'; +import Container from './components/Grid/Container'; +import Row from './components/Grid/Row'; + +function H1({ children, className, ...props }) { + return ( +

+ {children} +

+ ); +} +function H2({ children, className, ...props }) { + return ( +

+ {children} +

+ ); +} +function H3({ children, className, ...props }) { + return ( +

+ {children} +

+ ); +} +function H4({ children, className, ...props }) { + return ( +

+ {children} +

+ ); +} +function P({ children, className, ...props }) { + return ( +

+ {children} +

+ ); +} +function Details({ children, className, ...props }) { + return ( +
+ {children} +
+ ); +} +function Summary({ children, className, ...props }) { + return ( + + {children} + + ); +} +function Ul({ children, className, ...props }) { + return ( +
    + {children} +
+ ); +} +function Ol({ children, className, ...props }) { + return ( +
    + {children} +
+ ); +} +function Table({ children, className, ...props }) { + return ( + + {children} +
+ ); +} +function THead({ children, className, ...props }) { + return ( + + {children} + + ); +} +function TBody({ children, className, ...props }) { + return ( + + {children} + + ); +} +function TR({ children, className, ...props }) { + return ( + + {children} + + ); +} +function TH({ children, className, ...props }) { + return ( + + {children} + + ); +} +function TD({ children, className, ...props }) { + return ( + + {children} + + ); +} +function HR({ className, ...props }) { + return
; +} +function A({ href, children, className, ...props }) { + return ( + + {children} + + ); +} +function Img({ alt, src, className, ...props }) { + return ( + + {alt} + + ); +} + +export const mdxComponents = { + // Headings + h1: H1, + h2: H2, + h3: H3, + h4: H4, + // Text + p: P, + details: Details, + summary: Summary, + ul: Ul, + ol: Ol, + // Tables + table: Table, + thead: THead, + tbody: TBody, + tr: TR, + th: TH, + td: TD, + hr: HR, + a: A, + img: Img, + + // ECL-specific + ColorLayout, + ColorPalette, + ColorPaletteItem, + Link, + Thumbnail, + Row, + Col, + Container, +}; diff --git a/src/website-next/src/app/styles/_custom-properties.scss b/src/website-next/src/app/styles/_custom-properties.scss new file mode 100644 index 00000000000..5e69adfdac1 --- /dev/null +++ b/src/website-next/src/app/styles/_custom-properties.scss @@ -0,0 +1,80 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +.website-next { + --ws-c-p: #{map.get($color, 'primary')}; + --ws-c-p-180: #{map.get($color, 'primary-180')}; + --ws-c-p-160: #{map.get($color, 'primary-160')}; + --ws-c-p-140: #{map.get($color, 'primary-140')}; + --ws-c-p-120: #{map.get($color, 'primary-120')}; + --ws-c-p-100: #{map.get($color, 'primary-100')}; + --ws-c-p-80: #{map.get($color, 'primary-80')}; + --ws-c-p-60: #{map.get($color, 'primary-60')}; + --ws-c-p-40: #{map.get($color, 'primary-40')}; + --ws-c-p-20: #{map.get($color, 'primary-20')}; + --ws-c-s: #{map.get($color, 'secondary')}; + --ws-c-s-180: #{map.get($color, 'secondary-180')}; + --ws-c-s-160: #{map.get($color, 'secondary-160')}; + --ws-c-s-140: #{map.get($color, 'secondary-140')}; + --ws-c-s-120: #{map.get($color, 'secondary-120')}; + --ws-c-s-100: #{map.get($color, 'secondary-100')}; + --ws-c-s-80: #{map.get($color, 'secondary-80')}; + --ws-c-s-60: #{map.get($color, 'secondary-60')}; + --ws-c-s-40: #{map.get($color, 'secondary-40')}; + --ws-c-s-20: #{map.get($color, 'secondary-20')}; + --ws-c-d: #{map.get($color, 'dark')}; + --ws-c-d-100: #{map.get($color, 'dark-100')}; + --ws-c-d-80: #{map.get($color, 'dark-80')}; + --ws-c-d-60: #{map.get($color, 'dark-60')}; + --ws-c-in: #{map.get($color, 'info')}; + --ws-c-su: #{map.get($color, 'success')}; + --ws-c-er: #{map.get($color, 'error')}; + --ws-c-wa: #{map.get($color, 'warning')}; + --ws-c-bg: #{map.get($color, 'background')}; + --ws-c-br: #{map.get($color, 'branding')}; + --ws-c-st: color-mix(in srgb, var(--ws-c-p) 50%, transparent); + --ws-c-ov-l: color-mix(in srgb, var(--ws-c-d) 70%, transparent); + --ws-c-ov-d: color-mix(in srgb, var(--ws-c-d) 90%, transparent); + --ws-c-n: #{map.get($color, 'neutral-100')}; + --ws-c-n-180: #{map.get($color, 'neutral-180')}; + --ws-c-n-160: #{map.get($color, 'neutral-160')}; + --ws-c-n-140: #{map.get($color, 'neutral-140')}; + --ws-c-n-120: #{map.get($color, 'neutral-120')}; + --ws-c-n-100: #{map.get($color, 'neutral-100')}; + --ws-c-n-80: #{map.get($color, 'neutral-80')}; + --ws-c-n-60: #{map.get($color, 'neutral-60')}; + --ws-c-n-40: #{map.get($color, 'neutral-40')}; + --ws-c-n-20: #{map.get($color, 'neutral-20')}; + --ws-c-a: #{map.get($color, 'accent')}; + --ws-c-a-160: #{map.get($color, 'accent-160')}; + --ws-c-a-140: #{map.get($color, 'accent-140')}; + --ws-c-a-120: #{map.get($color, 'accent-120')}; + --ws-c-a-100: #{map.get($color, 'accent-100')}; + --ws-c-a-80: #{map.get($color, 'accent-80')}; + --ws-c-a-60: #{map.get($color, 'accent-60')}; + --ws-c-a-40: #{map.get($color, 'accent-40')}; + --ws-f-xs: #{map.get($font, 'xs')}; + --ws-f-s: #{map.get($font, 's')}; + --ws-f-m: #{map.get($font, 'm')}; + --ws-f-l: #{map.get($font, 'l')}; + --ws-f-xl: #{map.get($font, 'xl')}; + --ws-f-2xl: #{map.get($font, '2xl')}; + --ws-f-3xl: #{map.get($font, '3xl')}; + --ws-f-4xl: #{map.get($font, '4xl')}; + --ws-s-2xs: #{map.get($spacing, '2xs')}; + --ws-s-xs: #{map.get($spacing, 'xs')}; + --ws-s-s: #{map.get($spacing, 's')}; + --ws-s-m: #{map.get($spacing, 'm')}; + --ws-s-l: #{map.get($spacing, 'l')}; + --ws-s-xl: #{map.get($spacing, 'xl')}; + --ws-s-2xl: #{map.get($spacing, '2xl')}; + --ws-s-3xl: #{map.get($spacing, '3xl')}; + --ws-s-4xl: #{map.get($spacing, '4xl')}; + --ws-s-5xl: #{map.get($spacing, '5xl')}; + --ws-s-6xl: #{map.get($spacing, '6xl')}; + --ws-sh-1: #{map.get($shadow, '1')}; + --ws-sh-6: #{map.get($shadow, '6')}; + --ws-sh-12: #{map.get($shadow, '12')}; + --ws-sh-16: #{map.get($shadow, '16')}; + --ws-max-w: #{$max-width}; +} diff --git a/src/website-next/src/app/styles/app.module.scss b/src/website-next/src/app/styles/app.module.scss new file mode 100644 index 00000000000..6d35dd5355f --- /dev/null +++ b/src/website-next/src/app/styles/app.module.scss @@ -0,0 +1,79 @@ +/* stylelint-disable no-descending-specificity */ +/* stylelint-disable-next-line selector-pseudo-class-no-unknown */ +:global { + body { + background-color: var(--ws-c-n-40); + margin: 0; + overflow-wrap: break-word; + } + + /** + * Add the correct display in IE 9-. + * Was removed from normalize.css... + */ + article, + aside, + figcaption, + figure, + footer, + header, + main, + menu, + nav, + section { + display: block; + } + + main:focus { + outline: none; + } + + .demo-container { + box-sizing: border-box; + border: 2px solid #444; + } + + .demo-container--small { + width: 14rem; + } + + .demo-container--default-height-small { + height: 6rem; + } + + .demo-container--default-height-long { + height: 12rem; + } + + .demo-container--resizable { + max-width: 100%; + overflow: auto; + resize: both; + } + + * + .demo-container { + margin-top: 1rem; + } + + .demo-box { + box-sizing: border-box; + border: 1px solid #777; + background-color: #eee; + padding: 0.5rem; + } + + .demo-item { + box-sizing: border-box; + background-color: #eee; + padding: 0.5rem; + } + + .demo-item + .demo-item { + margin-top: 1rem; + } + + #root { + min-height: 100vh; + position: relative; + } +} diff --git a/src/website-next/src/app/styles/markdown.module.scss b/src/website-next/src/app/styles/markdown.module.scss new file mode 100644 index 00000000000..9739798b5b0 --- /dev/null +++ b/src/website-next/src/app/styles/markdown.module.scss @@ -0,0 +1,232 @@ +@use 'sass:map'; +@use 'custom-properties'; +@use '@ecl/theme-ec/theme' as *; + +.h1 { + color: var(--ws-c-d); + font: var(--ws-f-3xl); + margin: 0; + padding: 0; + + @media screen and (width >= 768px) { + font: var(--ws-f-4xl); + } +} + +.h2 { + color: var(--ws-c-d); + font: var(--ws-f-2xl); + + @media screen and (width >= 768px) { + font: var(--ws-f-3xl); + } +} + +.h3 { + color: var(--ws-c-d); + font: var(--ws-f-xl); + + @media screen and (width >= 768px) { + font: var(--ws-f-2xl); + } +} + +.h4 { + color: var(--ws-c-d); + font: var(--ws-f-l); + + @media screen and (width >= 768px) { + font: var(--ws-f-xl); + } +} + +.p { + color: var(--ws-c-d); + font: var(--ws-f-m); + margin: 0; + max-width: var(--ws-max-w); + padding: 0; +} + +.a { + color: var(--ws-c-p); + font-family: #{map.get($theme, 'font-family', 'default')}; + text-decoration: underline; + + &:hover, + &:focus { + color: map.get($theme, 'color', 'black'); + } + + &:focus { + outline: 2px solid var(--ws-c-p); + outline-offset: 2px; + } +} + +.details { + color: var(--ws-c-d); + font: var(--ws-f-m); + margin: 0; + padding: 0; +} + +.summary { + cursor: pointer; +} + +.img { + max-width: 100%; + margin: 0; + padding: 0; +} + +// link around an image +.imgA { + display: block; +} + +.ul { + box-sizing: border-box; + color: var(--ws-c-d); + font: var(--ws-f-m); + max-width: var(--ws-max-w); + margin: 0; +} + +.ol { + box-sizing: border-box; + color: var(--ws-c-d); + font: var(--ws-f-m); + max-width: var(--ws-max-w); + margin: 0; +} + +.table { + border-collapse: collapse; + border-width: 0; + margin: 0; + width: 100%; +} + +.thead .tr { + border-bottom: 2px solid var(--ws-c-d-60); +} + +.tbody .tr { + border-bottom: 1px solid var(--ws-c-d-60); +} + +.th { + background-color: transparent; + font: var(--ws-f-m); + font-weight: map.get($theme, 'font-weight', 'bold'); + text-align: left; +} + +.td { + font: var(--ws-f-m); +} + +.td, +.th { + color: var(--ws-c-d); + display: table-cell; + padding: var(--ws-s-s); + vertical-align: top; + margin: 0; + max-width: var(--ws-max-w); +} + +.hr { + border-color: var(--ws-c-d-80); + border-width: 1px; + border-style: solid; + margin: 0; + padding: 0; +} + +* + .h1 { + margin-top: var(--ws-s-2xl); +} + +* + .h2 { + margin-top: var(--ws-s-2xl); + + @media screen and (width >= 768px) { + margin-top: var(--ws-s-3xl); + } +} + +* + .h3 { + margin-top: var(--ws-s-xl); +} + +* + .h4 { + margin-top: var(--ws-s-m); + + @media screen and (width >= 768px) { + margin-top: var(--ws-s-l); + } +} + +* + .p, +* + .details, +* + .img, +* + .ul, +* + .ol, +* + .table { + margin-top: var(--ws-s-s); +} + +.h1 + .p, +.h1 + .details, +.h1 + .img, +.h1 + .ul, +.h1 + .ol, +.h1 + .table { + margin-top: var(--ws-s-m); +} + +.h2 + .p, +.h2 + .details, +.h2 + .img, +.h2 + .ul, +.h2 + .ol, +.h2 + .table { + margin-top: var(--ws-s-m); +} + +.website-next h2 + blockquote + p { + border: 1px solid var(--ws-c-n-40); + max-width: 100% !important; + text-align: center; + + &::after { + background: + url('../../../public/cms-images/anatomy_legend.png') 2rem center no-repeat, + var(--ws-c-n-20); + background-size: 15rem; + content: ''; + display: block; + height: 4rem; + } +} + +.website-next img[alt='anatomy'] { + border: 1px solid var(--ws-c-n-40); +} + +.website-next :not([class^='ecl'], [class^='wt']):first-child + p:not([class^='ecl'], [class^='wt']):first-child { + font: var(--ws-f-l); + max-width: var(--ws-max-w); +} + +* + .hr { + margin-top: var(--ws-s-m); +} + +* + .imgA { + margin-top: var(--ws-s-m); +} diff --git a/src/website-next/src/app/styles/utilities.module.scss b/src/website-next/src/app/styles/utilities.module.scss new file mode 100644 index 00000000000..cd9cd5ba406 --- /dev/null +++ b/src/website-next/src/app/styles/utilities.module.scss @@ -0,0 +1,55 @@ +@use 'sass:map'; +@use '@ecl/theme-ec/theme' as *; + +.pv-m { + padding-bottom: var(--ws-s-m) !important; + padding-top: var(--ws-s-m) !important; +} + +.pv-l { + padding-bottom: var(--ws-s-l) !important; + padding-top: var(--ws-s-l) !important; +} + +.pv-xl { + padding-bottom: var(--ws-s-xl) !important; + padding-top: var(--ws-s-xl) !important; +} + +.pv-2xl { + padding-bottom: var(--ws-s-2xl) !important; + padding-top: var(--ws-s-2xl) !important; +} + +.pv-3xl { + padding-bottom: var(--ws-s-3xl) !important; + padding-top: var(--ws-s-3xl) !important; +} +// stylelint-disable-next-line media-query-no-invalid +@media screen and (min-width: map.get($theme, 'breakpoint', 'm')) { + .pv-md-3xl { + padding-bottom: var(--ws-s-3xl) !important; + padding-top: var(--ws-s-3xl) !important; + } +} + +.pv-4xl { + padding-bottom: var(--ws-s-4xl) !important; + padding-top: var(--ws-s-4xl) !important; +} + +.mt-m { + margin-top: var(--ws-s-m) !important; +} + +.mt-l { + margin-top: var(--ws-s-l) !important; +} + +.mt-xl { + margin-top: var(--ws-s-xl) !important; +} + +.d-flex { + display: flex !important; +} diff --git a/src/website-next/src/content/ec/components/accordion/demo/index.js b/src/website-next/src/content/ec/components/accordion/demo/index.js new file mode 100644 index 00000000000..6f4cc923261 --- /dev/null +++ b/src/website-next/src/content/ec/components/accordion/demo/index.js @@ -0,0 +1,5 @@ +import demoContent from '@ecl/accordion/demo/data'; +import template from '@ecl/accordion/accordion.html.twig'; + +const accordion = template(demoContent); +export default accordion; diff --git a/src/website-next/src/content/ec/components/accordion/docs/api.mdx b/src/website-next/src/content/ec/components/accordion/docs/api.mdx new file mode 100644 index 00000000000..73550ed22f6 --- /dev/null +++ b/src/website-next/src/content/ec/components/accordion/docs/api.mdx @@ -0,0 +1,48 @@ +--- +title: API +order: 3 +--- + +import React from 'react'; +import Iframe from '../../../../../website-components/Showcase/Iframe'; + +## Setup + +There are 2 ways to initialise the component. + +### Automatic + +Add `data-ecl-auto-init="Accordion"` attribute to component's markup: + +```html +
+ ... +
+``` + +Use the `ECL` library's `autoInit()` (`ECL.autoInit()`) when your page is ready or other custom event you want to hook onto. + +### Manual + +Get target element, create an instance and invoke `init()`. + +Given you have 1 element with an attribute `data-ecl-accordion` on the page: + +```js +var elt = document.querySelector('[data-ecl-accordion]'); +var accordion = new ECL.Accordion(elt); +accordion.init(); +``` + +### Retrieve an existing instance + +If an existing instance needs to be updated, it can be retrieved this way: + +```js +var elt = document.querySelector('[data-ecl-accordion]'); +var instance = ECL.components.get(elt); +``` + +## API + +