diff --git a/client/ui/frontend/src/modules/settings/SettingsAdvanced.tsx b/client/ui/frontend/src/modules/settings/SettingsAdvanced.tsx
index 4c85d4c47..c0a1d55de 100644
--- a/client/ui/frontend/src/modules/settings/SettingsAdvanced.tsx
+++ b/client/ui/frontend/src/modules/settings/SettingsAdvanced.tsx
@@ -5,7 +5,7 @@ import Button from "@/components/Button";
import { HelpText } from "@/components/HelpText";
import { Input } from "@/components/Input";
import { Label } from "@/components/Label";
-import { SectionGroup } from "@/modules/settings/SettingsSection.tsx";
+import { SectionGroup, SettingsBottomBar } from "@/modules/settings/SettingsSection.tsx";
import { useSettings } from "@/modules/settings/SettingsContext.tsx";
// macOS: the Darwin utun control socket parses the digits after "utun" as the
@@ -139,18 +139,16 @@ export function SettingsAdvanced() {
-
-
-
-
-
+
+
+
>
);
}
diff --git a/client/ui/frontend/src/modules/settings/SettingsProfiles.tsx b/client/ui/frontend/src/modules/settings/SettingsProfiles.tsx
index 592c9e74b..e1b6d9315 100644
--- a/client/ui/frontend/src/modules/settings/SettingsProfiles.tsx
+++ b/client/ui/frontend/src/modules/settings/SettingsProfiles.tsx
@@ -1,4 +1,4 @@
-import { useLayoutEffect, useRef, useState, type ReactNode } from "react";
+import { useLayoutEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { Dialogs } from "@wailsio/runtime";
import { CircleMinus, PlusCircle, Trash2, UserCircle } from "lucide-react";
@@ -11,7 +11,7 @@ import { pickProfileIcon } from "@/components/ProfileAvatar";
import { Tooltip } from "@/components/Tooltip";
import i18next from "@/lib/i18n";
import { useProfile } from "@/modules/profile/ProfileContext";
-import { SectionGroup } from "@/modules/settings/SettingsSection.tsx";
+import { SectionGroup, SettingsBottomBar } from "@/modules/settings/SettingsSection.tsx";
import { cn } from "@/lib/cn";
import { formatErrorMessage } from "@/lib/errors";
@@ -104,10 +104,6 @@ export function SettingsProfiles() {
);
+
+// SettingsBottomBar renders the floating action bar at the bottom of a
+// settings tab (Save Changes / Add Profile / Create Bundle). It pairs the
+// absolutely positioned bar with an in-flow spacer of the same height so
+// scrollable content above doesn't end up hidden behind the bar.
+export const SettingsBottomBar = ({ children }: { children: ReactNode }) => (
+ <>
+
+
+
+ {children}
+
+
+ >
+);
diff --git a/client/ui/frontend/src/modules/settings/SettingsTroubleshooting.tsx b/client/ui/frontend/src/modules/settings/SettingsTroubleshooting.tsx
index f4dcf2731..b321145de 100644
--- a/client/ui/frontend/src/modules/settings/SettingsTroubleshooting.tsx
+++ b/client/ui/frontend/src/modules/settings/SettingsTroubleshooting.tsx
@@ -15,7 +15,7 @@ import { SquareIcon } from "@/components/SquareIcon";
import { cn } from "@/lib/cn";
import type { DebugStage } from "@/modules/debug-bundle/useDebugBundle.ts";
import { useDebugBundleContext } from "@/modules/debug-bundle/useDebugBundleContext.ts";
-import { SectionGroup } from "@/modules/settings/SettingsSection.tsx";
+import { SectionGroup, SettingsBottomBar } from "@/modules/settings/SettingsSection.tsx";
export function SettingsTroubleshooting() {
const { t } = useTranslation();
@@ -106,11 +106,11 @@ export function SettingsTroubleshooting() {
-
+
-
+
);
}
@@ -265,20 +265,6 @@ function DoneResult({
);
}
-function BottomBar({ children }: { children: ReactNode }) {
- return (
-