Browse Source

Focus menu on open and key events

gh-pages
Conor_Mack 6 years ago
parent
commit
fab2a4d23b
  1. 33
      packages/builder/src/components/userInterface/OptionSelect.svelte

33
packages/builder/src/components/userInterface/OptionSelect.svelte

@ -26,20 +26,22 @@
onMount(() => { onMount(() => {
if (select) { if (select) {
select.addEventListener("keydown", addSelectKeyEvents) select.addEventListener("keydown", handleEnter)
selectMenu.addEventListener("keydown", handleEscape)
} }
containerEl = document.querySelector(".design-view-property-groups")
return () => { return () => {
select.removeEventListener("keydown", addSelectKeyEvents) select.removeEventListener("keydown", handleEnter)
containerEl.removeEventListener("scroll", disableScroll) selectMenu.removeEventListener("keydown", handleEscape)
} }
}) })
function disableScroll(e) { function handleEscape(e) {
containerEl.scrollTop = scrollTop if(open && e.key === "Escape") {
toggleSelect(false)
}
} }
function getDimensions() { function getDimensions() {
@ -61,28 +63,19 @@
dimensions = {[positionSide]: y, left} dimensions = {[positionSide]: y, left}
} }
function addSelectKeyEvents(e) { function handleEnter(e) {
if (e.key === "Enter") { if (!open && e.key === "Enter") {
if (!open) {
toggleSelect(true) toggleSelect(true)
} }
} else if (e.key === "Escape") {
if (open) {
toggleSelect(false)
}
}
} }
function toggleSelect(isOpen) { function toggleSelect(isOpen) {
getDimensions() getDimensions()
if (isOpen) { if (isOpen) {
icon.style.transform = "rotate(180deg)" icon.style.transform = "rotate(180deg)"
let containerWidth = containerEl.offsetWidth selectMenu.focus()
scrollTop = containerEl.scrollTop
containerEl.addEventListener("scroll", disableScroll)
} else { } else {
icon.style.transform = "rotate(0deg)" icon.style.transform = "rotate(0deg)"
containerEl.removeEventListener("scroll", disableScroll)
} }
open = isOpen open = isOpen
} }
@ -121,6 +114,7 @@
</div> </div>
<Portal> <Portal>
<div <div
tabindex="0"
bind:this={selectMenu} bind:this={selectMenu}
style={menuStyle} style={menuStyle}
class="bb-select-menu" class="bb-select-menu"
@ -204,6 +198,7 @@
.bb-select-menu { .bb-select-menu {
position: absolute; position: absolute;
display: flex; display: flex;
outline: none;
box-sizing: border-box; box-sizing: border-box;
flex-direction: column; flex-direction: column;
opacity: 0; opacity: 0;

Loading…
Cancel
Save