Gdzie wykorzystać ten przykład?
Menu aplikacji i rozbudowane interfejsy. Wariant „Paleta poleceń Ctrl+K” możesz dopasować do kolorów i treści swojej strony.
Jak działa ten efekt?
Przyciski, filtry i okna dialogowe przełączają widoczne akcje bez przeładowania strony.
Jak dodać go na stronę?
- Otwórz przykład w edytorze i podmień tekst oraz kolory.
- HTML wstaw w miejscu, w którym ma pojawić się element.
- CSS przenieś do arkusza stylów swojej strony. Reguły
body z podglądu dopasuj do własnego układu. - JavaScript uruchom po załadowaniu elementów HTML, na przykład przed zamknięciem
</body>. - Sprawdź działanie na telefonie, klawiaturą i z własną treścią.
Na co zwrócić uwagę?
Zastąp demonstracyjne komunikaty rzeczywistymi akcjami aplikacji. Sprawdź fokus i obsługę klawiaturą.
Co możesz zmienić w konfiguratorze?
Nagłówek, Kolor akcentu, Zaokrąglenie. W edytorze kodu możesz dodatkowo zmienić całą strukturę i zachowanie przykładu.
Gotowy kod: Paleta poleceń Ctrl+K
HTML
<section class="lab"><h2>Paleta poleceń Ctrl+K</h2><button class="command-open">Otwórz polecenia <kbd>Ctrl+K</kbd></button><p class="command-result" role="status"></p><dialog class="command-dialog"><input type="search" placeholder="Szukaj polecenia" aria-label="Szukaj polecenia"><div></div><button class="command-close">Zamknij</button></dialog></section>
CSS
*{box-sizing:border-box}body{margin:0;padding:35px 24px;background:#f4f5ef;color:#293322;font:15px/1.7 Arial,sans-serif;min-height:100vh;display:grid;place-items:center}button,input{font:inherit}button,a{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid #738858;outline-offset:4px}h2,h3,p{margin-top:0}[hidden]{display:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
.lab{max-width:800px;margin:25px auto;padding:25px;border:1px solid #d4dec9;border-radius:14px;background:#fff;color:#273724;font:15px/1.6 system-ui,sans-serif;overflow-wrap:anywhere}.lab *{box-sizing:border-box}.lab h2{font-size:23px;margin:0 0 25px;line-height:1.3}.lab h3{line-height:1.3}.lab label{display:block;margin:10px 0}.lab input:not([type=checkbox]):not([type=radio]),.lab select,.lab textarea{font:inherit;padding:9px;border:1px solid #bac9ad;border-radius:6px;max-width:100%;background:#fff;color:#273724}.lab input[type=range]{width:100%;accent-color:#6f8e58}.lab input[type=color]{height:45px;width:70px}.lab input[type=checkbox]{accent-color:#6f8e58;margin-right:8px}.lab textarea{width:100%}.lab button{font:inherit;font-weight:600;border:0;border-radius:14px;background:#6f8e58;color:#fff;padding:10px 16px;cursor:pointer}.lab button:disabled{opacity:.45;cursor:default}.lab :focus-visible{outline:3px solid #315f8b;outline-offset:3px}.lab pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f0f4e9;padding:15px;font:12px/1.6 monospace}.lab table{border-collapse:collapse;width:100%}.lab th,.lab td{padding:10px;text-align:left;border-bottom:1px solid #d9e3ce}.lab progress{accent-color:#6f8e58}.lab .lab-hint{font-size:11px;color:#687861;border-top:1px solid #dbe3d0;padding-top:16px;margin-top:25px}.lab [hidden]{display:none!important}@media(max-width:480px){.lab{padding:16px;margin:10px auto}.lab h2{font-size:20px}.lab table{font-size:12px}.lab th,.lab td{padding:7px}}@media(prefers-reduced-motion:reduce){.lab *{animation:none!important;transition:none!important}}
.command-dialog{width:min(450px,90vw);border:1px solid #b9c8a5;border-radius:12px;padding:20px}.command-dialog::backdrop{background:#17251788}.command-dialog input{width:100%;margin-bottom:15px}.command-dialog>div button{display:block;width:100%;text-align:left;margin:6px 0;background:#eef3e6;color:#314325}
JavaScript
const dialog=document.querySelector('.command-dialog'),input=dialog.querySelector('input'),list=dialog.querySelector('div'),commands=['Nowy projekt','Otwórz bibliotekę','Zapisz ustawienia','Pomoc'];function render(){list.replaceChildren();commands.filter(text=>text.toLowerCase().includes(input.value.toLowerCase())).forEach(text=>{const button=document.createElement('button');button.textContent=text;button.onclick=()=>{document.querySelector('.command-result').textContent='Wybrano: '+text;dialog.close()};list.append(button)})}function open(){if(!dialog.open)dialog.showModal();input.focus();render()}document.querySelector('.command-open').onclick=open;document.querySelector('.command-close').onclick=()=>dialog.close();input.oninput=render;input.onkeydown=e=>{if(e.key==='ArrowDown'){e.preventDefault();list.querySelector('button')?.focus()}};document.addEventListener('keydown',e=>{if((e.ctrlKey||e.metaKey)&&e.key==='k'){e.preventDefault();open()}});