🤔

Shadcnを使っていてF8でキーボードのフォーカスが取られる

2024/12/25に公開

shadcn を使っていて F8(半角カタカナ変換)がうまくいかない現象

shadcn を使用して開発しているプロジェクトで、F8キーを押すとキーボードのフォーカスが奪われてしまい半角カタカナに変換がうまくいかないという現象にぶつかってしまいました。
利用しているのUIライブラリなどを追っても中々原因が分からず困っていました。

そこで F8 という文字列でコードベースを検索してみると、下記のような interface が見つかりました。

interface ToastViewportProps extends PrimitiveOrderedListProps {
    /**
     * The keys to use as the keyboard shortcut that will move focus to the toast viewport.
     * @defaultValue ['F8']
     */
    hotkey?: string[];
    /**
     * An author-localized label for the toast viewport to provide context for screen reader users
     * when navigating page landmarks. The available `{hotkey}` placeholder will be replaced for you.
     * @defaultValue 'Notifications ({hotkey})'
     */
    label?: string;
}

どうやらこの Toaster が F8 を hotkey として割り当てて、remove などのショートカットキーとして扱っていたようです。

解決方法

そこで、hotkey を空文字にしてしまうことでキーを奪われないように対処しました。
該当の実装例は以下のようになります。

'use client'

import { Toast, ToastClose, ToastDescription, ToastProvider, ToastTitle, ToastViewport } from '@ui/components/ui/toast'
import { useToast } from '@ui/components/ui/use-toast'

export function Toaster() {
  const { toasts } = useToast()

  return (
    <ToastProvider>
      {toasts.map(function ({ id, title, description, action, ...props }) {
        return (
          <Toast key={id} {...props}>
            <div className="grid gap-1">
              {title && <ToastTitle>{title}</ToastTitle>}
              {description && <ToastDescription>{description}</ToastDescription>}
            </div>
            {action}
            <ToastClose />
          </Toast>
        )
      })}
      <ToastViewport hotkey={['']} />
    </ToastProvider>
  )
}

誰かの役に立てれば幸いです。
最後まで読んでいただき、ありがとうございました!

参考リンク

shadcn/ui Official Docs (Next.js)
Toaster

Discussion