Ember Example: UseKeyHold

import Component from '@glimmer/component'

import { on } from '@ember/modifier'

import { useKeyHold } from '@tanstack/ember-hotkeys'

class App extends Component {
  usage0 =
    "import { useKeyHold } from '@tanstack/ember-hotkeys'\n\nshift = useKeyHold(this, 'Shift')\n\n<template>\n  {{if this.shift.value 'Shift is pressed!' 'Press Shift'}}\n</template>"
  isShiftHeld = useKeyHold(this, 'Shift')
  isControlHeld = useKeyHold(this, 'Control')
  isAltHeld = useKeyHold(this, 'Alt')
  isMetaHeld = useKeyHold(this, 'Meta')
  isSpaceHeld = useKeyHold(this, 'Space')

  <template>
    <div class='app'>
      <header>
        <h1>useKeyHold</h1>
        <p>
          Returns a boolean indicating if a specific key is currently held.
          Optimized to only re-render when that specific key changes.
        </p>
      </header>

      <main>
        <section class='demo-section'>
          <h2>Modifier Key States</h2>
          <div class='modifier-grid'>
            <div class='modifier-indicator {{if this.isShiftHeld.value "active"}}'>
              <span class='key-name'>Shift</span>
              <span class='status'>
                {{if this.isShiftHeld.value 'HELD' 'Released'}}
              </span>
            </div>
            <div
              class='modifier-indicator {{if this.isControlHeld.value "active"}}'
            >
              <span class='key-name'>Control</span>
              <span class='status'>
                {{if this.isControlHeld.value 'HELD' 'Released'}}
              </span>
            </div>
            <div class='modifier-indicator {{if this.isAltHeld.value "active"}}'>
              <span class='key-name'>Alt / Option</span>
              <span class='status'>{{if
                  this.isAltHeld.value
                  'HELD'
                  'Released'
                }}</span>
            </div>
            <div class='modifier-indicator {{if this.isMetaHeld.value "active"}}'>
              <span class='key-name'>Meta (⌘ / ⊞)</span>
              <span class='status'>{{if
                  this.isMetaHeld.value
                  'HELD'
                  'Released'
                }}</span>
            </div>
          </div>
        </section>

        <section class='demo-section'>
          <h2>Space Bar Demo</h2>
          <div class='space-indicator {{if this.isSpaceHeld.value "active"}}'>
            {{if this.isSpaceHeld.value '🚀 SPACE HELD!' 'Hold Space Bar'}}
          </div>
        </section>

        <section class='demo-section'>
          <h2>Usage</h2>
          <pre class='code-block'>{{this.usage0}}</pre>
        </section>

        <section class='demo-section'>
          <h2>Conditional UI Example</h2>
          <p>
            Hold
            <kbd>Shift</kbd>
            to reveal the secret message:
          </p>
          <div class='secret-box {{if this.isShiftHeld.value "revealed"}}'>
            {{#if this.isShiftHeld.value}}<span>🎉 The secret password is:
                tanstack-hotkeys-rocks!</span>{{else}}<span
              >••••••••••••••••••••••••••</span>{{/if}}
          </div>
        </section>

        <section class='demo-section'>
          <h2>Use Cases</h2>
          <ul>
            <li>Show different UI based on modifier state</li>
            <li>Enable "power user" mode while holding a key</li>
            <li>Hold-to-reveal sensitive information</li>
            <li>Drag-and-drop with modifier behaviors</li>
            <li>Show additional options on hover + modifier</li>
          </ul>
        </section>
      </main>

    </div>
  </template>
}
export default App
import Component from '@glimmer/component'

import { on } from '@ember/modifier'

import { useKeyHold } from '@tanstack/ember-hotkeys'

class App extends Component {
  usage0 =
    "import { useKeyHold } from '@tanstack/ember-hotkeys'\n\nshift = useKeyHold(this, 'Shift')\n\n<template>\n  {{if this.shift.value 'Shift is pressed!' 'Press Shift'}}\n</template>"
  isShiftHeld = useKeyHold(this, 'Shift')
  isControlHeld = useKeyHold(this, 'Control')
  isAltHeld = useKeyHold(this, 'Alt')
  isMetaHeld = useKeyHold(this, 'Meta')
  isSpaceHeld = useKeyHold(this, 'Space')

  <template>
    <div class='app'>
      <header>
        <h1>useKeyHold</h1>
        <p>
          Returns a boolean indicating if a specific key is currently held.
          Optimized to only re-render when that specific key changes.
        </p>
      </header>

      <main>
        <section class='demo-section'>
          <h2>Modifier Key States</h2>
          <div class='modifier-grid'>
            <div class='modifier-indicator {{if this.isShiftHeld.value "active"}}'>
              <span class='key-name'>Shift</span>
              <span class='status'>
                {{if this.isShiftHeld.value 'HELD' 'Released'}}
              </span>
            </div>
            <div
              class='modifier-indicator {{if this.isControlHeld.value "active"}}'
            >
              <span class='key-name'>Control</span>
              <span class='status'>
                {{if this.isControlHeld.value 'HELD' 'Released'}}
              </span>
            </div>
            <div class='modifier-indicator {{if this.isAltHeld.value "active"}}'>
              <span class='key-name'>Alt / Option</span>
              <span class='status'>{{if
                  this.isAltHeld.value
                  'HELD'
                  'Released'
                }}</span>
            </div>
            <div class='modifier-indicator {{if this.isMetaHeld.value "active"}}'>
              <span class='key-name'>Meta (⌘ / ⊞)</span>
              <span class='status'>{{if
                  this.isMetaHeld.value
                  'HELD'
                  'Released'
                }}</span>
            </div>
          </div>
        </section>

        <section class='demo-section'>
          <h2>Space Bar Demo</h2>
          <div class='space-indicator {{if this.isSpaceHeld.value "active"}}'>
            {{if this.isSpaceHeld.value '🚀 SPACE HELD!' 'Hold Space Bar'}}
          </div>
        </section>

        <section class='demo-section'>
          <h2>Usage</h2>
          <pre class='code-block'>{{this.usage0}}</pre>
        </section>

        <section class='demo-section'>
          <h2>Conditional UI Example</h2>
          <p>
            Hold
            <kbd>Shift</kbd>
            to reveal the secret message:
          </p>
          <div class='secret-box {{if this.isShiftHeld.value "revealed"}}'>
            {{#if this.isShiftHeld.value}}<span>🎉 The secret password is:
                tanstack-hotkeys-rocks!</span>{{else}}<span
              >••••••••••••••••••••••••••</span>{{/if}}
          </div>
        </section>

        <section class='demo-section'>
          <h2>Use Cases</h2>
          <ul>
            <li>Show different UI based on modifier state</li>
            <li>Enable "power user" mode while holding a key</li>
            <li>Hold-to-reveal sensitive information</li>
            <li>Drag-and-drop with modifier behaviors</li>
            <li>Show additional options on hover + modifier</li>
          </ul>
        </section>
      </main>

    </div>
  </template>
}
export default App