fix: mostly UI imporvements
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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 (
|
||||
<ProjectLink
|
||||
href={`/profiles/${encodeURIComponent(profile.id)}`}
|
||||
className="whitespace-nowrap font-medium hover:underline"
|
||||
className="group whitespace-nowrap font-medium hover:underline row items-center gap-2"
|
||||
>
|
||||
<ProfileAvatar size="sm" {...profile} />
|
||||
{getProfileName(profile)}
|
||||
</ProjectLink>
|
||||
);
|
||||
|
||||
@@ -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<EventItemProps>(
|
||||
)}
|
||||
{viewOptions.profileId !== false && (
|
||||
<Pill
|
||||
className="@max-xl:ml-auto @max-lg:[&>span]:inline mx-4"
|
||||
className="@max-xl:ml-auto @max-lg:[&>span]:inline"
|
||||
icon={<ProfileAvatar size="xs" {...event.profile} />}
|
||||
>
|
||||
{getProfileName(event.profile)}
|
||||
@@ -164,7 +165,8 @@ function Pill({
|
||||
className,
|
||||
}: { children: React.ReactNode; icon?: React.ReactNode; className?: string }) {
|
||||
return (
|
||||
<div
|
||||
<Tooltiper
|
||||
content={children}
|
||||
className={cn(
|
||||
'shrink-0 whitespace-nowrap inline-flex gap-2 items-center rounded-full @3xl:text-muted-foreground h-6 text-xs font-mono',
|
||||
className,
|
||||
@@ -172,6 +174,6 @@ function Pill({
|
||||
>
|
||||
{icon && <div className="size-4 center-center">{icon}</div>}
|
||||
<div className="hidden @3xl:inline">{children}</div>
|
||||
</div>
|
||||
</Tooltiper>
|
||||
);
|
||||
}
|
||||
|
||||
161
apps/start/src/components/facehash/avatar-fallback.tsx
Normal file
161
apps/start/src/components/facehash/avatar-fallback.tsx
Normal file
@@ -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<HTMLSpanElement>,
|
||||
'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<FacehashProps, 'name'>;
|
||||
};
|
||||
|
||||
/**
|
||||
* 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 (
|
||||
<span
|
||||
ref={ref}
|
||||
className={className}
|
||||
style={style}
|
||||
data-avatar-fallback=""
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
// Facehash mode (default)
|
||||
if (facehash) {
|
||||
return (
|
||||
<Facehash
|
||||
ref={ref as React.Ref<HTMLDivElement>}
|
||||
name={name || '?'}
|
||||
size="100%"
|
||||
groupHover={groupHover}
|
||||
{...facehashProps}
|
||||
style={{
|
||||
...style,
|
||||
}}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// Initials mode
|
||||
return (
|
||||
<span
|
||||
ref={ref}
|
||||
className={className}
|
||||
style={{
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
...style,
|
||||
}}
|
||||
data-avatar-fallback=""
|
||||
{...props}
|
||||
>
|
||||
{initials}
|
||||
</span>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
AvatarFallback.displayName = 'AvatarFallback';
|
||||
94
apps/start/src/components/facehash/avatar-image.tsx
Normal file
94
apps/start/src/components/facehash/avatar-image.tsx
Normal file
@@ -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<HTMLImageElement>,
|
||||
'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<HTMLImageElement, AvatarImageProps>(
|
||||
(
|
||||
{ src, alt = '', className, style, onLoadingStatusChange, ...props },
|
||||
ref,
|
||||
) => {
|
||||
const { imageLoadingStatus, onImageLoadingStatusChange } =
|
||||
useAvatarContext();
|
||||
|
||||
const imageRef = React.useRef<HTMLImageElement>(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 (
|
||||
<img
|
||||
ref={imageRef}
|
||||
src={src || undefined}
|
||||
alt={alt}
|
||||
className={className}
|
||||
style={{
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
objectFit: 'cover',
|
||||
...style,
|
||||
}}
|
||||
data-avatar-image=""
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
AvatarImage.displayName = 'AvatarImage';
|
||||
78
apps/start/src/components/facehash/avatar.tsx
Normal file
78
apps/start/src/components/facehash/avatar.tsx
Normal file
@@ -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<AvatarContextValue | null>(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<HTMLSpanElement> & {
|
||||
/**
|
||||
* 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<HTMLSpanElement, AvatarProps>(
|
||||
({ children, className, style, asChild = false, ...props }, ref) => {
|
||||
const [imageLoadingStatus, setImageLoadingStatus] =
|
||||
React.useState<ImageLoadingStatus>('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 (
|
||||
<AvatarContext.Provider value={contextValue}>
|
||||
<Element {...elementProps}>{children}</Element>
|
||||
</AvatarContext.Provider>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Avatar.displayName = 'Avatar';
|
||||
417
apps/start/src/components/facehash/facehash.tsx
Normal file
417
apps/start/src/components/facehash/facehash.tsx
Normal file
@@ -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<React.HTMLAttributes<HTMLDivElement>, '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<HTMLDivElement, FacehashProps>(
|
||||
(
|
||||
{
|
||||
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<HTMLDivElement>) => {
|
||||
if (interactive && !usesCssHover) {
|
||||
setIsHovered(true);
|
||||
}
|
||||
onMouseEnter?.(e);
|
||||
},
|
||||
[interactive, usesCssHover, onMouseEnter],
|
||||
);
|
||||
|
||||
const handleMouseLeave = React.useCallback(
|
||||
(e: React.MouseEvent<HTMLDivElement>) => {
|
||||
if (interactive && !usesCssHover) {
|
||||
setIsHovered(false);
|
||||
}
|
||||
onMouseLeave?.(e);
|
||||
},
|
||||
[interactive, usesCssHover, onMouseLeave],
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={ref}
|
||||
role="img"
|
||||
aria-label={`Avatar for ${name}`}
|
||||
data-facehash-avatar=""
|
||||
className={`${bgColorClass ?? ''} ${className ?? ''}`}
|
||||
style={{
|
||||
position: 'relative',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
width: sizeValue,
|
||||
height: sizeValue,
|
||||
perspective: preset.perspective,
|
||||
color: 'currentColor',
|
||||
...(bgColorHex && { backgroundColor: bgColorHex }),
|
||||
...style,
|
||||
}}
|
||||
onMouseEnter={handleMouseEnter}
|
||||
onMouseLeave={handleMouseLeave}
|
||||
{...props}
|
||||
>
|
||||
{/* Gradient overlay */}
|
||||
{variant === 'gradient' && (
|
||||
<div
|
||||
className={gradientOverlayClass}
|
||||
style={{
|
||||
position: 'absolute',
|
||||
inset: 0,
|
||||
pointerEvents: 'none',
|
||||
...(gradientOverlayClass ? {} : DEFAULT_GRADIENT_STYLE),
|
||||
}}
|
||||
aria-hidden="true"
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* Face container with 3D transform */}
|
||||
<div
|
||||
data-facehash-avatar-face=""
|
||||
className={
|
||||
usesCssHover && interactive
|
||||
? 'group-hover:[transform:var(--facehash-hover-transform)]'
|
||||
: undefined
|
||||
}
|
||||
style={{
|
||||
position: 'absolute',
|
||||
inset: 0,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
transform,
|
||||
transition: interactive ? 'transform 0.2s ease-out' : undefined,
|
||||
transformStyle: 'preserve-3d',
|
||||
'--facehash-hover-transform': hoverTransform,
|
||||
} as React.CSSProperties}
|
||||
>
|
||||
{/* Face SVG */}
|
||||
<FaceComponent
|
||||
style={{
|
||||
position: 'absolute',
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* Initial letter */}
|
||||
{showInitial && (
|
||||
<span
|
||||
data-facehash-avatar-initial=""
|
||||
style={{
|
||||
position: 'relative',
|
||||
marginTop: '25%',
|
||||
fontSize: `calc(${sizeValue} * 0.35)`,
|
||||
fontWeight: 600,
|
||||
lineHeight: 1,
|
||||
userSelect: 'none',
|
||||
}}
|
||||
>
|
||||
{initial}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Facehash.displayName = 'Facehash';
|
||||
57
apps/start/src/components/facehash/faces.tsx
Normal file
57
apps/start/src/components/facehash/faces.tsx
Normal file
@@ -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<FaceProps> = ({ className, style }) => (
|
||||
<svg viewBox="0 0 100 100" className={className} style={style} aria-hidden="true">
|
||||
<title>Round Eyes</title>
|
||||
<circle cx="35" cy="45" r="8" fill="currentColor" />
|
||||
<circle cx="65" cy="45" r="8" fill="currentColor" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
/**
|
||||
* Cross eyes face - X-shaped eyes
|
||||
*/
|
||||
export const CrossFace: React.FC<FaceProps> = ({ className, style }) => (
|
||||
<svg viewBox="0 0 100 100" className={className} style={style} aria-hidden="true">
|
||||
<title>Cross Eyes</title>
|
||||
<path d="M27 37 L43 53 M43 37 L27 53" stroke="currentColor" strokeWidth="4" strokeLinecap="round" />
|
||||
<path d="M57 37 L73 53 M73 37 L57 53" stroke="currentColor" strokeWidth="4" strokeLinecap="round" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
/**
|
||||
* Line eyes face - horizontal line eyes
|
||||
*/
|
||||
export const LineFace: React.FC<FaceProps> = ({ className, style }) => (
|
||||
<svg viewBox="0 0 100 100" className={className} style={style} aria-hidden="true">
|
||||
<title>Line Eyes</title>
|
||||
<line x1="27" y1="45" x2="43" y2="45" stroke="currentColor" strokeWidth="4" strokeLinecap="round" />
|
||||
<line x1="57" y1="45" x2="73" y2="45" stroke="currentColor" strokeWidth="4" strokeLinecap="round" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
/**
|
||||
* Curved eyes face - sleepy/happy curved eyes
|
||||
*/
|
||||
export const CurvedFace: React.FC<FaceProps> = ({ className, style }) => (
|
||||
<svg viewBox="0 0 100 100" className={className} style={style} aria-hidden="true">
|
||||
<title>Curved Eyes</title>
|
||||
<path d="M27 50 Q35 38 43 50" stroke="currentColor" strokeWidth="4" strokeLinecap="round" fill="none" />
|
||||
<path d="M57 50 Q65 38 73 50" stroke="currentColor" strokeWidth="4" strokeLinecap="round" fill="none" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
/**
|
||||
* All available face components
|
||||
*/
|
||||
export const FACES = [RoundFace, CrossFace, LineFace, CurvedFace] as const;
|
||||
|
||||
export type FaceComponent = (typeof FACES)[number];
|
||||
44
apps/start/src/components/facehash/index.ts
Normal file
44
apps/start/src/components/facehash/index.ts
Normal file
@@ -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';
|
||||
1
apps/start/src/components/facehash/readme.md
Normal file
1
apps/start/src/components/facehash/readme.md
Normal file
@@ -0,0 +1 @@
|
||||
based on https://www.facehash.dev/ but the npm package broke everything so just added the source here.
|
||||
16
apps/start/src/components/facehash/utils/hash.ts
Normal file
16
apps/start/src/components/facehash/utils/hash.ts
Normal file
@@ -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);
|
||||
}
|
||||
@@ -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<typeof variants>,
|
||||
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 (
|
||||
<Avatar className={cn(variants({ className, size }), className)}>
|
||||
{isValidAvatar && <AvatarImage src={avatar} className="rounded-full" />}
|
||||
<AvatarFallback
|
||||
className={cn(
|
||||
'rounded-full',
|
||||
size === 'lg'
|
||||
? 'text-lg'
|
||||
: size === 'sm'
|
||||
? 'text-sm'
|
||||
: size === 'xs'
|
||||
? 'text-[8px]'
|
||||
: 'text-base',
|
||||
'bg-def-200 text-muted-foreground',
|
||||
)}
|
||||
>
|
||||
{name?.at(0)?.toUpperCase() ?? '🧔♂️'}
|
||||
</AvatarFallback>
|
||||
name={name ?? 'Unknown'}
|
||||
facehash
|
||||
className="rounded-full"
|
||||
/>
|
||||
</Avatar>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ const createImageIcon = (url: string) => {
|
||||
return (
|
||||
<img
|
||||
alt="serie icon"
|
||||
className="max-h-4 rounded-[2px] object-contain"
|
||||
className="w-full max-h-4 rounded-[2px] object-contain"
|
||||
src={context.apiUrl?.replace(/\/$/, '') + url}
|
||||
loading="lazy"
|
||||
decoding="async"
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
const data = {
|
||||
amazon: 'https://upload.wikimedia.org/wikipedia/commons/4/4a/Amazon_icon.svg',
|
||||
'chromium os': 'https://upload.wikimedia.org/wikipedia/commons/2/28/Chromium_Logo.svg',
|
||||
'mac os': 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/MacOS_logo.svg/1200px-MacOS_logo.svg.png',
|
||||
'mac os': 'https://upload.wikimedia.org/wikipedia/commons/f/fa/Apple_logo_black.svg',
|
||||
'macos': 'https://upload.wikimedia.org/wikipedia/commons/f/fa/Apple_logo_black.svg',
|
||||
apple: 'https://sladesportfolio.wordpress.com/wp-content/uploads/2015/08/apple_logo_black-svg.png',
|
||||
huawei: 'https://upload.wikimedia.org/wikipedia/en/0/04/Huawei_Standard_logo.svg',
|
||||
xiaomi: 'https://upload.wikimedia.org/wikipedia/commons/2/29/Xiaomi_logo.svg',
|
||||
@@ -46,7 +47,7 @@ const data = {
|
||||
google: 'https://google.com',
|
||||
gsa: 'https://google.com', // Google Search App
|
||||
instagram: 'https://instagram.com',
|
||||
ios: 'https://cdn0.iconfinder.com/data/icons/flat-round-system/512/apple-1024.png',
|
||||
ios: 'https://upload.wikimedia.org/wikipedia/commons/c/ca/IOS_logo.svg',
|
||||
linkedin: 'https://linkedin.com',
|
||||
linux: 'https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg',
|
||||
ubuntu: 'https://upload.wikimedia.org/wikipedia/commons/a/ab/Logo-ubuntu_cof-orange-hex.svg',
|
||||
|
||||
@@ -4,6 +4,7 @@ import { formatDateTime, formatTimeAgoOrDateTime } from '@/utils/date';
|
||||
import type { ColumnDef } from '@tanstack/react-table';
|
||||
|
||||
import { ColumnCreatedAt } from '@/components/column-created-at';
|
||||
import { ProfileAvatar } from '@/components/profiles/profile-avatar';
|
||||
import { getProfileName } from '@/utils/getters';
|
||||
import { round } from '@openpanel/common';
|
||||
import type { IServiceSession } from '@openpanel/db';
|
||||
@@ -63,8 +64,9 @@ export function useColumns() {
|
||||
return (
|
||||
<ProjectLink
|
||||
href={`/profiles/${encodeURIComponent(session.profile.id)}`}
|
||||
className="font-medium"
|
||||
className="font-medium row gap-2 items-center"
|
||||
>
|
||||
<ProfileAvatar size="sm" {...session.profile} />
|
||||
{getProfileName(session.profile)}
|
||||
</ProjectLink>
|
||||
);
|
||||
|
||||
342
pnpm-lock.yaml
generated
342
pnpm-lock.yaml
generated
@@ -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: {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user