From 6c5d93a4aff30f679322414defc9b5333b043b3b Mon Sep 17 00:00:00 2001 From: Rahul Vyas Date: Sun, 31 May 2026 18:31:44 +0530 Subject: [PATCH 1/3] Improved Home page in reusable compo and configured Type-Script --- package-lock.json | 470 +++++++++++++++++- package.json | 19 +- src/App.jsx | 36 +- .../assets/logos}/org-explorer-logo.svg | 0 src/components/Home/HeroSection.jsx | 71 +++ src/components/Home/OrgExplorerFeatures.jsx | 229 +++++++++ src/components/Home/OrgSearchBox.jsx | 92 ++++ src/components/Home/QuickAccess.jsx | 28 ++ src/components/Home/RecentSearches.jsx | 38 ++ src/components/Home/SearchSuggestions.jsx | 64 +++ src/components/Home/StatsSection.jsx | 53 ++ src/components/layout/Footer.tsx | 160 ++++++ src/components/layout/Layout.tsx | 22 + src/components/layout/Navbar.tsx | 138 +++++ src/components/ui/Button.tsx | 110 ++++ src/hooks/useDebounce.ts | 17 + src/lib/utils.ts | 6 + src/main.jsx | 20 +- src/pages/HomePage.jsx | 281 ++++++----- src/styles/global.css | 26 +- tsconfig.app.json | 33 ++ tsconfig.json | 7 + tsconfig.node.json | 26 + vite.config.ts | 15 + 24 files changed, 1778 insertions(+), 183 deletions(-) rename {public => src/assets/logos}/org-explorer-logo.svg (100%) create mode 100644 src/components/Home/HeroSection.jsx create mode 100644 src/components/Home/OrgExplorerFeatures.jsx create mode 100644 src/components/Home/OrgSearchBox.jsx create mode 100644 src/components/Home/QuickAccess.jsx create mode 100644 src/components/Home/RecentSearches.jsx create mode 100644 src/components/Home/SearchSuggestions.jsx create mode 100644 src/components/Home/StatsSection.jsx create mode 100644 src/components/layout/Footer.tsx create mode 100644 src/components/layout/Layout.tsx create mode 100644 src/components/layout/Navbar.tsx create mode 100644 src/components/ui/Button.tsx create mode 100644 src/hooks/useDebounce.ts create mode 100644 src/lib/utils.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/package-lock.json b/package-lock.json index abd5913..a7bb549 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,34 @@ { "name": "orgexplorer", - "version": "2.0.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "orgexplorer", - "version": "2.0.0", + "version": "1.0.0", "dependencies": { + "@radix-ui/react-slot": "^1.2.4", "@tailwindcss/vite": "^4.3.0", + "@tanstack/react-query": "^5.100.14", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "d3": "^7.9.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", "react-router-dom": "^6.26.2", "recharts": "^2.12.7", + "tailwind-merge": "^3.6.0", "tailwindcss": "^4.3.0" }, "devDependencies": { + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^4.3.1", + "prettier": "^3.8.3", + "typescript": "^6.0.3", "vite": "^5.4.6" } }, @@ -726,6 +736,39 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.23.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", @@ -1324,6 +1367,32 @@ "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, + "node_modules/@tanstack/query-core": { + "version": "5.100.14", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.14.tgz", + "integrity": "sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.100.14", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.14.tgz", + "integrity": "sha512-oOr6aRdSFEwWhzxEkD/9ZcItM3+LjBSkeVmadWKwUssAHTsqd/7bOjWrX4AbvEkoEhgAxzN0Xk6H/aYzXiYBAw==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.100.14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1438,6 +1507,36 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -1527,6 +1626,18 @@ ], "license": "CC-BY-4.0" }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2001,6 +2112,15 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -2019,9 +2139,9 @@ "license": "ISC" }, "node_modules/enhanced-resolve": { - "version": "5.22.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz", - "integrity": "sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==", + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", + "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -2124,6 +2244,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -2154,6 +2280,15 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2435,10 +2570,259 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/loose-envify": { @@ -2472,6 +2856,15 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2480,9 +2873,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -2520,9 +2913,9 @@ "license": "ISC" }, "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -2539,7 +2932,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -2547,6 +2940,22 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -2799,6 +3208,16 @@ "node": ">=0.10.0" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", @@ -2824,6 +3243,27 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", diff --git a/package.json b/package.json index 62bb264..b9bfe53 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,38 @@ { "name": "orgexplorer", - "version": "2.0.0", + "version": "1.0.0", "private": true, "type": "module", "scripts": { "dev": "vite", - "build": "vite build", - "preview": "vite preview" + "build": "tsc -b && vite build", + "preview": "vite preview", + "format": "prettier . --write", + "format:check": "prettier . --check" }, "dependencies": { + "@radix-ui/react-slot": "^1.2.4", "@tailwindcss/vite": "^4.3.0", + "@tanstack/react-query": "^5.100.14", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "d3": "^7.9.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", + "react-icons": "^5.3.0", "react-router-dom": "^6.26.2", "recharts": "^2.12.7", + "tailwind-merge": "^3.6.0", "tailwindcss": "^4.3.0" }, "devDependencies": { + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^4.3.1", + "prettier": "^3.8.3", + "typescript": "^6.0.3", "vite": "^5.4.6" } } diff --git a/src/App.jsx b/src/App.jsx index fd61e4f..77a2a04 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,28 +1,16 @@ -import React from 'react' -import { Routes, Route, Navigate } from 'react-router-dom' -import { AppProvider } from './context/AppContext' -import Navbar from './components/Navbar' -import RateLimitBanner from './components/RateLimitBanner' -import HomePage from './pages/HomePage' -import OverviewPage from './pages/OverviewPage' -import RepositoriesPage from './pages/RepositoriesPage' -import ContributorsPage from './pages/ContributorsPage' -import NetworkPage from './pages/NetworkPage' -import AnalyticsPage from './pages/AnalyticsPage' -import GovernancePage from './pages/GovernancePage' -import SettingsPage from './pages/SettingsPage' -import Footer from './components/layout/Footer' +import React from "react"; +import { Routes, Route, Navigate } from "react-router-dom"; +import { AppProvider } from "./context/AppContext"; +import HomePage from "./pages/HomePage"; +import OverviewPage from "./pages/OverviewPage"; +import RepositoriesPage from "./pages/RepositoriesPage"; +import ContributorsPage from "./pages/ContributorsPage"; +import NetworkPage from "./pages/NetworkPage"; +import AnalyticsPage from "./pages/AnalyticsPage"; +import GovernancePage from "./pages/GovernancePage"; +import SettingsPage from "./pages/SettingsPage"; +import Layout from "./components/layout/Layout"; -function Layout({ children }) { - return ( -
- - -
{children}
-
-
- ) -} export default function App() { return ( diff --git a/public/org-explorer-logo.svg b/src/assets/logos/org-explorer-logo.svg similarity index 100% rename from public/org-explorer-logo.svg rename to src/assets/logos/org-explorer-logo.svg diff --git a/src/components/Home/HeroSection.jsx b/src/components/Home/HeroSection.jsx new file mode 100644 index 0000000..ad5bfa6 --- /dev/null +++ b/src/components/Home/HeroSection.jsx @@ -0,0 +1,71 @@ +import OrgSearchBox from "./OrgSearchBox"; +import RecentSearches from "./RecentSearches"; +import QuickAccess from "./QuickAccess"; + +import { Spinner } from "@/components/UI"; + +export default function HeroSection(props) { + const { + loading, + loadMsg, + error, + recent, + go, + quickExploreItems, + handleSelectOrg, + } = props; + + return ( +
+
+ +
+

+ Architect Your + Insights +

+ +

+ Unified analytics across one or many GitHub organizations. +

+ + + +

+ Type an org name and press Enter or comma to add. +

+ + {error && ( +

+ {error} +

+ )} + + {loading && ( +
+ +

{loadMsg}

+
+ )} + + {recent.length > 0 && !loading && ( + + )} + + {!loading && ( + + )} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/Home/OrgExplorerFeatures.jsx b/src/components/Home/OrgExplorerFeatures.jsx new file mode 100644 index 0000000..f1fc34d --- /dev/null +++ b/src/components/Home/OrgExplorerFeatures.jsx @@ -0,0 +1,229 @@ + +export default function OrgExplorerFeatures() { + const features = [ + { + title: "Interactive Org Visualization", + desc: "Explore repositories, teams, and contributors through a dynamic relationship graph designed for instant understanding.", + bullets: [ + "Live node graph", + "Repository mapping", + "Contributor insights", + ], + visual: ( +
+
+ +
+ + {[...Array(8)].map((_, i) => ( +
+ ))} + + + + + + + + +
+ 142 repositories mapped +
+
+ ), + }, + { + title: "Zero Backend Delay", + desc: "Everything runs instantly with direct GitHub API interactions and optimized client-side rendering.", + bullets: [ + "Instant updates", + "No server bottleneck", + "Fast local rendering", + ], + visual: ( +
+
+ +
+
+ GitHub Data Sync + 0.2s +
+ +
+
+
+ +
+ {["Repos", "Teams", "Contributors"].map((item) => ( +
+ {item} +
+ ))} +
+
+
+ ), + }, + { + title: "Secure PAT Authentication", + desc: "Your Personal Access Tokens stay encrypted and stored locally for maximum privacy and security.", + bullets: [ + "Local-only storage", + "Encrypted handling", + "Privacy-first architecture", + ], + visual: ( +
+
+ +
+
+
+ +
+
🔒
+

+ Secure Local Authentication +

+
+
+
+
+ ), + }, + { + title: "Auto Save & Auto Refresh", + desc: "Your workspace updates automatically while preserving every interaction in real time.", + bullets: [ + "Background syncing", + "Real-time refresh", + "Persistent workspace state", + ], + visual: ( +
+
+ +
+
+ ↻ +
+ +
+
+ ✓ Workspace Auto-Saved +
+ +
+ ✓ GitHub Data Refreshed +
+
+
+
+ ), + }, + { + title: "One-Click Exporting", + desc: "Export organization graphs and analytics instantly in multiple formats for sharing and documentation.", + bullets: ["PNG & SVG export", "JSON snapshots", "Instant downloads"], + visual: ( +
+
+ +
+
+
+ Export Workspace +
+ +
+ {["PNG", "SVG", "JSON"].map((item) => ( +
+ .{item.toLowerCase()} + +
+ ))} +
+
+
+
+ ), + }, + ]; + + return ( +
+
+
+

+ Core Features +

+ +

+ Built for exploring GitHub organizations visually. +

+ +

+ A premium developer experience focused on performance, privacy, + automation, and visual clarity. +

+
+ +
+ {features.map((feature, index) => ( +
+
+
+
+ 0{index + 1} +
+ +

+ {feature.title} +

+ +

+ {feature.desc} +

+ +
+ {feature.bullets.map((bullet) => ( +
+
+ {bullet} +
+ ))} +
+
+ +
{feature.visual}
+
+
+ ))} +
+
+
+ ); +} diff --git a/src/components/Home/OrgSearchBox.jsx b/src/components/Home/OrgSearchBox.jsx new file mode 100644 index 0000000..e3e6ada --- /dev/null +++ b/src/components/Home/OrgSearchBox.jsx @@ -0,0 +1,92 @@ +import { FiSearch, FiX } from "react-icons/fi"; +import { BsArrowRight } from "react-icons/bs"; + +import { Button } from "@/components/ui/Button"; + +import SearchSuggestions from "./SearchSuggestions"; + +export default function OrgSearchBox({ + input, + setInput, + chips, + addChip, + removeChip, + handleKey, + handleSubmit, + showSuggestions, + setShowSuggestions, + setSelectedIndex, + filteredSuggestions, + selectedIndex, + isLoading, + handleSelectOrg, +}) { + return ( +
+
+
+ + {chips.map((c) => ( + + {c} + + removeChip(c)} + /> + + ))} + + setShowSuggestions(true)} + onBlur={() => { + setTimeout(() => { + setShowSuggestions(false); + }, 200); + + input.trim() && addChip(input); + }} + onChange={(e) => { + setInput(e.target.value); + setSelectedIndex(-1); + }} + onKeyDown={handleKey} + className="w-full bg-transparent text-sm text-white placeholder:text-zinc-500 focus:outline-none md:text-base" + /> +
+ + +
+ + +
+ ); +} diff --git a/src/components/Home/QuickAccess.jsx b/src/components/Home/QuickAccess.jsx new file mode 100644 index 0000000..43a9b45 --- /dev/null +++ b/src/components/Home/QuickAccess.jsx @@ -0,0 +1,28 @@ +import { BsArrowRight } from "react-icons/bs"; + +export default function QuickAccess({ items, handleSelectOrg }) { + return ( +
+

+ Quick Explore Access +

+ +
+ {items.map((item) => ( + + ))} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/Home/RecentSearches.jsx b/src/components/Home/RecentSearches.jsx new file mode 100644 index 0000000..38a17e5 --- /dev/null +++ b/src/components/Home/RecentSearches.jsx @@ -0,0 +1,38 @@ +import { BsArrowRight } from "react-icons/bs"; +import { cn } from "@/lib/utils"; + +export default function RecentSearches({ recent, go }) { + return ( +
+
+
+ + + Recent Searches + + +
+
+ +
+ {recent.map((r) => ( + + ))} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/Home/SearchSuggestions.jsx b/src/components/Home/SearchSuggestions.jsx new file mode 100644 index 0000000..8d0991e --- /dev/null +++ b/src/components/Home/SearchSuggestions.jsx @@ -0,0 +1,64 @@ +import { BsArrowRight } from "react-icons/bs"; +import { cn } from "@/lib/utils"; + +export default function SearchSuggestions({ + showSuggestions, + input, + isLoading, + filteredSuggestions, + selectedIndex, + handleSelectOrg, + addChip, +}) { + if (!showSuggestions || !input.trim()) return null; + + return ( +
+ {isLoading ? ( +
+ Searching organizations... +
+ ) : filteredSuggestions.length > 0 ? ( + filteredSuggestions.map((org, index) => ( + + )) + ) : ( +
+ No organization found +
+ )} +
+ ); +} diff --git a/src/components/Home/StatsSection.jsx b/src/components/Home/StatsSection.jsx new file mode 100644 index 0000000..e627d90 --- /dev/null +++ b/src/components/Home/StatsSection.jsx @@ -0,0 +1,53 @@ +import React from "react"; + +function StatsSection() { + return ( +
+
+
+ 5,000 + +
+

+ Resource Load +

+ +

+ Girth With PAT +

+
+
+ +
+ 1HR + +
+

+ Data Freshness +

+ +

+ Intelligent Cache +

+
+
+ +
+ ZERO + +
+

+ Engine Efficiency +

+ +

+ Backend Latency +

+
+
+
+
+ ); +} + +export default StatsSection; diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx new file mode 100644 index 0000000..39f7f01 --- /dev/null +++ b/src/components/layout/Footer.tsx @@ -0,0 +1,160 @@ +import { Link } from "react-router-dom"; +import { + FaGithub, + FaLinkedin, + FaDiscord, + FaYoutube, + FaXTwitter, +} from "react-icons/fa6"; +import { HiOutlineMail } from "react-icons/hi"; + +const footerLinks = [ + { + label: "Documentation", + href: "/docs", + }, + { + label: "Terms of Service", + href: "/terms", + }, + { + label: "Privacy Policy", + href: "/privacy", + }, + { + label: "API Status", + href: "/status", + }, +]; + +const socialLinks = [ + { + label: "Email", + href: "mailto:aossie.oss@gmail.com", + icon: HiOutlineMail, + }, + { + label: "GitHub", + href: "https://github.com/AOSSIE-Org", + icon: FaGithub, + }, + { + label: "Discord", + href: "https://discord.com/invite/hjUhu33uAn", + icon: FaDiscord, + }, + { + label: "LinkedIn", + href: "https://www.linkedin.com/company/aossie/", + icon: FaLinkedin, + }, + { + label: "X", + href: "https://x.com/aossie_org", + icon: FaXTwitter, + }, + { + label: "YouTube", + href: "https://www.youtube.com/@AOSSIE-Org", + icon: FaYoutube, + }, +]; + +export default function Footer() { + return ( +
+
+ {/* LEFT SECTION */} +
+ {/* NAVIGATION */} + + + {/* SOCIAL LINKS */} +
+ {socialLinks.map((item) => { + const Icon = item.icon; + + return ( + + + + ); + })} +
+
+ + {/* RIGHT SECTION */} +
+

+ © 2026 OrgExplorer +

+ +

+ Built for open source communities +

+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx new file mode 100644 index 0000000..7e408bf --- /dev/null +++ b/src/components/layout/Layout.tsx @@ -0,0 +1,22 @@ +import type { ReactNode } from "react"; +import Navbar from "./Navbar"; +import RateLimitBanner from "../RateLimitBanner"; +import Footer from "./Footer"; + +interface LayoutProps { + children: ReactNode; +} + +export default function Layout({ children }: LayoutProps) { + return ( +
+ + + + +
{children}
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/Navbar.tsx b/src/components/layout/Navbar.tsx new file mode 100644 index 0000000..56cbcc3 --- /dev/null +++ b/src/components/layout/Navbar.tsx @@ -0,0 +1,138 @@ +import { FiMenu, FiSettings } from "react-icons/fi"; +import { Button } from "@/components/ui/Button"; +import { cn } from "@/lib/utils"; +import { useState } from "react"; +import { Link } from "react-router-dom"; +import OrgExplorerLogo from "@/assets/logos/org-explorer-logo.svg"; + +const navItems = [ + { label: "Overview", href: "/overview" }, + { label: "Repositories", href: "/repositories" }, + { label: "Contributors", href: "/contributors" }, + { label: "Network", href: "/network" }, + { label: "Analytics", href: "/analytics" }, + { label: "Governance", href: "/governance" }, +]; + +export default function Navbar() { + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + + return ( +
+
+ {/* LEFT */} +
+ {/* LOGO */} + + OrgExplorer + +
+ + {/* MIDDLE */} +
+ {/* DESKTOP NAV */} + +
+ + {/* RIGHT */} +
+ {/* SETTINGS */} + + + {/* MOBILE MENU */} + +
+
+ + {/* MOBILE NAVIGATION */} + {mobileMenuOpen && ( + + )} +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx new file mode 100644 index 0000000..f23689b --- /dev/null +++ b/src/components/ui/Button.tsx @@ -0,0 +1,110 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; +import { FiLoader } from "react-icons/fi"; + +const buttonVariants = cva( + [ + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium", + "transition-all duration-200", + "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", + "disabled:pointer-events-none disabled:opacity-50", + "[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + ], + { + variants: { + variant: { + default: + "bg-[#FCD34D] text-black border-2 border-black shadow-[4px_4px_0px_0px_#FCD34D] hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-[2px_2px_0px_0px_#FCD34D] active:translate-x-[4px] active:translate-y-[4px] active:shadow-none transition-all duration-150", + + destructive: + "bg-red-500 text-white border-2 border-black shadow-[4px_4px_0px_0px_#ef4444] hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-[2px_2px_0px_0px_#ef4444] active:translate-x-[4px] active:translate-y-[4px] active:shadow-none transition-all duration-150", + + outline: + "bg-white text-black border-2 border-black shadow-[4px_4px_0px_0px_#ffffff] hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-[2px_2px_0px_0px_#ffffff] active:translate-x-[4px] active:translate-y-[4px] active:shadow-none transition-all duration-150", + + secondary: + "bg-gray-300 text-black border-2 border-black shadow-[4px_4px_0px_0px_#d1d5db] hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-[2px_2px_0px_0px_#d1d5db] active:translate-x-[4px] active:translate-y-[4px] active:shadow-none transition-all duration-150", + + ghost: + "bg-transparent text-white border-2 border-white shadow-[4px_4px_0px_0px_#ffffff] hover:bg-white hover:text-black hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-[2px_2px_0px_0px_#ffffff] active:translate-x-[4px] active:translate-y-[4px] active:shadow-none transition-all duration-150", + + link: "text-blue-500 underline underline-offset-4 font-bold hover:text-blue-400 transition-colors duration-150", + }, + + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + + fullWidth: { + true: "w-full", + }, + + loading: { + true: "cursor-not-allowed", + }, + }, + + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export interface ButtonProps + extends + React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; + loading?: boolean; +} + +const Button = React.forwardRef( + ( + { + className, + variant, + size, + fullWidth, + loading, + asChild = false, + disabled, + children, + ...props + }, + ref + ) => { + const Comp = asChild ? Slot : "button"; + + return ( + + {loading && } + + {children} + + ); + } +); + +Button.displayName = "Button"; + +export { Button }; \ No newline at end of file diff --git a/src/hooks/useDebounce.ts b/src/hooks/useDebounce.ts new file mode 100644 index 0000000..59098a9 --- /dev/null +++ b/src/hooks/useDebounce.ts @@ -0,0 +1,17 @@ +import { useEffect, useState } from "react"; + +export function useDebounce(value: T, delay = 1000) { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timer = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(timer); + }; + }, [value, delay]); + + return debouncedValue; +} \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..daab5de --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} \ No newline at end of file diff --git a/src/main.jsx b/src/main.jsx index ed8e23f..026281e 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,13 +1,17 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import { BrowserRouter } from 'react-router-dom' -import App from './App' -import './styles/global.css' +import React from "react"; +import ReactDOM from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; +import App from "./App"; +import "./styles/global.css"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -ReactDOM.createRoot(document.getElementById('root')).render( +const queryClient = new QueryClient(); +ReactDOM.createRoot(document.getElementById("root")).render( - - + + + + ) diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index efcdc1a..5a8a517 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -1,142 +1,167 @@ -import React, { useState } from 'react' -import { useNavigate } from 'react-router-dom' -import { FiSearch, FiX } from 'react-icons/fi' -import { useApp } from '../context/AppContext' -import { C, Spinner } from '../components/UI' +import React, { useMemo, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { useQuery } from "@tanstack/react-query"; -const QUICK = ['AOSSIE-Org', 'DjedAlliance', 'StabilityNexus'] +import { useApp } from "../context/AppContext"; +import { useDebounce } from "@/hooks/useDebounce"; + +import HeroSection from "@/components/home/HeroSection"; +import StatsSection from "@/components/home/StatsSection"; +import OrgExplorerFeatures from "@/components/home/OrgExplorerFeatures"; + +const quickExploreItems = ["AOSSIE-Org", "vercel", "facebook", "microsoft"]; export default function HomePage() { - const { explore, loading, loadMsg, error } = useApp() - const navigate = useNavigate() - const [input, setInput] = useState('') - const [chips, setChips] = useState([]) + const { explore, loading, loadMsg, error } = useApp(); + + const navigate = useNavigate(); + + const [input, setInput] = useState(""); + const [chips, setChips] = useState([]); + const [showSuggestions, setShowSuggestions] = useState(false); + const [selectedIndex, setSelectedIndex] = useState(-1); + + const debouncedQuery = useDebounce(input, 1000); + + const recent = JSON.parse(localStorage.getItem("oe_recent") || "[]"); + + const { data: suggestions = [], isLoading } = useQuery({ + queryKey: ["github-orgs", debouncedQuery], + + queryFn: async () => { + if (!debouncedQuery.trim()) return []; + + const response = await fetch( + `https://api.github.com/search/users?q=${debouncedQuery}+type:org` + ); + + if (!response.ok) { + throw new Error("Failed to fetch organizations"); + } + + const data = await response.json(); + + return data.items; + }, + + enabled: !!debouncedQuery.trim(), + staleTime: 1000 * 60 * 5, + }); + + const filteredSuggestions = useMemo(() => { + return suggestions.filter( + (item) => item.login.toLowerCase() !== input.toLowerCase() + ); + }, [suggestions, input]); + + const addChip = (raw) => { + const parts = raw + .split(/[,+\s]+/) + .map((s) => s.trim()) + .filter(Boolean); + + setChips((prev) => [...new Set([...prev, ...parts])]); + + setInput(""); + }; + + const removeChip = (c) => { + setChips((prev) => prev.filter((x) => x !== c)); + }; + + const go = async (targets) => { + const orgs = + targets || (chips.length ? chips : input.trim() ? [input.trim()] : []); - const recent = JSON.parse(localStorage.getItem('oe_recent') || '[]') + if (!orgs.length) return; - const addChip = raw => { - const parts = raw.split(/[,+\s]+/).map(s => s.trim()).filter(Boolean) - setChips(prev => [...new Set([...prev, ...parts])]) - setInput('') - } + await explore(orgs); - const removeChip = c => setChips(prev => prev.filter(x => x !== c)) + navigate("/overview"); + }; - const handleKey = e => { - if ((e.key === 'Enter' || e.key === ',') && input.trim()) { - e.preventDefault() - addChip(input) + const handleSelectOrg = async (org) => { + const finalValue = Array.isArray(org) ? org : org != null ? [org] : []; + + await go(finalValue); + }; + + const handleKey = (e) => { + if (e.key === "Backspace" && !input && chips.length) { + setChips((prev) => prev.slice(0, -1)); + } + + if (filteredSuggestions.length) { + if (e.key === "ArrowDown") { + e.preventDefault(); + + setSelectedIndex((prev) => + prev < filteredSuggestions.length - 1 ? prev + 1 : prev + ); + } + + if (e.key === "ArrowUp") { + e.preventDefault(); + + setSelectedIndex((prev) => (prev > 0 ? prev - 1 : 0)); + } + + if (e.key === "Enter" && selectedIndex >= 0) { + e.preventDefault(); + + addChip(filteredSuggestions[selectedIndex].login); + + handleSelectOrg(filteredSuggestions[selectedIndex].login); + + return; + } } - if (e.key === 'Backspace' && !input && chips.length) { - setChips(prev => prev.slice(0, -1)) + + if ((e.key === "Enter" || e.key === ",") && input.trim()) { + e.preventDefault(); + + addChip(input); } - } + }; - const go = async (targets) => { - const orgs = targets || (chips.length ? chips : input.trim() ? [input.trim()] : []) - if (!orgs.length) return - await explore(orgs) - navigate('/overview') - } + const handleSubmit = (e) => { + e.preventDefault(); + + go(); + }; return ( -
- {/* Hero */} -
-

- Architect Your{' '} - Insights -

-

- Unified analytics across one or many GitHub organizations. Multi-org portfolio analysis, contributor network graphs, time-series trends, and governance audits — entirely in the browser. -

-
- - {/* Search */} -
-
- - {chips.map(c => ( - - {c} - removeChip(c)} /> - - ))} - setInput(e.target.value)} - onKeyDown={handleKey} - onBlur={() => input.trim() && addChip(input)} - placeholder={chips.length ? 'Add another org...' : 'AOSSIE-Org, StabilityNexus, DjedAlliance...'} - style={{ flex: 1, minWidth: 160, background: 'none', color: 'var(--text)', fontSize: 14, padding: '4px 8px', border: 'none', outline: 'none' }} - /> - -
-

- Type an org name and press Enter or comma to add. Add multiple orgs to analyze as a unified portfolio. -

- {error &&

{error}

} -
- - {/* Loading */} - {loading && ( -
- -

{loadMsg}

-
- )} - - {/* Recent */} - {recent.length > 0 && !loading && ( -
- Recent searches -
- {recent.map(r => ( - - ))} -
-
- )} - - {/* Quick explore */} - {!loading && ( -
- Quick explore -
- {QUICK.map(q => ( - - ))} -
+
+ + + + +
+
+
- )} - - {/* Stats bar */} -
- {[['5,000', 'req/hr with PAT', 'var(--green)'], ['1HR', 'intelligent cache', 'var(--green)'], ['ZERO', 'backend latency', 'var(--accent)']].map(([v, l, color]) => ( -
-
{v}
-
{l}
-
- ))} -
-
- ) + + + ); } diff --git a/src/styles/global.css b/src/styles/global.css index a963361..8e08fb3 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,8 +1,8 @@ @import "tailwindcss"; :root { - --bg: #0d0d0d; - --surface: #141414; + --bg: #000000; + --surface: #141414; --surface2: #1a1a1a; --border: #2a2a2a; --accent: #f5c518; @@ -30,10 +30,26 @@ button { cursor: pointer; font-family: inherit; } input, select { font-family: inherit; } a { color: var(--accent); text-decoration: none; } -::-webkit-scrollbar { width: 5px; height: 5px; } -::-webkit-scrollbar-track { background: var(--bg); } -::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; } +::-webkit-scrollbar { + width: 5px; + height: 5px; +} +::-webkit-scrollbar-track { + background: var(--bg); +} +::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: 3px; +} +::selection { + background: rgba(252, 211, 77, 0.9); + color: #000000; +} +::-moz-selection { + background: rgba(252, 211, 77, 0.9); + color: #000000; +} @keyframes spin { to { transform: rotate(360deg); } } diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..be50349 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + "paths": { + "@/*": ["./src/*"] + }, + "checkJs": false, + "allowJs": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src/**/*"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c452f43 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..6c49e9a --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..d8266bb --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; +import path from "path"; + +export default defineConfig(({ mode }) => ({ + plugins: [react(), tailwindcss()], + + base: mode === "production" ? "/OrgExplorer/" : "/", + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +})); From 87330ac135db9c4c7cd73e69fd9f8827e37f5dd5 Mon Sep 17 00:00:00 2001 From: Rahul Vyas Date: Wed, 3 Jun 2026 00:28:40 +0530 Subject: [PATCH 2/3] feat: update placeholder text in OrgSearchBox for better user guidance --- src/components/Home/OrgSearchBox.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Home/OrgSearchBox.jsx b/src/components/Home/OrgSearchBox.jsx index e3e6ada..0d520ee 100644 --- a/src/components/Home/OrgSearchBox.jsx +++ b/src/components/Home/OrgSearchBox.jsx @@ -51,7 +51,7 @@ export default function OrgSearchBox({ value={input} autoComplete="off" aria-label="Search GitHub organization" - placeholder="Enter GitHub Organization Name..." + placeholder="AOSSIE-Org, StabilityNexus, DjedAlliance.." onFocus={() => setShowSuggestions(true)} onBlur={() => { setTimeout(() => { From 4b720984e859f9b445d84c5bd8e60d3682134525 Mon Sep 17 00:00:00 2001 From: Rahul Vyas Date: Sat, 6 Jun 2026 15:32:42 +0530 Subject: [PATCH 3/3] merge conflict resolved --- package-lock.json | 306 ++----------------------------- package.json | 1 - src/components/layout/Footer.jsx | 147 --------------- vite.config.js | 9 - 4 files changed, 12 insertions(+), 451 deletions(-) delete mode 100644 src/components/layout/Footer.jsx delete mode 100644 vite.config.js diff --git a/package-lock.json b/package-lock.json index a7bb549..e181d2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -770,9 +770,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", - "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -2112,15 +2112,6 @@ "node": ">=8" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -2244,12 +2235,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -2280,15 +2265,6 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2570,255 +2546,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", @@ -2856,15 +2583,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3024,12 +2742,12 @@ } }, "node_modules/react-router": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", - "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.2" + "@remix-run/router": "1.23.3" }, "engines": { "node": ">=14.0.0" @@ -3039,13 +2757,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", - "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.2", - "react-router": "6.30.3" + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index b9bfe53..3e14d9f 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", - "react-icons": "^5.3.0", "react-router-dom": "^6.26.2", "recharts": "^2.12.7", "tailwind-merge": "^3.6.0", diff --git a/src/components/layout/Footer.jsx b/src/components/layout/Footer.jsx deleted file mode 100644 index 6e6f620..0000000 --- a/src/components/layout/Footer.jsx +++ /dev/null @@ -1,147 +0,0 @@ -import { Link } from "react-router-dom"; -import { - FaGithub, - FaLinkedin, - FaDiscord, - FaYoutube, - FaXTwitter, -} from "react-icons/fa6"; -import { HiOutlineMail } from "react-icons/hi"; - -const footerLinks = [ - { - label: "Documentation", - href: "/docs", - }, - { - label: "Terms of Service", - href: "/terms", - }, - { - label: "Privacy Policy", - href: "/privacy", - }, - { - label: "API Status", - href: "/status", - }, -]; - -const socialLinks = [ - { - label: "Email", - href: "mailto:aossie.oss@gmail.com", - icon: HiOutlineMail, - }, - { - label: "GitHub", - href: "https://github.com/AOSSIE-Org", - icon: FaGithub, - }, - { - label: "Discord", - href: "https://discord.com/invite/hjUhu33uAn", - icon: FaDiscord, - }, - { - label: "LinkedIn", - href: "https://www.linkedin.com/company/aossie/", - icon: FaLinkedin, - }, - { - label: "X", - href: "https://x.com/aossie_org", - icon: FaXTwitter, - }, - { - label: "YouTube", - href: "https://www.youtube.com/@AOSSIE-Org", - icon: FaYoutube, - }, -]; - -export default function Footer() { - return ( - - ); -} diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index b0d97de..0000000 --- a/vite.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; -import tailwindcss from "@tailwindcss/vite"; - -export default defineConfig(({ mode }) => ({ - plugins: [react(), tailwindcss()], - - base: mode === "production" ? "/OrgExplorer/" : "/", -}));