${this.shortcutConflict.newKey} is already bound to
${ConfigPage.SHORTCUT_META[this.shortcutConflict.existingAction]?.label ?? this.shortcutConflict.existingAction}.
` : ''}
`;
}
```
7. **Call `renderShortcutsSection()`** from the main render method. Insert `${this.renderShortcutsSection()}` in the template — place it between "Track List Columns" and "Library" sections, or after Library. Look at the current render layout to find the best spot.
8. **Add CSS styles** for the shortcuts section:
```css
.shortcut-category {
margin-bottom: 16px;
}
.shortcut-category-header {
font-size: var(--yj-text-sm, 13px);
font-weight: 600;
color: var(--yj-text-secondary, #aaa);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 8px;
padding-bottom: 4px;
border-bottom: 1px solid var(--yj-border, #444);
}
.shortcut-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 0;
gap: 16px;
}
.shortcut-label {
font-size: var(--yj-text-sm, 13px);
color: var(--yj-text-primary, #eee);
}
.shortcut-scope {
font-size: var(--yj-text-xs, 11px);
color: var(--yj-text-tertiary, #888);
margin-left: 4px;
}
.shortcut-actions {
margin-top: 16px;
display: flex;
justify-content: flex-end;
}
.conflict-banner {
margin-top: 12px;
padding: 12px;
background: rgba(255, 165, 0, 0.1);
border: 1px solid rgba(255, 165, 0, 0.4);
border-radius: 6px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.conflict-text {
font-size: var(--yj-text-sm, 13px);
}
.conflict-actions {
display: flex;
gap: 8px;
flex-shrink: 0;
}
```
cd frontend && npx tsc --noEmit 2>&1 | head -20Keyboard Shortcuts section renders in the config page with shortcuts grouped by category (Player, Navigation, App). Each row shows label + shortcut-capture widget. Conflict detection warns before overwriting. "Reset All to Defaults" and per-shortcut reset work. Panel-specific shortcuts show their scope label.
```bash
cd frontend && npx tsc --noEmit
```
TypeScript compiles. shortcut-capture component and shortcuts section are properly wired.
- `shortcut-capture` component exists and handles recording, Escape cancel, blur cancel, reset
- Config page has a "Keyboard Shortcuts" section with category headers
- All 16 default shortcuts are listed with their labels
- Clicking a capture widget enters recording mode, pressing a key updates the binding
- Conflicts are detected and shown in a warning banner with Overwrite/Cancel options
- "Reset All to Defaults" button calls store.resetAll()
- Per-shortcut reset icon appears on hover when binding differs from default
- Panel-specific shortcuts show their scope (e.g., "track-list") next to the label