-
setShowSidebar(false)}>
-
-
+ {/* Mobile header */}
+
+
+
Opensox
+
setShowSidebar(false)}>
+
+
-
+ {/* Desktop header with collapse */}
+
+ {!isCollapsed && (
+
+ Opensox
+
+ )}
+
+ {isCollapsed ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {/* Find projects entry */}
+
{SIDEBAR_ROUTES.map((route) => {
+ const activeClass = getSidebarLinkClassName(pathname, route.path);
return (
-
-
+
+
);
})}
+ }
+ collapsed={isCollapsed}
+ />
+ icon={}
+ collapsed={isCollapsed}
+ />
+ icon={}
+ collapsed={isCollapsed}
+ />
+ icon={}
+ collapsed={isCollapsed}
+ />
-
+ icon={}
+ collapsed={isCollapsed}
+ />
{
window.open("https://x.com/ajeetunc", "_blank");
}}
- >
+ icon={
+
+
+
+ }
+ collapsed={isCollapsed}
+ />
+
+ {/* Bottom profile */}
+
+
+ );
+}
+
+function ProfileMenu({ isCollapsed }: { isCollapsed: boolean }) {
+ const [open, setOpen] = useState(false);
+ return (
+
+
setOpen((s) => !s)}
+ >
+
+ {!isCollapsed && (
+
+
+ Ajeet
+ hi@opensox.ai
+
+
+
+ )}
+
+ {/* Expandable menu */}
+ {!isCollapsed && open && (
+
+
signOut({ callbackUrl: "/" })}
+ icon={}
+ collapsed={false}
+ />
+
+ )}
);
}
diff --git a/apps/web/src/components/sidebar/SidebarItem.tsx b/apps/web/src/components/sidebar/SidebarItem.tsx
index 656a6e0..5bd2742 100644
--- a/apps/web/src/components/sidebar/SidebarItem.tsx
+++ b/apps/web/src/components/sidebar/SidebarItem.tsx
@@ -1,9 +1,28 @@
"use client"
-export default function SidebarItem({itemName, onclick}: {itemName: string, onclick?: () => void}) {
- return (
-
-
{itemName}
-
- )
+import React from "react";
+
+type SidebarItemProps = {
+ itemName: string;
+ onclick?: () => void;
+ icon?: React.ReactNode;
+ collapsed?: boolean;
+};
+
+export default function SidebarItem({ itemName, onclick, icon, collapsed = false }: SidebarItemProps) {
+ return (
+
+ {icon && {icon}}
+ {!collapsed && (
+
+ {itemName}
+
+ )}
+
+ );
}
\ No newline at end of file
diff --git a/apps/web/src/components/ui/Filter.tsx b/apps/web/src/components/ui/Filter.tsx
index 5c1340b..bd0ab0a 100644
--- a/apps/web/src/components/ui/Filter.tsx
+++ b/apps/web/src/components/ui/Filter.tsx
@@ -30,32 +30,24 @@ export default function Filter({
return (
-
+
- {filterName}
+ {filterName}
-
-
+
+
{filters.map((filter) => (
-
+
{
- recordFilterInput(filter);
- }}
+ onClick={() => recordFilterInput(filter)}
+ className="border-[#1a1a1d] text-ox-purple"
/>
diff --git a/apps/web/src/components/ui/FiltersContainer.tsx b/apps/web/src/components/ui/FiltersContainer.tsx
index 9eb79e3..84c92fe 100644
--- a/apps/web/src/components/ui/FiltersContainer.tsx
+++ b/apps/web/src/components/ui/FiltersContainer.tsx
@@ -57,24 +57,29 @@ export default function FiltersContainer() {
};
return (
-
+
+ {/* Backdrop */}
toggleShowFilters()}
/>
-
-
-
Filters
-
+
+ {/* Filter Panel */}
+
+ {/* Header */}
+
+
Filters
+
toggleShowFilters()}
/>
-
-
+ {/* Filter Content */}
+
-
+ {/* Footer */}
+
diff --git a/apps/web/src/store/useShowSidebar.ts b/apps/web/src/store/useShowSidebar.ts
index 622996a..04a4b0a 100644
--- a/apps/web/src/store/useShowSidebar.ts
+++ b/apps/web/src/store/useShowSidebar.ts
@@ -3,9 +3,14 @@ import { create } from "zustand";
interface showSidebarProps {
showSidebar: boolean;
setShowSidebar: (value: boolean) => void;
+ isCollapsed: boolean;
+ toggleCollapsed: () => void;
}
export const useShowSidebar = create((set) => ({
showSidebar: false,
setShowSidebar: (value) => set({ showSidebar: value }),
+ isCollapsed: false,
+ toggleCollapsed: () =>
+ set((state) => ({ isCollapsed: !state.isCollapsed })),
}));
diff --git a/apps/web/src/utils/converter.ts b/apps/web/src/utils/converter.ts
index dbe8f4f..53a5c79 100644
--- a/apps/web/src/utils/converter.ts
+++ b/apps/web/src/utils/converter.ts
@@ -148,7 +148,7 @@ export const convertApiOutputToUserOutput = (
url: item.url,
avatarUrl: item.owner.avatarUrl,
totalIssueCount: item.issues.totalCount,
- primaryLanguage: item.primaryLanguage.name,
+ primaryLanguage: item.primaryLanguage?.name || "Other",
popularity: filters.Popularity ? filters.Popularity : "-",
stage: filters.Stage ? filters.Stage : "-",
competition: filters.Competition ? filters.Competition : "-",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d890ba4..564aeec 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -76,61 +76,6 @@ importers:
specifier: ^5.9.2
version: 5.9.2
- apps/backend:
- dependencies:
- '@octokit/graphql':
- specifier: ^9.0.1
- version: 9.0.1
- '@prisma/client':
- specifier: ^5.10.2
- version: 5.22.0(prisma@5.22.0)
- cors:
- specifier: ^2.8.5
- version: 2.8.5
- dotenv:
- specifier: ^16.4.5
- version: 16.5.0
- express:
- specifier: ^4.18.3
- version: 4.21.2
- express-rate-limit:
- specifier: ^7.1.5
- version: 7.5.0(express@4.21.2)
- helmet:
- specifier: ^7.1.0
- version: 7.2.0
- jsonwebtoken:
- specifier: ^9.0.2
- version: 9.0.2
- devDependencies:
- '@types/cors':
- specifier: ^2.8.17
- version: 2.8.19
- '@types/express':
- specifier: ^4.17.21
- version: 4.17.23
- '@types/jsonwebtoken':
- specifier: ^9.0.5
- version: 9.0.9
- '@types/node':
- specifier: ^20.11.24
- version: 20.19.0
- depcheck:
- specifier: ^1.4.7
- version: 1.4.7
- nodemon:
- specifier: ^3.1.10
- version: 3.1.10
- prisma:
- specifier: ^5.10.2
- version: 5.22.0
- tsx:
- specifier: ^4.20.3
- version: 4.20.3
- typescript:
- specifier: ^5.3.3
- version: 5.9.2
-
apps/docs:
dependencies:
'@repo/ui':
@@ -221,6 +166,9 @@ importers:
framer-motion:
specifier: ^11.15.0
version: 11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ geist:
+ specifier: ^1.5.1
+ version: 1.5.1(next@15.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
lucide-react:
specifier: ^0.456.0
version: 0.456.0(react@18.3.1)
@@ -2803,6 +2751,11 @@ packages:
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ geist@1.5.1:
+ resolution: {integrity: sha512-mAHZxIsL2o3ZITFaBVFBnwyDOw+zNLYum6A6nIjpzCGIO8QtC3V76XF2RnZTyLx1wlDTmMDy8jg3Ib52MIjGvQ==}
+ peerDependencies:
+ next: '>=13.2.0'
+
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
@@ -2973,9 +2926,6 @@ packages:
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
- ignore-by-default@1.0.1:
- resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
-
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -3564,11 +3514,6 @@ packages:
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
- nodemon@3.1.10:
- resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==}
- engines: {node: '>=10'}
- hasBin: true
-
normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
@@ -3880,9 +3825,6 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- pstree.remy@1.1.8:
- resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
-
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@@ -4136,10 +4078,6 @@ packages:
simple-swizzle@0.2.4:
resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
- simple-update-notifier@2.0.0:
- resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==}
- engines: {node: '>=10'}
-
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
@@ -4376,10 +4314,6 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
- touch@3.1.1:
- resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==}
- hasBin: true
-
ts-api-utils@1.4.3:
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
engines: {node: '>=16'}
@@ -4522,9 +4456,6 @@ packages:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'}
- undefsafe@2.0.5:
- resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
-
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
@@ -4732,7 +4663,7 @@ snapshots:
'@babel/traverse': 7.28.0
'@babel/types': 7.28.2
convert-source-map: 2.0.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -4827,7 +4758,7 @@ snapshots:
'@babel/parser': 7.27.5
'@babel/template': 7.27.2
'@babel/types': 7.27.6
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -4840,7 +4771,7 @@ snapshots:
'@babel/parser': 7.28.0
'@babel/template': 7.27.2
'@babel/types': 7.28.2
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
transitivePeerDependencies:
- supports-color
@@ -4964,7 +4895,7 @@ snapshots:
'@eslint/eslintrc@2.1.4':
dependencies:
ajv: 6.12.6
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
espree: 9.6.1
globals: 13.24.0
ignore: 5.3.2
@@ -4984,7 +4915,7 @@ snapshots:
'@humanwhocodes/config-array@0.13.0':
dependencies:
'@humanwhocodes/object-schema': 2.0.3
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -5685,7 +5616,7 @@ snapshots:
'@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
'@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
graphemer: 1.4.0
ignore: 5.3.2
@@ -5738,7 +5669,7 @@ snapshots:
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
optionalDependencies:
typescript: 5.9.2
@@ -5751,7 +5682,7 @@ snapshots:
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
optionalDependencies:
typescript: 5.9.2
@@ -5764,7 +5695,7 @@ snapshots:
'@typescript-eslint/types': 7.2.0
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 7.2.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
optionalDependencies:
typescript: 5.9.2
@@ -5777,7 +5708,7 @@ snapshots:
'@typescript-eslint/types': 8.34.0
'@typescript-eslint/typescript-estree': 8.34.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.34.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
typescript: 5.9.2
transitivePeerDependencies:
@@ -5787,7 +5718,7 @@ snapshots:
dependencies:
'@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.9.2)
'@typescript-eslint/types': 8.34.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
@@ -5825,7 +5756,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2)
'@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
ts-api-utils: 1.4.3(typescript@5.9.2)
optionalDependencies:
@@ -5837,7 +5768,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2)
'@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2)
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
ts-api-utils: 1.4.3(typescript@5.9.2)
optionalDependencies:
@@ -5849,7 +5780,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 8.34.0(typescript@5.9.2)
'@typescript-eslint/utils': 8.34.0(eslint@8.57.1)(typescript@5.9.2)
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
ts-api-utils: 2.1.0(typescript@5.9.2)
typescript: 5.9.2
@@ -5870,7 +5801,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/visitor-keys': 5.62.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
globby: 11.1.0
is-glob: 4.0.3
semver: 7.7.2
@@ -5884,7 +5815,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@@ -5899,7 +5830,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.5
@@ -5914,7 +5845,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 7.2.0
'@typescript-eslint/visitor-keys': 7.2.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@@ -5931,7 +5862,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.9.2)
'@typescript-eslint/types': 8.34.0
'@typescript-eslint/visitor-keys': 8.34.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -6600,11 +6531,9 @@ snapshots:
dependencies:
ms: 2.1.3
- debug@4.4.1(supports-color@5.5.0):
+ debug@4.4.1:
dependencies:
ms: 2.1.3
- optionalDependencies:
- supports-color: 5.5.0
deep-extend@0.6.0: {}
@@ -6651,7 +6580,7 @@ snapshots:
callsite: 1.0.0
camelcase: 6.3.0
cosmiconfig: 7.1.0
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
deps-regex: 0.2.0
findup-sync: 5.0.0
ignore: 5.3.2
@@ -6897,7 +6826,7 @@ snapshots:
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1)
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
eslint-plugin-react: 7.37.5(eslint@8.57.1)
eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1)
@@ -6916,7 +6845,7 @@ snapshots:
'@typescript-eslint/parser': 8.34.0(eslint@8.57.1)(typescript@5.9.2)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
eslint-plugin-react: 7.37.5(eslint@8.57.1)
@@ -6950,10 +6879,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1):
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.1
+ eslint: 8.57.1
+ get-tsconfig: 4.10.1
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.14
+ unrs-resolver: 1.9.0
+ optionalDependencies:
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
+
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
get-tsconfig: 4.10.1
is-bun-module: 2.0.0
@@ -6961,14 +6905,14 @@ snapshots:
tinyglobby: 0.2.14
unrs-resolver: 1.9.0
optionalDependencies:
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
eslint: 8.57.1
get-tsconfig: 4.10.1
is-bun-module: 2.0.0
@@ -6976,7 +6920,7 @@ snapshots:
tinyglobby: 0.2.14
unrs-resolver: 1.9.0
optionalDependencies:
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
@@ -7001,14 +6945,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.34.0(eslint@8.57.1)(typescript@5.9.2)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
@@ -7047,7 +6991,7 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -7087,7 +7031,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -7243,7 +7187,7 @@ snapshots:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
@@ -7490,6 +7434,10 @@ snapshots:
functions-have-names@1.2.3: {}
+ geist@1.5.1(next@15.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
+ dependencies:
+ next: 15.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
gensync@1.0.0-beta.2: {}
get-caller-file@2.0.5: {}
@@ -7528,7 +7476,7 @@ snapshots:
dependencies:
basic-ftp: 5.0.5
data-uri-to-buffer: 6.0.2
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
transitivePeerDependencies:
- supports-color
@@ -7681,14 +7629,14 @@ snapshots:
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.4
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.4
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
transitivePeerDependencies:
- supports-color
@@ -7700,8 +7648,6 @@ snapshots:
ieee754@1.2.1: {}
- ignore-by-default@1.0.1: {}
-
ignore@5.3.2: {}
ignore@7.0.5: {}
@@ -8287,19 +8233,6 @@ snapshots:
node-releases@2.0.19: {}
- nodemon@3.1.10:
- dependencies:
- chokidar: 3.6.0
- debug: 4.4.1(supports-color@5.5.0)
- ignore-by-default: 1.0.1
- minimatch: 3.1.2
- pstree.remy: 1.1.8
- semver: 7.7.2
- simple-update-notifier: 2.0.0
- supports-color: 5.5.0
- touch: 3.1.1
- undefsafe: 2.0.5
-
normalize-package-data@2.5.0:
dependencies:
hosted-git-info: 2.8.9
@@ -8448,7 +8381,7 @@ snapshots:
dependencies:
'@tootallnate/quickjs-emscripten': 0.23.0
agent-base: 7.1.4
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
get-uri: 6.0.5
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6
@@ -8618,7 +8551,7 @@ snapshots:
proxy-agent@6.5.0:
dependencies:
agent-base: 7.1.4
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6
lru-cache: 7.18.3
@@ -8630,8 +8563,6 @@ snapshots:
proxy-from-env@1.1.0: {}
- pstree.remy@1.1.8: {}
-
punycode@2.3.1: {}
qr.js@0.0.0: {}
@@ -8967,10 +8898,6 @@ snapshots:
is-arrayish: 0.3.4
optional: true
- simple-update-notifier@2.0.0:
- dependencies:
- semver: 7.7.2
-
slash@3.0.0: {}
smart-buffer@4.2.0: {}
@@ -8982,7 +8909,7 @@ snapshots:
socks-proxy-agent@8.0.5:
dependencies:
agent-base: 7.1.4
- debug: 4.4.1(supports-color@5.5.0)
+ debug: 4.4.1
socks: 2.8.6
transitivePeerDependencies:
- supports-color
@@ -9240,8 +9167,6 @@ snapshots:
toidentifier@1.0.1: {}
- touch@3.1.1: {}
-
ts-api-utils@1.4.3(typescript@5.9.2):
dependencies:
typescript: 5.9.2
@@ -9384,8 +9309,6 @@ snapshots:
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
- undefsafe@2.0.5: {}
-
undici-types@6.21.0: {}
undici-types@7.12.0: {}
From 0c3eb08ec11de73e1a300931e3da35fb13305e72 Mon Sep 17 00:00:00 2001
From: Aman Raj <113578582+huamanraj@users.noreply.github.com>
Date: Sat, 1 Nov 2025 18:34:11 +0530
Subject: [PATCH 2/4] fix: proejct header sticky
---
.../dashboard/ProjectsContainer.tsx | 136 +++++++++---------
apps/web/src/components/ui/Filter.tsx | 6 +-
2 files changed, 67 insertions(+), 75 deletions(-)
diff --git a/apps/web/src/components/dashboard/ProjectsContainer.tsx b/apps/web/src/components/dashboard/ProjectsContainer.tsx
index 65003a5..4f017ff 100644
--- a/apps/web/src/components/dashboard/ProjectsContainer.tsx
+++ b/apps/web/src/components/dashboard/ProjectsContainer.tsx
@@ -17,31 +17,9 @@ import { useFilterStore } from "@/store/useFilterStore";
import { usePathname } from "next/navigation";
import { MagnifyingGlassIcon } from "@heroicons/react/24/outline";
-type ProjectsContainerProps = {
- projects: DashboardProjectsProps[];
-};
-
-interface languageColorsTypes {
- [key: string]: string;
- javascript: string;
- typescript: string;
- python: string;
- go: string;
- rust: string;
- java: string;
- "c#": string;
- "c++": string;
- c: string;
- php: string;
- swift: string;
- kotlin: string;
- ruby: string;
- scala: string;
- html: string;
- elixir: string;
-}
+type ProjectsContainerProps = { projects: DashboardProjectsProps[] };
-const languageColors: languageColorsTypes = {
+const languageColors: Record = {
javascript: "bg-yellow-500/15 text-yellow-500",
typescript: "bg-blue-500/15 text-blue-500",
python: "bg-emerald-500/15 text-emerald-500",
@@ -60,11 +38,8 @@ const languageColors: languageColorsTypes = {
elixir: "bg-purple-600/15 text-purple-600",
};
-const getColor = (color: string): string => {
- const lowerColorCase = color.toLowerCase();
- const _color = languageColors[lowerColorCase] || "bg-gray-200 text-gray-800";
- return _color;
-};
+const getColor = (c?: string) =>
+ languageColors[(c || "").toLowerCase()] || "bg-gray-200/10 text-gray-300";
const tableColumns = [
"Project",
@@ -82,15 +57,10 @@ export default function ProjectsContainer({
const pathname = usePathname();
const { projectTitle } = useProjectTitleStore();
const { setShowFilters } = useFilterStore();
-
- const handleClick = (link: string) => {
- window.open(link, "_blank");
- };
-
const isProjectsPage = pathname === "/dashboard/projects";
return (
-
+
{projectTitle}
@@ -104,66 +74,88 @@ export default function ProjectsContainer({
)}
+
{projects && projects.length > 0 ? (
-
-
-
-
- {tableColumns.map((name, index) => (
+
+
+ {/* Sticky header row */}
+
+
+ {tableColumns.map((name, i) => (
{name}
))}
+
- {projects.map((project) => (
+ {projects.map((p) => (
{
- handleClick(project.url);
- }}
+ key={p.id}
+ className="border-y border-ox-gray cursor-pointer hover:bg-white/5 transition-colors"
+ onClick={() => window.open(p.url, "_blank")}
>
-
-
-
+
+
-
- {project.name}
-
-
- {project.totalIssueCount}
+
+
+ {p.totalIssueCount}
+
- {project.primaryLanguage}
+ {p.primaryLanguage}
-
- {project.popularity}
+
+
+ {p.popularity}
-
- {project.stage}
+
+ {p.stage}
-
- {project.competition}
+
+ {p.competition}
-
- {project.activity}
+
+ {p.activity}
))}
diff --git a/apps/web/src/components/ui/Filter.tsx b/apps/web/src/components/ui/Filter.tsx
index bd0ab0a..b091b81 100644
--- a/apps/web/src/components/ui/Filter.tsx
+++ b/apps/web/src/components/ui/Filter.tsx
@@ -23,7 +23,7 @@ export default function Filter({
};
const triggerClasses = clsx("text-sm font-medium", {
- "text-slate-500": ["Hire contributors", "Funding", "Trending"].includes(
+ "text-slate-300": ["Hire contributors", "Funding", "Trending"].includes(
filterName
),
});
@@ -42,12 +42,12 @@ export default function Filter({
value={filter}
id={filter}
onClick={() => recordFilterInput(filter)}
- className="border-[#1a1a1d] text-ox-purple"
+ className="border-[#28282c] bg-[#141418] text-ox-purple transition data-[state=checked]:border-ox-purple data-[state=checked]:bg-ox-purple/20 data-[state=checked]:ring-2 data-[state=checked]:ring-ox-purple/50"
/>
From fd396a941e23acb77631b6df8559468e07440816 Mon Sep 17 00:00:00 2001
From: Aman Raj <113578582+huamanraj@users.noreply.github.com>
Date: Sat, 1 Nov 2025 18:35:23 +0530
Subject: [PATCH 3/4] fix: table hover
---
apps/web/src/components/dashboard/ProjectsContainer.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/web/src/components/dashboard/ProjectsContainer.tsx b/apps/web/src/components/dashboard/ProjectsContainer.tsx
index 4f017ff..be00403 100644
--- a/apps/web/src/components/dashboard/ProjectsContainer.tsx
+++ b/apps/web/src/components/dashboard/ProjectsContainer.tsx
@@ -80,8 +80,8 @@ export default function ProjectsContainer({
className="
w-full bg-[#15161a] border border-[#1a1a1d] rounded-lg
h-[80vh] overflow-y-auto overflow-x-auto relative
- [&::-webkit-scrollbar]:w-1
- [&::-webkit-scrollbar]:hover:w-2
+ [&::-webkit-scrollbar]:w-2
+
[&::-webkit-scrollbar]:h-1
[&::-webkit-scrollbar-track]:bg-transparent
[&::-webkit-scrollbar-thumb]:bg-ox-purple/30
From e381661900807d7c48b9b2ece0b3b5a72b79a114 Mon Sep 17 00:00:00 2001
From: apsinghdev
Date: Sun, 9 Nov 2025 21:02:39 +0530
Subject: [PATCH 4/4] chore: kyu ni ho rhi typo free coding?
---
.../src/app/(main)/dashboard/home/page.tsx | 2 +-
apps/web/src/components/dashboard/Sidebar.tsx | 21 +++++++++----------
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/apps/web/src/app/(main)/dashboard/home/page.tsx b/apps/web/src/app/(main)/dashboard/home/page.tsx
index a93919c..9e160ca 100644
--- a/apps/web/src/app/(main)/dashboard/home/page.tsx
+++ b/apps/web/src/app/(main)/dashboard/home/page.tsx
@@ -16,7 +16,7 @@ const Home = () => {
const initializeState = () => {
setData(projectsOfTheWeek);
setRenderProjects(true);
- setProjectTitle("Projects of the week");
+ setProjectTitle("Featured projects");
};
initializeState();
diff --git a/apps/web/src/components/dashboard/Sidebar.tsx b/apps/web/src/components/dashboard/Sidebar.tsx
index 28cefb5..eabb046 100644
--- a/apps/web/src/components/dashboard/Sidebar.tsx
+++ b/apps/web/src/components/dashboard/Sidebar.tsx
@@ -9,7 +9,7 @@ import {
XMarkIcon,
HomeIcon,
FolderIcon,
- ArrowLeftOnRectangleIcon,
+ ArrowRightOnRectangleIcon,
ChevronDoubleLeftIcon,
ChevronDoubleRightIcon,
MagnifyingGlassIcon,
@@ -43,7 +43,8 @@ const getSidebarLinkClassName = (currentPath: string, routePath: string) => {
};
export default function Sidebar() {
- const { showSidebar, setShowSidebar, isCollapsed, toggleCollapsed } = useShowSidebar();
+ const { showSidebar, setShowSidebar, isCollapsed, toggleCollapsed } =
+ useShowSidebar();
const pathname = usePathname();
const { setShowFilters } = useFilterStore();
@@ -69,10 +70,6 @@ export default function Sidebar() {
window.open(mailtoLink, "_blank");
};
- const handleLogout = () => {
- signOut({ callbackUrl: "/" });
- };
-
const handleFindProjects = () => {
setShowFilters(true);
};
@@ -88,7 +85,7 @@ export default function Sidebar() {
{/* Mobile header */}
-
Opensox
+ Opensox AI
setShowSidebar(false)}>
@@ -99,7 +96,7 @@ export default function Sidebar() {
{!isCollapsed && (
- Opensox
+ Opensox AI
)}
}
collapsed={isCollapsed}
/>
@@ -193,7 +190,9 @@ function ProfileMenu({ isCollapsed }: { isCollapsed: boolean }) {
{!isCollapsed && (
- Ajeet
+
+ Ajeet
+
hi@opensox.ai
signOut({ callbackUrl: "/" })}
- icon={}
+ icon={}
collapsed={false}
/>