diff --git a/src/components/setting-item.tsx b/src/components/setting-item.tsx
deleted file mode 100644
index 52a05843579988faf19758f733413fd0da3448d4..0000000000000000000000000000000000000000
--- a/src/components/setting-item.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { ListItem, styled } from "@mui/material";
-
-const SettingItem = styled(ListItem)(() => ({
-  paddingTop: 5,
-  paddingBottom: 5,
-}));
-
-export default SettingItem;
diff --git a/src/components/setting-clash.tsx b/src/components/setting/setting-clash.tsx
similarity index 86%
rename from src/components/setting-clash.tsx
rename to src/components/setting/setting-clash.tsx
index d3fc013c649dd39d9e78888af11ff9e04918caa5..97d5b8b554d60c239384e520b6fa42b8a9855d68 100644
--- a/src/components/setting-clash.tsx
+++ b/src/components/setting/setting-clash.tsx
@@ -1,18 +1,16 @@
 import useSWR, { useSWRConfig } from "swr";
 import {
-  List,
   ListItemText,
-  ListSubheader,
   TextField,
   Switch,
   Select,
   MenuItem,
 } from "@mui/material";
-import { getClashConfig, updateConfigs } from "../services/api";
-import { patchClashConfig } from "../services/cmds";
-import { ApiType } from "../services/types";
-import GuardState from "./guard-state";
-import SettingItem from "./setting-item";
+import { getClashConfig, updateConfigs } from "../../services/api";
+import { SettingList, SettingItem } from "./setting";
+import { patchClashConfig } from "../../services/cmds";
+import { ApiType } from "../../services/types";
+import GuardState from "../guard-state";
 
 interface Props {
   onError?: (err: Error) => void;
@@ -30,22 +28,16 @@ const SettingClash = ({ onError }: Props) => {
   } = clashConfig ?? {};
 
   const onSwitchFormat = (_e: any, value: boolean) => value;
-
   const onChangeData = (patch: Partial<ApiType.ConfigData>) => {
     mutate("getClashConfig", { ...clashConfig, ...patch }, false);
   };
-
   const onUpdateData = async (patch: Partial<ApiType.ConfigData>) => {
     await updateConfigs(patch);
     await patchClashConfig(patch);
   };
 
   return (
-    <List>
-      <ListSubheader sx={{ background: "transparent" }}>
-        Clash Setting
-      </ListSubheader>
-
+    <SettingList title="Clash Setting">
       <SettingItem>
         <ListItemText primary="Allow Lan" />
         <GuardState
@@ -102,7 +94,7 @@ const SettingClash = ({ onError }: Props) => {
           disabled
         />
       </SettingItem>
-    </List>
+    </SettingList>
   );
 };
 
diff --git a/src/components/setting-verge.tsx b/src/components/setting/setting-verge.tsx
similarity index 82%
rename from src/components/setting-verge.tsx
rename to src/components/setting/setting-verge.tsx
index 3a15bf95ba20c10a315cf11a0dc9807c131d7ff5..e3d51bb655094ca55d95d8d26463e873098ae27e 100644
--- a/src/components/setting-verge.tsx
+++ b/src/components/setting/setting-verge.tsx
@@ -1,19 +1,12 @@
 import useSWR, { useSWRConfig } from "swr";
-import {
-  Box,
-  List,
-  ListItemText,
-  ListSubheader,
-  Switch,
-  Typography,
-} from "@mui/material";
-import { getVergeConfig, patchVergeConfig } from "../services/cmds";
-import { CmdType } from "../services/types";
-import { version } from "../../package.json";
-import GuardState from "./guard-state";
-import SettingItem from "./setting-item";
-import PaletteSwitch from "./palette-switch";
-import SysproxyTooltip from "./sysproxy-tooltip";
+import { Box, ListItemText, Switch, Typography } from "@mui/material";
+import { getVergeConfig, patchVergeConfig } from "../../services/cmds";
+import { SettingList, SettingItem } from "./setting";
+import { CmdType } from "../../services/types";
+import { version } from "../../../package.json";
+import GuardState from "../guard-state";
+import PaletteSwitch from "../palette-switch";
+import SysproxyTooltip from "../sysproxy-tooltip";
 
 interface Props {
   onError?: (err: Error) => void;
@@ -36,11 +29,7 @@ const SettingVerge = ({ onError }: Props) => {
   };
 
   return (
-    <List>
-      <ListSubheader sx={{ background: "transparent" }}>
-        Common Setting
-      </ListSubheader>
-
+    <SettingList title="Common Setting">
       <SettingItem>
         <ListItemText primary="Theme Mode" />
         <GuardState
@@ -110,7 +99,7 @@ const SettingVerge = ({ onError }: Props) => {
         <ListItemText primary="Version" />
         <Typography sx={{ py: "6px" }}>v{version}</Typography>
       </SettingItem>
-    </List>
+    </SettingList>
   );
 };
 
diff --git a/src/components/setting/setting.tsx b/src/components/setting/setting.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..49e9a22cfd547a9e555cc50a2696ce37a49c2a06
--- /dev/null
+++ b/src/components/setting/setting.tsx
@@ -0,0 +1,19 @@
+import React from "react";
+import { List, ListItem, ListSubheader, styled } from "@mui/material";
+
+export const SettingItem = styled(ListItem)(() => ({
+  paddingTop: 5,
+  paddingBottom: 5,
+}));
+
+export const SettingList: React.FC<{
+  title: string;
+}> = (props) => (
+  <List>
+    <ListSubheader sx={{ background: "transparent" }} disableSticky>
+      {props.title}
+    </ListSubheader>
+
+    {props.children}
+  </List>
+);
diff --git a/src/pages/setting.tsx b/src/pages/setting.tsx
index 98c02563b2e95c547cb37c5fb8026481fec169cc..f4e32b6bc598a55389369298177eef5332d5950a 100644
--- a/src/pages/setting.tsx
+++ b/src/pages/setting.tsx
@@ -1,7 +1,7 @@
 import { Paper } from "@mui/material";
 import BasePage from "../components/base-page";
-import SettingVerge from "../components/setting-verge";
-import SettingClash from "../components/setting-clash";
+import SettingVerge from "../components/setting/setting-verge";
+import SettingClash from "../components/setting/setting-clash";
 
 const SettingPage = () => {
   return (