diff --git a/apps/start/package.json b/apps/start/package.json index 3d0e49a2..f28035da 100644 --- a/apps/start/package.json +++ b/apps/start/package.json @@ -18,6 +18,12 @@ }, "dependencies": { "@ai-sdk/react": "^1.2.5", + "@codemirror/commands": "^6.7.0", + "@codemirror/lang-javascript": "^6.2.0", + "@codemirror/lang-json": "^6.0.1", + "@codemirror/state": "^6.4.0", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.35.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", @@ -28,8 +34,8 @@ "@number-flow/react": "0.5.10", "@openpanel/common": "workspace:^", "@openpanel/constants": "workspace:^", - "@openpanel/integrations": "workspace:^", "@openpanel/importer": "workspace:^", + "@openpanel/integrations": "workspace:^", "@openpanel/json": "workspace:*", "@openpanel/payments": "workspace:*", "@openpanel/sdk-info": "workspace:^", @@ -84,12 +90,6 @@ "@types/d3": "^7.4.3", "ai": "^4.2.10", "bind-event-listener": "^3.0.0", - "@codemirror/commands": "^6.7.0", - "@codemirror/lang-javascript": "^6.2.0", - "@codemirror/lang-json": "^6.0.1", - "@codemirror/state": "^6.4.0", - "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.35.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^0.2.1", diff --git a/apps/start/src/components/events/table/columns.tsx b/apps/start/src/components/events/table/columns.tsx index 197ef28c..4e58244e 100644 --- a/apps/start/src/components/events/table/columns.tsx +++ b/apps/start/src/components/events/table/columns.tsx @@ -7,6 +7,7 @@ import { getProfileName } from '@/utils/getters'; import type { ColumnDef } from '@tanstack/react-table'; import { ColumnCreatedAt } from '@/components/column-created-at'; +import { ProfileAvatar } from '@/components/profiles/profile-avatar'; import { KeyValueGrid } from '@/components/ui/key-value-grid'; import type { IServiceEvent } from '@openpanel/db'; @@ -107,8 +108,9 @@ export function useColumns() { return ( + {getProfileName(profile)} ); diff --git a/apps/start/src/components/events/table/item.tsx b/apps/start/src/components/events/table/item.tsx index 7c42c8b1..f50ee324 100644 --- a/apps/start/src/components/events/table/item.tsx +++ b/apps/start/src/components/events/table/item.tsx @@ -1,5 +1,6 @@ import { ProfileAvatar } from '@/components/profiles/profile-avatar'; import { SerieIcon } from '@/components/report-chart/common/serie-icon'; +import { Tooltiper } from '@/components/ui/tooltip'; import { pushModal } from '@/modals'; import { cn } from '@/utils/cn'; import { formatTimeAgoOrDateTime } from '@/utils/date'; @@ -115,7 +116,7 @@ export const EventItem = memo( )} {viewOptions.profileId !== false && ( } > {getProfileName(event.profile)} @@ -164,7 +165,8 @@ function Pill({ className, }: { children: React.ReactNode; icon?: React.ReactNode; className?: string }) { return ( -
{icon &&
{icon}
}
{children}
-
+ ); } diff --git a/apps/start/src/components/facehash/avatar-fallback.tsx b/apps/start/src/components/facehash/avatar-fallback.tsx new file mode 100644 index 00000000..56d93ae4 --- /dev/null +++ b/apps/start/src/components/facehash/avatar-fallback.tsx @@ -0,0 +1,161 @@ +import * as React from 'react'; +import { useAvatarContext } from './avatar'; +import { Facehash, type FacehashProps } from './facehash'; + +const WHITESPACE_REGEX = /\s+/; + +export type AvatarFallbackProps = Omit< + React.HTMLAttributes, + 'children' +> & { + /** + * The name to derive initials and Facehash from. + */ + name?: string; + + /** + * Delay in milliseconds before showing the fallback. + * Useful to prevent flashing when images load quickly. + * @default 0 + */ + delayMs?: number; + + /** + * Custom children to render instead of initials or Facehash. + */ + children?: React.ReactNode; + + /** + * Use the Facehash component as fallback instead of initials. + * @default true + */ + facehash?: boolean; + + /** + * Use Tailwind group-hover for hover detection. + * When true, hover effect triggers when a parent with "group" class is hovered. + * @default false + */ + groupHover?: boolean; + + /** + * Props to pass to the Facehash component. + */ + facehashProps?: Omit; +}; + +/** + * Extracts initials from a name string. + */ +function getInitials(name: string): string { + const parts = name.trim().split(WHITESPACE_REGEX); + if (parts.length === 0) { + return ''; + } + if (parts.length === 1) { + return parts[0]?.charAt(0).toUpperCase() || ''; + } + + const firstInitial = parts[0]?.charAt(0) || ''; + const lastInitial = parts.at(-1)?.charAt(0) || ''; + return (firstInitial + lastInitial).toUpperCase(); +} + +/** + * Fallback component that displays when the image fails to load. + * Uses Facehash by default, can show initials or custom content. + */ +export const AvatarFallback = React.forwardRef< + HTMLSpanElement, + AvatarFallbackProps +>( + ( + { + name = '', + delayMs = 0, + children, + facehash = true, + groupHover = false, + facehashProps, + className, + style, + ...props + }, + ref, + ) => { + const { imageLoadingStatus } = useAvatarContext(); + const [canRender, setCanRender] = React.useState(delayMs === 0); + + React.useEffect(() => { + if (delayMs > 0) { + const timerId = window.setTimeout(() => setCanRender(true), delayMs); + return () => window.clearTimeout(timerId); + } + }, [delayMs]); + + const initials = React.useMemo(() => getInitials(name), [name]); + + const shouldRender = + canRender && + imageLoadingStatus !== 'loaded' && + imageLoadingStatus !== 'loading'; + + if (!shouldRender) { + return null; + } + + // Custom children take precedence + if (children) { + return ( + + {children} + + ); + } + + // Facehash mode (default) + if (facehash) { + return ( + } + name={name || '?'} + size="100%" + groupHover={groupHover} + {...facehashProps} + style={{ + ...style, + }} + {...props} + /> + ); + } + + // Initials mode + return ( + + {initials} + + ); + }, +); + +AvatarFallback.displayName = 'AvatarFallback'; diff --git a/apps/start/src/components/facehash/avatar-image.tsx b/apps/start/src/components/facehash/avatar-image.tsx new file mode 100644 index 00000000..c1d6f0a6 --- /dev/null +++ b/apps/start/src/components/facehash/avatar-image.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; +import { useAvatarContext } from './avatar'; + +type ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'; + +export type AvatarImageProps = Omit< + React.ImgHTMLAttributes, + 'src' +> & { + /** + * The image source URL. If empty or undefined, triggers error state. + */ + src?: string | null; + + /** + * Callback when the image loading status changes. + */ + onLoadingStatusChange?: (status: ImageLoadingStatus) => void; +}; + +/** + * Image component that syncs its loading state with the Avatar context. + * Automatically hides when loading fails, allowing fallback to show. + */ +export const AvatarImage = React.forwardRef( + ( + { src, alt = '', className, style, onLoadingStatusChange, ...props }, + ref, + ) => { + const { imageLoadingStatus, onImageLoadingStatusChange } = + useAvatarContext(); + + const imageRef = React.useRef(null); + React.useImperativeHandle(ref, () => imageRef.current!); + + const updateStatus = React.useCallback( + (status: ImageLoadingStatus) => { + onImageLoadingStatusChange(status); + onLoadingStatusChange?.(status); + }, + [onImageLoadingStatusChange, onLoadingStatusChange], + ); + + React.useLayoutEffect(() => { + if (!src) { + updateStatus('error'); + return; + } + + let isMounted = true; + const image = new Image(); + + const setStatus = (status: ImageLoadingStatus) => { + if (!isMounted) { + return; + } + updateStatus(status); + }; + + setStatus('loading'); + + image.onload = () => setStatus('loaded'); + image.onerror = () => setStatus('error'); + image.src = src; + + return () => { + isMounted = false; + }; + }, [src, updateStatus]); + + if (imageLoadingStatus !== 'loaded') { + return null; + } + + return ( + {alt} + ); + }, +); + +AvatarImage.displayName = 'AvatarImage'; diff --git a/apps/start/src/components/facehash/avatar.tsx b/apps/start/src/components/facehash/avatar.tsx new file mode 100644 index 00000000..e381b73a --- /dev/null +++ b/apps/start/src/components/facehash/avatar.tsx @@ -0,0 +1,78 @@ +import * as React from 'react'; + +type ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'; + +export type AvatarContextValue = { + imageLoadingStatus: ImageLoadingStatus; + onImageLoadingStatusChange: (status: ImageLoadingStatus) => void; +}; + +const AvatarContext = React.createContext(null); + +/** + * Hook to access the Avatar context. + * Throws an error if used outside of Avatar. + */ +export const useAvatarContext = () => { + const context = React.useContext(AvatarContext); + if (!context) { + throw new Error( + 'Avatar compound components must be rendered within an Avatar component', + ); + } + return context; +}; + +export type AvatarProps = React.HTMLAttributes & { + /** + * Render as a different element using the asChild pattern. + * When true, Avatar renders its child and merges props. + */ + asChild?: boolean; +}; + +/** + * Root avatar component that provides context for image loading state. + */ +export const Avatar = React.forwardRef( + ({ children, className, style, asChild = false, ...props }, ref) => { + const [imageLoadingStatus, setImageLoadingStatus] = + React.useState('idle'); + + const contextValue: AvatarContextValue = React.useMemo( + () => ({ + imageLoadingStatus, + onImageLoadingStatusChange: setImageLoadingStatus, + }), + [imageLoadingStatus], + ); + + const Element = asChild ? React.Fragment : 'span'; + const elementProps = asChild + ? {} + : { + ref, + className, + style: { + position: 'relative' as const, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + flexShrink: 0, + overflow: 'hidden', + ...style, + }, + 'data-avatar': '', + 'data-state': imageLoadingStatus, + ...props, + }; + + return ( + + {children} + + ); + }, +); + +Avatar.displayName = 'Avatar'; diff --git a/apps/start/src/components/facehash/facehash.tsx b/apps/start/src/components/facehash/facehash.tsx new file mode 100644 index 00000000..7d1a47dc --- /dev/null +++ b/apps/start/src/components/facehash/facehash.tsx @@ -0,0 +1,417 @@ +import * as React from 'react'; +import { FACES } from './faces'; +import { stringHash } from './utils/hash'; + +// ============================================================================ +// Types +// ============================================================================ + +export type Intensity3D = 'none' | 'subtle' | 'medium' | 'dramatic'; +export type Variant = 'gradient' | 'solid'; + +export type ColorScheme = 'light' | 'dark' | 'auto'; + +export interface FacehashProps + extends Omit, 'children'> { + /** + * String to generate a deterministic face from. + * Same string always produces the same face. + */ + name: string; + + /** + * Size in pixels or CSS units. + * @default 40 + */ + size?: number | string; + + /** + * Background style. + * - "gradient": Adds gradient overlay (default) + * - "solid": Plain background color + * @default "gradient" + */ + variant?: Variant; + + /** + * 3D effect intensity. + * @default "dramatic" + */ + intensity3d?: Intensity3D; + + /** + * Enable hover interaction. + * When true, face "looks straight" on hover. + * @default true + */ + interactive?: boolean; + + /** + * Use Tailwind group-hover for hover detection. + * When true, hover effect triggers when a parent with "group" class is hovered. + * @default false + */ + groupHover?: boolean; + + /** + * Show first letter of name below the face. + * @default true + */ + showInitial?: boolean; + + /** + * Hex color array for inline styles. + * Use this OR colorClasses, not both. + */ + colors?: string[]; + + /** + * Colors to use in light mode. + * Used when colorScheme is "light" or "auto". + */ + colorsLight?: string[]; + + /** + * Colors to use in dark mode. + * Used when colorScheme is "dark" or "auto". + */ + colorsDark?: string[]; + + /** + * Which color scheme to use. + * - "light": Always use colorsLight + * - "dark": Always use colorsDark + * - "auto": Use CSS prefers-color-scheme media query + * @default "auto" + */ + colorScheme?: ColorScheme; + + /** + * Tailwind class array for background colors. + * Example: ["bg-pink-500 dark:bg-pink-600", "bg-blue-500 dark:bg-blue-600"] + * Use this OR colors, not both. + */ + colorClasses?: string[]; + + /** + * Custom gradient overlay class (Tailwind). + * When provided, replaces the default pure CSS gradient. + * Only used when variant="gradient". + */ + gradientOverlayClass?: string; +} + +// ============================================================================ +// Constants +// ============================================================================ + +const INTENSITY_PRESETS = { + none: { + rotateRange: 0, + translateZ: 0, + perspective: 'none', + }, + subtle: { + rotateRange: 5, + translateZ: 4, + perspective: '800px', + }, + medium: { + rotateRange: 10, + translateZ: 8, + perspective: '500px', + }, + dramatic: { + rotateRange: 15, + translateZ: 12, + perspective: '300px', + }, +} as const; + +const SPHERE_POSITIONS = [ + { x: -1, y: 1 }, // down-right + { x: 1, y: 1 }, // up-right + { x: 1, y: 0 }, // up + { x: 0, y: 1 }, // right + { x: -1, y: 0 }, // down + { x: 0, y: 0 }, // center + { x: 0, y: -1 }, // left + { x: -1, y: -1 }, // down-left + { x: 1, y: -1 }, // up-left +] as const; + +// Default color palettes +export const DEFAULT_COLORS = [ + '#fce7f3', // pink-100 + '#fef3c7', // amber-100 + '#dbeafe', // blue-100 + '#d1fae5', // emerald-100 + '#ede9fe', // violet-100 + '#fee2e2', // red-100 + '#e0e7ff', // indigo-100 + '#ccfbf1', // teal-100 +]; + +export const DEFAULT_COLORS_LIGHT = DEFAULT_COLORS; + +export const DEFAULT_COLORS_DARK = [ + '#db2777', // pink-600 + '#d97706', // amber-600 + '#2563eb', // blue-600 + '#059669', // emerald-600 + '#7c3aed', // violet-600 + '#dc2626', // red-600 + '#4f46e5', // indigo-600 + '#0d9488', // teal-600 +]; + +// Default gradient as pure CSS (works without Tailwind) +const DEFAULT_GRADIENT_STYLE: React.CSSProperties = { + background: + 'radial-gradient(ellipse 100% 100% at 50% 50%, rgba(255,255,255,0.15) 0%, transparent 60%)', +}; + +// ============================================================================ +// Component +// ============================================================================ + +/** + * Facehash - Deterministic avatar faces from any string. + */ +/** + * Hook to detect system color scheme preference + */ +function useColorScheme(colorScheme: ColorScheme): 'light' | 'dark' { + const [systemScheme, setSystemScheme] = React.useState<'light' | 'dark'>( + () => { + if (typeof window === 'undefined') return 'light'; + return window.matchMedia('(prefers-color-scheme: dark)').matches + ? 'dark' + : 'light'; + }, + ); + + React.useEffect(() => { + if (colorScheme !== 'auto') return; + + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + const handler = (e: MediaQueryListEvent) => { + setSystemScheme(e.matches ? 'dark' : 'light'); + }; + + mediaQuery.addEventListener('change', handler); + return () => mediaQuery.removeEventListener('change', handler); + }, [colorScheme]); + + if (colorScheme === 'auto') { + return systemScheme; + } + return colorScheme; +} + +export const Facehash = React.forwardRef( + ( + { + name, + size = 40, + variant = 'gradient', + intensity3d = 'dramatic', + interactive = true, + showInitial = true, + colors, + colorsLight, + colorsDark, + colorScheme = 'auto', + colorClasses, + gradientOverlayClass, + groupHover = false, + className, + style, + onMouseEnter, + onMouseLeave, + ...props + }, + ref, + ) => { + const [isHovered, setIsHovered] = React.useState(false); + const resolvedScheme = useColorScheme(colorScheme); + + // For group-hover, we use CSS instead of JS state + const usesCssHover = groupHover; + + // Determine which colors to use based on scheme + const effectiveColors = React.useMemo(() => { + // If explicit colors prop is provided, use it + if (colors) return colors; + // If colorClasses is provided, don't use inline colors + if (colorClasses) return undefined; + + // Use scheme-specific colors or defaults + const lightColors = colorsLight ?? DEFAULT_COLORS_LIGHT; + const darkColors = colorsDark ?? DEFAULT_COLORS_DARK; + + return resolvedScheme === 'dark' ? darkColors : lightColors; + }, [colors, colorClasses, colorsLight, colorsDark, resolvedScheme]); + + // Generate deterministic values from name + const { FaceComponent, colorIndex, rotation } = React.useMemo(() => { + const hash = stringHash(name); + const faceIndex = hash % FACES.length; + const colorsLength = colorClasses?.length ?? effectiveColors?.length ?? 1; + const _colorIndex = hash % colorsLength; + const positionIndex = hash % SPHERE_POSITIONS.length; + const position = SPHERE_POSITIONS[positionIndex] ?? { x: 0, y: 0 }; + + return { + FaceComponent: FACES[faceIndex] ?? FACES[0], + colorIndex: _colorIndex, + rotation: position, + }; + }, [name, effectiveColors?.length, colorClasses?.length]); + + // Get intensity preset + const preset = INTENSITY_PRESETS[intensity3d]; + + // Calculate 3D transforms + const { baseTransform, hoverTransform } = React.useMemo(() => { + if (intensity3d === 'none') { + return { baseTransform: undefined, hoverTransform: undefined }; + } + + const rotateX = rotation.x * preset.rotateRange; + const rotateY = rotation.y * preset.rotateRange; + + return { + baseTransform: `rotateX(${rotateX}deg) rotateY(${rotateY}deg) translateZ(${preset.translateZ}px)`, + hoverTransform: `rotateX(0deg) rotateY(0deg) translateZ(${preset.translateZ}px)`, + }; + }, [intensity3d, rotation, preset]); + + // For JS-based hover, apply transform based on hover state + const transform = React.useMemo(() => { + if (usesCssHover || !interactive) { + return baseTransform; + } + return isHovered ? hoverTransform : baseTransform; + }, [usesCssHover, interactive, isHovered, baseTransform, hoverTransform]); + + // Size style + const sizeValue = typeof size === 'number' ? `${size}px` : size; + + // Initial letter + const initial = name.charAt(0).toUpperCase(); + + // Background: either hex color (inline) or class + const bgColorClass = colorClasses?.[colorIndex]; + const bgColorHex = effectiveColors?.[colorIndex]; + + // Event handlers (only used for JS-based hover, not group-hover) + const handleMouseEnter = React.useCallback( + (e: React.MouseEvent) => { + if (interactive && !usesCssHover) { + setIsHovered(true); + } + onMouseEnter?.(e); + }, + [interactive, usesCssHover, onMouseEnter], + ); + + const handleMouseLeave = React.useCallback( + (e: React.MouseEvent) => { + if (interactive && !usesCssHover) { + setIsHovered(false); + } + onMouseLeave?.(e); + }, + [interactive, usesCssHover, onMouseLeave], + ); + + return ( +
+ {/* Gradient overlay */} + {variant === 'gradient' && ( + + ); + }, +); + +Facehash.displayName = 'Facehash'; diff --git a/apps/start/src/components/facehash/faces.tsx b/apps/start/src/components/facehash/faces.tsx new file mode 100644 index 00000000..d89d38c2 --- /dev/null +++ b/apps/start/src/components/facehash/faces.tsx @@ -0,0 +1,57 @@ +import type * as React from 'react'; + +export type FaceProps = { + className?: string; + style?: React.CSSProperties; +}; + +/** + * Round eyes face - simple circular eyes + */ +export const RoundFace: React.FC = ({ className, style }) => ( + +); + +/** + * Cross eyes face - X-shaped eyes + */ +export const CrossFace: React.FC = ({ className, style }) => ( + +); + +/** + * Line eyes face - horizontal line eyes + */ +export const LineFace: React.FC = ({ className, style }) => ( + +); + +/** + * Curved eyes face - sleepy/happy curved eyes + */ +export const CurvedFace: React.FC = ({ className, style }) => ( + +); + +/** + * All available face components + */ +export const FACES = [RoundFace, CrossFace, LineFace, CurvedFace] as const; + +export type FaceComponent = (typeof FACES)[number]; diff --git a/apps/start/src/components/facehash/index.ts b/apps/start/src/components/facehash/index.ts new file mode 100644 index 00000000..5e78f80a --- /dev/null +++ b/apps/start/src/components/facehash/index.ts @@ -0,0 +1,44 @@ +// ============================================================================ +// Primary Export - This is what you want +// ============================================================================ + +export type { FacehashProps, Intensity3D, Variant, ColorScheme } from './facehash'; +export { + Facehash, + DEFAULT_COLORS, + DEFAULT_COLORS_LIGHT, + DEFAULT_COLORS_DARK, +} from './facehash'; + +// ============================================================================ +// Avatar Compound Components - For image + fallback pattern +// ============================================================================ + +export { + Avatar, + type AvatarContextValue, + type AvatarProps, + useAvatarContext, +} from './avatar'; +export { AvatarFallback, type AvatarFallbackProps } from './avatar-fallback'; +export { AvatarImage, type AvatarImageProps } from './avatar-image'; + +// ============================================================================ +// Face Components - For custom compositions +// ============================================================================ + +export { + CrossFace, + CurvedFace, + FACES, + type FaceComponent, + type FaceProps, + LineFace, + RoundFace, +} from './faces'; + +// ============================================================================ +// Utilities +// ============================================================================ + +export { stringHash } from './utils/hash'; diff --git a/apps/start/src/components/facehash/readme.md b/apps/start/src/components/facehash/readme.md new file mode 100644 index 00000000..2be30440 --- /dev/null +++ b/apps/start/src/components/facehash/readme.md @@ -0,0 +1 @@ +based on https://www.facehash.dev/ but the npm package broke everything so just added the source here. \ No newline at end of file diff --git a/apps/start/src/components/facehash/utils/hash.ts b/apps/start/src/components/facehash/utils/hash.ts new file mode 100644 index 00000000..f341c8c7 --- /dev/null +++ b/apps/start/src/components/facehash/utils/hash.ts @@ -0,0 +1,16 @@ +/** + * Generates a consistent numeric hash from a string. + * Used to deterministically select faces and colors for avatars. + * + * @param str - The input string to hash + * @returns A positive 32-bit integer hash + */ +export function stringHash(str: string): number { + let hash = 0; + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash &= hash; // Convert to 32bit integer + } + return Math.abs(hash); +} diff --git a/apps/start/src/components/profiles/profile-avatar.tsx b/apps/start/src/components/profiles/profile-avatar.tsx index edd48288..26d20678 100644 --- a/apps/start/src/components/profiles/profile-avatar.tsx +++ b/apps/start/src/components/profiles/profile-avatar.tsx @@ -1,11 +1,9 @@ +import { Avatar, AvatarFallback, AvatarImage } from '@/components/facehash'; import { cn } from '@/utils/cn'; -import { AvatarImage } from '@radix-ui/react-avatar'; +import { type GetProfileNameProps, getProfileName } from '@/utils/getters'; import type { VariantProps } from 'class-variance-authority'; import { cva } from 'class-variance-authority'; -import { type GetProfileNameProps, getProfileName } from '@/utils/getters'; -import { Avatar, AvatarFallback } from '../ui/avatar'; - interface ProfileAvatarProps extends VariantProps, GetProfileNameProps { @@ -33,27 +31,17 @@ export function ProfileAvatar({ size, ...profile }: ProfileAvatarProps) { - const name = getProfileName(profile); + const name = getProfileName({ ...profile, isExternal: true }); const isValidAvatar = avatar?.startsWith('http'); return ( {isValidAvatar && } - {name?.at(0)?.toUpperCase() ?? '🧔‍♂️'} - + name={name ?? 'Unknown'} + facehash + className="rounded-full" + /> ); } diff --git a/apps/start/src/components/report-chart/common/serie-icon.tsx b/apps/start/src/components/report-chart/common/serie-icon.tsx index 74197835..5c10e9c3 100644 --- a/apps/start/src/components/report-chart/common/serie-icon.tsx +++ b/apps/start/src/components/report-chart/common/serie-icon.tsx @@ -36,7 +36,7 @@ const createImageIcon = (url: string) => { return ( serie icon + {getProfileName(session.profile)} ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3a7dce9..5393221e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,18 +6,12 @@ settings: catalogs: default: - '@types/node': - specifier: ^24.7.1 - version: 24.7.1 '@types/react': specifier: ^19.2.3 version: 19.2.7 '@types/react-dom': specifier: ^19.2.3 version: 19.2.3 - groupmq: - specifier: 1.1.1-next.2 - version: 1.1.1-next.2 react: specifier: ^19.2.3 version: 19.2.3 @@ -1916,12 +1910,6 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.23.10': - resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.28.3': resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} @@ -2023,10 +2011,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} @@ -2443,12 +2427,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.23.3': - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} @@ -2551,24 +2529,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.23.3': - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.23.3': - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} @@ -2635,12 +2601,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.23.6': - resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.0': resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} @@ -3043,18 +3003,12 @@ packages: '@emnapi/core@1.3.1': resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} - '@emnapi/core@1.5.0': - resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} @@ -4845,9 +4799,6 @@ packages: '@napi-rs/wasm-runtime@0.2.5': resolution: {integrity: sha512-kwUxR7J9WLutBbulqg1dfOrMTwhMdXLdcGUhcbCcGwnPLt3gz19uHVdwH1syKVDbE022ZS2vZxOWflFLS0YTjw==} - '@napi-rs/wasm-runtime@1.0.7': - resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-runtime@1.1.0': resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} @@ -14170,6 +14121,7 @@ packages: next@16.0.7: resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} engines: {node: '>=20.9.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -16174,9 +16126,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shell-quote@1.8.3: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} @@ -16662,6 +16611,7 @@ packages: tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -18032,6 +17982,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -18613,32 +18564,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.3) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -18652,6 +18577,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -18681,7 +18619,7 @@ snapshots: '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 5.3.2 semver: 6.3.1 @@ -18781,17 +18719,10 @@ snapshots: '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - '@babel/helper-replace-supers@7.22.20(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers@7.22.20(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -18817,10 +18748,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.28.5 - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: '@babel/types': 7.28.5 @@ -18916,14 +18843,18 @@ snapshots: '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.5) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.28.3)': dependencies: @@ -18946,6 +18877,12 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -18954,7 +18891,7 @@ snapshots: '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.28.3)': dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.0 '@babel/core': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 @@ -18980,8 +18917,19 @@ snapshots: dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': dependencies: @@ -19077,6 +19025,11 @@ snapshots: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -19102,6 +19055,11 @@ snapshots: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -19149,7 +19107,7 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.3) transitivePeerDependencies: @@ -19195,14 +19153,16 @@ snapshots: '@babel/plugin-transform-classes@7.23.8(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.3) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-classes@7.23.8(@babel/core@7.28.5)': dependencies: @@ -19349,15 +19309,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-simple-access': 7.22.5 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -19468,16 +19419,20 @@ snapshots: '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3) + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.28.3)': dependencies: @@ -19506,21 +19461,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -19529,8 +19474,8 @@ snapshots: '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) '@babel/types': 7.28.5 @@ -19568,7 +19513,7 @@ snapshots: '@babel/plugin-transform-runtime@7.23.9(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.28.3) babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.28.3) @@ -19591,7 +19536,9 @@ snapshots: dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-spread@7.23.3(@babel/core@7.28.5)': dependencies: @@ -19619,14 +19566,6 @@ snapshots: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -19638,6 +19577,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -19758,12 +19719,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.23.3(@babel/core@7.28.3)': + '@babel/preset-flow@7.23.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.28.3) + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.28.5) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': dependencies: @@ -19795,9 +19756,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/register@7.23.7(@babel/core@7.28.3)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.23.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -20160,12 +20132,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/core@1.5.0': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -20177,11 +20143,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -21476,14 +21437,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.24 + '@types/node': 24.10.1 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.24 + '@types/node': 24.10.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -21496,7 +21457,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.24 + '@types/node': 24.10.1 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -21505,7 +21466,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.24 + '@types/node': 24.10.1 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -21669,13 +21630,6 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@napi-rs/wasm-runtime@1.0.7': - dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.1 - optional: true - '@napi-rs/wasm-runtime@1.1.0': dependencies: '@emnapi/core': 1.7.1 @@ -24614,7 +24568,7 @@ snapshots: semver: 7.7.3 strip-ansi: 5.2.0 wcwidth: 1.0.1 - yaml: 2.3.4 + yaml: 2.8.2 transitivePeerDependencies: - encoding @@ -24678,7 +24632,7 @@ snapshots: open: 6.4.0 ora: 5.4.1 semver: 7.7.3 - shell-quote: 1.8.1 + shell-quote: 1.8.3 sudo-prompt: 9.2.1 transitivePeerDependencies: - encoding @@ -24747,20 +24701,20 @@ snapshots: '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.28.3) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.28.3) '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.28.3) - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.28.3) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3) '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.28.3) '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.28.3) '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.28.3) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.3) '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.28.3) '@babel/template': 7.27.2 '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9(@babel/core@7.28.3)) @@ -24953,7 +24907,7 @@ snapshots: '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': dependencies: - '@napi-rs/wasm-runtime': 1.0.7 + '@napi-rs/wasm-runtime': 1.1.0 optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': @@ -26728,7 +26682,6 @@ snapshots: '@types/node@24.10.1': dependencies: undici-types: 7.16.0 - optional: true '@types/node@24.7.1': dependencies: @@ -27671,9 +27624,9 @@ snapshots: b4a@1.7.3: {} - babel-core@7.0.0-bridge.0(@babel/core@7.28.3): + babel-core@7.0.0-bridge.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 babel-dead-code-elimination@1.0.10: dependencies: @@ -27686,7 +27639,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.28.3): dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.0 '@babel/core': 7.28.3 '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.3) semver: 6.3.1 @@ -28251,7 +28204,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.19.24 + '@types/node': 24.10.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -28260,7 +28213,7 @@ snapshots: chromium-edge-launcher@1.0.0: dependencies: - '@types/node': 20.19.24 + '@types/node': 24.10.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -31496,7 +31449,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.24 + '@types/node': 24.10.1 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -31517,13 +31470,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.24 + '@types/node': 24.10.1 jest-util: 29.7.0 jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.24 + '@types/node': 24.10.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -31540,7 +31493,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.19.24 + '@types/node': 24.10.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -31598,17 +31551,17 @@ snapshots: jscodeshift@0.14.0(@babel/preset-env@7.23.9(@babel/core@7.28.3)): dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 '@babel/parser': 7.28.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.3) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.28.3) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) '@babel/preset-env': 7.23.9(@babel/core@7.28.3) - '@babel/preset-flow': 7.23.3(@babel/core@7.28.3) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/register': 7.23.7(@babel/core@7.28.3) - babel-core: 7.0.0-bridge.0(@babel/core@7.28.3) + '@babel/preset-flow': 7.23.3(@babel/core@7.28.5) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/register': 7.23.7(@babel/core@7.28.5) + babel-core: 7.0.0-bridge.0(@babel/core@7.28.5) chalk: 4.1.2 flow-parser: 0.206.0 graceful-fs: 4.2.11 @@ -32388,7 +32341,7 @@ snapshots: metro-babel-transformer@0.80.6: dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 hermes-parser: 0.19.1 nullthrows: 1.1.1 transitivePeerDependencies: @@ -32474,7 +32427,7 @@ snapshots: metro-transform-plugins@0.80.6: dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 '@babel/generator': 7.28.5 '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 @@ -32484,7 +32437,7 @@ snapshots: metro-transform-worker@0.80.6: dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 @@ -32505,7 +32458,7 @@ snapshots: metro@0.80.6: dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.3 + '@babel/core': 7.28.5 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/template': 7.27.2 @@ -34597,7 +34550,7 @@ snapshots: react-devtools-core@4.28.5: dependencies: - shell-quote: 1.8.1 + shell-quote: 1.8.3 ws: 7.5.9 transitivePeerDependencies: - bufferutil @@ -34836,7 +34789,7 @@ snapshots: dependencies: object-assign: 4.1.1 react: 19.2.3 - react-is: 18.2.0 + react-is: 18.3.1 react-simple-maps@3.0.0(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: @@ -35829,8 +35782,6 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} - shell-quote@1.8.3: {} shiki@3.17.0: @@ -36849,8 +36800,7 @@ snapshots: undici-types@7.14.0: {} - undici-types@7.16.0: - optional: true + undici-types@7.16.0: {} undici@7.14.0: {}