diff --git a/frontend/app/tab/tabbar.scss b/frontend/app/tab/tabbar.scss index 30e9aa7244..987dd18cfe 100644 --- a/frontend/app/tab/tabbar.scss +++ b/frontend/app/tab/tabbar.scss @@ -122,3 +122,8 @@ --os-handle-border-radius: 2px; } } + +.tab-bar-wrapper.tab-bar-bottom { + padding-top: 3px; + padding-bottom: 3px; +} diff --git a/frontend/app/tab/tabbar.tsx b/frontend/app/tab/tabbar.tsx index 47cc15e2e6..0e7a1e29b1 100644 --- a/frontend/app/tab/tabbar.tsx +++ b/frontend/app/tab/tabbar.tsx @@ -15,6 +15,7 @@ import { debounce } from "throttle-debounce"; import { IconButton } from "../element/iconbutton"; import { WorkspaceService } from "../store/services"; import { Tab } from "./tab"; +import clsx from "clsx"; import "./tabbar.scss"; import { UpdateStatusBanner } from "./updatebanner"; import { WorkspaceSwitcher } from "./workspaceswitcher"; @@ -648,6 +649,9 @@ const TabBar = memo(({ workspace }: TabBarProps) => { ) : undefined; + const tabBarPosition = settings?.["window:tabbarposition"]; + const workspaceSwitcherPlacement = tabBarPosition === "bottom" ? "top-start" : "bottom-start"; + const addtabButtonDecl: IconButtonDecl = { elemtype: "iconbutton", icon: "plus", @@ -655,11 +659,11 @@ const TabBar = memo(({ workspace }: TabBarProps) => { title: "Add Tab", }; return ( -
+
{appMenuButton} {devLabel} - +
{tabIds.map((tabId, index) => { diff --git a/frontend/app/tab/workspaceswitcher.tsx b/frontend/app/tab/workspaceswitcher.tsx index f303f3253a..99c9b8e0c9 100644 --- a/frontend/app/tab/workspaceswitcher.tsx +++ b/frontend/app/tab/workspaceswitcher.tsx @@ -25,6 +25,10 @@ import { waveEventSubscribe } from "../store/wps"; import { WorkspaceEditor } from "./workspaceeditor"; import "./workspaceswitcher.scss"; +type WorkspaceSwitcherProps = { + placement: "top-start" | "bottom-start"; +}; + type WorkspaceListEntry = { windowId: string; workspace: Workspace; @@ -34,7 +38,7 @@ type WorkspaceList = WorkspaceListEntry[]; const workspaceMapAtom = atom([]); const workspaceSplitAtom = splitAtom(workspaceMapAtom); const editingWorkspaceAtom = atom(); -const WorkspaceSwitcher = forwardRef((_, ref) => { +const WorkspaceSwitcher = forwardRef(({ placement }, ref) => { const setWorkspaceList = useSetAtom(workspaceMapAtom); const activeWorkspace = useAtomValueSafe(atoms.workspace); const workspaceList = useAtomValue(workspaceSplitAtom); @@ -93,7 +97,7 @@ const WorkspaceSwitcher = forwardRef((_, ref) => { return ( setEditingWorkspace(null)} ref={ref} > diff --git a/frontend/app/workspace/workspace.tsx b/frontend/app/workspace/workspace.tsx index 6a03e3b95f..258e15c631 100644 --- a/frontend/app/workspace/workspace.tsx +++ b/frontend/app/workspace/workspace.tsx @@ -151,8 +151,11 @@ const Widget = memo(({ widget }: { widget: WidgetConfigType }) => { const WorkspaceElem = memo(() => { const tabId = useAtomValue(atoms.staticTabId); const ws = useAtomValue(atoms.workspace); + const settings = useAtomValue(atoms.settingsAtom); + const tabBarPosition = settings?.["window:tabbarposition"]; + return ( -
+
diff --git a/frontend/types/gotypes.d.ts b/frontend/types/gotypes.d.ts index 4f399e0e34..bb747a4d3b 100644 --- a/frontend/types/gotypes.d.ts +++ b/frontend/types/gotypes.d.ts @@ -736,6 +736,7 @@ declare global { "window:tilegapsize"?: number; "window:showmenubar"?: boolean; "window:nativetitlebar"?: boolean; + "window:tabbarposition"?: "top" | "bottom"; "window:disablehardwareacceleration"?: boolean; "window:maxtabcachesize"?: number; "window:magnifiedblockopacity"?: number; diff --git a/pkg/wconfig/defaultconfig/settings.json b/pkg/wconfig/defaultconfig/settings.json index 1cfbc13565..c544db1520 100644 --- a/pkg/wconfig/defaultconfig/settings.json +++ b/pkg/wconfig/defaultconfig/settings.json @@ -15,6 +15,7 @@ "window:tilegapsize": 3, "window:maxtabcachesize": 10, "window:nativetitlebar": true, + "window:tabbarposition": "top", "window:magnifiedblockopacity": 0.6, "window:magnifiedblocksize": 0.9, "window:magnifiedblockblurprimarypx": 10, diff --git a/pkg/wconfig/metaconsts.go b/pkg/wconfig/metaconsts.go index 0185b3bc24..7978f1d3af 100644 --- a/pkg/wconfig/metaconsts.go +++ b/pkg/wconfig/metaconsts.go @@ -75,6 +75,7 @@ const ( ConfigKey_WindowTileGapSize = "window:tilegapsize" ConfigKey_WindowShowMenuBar = "window:showmenubar" ConfigKey_WindowNativeTitleBar = "window:nativetitlebar" + ConfigKey_WindowTabBarPosition = "window:tabbarposition" ConfigKey_WindowDisableHardwareAcceleration = "window:disablehardwareacceleration" ConfigKey_WindowMaxTabCacheSize = "window:maxtabcachesize" ConfigKey_WindowMagnifiedBlockOpacity = "window:magnifiedblockopacity" diff --git a/pkg/wconfig/settingsconfig.go b/pkg/wconfig/settingsconfig.go index 814d3d46a9..526ab3b97f 100644 --- a/pkg/wconfig/settingsconfig.go +++ b/pkg/wconfig/settingsconfig.go @@ -120,6 +120,7 @@ type SettingsType struct { WindowTileGapSize *int64 `json:"window:tilegapsize,omitempty"` WindowShowMenuBar bool `json:"window:showmenubar,omitempty"` WindowNativeTitleBar bool `json:"window:nativetitlebar,omitempty"` + WindowTabBarPosition *string `json:"window:tabbarposition,omitempty"` WindowDisableHardwareAcceleration bool `json:"window:disablehardwareacceleration,omitempty"` WindowMaxTabCacheSize int `json:"window:maxtabcachesize,omitempty"` WindowMagnifiedBlockOpacity *float64 `json:"window:magnifiedblockopacity,omitempty"` diff --git a/schema/settings.json b/schema/settings.json index 395974b573..91d6b16875 100644 --- a/schema/settings.json +++ b/schema/settings.json @@ -182,6 +182,11 @@ "window:nativetitlebar": { "type": "boolean" }, + "window:tabbarposition": { + "type": { + "enum": ["top", "bottom"] + } + }, "window:disablehardwareacceleration": { "type": "boolean" }, @@ -232,4 +237,4 @@ "type": "object" } } -} \ No newline at end of file +}