From 8533b4046a262cf01d85b014a4e3ac6175575f14 Mon Sep 17 00:00:00 2001 From: Greg Brimble Date: Thu, 28 Aug 2025 13:28:55 -0400 Subject: [PATCH] Add keyboardShortcuts property to allow users to customize shortcuts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR feedback: remove docs changes and update bundle size limits - Remove documentation changes from api.mdx (not needed in v3 backport) - Update bundlesize.config.json limits: - docsearch-react: 27 kB → 27.5 kB - docsearch-js: 35.5 kB → 36 kB 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- bundlesize.config.json | 4 +- packages/docsearch-react/src/DocSearch.tsx | 17 +- .../docsearch-react/src/DocSearchButton.tsx | 14 +- .../src/__tests__/keyboardShortcuts.test.tsx | 152 ++++++++++++++++++ .../src/constants/keyboardShortcuts.ts | 24 +++ .../src/types/KeyboardShortcuts.ts | 14 ++ packages/docsearch-react/src/types/index.ts | 1 + .../src/useDocSearchKeyboardEvents.ts | 17 +- 8 files changed, 231 insertions(+), 12 deletions(-) create mode 100644 packages/docsearch-react/src/__tests__/keyboardShortcuts.test.tsx create mode 100644 packages/docsearch-react/src/constants/keyboardShortcuts.ts create mode 100644 packages/docsearch-react/src/types/KeyboardShortcuts.ts diff --git a/bundlesize.config.json b/bundlesize.config.json index 3d00a7813..ddf04030e 100644 --- a/bundlesize.config.json +++ b/bundlesize.config.json @@ -6,11 +6,11 @@ }, { "path": "packages/docsearch-react/dist/umd/index.js", - "maxSize": "27 kB" + "maxSize": "27.5 kB" }, { "path": "packages/docsearch-js/dist/umd/index.js", - "maxSize": "35.5 kB" + "maxSize": "36 kB" } ] } diff --git a/packages/docsearch-react/src/DocSearch.tsx b/packages/docsearch-react/src/DocSearch.tsx index 54668a90c..cbbcd953b 100644 --- a/packages/docsearch-react/src/DocSearch.tsx +++ b/packages/docsearch-react/src/DocSearch.tsx @@ -5,7 +5,13 @@ import { createPortal } from 'react-dom'; import { DocSearchButton } from './DocSearchButton'; import { DocSearchModal } from './DocSearchModal'; -import type { DocSearchHit, DocSearchTheme, InternalDocSearchHit, StoredDocSearchHit } from './types'; +import type { + DocSearchHit, + DocSearchTheme, + InternalDocSearchHit, + KeyboardShortcuts, + StoredDocSearchHit, +} from './types'; import { useDocSearchKeyboardEvents } from './useDocSearchKeyboardEvents'; import { useTheme } from './useTheme'; @@ -41,6 +47,7 @@ export interface DocSearchProps { translations?: DocSearchTranslations; getMissingResultsUrl?: ({ query }: { query: string }) => string; insights?: AutocompleteOptions['insights']; + keyboardShortcuts?: KeyboardShortcuts; } export function DocSearch({ ...props }: DocSearchProps): JSX.Element { @@ -71,12 +78,18 @@ export function DocSearch({ ...props }: DocSearchProps): JSX.Element { onClose, onInput, searchButtonRef, + keyboardShortcuts: props.keyboardShortcuts, }); useTheme({ theme: props.theme }); return ( <> - + {isOpen && createPortal( diff --git a/packages/docsearch-react/src/DocSearchButton.tsx b/packages/docsearch-react/src/DocSearchButton.tsx index 50db9aa2e..ece64dbcb 100644 --- a/packages/docsearch-react/src/DocSearchButton.tsx +++ b/packages/docsearch-react/src/DocSearchButton.tsx @@ -1,8 +1,9 @@ import React, { useEffect, useState, type JSX } from 'react'; +import { getKeyboardShortcuts } from './constants/keyboardShortcuts'; import { ControlKeyIcon } from './icons/ControlKeyIcon'; import { SearchIcon } from './icons/SearchIcon'; -import type { DocSearchTheme } from './types'; +import type { DocSearchTheme, KeyboardShortcuts } from './types'; import { useTheme } from './useTheme'; export type ButtonTranslations = Partial<{ @@ -13,6 +14,7 @@ export type ButtonTranslations = Partial<{ export type DocSearchButtonProps = React.ComponentProps<'button'> & { theme?: DocSearchTheme; translations?: ButtonTranslations; + keyboardShortcuts?: KeyboardShortcuts; }; const ACTION_KEY_DEFAULT = 'Ctrl' as const; @@ -23,8 +25,9 @@ function isAppleDevice(): boolean { } export const DocSearchButton = React.forwardRef( - ({ translations = {}, ...props }, ref) => { + ({ translations = {}, keyboardShortcuts, ...props }, ref) => { const { buttonText = 'Search', buttonAriaLabel = 'Search' } = translations; + const resolvedShortcuts = getKeyboardShortcuts(keyboardShortcuts); const [key, setKey] = useState(null); useTheme({ theme: props.theme }); @@ -40,14 +43,15 @@ export const DocSearchButton = React.forwardRef] as const) : (['Meta', 'Meta', key] as const); + const isCtrlCmdKEnabled = resolvedShortcuts['Ctrl/Cmd+K']; const shortcut = `${actionKeyAltText}+k`; return (