diff --git a/apps/dashboard/src/components/compare/compare-form.tsx b/apps/dashboard/src/components/compare/compare-form.tsx
index fb09269..5b84891 100644
--- a/apps/dashboard/src/components/compare/compare-form.tsx
+++ b/apps/dashboard/src/components/compare/compare-form.tsx
@@ -66,6 +66,12 @@ export function CompareForm({
ref={titleRef}
value={title}
onChange={(e) => onTitleChange(e.target.value)}
+ onKeyDown={(event) => {
+ if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
+ event.preventDefault();
+ handleExecute();
+ }
+ }}
placeholder="Pull request title"
// biome-ignore lint/a11y/noAutofocus: intentional — this is a dedicated PR-creation page
autoFocus
@@ -80,6 +86,7 @@ export function CompareForm({
onChange={onBodyChange}
placeholder="Describe the changes…"
mentions={mentionConfig}
+ onModEnter={handleExecute}
/>
diff --git a/apps/dashboard/src/components/details/comment-reply-form.tsx b/apps/dashboard/src/components/details/comment-reply-form.tsx
index 4146ac7..fa9ef44 100644
--- a/apps/dashboard/src/components/details/comment-reply-form.tsx
+++ b/apps/dashboard/src/components/details/comment-reply-form.tsx
@@ -99,6 +99,10 @@ export function CommentReplyForm({
compact
media={mediaUpload}
onPaste={onMediaPaste}
+ onModEnter={() => {
+ if (!value.trim() || isSending || hasPendingUploads) return;
+ void handleSend();
+ }}
/>
{
+ if (!value.trim() || isSending || hasPendingUploads) return;
+ void handleSend();
+ }}
mentions={{
candidates: mentionCandidates,
onActivate: () => setMentionActivated(true),
diff --git a/apps/dashboard/src/components/issues/new/new-issue-page.tsx b/apps/dashboard/src/components/issues/new/new-issue-page.tsx
index dfc3a56..9a8e5fa 100644
--- a/apps/dashboard/src/components/issues/new/new-issue-page.tsx
+++ b/apps/dashboard/src/components/issues/new/new-issue-page.tsx
@@ -209,6 +209,13 @@ function NewIssueForm({
id="issue-title"
value={title}
onChange={(e) => setTitle(e.target.value)}
+ onKeyDown={(e) => {
+ if ((e.metaKey || e.ctrlKey) && e.key === "Enter") {
+ e.preventDefault();
+ if (!canSubmit) return;
+ void handleSubmit();
+ }
+ }}
placeholder="Issue title"
className="flex h-9 w-full rounded-md border bg-surface-1 px-3 py-1 text-sm outline-none transition-[box-shadow,border-color] placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]"
/>
@@ -224,6 +231,10 @@ function NewIssueForm({
onChange={setBody}
placeholder="Describe the issue..."
mentions={mentionConfig}
+ onModEnter={() => {
+ if (!canSubmit) return;
+ void handleSubmit();
+ }}
/>
diff --git a/apps/dashboard/src/components/pulls/detail/pull-body-section.tsx b/apps/dashboard/src/components/pulls/detail/pull-body-section.tsx
index 2e1862e..b87934f 100644
--- a/apps/dashboard/src/components/pulls/detail/pull-body-section.tsx
+++ b/apps/dashboard/src/components/pulls/detail/pull-body-section.tsx
@@ -89,6 +89,10 @@ export function PullBodySection({
value={draft}
onChange={setDraft}
placeholder="Write a description..."
+ onModEnter={() => {
+ if (isSaving) return;
+ void saveBody();
+ }}
/>
@@ -1533,6 +1540,13 @@ function MergeFooter({
id="merge-commit-desc"
value={commitDescription}
onChange={(e) => setCommitDescription(e.target.value)}
+ onKeyDown={(event) => {
+ if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
+ event.preventDefault();
+ if (isDisabled || !commitTitle.trim()) return;
+ void handleMerge();
+ }
+ }}
placeholder="Add an optional extended description..."
rows={3}
className="flex w-full rounded-md border bg-transparent px-3 py-2 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring resize-none"
@@ -2974,6 +2988,10 @@ function ReviewCommentBlock({
onChange={setReplyBody}
placeholder="Write a reply..."
compact
+ onModEnter={() => {
+ if (!replyBody.trim() || isSending) return;
+ void handleReply();
+ }}
/>