aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/components')
-rw-r--r--apps/web/components/dashboard/bookmarks/EditorCard.tsx34
-rw-r--r--apps/web/components/ui/kbd.tsx28
2 files changed, 35 insertions, 27 deletions
diff --git a/apps/web/components/dashboard/bookmarks/EditorCard.tsx b/apps/web/components/dashboard/bookmarks/EditorCard.tsx
index b80cd889..fa752c5f 100644
--- a/apps/web/components/dashboard/bookmarks/EditorCard.tsx
+++ b/apps/web/components/dashboard/bookmarks/EditorCard.tsx
@@ -1,8 +1,8 @@
import type { SubmitErrorHandler, SubmitHandler } from "react-hook-form";
-import React, { useEffect, useImperativeHandle, useRef } from "react";
+import React, { useImperativeHandle, useRef } from "react";
import { ActionButton } from "@/components/ui/action-button";
import { Form, FormControl, FormItem } from "@/components/ui/form";
-import InfoTooltip from "@/components/ui/info-tooltip";
+import { Kbd } from "@/components/ui/kbd";
import MultipleChoiceDialog from "@/components/ui/multiple-choice-dialog";
import { Separator } from "@/components/ui/separator";
import { Textarea } from "@/components/ui/textarea";
@@ -17,6 +17,7 @@ import {
import { cn, getOS } from "@/lib/utils";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
+import { useHotkeys } from "react-hotkeys-hook";
import { z } from "zod";
import { useCreateBookmarkWithPostHook } from "@karakeep/shared-react/hooks/bookmarks";
@@ -24,27 +25,6 @@ import { BookmarkTypes } from "@karakeep/shared/types/bookmarks";
import { useUploadAsset } from "../UploadDropzone";
-function useFocusOnKeyPress(
- inputRef: React.RefObject<HTMLTextAreaElement | null>,
-) {
- useEffect(() => {
- function handleKeyPress(e: KeyboardEvent) {
- if (!inputRef.current) {
- return;
- }
- if ((e.metaKey || e.ctrlKey) && e.code === "KeyE") {
- inputRef.current.focus();
- e.preventDefault();
- }
- }
-
- document.addEventListener("keydown", handleKeyPress);
- return () => {
- document.removeEventListener("keydown", handleKeyPress);
- };
- }, [inputRef]);
-}
-
interface MultiUrlImportState {
urls: URL[];
text: string;
@@ -70,7 +50,9 @@ export default function EditorCard({ className }: { className?: string }) {
});
const { ref, ...textFieldProps } = form.register("text");
useImperativeHandle(ref, () => inputRef.current);
- useFocusOnKeyPress(inputRef);
+ useHotkeys("mod+e", () => {
+ inputRef.current?.focus();
+ });
const { mutate, isPending } = useCreateBookmarkWithPostHook({
onSuccess: (resp) => {
@@ -215,9 +197,7 @@ export default function EditorCard({ className }: { className?: string }) {
>
<div className="flex justify-between">
<p className="text-sm">{t("editor.new_item")}</p>
- <InfoTooltip size={15}>
- <p className="text-center">{t("editor.quickly_focus")}</p>
- </InfoTooltip>
+ <Kbd>⌘ + E</Kbd>
</div>
<Separator />
<FormItem className="flex-1">
diff --git a/apps/web/components/ui/kbd.tsx b/apps/web/components/ui/kbd.tsx
new file mode 100644
index 00000000..5bc48405
--- /dev/null
+++ b/apps/web/components/ui/kbd.tsx
@@ -0,0 +1,28 @@
+import { cn } from "@/lib/utils";
+
+function Kbd({ className, ...props }: React.ComponentProps<"kbd">) {
+ return (
+ <kbd
+ data-slot="kbd"
+ className={cn(
+ "pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground",
+ "[&_svg:not([class*='size-'])]:size-3",
+ "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
+ className,
+ )}
+ {...props}
+ />
+ );
+}
+
+function KbdGroup({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+ <kbd
+ data-slot="kbd-group"
+ className={cn("inline-flex items-center gap-1", className)}
+ {...props}
+ />
+ );
+}
+
+export { Kbd, KbdGroup };