Advertisement
djbob2000

Untitled

Feb 10th, 2025
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Давайте создадим компонент для отображения подменю в верхней панели.
  2. Сначала создадим интерфейс для элементов с подменю в FdTopSidebar.tsx:
  3.  
  4. interface TopSidebarItem extends SidebarItem {
  5.     submenu?: {
  6.         text: string;
  7.         path?: string;
  8.         icon?: string;
  9.     }[];
  10. }
  11.  
  12.  
  13. Теперь создадим компонент FdTopSidebarItem для обработки отдельного элемента с подменю:
  14. function FdTopSidebarItem({ item }: { item: TopSidebarItem }) {
  15.     const [isHovered, setIsHovered] = useState(false);
  16.  
  17.     return (
  18.         <div
  19.             className="relative"
  20.             onMouseEnter={() => setIsHovered(true)}
  21.             onMouseLeave={() => setIsHovered(false)}
  22.         >
  23.             <div className="flex items-center gap-2 rounded-md p-2 text-fd-tertiary-50 hover:bg-fd-tertiary-700">
  24.                 <FdIcon
  25.                     name={item.icon || defaultSidebarIconName}
  26.                     className="size-4 text-fd-tertiary-50"
  27.                 />
  28.                 {item.submenu && (
  29.                     <FdIcon
  30.                         name={iconNames.caretDownIcon}
  31.                         className="size-3 text-fd-tertiary-50"
  32.                     />
  33.                 )}
  34.             </div>
  35.  
  36.             {isHovered && (
  37.                 <div className="absolute left-1/2 top-full z-50 -translate-x-1/2 transform pt-2">
  38.                     <div className="rounded-md bg-fd-tertiary-700 p-1 shadow-lg">
  39.                         {item.submenu ? (
  40.                             <div className="min-w-40">
  41.                                 {item.submenu.map((submenuItem, index) => (
  42.                                     <FdLink
  43.                                         key={index}
  44.                                         href={submenuItem.path ?? "#"}
  45.                                         className="flex items-center gap-2 rounded-sm px-3 py-2 text-sm text-fd-tertiary-50 hover:bg-fd-tertiary-600"
  46.                                     >
  47.                                         {submenuItem.icon && (
  48.                                             <FdIcon
  49.                                                 name={submenuItem.icon}
  50.                                                 className="size-4 text-fd-tertiary-50"
  51.                                             />
  52.                                         )}
  53.                                         {submenuItem.text}
  54.                                     </FdLink>
  55.                                 ))}
  56.                             </div>
  57.                         ) : (
  58.                             <div className="whitespace-nowrap px-3 py-2 text-sm text-fd-tertiary-50">
  59.                                 {item.displayName || item.name}
  60.                             </div>
  61.                         )}
  62.                     </div>
  63.                 </div>
  64.             )}
  65.         </div>
  66.     );
  67. }
  68.  
  69.  
  70.  
  71. Обновим основной компонент FdTopSidebar:
  72. export function FdTopSidebar() {
  73.     const items = useSidebarResources() as TopSidebarItem[];
  74.  
  75.     return (
  76.         <div className="flex items-center gap-1">
  77.             {items.map((item) => (
  78.                 <FdTopSidebarItem key={item.name} item={item} />
  79.             ))}
  80.         </div>
  81.     );
  82. }
  83.  
  84. Особенности реализации:
  85. При наведении на иконку появляется подменю
  86. Подменю отображается под иконкой и центрируется
  87. 3. Если у элемента есть подменю, показывается маленькая стрелка вниз
  88. Каждый элемент подменю может иметь свою иконку
  89. При наведении на элементы подменю они подсвечиваются
  90. Используется z-index для корректного отображения поверх других элементов
  91. Добавлены плавные переходы и тени для лучшего UX
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement