diff --git a/web/app/components/base/theme-selector.tsx b/web/app/components/base/theme-selector.tsx
new file mode 100644
index 0000000000..8dfe1d2602
--- /dev/null
+++ b/web/app/components/base/theme-selector.tsx
@@ -0,0 +1,97 @@
+'use client'
+
+import { useState } from 'react'
+import {
+ RiCheckLine,
+ RiComputerLine,
+ RiMoonLine,
+ RiSunLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useTheme } from 'next-themes'
+import ActionButton from '@/app/components/base/action-button'
+import {
+ PortalToFollowElem,
+ PortalToFollowElemContent,
+ PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+export type Theme = 'light' | 'dark' | 'system'
+
+export default function ThemeSelector() {
+ const { t } = useTranslation()
+ const { theme, setTheme } = useTheme()
+ const [open, setOpen] = useState(false)
+
+ const handleThemeChange = (newTheme: Theme) => {
+ setTheme(newTheme)
+ setOpen(false)
+ }
+
+ const getCurrentIcon = () => {
+ switch (theme) {
+ case 'light': return
+ case 'dark': return
+ default: return
+ }
+ }
+
+ return (
+
+ setOpen(!open)}
+ >
+
+ {getCurrentIcon()}
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/web/app/components/base/theme-switcher.tsx b/web/app/components/base/theme-switcher.tsx
new file mode 100644
index 0000000000..902d064a66
--- /dev/null
+++ b/web/app/components/base/theme-switcher.tsx
@@ -0,0 +1,58 @@
+'use client'
+import {
+ RiComputerLine,
+ RiMoonLine,
+ RiSunLine,
+} from '@remixicon/react'
+import { useTheme } from 'next-themes'
+import cn from '@/utils/classnames'
+
+export type Theme = 'light' | 'dark' | 'system'
+
+export default function ThemeSwitcher() {
+ const { theme, setTheme } = useTheme()
+
+ const handleThemeChange = (newTheme: Theme) => {
+ setTheme(newTheme)
+ }
+
+ return (
+
+
handleThemeChange('system')}
+ >
+
+
+
+
+
+
handleThemeChange('light')}
+ >
+
+
+
+
+
+
handleThemeChange('dark')}
+ >
+
+
+
+
+
+ )
+}
diff --git a/web/app/components/header/account-dropdown/index.tsx b/web/app/components/header/account-dropdown/index.tsx
index 66b61d7ec1..88bee4dd51 100644
--- a/web/app/components/header/account-dropdown/index.tsx
+++ b/web/app/components/header/account-dropdown/index.tsx
@@ -14,6 +14,7 @@ import {
RiMap2Line,
RiSettings3Line,
RiStarLine,
+ RiTShirt2Line,
} from '@remixicon/react'
import Link from 'next/link'
import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
@@ -25,6 +26,7 @@ import Compliance from './compliance'
import PremiumBadge from '@/app/components/base/premium-badge'
import I18n from '@/context/i18n'
import Avatar from '@/app/components/base/avatar'
+import ThemeSwitcher from '@/app/components/base/theme-switcher'
import { logout } from '@/service/common'
import AppContext, { useAppContext } from '@/context/app-context'
import { useProviderContext } from '@/context/provider-context'
@@ -83,8 +85,8 @@ export default function AppSelector() {