diff --git a/web-frontend/src/main/v3/apps/web/index.html b/web-frontend/src/main/v3/apps/web/index.html index 5dc1ff5d6721..6e952cca5b6a 100644 --- a/web-frontend/src/main/v3/apps/web/index.html +++ b/web-frontend/src/main/v3/apps/web/index.html @@ -3,6 +3,7 @@ + PINPOINT @@ -10,6 +11,7 @@
+
diff --git a/web-frontend/src/main/v3/apps/web/package.json b/web-frontend/src/main/v3/apps/web/package.json index dc807a60691c..ebd2e896d9aa 100644 --- a/web-frontend/src/main/v3/apps/web/package.json +++ b/web-frontend/src/main/v3/apps/web/package.json @@ -29,7 +29,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-i18next": "^13.0.2", - "react-icons": "^4.9.0", + "react-icons": "^5.2.1", "react-router-dom": "^6.10.0", "swr": "^2.1.2", "usehooks-ts": "^2.9.1", @@ -41,8 +41,11 @@ "@types/react-dom": "^18.0.11", "@types/react-router-dom": "^5.3.3", "@vitejs/plugin-react": "^3.1.0", + "autoprefixer": "^10.4.15", "cpx": "^1.5.0", "eslint": "^8.15.0", + "postcss": "^8.4.29", + "tailwindcss": "^3.4.1", "typescript": "^5.2.2", "vite": "^4.4.5", "vite-plugin-compression2": "^0.9.2" diff --git a/web-frontend/src/main/v3/apps/web/postcss.config.js b/web-frontend/src/main/v3/apps/web/postcss.config.js new file mode 100644 index 000000000000..2aa7205d4b40 --- /dev/null +++ b/web-frontend/src/main/v3/apps/web/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/web-frontend/src/main/v3/apps/web/src/components/Layout/LayoutWithSideNavigation.tsx b/web-frontend/src/main/v3/apps/web/src/components/Layout/LayoutWithSideNavigation.tsx index 46d20ec03840..857fd0a7d733 100644 --- a/web-frontend/src/main/v3/apps/web/src/components/Layout/LayoutWithSideNavigation.tsx +++ b/web-frontend/src/main/v3/apps/web/src/components/Layout/LayoutWithSideNavigation.tsx @@ -4,63 +4,19 @@ import { LayoutWithSideNavigationProps as LayoutWithSideNavigationComponentProps, SideNavigationMenuItem, } from '@pinpoint-fe/ui'; -import { FaBug, FaChartBar, FaChartLine, FaCog, FaNetworkWired, FaServer } from 'react-icons/fa'; -import { useSearchParameters } from '@pinpoint-fe/hooks'; -import { - getErrorAnalysisPath, - getInspectorPath, - getServerMapPath, - getSystemMetricPath, - getUrlStatPath, -} from '@pinpoint-fe/utils'; +import { FaCog } from 'react-icons/fa'; import { APP_PATH } from '@pinpoint-fe/constants'; -import { useAtomValue } from 'jotai'; import { LuDoorOpen, LuUserCircle2 } from 'react-icons/lu'; import { CONFIG_MENU_MAP } from './LayoutWithConfiguration'; import { MdOutlineAdminPanelSettings } from 'react-icons/md'; -import { configurationAtom } from '@pinpoint-fe/atoms'; +import { useMenuItems } from '@/hooks/useMenuItems'; export interface LayoutWithSideNavigationProps extends LayoutWithSideNavigationComponentProps {} export const LayoutWithSideNavigation = ({ ...props }: LayoutWithSideNavigationProps) => { - const { application, searchParameters } = useSearchParameters(); - const configuration = useAtomValue(configurationAtom); + const { menuItems } = useMenuItems(); - const topMenuItems = [ - { - icon: , - name: 'Servermap', - path: APP_PATH.SERVER_MAP, - href: getServerMapPath(application, searchParameters), - }, - { - icon: , - name: 'Inspector', - path: APP_PATH.INSPECTOR, - href: getInspectorPath(application, searchParameters), - }, - { - icon: , - name: 'URL Statistic', - path: APP_PATH.URL_STATISTIC, - href: getUrlStatPath(application, searchParameters), - hide: !configuration?.showUrlStat, - }, - { - icon: , - name: 'Infrastructure', - path: APP_PATH.SYSTEM_METRIC, - href: getSystemMetricPath(), - hide: !configuration?.showSystemMetric, - }, - { - icon: , - name: 'Error Analysis', - path: APP_PATH.ERROR_ANALYSIS, - href: getErrorAnalysisPath(application, searchParameters), - hide: !configuration?.showExceptionTrace, - }, - ]; + const topMenuItems = menuItems; const bottomMenuItems: SideNavigationMenuItem[] = [ { diff --git a/web-frontend/src/main/v3/apps/web/src/hooks/useMenuItems.tsx b/web-frontend/src/main/v3/apps/web/src/hooks/useMenuItems.tsx new file mode 100644 index 000000000000..d00d972cddda --- /dev/null +++ b/web-frontend/src/main/v3/apps/web/src/hooks/useMenuItems.tsx @@ -0,0 +1,61 @@ +import { useAtomValue } from 'jotai'; +import { APP_PATH, MenuItem } from '@pinpoint-fe/constants'; +import { configurationAtom } from '@pinpoint-fe/atoms'; +import { + PiBugBeetle, + PiChartBar, + PiChartLine, + PiHardDrives, + PiTreeStructure, +} from 'react-icons/pi'; +import { useSearchParameters } from '@pinpoint-fe/hooks'; +import { + getServerMapPath, + getInspectorPath, + getUrlStatPath, + getSystemMetricPath, + getErrorAnalysisPath, +} from '@pinpoint-fe/utils'; + +export const useMenuItems = () => { + const configuration = useAtomValue(configurationAtom); + const { application, searchParameters } = useSearchParameters(); + + const menuItems: MenuItem[] = [ + { + icon: , + name: 'Servermap', + path: APP_PATH.SERVER_MAP, + href: getServerMapPath(application, searchParameters), + }, + { + icon: , + name: 'Inspector', + path: APP_PATH.INSPECTOR, + href: getInspectorPath(application, searchParameters), + }, + { + icon: , + name: 'URL Statistic', + path: APP_PATH.URL_STATISTIC, + href: getUrlStatPath(application, searchParameters), + hide: !configuration?.showUrlStat, + }, + { + icon: , + name: 'Infrastructure', + path: APP_PATH.SYSTEM_METRIC, + href: getSystemMetricPath(), + hide: !configuration?.showSystemMetric, + }, + { + icon: , + name: 'Error Analysis', + path: APP_PATH.ERROR_ANALYSIS, + href: getErrorAnalysisPath(application, searchParameters), + hide: !configuration?.showExceptionTrace, + }, + ]; + + return { menuItems }; +}; diff --git a/web-frontend/src/main/v3/apps/web/src/index.css b/web-frontend/src/main/v3/apps/web/src/index.css new file mode 100644 index 000000000000..b5c61c956711 --- /dev/null +++ b/web-frontend/src/main/v3/apps/web/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/web-frontend/src/main/v3/apps/web/src/main.tsx b/web-frontend/src/main/v3/apps/web/src/main.tsx index a30802716396..0ecde1a50cc7 100644 --- a/web-frontend/src/main/v3/apps/web/src/main.tsx +++ b/web-frontend/src/main/v3/apps/web/src/main.tsx @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom/client'; import { RouterProvider } from 'react-router-dom'; import { Provider as JotaiProvider } from 'jotai'; import { IconContext } from 'react-icons'; -import { SidebarProvider, ToastContainer, defaultToastContainerProps } from '@pinpoint-fe/ui'; +import { ToastContainer, defaultToastContainerProps } from '@pinpoint-fe/ui'; import router from './routes'; import { I18nextProvider } from 'react-i18next'; import i18n from './i18n'; @@ -16,10 +16,8 @@ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - + + diff --git a/web-frontend/src/main/v3/apps/web/src/pages/FilteredMap.tsx b/web-frontend/src/main/v3/apps/web/src/pages/FilteredMap.tsx index c83bc670e27a..7e52b8293f05 100644 --- a/web-frontend/src/main/v3/apps/web/src/pages/FilteredMap.tsx +++ b/web-frontend/src/main/v3/apps/web/src/pages/FilteredMap.tsx @@ -37,7 +37,6 @@ import { import { differenceInMinutes } from 'date-fns'; import { useUpdateEffect } from 'usehooks-ts'; import { useTranslation } from 'react-i18next'; -import { FaExternalLinkAlt, FaNetworkWired } from 'react-icons/fa'; import { ApdexScore, Button, @@ -58,6 +57,7 @@ import { } from '@pinpoint-fe/ui'; import { getLayoutWithSideNavigation } from '@/components/Layout/LayoutWithSideNavigation'; import { Node, Edge } from '@pinpoint-fe/server-map'; +import { PiTreeStructureDuotone } from 'react-icons/pi'; export interface FilteredMapPageProps {} @@ -233,7 +233,7 @@ export const FilteredMapPage = ({}: FilteredMapPageProps) => { - + Servermap {' '} diff --git a/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/Realtime.tsx b/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/Realtime.tsx index d4b13c4a894c..d090955652c7 100644 --- a/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/Realtime.tsx +++ b/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/Realtime.tsx @@ -13,6 +13,7 @@ import { withInitialFetch, } from '@pinpoint-fe/ui'; import { getLayoutWithSideNavigation } from '@/components/Layout/LayoutWithSideNavigation'; +import { PiTreeStructureDuotone } from 'react-icons/pi'; export interface RealtimePageProps {} @@ -58,7 +59,13 @@ export const RealtimePage = ({}: RealtimePageProps) => { return (
- + + Servermap +
+ } + > navigate(getServerMapPath(application))} diff --git a/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/index.tsx b/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/index.tsx index 3c2514c7a9af..a23e3f2cb42f 100644 --- a/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/index.tsx +++ b/web-frontend/src/main/v3/apps/web/src/pages/ServerMap/index.tsx @@ -28,7 +28,6 @@ import { } from '@pinpoint-fe/atoms'; import { FilteredMap, GetServerMap, BASE_PATH } from '@pinpoint-fe/constants'; import { IoMdClose } from 'react-icons/io'; -import { FaNetworkWired } from 'react-icons/fa'; import { ApdexScore, Button, @@ -54,6 +53,7 @@ import { } from '@pinpoint-fe/ui'; import { getLayoutWithSideNavigation } from '@/components/Layout/LayoutWithSideNavigation'; import { Edge, Node } from '@pinpoint-fe/server-map'; +import { PiTreeStructureDuotone } from 'react-icons/pi'; export interface ServermapPageProps {} @@ -185,7 +185,7 @@ export const ServerMapPage = ({}: ServermapPageProps) => { - Servermap + Servermap } > diff --git a/web-frontend/src/main/v3/apps/web/tailwind.config.js b/web-frontend/src/main/v3/apps/web/tailwind.config.js new file mode 100644 index 000000000000..a36c126a049a --- /dev/null +++ b/web-frontend/src/main/v3/apps/web/tailwind.config.js @@ -0,0 +1,7 @@ +import uiTailwindConfig from '@pinpoint-fe/ui/tailwind.config.js'; + +/** @type {import('tailwindcss').Config} */ +export default { + ...uiTailwindConfig, + content: ['./index.html', './src/**/*.{ts,tsx}'], +}; diff --git a/web-frontend/src/main/v3/packages/atoms/src/globalSearch.ts b/web-frontend/src/main/v3/packages/atoms/src/globalSearch.ts new file mode 100644 index 000000000000..dc0f6f0b88c3 --- /dev/null +++ b/web-frontend/src/main/v3/packages/atoms/src/globalSearch.ts @@ -0,0 +1,3 @@ +import { atom } from 'jotai'; + +export const globalSearchDisplayAtom = atom(false); diff --git a/web-frontend/src/main/v3/packages/atoms/src/index.ts b/web-frontend/src/main/v3/packages/atoms/src/index.ts index dcd928a38895..f8363be395f2 100644 --- a/web-frontend/src/main/v3/packages/atoms/src/index.ts +++ b/web-frontend/src/main/v3/packages/atoms/src/index.ts @@ -1,5 +1,6 @@ export * from './chartsBoard'; export * from './configuration'; +export * from './globalSearch'; export * from './installationInfo'; export * from './scatter'; export * from './serverMap'; diff --git a/web-frontend/src/main/v3/packages/constants/src/types/MenuItem.ts b/web-frontend/src/main/v3/packages/constants/src/types/MenuItem.ts new file mode 100644 index 000000000000..aa049e4bced3 --- /dev/null +++ b/web-frontend/src/main/v3/packages/constants/src/types/MenuItem.ts @@ -0,0 +1,7 @@ +export type MenuItem = { + name: string; + path: string | string[]; + href?: string; + icon?: JSX.Element; + hide?: boolean; +}; diff --git a/web-frontend/src/main/v3/packages/constants/src/types/index.ts b/web-frontend/src/main/v3/packages/constants/src/types/index.ts index be7663ebe163..46d68dda9797 100644 --- a/web-frontend/src/main/v3/packages/constants/src/types/index.ts +++ b/web-frontend/src/main/v3/packages/constants/src/types/index.ts @@ -32,6 +32,7 @@ export * from './InspectorApplicationChart'; export * from './InspectorApplicationDataSourceChart'; export * from './Scatter'; export * from './SearchApplication'; +export * from './MenuItem'; export * from './SystemMetricChart'; export * from './SystemMetricHost'; export * from './SystemMetricHostGroup'; diff --git a/web-frontend/src/main/v3/packages/hooks/src/api/useGetTraceViewerData.ts b/web-frontend/src/main/v3/packages/hooks/src/api/useGetTraceViewerData.ts index 2d0eaca2228a..0f71f34e0cd4 100644 --- a/web-frontend/src/main/v3/packages/hooks/src/api/useGetTraceViewerData.ts +++ b/web-frontend/src/main/v3/packages/hooks/src/api/useGetTraceViewerData.ts @@ -4,12 +4,7 @@ import { convertParamsToQueryString } from '@pinpoint-fe/utils'; import { swrConfigs } from './swrConfigs'; const getQueryString = (queryParams: Partial) => { - if ( - queryParams.traceId && - queryParams.focusTimestamp && - queryParams.agentId && - queryParams.spanId - ) { + if (queryParams.traceId && queryParams.agentId && queryParams.spanId) { return '?' + convertParamsToQueryString(queryParams); } return ''; diff --git a/web-frontend/src/main/v3/packages/hooks/src/api/useGetTransactionInfo.ts b/web-frontend/src/main/v3/packages/hooks/src/api/useGetTransactionInfo.ts index 25a93768a8f6..1555c850d21c 100644 --- a/web-frontend/src/main/v3/packages/hooks/src/api/useGetTransactionInfo.ts +++ b/web-frontend/src/main/v3/packages/hooks/src/api/useGetTransactionInfo.ts @@ -7,12 +7,7 @@ import { swrConfigs } from './swrConfigs'; import { useExperimentals } from '../utility'; const getQueryString = (queryParams: Partial) => { - if ( - queryParams?.agentId && - queryParams?.spanId && - queryParams?.traceId && - queryParams?.focusTimestamp - ) { + if (queryParams?.agentId && queryParams?.spanId && queryParams?.traceId) { return '?' + convertParamsToQueryString(queryParams); } return ''; diff --git a/web-frontend/src/main/v3/packages/ui/package.json b/web-frontend/src/main/v3/packages/ui/package.json index 633a0d05ef49..d5345464aa94 100644 --- a/web-frontend/src/main/v3/packages/ui/package.json +++ b/web-frontend/src/main/v3/packages/ui/package.json @@ -77,7 +77,7 @@ "billboard.js": "3.9.4", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", - "cmdk": "^0.2.0", + "cmdk": "^1.0.0", "date-fns": "^2.28.0", "deepmerge": "^4.3.1", "fuse.js": "^7.0.0", @@ -93,10 +93,10 @@ "react-error-boundary": "^4.0.12", "react-fast-marquee": "^1.6.2", "react-hook-form": "^7.48.2", - "react-icons": "^4.11.0", + "react-icons": "^5.2.1", "react-international-phone": "^4.2.6", "react-popper": "^2.3.0", - "react-pro-sidebar": "^1.0.0", + "react-pro-sidebar": "^1.1.0", "react-resizable-panels": "^1.0.9", "react-responsive": "^9.0.2", "react-toastify": "^9.1.3", diff --git a/web-frontend/src/main/v3/packages/ui/src/components/GlobalSearch/GlobalSearch.tsx b/web-frontend/src/main/v3/packages/ui/src/components/GlobalSearch/GlobalSearch.tsx new file mode 100644 index 000000000000..3d0bb56236b3 --- /dev/null +++ b/web-frontend/src/main/v3/packages/ui/src/components/GlobalSearch/GlobalSearch.tsx @@ -0,0 +1,153 @@ +import { globalSearchDisplayAtom } from '@pinpoint-fe/atoms'; +import { MenuItem } from '@pinpoint-fe/constants'; +('@radix-ui/react-icons'); +import Fuse from 'fuse.js'; +import { + Command, + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, + CommandShortcut, +} from '../../'; +import { useAtom } from 'jotai'; +import React from 'react'; +import { createPortal } from 'react-dom'; +import { useNavigate } from 'react-router-dom'; +import { getTransactionDetailPathByTransactionId, isRegexString } from '@pinpoint-fe/utils'; +import { PiStack } from 'react-icons/pi'; + +export interface GlobalSearchProps { + services?: MenuItem[]; +} + +export const GlobalSearch = ({ services }: GlobalSearchProps) => { + const transactionIdRegExp = new RegExp(/^[a-zA-Z0-9-_.]+\^\d+\^\d+$/); + const navigate = useNavigate(); + const portalTargetElement = document.getElementById('__pinpoint_global_search__'); + const [open, setOpen] = useAtom(globalSearchDisplayAtom); + const [search, setSearch] = React.useState(''); + + React.useEffect(() => { + if (portalTargetElement) { + const down = (e: KeyboardEvent) => { + if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + setOpen((open) => !open); + } + if (e.code === 'Escape' && open) { + setOpen(false); + } + }; + document.addEventListener('keydown', down); + return () => document.removeEventListener('keydown', down); + } else { + console.warn('Please register the target element for global search portal in root html'); + } + }, [portalTargetElement]); + + const isTransactionId = (tid: string) => { + return transactionIdRegExp.test(tid.trim()); + }; + + const isValueFuzzyMatch = (value: string, search: string) => { + const fuzzySearch = new Fuse([value], { + threshold: 0.3, + }); + return fuzzySearch.search(search).length > 0 ? true : false; + }; + + return ( + portalTargetElement && + createPortal( + + { + if (search) { + const isValueMatch = isValueFuzzyMatch(value, search); + + if (keywords?.length) { + const isKeywordFromRegExpMatch = keywords.some((keyword) => { + const isKeyordFromRegExp = isRegexString(keyword); + if (isKeyordFromRegExp) { + return new RegExp(keyword.slice(1, -1)).test(search); + } else { + const extendValue = value + ' ' + keywords.join(' '); + return isValueFuzzyMatch(extendValue, search); + } + }); + + return Number(isValueMatch || isKeywordFromRegExpMatch); + } else { + return Number(isValueMatch); + } + } + return 0; + }} + > + { + const trimmedInput = e.currentTarget.value.trim(); + + if (e.code === 'Enter' && isTransactionId(trimmedInput)) { + navigate(getTransactionDetailPathByTransactionId(trimmedInput)); + setOpen(false); + } + }} + /> + + No results found. + + { + navigate(getTransactionDetailPathByTransactionId(search)); + setOpen(false); + }} + > + + Search by Transaction Id + ex) example^1720167721270^12345 + + + + + {services?.map((service, i) => { + const Icon = service.icon; + if (service.hide) { + return null; + } + return ( + { + if (service.href) { + navigate(service.href); + setOpen(false); + } + }} + > + {Icon && Icon} + {service.name} + {service.path} + + ); + })} + + + + , + portalTargetElement, + ) + ); +}; diff --git a/web-frontend/src/main/v3/packages/ui/src/components/GlobalSearch/index.ts b/web-frontend/src/main/v3/packages/ui/src/components/GlobalSearch/index.ts new file mode 100644 index 000000000000..17d8e8625572 --- /dev/null +++ b/web-frontend/src/main/v3/packages/ui/src/components/GlobalSearch/index.ts @@ -0,0 +1 @@ +export * from './GlobalSearch'; diff --git a/web-frontend/src/main/v3/packages/ui/src/components/Layout/LayoutWithSideNavigation.tsx b/web-frontend/src/main/v3/packages/ui/src/components/Layout/LayoutWithSideNavigation.tsx index 3a6edad491d3..5b756fbab699 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/Layout/LayoutWithSideNavigation.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/Layout/LayoutWithSideNavigation.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Link, useLocation } from 'react-router-dom'; -import { IMAGE_PATH, APP_PATH } from '@pinpoint-fe/constants'; +import { IMAGE_PATH, APP_PATH, APP_SETTING_KEYS, MenuItem } from '@pinpoint-fe/constants'; import { Menu, MenuItem as MenuItemComponent, @@ -10,19 +10,25 @@ import { SubMenu, bottomMenuItemStyles, menuItemStyles, - useProSidebar, } from '../Sidebar'; import { cn } from '../../lib'; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '..'; +import { + GlobalSearch, + Separator, + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '..'; import { useDebounce, useHover } from 'usehooks-ts'; +import { RxMagnifyingGlass } from 'react-icons/rx'; +import { LuCommand } from 'react-icons/lu'; +import { useLocalStorage } from '@pinpoint-fe/hooks'; +import { useAtom } from 'jotai'; +import { globalSearchDisplayAtom } from '@pinpoint-fe/atoms'; -export type SideNavigationMenuItem = { - hide?: boolean; - path: string | string[]; - name?: string; - href?: string; +export type SideNavigationMenuItem = MenuItem & { aHref?: string; - icon?: React.ReactNode; children?: React.ReactNode | ((collapsed: boolean) => React.ReactNode); childItems?: SideNavigationMenuItem[]; onClick?: () => void; @@ -35,7 +41,7 @@ interface MenuItemProps { interface TooltipProps { trigger: React.JSX.Element; - content: string; + content: React.ReactNode; } export interface LayoutWithSideNavigationProps { @@ -49,7 +55,8 @@ export const LayoutWithSideNavigation = ({ topMenuItems, bottomMenuItems, }: LayoutWithSideNavigationProps) => { - const { collapsed } = useProSidebar(); + const [, setGlobalSearchOpen] = useAtom(globalSearchDisplayAtom); + const [collapsed] = useLocalStorage(APP_SETTING_KEYS.SIDE_NAV_BAR_SCALE, false); const { pathname } = useLocation(); const SubMenuItem = ({ item }: MenuItemProps) => { @@ -63,54 +70,82 @@ export const LayoutWithSideNavigation = ({ } return false; }); + const [open, setOpen] = React.useState(isActive); React.useEffect(() => { if (collapsed && subMenuContentElement) { - subMenuContentElement.style.visibility = isHover ? 'visible' : 'hidden'; + // setOpen(false); + if (isHover) { + // setOpen(true); + subMenuContentElement.style.visibility = 'visible'; + subMenuContentElement.style.marginLeft = '6px'; + } else { + // setOpen(false); + subMenuContentElement.style.visibility = 'hidden'; + } } }, [isHover, collapsed]); React.useEffect(() => { + if (collapsed) { + setOpen(false); + } if (!collapsed && subMenuContentElement) { subMenuContentElement.style.visibility = 'visible'; + if (isActive) { + setOpen(true); + } } - }, [collapsed]); + }, [collapsed, isActive]); return ( {item.icon}} active={isActive} - defaultOpen={isActive} + open={open} onClick={(e) => { if (collapsed) { e.stopPropagation(); e.preventDefault(); return; + } else { + setOpen(!open); } }} > {collapsed && ( - - {item.name} - + <> + + {item.name} + + + )} - {item.childItems?.map((childItem) => MenuItem({ item: childItem, className: 'text-sm' }))} + {open &&
} +
+ {item.childItems?.map((childItem) => MenuItem({ item: childItem, className: 'text-sm' }))} +
); }; const MenuItem = ({ item, className }: MenuItemProps) => { + const isActive = Array.isArray(item.path) + ? item.path.includes(pathname) + : pathname.startsWith(item.path); return ( : } - className={cn({ '!hidden': item.hide }, className)} - active={ - Array.isArray(item.path) ? item.path.includes(pathname) : pathname.startsWith(item.path) - } - icon={item.icon} + className={cn('mb-0.5', { '!hidden': item.hide }, className)} + active={isActive} + icon={item.icon && {item.icon}} key={getMenuKey(item.path)} > {item.children @@ -148,7 +183,37 @@ export const LayoutWithSideNavigation = ({ }} > - + + {WithTooltip({ + trigger: ( + se} + className={cn('mb-0.5 group/global-search')} + icon={} + onClick={() => setGlobalSearchOpen(true)} + > +
+ Search... +
+ K{/* ctrl K */} +
+
+
+ ), + content: ( +
+ Search... +
+ K +
+
+ ), + })} +
+
+ +
+ {topMenuItems?.map((item) => { return ( @@ -157,7 +222,7 @@ export const LayoutWithSideNavigation = ({ ); })} - + {bottomMenuItems?.map((item) => { return ( @@ -178,6 +243,7 @@ export const LayoutWithSideNavigation = ({ > {children}
+ ); }; diff --git a/web-frontend/src/main/v3/packages/ui/src/components/ServerMapSearchList/ServerMapSearchList.tsx b/web-frontend/src/main/v3/packages/ui/src/components/ServerMapSearchList/ServerMapSearchList.tsx index f02f8d3b4c31..ca97aab4a8b6 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/ServerMapSearchList/ServerMapSearchList.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/ServerMapSearchList/ServerMapSearchList.tsx @@ -1,9 +1,17 @@ import React from 'react'; import { FaSearch } from 'react-icons/fa'; +import { useTranslation } from 'react-i18next'; import { FilteredMap, GetServerMap } from '@pinpoint-fe/constants'; import { Popover, PopoverContent, PopoverTrigger } from '../ui/popover'; import { Button } from '../ui/button'; -import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from '../ui/command'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '../ui/command'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '..'; export interface ServerMapSearchListProps { @@ -17,6 +25,7 @@ export const ServerMapSearchList = ({ onClickItem, inputPlaceHolder = 'Input Node Name', }: ServerMapSearchListProps) => { + const { t } = useTranslation(); const [open, setOpen] = React.useState(false); const handleClickItem: ServerMapSearchListProps['onClickItem'] = (node) => { @@ -43,18 +52,20 @@ export const ServerMapSearchList = ({ - No framework found. - - {list.map((l, i) => { - const text = `${l.applicationName} (${l.serviceType})`; + + {t('COMMON.EMPTY_ON_SEARCH')} + + {list.map((l, i) => { + const text = `${l.applicationName} (${l.serviceType})`; - return ( - handleClickItem(l)}> -
{text}
-
- ); - })} -
+ return ( + handleClickItem(l)}> +
{text}
+
+ ); + })} +
+
diff --git a/web-frontend/src/main/v3/packages/ui/src/components/Sidebar/Sidebar.tsx b/web-frontend/src/main/v3/packages/ui/src/components/Sidebar/Sidebar.tsx index 7f3fd7ad17aa..9574629a0ef4 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/Sidebar/Sidebar.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/Sidebar/Sidebar.tsx @@ -1,15 +1,14 @@ import React from 'react'; import { - useProSidebar, Menu, MenuItem, Sidebar as ProSidebar, - ProSidebarProvider as SidebarProvider, SubMenu, sidebarClasses, MenuItemStyles, + ElementStyles, + MenuItemStylesParams, } from 'react-pro-sidebar'; -import { useUpdateEffect } from 'usehooks-ts'; import { APP_SETTING_KEYS } from '@pinpoint-fe/constants'; import { cn } from '../../lib'; import { useLocalStorage } from '@pinpoint-fe/hooks'; @@ -21,24 +20,20 @@ export interface SideNavigationProps { } const SIDEBAR_WIDTH = 200; -const SIDEBAR_COLLAPSED_WIDTH = 80; +const SIDEBAR_COLLAPSED_WIDTH = 64; const Sidebar = ({ children, header }: SideNavigationProps) => { - const { collapseSidebar, collapsed } = useProSidebar(); - const [sidebarScale, setSidebarScale] = useLocalStorage( - APP_SETTING_KEYS.SIDE_NAV_BAR_SCALE, - false, - ); + const [collapsed, setCollapsed] = useLocalStorage(APP_SETTING_KEYS.SIDE_NAV_BAR_SCALE, false); - useUpdateEffect(() => { - setSidebarScale(collapsed); + React.useEffect(() => { + setCollapsed(collapsed); }, [collapsed]); return ( {
@@ -74,42 +69,82 @@ const Sidebar = ({ children, header }: SideNavigationProps) => { ); }; -const menuItemStyles: MenuItemStyles = { - icon: { - fontSize: '1rem', - marginRight: '4px', - }, - button: ({ active }) => ({ - height: 45, +const getMenuItemStyle = ({ + level, + active, + isSubmenu, + open, +}: MenuItemStylesParams): ElementStyles => { + const isSubmenuGroup = isSubmenu && level === 0; + let backgroundColor = ''; + + if (isSubmenuGroup && open) { + backgroundColor = 'var(--snb-submenu-background)'; + } + if ((active && !isSubmenuGroup) || (active && isSubmenuGroup && !open)) { + backgroundColor = 'var(--blue-700)'; + } + + return { + padding: '0px 0.5rem 0px 0.375rem', + paddingLeft: level === 1 ? '1.5rem' : '', + height: '2.5rem', + borderRadius: '0.25rem', + borderBottomLeftRadius: isSubmenuGroup && open ? 0 : '', + borderBottomRightRadius: isSubmenuGroup && open ? 0 : '', fontWeight: active ? 600 : 'unset', - color: 'var(--white-default)', - opacity: active ? 1 : 0.65, + backgroundColor, + fontSize: '0.875rem', '&:hover': { color: 'var(--white-default)', - backgroundColor: 'var(--blue-800)', + backgroundColor: 'var(--blue-700)', opacity: 1, }, + }; +}; + +const opacityHelper = (active: boolean) => { + return { + opacity: active ? 1 : 0.7, + }; +}; + +const menuItemStyles: MenuItemStyles = { + icon: ({ active }) => ({ + marginRight: '0.25rem', + ...opacityHelper(active), }), + label: ({ active }) => ({ + ...opacityHelper(active), + }), + button: (props) => { + return { + ...getMenuItemStyle(props), + }; + }, }; const bottomMenuItemStyles: MenuItemStyles = { - icon: { - marginRight: '4px', - }, - button: ({ active }) => ({ - height: 45, - fontWeight: active ? 600 : 'unset', - color: 'var(--white-default)', - opacity: active ? 1 : 0.65, - '&:hover': { - color: 'var(--white-default)', - backgroundColor: 'var(--blue-700)', - opacity: 1, - }, + icon: ({ active }) => ({ + marginRight: '0.25rem', + ...opacityHelper(active), }), - subMenuContent: () => ({ - backgroundColor: 'var(--snb-submenu-background)', + label: ({ active }) => ({ + ...opacityHelper(active), }), + button: (props) => { + return { + ...getMenuItemStyle(props), + }; + }, + subMenuContent: ({ open }) => { + return { + borderRadius: '0.25rem', + borderTopLeftRadius: open ? 0 : '', + borderTopRightRadius: open ? 0 : '', + backgroundColor: 'var(--snb-submenu-background)', + }; + }, SubMenuExpandIcon: () => ({ height: `100%`, display: `flex`, @@ -120,12 +155,10 @@ const bottomMenuItemStyles: MenuItemStyles = { export { Menu, MenuItem, - SidebarProvider, Sidebar, SubMenu, menuItemStyles, bottomMenuItemStyles, - useProSidebar, SIDEBAR_COLLAPSED_WIDTH, SIDEBAR_WIDTH, }; diff --git a/web-frontend/src/main/v3/packages/ui/src/components/Transaction/charts/TransactionCharts.tsx b/web-frontend/src/main/v3/packages/ui/src/components/Transaction/charts/TransactionCharts.tsx index db237f4d730a..b1914d622763 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/Transaction/charts/TransactionCharts.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/Transaction/charts/TransactionCharts.tsx @@ -13,6 +13,8 @@ import { useTransactionSearchParameters } from '@pinpoint-fe/hooks'; import { addMinutes, subMinutes } from 'date-fns'; import { ChartCore } from '../../../components/Inspector/charts/ChartCore'; import { useBreakpoint } from '../../../lib/useBreakpoint'; +import { useAtomValue } from 'jotai'; +import { transactionInfoDatasAtom } from '@pinpoint-fe/atoms'; const chartIdList: AGENT_CHART_ID[] = ['heap', 'nonHeap', 'cpu']; @@ -22,7 +24,8 @@ export const TransactionCharts = () => { const { isAboveXl, isBelowXl } = useBreakpoint('xl'); const containerRef = React.useRef(null); const { transactionInfo } = useTransactionSearchParameters(); - const focusTimestamp = transactionInfo.focusTimestamp; + const transactionInfoData = useAtomValue(transactionInfoDatasAtom); + const focusTimestamp = transactionInfo.focusTimestamp || transactionInfoData?.callStackEnd; const fromDate = subMinutes(focusTimestamp, 10); const toDate = addMinutes(focusTimestamp, 10); @@ -40,6 +43,10 @@ export const TransactionCharts = () => { }; }, []); + if (!focusTimestamp) { + return null; + } + return (
{isAboveXl && ( diff --git a/web-frontend/src/main/v3/packages/ui/src/components/Transaction/transaction-info/TransactionInfoFetcher.tsx b/web-frontend/src/main/v3/packages/ui/src/components/Transaction/transaction-info/TransactionInfoFetcher.tsx index b430a354dfd2..54b39b196947 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/Transaction/transaction-info/TransactionInfoFetcher.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/Transaction/transaction-info/TransactionInfoFetcher.tsx @@ -4,6 +4,7 @@ import { useGetTransactionInfo } from '@pinpoint-fe/hooks'; import { useAtom, useSetAtom } from 'jotai'; import { useTranslation } from 'react-i18next'; import { FaChevronRight } from 'react-icons/fa6'; +import { useNavigate } from 'react-router-dom'; import { Button, ServerMapCore, Tabs, TabsContent, TabsList, TabsTrigger } from '../..'; import { CallTree } from '..'; import { @@ -30,6 +31,7 @@ const tabList = [ ]; export const TransactionInfoFetcher = ({ disableHeader }: TransactionInfoFetcherProps) => { + const navigate = useNavigate(); const { application, transactionInfo } = useTransactionSearchParameters(); const { data, tableData, mapData } = useGetTransactionInfo(); const setTransactionInfo = useSetAtom(transactionInfoDatasAtom); @@ -38,7 +40,25 @@ export const TransactionInfoFetcher = ({ disableHeader }: TransactionInfoFetcher React.useEffect(() => { setTransactionInfo(data); - }, [data]); + // transaction 검색으로 들어온 경우 redirect + if (data && data.spanId === -1 && !application) { + const applicationName = data.applicationId; + const serviceType = data.applicationMapData.nodeDataArray.find( + (node) => node.applicationName === applicationName, + )?.serviceType; + const navigatePath = `${getTransactionDetailPath({ applicationName, serviceType })}?${getTransactionDetailQueryString( + { + agentId: data.agentId, + traceId: data.transactionId, + spanId: transactionInfo.spanId, + focusTimestamp: transactionInfo.focusTimestamp, + }, + )}`; + navigate(navigatePath, { + replace: true, + }); + } + }, [data, application?.applicationName, application?.serviceType]); if (!data) { return ( diff --git a/web-frontend/src/main/v3/packages/ui/src/components/index.ts b/web-frontend/src/main/v3/packages/ui/src/components/index.ts index 5a3c0efb9a0c..8abd6c42f9ed 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/index.ts +++ b/web-frontend/src/main/v3/packages/ui/src/components/index.ts @@ -17,6 +17,7 @@ export * from './Error'; export * from './ErrorAnalysis'; export * from './FilterMap'; export * from './Form'; +export * from './GlobalSearch'; export * from './HighLightCode'; export * from './HOC'; export * from './Host'; diff --git a/web-frontend/src/main/v3/packages/ui/src/components/ui/command.tsx b/web-frontend/src/main/v3/packages/ui/src/components/ui/command.tsx index 2dcc059fe0bd..8288c1549401 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/ui/command.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/ui/command.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { DialogProps } from '@radix-ui/react-dialog'; +import { type DialogProps } from '@radix-ui/react-dialog'; import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; import { Command as CommandPrimitive } from 'cmdk'; @@ -114,7 +114,8 @@ const CommandItem = React.forwardRef< - Error Analysis + Error Analysis
} > diff --git a/web-frontend/src/main/v3/packages/ui/src/pages/Inspector.tsx b/web-frontend/src/main/v3/packages/ui/src/pages/Inspector.tsx index b6b82180c519..e9f2e7d388a6 100644 --- a/web-frontend/src/main/v3/packages/ui/src/pages/Inspector.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/pages/Inspector.tsx @@ -17,7 +17,7 @@ import { ApplicationCombinedListProps, } from '../components'; import { convertParamsToQueryString, getInspectorPath } from '@pinpoint-fe/utils'; -import { FaChartLine } from 'react-icons/fa'; +import { PiChartLineDuotone } from 'react-icons/pi'; export interface InspectorPageProps { ApplicationList?: (props: ApplicationCombinedListProps) => JSX.Element; @@ -47,7 +47,7 @@ export const InspectorPage = ({ - + Inspector Beta diff --git a/web-frontend/src/main/v3/packages/ui/src/pages/ScatterFullScreen.tsx b/web-frontend/src/main/v3/packages/ui/src/pages/ScatterFullScreen.tsx index 2095df410e8d..c812aba3c165 100644 --- a/web-frontend/src/main/v3/packages/ui/src/pages/ScatterFullScreen.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/pages/ScatterFullScreen.tsx @@ -15,7 +15,7 @@ import { MainHeader, ScatterChart, } from '../components'; -import { FaNetworkWired } from 'react-icons/fa'; +import { PiTreeStructureDuotone } from 'react-icons/pi'; import { useTranslation } from 'react-i18next'; export const ScatterFullScreenPage = () => { @@ -54,7 +54,7 @@ export const ScatterFullScreenPage = () => { - + Servermap diff --git a/web-frontend/src/main/v3/packages/ui/src/pages/SystemMetric.tsx b/web-frontend/src/main/v3/packages/ui/src/pages/SystemMetric.tsx index 428fb5c1c9be..2b08a8cf10da 100644 --- a/web-frontend/src/main/v3/packages/ui/src/pages/SystemMetric.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/pages/SystemMetric.tsx @@ -12,7 +12,7 @@ import { useNavigate } from 'react-router-dom'; import { useSystemMetricSearchParameters } from '@pinpoint-fe/hooks'; import { convertParamsToQueryString, getSystemMetricPath } from '@pinpoint-fe/utils'; import { useTranslation } from 'react-i18next'; -import { FaServer } from 'react-icons/fa'; +import { PiHardDrivesDuotone } from 'react-icons/pi'; export const SystemMetricPage = () => { const navigate = useNavigate(); @@ -36,7 +36,7 @@ export const SystemMetricPage = () => { - System Metric + System Metric
} > diff --git a/web-frontend/src/main/v3/packages/ui/src/pages/TransactionDetail.tsx b/web-frontend/src/main/v3/packages/ui/src/pages/TransactionDetail.tsx index 2fad4d9e0280..4ea5badeb987 100644 --- a/web-frontend/src/main/v3/packages/ui/src/pages/TransactionDetail.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/pages/TransactionDetail.tsx @@ -1,7 +1,7 @@ import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../components/ui/resizable'; import { TransactionInfo, TransactionInfoProps } from '../components/Transaction'; import { MainHeader, ApplicationCombinedList } from '../components'; -import { PiStackFill } from 'react-icons/pi'; +import { PiStackDuotone } from 'react-icons/pi'; import { useAtomValue } from 'jotai'; import { FaChevronRight } from 'react-icons/fa6'; import { useTransactionSearchParameters } from '@pinpoint-fe/hooks'; @@ -23,7 +23,7 @@ export const TransactionDetailPage = ({ transactionInfoProps }: TransactionDetai className="shadow" title={
- Transaction Detail + Transaction Detail
} > @@ -45,7 +45,7 @@ export const TransactionDetailPage = ({ transactionInfoProps }: TransactionDetai autoSaveId={APP_SETTING_KEYS.TRANSACTION_DETAIL_RESIZABLE} > - + {application && } diff --git a/web-frontend/src/main/v3/packages/ui/src/pages/TransactionList.tsx b/web-frontend/src/main/v3/packages/ui/src/pages/TransactionList.tsx index df2b0b3ba4b1..7798c5ce8bb6 100644 --- a/web-frontend/src/main/v3/packages/ui/src/pages/TransactionList.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/pages/TransactionList.tsx @@ -7,12 +7,12 @@ import { ProgressBarWithControls, Separator, } from '../components'; -import { PiStackFill } from 'react-icons/pi'; import { useAtomValue } from 'jotai'; import { differenceInMinutes } from 'date-fns'; import { useTransactionSearchParameters } from '@pinpoint-fe/hooks'; import { transactionListDatasAtom } from '@pinpoint-fe/atoms'; import { APP_SETTING_KEYS } from '@pinpoint-fe/constants'; +import { PiStackDuotone } from 'react-icons/pi'; export interface TransactionListPageProps { transactionInfoProps?: TransactionInfoProps; @@ -29,7 +29,7 @@ export const TransactionListPage = ({ transactionInfoProps }: TransactionListPag className="shadow" title={
- Transaction list + Transaction list
} > diff --git a/web-frontend/src/main/v3/packages/ui/src/pages/UrlStatistic.tsx b/web-frontend/src/main/v3/packages/ui/src/pages/UrlStatistic.tsx index 45d2259145bb..097089897fd6 100644 --- a/web-frontend/src/main/v3/packages/ui/src/pages/UrlStatistic.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/pages/UrlStatistic.tsx @@ -14,7 +14,7 @@ import { useNavigate } from 'react-router-dom'; import { convertParamsToQueryString, getUrlStatPath } from '@pinpoint-fe/utils'; import { useUrlStatSearchParameters } from '@pinpoint-fe/hooks'; import { useTranslation } from 'react-i18next'; -import { FaChartBar } from 'react-icons/fa'; +import { PiChartBarDuotone } from 'react-icons/pi'; export interface UrlStatisticPageProps { ApplicationList?: (props: ApplicationCombinedListProps) => JSX.Element; @@ -44,7 +44,7 @@ export const UrlStatisticPage = ({ - URL Statistic + URL Statistic } > diff --git a/web-frontend/src/main/v3/packages/utils/src/helper/transaction.ts b/web-frontend/src/main/v3/packages/utils/src/helper/transaction.ts index 1c0e4801bd34..0b32472b5509 100644 --- a/web-frontend/src/main/v3/packages/utils/src/helper/transaction.ts +++ b/web-frontend/src/main/v3/packages/utils/src/helper/transaction.ts @@ -1,4 +1,5 @@ import { TransactionInfo } from '@pinpoint-fe/constants'; +import { getTransactionDetailPath } from './route'; export type TransactionListQueryParam = { x1: number; @@ -43,3 +44,15 @@ export const getTransactionTableUniqueKey = (transaction: { transaction?.application || transaction?.path }`; }; + +export const getTransactionDetailPathByTransactionId = (transactionId: string) => { + const trimmedId = transactionId.trim(); + const [agentId] = trimmedId.split('^'); + + return `${getTransactionDetailPath()}?${getTransactionDetailQueryString({ + agentId, + spanId: '-1', + traceId: trimmedId, + focusTimestamp: 0, + })}`; +}; diff --git a/web-frontend/src/main/v3/packages/utils/src/index.ts b/web-frontend/src/main/v3/packages/utils/src/index.ts index c2ca1a4ed5b6..6c5a747aec46 100644 --- a/web-frontend/src/main/v3/packages/utils/src/index.ts +++ b/web-frontend/src/main/v3/packages/utils/src/index.ts @@ -7,4 +7,5 @@ export * from './helper'; export * from './localStorage'; export * from './number'; export * from './object'; +export * from './regexp'; export * from './string'; diff --git a/web-frontend/src/main/v3/packages/utils/src/regexp.ts b/web-frontend/src/main/v3/packages/utils/src/regexp.ts new file mode 100644 index 000000000000..39d3dcf6a8fe --- /dev/null +++ b/web-frontend/src/main/v3/packages/utils/src/regexp.ts @@ -0,0 +1,3 @@ +export const isRegexString = (str: string) => { + return /^\/.*\/[gi]*$/.test(str); +}; diff --git a/web-frontend/src/main/v3/yarn.lock b/web-frontend/src/main/v3/yarn.lock index e411ed23125d..1221a3dc388a 100644 --- a/web-frontend/src/main/v3/yarn.lock +++ b/web-frontend/src/main/v3/yarn.lock @@ -2491,13 +2491,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/primitive@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" - integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" @@ -2505,6 +2498,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/primitive@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" + integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== + "@radix-ui/react-accordion@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz#738441f7343e5142273cdef94d12054c3287966f" @@ -2583,13 +2581,6 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-slot" "1.0.2" -"@radix-ui/react-compose-refs@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" - integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" @@ -2597,6 +2588,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-compose-refs@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" + integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + "@radix-ui/react-context-menu@^2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-context-menu/-/react-context-menu-2.1.5.tgz#1bdbd72761439f9166f75dc4598f276265785c83" @@ -2610,13 +2606,6 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-controllable-state" "1.0.1" -"@radix-ui/react-context@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0" - integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-context@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" @@ -2624,28 +2613,12 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dialog@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz#997e97cb183bc90bd888b26b8e23a355ac9fe5f0" - integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.0" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-portal" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-slot" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.4" +"@radix-ui/react-context@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" + integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== -"@radix-ui/react-dialog@1.0.5", "@radix-ui/react-dialog@^1.0.5": +"@radix-ui/react-dialog@1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz#71657b1b116de6c7a0b03242d7d43e01062c7300" integrity sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q== @@ -2666,6 +2639,26 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" +"@radix-ui/react-dialog@^1.0.5": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz#4906507f7b4ad31e22d7dad69d9330c87c431d44" + integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + "@radix-ui/react-direction@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" @@ -2673,18 +2666,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dismissable-layer@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz#35b7826fa262fd84370faef310e627161dffa76b" - integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-escape-keydown" "1.0.0" - "@radix-ui/react-dismissable-layer@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz#883a48f5f938fa679427aa17fcba70c5494c6978" @@ -2709,6 +2690,17 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" +"@radix-ui/react-dismissable-layer@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz#2cd0a49a732372513733754e6032d3fb7988834e" + integrity sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + "@radix-ui/react-dropdown-menu@^2.0.5": version "2.0.6" resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz#cdf13c956c5e263afe4e5f3587b3071a25755b63" @@ -2723,13 +2715,6 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-controllable-state" "1.0.1" -"@radix-ui/react-focus-guards@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz#339c1c69c41628c1a5e655f15f7020bf11aa01fa" - integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-focus-guards@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" @@ -2737,15 +2722,10 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-focus-scope@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz#95a0c1188276dc8933b1eac5f1cdb6471e01ade5" - integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-use-callback-ref" "1.0.0" +"@radix-ui/react-focus-guards@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz#8e9abb472a9a394f59a1b45f3dd26cfe3fc6da13" + integrity sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw== "@radix-ui/react-focus-scope@1.0.3": version "1.0.3" @@ -2767,6 +2747,15 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-hover-card@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@radix-ui/react-hover-card/-/react-hover-card-1.0.7.tgz#684bca2504432566357e7157e087051aa3577948" @@ -2788,14 +2777,6 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-icons/-/react-icons-1.3.0.tgz#c61af8f323d87682c5ca76b856d60c2312dbcb69" integrity sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw== -"@radix-ui/react-id@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e" - integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-id@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" @@ -2804,6 +2785,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-id@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-label@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.0.2.tgz#9c72f1d334aac996fdc27b48a8bdddd82108fb6d" @@ -2893,14 +2881,6 @@ "@radix-ui/react-use-size" "1.0.1" "@radix-ui/rect" "1.0.1" -"@radix-ui/react-portal@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.0.tgz#7220b66743394fabb50c55cb32381395cc4a276b" - integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-portal@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" @@ -2917,14 +2897,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" -"@radix-ui/react-presence@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" - integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== +"@radix-ui/react-portal@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz#1957f1eb2e1aedfb4a5475bd6867d67b50b1d15f" + integrity sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-presence@1.0.1": version "1.0.1" @@ -2935,13 +2914,13 @@ "@radix-ui/react-compose-refs" "1.0.1" "@radix-ui/react-use-layout-effect" "1.0.1" -"@radix-ui/react-primitive@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz#376cd72b0fcd5e0e04d252ed33eb1b1f025af2b0" - integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ== +"@radix-ui/react-presence@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz#227d84d20ca6bfe7da97104b1a8b48a833bfb478" + integrity sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-primitive@1.0.3": version "1.0.3" @@ -2951,6 +2930,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-slot" "1.0.2" +"@radix-ui/react-primitive@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== + dependencies: + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-radio-group@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz#3197f5dcce143bcbf961471bf89320735c0212d3" @@ -3082,14 +3068,6 @@ "@radix-ui/react-use-previous" "1.0.1" "@radix-ui/react-use-size" "1.0.1" -"@radix-ui/react-slot@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.0.tgz#7fa805b99891dea1e862d8f8fbe07f4d6d0fd698" - integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-slot@1.0.2", "@radix-ui/react-slot@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" @@ -3098,6 +3076,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" +"@radix-ui/react-slot@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-tabs@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz#993608eec55a5d1deddd446fa9978d2bc1053da2" @@ -3189,13 +3174,6 @@ "@radix-ui/react-use-controllable-state" "1.0.1" "@radix-ui/react-visually-hidden" "1.0.3" -"@radix-ui/react-use-callback-ref@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" - integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" @@ -3203,13 +3181,10 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-use-controllable-state@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" - integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" +"@radix-ui/react-use-callback-ref@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== "@radix-ui/react-use-controllable-state@1.0.1": version "1.0.1" @@ -3219,13 +3194,12 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" -"@radix-ui/react-use-escape-keydown@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz#aef375db4736b9de38a5a679f6f49b45a060e5d1" - integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg== +"@radix-ui/react-use-controllable-state@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown@1.0.3": version "1.0.3" @@ -3235,12 +3209,12 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" -"@radix-ui/react-use-layout-effect@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" - integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== dependencies: - "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect@1.0.1": version "1.0.1" @@ -3249,6 +3223,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-layout-effect@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== + "@radix-ui/react-use-previous@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz#b595c087b07317a4f143696c6a01de43b0d0ec66" @@ -8151,12 +8130,13 @@ clsx@^2.0.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== -cmdk@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cmdk/-/cmdk-0.2.1.tgz#aa8e1332bb0b8d8484e793017c82537351188d9a" - integrity sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g== +cmdk@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz#0a095fdafca3dfabed82d1db78a6262fb163ded9" + integrity sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q== dependencies: - "@radix-ui/react-dialog" "1.0.0" + "@radix-ui/react-dialog" "1.0.5" + "@radix-ui/react-primitive" "1.0.3" co@^4.6.0: version "4.6.0" @@ -15823,10 +15803,10 @@ react-i18next@^13.0.2: "@babel/runtime" "^7.22.5" html-parse-stringify "^3.0.1" -react-icons@^4.11.0, react-icons@^4.9.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" - integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== +react-icons@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz#28c2040917b2a2eda639b0f797bff1888e018e4a" + integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== react-inspector@^5.1.0: version "5.1.1" @@ -15880,7 +15860,7 @@ react-popper@^2.2.5, react-popper@^2.3.0: react-fast-compare "^3.0.1" warning "^4.0.2" -react-pro-sidebar@^1.0.0: +react-pro-sidebar@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/react-pro-sidebar/-/react-pro-sidebar-1.1.0.tgz#e8f4ca0d7c4ff9fd2c38f8a0b85664083173b7ac" integrity sha512-rdRJ4PeMsqWq9n69AmF6et6qCbhCF1KEBgjAH8vIiLxE1k5fMxtRYo0k4asxW8qpIH6sqahiMxrxVVoObv8orQ== @@ -15900,7 +15880,7 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== -react-remove-scroll-bar@^2.3.3: +react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4: version "2.3.6" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== @@ -15908,10 +15888,10 @@ react-remove-scroll-bar@^2.3.3: react-style-singleton "^2.2.1" tslib "^2.0.0" -react-remove-scroll@2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0" - integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== dependencies: react-remove-scroll-bar "^2.3.3" react-style-singleton "^2.2.1" @@ -15919,12 +15899,12 @@ react-remove-scroll@2.5.4: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" -react-remove-scroll@2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== +react-remove-scroll@2.5.7: + version "2.5.7" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" + integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== dependencies: - react-remove-scroll-bar "^2.3.3" + react-remove-scroll-bar "^2.3.4" react-style-singleton "^2.2.1" tslib "^2.1.0" use-callback-ref "^1.3.0"