Docs
CodeRabbit
Cloudflare
AG Grid
SerpAPI
Netlify
OpenRouter
Neon
WorkOS
Clerk
Convex
Electric
PowerSync
Sentry
Railway
Prisma
Strapi
Unkey
CodeRabbit
Cloudflare
AG Grid
SerpAPI
Netlify
OpenRouter
Neon
WorkOS
Clerk
Convex
Electric
PowerSync
Sentry
Railway
Prisma
Strapi
Unkey
API Reference
Hotkeys API Reference
Hotkey Sequence API Reference
Key Hold API Reference
Held Keys API Reference
Hotkey Recorder API Reference
Format for Display API Reference

Svelte Example: Get Held Keys

svelte
<script lang="ts">
  import {
    formatKeyForDebuggingDisplay,
    getHeldKeys,
    getHeldKeyCodesMap,
  } from '@tanstack/svelte-hotkeys'

  const heldKeys = getHeldKeys()
  const heldKeyCodesMap = getHeldKeyCodesMap()

  let history = $state<Array<string>>([])

  $effect(() => {
    if (heldKeys.keys.length > 0) {
      const combo = heldKeys.keys
        .map((k) => formatKeyForDebuggingDisplay(k))
        .join(' + ')
      if (history[history.length - 1] !== combo) {
        history = [...history.slice(-9), combo]
      }
    }
  })
</script>

<div class="app">
  <header>
    <h1>getHeldKeys</h1>
    <p>
      Returns an array of all currently pressed keys. Useful for displaying key
      combinations or building custom shortcut recording.
    </p>
  </header>

  <main>
    <section class="demo-section">
      <h2>Currently Held Keys</h2>
      <div class="key-display">
        {#if heldKeys.keys.length > 0}
          {#each heldKeys.keys as key, index}
            {@const code = heldKeyCodesMap.codes[key]}
            {#if index > 0}
              <span class="plus">+</span>
            {/if}
            <kbd class="large">
              {formatKeyForDebuggingDisplay(key)}
              {#if code && code !== key}
                <small class="code-label">
                  {formatKeyForDebuggingDisplay(code, {
                    source: 'code',
                  })}
                </small>
              {/if}
            </kbd>
          {/each}
        {:else}
          <span class="placeholder">Press any keys...</span>
        {/if}
      </div>
      <div class="stats">
        Keys held: <strong>{heldKeys.keys.length}</strong>
      </div>
    </section>

    <section class="demo-section">
      <h2>Usage</h2>
      <pre
        class="code-block">{`import { getHeldKeys } from '@tanstack/svelte-hotkeys'

const heldKeys = getHeldKeys()

// In template:
// Currently pressed: {heldKeys.keys.join(' + ') || 'None'}`}</pre>
    </section>

    <section class="demo-section">
      <h2>Try These Combinations</h2>
      <ul>
        <li>
          Hold <kbd>Shift</kbd> + <kbd>Control</kbd> + <kbd>A</kbd>
        </li>
        <li>Press multiple letter keys at once</li>
        <li>Hold modifiers and watch them appear</li>
        <li>Release keys one by one</li>
      </ul>
    </section>

    <section class="demo-section">
      <h2>Recent Combinations</h2>
      {#if history.length > 0}
        <ul class="history-list">
          {#each history as combo}
            <li>{combo}</li>
          {/each}
        </ul>
        <button onclick={() => (history = [])}>Clear History</button>
      {:else}
        <p class="placeholder">Press some key combinations...</p>
      {/if}
    </section>

    <section class="demo-section">
      <h2>Use Cases</h2>
      <ul>
        <li>Building a keyboard shortcut recorder</li>
        <li>Displaying currently held keys to users</li>
        <li>Debugging keyboard input</li>
        <li>Creating key combination tutorials</li>
      </ul>
    </section>
  </main>
</div>