diff --git a/src/lib/components/admin/AdminSegmentedController.svelte b/src/lib/components/admin/AdminSegmentedController.svelte index 698cc0e..33887db 100644 --- a/src/lib/components/admin/AdminSegmentedController.svelte +++ b/src/lib/components/admin/AdminSegmentedController.svelte @@ -1,6 +1,7 @@ @@ -66,7 +56,11 @@ {/snippet} - + (showDropdown = !showDropdown)} diff --git a/src/lib/components/admin/ProjectListItem.svelte b/src/lib/components/admin/ProjectListItem.svelte index 409aca9..b3f61ac 100644 --- a/src/lib/components/admin/ProjectListItem.svelte +++ b/src/lib/components/admin/ProjectListItem.svelte @@ -2,6 +2,7 @@ import { goto } from '$app/navigation' import { createEventDispatcher, onMount } from 'svelte' import AdminByline from './AdminByline.svelte' + import { clickOutside } from '$lib/actions/clickOutside' import type { AdminProject } from '$lib/types/admin' @@ -48,6 +49,10 @@ function handleToggleDropdown(event: MouseEvent) { event.stopPropagation() + // Close all other dropdowns before toggling this one + if (!isDropdownOpen) { + document.dispatchEvent(new CustomEvent('closeDropdowns')) + } isDropdownOpen = !isDropdownOpen } @@ -63,6 +68,10 @@ dispatch('delete', { project }) } + function handleClickOutside() { + isDropdownOpen = false + } + onMount(() => { function handleCloseDropdowns() { isDropdownOpen = false @@ -99,7 +108,11 @@ /> - + import type { Editor } from '@tiptap/core' import ColorPicker, { ChromeVariant } from 'svelte-awesome-color-picker' + import { clickOutside } from '$lib/actions/clickOutside' interface Props { editor: Editor @@ -97,30 +98,10 @@ applyColor(color) onClose() } - - function handleClickOutside(e: MouseEvent) { - if (isOpen) { - // Check if click is inside the color picker popup - const pickerElement = document.querySelector('.bubble-color-picker') - if (pickerElement && !pickerElement.contains(e.target as Node)) { - onClose() - } - } - } - - $effect(() => { - if (isOpen) { - // Add a small delay to prevent immediate closing - setTimeout(() => { - document.addEventListener('click', handleClickOutside) - }, 10) - return () => document.removeEventListener('click', handleClickOutside) - } - }) {#if isOpen} - + {mode === 'text' ? 'Text Color' : 'Highlight Color'} Remove diff --git a/src/lib/components/admin/composer/BubbleTextStyleMenu.svelte b/src/lib/components/admin/composer/BubbleTextStyleMenu.svelte index 1009f35..8644bef 100644 --- a/src/lib/components/admin/composer/BubbleTextStyleMenu.svelte +++ b/src/lib/components/admin/composer/BubbleTextStyleMenu.svelte @@ -1,5 +1,6 @@ {#if isOpen} - + {#each textStyles as style} - import { onMount } from 'svelte' import { goto, invalidate } from '$app/navigation' import AdminPage from '$lib/components/admin/AdminPage.svelte' import AdminHeader from '$lib/components/admin/AdminHeader.svelte' @@ -68,18 +67,6 @@ const statusFilterOptions = [ { value: 'status-draft', label: 'Draft first' } ] - onMount(() => { - document.addEventListener('click', handleOutsideClick) - return () => document.removeEventListener('click', handleOutsideClick) - }) - - function handleOutsideClick(event: MouseEvent) { - const target = event.target as HTMLElement - if (!target.closest('.dropdown-container')) { - document.dispatchEvent(new CustomEvent('closeDropdowns')) - } - } - function handleNewEssay() { goto('/admin/posts/new?type=essay') } diff --git a/src/routes/admin/projects/+page.svelte b/src/routes/admin/projects/+page.svelte index bdbf43b..ce1187f 100644 --- a/src/routes/admin/projects/+page.svelte +++ b/src/routes/admin/projects/+page.svelte @@ -1,5 +1,4 @@