Skip to content

Commit f98468b

Browse files
committed
Portal brand context menu
1 parent 5296f8d commit f98468b

File tree

1 file changed

+59
-57
lines changed

1 file changed

+59
-57
lines changed

src/components/BrandContextMenu.tsx

Lines changed: 59 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -64,67 +64,69 @@ export function BrandContextMenu({ children, ...rest }: BrandContextMenuProps) {
6464
}}
6565
/>
6666
</DropdownMenu.Trigger>
67-
<DropdownMenu.Content
68-
sideOffset={4}
69-
align="start"
70-
className="z-50 min-w-48 rounded-md border border-gray-200 bg-white p-1 text-sm shadow-lg dark:border-gray-700 dark:bg-gray-900/50 backdrop-blur-md"
71-
>
72-
{[
73-
{
74-
label: 'Logo as SVG (Black)',
75-
url: '/images/logos/logo-black.svg',
76-
},
77-
{
78-
label: 'Logo as SVG (White)',
79-
url: '/images/logos/logo-white.svg',
80-
darkBg: true,
81-
},
82-
{
83-
label: 'Wordmark as SVG (Black)',
84-
url: '/images/logos/logo-word-black.svg',
85-
},
86-
{
87-
label: 'Wordmark as SVG (White)',
88-
url: '/images/logos/logo-word-white.svg',
89-
darkBg: true,
90-
},
91-
].map(({ label, url, darkBg }) => (
92-
<DropdownMenu.Item
93-
key={label}
94-
className={twMerge(
95-
'flex cursor-pointer select-none items-center gap-2 rounded px-3 py-1 outline-none hover:bg-gray-500/20'
96-
)}
97-
onSelect={async () => {
98-
try {
99-
const res = await fetch(url)
100-
const text = await res.text()
101-
await copyText(text)
102-
} catch (err) {
103-
console.error('Failed to copy logo', err)
104-
}
105-
}}
106-
>
107-
{label}
108-
<div
67+
<DropdownMenu.Portal>
68+
<DropdownMenu.Content
69+
sideOffset={4}
70+
align="start"
71+
className="relative z-[50] min-w-48 rounded-md border border-gray-200 bg-white p-1 text-sm shadow-lg dark:border-gray-700 dark:bg-gray-900/50 backdrop-blur-md"
72+
>
73+
{[
74+
{
75+
label: 'Logo as SVG (Black)',
76+
url: '/images/logos/logo-black.svg',
77+
},
78+
{
79+
label: 'Logo as SVG (White)',
80+
url: '/images/logos/logo-white.svg',
81+
darkBg: true,
82+
},
83+
{
84+
label: 'Wordmark as SVG (Black)',
85+
url: '/images/logos/logo-word-black.svg',
86+
},
87+
{
88+
label: 'Wordmark as SVG (White)',
89+
url: '/images/logos/logo-word-white.svg',
90+
darkBg: true,
91+
},
92+
].map(({ label, url, darkBg }) => (
93+
<DropdownMenu.Item
94+
key={label}
10995
className={twMerge(
110-
'p-1 rounded-full',
111-
darkBg
112-
? 'bg-black text-white shadow-lg shadow-white/20'
113-
: 'bg-white text-black shadow-lg'
96+
'flex cursor-pointer select-none items-center gap-2 rounded px-3 py-1 outline-none hover:bg-gray-500/20'
11497
)}
98+
onSelect={async () => {
99+
try {
100+
const res = await fetch(url)
101+
const text = await res.text()
102+
await copyText(text)
103+
} catch (err) {
104+
console.error('Failed to copy logo', err)
105+
}
106+
}}
115107
>
116-
<img src={url} alt={label} className="h-6" />
117-
</div>
108+
{label}
109+
<div
110+
className={twMerge(
111+
'p-1 rounded-full',
112+
darkBg
113+
? 'bg-black text-white shadow-lg shadow-white/20'
114+
: 'bg-white text-black shadow-lg'
115+
)}
116+
>
117+
<img src={url} alt={label} className="h-6" />
118+
</div>
119+
</DropdownMenu.Item>
120+
))}
121+
<DropdownMenu.Separator className="my-1 h-px bg-gray-200 dark:bg-gray-700" />
122+
<DropdownMenu.Item
123+
className="flex cursor-pointer select-none items-center gap-2 rounded px-3 py-2 outline-none hover:bg-gray-100 dark:hover:bg-gray-700"
124+
onSelect={() => navigate({ to: '/brand-guide' })}
125+
>
126+
Brand Guide & All Assets
118127
</DropdownMenu.Item>
119-
))}
120-
<DropdownMenu.Separator className="my-1 h-px bg-gray-200 dark:bg-gray-700" />
121-
<DropdownMenu.Item
122-
className="flex cursor-pointer select-none items-center gap-2 rounded px-3 py-2 outline-none hover:bg-gray-100 dark:hover:bg-gray-700"
123-
onSelect={() => navigate({ to: '/brand-guide' })}
124-
>
125-
Brand Guide & All Assets
126-
</DropdownMenu.Item>
127-
</DropdownMenu.Content>
128+
</DropdownMenu.Content>
129+
</DropdownMenu.Portal>
128130
</DropdownMenu.Root>
129131
</div>
130132
)

0 commit comments

Comments
 (0)