diff --git a/src/lib/components/units/CharacterUnit.svelte b/src/lib/components/units/CharacterUnit.svelte
index 4bd3d492..2018e5ae 100644
--- a/src/lib/components/units/CharacterUnit.svelte
+++ b/src/lib/components/units/CharacterUnit.svelte
@@ -4,12 +4,13 @@
import type { Job } from '$lib/types/api/entities'
import { getContext } from 'svelte'
import Icon from '$lib/components/Icon.svelte'
- import ContextMenu from '$lib/components/ui/ContextMenu.svelte'
- import { ContextMenu as ContextMenuBase, DropdownMenu as DropdownMenuBase } from 'bits-ui'
+ import UnitMenuContainer from '$lib/components/ui/menu/UnitMenuContainer.svelte'
+ import MenuItems from '$lib/components/ui/menu/MenuItems.svelte'
import UncapIndicator from '$lib/components/uncap/UncapIndicator.svelte'
import { getCharacterImageWithPose } from '$lib/utils/images'
import { openDetailsSidebar } from '$lib/features/details/openDetailsSidebar.svelte'
import { getJobPortraitUrl, Gender } from '$lib/utils/jobUtils'
+ import { sidebar } from '$lib/stores/sidebar.svelte'
import perpetuityFilled from '$src/assets/icons/perpetuity/filled.svg'
import perpetuityEmpty from '$src/assets/icons/perpetuity/empty.svg'
import * as m from '$lib/paraglide/messages'
@@ -70,6 +71,31 @@
// Check if this is the protagonist slot
const isProtagonist = $derived(position === 0)
+ // Check if this item is currently active in the sidebar
+ let isActive = $derived(item?.id && sidebar.activeItemId === String(item.id))
+
+ // Determine element class for focus ring
+ let elementClass = $derived.by(() => {
+ const element = item?.character?.element || partyElement
+
+ switch (element) {
+ case 1:
+ return 'wind'
+ case 2:
+ return 'fire'
+ case 3:
+ return 'water'
+ case 4:
+ return 'earth'
+ case 5:
+ return 'dark'
+ case 6:
+ return 'light'
+ default:
+ return 'neutral'
+ }
+ })
+
async function remove() {
if (!item?.id) return
try {
@@ -140,86 +166,88 @@
}
-
diff --git a/src/lib/components/units/SummonUnit.svelte b/src/lib/components/units/SummonUnit.svelte
index 81f1158e..e0f621b1 100644
--- a/src/lib/components/units/SummonUnit.svelte
+++ b/src/lib/components/units/SummonUnit.svelte
@@ -3,11 +3,12 @@
import type { Party } from '$lib/types/api/party'
import { getContext } from 'svelte'
import Icon from '$lib/components/Icon.svelte'
- import ContextMenu from '$lib/components/ui/ContextMenu.svelte'
- import { ContextMenu as ContextMenuBase, DropdownMenu as DropdownMenuBase } from 'bits-ui'
+ import UnitMenuContainer from '$lib/components/ui/menu/UnitMenuContainer.svelte'
+ import MenuItems from '$lib/components/ui/menu/MenuItems.svelte'
import UncapIndicator from '$lib/components/uncap/UncapIndicator.svelte'
import { getSummonImage } from '$lib/features/database/detail/image'
import { openDetailsSidebar } from '$lib/features/details/openDetailsSidebar.svelte'
+ import { sidebar } from '$lib/stores/sidebar.svelte'
import * as m from '$lib/paraglide/messages'
interface Props {
@@ -43,6 +44,24 @@
return getSummonImage(item?.summon?.granblueId, variant)
})
+ // Check if this item is currently active in the sidebar
+ let isActive = $derived(item?.id && sidebar.activeItemId === String(item.id))
+
+ // Determine element class for focus ring
+ let elementClass = $derived.by(() => {
+ const element = item?.summon?.element
+
+ switch(element) {
+ case 1: return 'wind'
+ case 2: return 'fire'
+ case 3: return 'water'
+ case 4: return 'earth'
+ case 5: return 'dark'
+ case 6: return 'light'
+ default: return 'neutral'
+ }
+ })
+
async function remove() {
if (!item?.id) return
try {
@@ -74,21 +93,22 @@
-