@@ -193,11 +203,11 @@ export default function HomePage(): React.ReactElement {
N
-
+
NextApp
-
+
Xây dựng sản phẩm tốt hơn mỗi ngày
@@ -210,7 +220,7 @@ export default function HomePage(): React.ReactElement {
{ title: "Hỗ trợ", links: ["Trợ giúp", "Liên hệ", "Điều khoản"] },
].map((col, i) => (
-
+
{col.title}
@@ -218,7 +228,7 @@ export default function HomePage(): React.ReactElement {
-
{link}
@@ -228,7 +238,7 @@ export default function HomePage(): React.ReactElement {
))}
-
+
© 2024 NextApp. All rights reserved.
diff --git a/src/components/common/theme-provider.tsx b/src/components/common/theme-provider.tsx
new file mode 100644
index 0000000..c6a9021
--- /dev/null
+++ b/src/components/common/theme-provider.tsx
@@ -0,0 +1,8 @@
+"use client";
+
+import { ThemeProvider as NextThemesProvider } from "next-themes";
+import type { ThemeProviderProps } from "next-themes";
+
+export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
+ return
{children};
+}
diff --git a/src/components/common/theme-toggle.tsx b/src/components/common/theme-toggle.tsx
new file mode 100644
index 0000000..7e4af17
--- /dev/null
+++ b/src/components/common/theme-toggle.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { useTheme } from "next-themes";
+import { Sun, Moon } from "lucide-react";
+import { useMounted } from "@/hooks";
+
+export function ThemeToggle() {
+ const { resolvedTheme, setTheme } = useTheme();
+ const mounted = useMounted();
+
+ const isDark = mounted && resolvedTheme === "dark";
+
+ return (
+
+ );
+}
diff --git a/src/components/common/ui/dropdown-menu.tsx b/src/components/common/ui/dropdown-menu.tsx
new file mode 100644
index 0000000..dcd6d06
--- /dev/null
+++ b/src/components/common/ui/dropdown-menu.tsx
@@ -0,0 +1,138 @@
+"use client";
+
+import * as React from "react";
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
+import { cn } from "@/lib/cn";
+
+const DropdownMenu = DropdownMenuPrimitive.Root;
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
+const DropdownMenuGroup = DropdownMenuPrimitive.Group;
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
+const DropdownMenuSub = DropdownMenuPrimitive.Sub;
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+const DropdownMenuContent = React.forwardRef<
+ React.ComponentRef
,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+));
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
+
+const DropdownMenuItem = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName;
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuRadioGroup,
+};
diff --git a/src/components/common/ui/index.ts b/src/components/common/ui/index.ts
index fa5f764..a59d29b 100644
--- a/src/components/common/ui/index.ts
+++ b/src/components/common/ui/index.ts
@@ -1,2 +1,15 @@
// Barrel export for UI components
-export { Button } from './button';
+export { Button } from "./button";
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuRadioGroup,
+} from "./dropdown-menu";
diff --git a/src/provider/index.tsx b/src/provider/index.tsx
index 313e5dd..afe3891 100644
--- a/src/provider/index.tsx
+++ b/src/provider/index.tsx
@@ -3,6 +3,7 @@
import { ReactNode } from "react";
import QueryProvider from "@/provider/QueryProvider";
import { SidebarProvider } from "@/contexts/SidebarContext";
+import { ThemeProvider } from "@/components/common/theme-provider";
import { Toaster } from "sonner";
interface ProvidersProps {
@@ -11,11 +12,18 @@ interface ProvidersProps {
export default function Providers({ children }: ProvidersProps) {
return (
-
-
- {children}
-
-
-
+
+
+
+ {children}
+
+
+
+
);
}