From 6b235031dfc76f0b3e1088823452187d9b32353b Mon Sep 17 00:00:00 2001 From: aliang Date: Wed, 13 Nov 2024 01:17:53 +0700 Subject: [PATCH] feat(ui): add collapsible interaction to sidebar (#3406) * refactor(ui): admin sidebar refactoring * update: sidebar tooltip * [autofix.ci] apply automated fixes * remove breadcrumb * update * [autofix.ci] apply automated fixes * update: tailwind.config.js * update * update * update --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../activities/components/activity.tsx | 4 +- .../(dashboard)/components/main-content.tsx | 23 +- .../app/(dashboard)/components/sidebar.tsx | 328 ++++---- ee/tabby-ui/app/(dashboard)/layout.tsx | 9 +- .../(dashboard)/profile/components/avatar.tsx | 2 +- .../(dashboard)/reports/components/report.tsx | 2 +- .../detail/components/add-repository-form.tsx | 2 +- .../components/access-policy-view.tsx | 2 +- .../groups/components/membership-view.tsx | 2 +- .../groups/components/upsert-member-form.tsx | 2 +- ee/tabby-ui/app/(home)/page.tsx | 2 +- .../app/files/components/file-tree-header.tsx | 2 +- ee/tabby-ui/components/demo-banner.tsx | 2 +- ee/tabby-ui/components/header.tsx | 4 +- ee/tabby-ui/components/license-banner.tsx | 2 +- ee/tabby-ui/components/ui/icons.tsx | 11 +- ee/tabby-ui/components/ui/sidebar.tsx | 762 ++++++++++++++++++ ee/tabby-ui/hooks/use-mobile.tsx | 19 + ee/tabby-ui/package.json | 4 +- ee/tabby-ui/tailwind.config.js | 12 +- pnpm-lock.yaml | 18 +- 21 files changed, 1015 insertions(+), 199 deletions(-) create mode 100644 ee/tabby-ui/components/ui/sidebar.tsx create mode 100644 ee/tabby-ui/hooks/use-mobile.tsx diff --git a/ee/tabby-ui/app/(dashboard)/activities/components/activity.tsx b/ee/tabby-ui/app/(dashboard)/activities/components/activity.tsx index 33a03bd83036..2c1fc9f752f0 100644 --- a/ee/tabby-ui/app/(dashboard)/activities/components/activity.tsx +++ b/ee/tabby-ui/app/(dashboard)/activities/components/activity.tsx @@ -144,9 +144,9 @@ export default function Activity() { return ( <>
-
+
-
+

{`View raw events generated by team members' activities while interacting with Tabby.`}

{members.length > 0 && ( diff --git a/ee/tabby-ui/app/(dashboard)/components/main-content.tsx b/ee/tabby-ui/app/(dashboard)/components/main-content.tsx index df24707bb3f2..a2b652cfe434 100644 --- a/ee/tabby-ui/app/(dashboard)/components/main-content.tsx +++ b/ee/tabby-ui/app/(dashboard)/components/main-content.tsx @@ -1,6 +1,10 @@ 'use client' +import { useEffect, useRef } from 'react' +import { usePathname } from 'next/navigation' + import { ScrollArea } from '@/components/ui/scroll-area' +import { SidebarInset } from '@/components/ui/sidebar' import { BANNER_HEIGHT, useShowDemoBanner } from '@/components/demo-banner' import { Header } from '@/components/header' import { useShowLicenseBanner } from '@/components/license-banner' @@ -10,6 +14,8 @@ export default function MainContent({ }: { children: React.ReactNode }) { + const pathname = usePathname() + const scroller = useRef(null) const [isShowDemoBanner] = useShowDemoBanner() const [isShowLicenseBanner] = useShowLicenseBanner() const style = @@ -21,16 +27,19 @@ export default function MainContent({ } : { height: '100vh' } + useEffect(() => { + if (pathname && scroller.current) { + scroller.current.scrollTop = 0 + } + }, [pathname]) + return ( - <> + {/* Wraps right hand side into ScrollArea, making scroll bar consistent across all browsers */} - +
-
{children}
+
{children}
- + ) } diff --git a/ee/tabby-ui/app/(dashboard)/components/sidebar.tsx b/ee/tabby-ui/app/(dashboard)/components/sidebar.tsx index e44e83bcee60..3f48aa48e0cb 100644 --- a/ee/tabby-ui/app/(dashboard)/components/sidebar.tsx +++ b/ee/tabby-ui/app/(dashboard)/components/sidebar.tsx @@ -1,16 +1,14 @@ 'use client' -import React from 'react' +import React, { FunctionComponent } from 'react' import Image from 'next/image' import Link from 'next/link' import { usePathname } from 'next/navigation' import logoDarkUrl from '@/assets/logo-dark.png' import logoUrl from '@/assets/logo.png' -import { cva } from 'class-variance-authority' -import { escapeRegExp } from 'lodash-es' +import tabbyLogo from '@/assets/tabby.png' import { useMe } from '@/lib/hooks/use-me' -import { cn } from '@/lib/utils' import { Collapsible, CollapsibleContent, @@ -23,9 +21,17 @@ import { IconLightingBolt, IconUser } from '@/components/ui/icons' -import { ScrollArea } from '@/components/ui/scroll-area' -import { BANNER_HEIGHT, useShowDemoBanner } from '@/components/demo-banner' -import { useShowLicenseBanner } from '@/components/license-banner' +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarHeader, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem +} from '@/components/ui/sidebar' import LoadingWrapper from '@/components/loading-wrapper' export interface SidebarProps { @@ -33,7 +39,7 @@ export interface SidebarProps { className?: string } -type MenuLeaf = { +type SubMenu = { title: string href: string allowUser?: boolean @@ -42,29 +48,29 @@ type MenuLeaf = { type Menu = | { title: string - icon: React.ReactNode + icon: FunctionComponent allowUser?: boolean - children: MenuLeaf[] + items: SubMenu[] } | { title: string href: string - icon: React.ReactNode + icon: FunctionComponent allowUser?: boolean - children?: never + items?: never } const menus: Menu[] = [ { title: 'Profile', - icon: , + icon: IconUser, href: '/profile', allowUser: true }, { title: 'Information', - icon: , - children: [ + icon: IconBookOpenText, + items: [ { title: 'System', href: '/system' @@ -85,9 +91,9 @@ const menus: Menu[] = [ }, { title: 'Settings', - icon: , + icon: IconGear, allowUser: true, - children: [ + items: [ { title: 'General', href: '/settings/general' @@ -105,8 +111,8 @@ const menus: Menu[] = [ }, { title: 'Integrations', - icon: , - children: [ + icon: IconLightingBolt, + items: [ { title: 'Context Providers', href: '/settings/providers/git' @@ -123,160 +129,152 @@ const menus: Menu[] = [ } ] -export default function Sidebar({ children, className }: SidebarProps) { +export default function AppSidebar() { + const pathname = usePathname() const [{ data, fetching: fetchingMe }] = useMe() const isAdmin = data?.me.isAdmin - const [isShowDemoBanner] = useShowDemoBanner() - const [isShowLicenseBanner] = useShowLicenseBanner() - const showBanner = isShowDemoBanner || isShowLicenseBanner - const style = showBanner - ? { - height: `calc(100vh - ${isShowDemoBanner ? BANNER_HEIGHT : '0rem'} - ${ - isShowLicenseBanner ? BANNER_HEIGHT : '0rem' - })` - } - : { height: '100vh' } return ( - -
- -
-
- ) -} - -interface SidebarButtonProps { - href: string - children: React.ReactNode -} - -const linkVariants = cva( - 'flex items-center gap-3 rounded-lg px-3 py-2 transition-all hover:bg-accent', - { - variants: { - state: { - selected: 'bg-accent', - 'not-selected': '' - } - }, - defaultVariants: { - state: 'not-selected' - } - } -) - -function SidebarButton({ href, children }: SidebarButtonProps) { - const pathname = usePathname() - const isSelected = React.useMemo(() => { - if (href === '/') return href === pathname - if (href.startsWith('/settings/providers')) { - return pathname.startsWith('/settings/providers/') - } - - return shouldPathnameHighlight(pathname, href) - }, [pathname, href]) - - const state = isSelected ? 'selected' : 'not-selected' - return ( - - {children} - - ) -} - -function shouldPathnameHighlight( - currentPathname: string, - pathToHighlight: string -) { - const regex = new RegExp(`^${escapeRegExp(pathToHighlight)}(/|\\?|$)`) - return regex.test(currentPathname) -} - -interface SidebarCollapsibleProps { - title: React.ReactNode - children: React.ReactNode - defaultOpen?: boolean -} - -function SidebarCollapsible({ title, children }: SidebarCollapsibleProps) { - return ( - - - - {title} - - - - - {children} - - + + + + + + + {menus.map(menu => { + if (isAdmin || menu.allowUser) { + if (menu.items) { + return ( + + + + +
+ {menu.title} +
+
+ {menu.items.map(item => { + if (isAdmin || item.allowUser) { + return ( + + + {item.title} + + + ) + } else { + return null + } + })} +
+
+ ), + align: 'start', + side: 'right' + }} + > + {!!menu.icon && } + {menu.title} + + + + + + {menu.items.map(item => { + if (isAdmin || item.allowUser) { + return ( + + + + {item.title} + + + + ) + } + })} + + + + + ) + } else { + return ( + + + + {!!menu.icon && } + {menu.title} + + + + ) + } + } + return null + })} + + + + ) } diff --git a/ee/tabby-ui/app/(dashboard)/layout.tsx b/ee/tabby-ui/app/(dashboard)/layout.tsx index af0feb7b041c..8d583190b363 100644 --- a/ee/tabby-ui/app/(dashboard)/layout.tsx +++ b/ee/tabby-ui/app/(dashboard)/layout.tsx @@ -1,9 +1,10 @@ import { Metadata } from 'next' +import { SidebarProvider } from '@/components/ui/sidebar' import { LicenseBanner } from '@/components/license-banner' import MainContent from './components/main-content' -import Sidebar from './components/sidebar' +import AppSidebar from './components/sidebar' export const metadata: Metadata = { title: { @@ -20,10 +21,10 @@ export default function RootLayout({ return ( <> -
- + + {children} -
+ ) } diff --git a/ee/tabby-ui/app/(dashboard)/profile/components/avatar.tsx b/ee/tabby-ui/app/(dashboard)/profile/components/avatar.tsx index c414828436b8..2a46f0475151 100644 --- a/ee/tabby-ui/app/(dashboard)/profile/components/avatar.tsx +++ b/ee/tabby-ui/app/(dashboard)/profile/components/avatar.tsx @@ -77,7 +77,7 @@ export const Avatar = () => {
diff --git a/ee/tabby-ui/app/(dashboard)/reports/components/report.tsx b/ee/tabby-ui/app/(dashboard)/reports/components/report.tsx index 5b7339e9b119..a384e9869155 100644 --- a/ee/tabby-ui/app/(dashboard)/reports/components/report.tsx +++ b/ee/tabby-ui/app/(dashboard)/reports/components/report.tsx @@ -218,7 +218,7 @@ export function Report() { } + fallback={} > + ) +}) +SidebarInput.displayName = 'SidebarInput' + +const SidebarHeader = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> +>(({ className, ...props }, ref) => { + return ( +
+ ) +}) +SidebarHeader.displayName = 'SidebarHeader' + +const SidebarFooter = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> +>(({ className, ...props }, ref) => { + return ( +
+ ) +}) +SidebarFooter.displayName = 'SidebarFooter' + +const SidebarSeparator = React.forwardRef< + React.ElementRef, + React.ComponentProps +>(({ className, ...props }, ref) => { + return ( + + ) +}) +SidebarSeparator.displayName = 'SidebarSeparator' + +const SidebarContent = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> +>(({ className, ...props }, ref) => { + return ( +
+ ) +}) +SidebarContent.displayName = 'SidebarContent' + +const SidebarGroup = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> +>(({ className, ...props }, ref) => { + return ( +
+ ) +}) +SidebarGroup.displayName = 'SidebarGroup' + +const SidebarGroupLabel = React.forwardRef< + HTMLDivElement, + React.ComponentPropsWithoutRef<'div'> & { asChild?: boolean } +>(({ className, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'div' + + return ( + svg]:size-4 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] duration-200 ease-linear focus-visible:ring-2 [&>svg]:shrink-0', + 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0', + className + )} + {...props} + /> + ) +}) +SidebarGroupLabel.displayName = 'SidebarGroupLabel' + +const SidebarGroupAction = React.forwardRef< + HTMLButtonElement, + React.ComponentPropsWithoutRef<'button'> & { asChild?: boolean } +>(({ className, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button' + + return ( + svg]:size-4 absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:shrink-0', + // Increases the hit area of the button on mobile. + 'after:absolute after:-inset-2 after:md:hidden', + 'group-data-[collapsible=icon]:hidden', + className + )} + {...props} + /> + ) +}) +SidebarGroupAction.displayName = 'SidebarGroupAction' + +const SidebarGroupContent = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> +>(({ className, ...props }, ref) => ( +
+)) +SidebarGroupContent.displayName = 'SidebarGroupContent' + +const SidebarMenu = React.forwardRef< + HTMLUListElement, + React.ComponentProps<'ul'> +>(({ className, ...props }, ref) => ( +
    +)) +SidebarMenu.displayName = 'SidebarMenu' + +const SidebarMenuItem = React.forwardRef< + HTMLLIElement, + React.ComponentProps<'li'> +>(({ className, ...props }, ref) => ( +
  • +)) +SidebarMenuItem.displayName = 'SidebarMenuItem' + +const sidebarMenuButtonVariants = cva( + 'peer/menu-button group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 group-data-[collapsible=icon]:!size-8 [&>svg]:size-4 flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:shrink-0', + { + variants: { + variant: { + default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground', + outline: + 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]' + }, + size: { + default: 'text-sm', + sm: 'text-xs', + lg: 'text-sm group-data-[collapsible=icon]:!p-0' + } + }, + defaultVariants: { + variant: 'default', + size: 'default' + } + } +) + +const SidebarMenuButton = React.forwardRef< + HTMLButtonElement, + React.ComponentPropsWithoutRef<'button'> & { + asChild?: boolean + isActive?: boolean + tooltip?: string | React.ComponentProps + } & VariantProps +>( + ( + { + asChild = false, + isActive = false, + variant = 'default', + size = 'default', + tooltip, + className, + ...props + }, + ref + ) => { + const Comp = asChild ? Slot : 'button' + const { isMobile, state } = useSidebar() + + const button = ( + + ) + + if (!tooltip) { + return button + } + + if (typeof tooltip === 'string') { + tooltip = { + children: tooltip + } + } + + return ( + + {button} + + ) + } +) +SidebarMenuButton.displayName = 'SidebarMenuButton' + +const SidebarMenuAction = React.forwardRef< + HTMLButtonElement, + React.ComponentPropsWithoutRef<'button'> & { + asChild?: boolean + showOnHover?: boolean + } +>(({ className, asChild = false, showOnHover = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button' + + return ( + svg]:size-4 absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:shrink-0', + // Increases the hit area of the button on mobile. + 'after:absolute after:-inset-2 after:md:hidden', + 'peer-data-[size=sm]/menu-button:top-1', + 'peer-data-[size=default]/menu-button:top-1.5', + 'peer-data-[size=lg]/menu-button:top-2.5', + 'group-data-[collapsible=icon]:hidden', + showOnHover && + 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0', + className + )} + {...props} + /> + ) +}) +SidebarMenuAction.displayName = 'SidebarMenuAction' + +const SidebarMenuBadge = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> +>(({ className, ...props }, ref) => ( +
    +)) +SidebarMenuBadge.displayName = 'SidebarMenuBadge' + +const SidebarMenuSkeleton = React.forwardRef< + HTMLDivElement, + React.ComponentProps<'div'> & { + showIcon?: boolean + } +>(({ className, showIcon = false, ...props }, ref) => { + // Random width between 50 to 90%. + const width = React.useMemo(() => { + return `${Math.floor(Math.random() * 40) + 50}%` + }, []) + + return ( +
    + {showIcon && ( + + )} + +
    + ) +}) +SidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton' + +const SidebarMenuSub = React.forwardRef< + HTMLUListElement, + React.ComponentProps<'ul'> +>(({ className, ...props }, ref) => ( +
      +)) +SidebarMenuSub.displayName = 'SidebarMenuSub' + +const SidebarMenuSubItem = React.forwardRef< + HTMLLIElement, + React.ComponentProps<'li'> +>(({ ...props }, ref) =>
    • ) +SidebarMenuSubItem.displayName = 'SidebarMenuSubItem' + +const SidebarMenuSubButton = React.forwardRef< + HTMLAnchorElement, + React.ComponentPropsWithoutRef<'a'> & { + asChild?: boolean + size?: 'sm' | 'md' + isActive?: boolean + } +>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => { + const Comp = asChild ? Slot : 'a' + + return ( + svg]:size-4 flex min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 py-1.5 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground', + 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground', + size === 'sm' && 'text-xs', + size === 'md' && 'text-sm', + 'group-data-[collapsible=icon]:hidden', + className + )} + {...props} + /> + ) +}) +SidebarMenuSubButton.displayName = 'SidebarMenuSubButton' + +export { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarGroup, + SidebarGroupAction, + SidebarGroupContent, + SidebarGroupLabel, + SidebarHeader, + SidebarInput, + SidebarInset, + SidebarMenu, + SidebarMenuAction, + SidebarMenuBadge, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSkeleton, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem, + SidebarProvider, + SidebarRail, + SidebarSeparator, + SidebarTrigger, + useSidebar +} diff --git a/ee/tabby-ui/hooks/use-mobile.tsx b/ee/tabby-ui/hooks/use-mobile.tsx new file mode 100644 index 000000000000..2b0fe1dfef3b --- /dev/null +++ b/ee/tabby-ui/hooks/use-mobile.tsx @@ -0,0 +1,19 @@ +import * as React from "react" + +const MOBILE_BREAKPOINT = 768 + +export function useIsMobile() { + const [isMobile, setIsMobile] = React.useState(undefined) + + React.useEffect(() => { + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) + const onChange = () => { + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) + } + mql.addEventListener("change", onChange) + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) + return () => mql.removeEventListener("change", onChange) + }, []) + + return !!isMobile +} diff --git a/ee/tabby-ui/package.json b/ee/tabby-ui/package.json index 970d06fd7227..f5d8d8bc420e 100644 --- a/ee/tabby-ui/package.json +++ b/ee/tabby-ui/package.json @@ -32,7 +32,7 @@ "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-hover-card": "^1.0.7", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", @@ -45,7 +45,7 @@ "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-tooltip": "^1.0.6", + "@radix-ui/react-tooltip": "^1.0.7", "@sindresorhus/slugify": "^2.2.1", "@tiptap/extension-document": "^2.6.6", "@tiptap/extension-mention": "^2.6.6", diff --git a/ee/tabby-ui/tailwind.config.js b/ee/tabby-ui/tailwind.config.js index 15e0212077d7..32d8e47da989 100644 --- a/ee/tabby-ui/tailwind.config.js +++ b/ee/tabby-ui/tailwind.config.js @@ -54,6 +54,16 @@ module.exports = { card: { DEFAULT: 'hsl(var(--card))', foreground: 'hsl(var(--card-foreground))' + }, + sidebar: { + DEFAULT: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: 'hsl(var(--primary))', + 'primary-foreground': 'hsl(var(--primary-foreground))', + accent: 'hsl(var(--accent))', + 'accent-foreground': 'hsl(var(--accent-foreground))', + border: 'hsl(var(--border))', + ring: 'hsl(var(--ring))' } }, borderRadius: { @@ -98,4 +108,4 @@ module.exports = { } }, plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')] -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 63d39464ed27..44afba9a6fdd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -335,10 +335,10 @@ importers: version: 5.2.0 esbuild-plugin-copy: specifier: ^2.1.1 - version: 2.1.1(esbuild@0.19.12) + version: 2.1.1(esbuild@0.20.2) esbuild-plugin-polyfill-node: specifier: ^0.3.0 - version: 0.3.0(esbuild@0.19.12) + version: 0.3.0(esbuild@0.20.2) eslint: specifier: ^8.55.0 version: 8.57.0 @@ -439,7 +439,7 @@ importers: specifier: ^1.0.5 version: 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-dropdown-menu': - specifier: ^2.0.5 + specifier: ^2.0.6 version: 2.0.6(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-hover-card': specifier: ^1.0.7 @@ -478,7 +478,7 @@ importers: specifier: ^1.1.0 version: 1.1.0(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-tooltip': - specifier: ^1.0.6 + specifier: ^1.0.7 version: 1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@sindresorhus/slugify': specifier: ^2.2.1 @@ -16490,11 +16490,11 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - esbuild-plugin-copy@2.1.1(esbuild@0.19.12): + esbuild-plugin-copy@2.1.1(esbuild@0.20.2): dependencies: chalk: 4.1.2 chokidar: 3.6.0 - esbuild: 0.19.12 + esbuild: 0.20.2 fs-extra: 10.1.0 globby: 11.1.0 @@ -16504,6 +16504,12 @@ snapshots: esbuild: 0.19.12 import-meta-resolve: 3.1.1 + esbuild-plugin-polyfill-node@0.3.0(esbuild@0.20.2): + dependencies: + '@jspm/core': 2.0.1 + esbuild: 0.20.2 + import-meta-resolve: 3.1.1 + esbuild@0.19.11: optionalDependencies: '@esbuild/aix-ppc64': 0.19.11