mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-30 08:42:00 +00:00 
			
		
		
		
	Improve Mobile UI for dialogs and action dropdowns (#16222)
* fix: Always show conversation item actions * feat: Improve Alert Dialog and Dialog mobile UI * feat: Add settings reset to default confirmation * fix: Close Edit dialog on save * chore: update webui build output * webui: implement proper z-index system and scroll management - Add CSS variable for centralized z-index control - Fix dropdown positioning with Settings dialog conflicts - Prevent external scroll interference with proper event handling - Clean up hardcoded z-index values for maintainable architecture * webui: ensured the settings dialog enforces dynamic viewport height on mobile while retaining existing desktop sizing overrides * feat: Use `dvh` instead of computed px height for dialogs max height on mobile * chore: update webui build output * feat: Improve Settings fields UI * chore: update webui build output * chore: update webui build output --------- Co-authored-by: Pascal <admin@serveurperso.com>
This commit is contained in:
		 Aleksander Grygier
					Aleksander Grygier
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							66bb7985c3
						
					
				
				
					commit
					3a2bdcda0b
				
			| @@ -1,4 +1,5 @@ | ||||
| <script lang="ts"> | ||||
| 	import { onDestroy, onMount } from 'svelte'; | ||||
| 	import { Select as SelectPrimitive } from 'bits-ui'; | ||||
| 	import SelectScrollUpButton from './select-scroll-up-button.svelte'; | ||||
| 	import SelectScrollDownButton from './select-scroll-down-button.svelte'; | ||||
| @@ -14,6 +15,76 @@ | ||||
| 	}: WithoutChild<SelectPrimitive.ContentProps> & { | ||||
| 		portalProps?: SelectPrimitive.PortalProps; | ||||
| 	} = $props(); | ||||
|  | ||||
| 	let cleanupInternalListeners: (() => void) | undefined; | ||||
|  | ||||
| 	onMount(() => { | ||||
| 		const listenerOptions: AddEventListenerOptions = { passive: false }; | ||||
|  | ||||
| 		const blockOutsideWheel = (event: WheelEvent) => { | ||||
| 			if (!ref) { | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			const target = event.target as Node | null; | ||||
|  | ||||
| 			if (!target || !ref.contains(target)) { | ||||
| 				event.preventDefault(); | ||||
| 				event.stopPropagation(); | ||||
| 			} | ||||
| 		}; | ||||
|  | ||||
| 		const blockOutsideTouchMove = (event: TouchEvent) => { | ||||
| 			if (!ref) { | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			const target = event.target as Node | null; | ||||
|  | ||||
| 			if (!target || !ref.contains(target)) { | ||||
| 				event.preventDefault(); | ||||
| 				event.stopPropagation(); | ||||
| 			} | ||||
| 		}; | ||||
|  | ||||
| 		document.addEventListener('wheel', blockOutsideWheel, listenerOptions); | ||||
| 		document.addEventListener('touchmove', blockOutsideTouchMove, listenerOptions); | ||||
|  | ||||
| 		return () => { | ||||
| 			document.removeEventListener('wheel', blockOutsideWheel, listenerOptions); | ||||
| 			document.removeEventListener('touchmove', blockOutsideTouchMove, listenerOptions); | ||||
| 		}; | ||||
| 	}); | ||||
|  | ||||
| 	$effect(() => { | ||||
| 		const element = ref; | ||||
|  | ||||
| 		cleanupInternalListeners?.(); | ||||
|  | ||||
| 		if (!element) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		const stopWheelPropagation = (event: WheelEvent) => { | ||||
| 			event.stopPropagation(); | ||||
| 		}; | ||||
|  | ||||
| 		const stopTouchPropagation = (event: TouchEvent) => { | ||||
| 			event.stopPropagation(); | ||||
| 		}; | ||||
|  | ||||
| 		element.addEventListener('wheel', stopWheelPropagation); | ||||
| 		element.addEventListener('touchmove', stopTouchPropagation); | ||||
|  | ||||
| 		cleanupInternalListeners = () => { | ||||
| 			element.removeEventListener('wheel', stopWheelPropagation); | ||||
| 			element.removeEventListener('touchmove', stopTouchPropagation); | ||||
| 		}; | ||||
| 	}); | ||||
|  | ||||
| 	onDestroy(() => { | ||||
| 		cleanupInternalListeners?.(); | ||||
| 	}); | ||||
| </script> | ||||
|  | ||||
| <SelectPrimitive.Portal {...portalProps}> | ||||
| @@ -22,7 +93,7 @@ | ||||
| 		{sideOffset} | ||||
| 		data-slot="select-content" | ||||
| 		class={cn( | ||||
| 			'relative z-50 max-h-(--bits-select-content-available-height) min-w-[8rem] origin-(--bits-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:translate-y-1 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:-translate-x-1 data-[side=left]:slide-in-from-right-2 data-[side=right]:translate-x-1 data-[side=right]:slide-in-from-left-2 data-[side=top]:-translate-y-1 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95', | ||||
| 			'relative z-[var(--layer-popover,1000000)] max-h-(--bits-select-content-available-height) min-w-[8rem] origin-(--bits-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:translate-y-1 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:-translate-x-1 data-[side=left]:slide-in-from-right-2 data-[side=right]:translate-x-1 data-[side=right]:slide-in-from-left-2 data-[side=top]:-translate-y-1 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95', | ||||
| 			className | ||||
| 		)} | ||||
| 		{...restProps} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user