feat: locale picker closes if unfocused
This commit is contained in:
parent
3c1a9db3a5
commit
3b74fc00f1
1 changed files with 26 additions and 2 deletions
|
|
@ -1,8 +1,9 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { LOCALE_IDS, localeId, useLocale, type LocaleId } from "@/i18n";
|
import { LOCALE_IDS, localeId, useLocale, type LocaleId } from "@/i18n";
|
||||||
import { ref } from "vue";
|
import { onMounted, onUnmounted, ref, useTemplateRef } from "vue";
|
||||||
|
|
||||||
const isOpen = ref<boolean>(false);
|
const isOpen = ref<boolean>(false);
|
||||||
|
const dropdownRef = useTemplateRef("dropdown");
|
||||||
|
|
||||||
const toggleOpen = (): void => {
|
const toggleOpen = (): void => {
|
||||||
isOpen.value = !isOpen.value;
|
isOpen.value = !isOpen.value;
|
||||||
|
|
@ -11,10 +12,33 @@ const toggleOpen = (): void => {
|
||||||
const setLocaleId = (id: LocaleId): void => {
|
const setLocaleId = (id: LocaleId): void => {
|
||||||
localeId.value = id;
|
localeId.value = id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const detectFocus = (e: MouseEvent) => {
|
||||||
|
if (!isOpen) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dropdown = dropdownRef.value;
|
||||||
|
if (!dropdown) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { target } = e;
|
||||||
|
const focused =
|
||||||
|
target instanceof Node
|
||||||
|
&& (dropdown === target || dropdown.contains(target));
|
||||||
|
|
||||||
|
if (!focused) {
|
||||||
|
isOpen.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => window.addEventListener("click", detectFocus));
|
||||||
|
onUnmounted(() => window.removeEventListener("click", detectFocus));
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div :class="['dropdown', isOpen && 'is-active']">
|
<div :class="['dropdown', isOpen && 'is-active']" ref="dropdown">
|
||||||
<div class="dropdown-trigger">
|
<div class="dropdown-trigger">
|
||||||
<button
|
<button
|
||||||
class="button"
|
class="button"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue