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