diff --git a/package-lock.json b/package-lock.json
index b5a1c009..42b1f247 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,14 +15,14 @@
"@fortawesome/free-brands-svg-icons": "^6.2.1",
"@fortawesome/free-regular-svg-icons": "^6.2.1",
"@fortawesome/free-solid-svg-icons": "^6.2.1",
- "@fortawesome/react-fontawesome": "^0.2.0",
+ "@fortawesome/react-fontawesome": "^3.1.1",
"@headlessui/react": "^1.7.2",
"@mapbox/rehype-prism": "^0.8.0",
"@mdx-js/loader": "^2.3.0",
"@mdx-js/react": "^2.3.0",
"@mui/icons-material": "^6.4.1",
"@mui/material": "^6.4.1",
- "@next/mdx": "^13.5.6",
+ "@next/mdx": "^14.1.3",
"@tailwindcss/typography": "^0.5.4",
"@types/mdx": "^2.0.11",
"autoprefixer": "^10.4.12",
@@ -31,12 +31,13 @@
"fast-glob": "^3.2.11",
"feed": "^4.2.2",
"focus-visible": "^5.2.0",
- "framer-motion": "^12.0.6",
+ "framer-motion": "^12.30.0",
"next": "^14.1.3",
"postcss-focus-visible": "^6.0.4",
"react": "^18.2.0",
"react-chartjs-2": "^5.3.0",
"react-dom": "^18.2.0",
+ "react-markdown": "^8.0.7",
"remark-gfm": "^3.0.1",
"tailwindcss": "^3.2.1"
},
@@ -431,15 +432,16 @@
}
},
"node_modules/@fortawesome/react-fontawesome": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
- "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
- "dependencies": {
- "prop-types": "^15.8.1"
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-3.1.1.tgz",
+ "integrity": "sha512-EDllr9hpodc21odmUywHS1alXNiCd4E8sp5GJ5s7wYINz8vSmMiNWpALTiuYODb865YyQ/NlyiN4mbXp7HCNqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
},
"peerDependencies": {
- "@fortawesome/fontawesome-svg-core": "~1 || ~6",
- "react": ">=16.3"
+ "@fortawesome/fontawesome-svg-core": "~6 || ~7",
+ "react": "^18.0.0 || ^19.0.0"
}
},
"node_modules/@headlessui/react": {
@@ -1060,9 +1062,10 @@
}
},
"node_modules/@next/mdx": {
- "version": "13.5.6",
- "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-13.5.6.tgz",
- "integrity": "sha512-2AMyCrz1SxSWNUpADyLz3RbPbq0GHrchbO7Msvg7IsH8MrTw3VYaZSI1KNa6JzZIoykwtNVSEL+uBmPZi106Jw==",
+ "version": "14.1.3",
+ "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-14.1.3.tgz",
+ "integrity": "sha512-KrfpZ1Iz9SCIW8Qu3uWCIkVUGgIjiPRlxKksr8IgKKlMUEV9D88JNkS1MUfgSdbVgKLED3mPnLoO0gzoQz1yDw==",
+ "license": "MIT",
"dependencies": {
"source-map": "^0.7.0"
},
@@ -2444,9 +2447,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001699",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
- "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+ "version": "1.0.30001767",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz",
+ "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==",
"funding": [
{
"type": "opencollective",
@@ -4225,13 +4228,13 @@
}
},
"node_modules/framer-motion": {
- "version": "12.0.6",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.0.6.tgz",
- "integrity": "sha512-LmrXbXF6Vv5WCNmb+O/zn891VPZrH7XbsZgRLBROw6kFiP+iTK49gxTv2Ur3F0Tbw6+sy9BVtSqnWfMUpH+6nA==",
+ "version": "12.30.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.30.0.tgz",
+ "integrity": "sha512-S7t3UjvghrFiJzFJ30ncX6keUipexw9f7DRpauhW9bXPNxg0dMxoPbNIDpLuxK1NvxF2wswFEMEm7WiNAcdELg==",
"license": "MIT",
"dependencies": {
- "motion-dom": "^12.0.0",
- "motion-utils": "^12.0.0",
+ "motion-dom": "^12.30.0",
+ "motion-utils": "^12.29.2",
"tslib": "^2.4.0"
},
"peerDependencies": {
@@ -6312,9 +6315,10 @@
}
},
"node_modules/markdown-table": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
- "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -6349,10 +6353,12 @@
}
},
"node_modules/mdast-util-find-and-replace": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz",
- "integrity": "sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz",
+ "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==",
+ "license": "MIT",
"dependencies": {
+ "@types/mdast": "^3.0.0",
"escape-string-regexp": "^5.0.0",
"unist-util-is": "^5.0.0",
"unist-util-visit-parents": "^5.0.0"
@@ -6366,6 +6372,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -6397,9 +6404,10 @@
}
},
"node_modules/mdast-util-gfm": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz",
- "integrity": "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz",
+ "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==",
+ "license": "MIT",
"dependencies": {
"mdast-util-from-markdown": "^1.0.0",
"mdast-util-gfm-autolink-literal": "^1.0.0",
@@ -6415,9 +6423,10 @@
}
},
"node_modules/mdast-util-gfm-autolink-literal": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz",
- "integrity": "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz",
+ "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"ccount": "^2.0.0",
@@ -6430,9 +6439,10 @@
}
},
"node_modules/mdast-util-gfm-footnote": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz",
- "integrity": "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz",
+ "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-markdown": "^1.3.0",
@@ -6444,9 +6454,10 @@
}
},
"node_modules/mdast-util-gfm-strikethrough": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz",
- "integrity": "sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz",
+ "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-markdown": "^1.3.0"
@@ -6457,9 +6468,10 @@
}
},
"node_modules/mdast-util-gfm-table": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz",
- "integrity": "sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz",
+ "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"markdown-table": "^3.0.0",
@@ -6472,9 +6484,10 @@
}
},
"node_modules/mdast-util-gfm-task-list-item": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz",
- "integrity": "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz",
+ "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-markdown": "^1.3.0"
@@ -6799,9 +6812,10 @@
}
},
"node_modules/micromark-extension-gfm": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz",
- "integrity": "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz",
+ "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==",
+ "license": "MIT",
"dependencies": {
"micromark-extension-gfm-autolink-literal": "^1.0.0",
"micromark-extension-gfm-footnote": "^1.0.0",
@@ -6818,15 +6832,15 @@
}
},
"node_modules/micromark-extension-gfm-autolink-literal": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz",
- "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz",
+ "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==",
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-sanitize-uri": "^1.0.0",
"micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
+ "micromark-util-types": "^1.0.0"
},
"funding": {
"type": "opencollective",
@@ -6834,9 +6848,10 @@
}
},
"node_modules/micromark-extension-gfm-footnote": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz",
- "integrity": "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz",
+ "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==",
+ "license": "MIT",
"dependencies": {
"micromark-core-commonmark": "^1.0.0",
"micromark-factory-space": "^1.0.0",
@@ -6853,9 +6868,10 @@
}
},
"node_modules/micromark-extension-gfm-strikethrough": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz",
- "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz",
+ "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==",
+ "license": "MIT",
"dependencies": {
"micromark-util-chunked": "^1.0.0",
"micromark-util-classify-character": "^1.0.0",
@@ -6870,9 +6886,10 @@
}
},
"node_modules/micromark-extension-gfm-table": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz",
- "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz",
+ "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==",
+ "license": "MIT",
"dependencies": {
"micromark-factory-space": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -6886,9 +6903,10 @@
}
},
"node_modules/micromark-extension-gfm-tagfilter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz",
- "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz",
+ "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==",
+ "license": "MIT",
"dependencies": {
"micromark-util-types": "^1.0.0"
},
@@ -6898,9 +6916,10 @@
}
},
"node_modules/micromark-extension-gfm-task-list-item": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz",
- "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz",
+ "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==",
+ "license": "MIT",
"dependencies": {
"micromark-factory-space": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -7497,18 +7516,18 @@
}
},
"node_modules/motion-dom": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.0.0.tgz",
- "integrity": "sha512-CvYd15OeIR6kHgMdonCc1ihsaUG4MYh/wrkz8gZ3hBX/uamyZCXN9S9qJoYF03GqfTt7thTV/dxnHYX4+55vDg==",
+ "version": "12.30.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.30.0.tgz",
+ "integrity": "sha512-p6Mp+lxm+mK4O86YVyL6KAlFDVCIqpmcBt+uMVapMBqltPXpwZ5Wj2crnN2VE7lwsas0ONCPIW9YVpMigu4F5g==",
"license": "MIT",
"dependencies": {
- "motion-utils": "^12.0.0"
+ "motion-utils": "^12.29.2"
}
},
"node_modules/motion-utils": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.0.0.tgz",
- "integrity": "sha512-MNFiBKbbqnmvOjkPyOKgHUp3Q6oiokLkI1bEwm5QA28cxMZrv0CbbBGDNmhF6DIXsi1pCQBSs0dX8xjeER1tmA==",
+ "version": "12.29.2",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
"license": "MIT"
},
"node_modules/mri": {
@@ -8623,6 +8642,58 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/react-markdown": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz",
+ "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "@types/prop-types": "^15.0.0",
+ "@types/unist": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^2.0.0",
+ "prop-types": "^15.0.0",
+ "property-information": "^6.0.0",
+ "react-is": "^18.0.0",
+ "remark-parse": "^10.0.0",
+ "remark-rehype": "^10.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^0.4.0",
+ "unified": "^10.0.0",
+ "unist-util-visit": "^4.0.0",
+ "vfile": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "node_modules/react-markdown/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/react-markdown/node_modules/unist-util-visit": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
+ "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^5.0.0",
+ "unist-util-visit-parents": "^5.1.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@@ -8763,6 +8834,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
"integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-gfm": "^2.0.0",
diff --git a/package.json b/package.json
index 95f375b5..f1199c0a 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,8 @@
"dev": "next dev",
"build": "next build",
"start": "next start",
- "lint": "next lint"
+ "lint": "next lint",
+ "disable-telemetry": "npx next telemetry disable"
},
"author": "AOSSIE",
"license": "ISC",
@@ -18,14 +19,14 @@
"@fortawesome/free-brands-svg-icons": "^6.2.1",
"@fortawesome/free-regular-svg-icons": "^6.2.1",
"@fortawesome/free-solid-svg-icons": "^6.2.1",
- "@fortawesome/react-fontawesome": "^0.2.0",
+ "@fortawesome/react-fontawesome": "^3.1.1",
"@headlessui/react": "^1.7.2",
"@mapbox/rehype-prism": "^0.8.0",
"@mdx-js/loader": "^2.3.0",
"@mdx-js/react": "^2.3.0",
"@mui/icons-material": "^6.4.1",
"@mui/material": "^6.4.1",
- "@next/mdx": "^13.5.6",
+ "@next/mdx": "^14.1.3",
"@tailwindcss/typography": "^0.5.4",
"@types/mdx": "^2.0.11",
"autoprefixer": "^10.4.12",
@@ -34,12 +35,13 @@
"fast-glob": "^3.2.11",
"feed": "^4.2.2",
"focus-visible": "^5.2.0",
- "framer-motion": "^12.0.6",
+ "framer-motion": "^12.30.0",
"next": "^14.1.3",
"postcss-focus-visible": "^6.0.4",
"react": "^18.2.0",
"react-chartjs-2": "^5.3.0",
"react-dom": "^18.2.0",
+ "react-markdown": "^8.0.7",
"remark-gfm": "^3.0.1",
"tailwindcss": "^3.2.1"
},
diff --git a/src/app/about/page.jsx b/src/app/about/page.jsx
new file mode 100644
index 00000000..b1991bcd
--- /dev/null
+++ b/src/app/about/page.jsx
@@ -0,0 +1,186 @@
+'use client'
+
+import { useState, useEffect } from 'react';
+import Image from 'next/image';
+import { Container } from '@/components/shared/Container';
+import { Banner } from '@/components/shared/Banner';
+import { Timeline } from '@/components/about/Timeline';
+import { Team } from '@/components/about/Team';
+import React from 'react';
+import { Line } from 'react-chartjs-2';
+import { Chart as ChartJS, LineElement, CategoryScale, LinearScale, PointElement } from 'chart.js';
+import { motion } from 'framer-motion';
+
+ChartJS.register(LineElement, CategoryScale, LinearScale, PointElement);
+
+export default function About() {
+ const [stats, setStats] = useState({
+ years: 8,
+ projects: 80,
+ contributors: 70,
+ graphData: {
+ labels: ['2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024'],
+ data: [4, 8, 12, 9, 9, 11, 8, 6, 18]
+ }
+ });
+
+ // Detect dark mode preference on page load and fetch stats
+ useEffect(() => {
+ const fetchStats = async () => {
+ try {
+ const res = await fetch('/api/stats');
+ const data = await res.json();
+ if (!data.error) {
+ setStats(data);
+ }
+ } catch (error) {
+ console.error('Failed to fetch stats:', error);
+ }
+ };
+
+ fetchStats();
+ }, []);
+
+ const data = {
+ labels: stats.graphData.labels, // Include '0' on the x-axis
+ datasets: [
+ {
+ label: 'Number of Repositories',
+ data: stats.graphData.data, // Start data points from '2017', leave '0' as null
+ fill: false,
+ borderColor: '#32a852',
+ tension: 0.4,
+ },
+ ],
+ };
+
+ const options = {
+ responsive: true,
+ maintainAspectRatio: false,
+ plugins: {
+ legend: {
+ display: false,
+ },
+ },
+ scales: {
+ x: {
+ type: 'category',
+ grid: {
+ display: true,
+ color: '#FFCC00',
+ },
+ ticks: {
+ callback: (value, index) => data.labels[index], // Match x-axis labels
+ },
+ },
+ y: {
+ beginAtZero: true, // Start y-axis from 0
+ ticks: {
+ stepSize: 5, // Increment y-axis labels by 5
+ },
+ grid: {
+ display: true,
+ color: '#FFCC00',
+ },
+ },
+ },
+ };
+
+ return (
+ <>
+
+
+
+
+ ABOUT US
+
+
+ AOSSIE (Australian Open
+ Source Software Innovation and Education) is a not-for-profit
+ umbrella organization for open-source projects. We believe the
+ open-source philosophy provides a resource-efficient channel to
+ transfer knowledge and achieve innovation and education.
+
+
+
+
+
+
+
+
+
+ {/* Stats Cards */}
+ {[
+ { value: stats.years, label: 'years completed' },
+ { value: stats.projects, label: 'projects completed' },
+ { value: `${stats.contributors}+`, label: 'contributors' }
+ ].map((item, index) => (
+
+ {item.value}
+ {item.label}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/api/stats/route.js b/src/app/api/stats/route.js
new file mode 100644
index 00000000..a0fd1693
--- /dev/null
+++ b/src/app/api/stats/route.js
@@ -0,0 +1,94 @@
+import { NextResponse } from 'next/server';
+import projects from '@/helper/projects';
+
+export async function GET() {
+ try {
+ const startYear = 2016;
+ const currentYear = new Date().getFullYear();
+ const yearsOfAossie = currentYear - startYear;
+
+ // Count projects from the helper file as requested
+ const completedProjectsCount = projects.length;
+
+ // Fetch GitHub Data
+ // Note: Unauthenticated requests are limited to 60 per hour per IP.
+ const org = 'AOSSIE-Org';
+ const headers = {
+ 'Accept': 'application/vnd.github.v3+json',
+ // Add 'Authorization': `token ${process.env.GITHUB_TOKEN}` if you have one
+ };
+
+ // 1. Fetch Repositories
+ const reposRes = await fetch(`https://api.github.com/orgs/${org}/repos?per_page=100&type=public`, { headers, next: { revalidate: 3600 } });
+
+ if (!reposRes.ok) {
+ throw new Error(`GitHub API Error: ${reposRes.statusText}`);
+ }
+
+ const repos = await reposRes.json();
+
+ // 2. Process for Graph (Repos per year)
+ // The user wants "Number of repos in (green) over the past years".
+ // We will group by 'created_at'.
+ const repoCountsByYear = {};
+ const yearsSet = new Set();
+
+ // Initialize years from startYear to currentYear to ensure continuous axis
+ for (let y = startYear; y <= currentYear; y++) {
+ repoCountsByYear[y] = 0;
+ yearsSet.add(y);
+ }
+
+ repos.forEach(repo => {
+ const year = new Date(repo.created_at).getFullYear();
+ if (year >= startYear) {
+ repoCountsByYear[year] = (repoCountsByYear[year] || 0) + 1;
+ }
+ });
+
+ const labels = Object.keys(repoCountsByYear).sort((a, b) => parseInt(a) - parseInt(b));
+ const data = labels.map(year => repoCountsByYear[year]);
+
+
+ // 3. Count Contributors
+ // Fetching contributors for ALL repos consumes too much rate limit (N requests).
+ // We will proactively fetch contributors for the top 6 most starred/popular repos to get a good estimate.
+ // Sorting repos by stargazers_count
+ const topRepos = repos.sort((a, b) => b.stargazers_count - a.stargazers_count).slice(0, 6);
+
+ const contributorIds = new Set();
+
+ const contributorPromises = topRepos.map(async (repo) => {
+ try {
+ const contribRes = await fetch(repo.contributors_url + '?per_page=100', { headers, next: { revalidate: 3600 } });
+ if (contribRes.ok) {
+ const contributors = await contribRes.json();
+ if (Array.isArray(contributors)) {
+ contributors.forEach(c => contributorIds.add(c.id));
+ }
+ }
+ } catch (e) {
+ console.error(`Failed to fetch contributors for ${repo.name}`, e);
+ }
+ });
+
+ await Promise.all(contributorPromises);
+
+ // Fallback if APIs fail or return 0 (which is unlikely for top repos)
+ const contributorCount = contributorIds.size > 0 ? contributorIds.size : 70;
+
+ return NextResponse.json({
+ years: yearsOfAossie,
+ projects: completedProjectsCount,
+ contributors: contributorCount,
+ graphData: {
+ labels,
+ data
+ }
+ });
+
+ } catch (error) {
+ console.error('API Error:', error);
+ return NextResponse.json({ error: error.message }, { status: 500 });
+ }
+}
diff --git a/src/app/apply/page.jsx b/src/app/apply/page.jsx
new file mode 100644
index 00000000..f7cd4fb2
--- /dev/null
+++ b/src/app/apply/page.jsx
@@ -0,0 +1,56 @@
+import Image from 'next/image'
+import Link from 'next/link'
+
+import { Container } from '@/components/shared/Container'
+import { TimelineElement } from '@/components/about/TimelineElement'
+import { ApplyHeader } from '@/components/apply/ApplyHeader'
+import GSoC from '@/images/logo.svg'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faDiscord, faGitlab } from '@fortawesome/free-brands-svg-icons'
+import { faLightbulb, faComments, faPaperPlane } from '@fortawesome/free-solid-svg-icons'
+
+export const metadata = {
+ title: 'Application Timeline',
+ description: 'How to apply for GSOC',
+}
+
+export default function Apply() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/src/pages/ideas/2022/agora-blockchain.mdx b/src/app/ideas/2022/agora-blockchain/page.mdx
similarity index 93%
rename from src/pages/ideas/2022/agora-blockchain.mdx
rename to src/app/ideas/2022/agora-blockchain/page.mdx
index a5b20d9e..9a941c1e 100644
--- a/src/pages/ideas/2022/agora-blockchain.mdx
+++ b/src/app/ideas/2022/agora-blockchain/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Blockchain',
@@ -6,7 +6,7 @@ export const meta = {
'First version of Blockchain based Agora web application, with basic features like user registration, election creation, voting and result calculation.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2022/agora-vote-android.mdx b/src/app/ideas/2022/agora-vote-android/page.mdx
similarity index 86%
rename from src/pages/ideas/2022/agora-vote-android.mdx
rename to src/app/ideas/2022/agora-vote-android/page.mdx
index 1eeb54d7..a821c06f 100644
--- a/src/pages/ideas/2022/agora-vote-android.mdx
+++ b/src/app/ideas/2022/agora-vote-android/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote Android',
@@ -6,7 +6,7 @@ export const meta = {
'Agora Vote App is an Android application that lets user create elections, invite voters, vote and view results ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2022/agora-vote-ios.mdx b/src/app/ideas/2022/agora-vote-ios/page.mdx
similarity index 84%
rename from src/pages/ideas/2022/agora-vote-ios.mdx
rename to src/app/ideas/2022/agora-vote-ios/page.mdx
index a714e108..455ae093 100644
--- a/src/pages/ideas/2022/agora-vote-ios.mdx
+++ b/src/app/ideas/2022/agora-vote-ios/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote IOS',
@@ -6,7 +6,7 @@ export const meta = {
'Agora Vote App is an IOS application that lets user create elections, invite voters, vote and view results ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2022/aossie-scholar.mdx b/src/app/ideas/2022/aossie-scholar/page.mdx
similarity index 89%
rename from src/pages/ideas/2022/aossie-scholar.mdx
rename to src/app/ideas/2022/aossie-scholar/page.mdx
index 090ca1bd..f15d4558 100644
--- a/src/pages/ideas/2022/aossie-scholar.mdx
+++ b/src/app/ideas/2022/aossie-scholar/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Aossie Scholar',
@@ -6,7 +6,7 @@ export const meta = {
'AOSSIE Scholar is a Chrome extension that calculates performance-based metrics for researchers from Google Scholar profiles ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2022/monumento.mdx b/src/app/ideas/2022/monumento/page.mdx
similarity index 84%
rename from src/pages/ideas/2022/monumento.mdx
rename to src/app/ideas/2022/monumento/page.mdx
index 4b2c831d..58eb4e36 100644
--- a/src/pages/ideas/2022/monumento.mdx
+++ b/src/app/ideas/2022/monumento/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Monumento',
@@ -6,7 +6,7 @@ export const meta = {
'Monumento is a social media for sharing landmarks, visited places and visualizing their 3D models right from a mobile device ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2022/p2p-messaging-flutter.mdx b/src/app/ideas/2022/p2p-messaging-flutter/page.mdx
similarity index 92%
rename from src/pages/ideas/2022/p2p-messaging-flutter.mdx
rename to src/app/ideas/2022/p2p-messaging-flutter/page.mdx
index 249ed2aa..3038d235 100644
--- a/src/pages/ideas/2022/p2p-messaging-flutter.mdx
+++ b/src/app/ideas/2022/p2p-messaging-flutter/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'P2P Messaging- Flutter',
@@ -6,7 +6,7 @@ export const meta = {
'Chat application for Android and IOS in flutter/dart which sends messages Using Bluetooth & wifi-direct ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2022/social-street-smart-large.mdx b/src/app/ideas/2022/social-street-smart-large/page.mdx
similarity index 90%
rename from src/pages/ideas/2022/social-street-smart-large.mdx
rename to src/app/ideas/2022/social-street-smart-large/page.mdx
index 628b325d..5cf8512b 100644
--- a/src/pages/ideas/2022/social-street-smart-large.mdx
+++ b/src/app/ideas/2022/social-street-smart-large/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Social Street Smart: Large',
@@ -6,7 +6,7 @@ export const meta = {
'With the adevent of Internet, the problems faced by the people have also grown. These include abusive languages.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2022/social-street-smart-medium.mdx b/src/app/ideas/2022/social-street-smart-medium/page.mdx
similarity index 90%
rename from src/pages/ideas/2022/social-street-smart-medium.mdx
rename to src/app/ideas/2022/social-street-smart-medium/page.mdx
index f6a8e9f4..7247f691 100644
--- a/src/pages/ideas/2022/social-street-smart-medium.mdx
+++ b/src/app/ideas/2022/social-street-smart-medium/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Social Street Smart: Medium',
@@ -6,7 +6,7 @@ export const meta = {
'With the adevent of Internet, the problems faced by the people have also grown. These include abusive languages.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/agora-blockchain.mdx b/src/app/ideas/2023/agora-blockchain/page.mdx
similarity index 76%
rename from src/pages/ideas/2024/agora-blockchain.mdx
rename to src/app/ideas/2023/agora-blockchain/page.mdx
index 7265a082..df179a40 100644
--- a/src/pages/ideas/2024/agora-blockchain.mdx
+++ b/src/app/ideas/2023/agora-blockchain/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Blockchain',
@@ -6,7 +6,7 @@ export const meta = {
'First version of Blockchain based Agora web application, with basic features like user registration, election creation, voting and result calculation.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/agora-vote-android.mdx b/src/app/ideas/2023/agora-vote-android/page.mdx
similarity index 86%
rename from src/pages/ideas/2024/agora-vote-android.mdx
rename to src/app/ideas/2023/agora-vote-android/page.mdx
index 1aea92ac..5a691451 100644
--- a/src/pages/ideas/2024/agora-vote-android.mdx
+++ b/src/app/ideas/2023/agora-vote-android/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote Android',
@@ -6,7 +6,7 @@ export const meta = {
'This application uses Agora Web API as backend application. It allows for elections to be held by using multiple algorithms such as Oklahoma, RangeVoting, RankedPairs, Satisfaction Approval Voting.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2023/agora-vote-ios.mdx b/src/app/ideas/2023/agora-vote-ios/page.mdx
similarity index 81%
rename from src/pages/ideas/2023/agora-vote-ios.mdx
rename to src/app/ideas/2023/agora-vote-ios/page.mdx
index ff23032e..1311179a 100644
--- a/src/pages/ideas/2023/agora-vote-ios.mdx
+++ b/src/app/ideas/2023/agora-vote-ios/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote IOS',
@@ -6,7 +6,7 @@ export const meta = {
'Agora Vote App is an IOS application that lets user create elections, invite voters, vote and view results ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/eduAid.mdx b/src/app/ideas/2023/eduAid/page.mdx
similarity index 82%
rename from src/pages/ideas/2023/eduAid.mdx
rename to src/app/ideas/2023/eduAid/page.mdx
index fea4b46f..216eadde 100644
--- a/src/pages/ideas/2023/eduAid.mdx
+++ b/src/app/ideas/2023/eduAid/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'EduAid',
@@ -6,7 +6,7 @@ export const meta = {
'A tool that can auto-generate short quizzes on the basis of the content provided.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/monumento-iPad.mdx b/src/app/ideas/2023/monumento-iPad/page.mdx
similarity index 73%
rename from src/pages/ideas/2023/monumento-iPad.mdx
rename to src/app/ideas/2023/monumento-iPad/page.mdx
index 1693445a..be4b2b58 100644
--- a/src/pages/ideas/2023/monumento-iPad.mdx
+++ b/src/app/ideas/2023/monumento-iPad/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Monumento-iPad',
@@ -6,7 +6,7 @@ export const meta = {
'Monumento is a social media for sharing landmarks, visited places and visualizing their 3D models right from a mobile device ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/monumento.mdx b/src/app/ideas/2023/monumento/page.mdx
similarity index 81%
rename from src/pages/ideas/2024/monumento.mdx
rename to src/app/ideas/2023/monumento/page.mdx
index 7e1d9249..65c4958a 100644
--- a/src/pages/ideas/2024/monumento.mdx
+++ b/src/app/ideas/2023/monumento/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Monumento',
@@ -6,7 +6,7 @@ export const meta = {
'Monumento is a social media for sharing landmarks, visited places and visualizing their 3D models right from a mobile device ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2023/openChat.mdx b/src/app/ideas/2023/openChat/page.mdx
similarity index 70%
rename from src/pages/ideas/2023/openChat.mdx
rename to src/app/ideas/2023/openChat/page.mdx
index 3309b9ac..bd8d76b6 100644
--- a/src/pages/ideas/2023/openChat.mdx
+++ b/src/app/ideas/2023/openChat/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'OpenChat',
@@ -6,7 +6,7 @@ export const meta = {
'a decentralised platform for secure and private messaging and file sharing built on top of blockchain',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/p2p-messaging-flutter.mdx b/src/app/ideas/2023/p2p-messaging-flutter/page.mdx
similarity index 92%
rename from src/pages/ideas/2023/p2p-messaging-flutter.mdx
rename to src/app/ideas/2023/p2p-messaging-flutter/page.mdx
index 7705f604..cedd50a5 100644
--- a/src/pages/ideas/2023/p2p-messaging-flutter.mdx
+++ b/src/app/ideas/2023/p2p-messaging-flutter/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'P2P Messaging- Flutter',
@@ -6,7 +6,7 @@ export const meta = {
'Chat application for Android and IOS in flutter/dart which sends messages Using Bluetooth & wifi-direct ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/resonate.mdx b/src/app/ideas/2023/resonate/page.mdx
similarity index 76%
rename from src/pages/ideas/2023/resonate.mdx
rename to src/app/ideas/2023/resonate/page.mdx
index c9e2f3f4..39f20f98 100644
--- a/src/pages/ideas/2023/resonate.mdx
+++ b/src/app/ideas/2023/resonate/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Resonate',
description: 'a social voice platform',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/social-street-smart-large.mdx b/src/app/ideas/2023/social-street-smart-large/page.mdx
similarity index 91%
rename from src/pages/ideas/2023/social-street-smart-large.mdx
rename to src/app/ideas/2023/social-street-smart-large/page.mdx
index 9fbe271e..a32b71fc 100644
--- a/src/pages/ideas/2023/social-street-smart-large.mdx
+++ b/src/app/ideas/2023/social-street-smart-large/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Social Street Smart: Large',
@@ -6,7 +6,7 @@ export const meta = {
'With the adevent of Internet, the problems faced by the people have also grown. These include abusive languages.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/social-street-smart-medium.mdx b/src/app/ideas/2023/social-street-smart-medium/page.mdx
similarity index 90%
rename from src/pages/ideas/2023/social-street-smart-medium.mdx
rename to src/app/ideas/2023/social-street-smart-medium/page.mdx
index f09877ba..06e8911f 100644
--- a/src/pages/ideas/2023/social-street-smart-medium.mdx
+++ b/src/app/ideas/2023/social-street-smart-medium/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Social Street Smart: Medium',
@@ -6,7 +6,7 @@ export const meta = {
'With the adevent of Internet, the problems faced by the people have also grown. These include abusive languages.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/Pictopy.mdx b/src/app/ideas/2024/Pictopy/page.mdx
similarity index 89%
rename from src/pages/ideas/2024/Pictopy.mdx
rename to src/app/ideas/2024/Pictopy/page.mdx
index d323613b..bb77dec8 100644
--- a/src/pages/ideas/2024/Pictopy.mdx
+++ b/src/app/ideas/2024/Pictopy/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'PictoPy',
@@ -6,7 +6,7 @@ export const meta = {
'PictoPy is a privacy focused desktop app designed to transform the handling of digital photos',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2024/agora-api.mdx b/src/app/ideas/2024/agora-api/page.mdx
similarity index 88%
rename from src/pages/ideas/2024/agora-api.mdx
rename to src/app/ideas/2024/agora-api/page.mdx
index 42ae20c2..76fc19bf 100644
--- a/src/pages/ideas/2024/agora-api.mdx
+++ b/src/app/ideas/2024/agora-api/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote API V2',
@@ -6,7 +6,7 @@ export const meta = {
'Agora API is a vote counting API written using Scala 2 and Play Framework.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2023/agora-blockchain.mdx b/src/app/ideas/2024/agora-blockchain/page.mdx
similarity index 76%
rename from src/pages/ideas/2023/agora-blockchain.mdx
rename to src/app/ideas/2024/agora-blockchain/page.mdx
index 7265a082..df179a40 100644
--- a/src/pages/ideas/2023/agora-blockchain.mdx
+++ b/src/app/ideas/2024/agora-blockchain/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Blockchain',
@@ -6,7 +6,7 @@ export const meta = {
'First version of Blockchain based Agora web application, with basic features like user registration, election creation, voting and result calculation.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/agora-library.mdx b/src/app/ideas/2024/agora-library/page.mdx
similarity index 89%
rename from src/pages/ideas/2024/agora-library.mdx
rename to src/app/ideas/2024/agora-library/page.mdx
index 61ed3050..7d1e5d63 100644
--- a/src/pages/ideas/2024/agora-library.mdx
+++ b/src/app/ideas/2024/agora-library/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Library',
@@ -6,7 +6,7 @@ export const meta = {
'Agora is a high performance vote counting library written in Scala.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2023/agora-vote-android.mdx b/src/app/ideas/2024/agora-vote-android/page.mdx
similarity index 86%
rename from src/pages/ideas/2023/agora-vote-android.mdx
rename to src/app/ideas/2024/agora-vote-android/page.mdx
index 1aea92ac..5a691451 100644
--- a/src/pages/ideas/2023/agora-vote-android.mdx
+++ b/src/app/ideas/2024/agora-vote-android/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote Android',
@@ -6,7 +6,7 @@ export const meta = {
'This application uses Agora Web API as backend application. It allows for elections to be held by using multiple algorithms such as Oklahoma, RangeVoting, RankedPairs, Satisfaction Approval Voting.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/agora-vote-ios.mdx b/src/app/ideas/2024/agora-vote-ios/page.mdx
similarity index 81%
rename from src/pages/ideas/2024/agora-vote-ios.mdx
rename to src/app/ideas/2024/agora-vote-ios/page.mdx
index ff23032e..1311179a 100644
--- a/src/pages/ideas/2024/agora-vote-ios.mdx
+++ b/src/app/ideas/2024/agora-vote-ios/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Vote IOS',
@@ -6,7 +6,7 @@ export const meta = {
'Agora Vote App is an IOS application that lets user create elections, invite voters, vote and view results ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2024/djed.mdx b/src/app/ideas/2024/djed/page.mdx
similarity index 86%
rename from src/pages/ideas/2024/djed.mdx
rename to src/app/ideas/2024/djed/page.mdx
index 49172bbd..37e0ea94 100644
--- a/src/pages/ideas/2024/djed.mdx
+++ b/src/app/ideas/2024/djed/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Djed for EVM Blockchains',
description: 'A Formally Verified Crypto-Backed Stablecoin',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2024/eduAid.mdx b/src/app/ideas/2024/eduAid/page.mdx
similarity index 86%
rename from src/pages/ideas/2024/eduAid.mdx
rename to src/app/ideas/2024/eduAid/page.mdx
index 0eed514f..26eb6ebd 100644
--- a/src/pages/ideas/2024/eduAid.mdx
+++ b/src/app/ideas/2024/eduAid/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'EduAid',
@@ -6,7 +6,7 @@ export const meta = {
'A tool that can auto-generate short quizzes on the basis of the content provided.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2024/monumento-iPad.mdx b/src/app/ideas/2024/monumento-iPad/page.mdx
similarity index 80%
rename from src/pages/ideas/2024/monumento-iPad.mdx
rename to src/app/ideas/2024/monumento-iPad/page.mdx
index 33779d64..892921c5 100644
--- a/src/pages/ideas/2024/monumento-iPad.mdx
+++ b/src/app/ideas/2024/monumento-iPad/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Monumento-iPad',
@@ -6,7 +6,7 @@ export const meta = {
'Monumento is a social media for sharing landmarks, visited places and visualizing their 3D models right from a mobile device ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2023/monumento.mdx b/src/app/ideas/2024/monumento/page.mdx
similarity index 81%
rename from src/pages/ideas/2023/monumento.mdx
rename to src/app/ideas/2024/monumento/page.mdx
index 7e1d9249..65c4958a 100644
--- a/src/pages/ideas/2023/monumento.mdx
+++ b/src/app/ideas/2024/monumento/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Monumento',
@@ -6,7 +6,7 @@ export const meta = {
'Monumento is a social media for sharing landmarks, visited places and visualizing their 3D models right from a mobile device ...',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/resonate-ios.mdx b/src/app/ideas/2024/resonate-ios/page.mdx
similarity index 84%
rename from src/pages/ideas/2024/resonate-ios.mdx
rename to src/app/ideas/2024/resonate-ios/page.mdx
index e828fc49..74ac49f0 100644
--- a/src/pages/ideas/2024/resonate-ios.mdx
+++ b/src/app/ideas/2024/resonate-ios/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Resonate iOS',
description: 'An open source social voice platform',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 90 hrs
diff --git a/src/pages/ideas/2024/resonate-ui.mdx b/src/app/ideas/2024/resonate-ui/page.mdx
similarity index 84%
rename from src/pages/ideas/2024/resonate-ui.mdx
rename to src/app/ideas/2024/resonate-ui/page.mdx
index 9cb0f8bf..bd26dbb2 100644
--- a/src/pages/ideas/2024/resonate-ui.mdx
+++ b/src/app/ideas/2024/resonate-ui/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Resonate UI',
description: 'An open source social voice platform',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/resonate.mdx b/src/app/ideas/2024/resonate/page.mdx
similarity index 84%
rename from src/pages/ideas/2024/resonate.mdx
rename to src/app/ideas/2024/resonate/page.mdx
index 17039f1e..1369bb3c 100644
--- a/src/pages/ideas/2024/resonate.mdx
+++ b/src/app/ideas/2024/resonate/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Resonate App',
description: 'An open source social voice platform',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2024/slagora.mdx b/src/app/ideas/2024/slagora/page.mdx
similarity index 88%
rename from src/pages/ideas/2024/slagora.mdx
rename to src/app/ideas/2024/slagora/page.mdx
index 3ef81f86..063902d9 100644
--- a/src/pages/ideas/2024/slagora.mdx
+++ b/src/app/ideas/2024/slagora/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Slagora',
@@ -6,7 +6,7 @@ export const meta = {
'Slagora is a Slack based voting application powered by Agora. It enables organizations within Slack to carry out Polls and Elections.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 175 hrs
diff --git a/src/pages/ideas/2024/social-street-smart.mdx b/src/app/ideas/2024/social-street-smart/page.mdx
similarity index 91%
rename from src/pages/ideas/2024/social-street-smart.mdx
rename to src/app/ideas/2024/social-street-smart/page.mdx
index 3302f085..8f406858 100644
--- a/src/pages/ideas/2024/social-street-smart.mdx
+++ b/src/app/ideas/2024/social-street-smart/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Social Street Smart',
@@ -6,7 +6,7 @@ export const meta = {
'With the adevent of Internet, the problems faced by the people have also grown. These include abusive languages.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Duration: 350 hrs
diff --git a/src/pages/ideas/2025/agora-blockchain.mdx b/src/app/ideas/2025/agora-blockchain/page.mdx
similarity index 93%
rename from src/pages/ideas/2025/agora-blockchain.mdx
rename to src/app/ideas/2025/agora-blockchain/page.mdx
index c8007404..ff95c147 100644
--- a/src/pages/ideas/2025/agora-blockchain.mdx
+++ b/src/app/ideas/2025/agora-blockchain/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Agora Blockchain',
@@ -6,7 +6,7 @@ export const meta = {
'A decentralized voting platform enabling fair, transparent, and efficient elections using blockchain technology.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Medium
diff --git a/src/pages/ideas/2025/babynest.mdx b/src/app/ideas/2025/babynest/page.mdx
similarity index 92%
rename from src/pages/ideas/2025/babynest.mdx
rename to src/app/ideas/2025/babynest/page.mdx
index 5d30fce2..5a472806 100644
--- a/src/pages/ideas/2025/babynest.mdx
+++ b/src/app/ideas/2025/babynest/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'BabyNest',
description: 'An AI-Powered Open-Source Pregnancy Care Assistant designed to help expecting parents stay informed, organized, and stress-free by tracking essential medical appointments and tests.'
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/debate-ai.mdx b/src/app/ideas/2025/debate-ai/page.mdx
similarity index 92%
rename from src/pages/ideas/2025/debate-ai.mdx
rename to src/app/ideas/2025/debate-ai/page.mdx
index 830fea3b..8adad2a9 100644
--- a/src/pages/ideas/2025/debate-ai.mdx
+++ b/src/app/ideas/2025/debate-ai/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'DebateAI',
@@ -6,7 +6,7 @@ export const meta = {
'An AI-enhanced debate platform that helps users improve communication skills through real-time debates.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/devr-ai.mdx b/src/app/ideas/2025/devr-ai/page.mdx
similarity index 91%
rename from src/pages/ideas/2025/devr-ai.mdx
rename to src/app/ideas/2025/devr-ai/page.mdx
index 7073d27f..1cb01102 100644
--- a/src/pages/ideas/2025/devr-ai.mdx
+++ b/src/app/ideas/2025/devr-ai/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Devr.AI',
@@ -6,7 +6,7 @@ export const meta = {
'An AI-powered DevRel assistant that enhances community engagement, simplifies contributor onboarding, and automates common DevRel tasks.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/docPilot.mdx b/src/app/ideas/2025/docPilot/page.mdx
similarity index 91%
rename from src/pages/ideas/2025/docPilot.mdx
rename to src/app/ideas/2025/docPilot/page.mdx
index 6530e99d..f0b76cff 100644
--- a/src/pages/ideas/2025/docPilot.mdx
+++ b/src/app/ideas/2025/docPilot/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'DocPilot',
@@ -6,7 +6,7 @@ export const meta = {
'A new age EMR application using conversational AI at its best.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/eduaid.mdx b/src/app/ideas/2025/eduaid/page.mdx
similarity index 91%
rename from src/pages/ideas/2025/eduaid.mdx
rename to src/app/ideas/2025/eduaid/page.mdx
index 1c075fdf..b1411002 100644
--- a/src/pages/ideas/2025/eduaid.mdx
+++ b/src/app/ideas/2025/eduaid/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'EduAid',
@@ -6,7 +6,7 @@ export const meta = {
'EduAid is an AI-driven tool designed to enhance online learning by generating quizzes from educational content, helping students improve retention and engagement.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Medium
diff --git a/src/pages/ideas/2025/ell-ena.mdx b/src/app/ideas/2025/ell-ena/page.mdx
similarity index 90%
rename from src/pages/ideas/2025/ell-ena.mdx
rename to src/app/ideas/2025/ell-ena/page.mdx
index a3c1e0bc..4e1c3ffa 100644
--- a/src/pages/ideas/2025/ell-ena.mdx
+++ b/src/app/ideas/2025/ell-ena/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Ell-ena',
@@ -6,7 +6,7 @@ export const meta = {
'An AI-powered product manager that creates tasks, transcribes meetings, and maintains work context.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/inpact.mdx b/src/app/ideas/2025/inpact/page.mdx
similarity index 92%
rename from src/pages/ideas/2025/inpact.mdx
rename to src/app/ideas/2025/inpact/page.mdx
index 06e944f5..4e8b7a98 100644
--- a/src/pages/ideas/2025/inpact.mdx
+++ b/src/app/ideas/2025/inpact/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Inpact',
@@ -6,7 +6,7 @@ export const meta = {
'An open-source AI platform for creator collaboration and matchmaking sponsorships.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/monumento.mdx b/src/app/ideas/2025/monumento/page.mdx
similarity index 92%
rename from src/pages/ideas/2025/monumento.mdx
rename to src/app/ideas/2025/monumento/page.mdx
index dc8c55f0..44010dd1 100644
--- a/src/pages/ideas/2025/monumento.mdx
+++ b/src/app/ideas/2025/monumento/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Monumento',
@@ -6,7 +6,7 @@ export const meta = {
'An AR-integrated social app that transforms how you connect with the world\'s most iconic landmarks',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/neurotrack.mdx b/src/app/ideas/2025/neurotrack/page.mdx
similarity index 91%
rename from src/pages/ideas/2025/neurotrack.mdx
rename to src/app/ideas/2025/neurotrack/page.mdx
index 89d88248..27f0a619 100644
--- a/src/pages/ideas/2025/neurotrack.mdx
+++ b/src/app/ideas/2025/neurotrack/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Neurotrack',
@@ -6,7 +6,7 @@ export const meta = {
'An AI-powered platform for detecting, assessing, and managing neurodevelopmental conditions like Autism and ADHD in schools and therapy centers.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Medium
diff --git a/src/pages/ideas/2025/perspective.mdx b/src/app/ideas/2025/perspective/page.mdx
similarity index 94%
rename from src/pages/ideas/2025/perspective.mdx
rename to src/app/ideas/2025/perspective/page.mdx
index 4e30ff04..a00cd6d4 100644
--- a/src/pages/ideas/2025/perspective.mdx
+++ b/src/app/ideas/2025/perspective/page.mdx
@@ -1,11 +1,11 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Perspective',
description: 'An GenAI-Powered Open-Source Opposing Perspective companion which breaks the confirmation bias and today\'s news echo chamber where any wrong perspective can spread like fire.'
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/pictopy.mdx b/src/app/ideas/2025/pictopy/page.mdx
similarity index 93%
rename from src/pages/ideas/2025/pictopy.mdx
rename to src/app/ideas/2025/pictopy/page.mdx
index 5e45a20e..1ccfced5 100644
--- a/src/pages/ideas/2025/pictopy.mdx
+++ b/src/app/ideas/2025/pictopy/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Pictopy',
@@ -6,7 +6,7 @@ export const meta = {
'Reworking the frontend and enhancing the backend of Pictopy for better performance and ease of contribution.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Large
diff --git a/src/pages/ideas/2025/resoante.mdx b/src/app/ideas/2025/resoante/page.mdx
similarity index 92%
rename from src/pages/ideas/2025/resoante.mdx
rename to src/app/ideas/2025/resoante/page.mdx
index c46e9190..0b484454 100644
--- a/src/pages/ideas/2025/resoante.mdx
+++ b/src/app/ideas/2025/resoante/page.mdx
@@ -1,4 +1,4 @@
-import { IdeaLayout } from '@/components/IdeaLayout'
+import { IdeaLayout } from '@/components/ideas/IdeaLayout'
export const meta = {
title: 'Resonate',
@@ -6,7 +6,7 @@ export const meta = {
'An open-source social voice platform for immersive stories, live discussions, and real-time audio communication.',
}
-export default (props) =>
+export default ({ children }) => {children}
### Project Type: Medium
diff --git a/src/app/ideas/[year]/page.jsx b/src/app/ideas/[year]/page.jsx
new file mode 100644
index 00000000..64dcef60
--- /dev/null
+++ b/src/app/ideas/[year]/page.jsx
@@ -0,0 +1,50 @@
+import { getIdeas } from '@/lib/ideas'
+import { IdeasList } from '@/components/ideas/IdeasList'
+import { Container } from '@/components/shared/Container'
+
+export async function generateMetadata({ params }) {
+ return {
+ title: `Idea List ${params.year}`,
+ description: `Idea List for GSOC ${params.year}`,
+ }
+}
+
+export async function generateStaticParams() {
+ // Define the years we support
+ return [
+ { year: '2022' },
+ { year: '2023' },
+ { year: '2024' },
+ { year: '2025' },
+ ]
+}
+
+export default async function YearIdeasPage({ params }) {
+ const { year } = params
+ const articles = await getIdeas(year)
+
+ if (!articles) {
+ return (
+
+ Ideas not found for {year}
+
+ )
+ }
+
+ return (
+
+
+
+ AOSSIE's{' '}
+ Idea List for{' '}
+ Google Summer of Code {year}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/ideas/page.jsx b/src/app/ideas/page.jsx
new file mode 100644
index 00000000..cec71881
--- /dev/null
+++ b/src/app/ideas/page.jsx
@@ -0,0 +1,38 @@
+import { getIdeas } from '@/lib/ideas'
+import { IdeasDisplay } from '@/components/ideas/IdeasDisplay'
+import { IdeasHeader } from '@/components/ideas/IdeasHeader'
+import Link from 'next/link'
+import path from 'path'
+import fs from 'fs'
+
+export const metadata = {
+ title: 'Idea List',
+ description: 'Idea List for GSOC',
+}
+
+export default async function IdeasPage() {
+ const ideasDir = path.join(process.cwd(), 'src/app/ideas')
+
+ // Get all year directories
+ const years = fs.readdirSync(ideasDir)
+ .filter(file => /^\d{4}$/.test(file) && fs.statSync(path.join(ideasDir, file)).isDirectory())
+ // Sort descending (2025, 2024, ...)
+ .sort((a, b) => b.localeCompare(a))
+
+ // Fetch ideas for all years
+ const ideasQueries = years.map(async (year) => {
+ const articles = await getIdeas(year)
+ return { year, articles }
+ })
+
+ const ideasData = await Promise.all(ideasQueries)
+
+ // Filter out years that might be empty
+ const validIdeasData = ideasData.filter(data => data.articles.length > 0)
+
+ return (
+
+
+
+ )
+}
diff --git a/src/pages/_document.jsx b/src/app/layout.jsx
similarity index 62%
rename from src/pages/_document.jsx
rename to src/app/layout.jsx
index 754c67ef..fb8211f3 100644
--- a/src/pages/_document.jsx
+++ b/src/app/layout.jsx
@@ -1,4 +1,7 @@
-import { Head, Html, Main, NextScript } from 'next/document'
+import '@/style/tailwind.css'
+import 'focus-visible'
+import { Header } from '@/components/shared/Header'
+import { Footer } from '@/components/shared/Footer'
const modeScript = `
let darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
@@ -35,10 +38,15 @@ const modeScript = `
}
`
-export default function Document() {
+export const metadata = {
+ title: 'AOSSIE',
+ description: 'AOSSIE Website',
+}
+
+export default function RootLayout({ children }) {
return (
-
-
+
+
-
-
-
-
+
+
+
+
+
+ {children}
+
+
-
+
)
}
diff --git a/src/pages/index.jsx b/src/app/page.jsx
similarity index 60%
rename from src/pages/index.jsx
rename to src/app/page.jsx
index 14e063cd..455978a7 100644
--- a/src/pages/index.jsx
+++ b/src/app/page.jsx
@@ -1,9 +1,11 @@
-import Head from 'next/head'
+'use client'
+
import Link from 'next/link'
import Image from 'next/image'
import { useState, useEffect } from 'react'
+import { motion } from 'framer-motion'
-import { Container } from '@/components/Container'
+import { Container } from '@/components/shared/Container'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faEnvelope } from '@fortawesome/free-solid-svg-icons'
import {
@@ -12,54 +14,80 @@ import {
faGitlab,
faTwitter,
} from '@fortawesome/free-brands-svg-icons'
-import { CardEffect } from '@/components/CardEffect'
-import { Banner } from '@/components/Banner'
+import { CardEffect } from '@/components/home/CardEffect'
+import { Banner } from '@/components/shared/Banner'
+import { Stats } from '@/components/home/Stats'
+import { CardProject } from '@/components/home/CardProject'
import projects from '@/helper/projects'
-import Journey from '@/components/Journey'
export default function Home() {
- const [randomProjects, setRandomProjects] = useState(projects)
+ const [randomProjects, setRandomProjects] = useState([])
+ const [featuredProjects, setFeaturedProjects] = useState([])
useEffect(() => {
- setRandomProjects(projects.sort(() => 0.5 - Math.random()).slice(0, 3))
+ // Select specific projects as featured
+ const featuredNames = ['Agora Blockchain', 'Djed', 'PictoPy'];
+ const featured = projects.filter(p => featuredNames.includes(p.name));
+ setFeaturedProjects(featured);
+
+ // Random projects excluding featured ones
+ const others = projects.filter(p => !featuredNames.includes(p.name));
+ setRandomProjects(others.sort(() => 0.5 - Math.random()).slice(0, 3));
}, [])
return (
<>
-
- AOSSIE
-
-
-
-
+
{/* Background Image */}
-
+
{/* Main Content */}
-
-
+
+
-
-
-
-
+
+
+
+
We Innovate We Educate
-
-
+
+
We are an Australian not-for-profit umbrella organization for
open-source projects. We believe the open-source philosophy
provides a resource-efficient channel to transfer knowledge and
achieve innovation and education.
-
-
+
+
-
-
-
+
+
+
@@ -109,33 +146,38 @@ export default function Home() {
data-rounded="rounded-lg"
>
-
+
-
- {/* Green Band with Counts */}
-
-
-
Active Projects
-
34+
-
-
-
Total Contributors
-
500+
-
-
-
Community Count
-
2000+
-
-
-
+
+
+ {/* Featured Projects Section */}
+
+
+
+
+
+ Featured Projects
+
+
+
+
+ Check out some of our production-ready projects.
+
+
+
+ {featuredProjects.map((project, index) => (
+
+ ))}
+
+
-
-
+ {/* More Projects Section */}
+
@@ -157,7 +199,7 @@ export default function Home() {
- projects
+ Explore More
@@ -170,23 +212,24 @@ export default function Home() {
to showcase your skills and
make an impact .
-
+
-
+
{randomProjects.map((project) => (
-
+
-
+
))}
@@ -211,8 +254,7 @@ export default function Home() {
-
-
+
diff --git a/src/app/products/[slug]/page.jsx b/src/app/products/[slug]/page.jsx
new file mode 100644
index 00000000..b0385f9f
--- /dev/null
+++ b/src/app/products/[slug]/page.jsx
@@ -0,0 +1,185 @@
+import React from 'react';
+import Image from 'next/image';
+import Link from 'next/link';
+import ReactMarkdown from 'react-markdown';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faDownload, faUsers, faStar } from '@fortawesome/free-solid-svg-icons';
+import { faGithub, faDiscord } from '@fortawesome/free-brands-svg-icons';
+import remarkGfm from 'remark-gfm';
+
+import { Container } from '@/components/shared/Container';
+import { Prose } from '@/components/shared/Prose';
+import { FeedbackForm } from '@/components/products/FeedbackForm';
+import products from '@/helper/products';
+
+export async function generateStaticParams() {
+ return products.map((product) => ({
+ slug: product.slug,
+ }));
+}
+
+export async function generateMetadata({ params }) {
+ const product = products.find((p) => p.slug === params.slug);
+ if (!product) {
+ return {
+ title: 'Product Not Found',
+ };
+ }
+ return {
+ title: `${product.name} - AOSSIE`,
+ description: product.description,
+ };
+}
+
+
+export default function ProductPage({ params }) {
+ // Unwrapping params for Next.js 15+ if needed, but in 14 it's usually direct.
+ // We'll treat it as synchronous access since it's an object in generateStaticParams context usually
+ const product = products.find((p) => p.slug === params.slug);
+
+ if (!product) {
+ return (
+
+ Product not found
+
+ )
+ }
+
+ return (
+
+ {/* Header Section */}
+
+
+
+
+
+
+ {product.name}
+
+
+ {product.description}
+
+
+
+
+
+ {/* Video Section */}
+ {product.videoUrl && (
+
+ )}
+
+ {/* Setup Guide */}
+
+
+ Installation & Setup
+
+
+
+ }}
+ >
+ {product.setupGuide}
+
+
+
+
+ {/* Community Feedback */}
+
+
+ Community Feedback
+
+
+ {product.feedbacks && product.feedbacks.length > 0 ? (
+ product.feedbacks.map((feedback, idx) => (
+
+
+ {[...Array(5)].map((_, i) => (
+
+ ))}
+
+
+ "{feedback.comment}"
+
+
+
+
+
+ {feedback.user}
+
+
+ ))
+ ): (
+
+ No reviews yet. Be the first to try it out!
+
+ )}
+
+
+
+
+
+ );
+}
diff --git a/src/app/products/page.jsx b/src/app/products/page.jsx
new file mode 100644
index 00000000..2b17fb25
--- /dev/null
+++ b/src/app/products/page.jsx
@@ -0,0 +1,26 @@
+import { Container } from '@/components/shared/Container'
+import { CardProduct } from '@/components/products/CardProduct'
+import { ProductsHeader } from '@/components/products/ProductsHeader'
+import products from '@/helper/products'
+
+export const metadata = {
+ title: 'Products - AOSSIE',
+ description: 'AOSSIE Products',
+}
+
+export default function Products() {
+ return (
+ <>
+
+
+
+
+ {products.map((product) => (
+
+ ))}
+
+
+
+ >
+ )
+}
diff --git a/src/pages/projects.jsx b/src/app/projects/page.jsx
similarity index 58%
rename from src/pages/projects.jsx
rename to src/app/projects/page.jsx
index 981f1156..88546605 100644
--- a/src/pages/projects.jsx
+++ b/src/app/projects/page.jsx
@@ -1,4 +1,6 @@
-import Head from 'next/head';
+'use client'
+
+import Link from 'next/link';
import Grid from '@mui/material/Grid';
import MuiCard from '@mui/material/Card';
import CardContent from '@mui/material/CardContent';
@@ -6,11 +8,15 @@ import CardActions from '@mui/material/CardActions';
import Typography from '@mui/material/Typography';
import Button from '@mui/material/Button';
import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
-import { Container } from '@/components/Container';
-import { Banner } from '@/components/Banner';
-import { useRouter } from 'next/router';
+import { Container } from '@/components/shared/Container';
+import { Banner } from '@/components/shared/Banner';
import Image from 'next/image';
import projects from '@/helper/projects'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons'
+import { motion } from 'framer-motion'
+
+
function LinkIcon(props) {
return (
@@ -23,17 +29,18 @@ function LinkIcon(props) {
}
// Define the Cards component here
-const Cards = () => {
- const router = useRouter();
-
-
-
+const Cards = ({ projectList }) => {
return (
- {projects.map((project, index) => (
-
+ {projectList.map((project, index) => (
+
{
{project.description}
-
-
+
+
{project.link.label}
-
+
+
+
+
+
+
+
+
+
@@ -98,7 +113,12 @@ const Cards = () => {
const ProjectSection = () => {
return (
-
+
{
aria-label="Logo"
>
-
+
);
};
@@ -128,20 +148,50 @@ const styles = {
};
export default function Projects() {
+ const ongoingProjects = projects.filter((project) => project.status === 'ongoing');
+ const productionReadyProjects = projects.filter((project) => project.status === 'production');
+
return (
<>
-
- PROJECTS
-
-
-
+
Our Projects, where we showcase our tech wizardry and code-slinging skills! Our portfolio is a treasure trove of open-source gems,
featuring projects in a variety of languages and areas. Take a peek and see how we're making a difference with our technical spells.
-
-
+
+
+
+
+ Ongoing Projects
+
+
+
+
+
+
+ Production Ready Projects
+
+
+
+
diff --git a/src/components/Banner.jsx b/src/components/Banner.jsx
deleted file mode 100644
index 44a482da..00000000
--- a/src/components/Banner.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import Link from 'next/link';
-import { ContainerPattern } from '@/components/ContainerPattern';
-import { Pattern } from '@/components/Pattern';
-
-export function Banner() {
- return (
-
-
-
-
-
-
-
- Launch into AOSSIE's open-source world through GSoC!
-
-
- Learn how to apply for an opportunity to work on open-source projects and gain real-world experience through Google Summer of Code.
-
-
-
-
-
-
- );
-}
diff --git a/src/components/CardEffect.jsx b/src/components/CardEffect.jsx
deleted file mode 100644
index 21733d8f..00000000
--- a/src/components/CardEffect.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import Image from 'next/image'
-
-export function CardEffect({heading, content, logo}) {
- return (
-
- {/* */}
-
- {/* */}
- {/*
*/}
-
-
- )
-}
\ No newline at end of file
diff --git a/src/components/CardHome.jsx b/src/components/CardHome.jsx
deleted file mode 100644
index 1e0e682b..00000000
--- a/src/components/CardHome.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import Link from "next/link";
-
-export function CardHome({heading, content}) {
- return (
-
-
{heading}
-
{content}
-
- )
-}
\ No newline at end of file
diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx
deleted file mode 100644
index ea36f59c..00000000
--- a/src/components/Footer.jsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import Link from 'next/link'
-
-import { Container } from '@/components/Container'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faEnvelope } from '@fortawesome/free-solid-svg-icons'
-import { faDiscord, faGithub, faGitlab, faTwitter } from '@fortawesome/free-brands-svg-icons'
-
-function NavLink({ href, children }) {
- return (
-
- {children}
-
- )
-}
-
-export function Footer() {
- return (
-
-
-
-
-
-
- About
- Projects
- Ideas
- Apply
-
-
- © 2016-2025 AOSSIE. All rights reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/components/Journey.jsx b/src/components/about/Journey.jsx
similarity index 100%
rename from src/components/Journey.jsx
rename to src/components/about/Journey.jsx
diff --git a/src/components/about/Team.jsx b/src/components/about/Team.jsx
new file mode 100644
index 00000000..5a060146
--- /dev/null
+++ b/src/components/about/Team.jsx
@@ -0,0 +1,56 @@
+'use client'
+
+import Image from 'next/image';
+import { motion } from 'framer-motion';
+
+const teamMembers = [
+ {
+ name: 'Bruno',
+ role: 'Founder & Admin',
+ description: 'Leading AOSSIE since inception.',
+ image: '/images/default.png' // Fallback
+ },
+ {
+ name: 'Mentors',
+ role: 'Core Contributors',
+ description: 'Our dedicated team of mentors who guide students.',
+ image: '/images/default.png'
+ }
+];
+
+export function Team() {
+ return (
+
+
+
+
+ Our Team
+
+
+ The people who make AOSSIE possible.
+
+
+
+ {/* Since I don't have real images/names, I will make a generic "Contributors" card style */}
+
+
+ AOSSIE is run by a dedicated group of volunteers, mentors, and administrators who are passionate about open source.
+
+
+
+
+
+ );
+}
diff --git a/src/components/about/Timeline.jsx b/src/components/about/Timeline.jsx
new file mode 100644
index 00000000..585f0720
--- /dev/null
+++ b/src/components/about/Timeline.jsx
@@ -0,0 +1,44 @@
+'use client'
+
+import { TimelineElement } from './TimelineElement'
+import { motion } from 'framer-motion'
+
+export function Timeline() {
+ return (
+
+ )
+}
diff --git a/src/components/TimelineElement.jsx b/src/components/about/TimelineElement.jsx
similarity index 59%
rename from src/components/TimelineElement.jsx
rename to src/components/about/TimelineElement.jsx
index 9e977f5f..97df5d4a 100644
--- a/src/components/TimelineElement.jsx
+++ b/src/components/about/TimelineElement.jsx
@@ -1,8 +1,17 @@
+'use client'
+
import clsx from "clsx"
+import { motion } from "framer-motion"
export function TimelineElement({ title, description, button, time, link, classCondition }) {
return (
-
+
@@ -11,7 +20,7 @@ export function TimelineElement({ title, description, button, time, link, classC
{title}
{time}
{description}
- {button}
-
+
{button}
+
)
}
diff --git a/src/components/apply/ApplyHeader.jsx b/src/components/apply/ApplyHeader.jsx
new file mode 100644
index 00000000..958f3371
--- /dev/null
+++ b/src/components/apply/ApplyHeader.jsx
@@ -0,0 +1,86 @@
+'use client'
+
+import { Container } from '@/components/shared/Container'
+import { motion } from 'framer-motion'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faDiscord, faGitlab } from '@fortawesome/free-brands-svg-icons'
+import { faLightbulb, faComments, faPaperPlane } from '@fortawesome/free-solid-svg-icons'
+
+export function ApplyHeader({ children }) {
+ const steps = [
+ { icon: faDiscord, label: "Join Discord" },
+ { icon: faGitlab, label: "Start Contributing" },
+ { icon: faLightbulb, label: "Choose Idea" },
+ { icon: faComments, label: "Discuss" },
+ { icon: faPaperPlane, label: "Submit App" },
+ ];
+
+ return (
+
+
+
+
+ Your Journey to Open Source
+
+
+ Our application timeline is your step-by-step guide to becoming a part of our open-source community and contributing to projects that are shaping the future of technology. From submitting your proposal to final evaluations, we'll walk you through the process every step of the way. Don't miss this opportunity to be a part of something great and apply now!
+
+
+
+ {/* New Horizontal Timeline Steps */}
+
+ {/* Connecting Line */}
+
+
+ {steps.map((step, index) => (
+
+
+
+
+ {step.label}
+
+ ))}
+
+
+
+ {children}
+
+
+
+ )
+}
diff --git a/src/components/home/CardEffect.jsx b/src/components/home/CardEffect.jsx
new file mode 100644
index 00000000..072b87ae
--- /dev/null
+++ b/src/components/home/CardEffect.jsx
@@ -0,0 +1,40 @@
+'use client'
+
+import Image from 'next/image'
+import { motion } from 'framer-motion'
+
+export function CardEffect({heading, content, logo}) {
+ return (
+
+
+ {/* Front Face */}
+
+
+ {/* Back Face */}
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/home/CardHome.jsx b/src/components/home/CardHome.jsx
new file mode 100644
index 00000000..b4377280
--- /dev/null
+++ b/src/components/home/CardHome.jsx
@@ -0,0 +1,22 @@
+'use client'
+
+import Link from "next/link";
+import { motion } from "framer-motion";
+
+export function CardHome({heading, content}) {
+ return (
+
+
+ {heading}
+ {content}
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/home/CardProject.jsx b/src/components/home/CardProject.jsx
new file mode 100644
index 00000000..3cf71f88
--- /dev/null
+++ b/src/components/home/CardProject.jsx
@@ -0,0 +1,43 @@
+'use client'
+
+import Image from 'next/image';
+import Link from 'next/link';
+import { motion } from 'framer-motion';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faGithub } from '@fortawesome/free-brands-svg-icons';
+
+export function CardProject({ project }) {
+ return (
+
+
+
+
+
+ {project.name}
+
+
+ {project.description}
+
+
+
+ View Project
+
+
+ );
+}
diff --git a/src/components/home/Stats.jsx b/src/components/home/Stats.jsx
new file mode 100644
index 00000000..42ec9e70
--- /dev/null
+++ b/src/components/home/Stats.jsx
@@ -0,0 +1,81 @@
+'use client'
+
+import React, { useState, useEffect, useRef } from 'react';
+import clsx from 'clsx';
+import { motion } from 'framer-motion';
+import { Container } from '@/components/shared/Container';
+
+function Counter({ end, duration, label }) {
+ const [count, setCount] = useState(0);
+ const countRef = useRef(null);
+ const [isVisible, setIsVisible] = useState(false);
+
+ useEffect(() => {
+ const observer = new IntersectionObserver(
+ ([entry]) => {
+ if (entry.isIntersecting) {
+ setIsVisible(true);
+ observer.disconnect();
+ }
+ },
+ { threshold: 0.1 }
+ );
+
+ const currentRef = countRef.current;
+ if (currentRef) {
+ observer.observe(currentRef);
+ }
+
+ return () => {
+ if (currentRef) observer.unobserve(currentRef);
+ };
+ }, []);
+
+ useEffect(() => {
+ if (!isVisible) return;
+
+ let startTime = null;
+ const step = (timestamp) => {
+ if (!startTime) startTime = timestamp;
+ const progress = Math.min((timestamp - startTime) / duration, 1);
+ setCount(Math.floor(progress * end));
+ if (progress < 1) {
+ window.requestAnimationFrame(step);
+ }
+ };
+ window.requestAnimationFrame(step);
+ }, [end, duration, isVisible]);
+
+ return (
+
+
+ {count}+
+
+
+ {label}
+
+
+ );
+}
+
+export function Stats() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/components/ideas/IdeaCard.jsx b/src/components/ideas/IdeaCard.jsx
new file mode 100644
index 00000000..edf3369b
--- /dev/null
+++ b/src/components/ideas/IdeaCard.jsx
@@ -0,0 +1,83 @@
+'use client'
+
+import Link from 'next/link'
+import Grid from '@mui/material/Grid'
+import MuiCard from '@mui/material/Card'
+import CardContent from '@mui/material/CardContent'
+import CardActions from '@mui/material/CardActions'
+import Typography from '@mui/material/Typography'
+import Button from '@mui/material/Button'
+import ArrowForwardIcon from '@mui/icons-material/ArrowForward'
+import { motion } from 'framer-motion'
+
+export function IdeaCard({ article, year }) {
+ const MotionMuiCard = motion(MuiCard)
+ return (
+
+
+
+
+ {article.title}
+
+
+
+ {article.description}
+
+
+
+
+
+
+ Know more
+
+
+
+
+
+ )
+}
diff --git a/src/components/IdeaLayout.jsx b/src/components/ideas/IdeaLayout.jsx
similarity index 84%
rename from src/components/IdeaLayout.jsx
rename to src/components/ideas/IdeaLayout.jsx
index a4142f7d..a609a9ab 100644
--- a/src/components/IdeaLayout.jsx
+++ b/src/components/ideas/IdeaLayout.jsx
@@ -1,8 +1,9 @@
-import Head from 'next/head'
-import { useRouter } from 'next/router'
+'use client'
-import { Container } from '@/components/Container'
-import { Prose } from '@/components/Prose'
+import { useRouter } from 'next/navigation'
+
+import { Container } from '@/components/shared/Container'
+import { Prose } from '@/components/shared/Prose'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faArrowLeft } from '@fortawesome/free-solid-svg-icons'
@@ -20,10 +21,6 @@ export function IdeaLayout({
return (
<>
-
-
{`${meta.title}`}
-
-
diff --git a/src/components/ideas/IdeasDisplay.jsx b/src/components/ideas/IdeasDisplay.jsx
new file mode 100644
index 00000000..59046780
--- /dev/null
+++ b/src/components/ideas/IdeasDisplay.jsx
@@ -0,0 +1,49 @@
+'use client'
+
+import { useState } from 'react'
+import { motion } from 'framer-motion'
+import { IdeasList } from '@/components/ideas/IdeasList'
+
+export function IdeasDisplay({ ideasData }) {
+ const [showAll, setShowAll] = useState(false)
+
+ // Show last 3 years initially
+ const initialCount = 3
+ const displayedData = showAll ? ideasData : ideasData.slice(0, initialCount)
+ const hasMore = ideasData.length > initialCount && !showAll
+
+ return (
+
+ {displayedData.map(({ year, articles }, index) => (
+
+
+ {year} Ideas
+
+
+
+ ))}
+
+ {hasMore && (
+
+ setShowAll(true)}
+ initial={{ opacity: 0 }}
+ whileInView={{ opacity: 1 }}
+ whileHover={{ scale: 1.05 }}
+ whileTap={{ scale: 0.95 }}
+ className="group order-2 mx-auto items-center overflow-hidden rounded-lg bg-zinc-800 px-8 py-3 text-white focus:outline-none dark:bg-white dark:text-black font-mono font-semibold transition-transform"
+ >
+ Show All Ideas
+
+
+ )}
+
+ )
+}
diff --git a/src/components/ideas/IdeasHeader.jsx b/src/components/ideas/IdeasHeader.jsx
new file mode 100644
index 00000000..45de40ba
--- /dev/null
+++ b/src/components/ideas/IdeasHeader.jsx
@@ -0,0 +1,82 @@
+'use client'
+
+import { motion } from 'framer-motion'
+import { Container } from '@/components/shared/Container'
+import Link from 'next/link'
+
+export function IdeasHeader({ validIdeasData, children }) {
+ return (
+
+
+
+
+
+
+ IDEAS
+
+
+
+
+
+
+ Explore the world of open-source possibilities with AOSSIE's{' '}
+ Idea List . As part of{' '}
+ Google Summer of Code 2025 , we offer
+ a unique opportunity for developers to explore new ideas, a wide
+ variety of projects for developers to choose from and contribute to.
+ From developing new features to fixing critical bugs, our idea list
+ is your go-to destination for finding your next big project and
+ kickstart your open-source journey.
+
+
+
+ {children}
+
+
+
+
+ Have an Idea?
+
+
+ We are always open to new and innovative ideas. If you have a project in mind that aligns with our mission, we'd love to hear from you.
+
+
+
+ Submit Your Idea
+
+
+
+
+
+ )
+}
diff --git a/src/components/ideas/IdeasList.jsx b/src/components/ideas/IdeasList.jsx
new file mode 100644
index 00000000..91717fe8
--- /dev/null
+++ b/src/components/ideas/IdeasList.jsx
@@ -0,0 +1,14 @@
+'use client'
+
+import Grid from '@mui/material/Grid'
+import { IdeaCard } from './IdeaCard'
+
+export function IdeasList({ articles, year }) {
+ return (
+
+ {articles.map((article) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/products/CardProduct.jsx b/src/components/products/CardProduct.jsx
new file mode 100644
index 00000000..2654aa41
--- /dev/null
+++ b/src/components/products/CardProduct.jsx
@@ -0,0 +1,63 @@
+'use client'
+
+import Image from 'next/image';
+import Link from 'next/link';
+import { motion } from 'framer-motion';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faDownload, faBook } from '@fortawesome/free-solid-svg-icons';
+
+export function CardProduct({ product }) {
+ return (
+
+
+
+
+
+ {product.name}
+
+
+ {product.description}
+
+
+
+
+
+ Download
+
+
+
+
+ Guide
+
+
+
+
+ );
+}
diff --git a/src/components/products/FeedbackForm.jsx b/src/components/products/FeedbackForm.jsx
new file mode 100644
index 00000000..ee853ca4
--- /dev/null
+++ b/src/components/products/FeedbackForm.jsx
@@ -0,0 +1,99 @@
+'use client'
+
+import { useState } from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faStar } from '@fortawesome/free-solid-svg-icons'
+import { faStar as faStarRegular } from '@fortawesome/free-regular-svg-icons'
+
+export function FeedbackForm() {
+ const [rating, setRating] = useState(0)
+ const [hoverRating, setHoverRating] = useState(0)
+ const [submitted, setSubmitted] = useState(false)
+
+ const handleSubmit = (e) => {
+ e.preventDefault()
+ // Here you would typically send the data to your backend
+ setSubmitted(true)
+ setTimeout(() => {
+ setSubmitted(false);
+ setRating(0);
+ e.target.reset();
+ }, 3000)
+ }
+
+ return (
+
+
+ Share Your Thoughts
+
+
+ {submitted ? (
+
+ Thank you for your feedback!
+
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/src/components/products/ProductsHeader.jsx b/src/components/products/ProductsHeader.jsx
new file mode 100644
index 00000000..0fb8d6cf
--- /dev/null
+++ b/src/components/products/ProductsHeader.jsx
@@ -0,0 +1,26 @@
+'use client'
+
+import { motion } from 'framer-motion'
+
+export function ProductsHeader() {
+ return (
+
+
+ Products
+
+
+ Explore our ready-to-use applications.
+
+
+ )
+}
diff --git a/src/components/shared/Banner.jsx b/src/components/shared/Banner.jsx
new file mode 100644
index 00000000..18159cbb
--- /dev/null
+++ b/src/components/shared/Banner.jsx
@@ -0,0 +1,67 @@
+'use client'
+
+import Link from 'next/link';
+import { motion } from 'framer-motion';
+import { ContainerPattern } from '@/components/shared/ContainerPattern';
+import { Pattern } from '@/components/shared/Pattern';
+
+export function Banner() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Launch into AOSSIE's open-source world through GSoC!
+
+
+ Learn how to apply for an opportunity to work on open-source projects and gain real-world experience through Google Summer of Code.
+
+
+
+
+ Apply to GSoC with AOSSIE
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/Card.jsx b/src/components/shared/Card.jsx
similarity index 88%
rename from src/components/Card.jsx
rename to src/components/shared/Card.jsx
index 92d38d4e..594bf4b9 100644
--- a/src/components/Card.jsx
+++ b/src/components/shared/Card.jsx
@@ -1,5 +1,8 @@
+'use client'
+
import Link from 'next/link'
import clsx from 'clsx'
+import { motion } from 'framer-motion'
function ChevronRightIcon(props) {
return (
@@ -14,12 +17,18 @@ function ChevronRightIcon(props) {
)
}
export function Card({ as: Component = 'div', className, children }) {
+ const MotionComponent = motion(Component)
return (
-
{children}
-
+
)
}
diff --git a/src/components/Container.jsx b/src/components/shared/Container.jsx
similarity index 100%
rename from src/components/Container.jsx
rename to src/components/shared/Container.jsx
diff --git a/src/components/ContainerPattern.jsx b/src/components/shared/ContainerPattern.jsx
similarity index 100%
rename from src/components/ContainerPattern.jsx
rename to src/components/shared/ContainerPattern.jsx
diff --git a/src/components/shared/Footer.jsx b/src/components/shared/Footer.jsx
new file mode 100644
index 00000000..1ed357a5
--- /dev/null
+++ b/src/components/shared/Footer.jsx
@@ -0,0 +1,92 @@
+'use client'
+
+import Link from 'next/link'
+import { motion } from 'framer-motion'
+
+import { Container } from '@/components/shared/Container'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faEnvelope } from '@fortawesome/free-solid-svg-icons'
+import { faDiscord, faGithub, faGitlab, faTwitter } from '@fortawesome/free-brands-svg-icons'
+
+function NavLink({ href, children }) {
+ return (
+
+ {children}
+
+ )
+}
+
+export function Footer() {
+ return (
+
+
+
+
+
+
+ {/* Brand and Description */}
+
+
AOSSIE
+
+ Australian Open Source Software Innovation and Education (AOSSIE) is a not-for-profit umbrella organization dedicated to open-source innovation. We believe in the power of code to educate and innovate.
+
+
+
+ {/* Navigation Links */}
+
+
Navigation
+
+ About Us
+ Our Projects
+ Project Ideas
+ How to Apply
+
+
+
+ {/* Social Links */}
+
+
Connect
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ © 2016-{new Date().getFullYear()} AOSSIE. All rights reserved.
+
+
+ Code of Conduct
+ Privacy Policy
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/Header.jsx b/src/components/shared/Header.jsx
similarity index 94%
rename from src/components/Header.jsx
rename to src/components/shared/Header.jsx
index 3ffdd386..94cc2d5f 100644
--- a/src/components/Header.jsx
+++ b/src/components/shared/Header.jsx
@@ -1,11 +1,14 @@
+'use client'
+
import { Fragment, useEffect, useRef } from 'react'
import Image from 'next/image'
import Link from 'next/link'
-import { useRouter } from 'next/router'
+import { usePathname } from 'next/navigation'
import { Popover, Transition } from '@headlessui/react'
import clsx from 'clsx'
+import { motion } from 'framer-motion'
-import { Container } from '@/components/Container'
+import { Container } from '@/components/shared/Container'
function CloseIcon(props) {
return (
@@ -122,8 +125,11 @@ function MobileNavigation(props) {
About
Projects
+ Products
Ideas
Apply
+ GitHub
+ Discord
@@ -132,9 +138,8 @@ function MobileNavigation(props) {
)
}
-
function NavItem({ href, children }) {
- let isActive = useRouter().pathname === href
+ let isActive = usePathname() === href
return (
@@ -162,8 +167,10 @@ function DesktopNavigation(props) {
About
Projects
+ Products
Ideas
Apply
+ GitHub
)
@@ -236,7 +243,7 @@ function Home({ large = false, className, ...props }) {
}
export function Header() {
- let isHomePage = useRouter().pathname === '/'
+ let isHomePage = usePathname() === '/'
let headerRef = useRef()
let avatarRef = useRef()
@@ -340,12 +347,15 @@ export function Header() {
return (
<>
-
+
{isHomePage &&
}
>
)
diff --git a/src/components/Pattern.jsx b/src/components/shared/Pattern.jsx
similarity index 100%
rename from src/components/Pattern.jsx
rename to src/components/shared/Pattern.jsx
diff --git a/src/components/Prose.jsx b/src/components/shared/Prose.jsx
similarity index 100%
rename from src/components/Prose.jsx
rename to src/components/shared/Prose.jsx
diff --git a/src/components/SectionHeading.jsx b/src/components/shared/SectionHeading.jsx
similarity index 100%
rename from src/components/SectionHeading.jsx
rename to src/components/shared/SectionHeading.jsx
diff --git a/src/helper/getAllIdeas.js b/src/helper/getAllIdeas.js
deleted file mode 100644
index de8e7a92..00000000
--- a/src/helper/getAllIdeas.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import glob from 'fast-glob'
-import * as path from 'path'
-
-async function importIdea(ideaFilename) {
- let { meta, default: component } = await import(
- `../pages/ideas/2025/${ideaFilename}`
- )
- return {
- slug: ideaFilename.replace(/(\/index)?\.mdx$/, ''),
- ...meta,
- component,
- }
-}
-
-export async function getAllIdeas() {
- let ideaFilenames = await glob(['*.mdx','*/index.mdx'], {
- cwd: path.join(process.cwd(), 'src/pages/ideas/2025'),
- })
-
- let ideas = await Promise.all(ideaFilenames.map(importIdea))
-
- return ideas
-}
diff --git a/src/helper/getAllIdeas2022.js b/src/helper/getAllIdeas2022.js
deleted file mode 100644
index 586bfc5d..00000000
--- a/src/helper/getAllIdeas2022.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import glob from 'fast-glob'
-import * as path from 'path'
-
-async function importIdea(ideaFilename) {
- let { meta, default: component } = await import(
- `../pages/ideas/2022/${ideaFilename}`
- )
- return {
- slug: ideaFilename.replace(/(\/index)?\.mdx$/, ''),
- ...meta,
- component,
- }
-}
-
-export async function getAllIdeas() {
- let ideaFilenames = await glob(['*.mdx','*/index.mdx'], {
- cwd: path.join(process.cwd(), 'src/pages/ideas/2022'),
- })
-
- let ideas = await Promise.all(ideaFilenames.map(importIdea))
-
- return ideas
-}
diff --git a/src/helper/getAllIdeas2023.js b/src/helper/getAllIdeas2023.js
deleted file mode 100644
index 0c3dccf2..00000000
--- a/src/helper/getAllIdeas2023.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import glob from 'fast-glob'
-import * as path from 'path'
-
-async function importIdea(ideaFilename) {
- let { meta, default: component } = await import(
- `../pages/ideas/2023/${ideaFilename}`
- )
- return {
- slug: ideaFilename.replace(/(\/index)?\.mdx$/, ''),
- ...meta,
- component,
- }
-}
-
-export async function getAllIdeas() {
- let ideaFilenames = await glob(['*.mdx','*/index.mdx'], {
- cwd: path.join(process.cwd(), 'src/pages/ideas/2023'),
- })
-
- let ideas = await Promise.all(ideaFilenames.map(importIdea))
-
- return ideas
-}
diff --git a/src/helper/getAllIdeas2024.js b/src/helper/getAllIdeas2024.js
deleted file mode 100644
index 62c3b8a2..00000000
--- a/src/helper/getAllIdeas2024.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import glob from 'fast-glob'
-import * as path from 'path'
-
-async function importIdea(ideaFilename) {
- let { meta, default: component } = await import(
- `../pages/ideas/2024/${ideaFilename}`
- )
- return {
- slug: ideaFilename.replace(/(\/index)?\.mdx$/, ''),
- ...meta,
- component,
- }
-}
-
-export async function getAllIdeas() {
- let ideaFilenames = await glob(['*.mdx','*/index.mdx'], {
- cwd: path.join(process.cwd(), 'src/pages/ideas/2024'),
- })
-
- let ideas = await Promise.all(ideaFilenames.map(importIdea))
-
- return ideas
-}
diff --git a/src/helper/products.js b/src/helper/products.js
new file mode 100644
index 00000000..469bf497
--- /dev/null
+++ b/src/helper/products.js
@@ -0,0 +1,74 @@
+import AgoraLogo from '@/images/Agora.png'
+import PictoPy from '@/images/Pictopy.png'
+import Djed from '@/images/Djed.png'
+
+const products = [
+ {
+ slug: 'pictopy',
+ name: 'PictoPy',
+ description: 'PictoPy is a modern desktop app designed to transform the handling of digital photos. It facilitates efficient gallery management with a robust focus on privacy.',
+ logo: PictoPy,
+ status: 'production',
+ downloadLink: 'https://github.com/AOSSIE-Org/PictoPy/releases',
+ githubLink: 'https://github.com/AOSSIE-Org/PictoPy',
+ discordLink: 'https://discord.com/invite/6mHZkbJ',
+ setupGuide: `# Setup Guide for PictoPy
+
+1. **Download the Installer**: Go to the releases page and download the appropriate installer for your operating system.
+2. **Run the Installer**: Double-click the downloaded file and follow the on-screen instructions.
+3. **Launch the App**: Open PictoPy from your applications folder.
+4. **Grant Permissions**: Allow access to your photo directories when prompted.
+
+You are now ready to organize your photos!
+`,
+ videoUrl: 'https://www.youtube.com/embed/dQw4w9WgXcQ', // Placeholder
+ feedbacks: [
+ { user: 'John Doe', comment: 'Amazing tool for organizing my gallery!', rating: 5 },
+ { user: 'Jane Smith', comment: 'Works well, but could use more features.', rating: 4 }
+ ]
+ },
+ {
+ slug: 'agora-vote-android',
+ name: 'Agora Vote Android',
+ description: 'This application uses Agora Web API as backend application. It allows for elections to be held by using multiple algorithms.',
+ logo: AgoraLogo,
+ status: 'production',
+ downloadLink: 'https://gitlab.com/aossie/agora-android/-/releases',
+ githubLink: 'https://gitlab.com/aossie/agora-android',
+ discordLink: 'https://discord.com/invite/6mHZkbJ',
+ setupGuide: `# Setup Guide for Agora Vote Android
+
+1. **Download APK**: Get the latest APK from the releases page.
+2. **Enable Unknown Sources**: Go to Settings > Security and enable installation from unknown sources if required.
+3. **Install APK**: Open the APK file and tap Install.
+4. **Connect**: Launch the app and connect to an Agora server instance.
+`,
+ videoUrl: 'https://www.youtube.com/embed/dQw4w9WgXcQ',
+ feedbacks: [
+ { user: 'Voter123', comment: 'Secure and easy to use.', rating: 5 }
+ ]
+ },
+ {
+ slug: 'djed',
+ name: 'Djed',
+ description: 'Djed is a Formally Verified Crypto-Backed Algorithmic Stablecoin Protocol.',
+ logo: Djed,
+ status: 'ongoing',
+ downloadLink: 'https://github.com/AOSSIE-Org/Djed-Solidity-WebDashboard',
+ githubLink: 'https://github.com/AOSSIE-Org/Djed-Solidity-WebDashboard',
+ discordLink: 'https://discord.com/invite/6mHZkbJ',
+ setupGuide: `# Setup Guide for Djed
+
+Djed runs as a web dashboard. You can deploy it locally or access the hosted version.
+
+## Local Deployment
+1. Clone the repository.
+2. Run \`npm install\`.
+3. Run \`npm start\`.
+`,
+ videoUrl: 'https://www.youtube.com/embed/dQw4w9WgXcQ',
+ feedbacks: []
+ }
+]
+
+export default products
diff --git a/src/helper/projects.js b/src/helper/projects.js
index 8d6193da..39c6d1d5 100644
--- a/src/helper/projects.js
+++ b/src/helper/projects.js
@@ -19,6 +19,7 @@ const projects = [
label: 'Agora',
},
logo: AgoraLogo,
+ status: 'ongoing',
},
{
name: 'Agora Vote Android',
@@ -29,6 +30,7 @@ const projects = [
label: 'Agora-Android',
},
logo: AgoraLogo,
+ status: 'production',
},
{
name: 'Djed',
@@ -36,6 +38,7 @@ const projects = [
'Djed is a Formally Verified Crypto-Backed Algorithmic Stablecoin Protocol.',
link: { href: 'https://github.com/AOSSIE-Org/Djed-Solidity-WebDashboard', label: 'Djed' },
logo: Djed,
+ status: 'ongoing',
},
{
name: 'Pictopy',
@@ -43,6 +46,7 @@ const projects = [
'PictoPy is a modern desktop app designed to transform the handling of digital photos. It facilitates efficient gallery management with a robust focus on privacy, offering smart tagging capabilities for photos based on objects, faces, or scenes.',
link: { href: 'https://github.com/AOSSIE-Org/PictoPy', label: 'PictoPy' },
logo: PictoPy,
+ status: 'production',
},
{
name: 'EduAid',
@@ -50,6 +54,7 @@ const projects = [
'An online tool that can generate short quizzes on input educational content can be of great use to teachers and students alike as it can help retain important information, frame questions and quickly revise large chunks of content.',
link: { href: 'https://github.com/AOSSIE-Org/EduAid', label: 'EduAid' },
logo: DefaultLogo,
+ status: 'ongoing',
},
{
name: 'OpenChat',
@@ -57,6 +62,7 @@ const projects = [
'a decentralised platform for secure and private messaging and file sharing built on top of blockchain',
link: { href: '#', label: 'OpenChat' },
logo: DefaultLogo,
+ status: 'ongoing',
},
{
name: 'Resonate',
@@ -64,6 +70,7 @@ const projects = [
'With the rising popularity of social voice platforms such as Clubhouse, it is high time for an Open Source alternative. A platform like this would not only enhance credibility within the open-source community but also attract more users and foster growth. ',
link: { href: 'https://github.com/AOSSIE-Org/Resonate', label: 'Resonate' },
logo: ResonateLogo,
+ status: 'ongoing',
},
{
name: 'Monumento',
@@ -71,6 +78,7 @@ const projects = [
'Monumento is an AR-integrated social app that transforms how you connect with the world’s most iconic landmarks. Through Monumento, you can check in to popular monuments, explore famous sites, and discover new people, all within a social platform.',
link: { href: 'https://github.com/AOSSIE-Org/Monumento', label: 'Monumento' },
logo: MonumentoLogo,
+ status: 'ongoing',
},
{
name: 'Social Street Smart',
@@ -81,6 +89,7 @@ const projects = [
label: 'Social-Street-Smart',
},
logo: SSSLogo,
+ status: 'ongoing',
},
]
diff --git a/src/lib/ideas.js b/src/lib/ideas.js
new file mode 100644
index 00000000..9355adb9
--- /dev/null
+++ b/src/lib/ideas.js
@@ -0,0 +1,68 @@
+import glob from 'fast-glob'
+import path from 'path'
+import fs from 'fs'
+
+export async function getIdeas(year) {
+ const ideasDir = path.join(process.cwd(), `src/app/ideas/${year}`)
+
+ if (!fs.existsSync(ideasDir)) {
+ return []
+ }
+
+ const files = await glob('**/page.mdx', { cwd: ideasDir })
+
+ const ideas = await Promise.all(files.map(async (file) => {
+ const slug = path.dirname(file)
+ const filePath = path.join(ideasDir, file)
+
+ try {
+ const source = fs.readFileSync(filePath, 'utf8')
+ const meta = extractMeta(source)
+
+ return {
+ slug,
+ ...meta
+ }
+ } catch (e) {
+ console.error(`Failed to load idea for year ${year}, slug ${slug}`, e)
+ return null
+ }
+ }))
+
+ return ideas.filter(idea => idea !== null && idea.title)
+}
+
+function extractMeta(source) {
+ try {
+ // Match export const meta = { ... or export const metadata = { ...
+ const match = source.match(/export const meta(?:data)?\s*=\s*(\{[\s\S]*)/);
+
+ if (!match) return {};
+
+ // We start from the opening brace
+ const str = match[1];
+ let braceCount = 0;
+ let end = 0;
+
+ // Find the closing brace that matches the first opening brace
+ for (let i = 0; i < str.length; i++) {
+ if (str[i] === '{') braceCount++;
+ else if (str[i] === '}') braceCount--;
+
+ if (braceCount === 0) {
+ end = i + 1;
+ break;
+ }
+ }
+
+ if (end > 0) {
+ const objectStr = str.substring(0, end);
+ // Use new Function to safely evaluate the object literal
+ const getMeta = new Function(`return ${objectStr}`);
+ return getMeta();
+ }
+ } catch (e) {
+ console.error('Error parsing metadata:', e);
+ }
+ return {};
+}
diff --git a/src/mdx-components.js b/src/mdx-components.js
new file mode 100644
index 00000000..47e58796
--- /dev/null
+++ b/src/mdx-components.js
@@ -0,0 +1,5 @@
+export function useMDXComponents(components) {
+ return {
+ ...components,
+ }
+}
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
deleted file mode 100644
index f2d6ffb9..00000000
--- a/src/pages/_app.jsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { useEffect, useRef } from 'react'
-
-import { Header } from '@/components/Header'
-
-import '@/style/tailwind.css'
-import 'focus-visible'
-import { Footer } from '@/components/Footer'
-
-function usePrevious(value) {
- let ref = useRef()
-
- useEffect(() => {
- ref.current = value
- }, [value])
-
- return ref.current
-}
-
-export default function App({ Component, pageProps, router }) {
- let previousPathname = usePrevious(router.pathname)
-
- return (
- <>
-
-
-
-
-
-
-
-
- >
- )
-}
diff --git a/src/pages/about.jsx b/src/pages/about.jsx
deleted file mode 100644
index 88c1768c..00000000
--- a/src/pages/about.jsx
+++ /dev/null
@@ -1,200 +0,0 @@
-import { useState, useEffect } from 'react';
-import Image from 'next/image';
-import Head from 'next/head';
-import { Container } from '@/components/Container';
-import { Banner } from '@/components/Banner';
-import React from 'react';
-import { Line } from 'react-chartjs-2';
-import { Chart as ChartJS, LineElement, CategoryScale, LinearScale, PointElement } from 'chart.js';
-
-ChartJS.register(LineElement, CategoryScale, LinearScale, PointElement);
-
-export default function About() {
- const [isDarkMode, setIsDarkMode] = useState(false);
-
- // Detect dark mode preference on page load
- useEffect(() => {
- const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
- setIsDarkMode(prefersDark);
- }, []);
-
- const data = {
- labels: ['2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024'], // Include '0' on the x-axis
- datasets: [
- {
- label: 'Number of Completed Projects',
- data: [4, 8, 12, 9, 9, 11, 8, 6, 18], // Start data points from '2017', leave '0' as null
- fill: false,
- borderColor: '#32a852',
- tension: 0.4,
- },
- ],
- };
-
- const options = {
- responsive: true,
- maintainAspectRatio: false,
- plugins: {
- legend: {
- display: false,
- },
- },
- scales: {
- x: {
- type: 'category',
- grid: {
- display: true,
- color: '#FFCC00',
- },
- ticks: {
- callback: (value, index) => data.labels[index], // Match x-axis labels
- },
- },
- y: {
- beginAtZero: true, // Start y-axis from 0
- ticks: {
- stepSize: 5, // Increment y-axis labels by 5
- },
- grid: {
- display: true,
- color: '#FFCC00',
- },
- },
- },
- };
-
- const styles = {
- container: {
- fontFamily: 'Arial, sans-serif',
- padding: '20px',
- textAlign: 'center',
- maxWidth: '1000px',
- margin: '0 auto',
- },
- section: {
- margin: '30px 0',
- },
- title: {
- fontSize: '2.5rem',
- color: '#32a852',
- },
- paragraph: {
- fontSize: '1rem',
- lineHeight: '1.6',
- textAlign: 'center',
- marginTop: '20px', // More space below ABOUT
- marginBottom: '40px', // Increased spacing
- },
- highlight: {
- color: '#32a852',
- fontWeight: 'bold',
- },
- stats: {
- display: 'flex',
- justifyContent: 'space-around',
- flexWrap: 'wrap',
- gap: '20px',
- marginTop: '30px', // More space between stats and paragraph
- },
- statItem: {
- textAlign: 'center',
- fontWeight: 'bold',
- color: '#32a852', // Make stats bold
- },
- statNumber: {
- fontSize: '2rem',
- color: '#FFCC00',
- fontWeight: 'bold', // Make stats numbers bold
- },
- statLabel: {
- fontSize: '1rem',
- marginBottom: '20px',
- },
- graphLabel: {
- textAlign: 'center',
- color: '#32a852',
- fontWeight: 'bold',
- marginTop: '10px',
- },
- bannerWrapper: {
- width: '100vw',
- marginLeft: 'calc(-50vw + 50%)',
- position: 'relative',
- overflow: 'hidden',
- },
- gsocSection: {
- display: 'flex',
- flexDirection: 'column',
- alignItems: 'center',
- gap: '20px', // Gap after GSOC Logo and heading
- },
- orgText: {
- textAlign: 'center',
- fontSize: '1.1rem',
- marginBottom: '20px', // Gap below Australian Umbrella Org
- },
- };
-
- return (
-
-
-
About Us - Projects and Contributions
-
-
-
-
-
- ABOUT
-
-
- Our Projects, where we showcase our tech wizardry and code-slinging skills!! Be a part of our community and
- contribute to meaningful projects that are making a difference . Explore
- our selection of projects and find the perfect opportunity to showcase your skills and{' '}
- make an impact .
-
-
-
-
34+
-
Active Projects
-
-
-
500+
-
Total Contributors
-
-
-
3800+
-
Community Count
-
-
-
-
-
-
-
-
- GSOC CONTRIBUTION
-
-
- Australian Umbrella Org for Open-Source Projects
-
-
-
- ----- Number of Completed Projects Year Wise -----
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/pages/apply.jsx b/src/pages/apply.jsx
deleted file mode 100644
index 1cd074ba..00000000
--- a/src/pages/apply.jsx
+++ /dev/null
@@ -1,158 +0,0 @@
-import Head from 'next/head'
-import Image from 'next/image'
-import Link from 'next/link'
-
-import { Container } from '@/components/Container'
-import { TimelineElement } from '@/components/TimelineElement'
-import GSoC from '@/images/logo.svg'
-
-export default function About() {
- return (
- <>
-
- Application Timeline
-
-
-
-
-
-
-
-
-
-
-
Learn how to apply for an opportunity to work on open-source projects and gain real-world experience through Google Summer of Code.
-
- Our application timeline is your step-by-step guide to becoming a part of our open-source community and contributing to projects that are shaping the future of technology. From submitting your proposal to final evaluations, we'll walk you through the process every step of the way. Don't miss this opportunity to be a part of something great and apply now!
-
-
-
-
-
-
-
-
-
-
{/* Adjust width and height */}
-
Join us on Discord
-
-
-
{/* Adjust width and height */}
-
Start Contributing
-
-
-
{/* Adjust width and height */}
-
Choose an idea
-
-
-
-
-
-
-
{/* Adjust width and height */}
-
Discuss with mentor
-
-
-
{/* Adjust width and height */}
-
Submit final application
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- View GSoC Program Announcements
-
-
-
-
-
-
-
-
- >
- );
-}
diff --git a/src/pages/ideas/2024/index.jsx b/src/pages/ideas/2024/index.jsx
deleted file mode 100644
index 4e7701c4..00000000
--- a/src/pages/ideas/2024/index.jsx
+++ /dev/null
@@ -1,122 +0,0 @@
-import Head from 'next/head';
-import Link from 'next/link';
-import { Container } from '@/components/Container';
-import { getAllIdeas } from '@/helper/getAllIdeas';
-import Grid from '@mui/material/Grid';
-import MuiCard from '@mui/material/Card';
-import CardContent from '@mui/material/CardContent';
-import CardActions from '@mui/material/CardActions';
-import Typography from '@mui/material/Typography';
-import Button from '@mui/material/Button';
-import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
-
-function Article({ article }) {
- return (
-
-
-
-
- {article.title}
-
-
-
- {article.description}
-
-
-
-
-
-
- Know more
-
-
-
-
-
- );
-}
-
-export default function Ideas({ articles }) {
- return (
- <>
-
- Idea List
-
-
-
-
-
-
- AOSSIE's{' '}
- Idea List for{' '}
- Google Summer of Code 2024
-
-
-
-
-
-
- {articles.map((article) => (
-
- ))}
-
-
-
-
-
- Go Back
-
-
-
-
- >
- );
-}
-
-export async function getStaticProps() {
- return {
- props: {
- articles: (await getAllIdeas()).map(({ component, ...meta }) => meta),
- },
- };
-}
diff --git a/src/pages/ideas/index.jsx b/src/pages/ideas/index.jsx
deleted file mode 100644
index eaf5847d..00000000
--- a/src/pages/ideas/index.jsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import Head from 'next/head';
-import Link from 'next/link';
-import { Container } from '@/components/Container';
-import { getAllIdeas } from '@/helper/getAllIdeas';
-import Grid from '@mui/material/Grid';
-import MuiCard from '@mui/material/Card';
-import CardContent from '@mui/material/CardContent';
-import CardActions from '@mui/material/CardActions';
-import Typography from '@mui/material/Typography';
-import Button from '@mui/material/Button';
-import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
-
-function Article({ article }) {
- return (
-
-
-
-
- {article.title}
-
-
-
- {article.description}
-
-
-
-
-
-
- Know more
-
-
-
-
-
- );
-}
-
-
-export default function Ideas({ articles }) {
- return (
- <>
-
- Idea List
-
-
-
-
-
-
-
-
- IDEAS
-
-
-
-
-
-
- Explore the world of open-source possibilities with AOSSIE's{' '}
- Idea List . As part of{' '}
- Google Summer of Code 2025 , we offer
- a unique opportunity for developers to explore new ideas, a wide
- variety of projects for developers to choose from and contribute to.
- From developing new features to fixing critical bugs, our idea list
- is your go-to destination for finding your next big project and
- kickstart your open-source journey.
-
-
-
-
- {articles.map((article) => (
-
- ))}
-
-
-
-
-
- View 2024 Idea List
-
-
-
-
-
- >
- );
-}
-
-export async function getStaticProps() {
- return {
- props: {
- articles: (await getAllIdeas()).map(({ component, ...meta }) => meta),
- },
- };
-}