diff --git a/package-lock.json b/package-lock.json index 8e9baafe6..53d5f9683 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "license": "MIT", "dependencies": { + "@codesandbox/sandpack-react": "^2.20.0", "@docusaurus/core": "^3.4.0", "@docusaurus/plugin-content-blog": "^3.8.1", "@docusaurus/plugin-content-pages": "^3.3.2", @@ -2122,6 +2123,200 @@ "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", "license": "Apache-2.0" }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", + "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.1.tgz", + "integrity": "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", + "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", + "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.1.tgz", + "integrity": "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.2.tgz", + "integrity": "sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.3.tgz", + "integrity": "sha512-MerMzJzlXogk2fxWFU1nKp36bY5orBG59HnPiz0G9nLRebWa0zXuv2siH6PLIHBvv5TH8CkQRqjBs0MlxCZu+A==", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.39.9", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.9.tgz", + "integrity": "sha512-miGSIfBOKC1s2oHoa80dp+BjtsL8sXsrgGlQnQuOcfvaedcQUtqddTmKbJSDkLl4mkgPvZyXuKic2HDNYcJLYA==", + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@codesandbox/nodebox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@codesandbox/nodebox/-/nodebox-0.1.8.tgz", + "integrity": "sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==", + "dependencies": { + "outvariant": "^1.4.0", + "strict-event-emitter": "^0.4.3" + } + }, + "node_modules/@codesandbox/sandpack-client": { + "version": "2.19.8", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-client/-/sandpack-client-2.19.8.tgz", + "integrity": "sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ==", + "dependencies": { + "@codesandbox/nodebox": "0.1.8", + "buffer": "^6.0.3", + "dequal": "^2.0.2", + "mime-db": "^1.52.0", + "outvariant": "1.4.0", + "static-browser-server": "1.0.3" + } + }, + "node_modules/@codesandbox/sandpack-client/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@codesandbox/sandpack-client/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@codesandbox/sandpack-react": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-react/-/sandpack-react-2.20.0.tgz", + "integrity": "sha512-takd1YpW/PMQ6KPQfvseWLHWklJovGY8QYj8MtWnskGKbjOGJ6uZfyZbcJ6aCFLQMpNyjTqz9AKNbvhCOZ1TUQ==", + "dependencies": { + "@codemirror/autocomplete": "^6.4.0", + "@codemirror/commands": "^6.1.3", + "@codemirror/lang-css": "^6.0.1", + "@codemirror/lang-html": "^6.4.0", + "@codemirror/lang-javascript": "^6.1.2", + "@codemirror/language": "^6.3.2", + "@codemirror/state": "^6.2.0", + "@codemirror/view": "^6.7.1", + "@codesandbox/sandpack-client": "^2.19.8", + "@lezer/highlight": "^1.1.3", + "@react-hook/intersection-observer": "^3.1.1", + "@stitches/core": "^1.2.6", + "anser": "^2.1.1", + "clean-set": "^1.1.2", + "dequal": "^2.0.2", + "escape-carriage": "^1.3.1", + "lz-string": "^1.4.4", + "react-devtools-inline": "4.4.0", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19", + "react-dom": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/@codesandbox/sandpack-react/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -4949,6 +5144,57 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "node_modules/@lezer/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", + "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==" + }, + "node_modules/@lezer/css": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.0.tgz", + "integrity": "sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.7.tgz", + "integrity": "sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", @@ -4964,6 +5210,11 @@ "@lit-labs/ssr-dom-shim": "^1.2.0" } }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" + }, "node_modules/@mdx-js/mdx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", @@ -5056,6 +5307,11 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" + }, "node_modules/@paulirish/trace_engine": { "version": "0.0.52", "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.52.tgz", @@ -5920,6 +6176,26 @@ } } }, + "node_modules/@react-hook/intersection-observer": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-hook/intersection-observer/-/intersection-observer-3.1.2.tgz", + "integrity": "sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ==", + "dependencies": { + "@react-hook/passive-layout-effect": "^1.2.0", + "intersection-observer": "^0.10.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "peerDependencies": { + "react": ">=16.8" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -6187,6 +6463,11 @@ "micromark-util-symbol": "^1.0.1" } }, + "node_modules/@stitches/core": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", + "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -8059,6 +8340,11 @@ "algoliasearch": ">= 3.1 < 6" } }, + "node_modules/anser": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.5.tgz", + "integrity": "sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==" + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -9563,6 +9849,11 @@ "node": ">=0.10.0" } }, + "node_modules/clean-set": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-set/-/clean-set-1.1.2.tgz", + "integrity": "sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -10286,6 +10577,11 @@ "sha.js": "^2.4.8" } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -10821,6 +11117,18 @@ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -12451,6 +12759,17 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dotenv-defaults": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.1.1.tgz", @@ -12808,6 +13127,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -12817,6 +13173,11 @@ "node": ">=6" } }, + "node_modules/escape-carriage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", + "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==" + }, "node_modules/escape-goat": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", @@ -12899,6 +13260,20 @@ "node": ">=8.0.0" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -13061,6 +13436,15 @@ "node": ">= 0.8" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -13278,6 +13662,14 @@ "node": ">= 0.6" } }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -15688,6 +16080,12 @@ "node": ">= 0.10" } }, + "node_modules/intersection-observer": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz", + "integrity": "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==", + "deprecated": "The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019." + }, "node_modules/intl-messageformat": { "version": "10.5.14", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz", @@ -16970,6 +17368,14 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -19794,6 +20200,11 @@ "node": ">= 0.4.0" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -20267,6 +20678,11 @@ "node": ">=0.10.0" } }, + "node_modules/outvariant": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", + "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==" + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -23139,6 +23555,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/react-devtools-inline": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/react-devtools-inline/-/react-devtools-inline-4.4.0.tgz", + "integrity": "sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==", + "dependencies": { + "es6-symbol": "^3" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -25426,6 +25850,25 @@ "figgy-pudding": "^3.5.1" } }, + "node_modules/static-browser-server": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/static-browser-server/-/static-browser-server-1.0.3.tgz", + "integrity": "sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==", + "dependencies": { + "@open-draft/deferred-promise": "^2.1.0", + "dotenv": "^16.0.3", + "mime-db": "^1.52.0", + "outvariant": "^1.3.0" + } + }, + "node_modules/static-browser-server/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -25602,6 +26045,11 @@ "bare-events": "^2.2.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", + "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -25836,6 +26284,11 @@ "node": ">=0.8.0" } }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==" + }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -26649,6 +27102,11 @@ "node": "*" } }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -27581,6 +28039,11 @@ "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "license": "MIT" }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", diff --git a/package.json b/package.json index 837a2ee32..4999d6fd1 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { + "@codesandbox/sandpack-react": "^2.20.0", "@docusaurus/core": "^3.4.0", "@docusaurus/plugin-content-blog": "^3.8.1", "@docusaurus/plugin-content-pages": "^3.3.2", diff --git a/src/pages/about/team.tsx b/src/pages/about/team.tsx new file mode 100644 index 000000000..cad76e06a --- /dev/null +++ b/src/pages/about/team.tsx @@ -0,0 +1,172 @@ +import Layout from "@theme/Layout"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + Github, + Twitter, + Linkedin, + Globe, + Cpu, + ShieldCheck, + Globe2, + Zap, + Mail +} from 'lucide-react'; + +export default function Team() { + const { siteConfig } = useDocusaurusContext(); + + const coreTeam = [ + { + name: "Ajay Dhangar", + role: "Founder & Lead Architect", + image: "https://github.com/ajay-dhangar.png", + bio: "Visionary behind CodeHarborHub. Passionate about open-source and democratizing tech education.", + skills: ["System Design", "React", "Cloud"], + social: { github: "#", linkedin: "#", twitter: "#" } + }, + { + name: "Team Member", + role: "Core Contributor", + image: "https://github.com/github.png", + bio: "Specializes in high-performance backend systems and community engagement strategies.", + skills: ["Node.js", "Go", "DevOps"], + social: { github: "#", linkedin: "#", twitter: "#" } + }, + // Add more team members here + ]; + + return ( + +
+ + {/* --- Advanced Hero Section --- */} +
+
+ +
+

+ The Minds Behind
+ CodeHarborHub +

+

+ We are a global collective of engineers, designers, and educators + united by a single mission: to build the world's most accessible + technical harbor. +

+
+
+ + {/* --- Leadership / Bento Grid --- */} +
+
+ {coreTeam.map((member, i) => ( +
+
+ + {/* Avatar & Status */} +
+ {member.name} +
+
+ + {/* Content */} +

+ {member.name} +

+

+ {member.role} +

+

+ {member.bio} +

+ + {/* Skill Tags */} +
+ {member.skills.map((skill, si) => ( + + {skill} + + ))} +
+ + {/* Social Footer */} + +
+
+ ))} +
+
+ + {/* --- Values / Organization DNA --- */} +
+
+
+
+

Our Core Principles

+
+ {[ + { title: "Radical Transparency", desc: "Every decision, from code to strategy, happens in the open.", icon: }, + { title: "Global Inclusion", desc: "Empowering developers from underserved regions with high-tier tech.", icon: }, + { title: "Obsessive Quality", desc: "We don't ship 'good enough'. We ship industry-defining standards.", icon: } + ].map((val, i) => ( +
+
{val.icon}
+
+

{val.title}

+

{val.desc}

+
+
+ ))} +
+
+
+
+
+
+ +
+
+
+
+
+
+ + {/* --- Join Us CTA --- */} +
+
+

Want to make an impact?

+

+ We're always looking for passionate maintainers, content creators, and community leads. +

+
+ + Contact Us + + + Browse Open Roles + +
+
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/contributing/contributors.tsx b/src/pages/contributing/contributors.tsx new file mode 100644 index 000000000..fafd373bd --- /dev/null +++ b/src/pages/contributing/contributors.tsx @@ -0,0 +1,186 @@ +import React, { useState, useEffect } from "react"; +import Layout from "@theme/Layout"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + Github, + Users, + Star, + GitPullRequest, + Trophy, + ExternalLink, + Code2, + Heart +} from 'lucide-react'; + +interface Contributor { + id: number; + login: string; + avatar_url: string; + html_url: string; + contributions: number; +} + +export default function Contributors() { + const { siteConfig } = useDocusaurusContext(); + const [contributors, setContributors] = useState([]); + const [loading, setLoading] = useState(true); + + // --- Fetch Real GitHub Data --- + useEffect(() => { + fetch("https://api.github.com/repos/codeharborhub/codeharborhub.github.io/contributors?per_page=100") + .then((res) => res.json()) + .then((data) => { + setContributors(data); + setLoading(false); + }) + .catch((err) => console.error("Error fetching contributors:", err)); + }, []); + + return ( + +
+ + {/* --- Hero: The Recognition Wall --- */} +
+
+
+
+ +
+
+ Community Powered +
+

+ Our Engineers +

+

+ Every pull request, documentation fix, and bug report helps CodeHarborHub grow. + We are a community-first organization. Meet the humans behind the code. +

+
+
+ + {/* --- Repository Stats --- */} +
+
+ {[ + { label: "Contributors", value: contributors.length || "...", icon: }, + { label: "Open Issues", value: "20+", icon: }, + { label: "PRs Merged", value: "150+", icon: }, + { label: "Community", value: "Global", icon: }, + ].map((stat, i) => ( +
+
{stat.icon}
+
{stat.value}
+
{stat.label}
+
+ ))} +
+
+ + {/* --- The Contributor Wall --- */} +
+ {loading ? ( +
+
+
+ ) : ( +
+ + {/* --- How to Get Listed --- */} +
+
+
+

+ Want your name
+ on this wall? +

+

+ Whether you're fixing a typo, optimizing a React component, or designing + the UI, we want you on our team. Follow our contribution guidelines + and get started today. +

+ +
+ + {/* Contribution Types Grid */} +
+ {[ + { label: "Code", color: "bg-blue-500/10", text: "text-blue-500" }, + { label: "Docs", color: "bg-green-500/10", text: "text-green-500" }, + { label: "Design", color: "bg-purple-500/10", text: "text-purple-500" }, + { label: "Support", color: "bg-red-500/10", text: "text-red-500" }, + ].map((item, i) => ( +
+
{item.label}
+
+ ))} +
+
+
+ + {/* --- Support Section --- */} +
+ +

Support our Open Source Journey

+

Star the repo to show your support!

+ + Star on GitHub + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/contributing/index.tsx b/src/pages/contributing/index.tsx new file mode 100644 index 000000000..4cfab1dd1 --- /dev/null +++ b/src/pages/contributing/index.tsx @@ -0,0 +1,379 @@ +import Layout from "@theme/Layout"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + GitFork, + Terminal, + Code2, + GitPullRequest, + CheckCircle2, + BookOpen, + MessageSquare, + ChevronRight, + ShieldAlert, + ArrowRight, + Github, + Award, + Zap, + Coffee, +} from "lucide-react"; + +export default function Contributing() { + const { siteConfig } = useDocusaurusContext(); + + const Workflows = [ + { + icon: , + title: "Discuss", + desc: "Open an issue or join Discord to propose changes or report bugs.", + color: "var(--ifm-color-primary)", + }, + { + icon: , + title: "Develop", + desc: "Fork the repo, create a feature branch, and write clean, tested code.", + color: "var(--ifm-color-primary)", + }, + { + icon: , + title: "Review", + desc: "Submit a PR. Our maintainers will review and provide feedback.", + color: "var(--ifm-color-primary)", + }, + ]; + + const steps = [ + { + icon: , + title: "Fork & Clone", + desc: "Fork the repository to your own account and clone it locally to start your journey.", + cmd: `git clone https://github.com/YOUR_USERNAME/${siteConfig.title.toLowerCase()}.git`, + }, + { + icon: , + title: "Install & Branch", + desc: "Install dependencies and create a feature branch for your specific changes.", + cmd: "npm install && git checkout -b feature/your-awesome-feature", + }, + { + icon: , + title: "Development", + desc: "Write clean, documented code and ensure your changes follow our styling guidelines.", + cmd: "npm run start", + }, + { + icon: , + title: "Pull Request", + desc: "Push your changes to GitHub and open a PR. Provide a clear description of your work.", + cmd: "git push origin feature/your-awesome-feature", + }, + ]; + + return ( + +
+ {/* --- Hero: The Call to Action --- */} +
+
+

+ Build the{" "} + Future +

+

+ CodeHarborHub isn't just a platform; it's a collaborative engine. + We value every contribution, from UI components to documentation + fixes. +

+
+ +
+ + {/* --- The Workflow: Bento Steps --- */} +
+

+ Contribution{" "} + Workflow +

+
+ {Workflows.map((step, i) => ( +
+
+ {step.icon} +
+

+ 0{i + 1}. {step.title} +

+

+ {step.desc} +

+
+
+
+
+ ))} +
+
+ + {/* --- Interactive Workflow Steps --- */} +
+

+ Your{" "} + + First Steps + +

+
+ {steps.map((step, i) => ( +
+
+ {step.icon} +
+
+ 0{i + 1} +
+

{step.title}

+

+ {step.desc} +

+
+ + {step.cmd} + +
+
+ ))} +
+
+ + {/* --- Dynamic Contribution Tracks --- */} +
+
+
+

+ Choose your
+ + Influence + +

+
    + {[ + { + t: "Technical Writing", + d: "Improve documentation, write blogs, or create tutorials.", + i: , + }, + { + t: "Feature Development", + d: "Build new React components or optimize backend logic.", + i: , + }, + { + t: "Community Support", + d: "Help new members in Discord and review incoming PRs.", + i: , + }, + ].map((item, i) => ( +
  • +
    + {item.i} +
    +
    +

    + {item.t} +

    +

    {item.d}

    +
    +
  • + ))} +
+
+ +
+
+
+
+
+
+
+
+

+ $ git clone codeharborhub.git +

+

+ # Setting up the ecosystem... +

+

# Ready to contribute!

+
+
+ + + Follow the{" "} + + Code of Conduct + + +
+
+ + Use meaningful commit messages +
+
+ + Ask before starting a major feature +
+
+
+
+
+
+
+ + {/* --- Contribution Areas (Bento Style) --- */} +
+

+ Contribution Areas +

+
+ {/* Left: Guidelines */} +
+
+ +
+

+ Code Standards +

+
    +
  • Use TypeScript for all new features
  • +
  • Follow the Airbnb JavaScript Style Guide
  • +
  • Ensure 100% responsive design
  • +
+
+
+ +
+ +
+

+ Documentation +

+
    +
  • Use clear, concise English
  • +
  • Include code examples where possible
  • +
  • Update `sidebars.js` for new docs
  • +
+
+
+
+ + {/* Right: Community Callout */} +
+
+ +

+ Need Help
+ Getting Started? +

+

+ Join our Discord server. Our core maintainers are always + available to help you unblock technical issues. +

+ +
+
+
+
+
+ + {/* --- Ready to Submit? --- */} +
+

+ Ready to Contribute? +

+
+ +

+ We aim to review all Pull Requests within 48 hours. Make sure to + check the "Files Changed" tab for any linting errors before + submitting. +

+ + Open a Pull Request + +
+
+
+
+ ); +} diff --git a/src/pages/events/index.tsx b/src/pages/events/index.tsx index 29896bdde..7dede1d8b 100644 --- a/src/pages/events/index.tsx +++ b/src/pages/events/index.tsx @@ -1,40 +1,357 @@ +import React, { useState, useMemo } from "react"; import Layout from "@theme/Layout"; -import { useState } from "react"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + Clock, + MapPin, + ArrowRight, + Play, + Filter, + Sparkles, + Search, + Trophy, + Code2, + Video, + Radio +} from 'lucide-react'; -import Hero from "@site/src/components/Events/Hero"; -import EventsGrid from "@site/src/components/Events/EventsGrid"; -import ContributionGuide from "@site/src/components/Events/ContributionGuide"; +// --- Types for Industry Standards --- +type EventStatus = 'upcoming' | 'live' | 'past'; +type EventCategory = 'Hackathon' | 'Workshop' | 'Webinar' | 'Meetup'; + +interface Event { + id: number; + category: EventCategory; + title: string; + date: string; + time: string; + venue: string; + status: EventStatus; + image: string; + description: string; + link: string; +} + +export default function Events() { + const { siteConfig } = useDocusaurusContext(); + const [activeTab, setActiveTab] = useState('all'); + const [searchQuery, setSearchQuery] = useState(""); + + // --- Full Dataset (10 Events) --- + const allEvents: Event[] = [ + { + id: 1, + category: "Hackathon", + title: "CodeHarbor Global Hack 2026", + date: "Mar 15, 2026", + time: "48 Hours", + venue: "Discord / Virtual", + status: "upcoming", + image: "https://images.unsplash.com/photo-1550751827-4bd374c3f58b?auto=format&fit=crop&q=80&w=800", + description: "Building open-source tools for the next generation of decentralized web.", + link: "#" + }, + { + id: 2, + category: "Workshop", + title: "System Design Masterclass", + date: "Jan 10, 2026", + time: "06:00 PM", + venue: "YouTube Live", + status: "live", + image: "https://images.unsplash.com/photo-1558494949-ef010cbdcc31?auto=format&fit=crop&q=80&w=800", + description: "Live deep dive into distributed systems and high-scale architecture.", + link: "#" + }, + { + id: 3, + category: "Webinar", + title: "The Future of AI in DevTools", + date: "Feb 05, 2026", + time: "10:00 AM", + venue: "Zoom", + status: "upcoming", + image: "https://images.unsplash.com/photo-1677442136019-21780ecad995?auto=format&fit=crop&q=80&w=800", + description: "How LLMs are reshaping the IDE experience for modern engineers.", + link: "#" + }, + { + id: 4, + category: "Meetup", + title: "Bangalore Dev Mixer", + date: "Feb 20, 2026", + time: "05:00 PM", + venue: "Indiranagar, BLR", + status: "upcoming", + image: "https://images.unsplash.com/photo-1511795409834-ef04bbd61622?auto=format&fit=crop&q=80&w=800", + description: "In-person networking event for local CodeHarborHub contributors.", + link: "#" + }, + { + id: 5, + category: "Workshop", + title: "Rust for JS Developers", + date: "Dec 15, 2025", + time: "3 Hours", + venue: "Recorded", + status: "past", + image: "https://images.unsplash.com/photo-1629904853716-f0bc54eea481?auto=format&fit=crop&q=80&w=800", + description: "Transitioning your logic from TypeScript to memory-safe Rust.", + link: "#" + }, + { + id: 6, + category: "Hackathon", + title: "UI/UX Blitz 2025", + date: "Nov 10, 2025", + time: "24 Hours", + venue: "Figma / Virtual", + status: "past", + image: "https://images.unsplash.com/photo-1586717791821-3f44a563eb4c?auto=format&fit=crop&q=80&w=800", + description: "Rapid prototyping challenge for designing community-led education portals.", + link: "#" + }, + { + id: 7, + category: "Webinar", + title: "PostgreSQL Performance", + date: "Oct 22, 2025", + time: "1 Hour", + venue: "Recorded", + status: "past", + image: "https://images.unsplash.com/photo-1544383835-bda2bc66a55d?auto=format&fit=crop&q=80&w=800", + description: "Optimizing queries and indexing strategies for multi-tenant apps.", + link: "#" + }, + { + id: 8, + category: "Workshop", + title: "Advanced Tailwind V4", + date: "Mar 01, 2026", + time: "11:00 AM", + venue: "YouTube Live", + status: "upcoming", + image: "https://images.unsplash.com/photo-1587620962725-abab7fe55159?auto=format&fit=crop&q=80&w=800", + description: "Exploring the new engine and CSS-first configuration.", + link: "#" + }, + { + id: 9, + category: "Meetup", + title: "Open Source Day Online", + date: "Jan 15, 2026", + time: "08:00 PM", + venue: "Discord Live", + status: "upcoming", + image: "https://images.unsplash.com/photo-1515187029135-18ee286d815b?auto=format&fit=crop&q=80&w=800", + description: "Monthly check-in and project onboarding for new contributors.", + link: "#" + }, + { + id: 10, + category: "Webinar", + title: "Career in DevRel", + date: "Sept 12, 2025", + time: "Recorded", + venue: "On-Demand", + status: "past", + image: "https://images.unsplash.com/photo-1521737604893-d14cc237f11d?auto=format&fit=crop&q=80&w=800", + description: "How to bridge the gap between engineering and community building.", + link: "#" + } + ]; + + // --- Filtering Logic --- + const filteredEvents = useMemo(() => { + return allEvents.filter(event => { + const matchesTab = activeTab === 'all' || event.status === activeTab; + const matchesSearch = event.title.toLowerCase().includes(searchQuery.toLowerCase()) || + event.category.toLowerCase().includes(searchQuery.toLowerCase()); + return matchesTab && matchesSearch; + }); + }, [activeTab, searchQuery]); -export default function EventsPage() { - const [currentView, setCurrentView] = useState<"events" | "guide">("events"); return ( - {currentView === "events" ? ( - <> - - -
-
-

New to Open Source?

-

- Check out our comprehensive guide to learn how to make your - first contribution. -

- +
+ + {/* --- Hero: High Authority --- */} + {/* --- Hero Section with Animated Mesh Gradient --- */} +
+
+
+
+ +
+
+
+
+ Experience Excellence +
+

+ The Events
+ Pipeline +

+

+ Where theory meets deployment. Participate in world-class technical events curated for the elite engineering community. +

+
+ + {/* Live Card Shortcut */} +
+
+
+ +
+

Happening Now

+

System Design Interview Masterclass

+
+ +
+

Ajay Dhangar

+

Lead Architect

+
+
+ +
+
+
+
+
+ + {/* --- Advanced Control Bar --- */} +
+
+ + {/* Tab Switcher */} +
+ {['all', 'live', 'upcoming', 'past'].map((tab) => ( + + ))} +
+ + {/* Search Input */} +
+ + setSearchQuery(e.target.value)} + />
- - ) : ( - setCurrentView("events")} /> - )} +
+ + {/* --- Dynamic Bento Grid --- */} +
+ {filteredEvents.length > 0 ? ( +
+ {filteredEvents.map((event, i) => ( +
+ {/* Image Layer */} +
+ +
+
+ + {/* Icon Badge Layer */} +
+
+ {event.category === 'Hackathon' && } + {event.category === 'Workshop' && } + {event.category === 'Webinar' &&
+
+ + {/* Content Layer */} +
+
+
+ {event.status === 'live' && ( + + Live Now + + )} + {event.date} +
+ +

+ {event.title} +

+ +
+
+
{event.time}
+
{event.venue}
+
+ + {event.status === 'past' ? : } + +
+
+
+
+ ))} +
+ ) : ( +
+

No events found

+
+ )} +
+ + {/* --- Footer CTA: Speaker Program --- */} +
+
+
+

+ Have a Vision? +

+

+ We're always scouting for elite engineers to host workshops and lead community hackathons. +

+ +
+
+
+
+ +
); -} +} \ No newline at end of file diff --git a/src/pages/mentoring.tsx b/src/pages/mentoring.tsx new file mode 100644 index 000000000..e394e3d29 --- /dev/null +++ b/src/pages/mentoring.tsx @@ -0,0 +1,153 @@ +import Layout from "@theme/Layout"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + Rocket, + Target, + Users2, + Zap, + ChevronRight, + GraduationCap, + Briefcase, + LineChart, + Quote +} from 'lucide-react'; + +export default function Mentoring() { + const { siteConfig } = useDocusaurusContext(); + + const tracks = [ + { + title: "Frontend Excellence", + icon: , + skills: ["React/Next.js", "Tailwind CSS", "Browser Engines", "Performance"], + color: "from-yellow-500/10 to-orange-500/10" + }, + { + title: "Backend Architecture", + icon: , + skills: ["Node.js", "System Design", "Microservices", "Databases"], + color: "from-blue-500/10 to-indigo-500/10" + }, + { + title: "Career Strategy", + icon: , + skills: ["Resume Review", "Mock Interviews", "Salary Negotiation", "Personal Branding"], + color: "from-emerald-500/10 to-teal-500/10" + } + ]; + + return ( + +
+ + {/* --- Hero Section with Animated Gradient --- */} +
+
+ +
+
+ Exclusive Community Mentoring +
+

+ Don’t just learn.
+ Level Up. +

+

+ Bridge the gap between tutorials and the industry. Get matched with + experienced developers who will guide you through real-world projects + and career hurdles. +

+
+ + +
+
+
+ + {/* --- The Mentoring Loop (Process) --- */} +
+
+
+ {[ + { title: "Personalized Roadmap", desc: "No generic paths. We analyze your current skills and build a custom growth plan.", icon: }, + { title: "Weekly Sync-ups", desc: "One-on-one sessions to review code, unblock technical issues, and plan your next move.", icon: }, + { title: "Career Acceleration", desc: "Insider tips on high-growth companies and direct referrals for top-performing mentees.", icon: }, + ].map((item, i) => ( +
+
{item.icon}
+

{item.title}

+

{item.desc}

+
+ ))} +
+
+
+ + {/* --- Mentorship Tracks --- */} +
+
+

Choose Your Track

+

Specialized guidance for modern engineering roles.

+
+ +
+ {tracks.map((track, i) => ( +
+
+ {track.icon} +
+

{track.title}

+
    + {track.skills.map((skill, si) => ( +
  • +
    {skill} +
  • + ))} +
+
+ ))} +
+
+ + {/* --- Industry Testimonial --- */} +
+
+ +

+ "The mentorship program at CodeHarborHub didn't just teach me how to code—it taught me how to think like a Senior Engineer. I landed my dream role at a Fortune 500 company within 3 months." +

+
+
+
+
Sarah Jenkins
+
Software Engineer @ Microsoft
+
+
+
+
+ + {/* --- FAQ / CTA Final --- */} +
+

Ready to level up?

+

Applications are currently open for the Spring 2026 cohort.

+
+ + +
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/playground.tsx b/src/pages/playground.tsx new file mode 100644 index 000000000..0c5aa48bb --- /dev/null +++ b/src/pages/playground.tsx @@ -0,0 +1,147 @@ +import React, { useState } from "react"; +import Layout from "@theme/Layout"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { Sandpack } from "@codesandbox/sandpack-react"; +import { + Code2, + Sparkles, + Monitor, + Cpu, + Share2, + Wand2, + Layers +} from "lucide-react"; + +export default function Playground() { + const { siteConfig } = useDocusaurusContext(); + const [template, setTemplate] = useState<"react" | "vanilla" | "vue">("react"); + + const templates = { + react: { + title: "React.js", + icon: , + color: "text-cyan-500", + }, + vue: { + title: "Vue.js", + icon: , + color: "text-emerald-500", + }, + vanilla: { + title: "Vanilla JS", + icon: , + color: "text-yellow-500", + } + }; + + return ( + +
+ + {/* --- Header Section --- */} +
+
+
+
+ Live Environment +
+

+ Interactive Playground +

+

+ Experiment with modern web technologies in a secure, high-performance sandbox. + Zero setup required. +

+
+ + {/* Template Selector */} +
+ {(Object.keys(templates) as Array).map((t) => ( + + ))} +
+
+
+ + {/* --- Editor Section --- */} +
+
+
+ + {/* Fake Window Controls */} +
+
+
+
+
+
+
+
+ Preview Mode: Active +
+ +
+
+ + {/* Sandpack Integration */} +
+ +
+
+ + {/* Feature Bento Grid Below Editor */} +
+
+ +

Live Reload

+

See your changes instantly as you type with HMR (Hot Module Replacement) technology.

+
+
+ +

Shareable Links

+

Export your code snippets to a unique URL to collaborate with the CodeHarborHub community.

+
+
+ +

NPM Support

+

Add any package from NPM to test complex components or libraries right in the browser.

+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/pages/roadmaps.tsx b/src/pages/roadmaps.tsx new file mode 100644 index 000000000..923cf175b --- /dev/null +++ b/src/pages/roadmaps.tsx @@ -0,0 +1,220 @@ +import Layout from "@theme/Layout"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + Map, + ChevronRight, + Layers, + Smartphone, + Terminal, + Globe, + CheckCircle, + Clock, + ArrowUpRight, + Sparkles, +} from "lucide-react"; + +export default function Roadmaps() { + const { siteConfig } = useDocusaurusContext(); + + const roadmapCards = [ + { + title: "Frontend Developer", + level: "Beginner to Pro", + duration: "6 Months", + icon: , + topics: [ + "HTML/CSS", + "JavaScript", + "React", + "State Management", + "Deployment", + ], + color: "blue", + }, + { + title: "Backend Engineer", + level: "Intermediate", + duration: "8 Months", + icon: , + topics: ["Node.js", "SQL & NoSQL", "System Design", "APIs", "Security"], + color: "emerald", + }, + { + title: "Full Stack Master", + level: "Advanced", + duration: "12 Months", + icon: , + topics: ["Next.js", "PostgreSQL", "Docker", "CI/CD", "AWS/Vercel"], + color: "purple", + }, + { + title: "Mobile App Dev", + level: "Beginner", + duration: "5 Months", + icon: , + topics: ["React Native", "Expo", "Mobile UI", "App Store Logic"], + color: "rose", + }, + ]; + + return ( + +
+ {/* --- Hero Header --- */} +
+
+
+
+ Technical Career Paths +
+

+ Your Path to Success in + Tech +

+

+ Tired of tutorial hell? Follow our curated, community-validated + roadmaps to go from your first line of code to a job-ready + engineer. +

+
+
+ + {/* --- Roadmap Grid --- */} +
+
+ {roadmapCards.map((path, i) => ( +
+ {/* Background Accent */} +
+ +
+
+ {path.icon} +
+
+ + {path.duration} + + + {path.level} + +
+
+ +

+ {path.title} +

+ +
+ {path.topics.map((topic, ti) => ( +
+ {" "} + {topic} +
+ ))} +
+ + +
+ ))} +
+
+ + {/* --- Why Roadmaps Matter (Visual Info) --- */} +
+
+
+
+

+ Stop Learning Randomly. +

+
+ {[ + { + title: "Structured Curriculum", + desc: "Every topic is placed in logical order to ensure you have the prerequisites for the next stage.", + }, + { + title: "Industry Validated", + desc: "Our roadmaps are updated for 2026 standards, focusing only on skills that get you hired.", + }, + { + title: "Interactive Tracking", + desc: "Mark your progress as you go and stay motivated with visual completion stats.", + }, + ].map((feature, i) => ( +
+
+ {i + 1} +
+
+

+ {feature.title} +

+

+ {feature.desc} +

+
+
+ ))} +
+
+ +
+
+
+
+
+ + roadmap_visualization.v2 + +
+
+ +

+ Interactive Visualization Component
Loading Stage + 04... +

+
+
+
+
+
+ + {/* --- Call to Action --- */} +
+
+
+ +
+

+ Can't decide where to start? +

+

+ Take our 2-minute "Career Quiz" to find the roadmap that best + matches your goals and personality. +

+ +
+
+
+
+ ); +} diff --git a/src/theme/DocItem/DocContent.js b/src/theme/DocItem/DocContent.js deleted file mode 100644 index 1fa177d21..000000000 --- a/src/theme/DocItem/DocContent.js +++ /dev/null @@ -1,113 +0,0 @@ -import React from "react"; -import Head from "@docusaurus/Head"; -import MDXComponents from "../MDXComponents"; -import { MDXProvider } from "@mdx-js/react"; -import { - useDoc, - useDocsVersion, -} from "@docusaurus/plugin-content-docs/client"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import useBaseUrl from "@docusaurus/useBaseUrl"; -import DocPaginator from "@theme/DocPaginator"; -import DocVersionBanner from "@theme/DocVersionBanner"; -import TOC from "@theme/TOC"; -import clsx from "clsx"; -import styles from "./styles.module.css"; -import DocsInfo from "./DocsInfo"; -import DocsRating from "./DocsRating"; - -export const DocContent = ({ Content, contentRef, readingTimeInWords }) => { - const { siteConfig } = useDocusaurusContext(); - const { - metadata, - frontMatter: { - image: metaImage, - keywords, - hide_title: hideTitle, - hide_table_of_contents: hideTableOfContents, - }, - toc, - } = useDoc(); - - const { url: siteUrl } = siteConfig; - const versionMetadata = useDocsVersion(); - const { - description, - title, - permalink, - editUrl, - lastUpdatedAt, - lastUpdatedBy, - unversionedId, - } = metadata; - - const metaImageUrl = useBaseUrl(metaImage, { - absolute: true, - }); - - return ( - <> - - {description && } - {description && ( - - )} - {keywords && keywords.length && ( - - )} - {metaImage && } - {metaImage && } - {metaImage && ( - - )} - {permalink && } - {permalink && } - - -
-
- {/* */} -
-
- {!hideTitle && ( -
-

{title}

-
- )} - {(editUrl || lastUpdatedAt || lastUpdatedBy) && ( - - )} - -
- -
-
-
- -
- -
-
- -
-
-
- {!hideTableOfContents && toc && ( -
- -
- )} -
- - ); -}; \ No newline at end of file diff --git a/src/theme/DocItem/DocsInfo.js b/src/theme/DocItem/DocsInfo.js deleted file mode 100644 index 028aa56c8..000000000 --- a/src/theme/DocItem/DocsInfo.js +++ /dev/null @@ -1,89 +0,0 @@ -import React from "react"; -import { useLocation } from "react-router-dom"; -import { - FiEdit3, - FiPrinter, - FiAlertCircle, - FiClock, - FiUser, -} from "react-icons/fi"; -import styles from "./styles.module.css"; -import ShareButton from "./ShareButton"; - -function DocsInfo({ docsPluginId, ...props }) { - const location = useLocation(); - const openDocIssueURL = - "https://github.com/codeharborhub/codeharborhub.github.io/issues/new?assignees=&labels=&template=---doc-error-report.md&title=Issue with codeharborhub.github.io" + - `${location.pathname}`; - - return ( -
-
- {/* Left Section – Meta Info */} - {(props.lastUpdatedAt || props.lastUpdatedBy) && ( -
- {props.lastUpdatedAt && ( - - - - - )} - {props.readingTimeInWords && ( - - ⏱ {props.readingTimeInWords} - - )} - {props.lastUpdatedBy && ( - - - {props.lastUpdatedBy} - - )} -
- )} - - {/* Right Section – Actions */} -
- {props.editUrl && ( - - - Edit - - )} - - - - {openDocIssueURL && ( - - - Report - - )} - - -
-
-
- ); -} - -export default DocsInfo; \ No newline at end of file diff --git a/src/theme/DocItem/DocsRating.js b/src/theme/DocItem/DocsRating.js deleted file mode 100644 index 9925068b3..000000000 --- a/src/theme/DocItem/DocsRating.js +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useState } from "react"; -import { useLocation } from "react-router-dom"; -import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment"; -// import { useColorMode } from "@docusaurus/theme-common"; -import { FiThumbsUp, FiThumbsDown } from "react-icons/fi"; -import styles from "./styles.module.css"; - -const DocsRating = ({ label }) => { - if (!ExecutionEnvironment.canUseDOM) return null; - - const location = useLocation(); - // const { colorMode } = useColorMode(); - const DiscordInviteURL = "https://discord.gg/8p9Z6jkVru"; - const openDocIssueURL = - `https://github.com/codeharborhub/codeharborhub.github.io/issues/new?assignees=&labels=&template=---doc-error-report.md&title=Issue with codeharborhub.github.io${location.pathname}`; - const docEnhancementURL = - `https://github.com/codeharborhub/codeharborhub.github.io/issues/new?assignees=&labels=&template=---doc-site-enhancement-request.md&title=Doc enhancement request for codeharborhub.github.io${location.pathname}`; - - const [haveVoted, setHaveVoted] = useState(false); - const [liked, setLiked] = useState(false); - - const giveFeedback = (value) => { - if (window.ga) { - window.ga("send", { - hitType: "event", - eventCategory: "button", - eventAction: "feedback", - eventLabel: label, - eventValue: value, - }); - } - setLiked(value === 1); - setHaveVoted(true); - }; - - return ( -
- {haveVoted ? ( - liked ? ( -
🎉 Thanks for letting us know!
- ) : ( -
-

Thanks for your feedback! Need help or have suggestions?

-

- • Ask a question on our{" "} - - Discord Channel - -
- • Report a problem
- • Suggest an improvement -

-
- ) - ) : ( -
-

Was this topic helpful?

-
- - -
-
- )} -
- ); -}; - -export default DocsRating; diff --git a/src/theme/DocItem/Layout.js b/src/theme/DocItem/Layout.js deleted file mode 100644 index d20a731d0..000000000 --- a/src/theme/DocItem/Layout.js +++ /dev/null @@ -1,61 +0,0 @@ -//Swizzled this component to fix TOC sidebar not showing on small screens - -import React from 'react'; -import clsx from 'clsx'; -import {useWindowSize} from '@docusaurus/theme-common'; -import {useDoc} from '@docusaurus/plugin-content-docs/client'; -import DocItemPaginator from '@theme/DocItem/Paginator'; -import DocVersionBanner from '@theme/DocVersionBanner'; -import DocVersionBadge from '@theme/DocVersionBadge'; -import DocItemFooter from '@theme/DocItem/Footer'; -import DocItemTOCMobile from '@theme/DocItem/TOC/Mobile'; -import DocItemTOCDesktop from '@theme/DocItem/TOC/Desktop'; -import DocItemContent from '@theme/DocItem/Content'; -import DocBreadcrumbs from '@theme/DocBreadcrumbs'; -import Unlisted from '@theme/Unlisted'; -import styles from './styles.module.css'; - -/** - * Decide if the toc should be rendered, on mobile or desktop viewports - */ -function useDocTOC() { - const {frontMatter, toc} = useDoc(); - const windowSize = useWindowSize({ desktopBreakpoint: 1150 }); - const hidden = frontMatter.hide_table_of_contents; - const canRender = !hidden && toc.length > 0; - const mobile = canRender ? : undefined; - const desktop = - canRender && (windowSize === 'desktop' || windowSize === 'ssr') ? ( - - ) : undefined; - return { - hidden, - mobile, - desktop, - }; -} -export default function DocItemLayout({children}) { - const docTOC = useDocTOC(); - const { - metadata: {unlisted}, - } = useDoc(); - return ( -
-
- {unlisted && } - -
-
- - - {docTOC.mobile} - {children} - -
- -
-
- {docTOC.desktop &&
{docTOC.desktop}
} -
- ); -} \ No newline at end of file diff --git a/src/theme/DocItem/ShareButton.js b/src/theme/DocItem/ShareButton.js deleted file mode 100644 index d5882a1cb..000000000 --- a/src/theme/DocItem/ShareButton.js +++ /dev/null @@ -1,75 +0,0 @@ -import React from "react"; -import { useLocation } from "react-router-dom"; -import { useColorMode } from "@docusaurus/theme-common"; -import { - FiShare2, - FiTwitter, - FiLinkedin, - FiFacebook, - FiMail, -} from "react-icons/fi"; -import styles from "./shareButton.module.css"; - -function ShareButton({ title }) { - const location = useLocation(); - const { colorMode } = useColorMode(); - const baseUrl = "https://codeharborhub.github.io"; - const fullUrl = baseUrl + location.pathname; - - const shareLinks = [ - { - name: "Twitter", - url: `https://twitter.com/share?url=${fullUrl}&text=Check out this article on ${title}&hashtags=codeharborhub,opensource`, - icon: , - color: "#1DA1F2", - }, - { - name: "LinkedIn", - url: `https://www.linkedin.com/shareArticle?mini=true&url=${fullUrl}&source=CodeHarborHub`, - icon: , - color: "#0A66C2", - }, - { - name: "Facebook", - url: `https://www.facebook.com/sharer/sharer.php?u=${fullUrl}`, - icon: , - color: "#1877F2", - }, - { - name: "Email", - url: `mailto:?subject=Shared Article | ${title} | CodeHarborHub Docs&body=Check out this article on ${title}: ${fullUrl}`, - icon: , - color: "#D44638", - }, - ]; - - return ( -
- - - -
- ); -} - -export default ShareButton; \ No newline at end of file diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js deleted file mode 100644 index 7cfe71d63..000000000 --- a/src/theme/DocItem/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import React, { useEffect, useRef, useState } from "react"; -import readingTime from "reading-time/lib/reading-time"; -import { DocProvider } from "@docusaurus/plugin-content-docs/client"; - -//Components -import { DocContent } from "./DocContent"; - -function DocItem(props) { - const contentRef = useRef(); - const [readingTimeInWords, setReadingTimeInWords] = useState(""); - - useEffect(() => { - if (contentRef.current) { - const readTime = readingTime(contentRef.current.innerText); - setReadingTimeInWords(readTime.text); - } - }, [contentRef]); - return ( - - - - ); -} - -export default DocItem; \ No newline at end of file diff --git a/src/theme/DocItem/shareButton.module.css b/src/theme/DocItem/shareButton.module.css deleted file mode 100644 index 013b5cf47..000000000 --- a/src/theme/DocItem/shareButton.module.css +++ /dev/null @@ -1,67 +0,0 @@ -.dropdown { - position: relative; - display: inline-block; -} - -.trigger { - display: flex; - align-items: center; - gap: 0.4rem; - padding: 0.4rem 0.7rem; - border: 1px solid var(--ifm-color-emphasis-200); - border-radius: 6px; - background: var(--ifm-background-surface-color); - cursor: pointer; - color: var(--ifm-font-color-base); - transition: background 0.2s; - font-size: 0.9rem; -} - -.trigger:hover { - background: var(--ifm-color-emphasis-100); -} - -.shareIcon { - font-size: 1rem; -} - -.menu { - display: none; - position: absolute; - top: 100%; - right: 0; - margin-top: 0.4rem; - padding: 0.4rem 0; - background: var(--ifm-background-surface-color); - border: 1px solid var(--ifm-color-emphasis-200); - border-radius: 6px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - min-width: 160px; - z-index: 20; - list-style: none; -} - -.dropdown:hover .menu { - display: block; -} - -.menuItem { - display: flex; - align-items: center; - gap: 0.6rem; - padding: 0.6rem 0.8rem; - color: var(--ifm-font-color-base); - text-decoration: none; - transition: background 0.2s, color 0.2s; - font-size: 0.9rem; -} - -.menuItem:hover { - background: var(--ifm-color-emphasis-100); - color: var(--hover-color); - text-decoration: none; -} - -.icon { - font-size: 1rem; -} diff --git a/src/theme/DocItem/styles.module.css b/src/theme/DocItem/styles.module.css deleted file mode 100644 index 2864ff056..000000000 --- a/src/theme/DocItem/styles.module.css +++ /dev/null @@ -1,131 +0,0 @@ -.docTitle { - font-size: 3rem; - margin-bottom: -calc(var(--ifm-leading-desktop) * var(--ifm-leading)); - /* text-align: justify; */ -} - -.docsInfoWrapper { - width: 100%; - display: flex; - justify-content: center; -} - -.docsInfoContainer { - width: 100%; - padding: 1rem 0.2rem; - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - border-radius: 8px; -} - -.metaInfo { - display: flex; - flex-wrap: wrap; - gap: 0.75rem; - color: var(--ifm-color-content-secondary); - font-size: 0.9rem; -} - -.metaItem { - display: flex; - align-items: center; - gap: 0.4rem; -} - -.actions { - display: flex; - align-items: center; - gap: 0.8rem; - margin-top: 0.6rem; -} - -.actionBtn { - display: inline-flex; - align-items: center; - gap: 0.35rem; - padding: 0.4rem 0.75rem; - border: 1px solid var(--ifm-color-emphasis-200); - border-radius: 6px; - background: var(--ifm-background-surface-color); - font-size: 0.85rem; - color: var(--ifm-font-color-base); - text-decoration: none; - cursor: pointer; - transition: all 0.2s ease; -} - -.actionBtn:hover { - background: var(--ifm-color-primary); - color: #fff; - border-color: var(--ifm-color-primary); -} - -.icon { - font-size: 1rem; - vertical-align: middle; -} - -.docsRating { - /* max-width: 600px; */ - text-align: center; - font-family: var(--ifm-font-family-base); -} - -.heading { - font-size: 1.2rem; - margin-bottom: 1rem; -} - -.buttonGroup { - display: flex; - justify-content: center; - gap: 1rem; - flex-wrap: wrap; -} - -.voteBtn { - display: flex; - align-items: center; - gap: 0.5rem; - background: var(--ifm-background-surface-color); - border: 1px solid var(--ifm-color-emphasis-200); - color: var(--ifm-font-color-base); - padding: 0.6rem 1.2rem; - border-radius: 6px; - cursor: pointer; - transition: background 0.2s, color 0.2s, border 0.2s; - font-size: 0.95rem; -} - -.voteBtn:hover { - background: var(--ifm-color-emphasis-100); - border-color: var(--ifm-color-primary); - color: var(--ifm-color-primary); -} - -.icon { - font-size: 1.1rem; -} - -.thankYou { - font-size: 1.1rem; - color: var(--ifm-color-success); - font-weight: 500; -} - -.feedbackLinks { - text-align: left; - margin-top: 0.5rem; - line-height: 1.6; -} - -.feedbackLinks a { - color: var(--ifm-color-primary); - text-decoration: none; -} - -.feedbackLinks a:hover { - text-decoration: underline; -}