diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..63ceb19
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,31 @@
+# Build stage
+FROM node:20-slim AS build
+
+WORKDIR /app
+
+# Copy package files
+COPY package*.json ./
+
+# Install dependencies
+RUN npm install
+
+# Copy source code
+COPY . .
+
+# Build the app
+RUN npm run build
+
+# Production stage
+FROM nginx:alpine
+
+# Copy the built app to nginx html directory
+COPY --from=build /app/build /usr/share/nginx/html
+
+# Copy nginx configuration (we'll create this next)
+COPY nginx.conf /etc/nginx/conf.d/default.conf
+
+# Expose port 80
+EXPOSE 80
+
+# Start nginx
+CMD ["nginx", "-g", "daemon off;"]
\ No newline at end of file
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 949ceed..86e1ae2 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -22,6 +22,21 @@ const config: Config = {
trailingSlash: false, // See: https://docusaurus.io/docs/deployment#docusaurusconfigjs-settings
deploymentBranch: "main", // The branch your GitHub pages site is deployed from.
+ customFields: {
+ educatesProject: {
+ projectGitHubUrl: "https://github.com/educates/educates-training-platform",
+ contributingUrl: "https://github.com/educates/educates-training-platform/blob/develop/CONTRIBUTING.md",
+ sponsorshipUrl: "https://github.com/sponsors/educates",
+ descriptionTitle: "Interactive Training Platform",
+ description: "The Educates project provides a system for hosting interactive workshop environments in Kubernetes,"
+ + "or on top of a local container runtime. It can be used for self paced or supervised workshops."
+ + "It can also be useful where you need to package up demos of applications hosted in Kubernetes "
+ + "or a local container runtime.",
+ screenshot: "/img/screenshot.png",
+ youtubeUrl: "https://www.youtube.com/@EducatesTrainingPlatform",
+ }
+ },
+
onBrokenLinks: "throw",
onBrokenMarkdownLinks: "warn",
@@ -38,20 +53,6 @@ const config: Config = {
locales: ["en"],
},
- // scripts: [
- // {
- // src: "/js/ityped.ts",
- // async: true,
- // },
- // ],
-
- // stylesheets: [
- // {
- // href: "/css/ityped.css",
- // type: "text/css",
- // },
- // ],
-
plugins: [
[
"@docusaurus/plugin-content-docs",
@@ -117,6 +118,19 @@ const config: Config = {
themeConfig: {
// Replace with your project's social card
image: "img/logo.svg",
+ colorMode: {
+ defaultMode: 'light',
+ disableSwitch: true,
+ respectPrefersColorScheme: false,
+ },
+ // announcementBar: {
+ // id: 'support_us',
+ // content:
+ // 'We are looking for support to help us maintain the project, please sponsor us',
+ // backgroundColor: '#fafbfc',
+ // textColor: '#091E42',
+ // isCloseable: true,
+ // },
navbar: {
title: "Educates Training Platform",
logo: {
@@ -124,30 +138,16 @@ const config: Config = {
src: "img/logo.svg",
},
items: [
- { to: "/features", label: "Features", position: "left" },
- // { to: "/team", label: "Team", position: "left" },
- // { to: "/resources", label: "Resources", position: "left" },
- // {
- // type: "docSidebar",
- // sidebarId: "tutorialSidebar",
- // position: "left",
- // label: "Ref docs",
- // },
- {
- label: "Getting Started Guides",
- to: "/getting-started-guides",
- },
- { to: "/blog", label: "Blog", position: "left" },
- {
- href: "https://docs.educates.dev",
- label: "Docs",
- position: "left",
- },
- {
- href: "https://github.com/educates/educates-training-platform",
- label: "GitHub",
- position: "right",
- },
+ { to: '/#use-cases', label: 'Use Cases', position: 'left' },
+ { to: '/#features', label: 'Features', position: 'left' },
+ { to: '/#team', label: 'Team', position: 'left' },
+ // { to: '/#references', label: 'References', position: 'left' },
+ { to: '/#pricing', label: 'Pricing', position: 'left' },
+ { to: '/getting-started-guides', label: 'Getting Started', position: 'left' },
+ { to: '/blog', label: 'Blog', position: 'left' },
+ { href: 'https://docs.educates.dev', label: 'Docs', position: 'left' },
+ { href: 'https://github.com/educates/educates-training-platform', label: 'GitHub', position: 'right' },
+ // { href: '/login', label: 'Login / Sign Up', position: 'right', className: 'navbar-login-button' },
],
},
footer: {
@@ -156,19 +156,17 @@ const config: Config = {
{
title: "Project",
items: [
- {
- label: "Features",
- to: "/features",
- },
- // {
- // label: "Team",
- // href: "/team",
- // },
+ { label: "Use Cases", to: "/#use-cases" },
+ { label: "Features", to: "/#features" },
+ { label: "Team", to: "/#team" },
+ // { label: "References", to: "/#references" },
+ { label: "Pricing", to: "/#pricing" },
],
},
{
title: "Docs",
items: [
+ { label: "Blog", to: "/blog" },
{
label: "Getting Started Guides",
to: "/getting-started-guides",
@@ -177,19 +175,11 @@ const config: Config = {
label: "Reference docs",
href: "https://docs.educates.dev",
},
- {
- label: "Additional resources",
- href: "/resources",
- },
],
},
{
title: "Community",
items: [
- {
- label: "Blog",
- to: "/blog",
- },
{
label: "Slack",
href: "https://kubernetes.slack.com/archives/C05UWT4SKRV",
@@ -198,6 +188,10 @@ const config: Config = {
label: "GitHub",
href: "https://github.com/educates/educates-training-platform",
},
+ {
+ label: "YouTube",
+ href: "https://www.youtube.com/@EducatesTrainingPlatform",
+ },
],
},
],
diff --git a/getting-started-guides/index.md b/getting-started-guides/index.md
index 2f8c41f..25b27d3 100644
--- a/getting-started-guides/index.md
+++ b/getting-started-guides/index.md
@@ -3,10 +3,10 @@ sidebar_position: 5
---
# Getting Started Guides
-Over the next hours, we will take a look at [Educates](https://educates.dev),
+Let's take a look at [Educates Training Platform](https://educates.dev),
an educational framework for building workshops powered by [Kubernetes](https://kubernetes.io).
-The outline will look like this:
+The outline of these guides look like this:
1. [Prerequisites and Setup](/getting-started-guides/setup)
2. [How does Educates work?](/getting-started-guides/about)
diff --git a/getting-started-guides/setup/create-cluster.md b/getting-started-guides/setup/create-cluster.md
index aaa7e2c..5296e13 100644
--- a/getting-started-guides/setup/create-cluster.md
+++ b/getting-started-guides/setup/create-cluster.md
@@ -38,7 +38,7 @@ Creating cluster "educates" ...
Set kubectl context to "kind-educates"
You can now use your cluster with:
-kubectl cluster-info --context kind-educates --kubeconfig /Users/daniel/.kube/config
+kubectl cluster-info --context kind-educates --kubeconfig /Users/you/.kube/config
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community ๐
Deploying local image registry
diff --git a/getting-started-guides/setup/educates.md b/getting-started-guides/setup/educates.md
index 1220ad9..a7ecee5 100644
--- a/getting-started-guides/setup/educates.md
+++ b/getting-started-guides/setup/educates.md
@@ -45,5 +45,5 @@ The output should look like this:
```{ .text .no-copy title="Output" }
educates version
-3.0.0
+3.3.2
```
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000..adb2c5f
--- /dev/null
+++ b/nginx.conf
@@ -0,0 +1,22 @@
+server {
+ listen 80;
+ server_name localhost;
+
+ root /usr/share/nginx/html;
+ index index.html;
+
+ # Support for client-side routing
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ # Cache control for static assets
+ location /assets/ {
+ expires 1y;
+ add_header Cache-Control "public, no-transform";
+ }
+
+ # Enable gzip compression
+ gzip on;
+ gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index cbba3b1..d97963a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,18 +12,24 @@
"@docusaurus/plugin-ideal-image": "^3.7.0",
"@docusaurus/preset-classic": "^3.7.0",
"@docusaurus/theme-mermaid": "^3.7.0",
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.0",
"@mdx-js/react": "^3.1.0",
+ "@mui/material": "^7.1.0",
"asciinema-player": "^3.9.0",
"clsx": "^2.1.1",
"ityped": "^1.0.3",
"prism-react-renderer": "^2.4.1",
"react": "^19.0.0",
- "react-dom": "^19.0.0"
+ "react-dom": "^19.0.0",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.7.0",
"@docusaurus/tsconfig": "^3.7.0",
"@docusaurus/types": "^3.7.0",
+ "@types/react": "^19.1.3",
+ "@types/react-dom": "^19.1.3",
"typescript": "~5.8.2"
},
"engines": {
@@ -2268,13 +2274,10 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
- "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
+ "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
@@ -4360,6 +4363,179 @@
"node": ">=18.0"
}
},
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.3.3",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/cache/node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/cache": "^11.14.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.10.0",
+ "@emotion/utils": "^1.4.2",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
+ "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/is-prop-valid": "^1.3.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
+ "license": "MIT"
+ },
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -4564,6 +4740,225 @@
"langium": "3.3.1"
}
},
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.1.0.tgz",
+ "integrity": "sha512-E0OqhZv548Qdc0PwWhLVA2zmjJZSTvaL4ZhoswmI8NJEC1tpW2js6LLP827jrW9MEiXYdz3QS6+hask83w74yQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.1.0.tgz",
+ "integrity": "sha512-ahUJdrhEv+mCp4XHW+tHIEYzZMSRLg8z4AjUOsj44QpD1ZaMxQoVOG2xiHvLFdcsIPbgSRx1bg1eQSheHBgvtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@mui/core-downloads-tracker": "^7.1.0",
+ "@mui/system": "^7.1.0",
+ "@mui/types": "^7.4.2",
+ "@mui/utils": "^7.1.0",
+ "@popperjs/core": "^2.11.8",
+ "@types/react-transition-group": "^4.4.12",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.1.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material-pigment-css": "^7.1.0",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@mui/material-pigment-css": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/material/node_modules/react-is": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
+ "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
+ "license": "MIT"
+ },
+ "node_modules/@mui/private-theming": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.1.0.tgz",
+ "integrity": "sha512-4Kck4jxhqF6YxNwJdSae1WgDfXVg0lIH6JVJ7gtuFfuKcQCgomJxPvUEOySTFRPz1IZzwz5OAcToskRdffElDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@mui/utils": "^7.1.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.1.0.tgz",
+ "integrity": "sha512-m0mJ0c6iRC+f9hMeRe0W7zZX1wme3oUX0+XTVHjPG7DJz6OdQ6K/ggEOq7ZdwilcpdsDUwwMfOmvO71qDkYd2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@emotion/cache": "^11.13.5",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/sheet": "^1.4.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.1.0.tgz",
+ "integrity": "sha512-iedAWgRJMCxeMHvkEhsDlbvkK+qKf9me6ofsf7twk/jfT4P1ImVf7Rwb5VubEA0sikrVL+1SkoZM41M4+LNAVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@mui/private-theming": "^7.1.0",
+ "@mui/styled-engine": "^7.1.0",
+ "@mui/types": "^7.4.2",
+ "@mui/utils": "^7.1.0",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.2.tgz",
+ "integrity": "sha512-edRc5JcLPsrlNFYyTPxds+d5oUovuUxnnDtpJUbP6WMeV4+6eaX/mqai1ZIWT62lCOe0nlrON0s9HDiv5en5bA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.1.0.tgz",
+ "integrity": "sha512-/OM3S8kSHHmWNOP+NH9xEtpYSG10upXeQ0wLZnfDgmgadTAk5F4MQfFLyZ5FCRJENB3eRzltMmaNl6UtDnPovw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@mui/types": "^7.4.2",
+ "@types/prop-types": "^15.7.14",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.1.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils/node_modules/react-is": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
+ "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
+ "license": "MIT"
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -4646,6 +5041,16 @@
"integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
"license": "MIT"
},
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
"node_modules/@sideway/address": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
@@ -5495,6 +5900,12 @@
"integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==",
"license": "MIT"
},
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
+ },
"node_modules/@types/qs": {
"version": "6.9.18",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
@@ -5508,14 +5919,24 @@
"license": "MIT"
},
"node_modules/@types/react": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz",
- "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz",
+ "integrity": "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==",
"license": "MIT",
"dependencies": {
"csstype": "^3.0.2"
}
},
+ "node_modules/@types/react-dom": {
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz",
+ "integrity": "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
"node_modules/@types/react-router": {
"version": "5.1.20",
"resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
@@ -5548,6 +5969,15 @@
"@types/react-router": "*"
}
},
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*"
+ }
+ },
"node_modules/@types/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
@@ -6271,6 +6701,37 @@
"object.assign": "^4.1.0"
}
},
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.13",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz",
@@ -8784,6 +9245,16 @@
"utila": "~0.4"
}
},
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -9729,6 +10200,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "license": "MIT"
+ },
"node_modules/find-up": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
@@ -17075,6 +17552,15 @@
"react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/react-icons": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
+ "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -17161,6 +17647,22 @@
"react": ">=15"
}
},
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
diff --git a/package.json b/package.json
index 9358a4c..6f6063e 100644
--- a/package.json
+++ b/package.json
@@ -12,25 +12,32 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
- "typecheck": "tsc"
+ "typecheck": "tsc",
+ "docker-build": "docker buildx build --platform linux/amd64,linux/arm64 -t educates-dev ."
},
"dependencies": {
"@docusaurus/core": "^3.7.0",
"@docusaurus/plugin-ideal-image": "^3.7.0",
"@docusaurus/preset-classic": "^3.7.0",
"@docusaurus/theme-mermaid": "^3.7.0",
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.0",
"@mdx-js/react": "^3.1.0",
+ "@mui/material": "^7.1.0",
"asciinema-player": "^3.9.0",
"clsx": "^2.1.1",
"ityped": "^1.0.3",
"prism-react-renderer": "^2.4.1",
"react": "^19.0.0",
- "react-dom": "^19.0.0"
+ "react-dom": "^19.0.0",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.7.0",
"@docusaurus/tsconfig": "^3.7.0",
"@docusaurus/types": "^3.7.0",
+ "@types/react": "^19.1.3",
+ "@types/react-dom": "^19.1.3",
"typescript": "~5.8.2"
},
"browserslist": {
diff --git a/src/components/FeatureCard/index.tsx b/src/components/FeatureCard/index.tsx
deleted file mode 100644
index 09eec05..0000000
--- a/src/components/FeatureCard/index.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import clsx from 'clsx';
-import {type Feature} from '@site/src/data/features';
-import Heading from '@theme/Heading';
-import styles from './styles.module.css';
-
-function FeatureCard({user}: {user: Feature}) {
- return (
-
-
-
-
- {user.title}
-
-
-
{user.description}
-
-
- );
-}
-
-export default FeatureCard;
\ No newline at end of file
diff --git a/src/components/FeatureCard/styles.module.css b/src/components/FeatureCard/styles.module.css
deleted file mode 100644
index 549548b..0000000
--- a/src/components/FeatureCard/styles.module.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.showcaseCardHeader {
- display: flex;
- align-items: center;
- margin-bottom: 12px;
-}
-
-.showcaseCardTitle {
- margin-bottom: 0;
- flex: 1 1 auto;
-}
-
-.showcaseCardTitle a {
- text-decoration: none;
- background: linear-gradient(var(--ifm-color-primary),
- var(--ifm-color-primary)) 0% 100% / 0% 1px no-repeat;
- transition: background-size ease-out 200ms;
-}
-
-.showcaseCardTitle a:not(:focus):hover {
- background-size: 100% 1px;
-}
-
-.showcaseCardTitle,
-.showcaseCardHeader {
- margin-right: 0.25rem;
-}
-
-.showcaseCardBody {
- font-size: smaller;
- line-height: 1.66;
-}
\ No newline at end of file
diff --git a/src/components/FeaturesCards/index.tsx b/src/components/FeaturesCards/index.tsx
deleted file mode 100644
index 09a4c6b..0000000
--- a/src/components/FeaturesCards/index.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import clsx from 'clsx';
-import { allFeatures, type Feature } from '@site/src/data/features';
-import FeatureCard from '../FeatureCard';
-
-import styles from './styles.module.css';
-
-function CardList({ items }: { items: Feature[] }) {
- return (
-
-
- {items.map((item) => (
-
- ))}
-
-
- );
-}
-
-export default function FeatureCards() {
- return (
-
- );
-}
\ No newline at end of file
diff --git a/src/components/FeaturesCards/styles.module.css b/src/components/FeaturesCards/styles.module.css
deleted file mode 100644
index de54bc0..0000000
--- a/src/components/FeaturesCards/styles.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.cardList {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
- gap: 24px;
-}
-
-@media (min-width: 992px) {
- .cardList {
- grid-template-columns: repeat(3, 1fr);
- }
-}
\ No newline at end of file
diff --git a/src/components/ImageAndText/styles.module.css b/src/components/ImageAndText/styles.module.css
deleted file mode 100644
index 565c6b0..0000000
--- a/src/components/ImageAndText/styles.module.css
+++ /dev/null
@@ -1,50 +0,0 @@
-.flexContainer {
- display: flex;
- flex-wrap: wrap;
- /* justify-content: space-between; */
- align-items: center;
- text-align: center;
- padding: 3rem;
-}
-
-.flexTextDiv{
- flex-direction: column;
-}
-
-.flexItem {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 20px;
-}
-
-.centeredText {
- max-width: 80%;
-}
-
-.centeredImage {
- width: 80%;
- height: auto;
-}
-
-.colMd6{
- flex: 0 0 auto;
- width: 50%;
-}
-
-@media (max-width: 768px) {
- .flexContainer {
- flex-direction: column;
- }
- .centeredText {
- max-width: 100%;
- }
- .centeredImage {
- width: 100%;
- height: auto;
- }
- .colMd6{
- width: 100%;
- }
-}
diff --git a/src/components/sections/Description.tsx b/src/components/sections/Description.tsx
new file mode 100644
index 0000000..6c897d7
--- /dev/null
+++ b/src/components/sections/Description.tsx
@@ -0,0 +1,67 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Grid from '@mui/material/Grid';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+// import { educatesProject } from '@site/src/data/project';
+
+const Description: React.FC<{ sectionType: 'even' | 'odd' }> = ({ sectionType }) => {
+ const { siteConfig } = useDocusaurusContext();
+ const educatesProject = siteConfig.customFields.educatesProject;
+
+ return (
+
+
+
+
+
+
+ {/* @ts-ignore */}
+
+
+ {/* @ts-ignore */}
+ {educatesProject.descriptionTitle}
+
+
+ {/* @ts-ignore */}
+ {educatesProject.description}
+
+
+ {/* @ts-ignore */}
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Description;
\ No newline at end of file
diff --git a/src/components/sections/FeaturedContent.tsx b/src/components/sections/FeaturedContent.tsx
new file mode 100644
index 0000000..1b88073
--- /dev/null
+++ b/src/components/sections/FeaturedContent.tsx
@@ -0,0 +1,116 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Grid from '@mui/material/Grid';
+import Typography from '@mui/material/Typography';
+import Button from '@mui/material/Button';
+import Card from '@mui/material/Card';
+import CardContent from '@mui/material/CardContent';
+import CardMedia from '@mui/material/CardMedia';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+
+export interface FeaturedCardData {
+ image?: string;
+ title: string;
+ description: string;
+ ctaLabel: string;
+ ctaHref: string;
+}
+
+export interface FeaturedContentProps {
+ title?: string;
+ seeMoreLabel?: string;
+ seeMoreHref?: string;
+ cards: FeaturedCardData[];
+ sectionType: 'odd' | 'even';
+}
+
+const FeaturedContent: React.FC = ({
+ title = 'Featured content',
+ seeMoreLabel = 'See more',
+ seeMoreHref = '/blog',
+ cards,
+ sectionType,
+}) => {
+ return (
+
+
+
+
+
+
+
+
+ {title}
+
+ {/*
+ {description}
+ */}
+
+
+
+ {cards.map((card, idx) => (
+ // @ts-ignore
+
+
+
+
+
+ {card.title}
+
+
+ {card.description}
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default FeaturedContent;
\ No newline at end of file
diff --git a/src/components/sections/Features.tsx b/src/components/sections/Features.tsx
new file mode 100644
index 0000000..3e78896
--- /dev/null
+++ b/src/components/sections/Features.tsx
@@ -0,0 +1,80 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Grid from '@mui/material/Grid';
+import Stack from '@mui/material/Stack';
+import { FeatureProps, features } from '@site/src/data/features';
+
+const Feature: React.FC = ({ title, description, icon: Icon }) => (
+
+
+
+
+
+ {title}
+
+ {description}
+
+);
+
+const Features: React.FC<{ sectionType: 'even' | 'odd' }> = ({ sectionType }) => {
+
+ return (
+
+
+
+
+
+
+
+
+ Platform Features
+
+
+ Educates Training Platform provides a comprehensive set of features designed to make your training and workshop experiences seamless and effective.
+
+
+
+ {features.map((feature, index) => (
+ // @ts-ignore
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default Features;
\ No newline at end of file
diff --git a/src/components/sections/Pricing.tsx b/src/components/sections/Pricing.tsx
new file mode 100644
index 0000000..4ab96b1
--- /dev/null
+++ b/src/components/sections/Pricing.tsx
@@ -0,0 +1,158 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Grid';
+import Stack from '@mui/material/Stack';
+import List from '@mui/material/List';
+import ListItem from '@mui/material/ListItem';
+import ListItemIcon from '@mui/material/ListItemIcon';
+import { FaCheck } from 'react-icons/fa';
+import { PricingPlan, pricingPlans, pricingTitle, pricingDescription } from '@site/src/data/pricing';
+import { educatesProject } from '@site/src/data/project';
+
+
+const PriceCard: React.FC = ({ name, price, features, isPopular, isOSS }) => (
+
+ {isPopular && (
+
+ Most Popular
+
+ )}
+
+
+ {name}
+ {Number.parseInt(price) >= 0 ? (
+
+ ${price}
+
+ /month
+
+
+ ) : (
+
+ {price}
+
+ )}
+
+
+ {features.map((feature, index) => (
+
+
+
+
+ {feature}
+
+ ))}
+
+
+ {isOSS ? (
+
+ ) : (
+
+ )}
+
+
+
+);
+
+
+const Pricing: React.FC<{ sectionType: 'even' | 'odd' }> = ({ sectionType }) => {
+ return (
+
+
+
+
+
+
+
+
+ {pricingTitle}
+
+
+ {pricingDescription}
+
+
+
+ {pricingPlans.map((plan, index) => (
+ // @ts-ignore
+
+
+
+ ))}
+
+
+
+ Need a custom plan?{' '}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Pricing;
\ No newline at end of file
diff --git a/src/components/sections/References.tsx b/src/components/sections/References.tsx
new file mode 100644
index 0000000..bf37c3d
--- /dev/null
+++ b/src/components/sections/References.tsx
@@ -0,0 +1,96 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Grid from '@mui/material/Grid';
+import Stack from '@mui/material/Stack';
+import { companies, Company } from '@site/src/data/references';
+
+
+const References: React.FC<{ sectionType: 'even' | 'odd' }> = ({ sectionType }) => {
+ return (
+
+
+
+
+
+
+
+
+ Trusted By Industry Leaders
+
+
+ Join the growing list of organizations that trust Educates Training Platform for their training needs.
+
+
+ {/* Company Logos */}
+
+ {companies.map((company, index) => (
+ // @ts-ignore
+
+
+
+
+
+ ))}
+
+ {/* Testimonials */}
+
+ {companies.map((company, index) => (
+ // @ts-ignore
+
+
+
+ "{company.testimonial}"
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default References;
\ No newline at end of file
diff --git a/src/components/sections/Team.tsx b/src/components/sections/Team.tsx
new file mode 100644
index 0000000..3935615
--- /dev/null
+++ b/src/components/sections/Team.tsx
@@ -0,0 +1,107 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Grid from '@mui/material/Grid';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Link from '@mui/material/Link';
+import IconButton from '@mui/material/IconButton';
+import { FaGithub, FaTwitter, FaLinkedin } from 'react-icons/fa';
+import { TeamMember, teamMembers } from '@site/src/data/team';
+
+
+
+const TeamMemberCard: React.FC = ({ name, role, image, github, twitter, linkedin }) => (
+
+
+
+ {name}
+ {role}
+
+
+ {github && (
+
+
+
+ )}
+ {twitter && (
+
+
+
+ )}
+ {linkedin && (
+
+
+
+ )}
+
+
+);
+
+
+
+const Team: React.FC<{ sectionType: 'even' | 'odd' }> = ({ sectionType }) => {
+ return (
+
+
+
+
+
+
+
+
+ Meet Our Team
+
+
+ We are a dedicated team of professionals working together to make Educates the best platform for interactive learning.
+
+
+
+ {teamMembers.map((member, index) => (
+ // @ts-ignore
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default Team;
\ No newline at end of file
diff --git a/src/components/sections/UseCases.tsx b/src/components/sections/UseCases.tsx
new file mode 100644
index 0000000..e546bdf
--- /dev/null
+++ b/src/components/sections/UseCases.tsx
@@ -0,0 +1,78 @@
+import React from 'react';
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Grid from '@mui/material/Grid';
+import { IconType } from 'react-icons';
+import { useCases } from '@site/src/data/usecases';
+interface UseCase {
+ title: string;
+ description: string;
+ icon: IconType;
+}
+
+const UseCaseCard: React.FC = ({ title, description, icon: Icon }) => (
+
+
+
+
+
+ {title}
+
+ {description}
+
+);
+
+
+const UseCases: React.FC<{ sectionType: 'even' | 'odd' }> = ({ sectionType }) => {
+ return (
+
+
+
+
+
+
+ Use Cases
+
+
+ {useCases.map((useCase, index) => (
+ // @ts-ignore
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default UseCases;
\ No newline at end of file
diff --git a/src/css/custom.css b/src/css/custom.css
index 92a1ffc..af356a7 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -15,6 +15,18 @@
--ifm-color-primary-lightest: #3cad6e;
--ifm-code-font-size: 95%;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
+ --primary: #ff6a3e;
+ --primaryLight: #ffba43;
+ --secondary: #ffba43;
+ --secondaryLight: #ffba43;
+ --headerColor: #1a1a1a;
+ --bodyTextColor: #4e4b66;
+ --bodyTextColorWhite: #fafbfc;
+ --topperFontSize: clamp(0.8125rem, 1.6vw, 1rem);
+ --headerFontSize: clamp(1.9375rem, 3.9vw, 3.0625rem);
+ --bodyFontSize: 1rem;
+ --sectionPadding: clamp(3.75rem, 7.82vw, 6.25rem) 1rem;
+ --headerFontFamily: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
/* For readability concerns, you should choose a lighter palette in dark mode. */
@@ -29,100 +41,230 @@
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}
-.language-no-copy button {
+.no-copy button {
display: none;
}
-.no-copy button {
- display: none;
+/* Navbar Login/Sign Up Button */
+.navbar-login-button {
+ background-color: #1976d2 !important;
+ color: #fff !important;
+ border-radius: 8px;
+ padding: 0.4em 1.2em;
+ font-weight: 600;
+ margin-left: 1em;
+ transition: background 0.2s;
+ box-shadow: 0 2px 8px rgba(25, 118, 210, 0.08);
+ border: none;
+ display: inline-block;
}
-/* ityped */
-.ityped {
- font-size: 2em;
+.navbar-login-button:hover,
+.navbar-login-button:focus {
+ background-color: #1565c0 !important;
+ color: #fff !important;
+ text-decoration: none;
}
-.ityped-cursor {
- font-size: 2em;
- animation: blink 0.7s infinite;
+.section-full-height {
+ min-height: 100vh;
+ padding: var(--sectionPadding);
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
-@keyframes blink {
- 0% { opacity: 1; }
- 50% { opacity: 0; }
- 100% { opacity: 1; }
+.section-title {
+ font-size: var(--headerFontSize);
+ font-family: var(--headerFontFamily);
+ font-weight: 900;
+ color: var(--headerColor);
+ margin-bottom: 1rem;
}
-.centered-container {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 80vh;
- text-align: center;
+.section-text {
+ font-size: var(--bodyFontSize);
+ color: var(--bodyTextColor);
+ max-width: 650px;
+ margin: 0 auto;
}
-.centered-content {
+.section-box {
+ width: 100%;
+ background: inherit;
+}
+
+.section-container {
+ min-height: 100vh;
display: flex;
- flex-direction: column;
align-items: center;
justify-content: center;
- width: 80vh;
+ padding: 4rem 0;
}
-.centered-image {
- display: block;
- margin: 0 auto;
- width: 50%;
+.section-container.section-odd {
+ background: #cbe1f0;
}
-.section_title {
- font-size: 3em; /* Default font size for larger screens */
+.section-container.section-even {
+ background: white;
}
-@media (max-width: 1200px) {
- .section_title {
- font-size: 2.5em;
- }
- .ityped {
- font-size: 1.5em;
- }
- .ityped-cursor {
- font-size: 1.5em;
- }
+.section-content {
+ width: 100%;
+ margin: 0 auto;
+ padding: 0 1rem;
}
-@media (max-width: 992px) {
- .section_title {
- font-size: 2em;
- }
- .ityped {
- font-size: 1em;
+/* Extra small devices (phones, 576px and down) */
+@media (max-width: 576px) {
+ .section-content {
+ max-width: 100%;
+ padding: 0 1rem;
}
- .ityped-cursor {
- font-size: 1em;
+
+ .navbar-login-button {
+ display: none !important;
}
}
+/* Small devices (tablets, 768px and down) */
@media (max-width: 768px) {
- .section_title {
- font-size: 1.5em;
+ .section-content {
+ max-width: 720px;
+ padding: 0 1.5rem;
}
- .ityped {
- font-size: 1em;
- }
- .ityped-cursor {
- font-size: 1em;
+}
+
+/* Medium devices (desktops, 992px and down) */
+@media (max-width: 992px) {
+ .section-content {
+ max-width: 960px;
+ padding: 0 2rem;
}
}
-@media (max-width: 576px) {
- .section_title {
- font-size: 1.2em;
+/* Large devices (large desktops, 1200px and down) */
+@media (max-width: 1200px) {
+ .section-content {
+ max-width: 1140px;
+ padding: 0 2.5rem;
}
- .ityped {
- font-size: 0.8em;
+}
+
+/* Above 1200px */
+@media (max-width: 2200px) {
+ .section-content {
+ max-width: 2160px;
+ padding: 0 3rem;
}
- .ityped-cursor {
- font-size: 0.8em;
+}
+
+@media (min-width: 2201px) {
+ .section-content {
+ max-width: 100vw;
+ padding: 0 3.5rem;
}
+}
+
+/* Floating Navbar Style */
+.navbar {
+ max-width: 1600px;
+ width: 90vw;
+ margin: 2rem auto 0 auto;
+ border-radius: 2rem;
+ box-shadow: 0 4px 32px rgba(0,0,0,0.10);
+ background: #fff;
+ left: 0;
+ right: 0;
+ position: sticky;
+ top: 1rem;
+ z-index: 100;
+ padding-left: 2rem;
+ padding-right: 2rem;
+}
+
+.navbar__inner {
+ border-radius: 2rem;
+ background: transparent;
+}
+
+[data-theme='dark'] .navbar {
+ background: #181c20;
+ box-shadow: 0 4px 32px rgba(0,0,0,0.30);
+}
+
+body::before {
+ content: "";
+ display: block;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 7rem; /* Adjust height to cover navbar + margin */
+ background: #cbe1f0;
+ z-index: 99;
+ pointer-events: none;
+ opacity: 0;
+ transition: opacity 0.3s;
+}
+body.home-navbar-bg::before {
+ opacity: 1;
+}
+body.navbar-bg-transparent::before {
+ opacity: 0;
+}
+
+.navbar__item:not(.navbar-login-button) {
+ color: var(--headerColor) !important;
+ background: none !important;
+ text-decoration: none !important;
+ font-weight: 500;
+ font-family: var(--headerFontFamily);
+ box-shadow: none !important;
+ border: none !important;
+ transition: none !important;
+ cursor: default;
+}
+
+.navbar__item:not(.navbar-login-button):hover,
+.navbar__item:not(.navbar-login-button):focus {
+ color: var(--headerColor) !important;
+ background: rgba(186, 207, 251, 0.85) !important;
+ border-radius: 2rem !important;
+ box-shadow: 0 4px 24px rgba(186, 207, 251, 0.85) !important;
+ text-decoration: none !important;
+ transition: background 0.2s, box-shadow 0.2s;
+}
+
+[data-theme='dark'] .navbar__item:not(.navbar-login-button) {
+ color: #f5f6fa !important;
+}
+[data-theme='dark'] .navbar__item:not(.navbar-login-button):hover,
+[data-theme='dark'] .navbar__item:not(.navbar-login-button):focus {
+ background: rgba(255,255,255,0.10) !important;
+ color: #fff !important;
+ box-shadow: 0 4px 24px rgba(255,255,255,0.10) !important;
+}
+[data-theme='dark'] .section-title {
+ color: #f5f6fa;
+}
+[data-theme='dark'] .section-container.section-odd {
+ background: #232a36;
+}
+[data-theme='dark'] .section-container.section-even {
+ background: #181c20;
+}
+
+[data-theme='dark'] .MuiStack-root {
+ /* background: #232a36 !important; */
+ color: #f5f6fa !important;
+}
+[data-theme='dark'] .MuiStack-root .MuiTypography-h6,
+[data-theme='dark'] .MuiStack-root .MuiTypography-body1,
+[data-theme='dark'] .MuiStack-root .MuiTypography-body2 {
+ color: #f5f6fa !important;
+}
+[data-theme='dark'] .MuiStack-root .MuiTypography-colorTextSecondary {
+ color: #bfc7d5 !important;
}
diff --git a/src/data/featuredContent.tsx b/src/data/featuredContent.tsx
new file mode 100644
index 0000000..3c04c4f
--- /dev/null
+++ b/src/data/featuredContent.tsx
@@ -0,0 +1,26 @@
+import { FeaturedCardData } from "../components/sections/FeaturedContent";
+
+const featuredCards: FeaturedCardData[] = [
+ {
+ image: '/img/featured-content/cloud.jpeg',
+ title: 'Installing Educates on a cloud provider (Part 1)',
+ description: 'Learn how to use the Educates CLI to install Educates Training Platform on a Cloud Provider, and specifically Google Cloud.',
+ ctaLabel: 'Read blog',
+ ctaHref: '/blog/install-educates-cloud-cli',
+ },
+ {
+ image: '/img/featured-content/cloud.jpeg',
+ title: 'Installing Educates on a cloud provider (Part 2)',
+ description: 'Verification of the installation of Educates Training Platform on a cloud provider including verification of the platform components and deploy and verify a training portal and workshop',
+ ctaLabel: 'Read blog',
+ ctaHref: '/blog/verify-educates-cloud-install',
+ },
+ {
+ image: '/img/featured-content/working_locally.jpeg',
+ title: 'How to best work locally',
+ description: 'When you run Educates locally, it\'s easy to go with the defaults, just create your Educates cluster as explained in the Getting Started on Kind article. But that is not the most optimal workflow. Why?',
+ ctaLabel: 'Read blog',
+ ctaHref: '/blog/how-to-best-work-locally',
+ },
+];
+export default featuredCards;
\ No newline at end of file
diff --git a/src/data/features.tsx b/src/data/features.tsx
index 754385f..e5bc59a 100644
--- a/src/data/features.tsx
+++ b/src/data/features.tsx
@@ -1,47 +1,65 @@
-export type Feature = {
+import { FaCode, FaGlobe, FaPencilAlt } from "react-icons/fa";
+
+import { IconType } from "react-icons";
+import { FaBook, FaDocker, FaExpandArrowsAlt, FaLock, FaPuzzlePiece } from "react-icons/fa";
+import { FaCloud } from "react-icons/fa";
+
+export interface FeatureProps {
title: string;
description: string;
- icon?: string | null; // null = use our serverless screenshot service
- link?: string;
- // tags: TagType[];
-};
+ icon: IconType;
+}
+
-export const allFeatures: Feature[] = [
+export const features: FeatureProps[] = [
{
- title: 'Kubernetes Cloud Native',
- description: "Cloud native application that runs on Kubernetes and provides itโs own CRDs.",
+ title: 'Kubernetes Native',
+ description: 'Built from the ground up to run natively on Kubernetes, leveraging its powerful features and ecosystem.',
+ icon: FaCloud,
},
{
- title: 'Developer Friendly',
- description: "Enables local development environment to be productive from minute zero.",
+ title: 'Secure by Design',
+ description: 'Enterprise-grade security with isolated environments and controlled access for each participant.',
+ icon: FaLock,
},
{
- title: 'Run on the Cloud',
- description: "Easily installable on most of the major clouds such as GCP, AWS, Azure etc.",
+ title: 'Highly Scalable',
+ description: 'Scale your training environments effortlessly to accommodate any number of participants.',
+ icon: FaExpandArrowsAlt,
},
{
- title: 'Secure Sandbox',
- description: "Provides a secure sandbox for your users to learn safely on a shared cluster.",
+ title: 'Extensible Platform',
+ description: 'Customize and extend the platform to meet your specific training needs and requirements.',
+ icon: FaPuzzlePiece,
},
{
- title: 'Unlimited scalability',
- description: "Can scale to thousands of users and workshops without any performance degradation.",
+ title: 'Local Container Runtime',
+ description: 'Run the platform locally using a local container runtime.',
+ icon: FaDocker,
},
{
- title: 'Configurable Look and Feel',
- description: "Customize the look and feel of the portals and workshops to fit your own style.",
+ title: 'Self Paced or Supervised',
+ description: 'Choose between self-paced or supervised training modes to suit your learning style and needs.',
+ icon: FaBook,
},
{
- title: 'Extensible',
- description: "Extend the basic capabilities to adapt to the technologies that you want to showcase.",
+ title: 'Developer Friendly',
+ description: 'The platform is designed to be developer friendly, with a focus on ease of use and customization.',
+ icon: FaCode,
},
{
- title: 'Open Source',
- description: "Developed as an open-source project with a great community of developers and users behind.",
+ title: 'Customizable',
+ description: 'Customize the platform to your specific training needs and requirements.',
+ icon: FaPencilAlt,
+ },
+ {
+ title: 'Run Anywhere',
+ description: 'The platform can be run anywhere, whether it be on a local machine, a cloud provider, or a Kubernetes cluster.',
+ icon: FaGlobe,
},
{
- title: 'World class documentation',
- description: "Comprehensive documentation to help you get started and understand the internals.",
- // icon: 'https://docusaurus.io/img/undraw_docusaurus_react.svg',
+ title: 'Open Source',
+ description: 'The platform is open source, so you can customize it to your specific training needs and requirements.',
+ icon: FaCode,
},
-];
\ No newline at end of file
+];
diff --git a/src/data/pricing.tsx b/src/data/pricing.tsx
new file mode 100644
index 0000000..4112fde
--- /dev/null
+++ b/src/data/pricing.tsx
@@ -0,0 +1,84 @@
+export interface PricingPlan {
+ name: string;
+ price?: string;
+ features: string[];
+ isPopular?: boolean;
+ isOSS?: boolean;
+ }
+
+ export const pricingTitle = 'Pricing';
+ export const pricingDescription = 'Just kidding! Educates is free and Open-Source. You can still make your contribution by sponsoring the project, or hire us to help you out!';
+
+ export const pricingPlans: PricingPlan[] = [
+ {
+ name: 'Open Source',
+ // price: '0',
+ features: [
+ 'Self-hosted (Install on your own infrastructure)',
+ 'Community support',
+ 'Basic features',
+ 'GitHub repository access',
+ 'Apache 2.0 License',
+ 'Free forever',
+ ],
+ isOSS: true,
+ isPopular: true,
+ },
+ {
+ name: 'Sponsored Open Source',
+ // price: '0',
+ features: [
+ 'Self-hosted (Install on your own infrastructure)',
+ 'Premium Community support',
+ 'Basic features',
+ 'GitHub repository access',
+ 'Apache 2.0 License',
+ 'Free forever',
+ 'Our love and gratitude',
+ ],
+ isOSS: true,
+ isPopular: false,
+ },
+ // {
+ // name: 'Free',
+ // price: '0',
+ // features: [
+ // 'Up to 10 workshops',
+ // 'Basic support',
+ // 'Community access',
+ // 'Basic analytics',
+ // ],
+ // },
+ // {
+ // name: 'Professional',
+ // price: '49',
+ // features: [
+ // 'Up to 100 workshops',
+ // 'Advanced support',
+ // 'Advanced analytics',
+ // ],
+ // },
+ // {
+ // name: 'Enterprise',
+ // price: '299',
+ // features: [
+ // 'Everything in Professional',
+ // 'White label of site',
+ // 'Dedicated support',
+ // 'Custom integrations',
+ // 'SLA guarantee',
+ // 'Dedicated infrastructure',
+ // ],
+ // },
+ {
+ name: 'Consultancy',
+ price: 'On request',
+ features: [
+ 'Our time and expertise',
+ 'Priority support',
+ 'Priority feature requests',
+ 'Roadmap influence',
+ ],
+ },
+ ];
+
\ No newline at end of file
diff --git a/src/data/project.tsx b/src/data/project.tsx
index 5a56164..2c64061 100644
--- a/src/data/project.tsx
+++ b/src/data/project.tsx
@@ -2,7 +2,10 @@ export type Project = {
projectGitHubUrl: string;
contributingUrl: string;
sponsorshipUrl: string;
+ descriptionTitle: string;
description: string;
+ screenshot: string;
+ youtubeUrl: string;
};
export const educatesProject: Project =
@@ -10,5 +13,11 @@ export const educatesProject: Project =
projectGitHubUrl: "https://github.com/educates/educates-training-platform",
contributingUrl: "https://github.com/educates/educates-training-platform/blob/develop/CONTRIBUTING.md",
sponsorshipUrl: "https://github.com/sponsors/educates",
- description: "Educates Training Platform",
+ descriptionTitle: "Interactive Training Platform",
+ description: "The Educates project provides a system for hosting interactive workshop environments in Kubernetes,"
+ + "or on top of a local container runtime. It can be used for self paced or supervised workshops."
+ + "It can also be useful where you need to package up demos of applications hosted in Kubernetes"
+ + "or a local container runtime.",
+ screenshot: "/img/screenshot.png",
+ youtubeUrl: "https://www.youtube.com/@EducatesTrainingPlatform",
};
\ No newline at end of file
diff --git a/src/data/references.tsx b/src/data/references.tsx
new file mode 100644
index 0000000..c3d6425
--- /dev/null
+++ b/src/data/references.tsx
@@ -0,0 +1,23 @@
+export interface Company {
+ name: string;
+ logo: string;
+ testimonial: string;
+ }
+
+ export const companies: Company[] = [
+ {
+ name: 'Terasky',
+ logo: '/img/customers/terasky-logo.svg',
+ testimonial: "Educates has transformed how we deliver technical training to our teams.",
+ },
+ {
+ name: 'Broadcom',
+ logo: '/img/customers/broadcom-logo.png',
+ testimonial: "The platform's flexibility and ease of use have made our workshops much more effective.",
+ },
+ {
+ name: 'Netways',
+ logo: '/img/customers/netways-logo.png',
+ testimonial: "We've seen a significant improvement in learning outcomes since adopting Educates.",
+ },
+ ];
\ No newline at end of file
diff --git a/src/data/team.tsx b/src/data/team.tsx
new file mode 100644
index 0000000..24b72fb
--- /dev/null
+++ b/src/data/team.tsx
@@ -0,0 +1,35 @@
+export interface TeamMember {
+ name: string;
+ role: string;
+ image: string;
+ github?: string;
+ twitter?: string;
+ linkedin?: string;
+}
+
+export const teamMembers: TeamMember[] = [
+ {
+ name: 'Graham Dumpleton',
+ role: 'Project co-Lead',
+ image: 'https://avatars.githubusercontent.com/u/507637?v=4',
+ github: 'https://github.com/GrahamDumpleton',
+ // twitter: 'https://twitter.com/GrahamDumpleton',
+ linkedin: 'https://linkedin.com/in/GrahamDumpleton',
+ },
+ {
+ name: 'Jorge Morales',
+ role: 'Project co-Lead',
+ image: 'https://avatars.githubusercontent.com/u/78350?v=4',
+ github: 'https://github.com/jorgemoralespou',
+ // twitter: 'https://twitter.com/jorgemoralespou',
+ linkedin: 'https://linkedin.com/in/jorgemoralespou',
+ },
+ {
+ name: 'Bill Kable',
+ role: 'Project contributor',
+ image: 'https://avatars.githubusercontent.com/u/830281?v=4',
+ github: 'https://github.com/billkable',
+ // twitter: 'https://twitter.com/billkable',
+ linkedin: 'https://linkedin.com/in/billkable',
+ },
+];
\ No newline at end of file
diff --git a/src/data/usecases.tsx b/src/data/usecases.tsx
new file mode 100644
index 0000000..7e6c4ed
--- /dev/null
+++ b/src/data/usecases.tsx
@@ -0,0 +1,34 @@
+import { IconType } from "react-icons";
+import { FaUsers } from "react-icons/fa";
+import { FaLaptopCode } from "react-icons/fa";
+import { FaRocket } from "react-icons/fa";
+import { FaChalkboardTeacher } from "react-icons/fa";
+
+export interface UseCase {
+ title: string;
+ description: string;
+ icon: IconType;
+}
+
+export const useCases: UseCase[] = [
+ {
+ title: 'Interactive Workshops',
+ description: 'Host engaging workshops with hands-on exercises and real-time feedback.',
+ icon: FaLaptopCode,
+ },
+ {
+ title: 'Team Training',
+ description: 'Train your team effectively with customized learning environments.',
+ icon: FaUsers,
+ },
+ {
+ title: 'Product Demos',
+ description: 'Showcase your products with interactive demonstrations and tutorials.',
+ icon: FaRocket,
+ },
+ {
+ title: 'Educational Programs',
+ description: 'Create comprehensive educational programs with practical exercises.',
+ icon: FaChalkboardTeacher,
+ },
+];
diff --git a/src/pages/features.tsx b/src/pages/features.tsx
deleted file mode 100644
index 4dd63d0..0000000
--- a/src/pages/features.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react';
-import Layout from '@theme/Layout';
-import FeatureCards from '../components/FeaturesCards';
-import Heading from '@theme/Heading';
-
-const TITLE = "Project Features";
-
-function FeaturesHeader() {
- return (
-
- );
-}
-
-export default function Features() {
- return (
-
-
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index bd45e75..a4c150a 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -1,78 +1,33 @@
-import React, { useEffect, useRef, FC } from 'react';
-// import clsx from 'clsx';
-// import Link from '@docusaurus/Link';
+import React from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
-// import HomepageFeatures from '@site/src/components/HomepageFeatures';
-// import Heading from '@theme/Heading';
-import Img from '@theme/MDXComponents/Img';
-import { initializeItyped } from '../js/ityped';
-import { ImageAndText } from '../components/ImageAndText';
-import Pricing from '../components/Pricing/Pricing';
-
-// create a list of strings
-const educatesHighlights = [
- "Interactive workshop environments in Kubernetes",
- "Open-Source",
- "Secure",
- "Scalable",
- "Extensible",
-];
-
-function MainSection({ title }: { title: string }): JSX.Element {
- return (
-
-

- {/*
- {title}
- */}
-
-
-
-
-
- {educatesHighlights.map((feature) => (
- - {feature}
- ))}
-
-
-
- );
-}
-
-
+import Description from '../components/sections/Description';
+import Features from '../components/sections/Features';
+import UseCases from '../components/sections/UseCases';
+import Team from '../components/sections/Team';
+import References from '../components/sections/References';
+import Pricing from '../components/sections/Pricing';
+import FeaturedContent from '../components/sections/FeaturedContent';
+import featuredCards from '../data/featuredContent';
export default function Home(): JSX.Element {
const { siteConfig } = useDocusaurusContext();
- const heroRef = useRef(null);
+ var index = 0;
- useEffect(() => {
- initializeItyped(educatesHighlights);
- }, []);
+ function getSectionType(index: number) {
+ return index % 2 === 0 ? 'odd' : 'even';
+ }
return (
-
-
- The Educates project provides a system for hosting interactive workshop environments in Kubernetes, or on top of a local container runtime. It can be used for self paced or supervised workshops. It can also be useful where you need to package up demos of applications hosted in Kubernetes or a local container runtime.
-
-
-
+ description="Interactive workshop environments in Kubernetes. Educates provides a system for hosting interactive workshop environments in Kubernetes, or on top of a local container runtime.">
+
+
+
+
+
+ {/* */}
+
+
);
}
diff --git a/src/pages/resources.md b/src/pages/resources.md
deleted file mode 100644
index a2288f0..0000000
--- a/src/pages/resources.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Resources
----
-
-This are some additional resources, like videos, presentations, talks, ...
\ No newline at end of file
diff --git a/src/theme/Layout.js b/src/theme/Layout.js
new file mode 100644
index 0000000..cb53fb1
--- /dev/null
+++ b/src/theme/Layout.js
@@ -0,0 +1,29 @@
+import React, { useEffect } from 'react';
+import Layout from '@theme-original/Layout';
+import { useLocation } from '@docusaurus/router';
+
+export default function LayoutWrapper(props) {
+ const location = useLocation();
+
+ useEffect(() => {
+ // Add/remove home-navbar-bg based on current path
+ if (location.pathname === '/' || location.pathname === '/index.html') {
+ document.body.classList.add('home-navbar-bg');
+ } else {
+ document.body.classList.remove('home-navbar-bg');
+ }
+ }, [location.pathname]);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ if (window.scrollY > 10) {
+ document.body.classList.add('navbar-bg-transparent');
+ } else {
+ document.body.classList.remove('navbar-bg-transparent');
+ }
+ };
+ window.addEventListener('scroll', handleScroll);
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+ return ;
+}
\ No newline at end of file
diff --git a/static/img/customers/broadcom-logo.png b/static/img/customers/broadcom-logo.png
new file mode 100644
index 0000000..8d5a321
Binary files /dev/null and b/static/img/customers/broadcom-logo.png differ
diff --git a/static/img/customers/netways-logo.png b/static/img/customers/netways-logo.png
new file mode 100644
index 0000000..38cd612
Binary files /dev/null and b/static/img/customers/netways-logo.png differ
diff --git a/static/img/customers/terasky-logo.svg b/static/img/customers/terasky-logo.svg
new file mode 100644
index 0000000..ccb9432
--- /dev/null
+++ b/static/img/customers/terasky-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/img/featured-content/cloud.jpeg b/static/img/featured-content/cloud.jpeg
new file mode 100644
index 0000000..a036e70
Binary files /dev/null and b/static/img/featured-content/cloud.jpeg differ
diff --git a/static/img/featured-content/working_locally.jpeg b/static/img/featured-content/working_locally.jpeg
new file mode 100644
index 0000000..09cbaa5
Binary files /dev/null and b/static/img/featured-content/working_locally.jpeg differ
diff --git a/yarn.lock b/yarn.lock
index 38f140d..acc6d83 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -276,7 +276,7 @@
"@babel/traverse" "^7.25.9"
"@babel/types" "^7.25.9"
-"@babel/helper-module-imports@^7.25.9":
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9":
version "7.25.9"
resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz"
integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
@@ -1022,12 +1022,10 @@
core-js-pure "^3.30.2"
regenerator-runtime "^0.14.0"
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.21.0", "@babel/runtime@^7.25.9", "@babel/runtime@^7.8.4":
- version "7.26.10"
- resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz"
- integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==
- dependencies:
- regenerator-runtime "^0.14.0"
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.25.9", "@babel/runtime@^7.27.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz"
+ integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==
"@babel/template@^7.25.9", "@babel/template@^7.26.9":
version "7.26.9"
@@ -1953,6 +1951,113 @@
utility-types "^3.10.0"
webpack "^5.88.1"
+"@emotion/babel-plugin@^11.13.5":
+ version "11.13.5"
+ resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
+ integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/serialize" "^1.3.3"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0":
+ version "11.14.0"
+ resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz"
+ integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/sheet" "^1.4.0"
+ "@emotion/utils" "^1.4.2"
+ "@emotion/weak-memoize" "^0.4.0"
+ stylis "4.2.0"
+
+"@emotion/hash@^0.9.2":
+ version "0.9.2"
+ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz"
+ integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
+
+"@emotion/is-prop-valid@^1.3.0":
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz"
+ integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+
+"@emotion/memoize@^0.9.0":
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
+ integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
+
+"@emotion/react@^11.14.0":
+ version "11.14.0"
+ resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
+ integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.13.5"
+ "@emotion/cache" "^11.14.0"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
+ "@emotion/utils" "^1.4.2"
+ "@emotion/weak-memoize" "^0.4.0"
+ hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.3.3":
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz"
+ integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==
+ dependencies:
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/unitless" "^0.10.0"
+ "@emotion/utils" "^1.4.2"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
+ integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
+
+"@emotion/styled@^11.14.0":
+ version "11.14.0"
+ resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz"
+ integrity sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.13.5"
+ "@emotion/is-prop-valid" "^1.3.0"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
+ "@emotion/utils" "^1.4.2"
+
+"@emotion/unitless@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz"
+ integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz"
+ integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==
+
+"@emotion/utils@^1.4.2":
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz"
+ integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==
+
+"@emotion/weak-memoize@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
+ integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
+
"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0":
version "9.3.0"
resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz"
@@ -2092,6 +2197,83 @@
dependencies:
langium "3.3.1"
+"@mui/core-downloads-tracker@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.1.0.tgz"
+ integrity sha512-E0OqhZv548Qdc0PwWhLVA2zmjJZSTvaL4ZhoswmI8NJEC1tpW2js6LLP827jrW9MEiXYdz3QS6+hask83w74yQ==
+
+"@mui/material@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/@mui/material/-/material-7.1.0.tgz"
+ integrity sha512-ahUJdrhEv+mCp4XHW+tHIEYzZMSRLg8z4AjUOsj44QpD1ZaMxQoVOG2xiHvLFdcsIPbgSRx1bg1eQSheHBgvtg==
+ dependencies:
+ "@babel/runtime" "^7.27.1"
+ "@mui/core-downloads-tracker" "^7.1.0"
+ "@mui/system" "^7.1.0"
+ "@mui/types" "^7.4.2"
+ "@mui/utils" "^7.1.0"
+ "@popperjs/core" "^2.11.8"
+ "@types/react-transition-group" "^4.4.12"
+ clsx "^2.1.1"
+ csstype "^3.1.3"
+ prop-types "^15.8.1"
+ react-is "^19.1.0"
+ react-transition-group "^4.4.5"
+
+"@mui/private-theming@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.1.0.tgz"
+ integrity sha512-4Kck4jxhqF6YxNwJdSae1WgDfXVg0lIH6JVJ7gtuFfuKcQCgomJxPvUEOySTFRPz1IZzwz5OAcToskRdffElDA==
+ dependencies:
+ "@babel/runtime" "^7.27.1"
+ "@mui/utils" "^7.1.0"
+ prop-types "^15.8.1"
+
+"@mui/styled-engine@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.1.0.tgz"
+ integrity sha512-m0mJ0c6iRC+f9hMeRe0W7zZX1wme3oUX0+XTVHjPG7DJz6OdQ6K/ggEOq7ZdwilcpdsDUwwMfOmvO71qDkYd2w==
+ dependencies:
+ "@babel/runtime" "^7.27.1"
+ "@emotion/cache" "^11.13.5"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/sheet" "^1.4.0"
+ csstype "^3.1.3"
+ prop-types "^15.8.1"
+
+"@mui/system@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/@mui/system/-/system-7.1.0.tgz"
+ integrity sha512-iedAWgRJMCxeMHvkEhsDlbvkK+qKf9me6ofsf7twk/jfT4P1ImVf7Rwb5VubEA0sikrVL+1SkoZM41M4+LNAVA==
+ dependencies:
+ "@babel/runtime" "^7.27.1"
+ "@mui/private-theming" "^7.1.0"
+ "@mui/styled-engine" "^7.1.0"
+ "@mui/types" "^7.4.2"
+ "@mui/utils" "^7.1.0"
+ clsx "^2.1.1"
+ csstype "^3.1.3"
+ prop-types "^15.8.1"
+
+"@mui/types@^7.4.2":
+ version "7.4.2"
+ resolved "https://registry.npmjs.org/@mui/types/-/types-7.4.2.tgz"
+ integrity sha512-edRc5JcLPsrlNFYyTPxds+d5oUovuUxnnDtpJUbP6WMeV4+6eaX/mqai1ZIWT62lCOe0nlrON0s9HDiv5en5bA==
+ dependencies:
+ "@babel/runtime" "^7.27.1"
+
+"@mui/utils@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/@mui/utils/-/utils-7.1.0.tgz"
+ integrity sha512-/OM3S8kSHHmWNOP+NH9xEtpYSG10upXeQ0wLZnfDgmgadTAk5F4MQfFLyZ5FCRJENB3eRzltMmaNl6UtDnPovw==
+ dependencies:
+ "@babel/runtime" "^7.27.1"
+ "@mui/types" "^7.4.2"
+ "@types/prop-types" "^15.7.14"
+ clsx "^2.1.1"
+ prop-types "^15.8.1"
+ react-is "^19.1.0"
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
@@ -2139,6 +2321,11 @@
resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz"
integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==
+"@popperjs/core@^2.11.8":
+ version "2.11.8"
+ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
+
"@sideway/address@^4.1.5":
version "4.1.5"
resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz"
@@ -2734,6 +2921,11 @@
resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz"
integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==
+"@types/prop-types@^15.7.14":
+ version "15.7.14"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz"
+ integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==
+
"@types/qs@*":
version "6.9.18"
resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz"
@@ -2744,6 +2936,11 @@
resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz"
integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
+"@types/react-dom@^19.1.3":
+ version "19.1.3"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz"
+ integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==
+
"@types/react-router-config@*", "@types/react-router-config@^5.0.7":
version "5.0.11"
resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz"
@@ -2770,10 +2967,15 @@
"@types/history" "^4.7.11"
"@types/react" "*"
-"@types/react@*":
- version "19.1.2"
- resolved "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz"
- integrity sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==
+"@types/react-transition-group@^4.4.12":
+ version "4.4.12"
+ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
+ integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
+
+"@types/react@*", "@types/react@^19.1.3":
+ version "19.1.3"
+ resolved "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz"
+ integrity sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==
dependencies:
csstype "^3.0.2"
@@ -3219,6 +3421,15 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies:
object.assign "^4.1.0"
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
babel-plugin-polyfill-corejs2@^0.4.10:
version "0.4.13"
resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz"
@@ -3830,6 +4041,11 @@ content-type@~1.0.4, content-type@~1.0.5:
resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+convert-source-map@^1.5.0:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
convert-source-map@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
@@ -3909,6 +4125,17 @@ cosmiconfig@^6.0.0:
path-type "^4.0.0"
yaml "^1.7.2"
+cosmiconfig@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
cosmiconfig@^8.1.3, cosmiconfig@^8.3.5:
version "8.3.6"
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz"
@@ -4109,7 +4336,7 @@ csso@^5.0.5:
dependencies:
css-tree "~2.2.0"
-csstype@^3.0.2, csstype@^3.1.0:
+csstype@^3.0.2, csstype@^3.1.0, csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
@@ -4590,6 +4817,14 @@ dom-converter@^0.2.0:
dependencies:
utila "~0.4"
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
+ integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
dom-serializer@^1.0.1:
version "1.4.1"
resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
@@ -5140,6 +5375,11 @@ find-cache-dir@^4.0.0:
common-path-prefix "^3.0.0"
pkg-dir "^7.0.0"
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
@@ -5616,7 +5856,7 @@ history@^4.9.0:
tiny-warning "^1.0.0"
value-equal "^1.0.1"
-hoist-non-react-statics@^3.1.0:
+hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1:
version "3.3.2"
resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -5820,7 +6060,7 @@ immer@^9.0.7:
resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz"
integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
-import-fresh@^3.1.0, import-fresh@^3.3.0:
+import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0:
version "3.3.1"
resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz"
integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
@@ -8328,7 +8568,7 @@ prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -8504,6 +8744,11 @@ react-fast-compare@^3.2.0:
react-fast-compare "^3.2.0"
shallowequal "^1.1.0"
+react-icons@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz"
+ integrity sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==
+
react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
@@ -8514,6 +8759,11 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0:
resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+react-is@^19.1.0:
+ version "19.1.0"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz"
+ integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==
+
react-json-view-lite@^1.2.0:
version "1.5.0"
resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz"
@@ -8568,6 +8818,16 @@ react-router@5.3.4, react-router@^5.3.4:
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
+ integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
react-waypoint@^10.3.0:
version "10.3.0"
resolved "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.3.0.tgz"
@@ -8883,7 +9143,7 @@ resolve-pathname@^3.0.0:
resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz"
integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
-resolve@^1.1.6, resolve@^1.14.2:
+resolve@^1.1.6, resolve@^1.14.2, resolve@^1.19.0:
version "1.22.10"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz"
integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
@@ -9341,6 +9601,11 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
source-map@^0.6.0, source-map@~0.6.0:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
@@ -9519,6 +9784,11 @@ stylehacks@^6.1.1:
browserslist "^4.23.0"
postcss-selector-parser "^6.0.16"
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
stylis@^4.3.6:
version "4.3.6"
resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz"
@@ -10251,7 +10521,7 @@ yallist@^3.0.2:
resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-yaml@^1.7.2:
+yaml@^1.10.0, yaml@^1.7.2:
version "1.10.2"
resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==