-
setShowSidebar(false)}>
-
-
+ {/* Mobile header */}
+
+
+
Opensox AI
+
setShowSidebar(false)}>
+
+
+
+
+ {/* Desktop header with collapse */}
+
+ {!isCollapsed && (
+
+ Opensox AI
+
+ )}
+
+ {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..b091b81 100644
--- a/apps/web/src/components/ui/Filter.tsx
+++ b/apps/web/src/components/ui/Filter.tsx
@@ -23,39 +23,31 @@ 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
),
});
return (
-
+
- {filterName}
+ {filterName}
-
-
+
+
{filters.map((filter) => (
-
+
{
- recordFilterInput(filter);
- }}
+ onClick={() => recordFilterInput(filter)}
+ 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"
/>
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 46216f8..8b60240 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -175,6 +175,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)
@@ -2791,6 +2794,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'}
@@ -4369,9 +4377,6 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
- tr46@0.0.3:
- resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
-
ts-api-utils@1.4.3:
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
engines: {node: '>=16'}
@@ -7531,6 +7536,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: {}
@@ -9276,8 +9285,6 @@ snapshots:
toidentifier@1.0.1: {}
- tr46@0.0.3: {}
-
ts-api-utils@1.4.3(typescript@5.9.2):
dependencies:
typescript: 5.9.2