diff --git a/src/components/ui/kbd.tsx b/src/components/ui/kbd.tsx
new file mode 100644
index 00000000..253c69f3
--- /dev/null
+++ b/src/components/ui/kbd.tsx
@@ -0,0 +1,28 @@
+import { cn } from "@/lib/utils"
+
+function Kbd({ className, ...props }: React.ComponentProps<"kbd">) {
+ return (
+
+ )
+}
+
+function KbdGroup({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Kbd, KbdGroup }
diff --git a/src/ui/desktop/apps/command-palette/CommandPalette.tsx b/src/ui/desktop/apps/command-palette/CommandPalette.tsx
index fd898db0..1833aa1d 100644
--- a/src/ui/desktop/apps/command-palette/CommandPalette.tsx
+++ b/src/ui/desktop/apps/command-palette/CommandPalette.tsx
@@ -8,6 +8,7 @@ import {
} from "@/components/ui/command.tsx";
import React, { useEffect, useRef, useState } from "react";
import { cn } from "@/lib/utils";
+import { Kbd, KbdGroup } from "@/components/ui/kbd";
import {
Key,
Server,
@@ -377,6 +378,20 @@ export function CommandPalette({
+
+
+ Press
+
+ Shift
+ Shift
+
+ to toggle
+
+
+ Close
+ Esc
+
+
);
diff --git a/src/ui/desktop/apps/file-manager/FileManager.tsx b/src/ui/desktop/apps/file-manager/FileManager.tsx
index 2070153b..72a56006 100644
--- a/src/ui/desktop/apps/file-manager/FileManager.tsx
+++ b/src/ui/desktop/apps/file-manager/FileManager.tsx
@@ -1928,6 +1928,8 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
createIntent={createIntent}
onConfirmCreate={handleConfirmCreate}
onCancelCreate={handleCancelCreate}
+ onNewFile={handleCreateNewFile}
+ onNewFolder={handleCreateNewFolder}
/>
0 && index < filteredMenuItems.length - 1;
});
+ const renderShortcut = (shortcut: string) => {
+ const keys = shortcut.split("+");
+ if (keys.length === 1) {
+ return {keys[0]};
+ }
+ return (
+
+ {keys.map((key, index) => (
+ {key}
+ ))}
+
+ );
+ };
+
return (
<>
@@ -470,9 +485,9 @@ export function FileManagerContextMenu({
{item.label}
{item.shortcut && (
-
- {item.shortcut}
-
+
+ {renderShortcut(item.shortcut)}
+
)}
);
diff --git a/src/ui/desktop/apps/file-manager/FileManagerGrid.tsx b/src/ui/desktop/apps/file-manager/FileManagerGrid.tsx
index 786afa12..4f500ce8 100644
--- a/src/ui/desktop/apps/file-manager/FileManagerGrid.tsx
+++ b/src/ui/desktop/apps/file-manager/FileManagerGrid.tsx
@@ -92,6 +92,8 @@ interface FileManagerGridProps {
createIntent?: CreateIntent | null;
onConfirmCreate?: (name: string) => void;
onCancelCreate?: () => void;
+ onNewFile?: () => void;
+ onNewFolder?: () => void;
}
const getFileIcon = (file: FileItem, viewMode: "grid" | "list" = "grid") => {
@@ -192,6 +194,8 @@ export function FileManagerGrid({
createIntent,
onConfirmCreate,
onCancelCreate,
+ onNewFile,
+ onNewFolder,
}: FileManagerGridProps) {
const { t } = useTranslation();
const gridRef = useRef(null);
@@ -772,6 +776,42 @@ export function FileManagerGrid({
onUndo();
}
break;
+ case "d":
+ case "D":
+ if (
+ (event.ctrlKey || event.metaKey) &&
+ selectedFiles.length > 0 &&
+ onDownload
+ ) {
+ event.preventDefault();
+ onDownload(selectedFiles);
+ }
+ break;
+ case "n":
+ case "N":
+ if (event.ctrlKey || event.metaKey) {
+ event.preventDefault();
+ if (event.shiftKey && onNewFolder) {
+ onNewFolder();
+ } else if (!event.shiftKey && onNewFile) {
+ onNewFile();
+ }
+ }
+ break;
+ case "u":
+ case "U":
+ if ((event.ctrlKey || event.metaKey) && onUpload) {
+ event.preventDefault();
+ const input = document.createElement("input");
+ input.type = "file";
+ input.multiple = true;
+ input.onchange = (e) => {
+ const files = (e.target as HTMLInputElement).files;
+ if (files) onUpload(files);
+ };
+ input.click();
+ }
+ break;
case "Delete":
if (selectedFiles.length > 0 && onDelete) {
onDelete(selectedFiles);
@@ -783,6 +823,12 @@ export function FileManagerGrid({
onStartEdit(selectedFiles[0]);
}
break;
+ case "Enter":
+ if (selectedFiles.length === 1) {
+ event.preventDefault();
+ onFileOpen(selectedFiles[0]);
+ }
+ break;
case "y":
case "Y":
if (event.ctrlKey || event.metaKey) {