handleHovered(true)}
+ onMouseLeave={() => handleHovered(false)}
+ onBlur={() => handleHovered(false)}
>
{/* Trigger area for auto-show when hidden */}
{isMenuExpanded && (
-
+
)}
+ {/* Menubar */}
-
-

+
+
+
- {!menuDisabledItems.includes('image') &&
}
- {!menuDisabledItems.includes('download') &&
}
- {!menuDisabledItems.includes('script') && }
- {!menuDisabledItems.includes('terminal') &&
}
- {!menuDisabledItems.includes('wol') &&
}
+ {isEnabled('image') &&
}
+ {isEnabled('download') &&
}
+ {isEnabled('script') && }
+ {isEnabled('terminal') &&
}
+ {isEnabled('wol') &&
}
- {['image', 'script', 'terminal', 'wol', 'download'].some(
- (key) => !menuDisabledItems.includes(key)
- ) &&
}
+ {['image', 'download', 'script', 'terminal', 'wol'].some(isEnabled) && (
+
+ )}
- {!menuDisabledItems.includes('power') && (
+ {isEnabled('power') && (
<>
@@ -158,29 +180,13 @@ export const Menu = () => {
)}
-
-
-
- setIsMenuExpanded((expanded) => !expanded)}
- >
-
-
-
+ {isEnabled('fullscreen') &&
}
+ {isEnabled('collapse') &&
}
- {!isMenuExpanded && (
-
- setIsMenuExpanded((expanded) => !expanded)}
- >
-
-
-
- )}
+ {/* Menubar expand button */}
+ {!isMenuExpanded &&
}
);
diff --git a/web/src/pages/desktop/menu/operations/collapse.tsx b/web/src/pages/desktop/menu/operations/collapse.tsx
new file mode 100644
index 0000000..c21d046
--- /dev/null
+++ b/web/src/pages/desktop/menu/operations/collapse.tsx
@@ -0,0 +1,22 @@
+import { Tooltip } from 'antd';
+import { XIcon } from 'lucide-react';
+import { useTranslation } from 'react-i18next';
+
+interface CollapseProps {
+ toggleMenu(expanded: boolean): void;
+}
+
+export const Collapse = ({ toggleMenu }: CollapseProps) => {
+ const { t } = useTranslation();
+
+ return (
+
+ toggleMenu(false)}
+ >
+
+
+
+ );
+};
diff --git a/web/src/pages/desktop/menu/operations/expand.tsx b/web/src/pages/desktop/menu/operations/expand.tsx
new file mode 100644
index 0000000..6d9b3c6
--- /dev/null
+++ b/web/src/pages/desktop/menu/operations/expand.tsx
@@ -0,0 +1,27 @@
+import { Divider } from 'antd';
+import { ChevronRightIcon, GripVerticalIcon } from 'lucide-react';
+
+interface ExpandProps {
+ toggleMenu: (expanded: boolean) => void;
+}
+
+export const Expand = ({ toggleMenu }: ExpandProps) => {
+ return (
+
+
+
+
+
+
+
+
+
+
toggleMenu(true)}
+ >
+
+
+
+ );
+};
diff --git a/web/src/pages/desktop/menu/operations/index.tsx b/web/src/pages/desktop/menu/operations/index.tsx
new file mode 100644
index 0000000..a810591
--- /dev/null
+++ b/web/src/pages/desktop/menu/operations/index.tsx
@@ -0,0 +1,2 @@
+export { Collapse } from './collapse.tsx';
+export { Expand } from './expand.tsx';
diff --git a/web/src/pages/desktop/menu/settings/appearance/menu-bar.tsx b/web/src/pages/desktop/menu/settings/appearance/menu-bar.tsx
index 29abd1c..8037157 100644
--- a/web/src/pages/desktop/menu/settings/appearance/menu-bar.tsx
+++ b/web/src/pages/desktop/menu/settings/appearance/menu-bar.tsx
@@ -4,9 +4,11 @@ import {
DiscIcon,
DownloadIcon,
FileJsonIcon,
+ MaximizeIcon,
NetworkIcon,
PowerIcon,
- TerminalSquareIcon
+ TerminalSquareIcon,
+ XIcon
} from 'lucide-react';
import { useTranslation } from 'react-i18next';
@@ -19,12 +21,14 @@ export const MenuBar = () => {
const [menuDisabledItems, setMenuDisabledItems] = useAtom(menuDisabledItemsAtom);
const items = [
- { key: 'image', icon:
},
- { key: 'download', icon:
},
- { key: 'script', icon:
},
- { key: 'terminal', icon:
},
- { key: 'wol', icon:
},
- { key: 'power', icon:
}
+ { key: 'image', icon:
},
+ { key: 'download', icon:
},
+ { key: 'script', icon:
},
+ { key: 'terminal', icon:
},
+ { key: 'wol', icon:
},
+ { key: 'power', icon:
},
+ { key: 'fullscreen', icon:
, label: 'fullscreen.toggle' },
+ { key: 'collapse', icon:
, label: 'menu.collapse' }
];
function updateItems(key: string) {
@@ -48,10 +52,13 @@ export const MenuBar = () => {
{items.map((item) => (
-
+
{item.icon}
- {t(`${item.key}.title`)}
+
+ {item.label ? t(item.label) : t(`${item.key}.title`)}
+
+
updateItems(item.key)}