diff --git a/.gitignore b/.gitignore
index 04bd12c80af4826aa3e489a99d0ad381aa2ccf81..c9e2fb916ed5395d3fc10ad8a7fadac8966f2451 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ dist-ssr
 *.local
 update.json
 scripts/_env.sh
+.vscode
diff --git a/src/components/profile/profile-new.tsx b/src/components/profile/profile-new.tsx
index 74543161ef65793c6f4b33a06623999934d45942..ff7945f813600dadad6d10febe59be4e56d4a504 100644
--- a/src/components/profile/profile-new.tsx
+++ b/src/components/profile/profile-new.tsx
@@ -21,6 +21,7 @@ import { Settings } from "@mui/icons-material";
 import { createProfile } from "@/services/cmds";
 import Notice from "../base/base-notice";
 import FileInput from "./file-input";
+import { Smoother } from "./smoother";
 
 interface Props {
   open: boolean;
@@ -93,100 +94,98 @@ const ProfileNew = (props: Props) => {
       <DialogTitle sx={{ pb: 0.5 }}>{t("Create Profile")}</DialogTitle>
 
       <DialogContent sx={{ width: 336, pb: 1 }}>
-        <FormControl size="small" fullWidth sx={{ mt: 2, mb: 1 }}>
-          <InputLabel>Type</InputLabel>
-          <Select
-            autoFocus
-            label={t("Type")}
-            value={form.type}
-            onChange={(e) => setForm({ type: e.target.value })}
-          >
-            <MenuItem value="remote">Remote</MenuItem>
-            <MenuItem value="local">Local</MenuItem>
-            <MenuItem value="script">Script</MenuItem>
-            <MenuItem value="merge">Merge</MenuItem>
-          </Select>
-        </FormControl>
-
-        <TextField
-          {...textFieldProps}
-          label={t("Name")}
-          autoComplete="off"
-          value={form.name}
-          onChange={(e) => setForm({ name: e.target.value })}
-        />
-
-        <TextField
-          {...textFieldProps}
-          label={t("Descriptions")}
-          autoComplete="off"
-          value={form.desc}
-          onChange={(e) => setForm({ desc: e.target.value })}
-        />
+        <Smoother>
+          <FormControl size="small" fullWidth sx={{ mt: 2, mb: 1 }}>
+            <InputLabel>Type</InputLabel>
+            <Select
+              autoFocus
+              label={t("Type")}
+              value={form.type}
+              onChange={(e) => setForm({ type: e.target.value })}
+            >
+              <MenuItem value="remote">Remote</MenuItem>
+              <MenuItem value="local">Local</MenuItem>
+              <MenuItem value="script">Script</MenuItem>
+              <MenuItem value="merge">Merge</MenuItem>
+            </Select>
+          </FormControl>
 
-        {form.type === "remote" && (
           <TextField
             {...textFieldProps}
-            label={t("Subscription URL")}
+            label={t("Name")}
             autoComplete="off"
-            value={form.url}
-            onChange={(e) => setForm({ url: e.target.value })}
+            value={form.name}
+            onChange={(e) => setForm({ name: e.target.value })}
           />
-        )}
 
-        {form.type === "local" && (
-          <FileInput onChange={(val) => (fileDataRef.current = val)} />
-        )}
-
-        {showOpt && (
           <TextField
             {...textFieldProps}
-            label="User Agent"
+            label={t("Descriptions")}
             autoComplete="off"
-            value={option.user_agent}
-            onChange={(e) => setOption({ user_agent: e.target.value })}
+            value={form.desc}
+            onChange={(e) => setForm({ desc: e.target.value })}
           />
-        )}
 
-        {form.type === "remote" && showOpt && (
-          <FormControlLabel
-            label={t("Use System Proxy")}
-            labelPlacement="start"
-            sx={{ ml: 0, my: 1 }}
-            control={
-              <Switch
-                color="primary"
-                checked={option.with_proxy}
-                onChange={(_e, c) =>
-                  setOption((o) => ({
-                    self_proxy: c ? false : o.self_proxy,
-                    with_proxy: c,
-                  }))
+          {form.type === "remote" && (
+            <TextField
+              {...textFieldProps}
+              label={t("Subscription URL")}
+              autoComplete="off"
+              value={form.url}
+              onChange={(e) => setForm({ url: e.target.value })}
+            />
+          )}
+
+          {form.type === "local" && (
+            <FileInput onChange={(val) => (fileDataRef.current = val)} />
+          )}
+
+          {form.type === "remote" && showOpt && (
+            <>
+              <TextField
+                {...textFieldProps}
+                label="User Agent"
+                autoComplete="off"
+                value={option.user_agent}
+                onChange={(e) => setOption({ user_agent: e.target.value })}
+              />
+              <FormControlLabel
+                label={t("Use System Proxy")}
+                labelPlacement="start"
+                sx={{ ml: 0, my: 1 }}
+                control={
+                  <Switch
+                    color="primary"
+                    checked={option.with_proxy}
+                    onChange={(_e, c) =>
+                      setOption((o) => ({
+                        self_proxy: c ? false : o.self_proxy,
+                        with_proxy: c,
+                      }))
+                    }
+                  />
                 }
               />
-            }
-          />
-        )}
-
-        {form.type === "remote" && showOpt && (
-          <FormControlLabel
-            label={t("Use Clash Proxy")}
-            labelPlacement="start"
-            sx={{ ml: 0, my: 1 }}
-            control={
-              <Switch
-                color="primary"
-                checked={option.self_proxy}
-                onChange={(_e, c) =>
-                  setOption((o) => ({
-                    with_proxy: c ? false : o.with_proxy,
-                    self_proxy: c,
-                  }))
+              <FormControlLabel
+                label={t("Use Clash Proxy")}
+                labelPlacement="start"
+                sx={{ ml: 0, my: 1 }}
+                control={
+                  <Switch
+                    color="primary"
+                    checked={option.self_proxy}
+                    onChange={(_e, c) =>
+                      setOption((o) => ({
+                        with_proxy: c ? false : o.with_proxy,
+                        self_proxy: c,
+                      }))
+                    }
+                  />
                 }
               />
-            }
-          />
-        )}
+            </>
+          )}
+        </Smoother>
       </DialogContent>
 
       <DialogActions sx={{ px: 2, pb: 2, position: "relative" }}>
diff --git a/src/components/profile/smoother.tsx b/src/components/profile/smoother.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1a1a2dcf699a080cdd691ccce6ce2a3b9c3cce41
--- /dev/null
+++ b/src/components/profile/smoother.tsx
@@ -0,0 +1,30 @@
+import { useEffect, useRef } from "react";
+
+export const Smoother: React.FC = ({ children }) => {
+  const self = useRef<HTMLDivElement>(null);
+  useEffect(() => {
+    if (typeof window.getComputedStyle == "undefined") return;
+    const element = self.current;
+    if (!element) return;
+    var height = window.getComputedStyle(element).height;
+    element.style.transition = "none";
+    element.style.height = "auto";
+    var targetHeight = window.getComputedStyle(element).height;
+    element.style.height = height;
+
+    setTimeout(() => {
+      element.style.transition = "height .5s";
+      element.style.height = targetHeight;
+    }, 0);
+  });
+  return (
+    <div
+      ref={self}
+      style={{
+        overflowY: "hidden",
+      }}
+    >
+      {children}
+    </div>
+  );
+};