11import * as React from 'react'
2- import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
32import { useToast } from '~/components/ToastProvider'
43import { useNavigate } from '@tanstack/react-router'
54import { twMerge } from 'tailwind-merge'
5+ import {
6+ Dropdown ,
7+ DropdownTrigger ,
8+ DropdownContent ,
9+ DropdownItem ,
10+ DropdownSeparator ,
11+ } from './Dropdown'
612
713interface BrandContextMenuProps extends React . HTMLAttributes < HTMLDivElement > {
814 children : React . ReactNode
@@ -51,8 +57,8 @@ export function BrandContextMenu({ children, ...rest }: BrandContextMenuProps) {
5157 return (
5258 < div onContextMenu = { onContextMenu } { ...rest } >
5359 { children }
54- < DropdownMenu . Root open = { open } onOpenChange = { setOpen } modal >
55- < DropdownMenu . Trigger asChild >
60+ < Dropdown open = { open } onOpenChange = { setOpen } modal >
61+ < DropdownTrigger asChild = { false } >
5662 < span
5763 ref = { virtualTriggerRef }
5864 style = { {
@@ -63,71 +69,64 @@ export function BrandContextMenu({ children, ...rest }: BrandContextMenuProps) {
6369 height : 1 ,
6470 } }
6571 />
66- </ DropdownMenu . Trigger >
67- < DropdownMenu . Portal >
68- < DropdownMenu . Content
69- sideOffset = { 4 }
70- align = "start"
71- className = "relative z-[1000] 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 }
72+ </ DropdownTrigger >
73+ < DropdownContent
74+ sideOffset = { 4 }
75+ align = "start"
76+ className = "dark:bg-gray-900/50 backdrop-blur-md"
77+ >
78+ { [
79+ {
80+ label : 'Logo as SVG (Black)' ,
81+ url : '/images/logos/logo-black.svg' ,
82+ } ,
83+ {
84+ label : 'Logo as SVG (White)' ,
85+ url : '/images/logos/logo-white.svg' ,
86+ darkBg : true ,
87+ } ,
88+ {
89+ label : 'Wordmark as SVG (Black)' ,
90+ url : '/images/logos/logo-word-black.svg' ,
91+ } ,
92+ {
93+ label : 'Wordmark as SVG (White)' ,
94+ url : '/images/logos/logo-word-white.svg' ,
95+ darkBg : true ,
96+ } ,
97+ ] . map ( ( { label, url, darkBg } ) => (
98+ < DropdownItem
99+ key = { label }
100+ className = "py-1"
101+ onSelect = { async ( ) => {
102+ try {
103+ const res = await fetch ( url )
104+ const text = await res . text ( )
105+ await copyText ( text )
106+ } catch ( err ) {
107+ console . error ( 'Failed to copy logo' , err )
108+ }
109+ } }
110+ >
111+ { label }
112+ < div
95113 className = { twMerge (
96- 'flex cursor-pointer select-none items-center gap-2 rounded px-3 py-1 outline-none hover:bg-gray-500/20' ,
114+ 'p-1 rounded-full' ,
115+ darkBg
116+ ? 'bg-black text-white shadow-md'
117+ : 'bg-white text-black shadow-md' ,
97118 ) }
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- } }
107119 >
108- { label }
109- < div
110- className = { twMerge (
111- 'p-1 rounded-full' ,
112- darkBg
113- ? 'bg-black text-white shadow-md'
114- : 'bg-white text-black shadow-md' ,
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
127- </ DropdownMenu . Item >
128- </ DropdownMenu . Content >
129- </ DropdownMenu . Portal >
130- </ DropdownMenu . Root >
120+ < img src = { url } alt = { label } className = "h-6" />
121+ </ div >
122+ </ DropdownItem >
123+ ) ) }
124+ < DropdownSeparator />
125+ < DropdownItem onSelect = { ( ) => navigate ( { to : '/brand-guide' } ) } >
126+ Brand Guide & All Assets
127+ </ DropdownItem >
128+ </ DropdownContent >
129+ </ Dropdown >
131130 </ div >
132131 )
133132}
0 commit comments