fix(ui): remove inert state when modal is closed; buttons are forced to be hidden on desktop
This commit is contained in:
parent
33ef977860
commit
008d8e2a8a
|
@ -1,5 +1,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { type ColorProps, type DefaultProps, propsToColor } from '~/composables/colors';
|
import { type ColorProps, type DefaultProps, propsToColor } from '~/composables/colors';
|
||||||
|
import { watchEffect } from 'vue';
|
||||||
|
import onKeyboardShortcut from '~/composables/onKeyboardShortcut';
|
||||||
|
|
||||||
import Button from '~/components/ui/Button.vue'
|
import Button from '~/components/ui/Button.vue'
|
||||||
import Spacer from '~/components/ui/layout/Spacer.vue'
|
import Spacer from '~/components/ui/layout/Spacer.vue'
|
||||||
|
@ -10,9 +12,15 @@ const { title, overPopover = false, ...colorProps } = defineProps<{
|
||||||
} & (ColorProps | DefaultProps) >()
|
} & (ColorProps | DefaultProps) >()
|
||||||
const isOpen = defineModel<boolean>({ default:false })
|
const isOpen = defineModel<boolean>({ default:false })
|
||||||
|
|
||||||
|
watchEffect(() =>
|
||||||
|
isOpen.value ?
|
||||||
|
document.querySelector('#app')?.setAttribute('inert', 'true') : document.querySelector('#app')?.removeAttribute('inert')
|
||||||
|
)
|
||||||
|
|
||||||
|
onKeyboardShortcut('escape', () => isOpen.value = false)
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - [ ] Trap focus while open
|
// When overflowing content: Add inset shadow to indicate scrollability
|
||||||
// - [ ] Close on ESC (Implement a global stack of closable/focusable elements)
|
|
||||||
// - [ ] Add aria role to inform screenreaders
|
// - [ ] Add aria role to inform screenreaders
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -47,7 +55,7 @@ const isOpen = defineModel<boolean>({ default:false })
|
||||||
<div v-if="$slots.actions" class="modal-actions">
|
<div v-if="$slots.actions" class="modal-actions">
|
||||||
<slot name="actions" />
|
<slot name="actions" />
|
||||||
</div>
|
</div>
|
||||||
<Spacer :size="128" v-else />
|
<Spacer :size="64" v-else />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
|
@ -38,3 +38,8 @@ onKeyboardShortcut('h', () => isShortcutsModalOpen.value = !isShortcutsModalOpen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<style>
|
||||||
|
body:has(#app[inert="true"]) {
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -304,7 +304,7 @@ const uploads = useUploadsStore()
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
:global(.hide-on-desktop){
|
:global(.hide-on-desktop){
|
||||||
display: none;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
:global(.hide-on-mobile){
|
:global(.hide-on-mobile){
|
||||||
|
|
Loading…
Reference in New Issue